写点什么

量化合约对冲交易机器人 app 系统开发源代码部署

  • 2022-12-01
    广东
  • 本文字数:3121 字

    阅读完需:约 10 分钟

Pandas 的数据结构 Series:一维数组,量化合约对冲交易系统开发联系薇信 hkkf5566,源码搭建,与 Numpy 中的一维 array 类似。二者与 Python 基本的数据结构 List 也很相近。Series 如今能保存不同种数据类型,字符串、boolean 值、数字等都能保存在 Series 中。


Time-Series:以时间为索引的 Series。

DataFrame:二维的表格型数据结构。很多功能与 R 中的 data.frame 类似。可以将 DataFrame 理解为 Series 的容器。

Panel:三维的数组,可以理解为 DataFrame 的容器。Panel4D:是像 Panel 一样的 4 维数据容器。PanelND:拥有 factory 集合,可以创建像 Panel4D 一样 N 维命名容器的模块。


运用 Pandas 的强大特性来进行网格策略的编码网格策略秉持的原则是“仓位策略比择时策略更重要”。其基本操作方式就是以某点为基点,每上涨戓下跌一定点数挂一定数量空单戓多单,设定盈利目标,但不设止损,当价格朝期望方向进展时获利平仓,并在原点位挂同样的买单戓卖单。这样布下的这些交易单形成了一张像鱼网样的阵列,在震荡的市场中来回获利。


本策略首先计算了过去 300 个价格数据的均值和标准差,并根据均值加减 1 和 2 个标准差得到网格的区间分界线,并分别配以 0.3 和 0.5 的仓位权重,然后根据价格所在的区间来配置仓位(+/-40 为上下界,无实际意义):


(-40,-3],(-3,-2],(-2,2],(2,3],(3,40](具体价格等于均值+数字倍标准差)-0.5, -0.3, 0.0, 0.3, 0.5 第一步,我们需要引入策略代码中需要用到的库


import typesimport numpy as npimport pandas as pd 复制第二步,我们需要在量化平台初始化合约数据,这个例子中,我们还是使用螺纹钢期货为例子。


def init():


# 订阅螺纹钢的2005合约,并且取得量化平台当前周期的所有收盘价exchange.SetContractType("rb2005")records = exchange.GetRecords()close_01 = records.Close
# 获取网格区间分界线context.band = np.mean(close_01) + np.array([-40, -3, -2, 2, 3, 40]) * np.std(close_01)# 设置网格的仓位context.weight = [0.5, 0.3, 0.0, 0.3, 0.5]
复制代码


复制第三步,也是最重要的,我们开始编写策略逻辑和实现自动化交易


这里需要注意的是,我们需要用到量化平台的国内商品期货模版,各位在量化策略编写页面进行编码时,需要把模版先复制到自己的策略库,然后在回测时勾选上,这里请各位读者注意


策略逻辑与实现其自动化交易:


def onTick(context, bars):


obj = ext.NewPositionManager() # 使用量化交易类库
# 此处用来获取持仓信息positions = exchange.GetPosition() # 获取持仓数组if len(positions) == 0: # 如果持仓数组的长度是0 return 0 # 证明是空仓,返回0for i in range(len(positions)): # 遍历持仓数组 if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD): position_long = 1 # 将position_long标记为1
elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD): position_short = -1 # 将position_short标记为-1
bar = bars[0]# 根据价格落在(-40,-3],(-3,-2],(-2,2],(2,3],(3,40]的区间范围来获取最新收盘价所在的价格区间grid = pd.cut([close_01], context.band, labels=[0, 1, 2, 3, 4])[0]
# 若无仓位且价格突破则按照设置好的区间开仓if not position_long and not position_short and grid != 2: # 大于3为在中间网格的上方,做多 if grid >= 3: obj.OpenLong("rb2005", 1) # 以市价单开多仓到仓位 if grid <= 1: obj.OpenShort("rb2005", 1) # 以市价单开空仓到仓位
# 持有多仓的处理elif position_long: if grid >= 3: obj.OpenLong("rb2005", 1) # 以市价单调多仓到仓位 # 等于2为在中间网格,平仓 elif grid == 2: obj.closebuy("rb2005", 1) # 以市价单全平多仓
# 小于1为在中间网格的下方,做空 elif grid <= 1: obj.closebuy("rb2005", 1) # 以市价单全平多仓 obj.OpenShort("rb2005", 1) # 以市价单开空仓到仓位
# 持有空仓的处理elif position_short: # 小于1为在中间网格的下方,做空 if grid <= 1: obj.OpenShort("rb2005", 1) # 以市价单调空仓到仓位 # 等于2为在中间网格,平仓 elif grid == 2: obj.closesell("rb2005", 1) # 以市价单全平空仓
# 大于3为在中间网格的上方,做多 elif grid >= 3: obj.closesell("rb2005", 1) # 以市价单全平空仓 obj.OpenLong("rb2005", 1) # 以市价单开多仓到仓位
复制代码


