楼主: 掘金队长
8392 1

[源码分享] 跨品种价差套利策略(附源码) [推广有奖]

  • 0关注
  • 8粉丝

本科生

67%

还不是VIP/贵宾

-

威望
0
论坛币
1 个
通用积分
5.3678
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
624 点
帖子
48
精华
0
在线时间
109 小时
注册时间
2018-1-8
最后登录
2020-10-13

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
跨品种价差套利简介套利原理

​     通俗地讲,就是两个合约相关性很好,突然市场出了一个bug,破坏了两个合约之间的平衡状态,进场套利;等待市场回复,平仓出场。即均值回复思想。

15ab6ac75531f0e3fe5e12c8.png

价差套利

​     价差套利的前提是做出商品期货品种间同一月份的价格之间的价差,并且画出价差的时间序列图,分析价差,寻找合理的价差范围,超出合理的价差变动范围时如何进行操作。

套利标的的选取

​     我们选取同为黑钢产业的主要产品,热轧卷板与螺纹钢作为套利标的。

​     首先,从价格走势上来看,二者价格趋势上一致性非常高,基本处于同涨同跌局面,如下图所示,2014年至2017年热轧卷板与螺纹钢价格指数,相关性达到0.924。二者成本从铁矿石到钢坯这个阶段几乎一样,只是在最终的轧制成材阶段出现了分化。

​    其次,二者价格的季节性也表现出较高的一致性。热轧卷板和螺纹钢的年内高点普遍出现在4月,次高点出现在7月,而10月不管是热轧卷板还是螺纹钢都倾向于出现年内低点。在较一致的季节性特点下,二者的价格强弱也有一定的规律可循。一般情况下,1、2月热轧卷板的表现会略强于螺纹钢,但是之后二者比价会逐步走低,也就是螺纹钢相对于热轧卷板会逐步变强。而这种强弱关系一般到10月会达到一个极致,之后热轧卷板会再度重新变得相对强一点。

index.png

​     为了防止未来函数的引入,在这里我们选取“HC1701”与“RB1701”作为套利观察合约

Figure_1.png

​     图示分为两部分,上图为2016-04-01至2016-12-31的两标的合约日线收盘价的数据,经计算,相关性系数为0.988,下图为两者价差的走势,上下界分别为均值加减两倍标准差。


​     可以看出价差在上下界之外会再次回归,这就成为了我们的交易机会,不过,均值周期需要缩短,以增加交易次数。另外,我们用2017-04-01至2017-12-31的“HC1801”与“RB1801”作为标的合约,进行回测。

跨品种价差套利策略实现(基于掘金量化平台)策略思想
  • 获取过去的30个交易日的bar的均值正负2个标准差得到上下界。

  • 用最新价差来判断开仓方向,上穿上轨来做空价差,下穿下轨来做多价差。

  • 回归至上下轨水平内的时候平仓。


策略主要步骤实现订阅数据subscribe(symbols=symbols, frequency='1d', count=31, wait_group=True)

​        订阅数据需要在定义init函数里面设置,并调用subscribe函数,这里注意,我们需要通过计算前三十根bars来作为开平仓的标准,并在当前bar上做出开平仓操作,所以需要获取31根bar:

  • symbols         需要设置订阅的标的代码。

  • frequency需设置订阅数据的周期级别,这里设置1d 表示以一天为周期。

  • count需要设置获取的bar的数量


数据获取
data_rb = context.data(symbol=symbol, frequency='1d', count=31, fields='close')

​        订阅数据之后,需要获取已经订阅的数据来进行操作,这时需调用context.data函数:

  • symbols 需要设置订阅的标的代码。

  • frequency需设置订阅数据的周期级别,这里设置1d表示以一天为周期。

  • count需要设置获取的bar的数量

  • fields需要设置返回值的种类


策略回测分析回测报告

QQ截图20171129164209.png

分析

​   我们选取了2017年4月至2017年11月作为回测周期,“HC1801”与“RB1801”作为标的合约,价差均值周期设为30,可以看出:

  • 胜率(具有盈利的平仓次数与总平仓次数之比)达到了56.25%。


  • 卡玛比率(年化收益率与历史最大回撤之比)是使用最大回撤率来衡量风险。采用最大回撤率来衡量风险,关注的是最极端的情况。卡玛比率越高表示策略承受每单位最大损失获得的报酬越高。在这里卡玛比率超过了4。


  • 夏普比率(年化收益率减无风险收益率的差收益波动率之比)超过1.5,也即承受1单位的风险,会有超过1.5个单位的收益回报


  • 策略收益曲线相当稳定,最大回撤极小,缺点是交易次数少,很长时间无交易。


       原创:掘金量化myquant.cn,转载请注明出处!谢谢



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:源码分享 跨品种价差套利策略 量化交易 策略源码 量化策略

