前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度解析现货合约对冲量化交易系统开发技术分析及源码

深度解析现货合约对冲量化交易系统开发技术分析及源码

原创
作者头像
I357O98O7I8
发布2022-08-09 18:53:00
6370
发布2022-08-09 18:53:00
举报
文章被收录于专栏:dapp系统开发dapp系统开发

Pandas的数据结构

  • Series:一维数组,与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

第一步,我们需要引入策略代码中需要用到的库

代码语言:javascript
复制
import types
import numpy as np
import pandas as pd

第二步,我们需要在发明者量化平台初始化合约数据,这个例子中,我们还是使用螺纹钢期货为例子。

代码语言:javascript
复制
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]

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

这里需要注意的是,我们需要用到发明者量化平台的国内商品期货模版,模版地址为:https://www.fmz.com/strategy/24288 各位在发明者量化策略编写页面进行编码时,需要把此模版先复制到自己的策略库,然后在回测时勾选上,这里请各位读者注意

关于如何部署托管者和机器人,请参考我之前的文章:https://www.fmz.com/bbs-topic/4140

想购买自己云计算服务器部署托管者的读者,可以参考这篇文章:https://www.fmz.com/bbs-topic/2848

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

代码语言:javascript
复制
def onTick(context, bars):

    obj = ext.NewPositionManager() # 使用发明者量化交易类库

    # 此处用来获取持仓信息
    positions = exchange.GetPosition() # 获取持仓数组
    if len(positions) == 0: # 如果持仓数组的长度是0
        return 0 # 证明是空仓,返回0
    for 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库和环境将会起到事半功倍的效果。

以下是完整的策略代码:

代码语言:javascript
复制
import types
import numpy as np
import 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 # 证明是空仓,返回0
    for 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)

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pandas的数据结构
  • 运用Pandas的强大特性来进行网格策略的编码
相关产品与服务
网站建设
网站建设(Website Design Service,WDS),是帮助您快速搭建企业网站的服务。通过自助模板建站工具及专业设计服务,无需了解代码技术,即可自由拖拽模块,可视化完成网站管理。全功能管理后台操作方便,一次更新,数据多端同步,省时省心。使用网站建设服务,您无需维持技术和设计师团队,即可快速实现网站上线,达到企业数字化转型的目的。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档