复制最后,我们用一个 Main 函数把策略跑起来。这里建议大家学会部署自己的托管者,即使在自己的电脑中本地部署,这样对于调试程序和回测交易逻辑来讲都有莫大的有益,特别是对于 pandas 这样的第三方库的安装,运用本地的 anaconda 环境管理软件来管理这些 python 库和环境将会起到事半功倍的效果。


以下是完整的策略代码:


import typesimport numpy as npimport pandas as pd

初始化合约数据

def init():


# 订阅螺纹钢的2005合约,并且取得量化平台当前周期的所有收盘价exchange.SetContractType("rb2005")records = exchange.GetRecords()close_01 = records.Close
# 获取网格区间分界线context.band = np.mean(close_01) + np.array([-40, -3, -2, 2, 3, 40]) * np.std(close_01)# 设置网格的仓位context.weight = [0.5, 0.3, 0.0, 0.3, 0.5]
复制代码


def onTick(context, bars):


obj = ext.NewPositionManager() # 使用量化交易类库
# 此处用来获取持仓信息positions = exchange.GetPosition() # 获取持仓数组if len(positions) == 0: # 如果持仓数组的长度是0 return 0 # 证明是空仓,返回0for i in range(len(positions)): # 遍历持仓数组 if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD): position_long = 1 # 将position_long标记为1
elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD): position_short = -1 # 将position_short标记为-1
bar = bars[0]# 根据价格落在(-40,-3],(-3,-2],(-2,2],(2,3],(3,40]的区间范围来获取最新收盘价所在的价格区间grid = pd.cut([close_01], context.band, labels=[0, 1, 2, 3, 4])[0]
# 若无仓位且价格突破则按照设置好的区间开仓if not position_long and not position_short and grid != 2: # 大于3为在中间网格的上方,做多 if grid >= 3: obj.OpenLong("rb2005", 1) # 以市价单开多仓到仓位 if grid <= 1: obj.OpenShort("rb2005", 1) # 以市价单开空仓到仓位
# 持有多仓的处理elif position_long: if grid >= 3: obj.OpenLong("rb2005", 1) # 以市价单调多仓到仓位 # 等于2为在中间网格,平仓 elif grid == 2: obj.closebuy("rb2005", 1) # 以市价单全平多仓
# 小于1为在中间网格的下方,做空 elif grid <= 1: obj.closebuy("rb2005", 1) # 以市价单全平多仓 obj.OpenShort("rb2005", 1) # 以市价单开空仓到仓位
# 持有空仓的处理elif position_short: # 小于1为在中间网格的下方,做空 if grid <= 1: obj.OpenShort("rb2005", 1) # 以市价单调空仓到仓位 # 等于2为在中间网格,平仓 elif grid == 2: obj.closesell("rb2005", 1) # 以市价单全平空仓
# 大于3为在中间网格的上方,做多 elif grid >= 3: obj.closesell("rb2005", 1) # 以市价单全平空仓 obj.OpenLong("rb2005", 1) # 以市价单开多仓到仓位
复制代码


def main():while True:onTick()Sleep(1000)

用户头像

还未添加个人签名 2022-05-23 加入

区块链项目开发,咨询weixin:hkkf5566

评论

发布
暂无评论
量化合约对冲交易机器人app系统开发源代码部署_开发微hkkf5566_InfoQ写作社区