首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >关于合约量化对冲交易机器人项目系统开发逻辑分析

关于合约量化对冲交易机器人项目系统开发逻辑分析

原创
作者头像
系统_I8O28578624
发布2022-12-09 14:06:40
发布2022-12-09 14:06:40
5860
举报
文章被收录于专栏:YYDSYYDS

PTime-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&gt;=3:obj.OpenLong("rb2005",1)#以市价单开多仓到仓位if grid&lt;=1:obj.OpenShort("rb2005",1)#以市价单开空仓到仓位

  #持有多仓的处理elif position_long:if grid&gt;=3:obj.OpenLong("rb2005",1)#以市价单调多仓到仓位#等于2为在中间网格,平仓elif grid==2:obj.closebuy("rb2005",1)#以市价单全平多仓

  #小于1为在中间网格的下方,做空elif grid&lt;=1:obj.closebuy("rb2005",1)#以市价单全平多仓obj.OpenShort("rb2005",1)#以市价单开空仓到仓位

  #持有空仓的处理elif position_short:#小于1为在中间网格的下方,做空if grid&lt;=1:obj.OpenShort("rb2005",1)#以市价单调空仓到仓位#等于2为在中间网格,平仓elif grid==2:obj.closesell("rb2005",1)#以市价单全平空仓

  #大于3为在中间网格的上方,做多elif grid&gt;=3:obj.closesell("rb2005",

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档