沙发
掘金队长 发表于 2018-6-29 10:14:03 |只看作者 |坛友微信交流群
基于掘金量化平台,跨品种价差套利策略源码,如下:

# coding=utf-8
from __future__ import print_function, absolute_import, unicode_literals
from gm.api import *
import numpy as np

'''
本策略根据计算滚动的.过去的301minbar的均值正负2个标准差得到布林线
并在最新价差上穿上轨来做空价差,下穿下轨来做多价差
并在回归至上下轨水平内的时候平仓
回测数据为:SHFE.rb1801SHFE.hc18011min数据
回测时间为:2017-09-01 08:00:002017-10-01 16:00:00
'''
def init(context):
    # 进行套利的品种
context.goods = ['SHFE.rb1801', 'SHFE.hc1801']
    # 订阅行情
subscribe(symbols=context.goods, frequency='1d', count=31, wait_group=True)


def on_bar(context, bars):
    # 获取两个品种的时间序列
data_rb = context.data(symbol=context.goods[0], frequency='1d', count=31, fields='close')
    close_rb = data_rb.values
    data_hc = context.data(symbol=context.goods[1], frequency='1d', count=31, fields='close')
    close_hc = data_hc.values
    # 计算价差
spread = close_rb[:-1] - close_hc[:-1]
    # 计算布林带的上下轨
up = np.mean(spread) + 2 * np.std(spread)
    down = np.mean(spread) - 2 * np.std(spread)
    # 计算最新价差
spread_now = close_rb[-1] - close_hc[-1]
    # 无交易时若价差上()穿布林带上()轨则做空()价差
position_rb_long = context.account().position(symbol=context.goods[0], side=PositionSide_Long)
    position_rb_short = context.account().position(symbol=context.goods[0], side=PositionSide_Short)
    if not position_rb_long and not position_rb_short:
        if spread_now > up:
            order_target_volume(symbol=context.goods[0], volume=50, order_type=OrderType_Market,
                                position_side=PositionSide_Short)
            print(context.goods[0], '以市价单开空仓一手')
            order_target_volume(symbol=context.goods[1], volume=50, order_type=OrderType_Market,
                                position_side=PositionSide_Long)
            print(context.goods[1], '以市价单开多仓一手')
        if spread_now < down:
            order_target_volume(symbol=context.goods[0], volume=50, order_type=OrderType_Market,
                                position_side=PositionSide_Long)
            print(context.goods[0], '以市价单开多仓五十手')
            order_target_volume(symbol=context.goods[1], volume=50, order_type=OrderType_Market,
                                position_side=PositionSide_Short)
            print(context.goods[1], '以市价单开空仓五十手')
    # 价差回归时平仓
elif position_rb_short:
        if spread_now <= up:
            order_close_all()
            print('价格回归,平所有仓位')
            # 跌破下轨反向开仓
if spread_now < down:
            order_target_volume(symbol=context.goods[0], volume=50, order_type=OrderType_Market,
                                position_side=PositionSide_Long)
            print(context.goods[0], '以市价单开多仓五十手')
            order_target_volume(symbol=context.goods[1], volume=50, order_type=OrderType_Market,
                                position_side=PositionSide_Short)
            print(context.goods[1], '以市价单开空仓五十手')
    elif position_rb_long:
        if spread_now >= down:
            order_close_all()
            print('价格回归,平所有仓位')
            # 涨破上轨反向开仓
if spread_now > up:
            order_target_volume(symbol=context.goods[0], volume=50, order_type=OrderType_Market,
                                position_side=PositionSide_Short)
            print(context.goods[0], '以市价单开空仓五十手')
            order_target_volume(symbol=context.goods[1], volume=50, order_type=OrderType_Market,
                                position_side=PositionSide_Long)
            print(context.goods[1], '以市价单开多仓五十手')


if __name__ == '__main__':
    '''
    strategy_id策略ID,由系统生成    filename文件名,请与本文件名保持一致    mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
    token绑定计算机的ID,可在系统设置-密钥管理中生成    backtest_start_time回测开始时间    backtest_end_time回测结束时间    backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
    backtest_initial_cash回测初始资金    backtest_commission_ratio回测佣金比例    backtest_slippage_ratio回测滑点比例    '''
run(strategy_id='d90f679c-d353-11e7-9259-9cd21ef04ea9',
        filename='跨品种套利.py',
        mode=MODE_BACKTEST,
        token='c395247a76e8a5caeee699d668d6f550213bc418',
        backtest_start_time='2017-04-01 08:00:00',
        backtest_end_time='2017-11-01 16:00:00',
        backtest_adjust=ADJUST_PREV,
        backtest_initial_cash=500000,
        backtest_commission_ratio=0.0001,
        backtest_slippage_ratio=0.0001)

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 22:37