跨品种套利

1. 原理

什么是套利?

套利是指在买入或卖出一种金融资产的同时卖出或买入另一种相关的金融资产从中利用价差获得套利的过程。

什么是跨品种套利?

当两个合约有很强的相关性时,可能存在相似的变动关系,两种合约之间的价差会维持在一定的水平上。当市场出现变化时,两种合约之间的价差会偏离均衡水平。此时,可以买入其中一份合约同时卖出其中一份合约,当价差恢复到正常水平时平仓,获取收益。

以大商所玉米和淀粉为例,合约分别为DCE.c1801和DCE.cs1801。二者之间相关性为0.7333,价差处于相对稳定合理区间。如图所示。

二者价差整体处于250-350之间。当价差偏离此区间时,可以进行跨品种套利。

跨品种套利有以下几个特点:

1.套利的两种资产必须有一定的相关性。
2.两种合约标的不同,到期时间相同。
3.两种资产之间的价差呈现一定规律。

怎样确定合约之间有相关性?

最常用的方法是利用EG两步法对两个序列做协整检验,判断两个序列是否平稳。只有单整阶数相同,二者才有可能存在一定的关系。

以大豆和豆粕为例,选取其在2017年1月1日至2018年1月1日的主力合约价格时间序列,利用statsmodels包进行协整检验。

检验结果为:
焦炭的t = -1.7886,1%置信区间的临界值为-3.4576,说明该序列在99%的置信水平下平稳。
焦煤的t = -2.0500,1%置信区间的临界值为-3.4576,说明该序列在99%的置信水平下平稳。

因此,二者都为平稳序列

利用OLS回归检残差序列是否平稳,残差的t=-2.3214,临界值为-3.4577,说明残差平稳。因此,可以认为二者之间存在一定关系。

回归后的残差图如下:

对残差进行ks检验,检验结果p=0,说明残差分布为正态分布。

策略设计

传统利用价差进行跨品种套利的方法是计算出均值和方差,设定开仓、平仓和止损阈值。当新的价格达到阈值时,进行相应的开仓和平仓操作。

应该怎样确定均值?

均值的选取主要有两种方法,第一种方法是固定均值。先历史价格计算相应的阈值(比如利用2017年2月-2017年6月的数据计算阈值,在2019年7月进行套利),再用最新价差进行比较,会发现前后均值差异很大。如图所示。

因此,常用变动的均值设定阈值。即用过去N天两个标的之间差值的均值和方差。

2. 策略思路

第一步:选择相关性较高的两个合约,本例选择大商所的焦炭和焦煤。
第二步:以过去30个的1d频率bar的均值正负0.75个标准差作为开仓阈值,以正负2个标准差作为止损阈值。
第三步:最新价差上穿上界时做空价差,回归到均值附近平仓;下穿下界时做多价差,回归到均值附近平仓。设定止损点,触发止损点则全部平仓。

回测期:2018-02-01 8:00:00 至 2018-12-31 16:00:00
回测标的:DCE.j1901, DCE.jm1901
回测初始资金:200万
注意:若修改回测期,需要修改对应的回测标的。

3. 策略代码

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. from gm.api import *
  4. import numpy as np
  5. def init(context):
  6. # 选择的两个合约
  7. context.symbol = ['DCE.j1901', 'DCE.jm1901']
  8. # 订阅历史数据
  9. subscribe(symbols=context.symbol,frequency='1d',count=11,wait_group=True)
  10. def on_bar(context, bars):
  11. # 数据提取
  12. j_close = context.data(symbol=context.symbol[0],frequency='1d',fields='close',count=31).values
  13. jm_close = context.data(symbol=context.symbol[1],frequency='1d',fields='close',count=31).values
  14. # 提取最新价差
  15. new_price = j_close[-1] - jm_close[-1]
  16. # 计算历史价差,上下限,止损点
  17. spread_history = j_close[:-2] - jm_close[:-2]
  18. context.spread_history_mean = np.mean(spread_history)
  19. context.spread_history_std = np.std(spread_history)
  20. context.up = context.spread_history_mean + 0.75 * context.spread_history_std
  21. context.down = context.spread_history_mean - 0.75 * context.spread_history_std
  22. context.up_stoppoint = context.spread_history_mean + 2 * context.spread_history_std
  23. context.down_stoppoint = context.spread_history_mean - 2 * context.spread_history_std
  24. # 查持仓
  25. position_jm_long = context.account().position(symbol=context.symbol[0],side=1)
  26. position_jm_short = context.account().position(symbol=context.symbol[0],side=2)
  27. # 设计买卖信号
  28. # 设计开仓信号
  29. if not position_jm_short and not position_jm_long:
  30. if new_price > context.up:
  31. print('做空价差组合')
  32. order_volume(symbol=context.symbol[0],side=OrderSide_Sell,volume=1,order_type=OrderType_Market,position_effect=1)
  33. order_volume(symbol=context.symbol[1], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Open)
  34. if new_price < context.down:
  35. print('做多价差组合')
  36. order_volume(symbol=context.symbol[0], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Open)
  37. order_volume(symbol=context.symbol[1], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Open)
  38. # 设计平仓信号
  39. # 持jm多仓时
  40. if position_jm_long:
  41. if new_price >= context.spread_history_mean:
  42. # 价差回归到均值水平时,平仓
  43. print('价差回归到均衡水平,平仓')
  44. order_volume(symbol=context.symbol[0], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
  45. order_volume(symbol=context.symbol[1], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
  46. if new_price < context.down_stoppoint:
  47. # 价差达到止损位,平仓止损
  48. print('价差超过止损点,平仓止损')
  49. order_volume(symbol=context.symbol[0], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
  50. order_volume(symbol=context.symbol[1], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
  51. # 持jm空仓时
  52. if position_jm_short:
  53. if new_price <= context.spread_history_mean:
  54. # 价差回归到均值水平时,平仓
  55. print('价差回归到均衡水平,平仓')
  56. order_volume(symbol=context.symbol[0], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
  57. order_volume(symbol=context.symbol[1], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
  58. if new_price > context.up_stoppoint:
  59. # 价差达到止损位,平仓止损
  60. print('价差超过止损点,平仓止损')
  61. order_volume(symbol=context.symbol[0], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
  62. order_volume(symbol=context.symbol[1], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
  63. if __name__ == '__main__':
  64. '''
  65. strategy_id策略ID,由系统生成
  66. filename文件名,请与本文件名保持一致
  67. mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  68. token绑定计算机的ID,可在系统设置-密钥管理中生成
  69. backtest_start_time回测开始时间
  70. backtest_end_time回测结束时间
  71. backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  72. backtest_initial_cash回测初始资金
  73. backtest_commission_ratio回测佣金比例
  74. backtest_slippage_ratio回测滑点比例
  75. '''
  76. run(strategy_id='strategy_id',
  77. filename='main.py',
  78. mode=MODE_BACKTEST,
  79. token='token',
  80. backtest_start_time='2018-02-01 08:00:00',
  81. backtest_end_time='2018-12-31 16:00:00',
  82. backtest_adjust=ADJUST_PREV,
  83. backtest_initial_cash=2000000,
  84. backtest_commission_ratio=0.0001,
  85. backtest_slippage_ratio=0.0001)

4. 回测结果与稳健性分析

设定初始资金200万,手续费率为0.01%,滑点比率为0.01%。回测结果如下图所示。

回测期累计收益率2.80%,年化收益率为3.06%,沪深300收益率为-29.09%,策略收益跑赢基准收益。最大回撤率为2.03%,胜率为48.25%。

为了检验策略的稳健性,改变数据的频率和均线的计算周期,结果如下。

数据频率 均线周期 年化收益率 最大回撤
1d 10 3.06% 2.30%
1d 20 3.51% 2.53%
1d 30 0.55% 2.45%
3600s 10 -7.84% 7.40%
3600s 20 -4.11% 5.28%
3600s 30 -2.89% 3.91%
900s 10 -10.07% 9.38%
900s 20 -9.39% 8.82%
900s 30 -7.65% 7.32%

可以看出,该策略只在1d的频率下实现了盈利,在其他频率下,收益均为负,说明该策略对于高频场景的适用有一定限制。

跨品种套利 (期货)相关推荐

  1. 获取铁矿石和螺纹钢期货数据。对收益率序列进行描述性统计、jb检验,反正是否符合分形市场假说。计算Hurst指数,制定跨品种套利策略,并进行回测,对跨品种套利效果进行评估。寻求改进空间。

    源码已上传至github 项目简介 获取铁矿石和螺纹钢期货数据.对收益率序列进行描述性统计.jb检验,反正是否符合分形市场假说.计算Hurst指数,制定跨品种套利策略,并进行回测,对跨品种套利效果进行 ...

  2. 【点宽专栏】渤海证券——商品期货跨品种择时套利策略

    作者:张滔 广东海洋大学 | 信息与计算科学 | 本科 点宽量化俱乐部第一期会员 简要回顾 跨品种套利原理:两不同品种期货,具有一定相关性,根据其价格差波动套利. 研报筛选出的6对组合:豆油-棕榈油. ...

  3. 跨市场套利——策略简介与风险因素

    相对于常见的同市场不同品种套利交易而言,跨市场套利是一种更为复杂.也更为专业的套利方式.通常交易者会同时操作两个市场上品级相同或很相近的商品.本文将为大家简单介绍跨市场套利及跨市场套利的方法策略的相关 ...

  4. 期货淀粉相关品种(期货淀粉相关品种是什么)

    期货国内买卖平台都有哪些?哪个比较靠谱? 国内合格正规的期货交易平台如下: 1.中国金融期货交易所: 中国金融期货交易所,是经国务院同意,中国证监会批准,由上海期货交易所.郑州商品交易所.大连商品交易 ...

  5. 生活中的跨境套利: YouTube与B站的暴利搬运

    二级市场写多了还是有点腻,今后想尝试总结一些生活中的"套利"机会,供大家探讨. 本文没有利益导向,所有观点都纯属我个人的中立看法.我已尽可能地搜集并整理所能掌握的公开信息,如有描述 ...

  6. 经典的期货量化交易策略大全

    1.双均线策略(期货) 双均线策略是简单移动平均线策略的加强版.移动平均线目的是过滤掉时间序列中的高频扰动,保留有用的低频趋势.它以滞后性的代价获得了平滑性,比如,在一轮牛市行情后,只有当价格出现大幅 ...

  7. 经典的期货量化交易策略大全(含源代码)

    1.双均线策略(期货) 双均线策略是简单移动平均线策略的加强版.移动平均线目的是过滤掉时间序列中的高频扰动,保留有用的低频趋势.它以滞后性的代价获得了平滑性,比如,在一轮牛市行情后,只有当价格出现大幅 ...

  8. 期货网格交策(源码)

    原 期货网格交易策略(附源码) 网格交易策略 网格交易策略简介 什么是网格交易策略? ​ 网格交易是利用市场震荡行情获利的一种主动交易策略,其本质是利用投资标的在一段震荡行情中价格在网格区间内的反复运 ...

  9. 一个量化交易策略师的自白

    我之前在全球top5券商工作时也主要以CTA研究为主,每天都在不停的进行各种回测和开发.彼时,部门的CTA交易主要集中在股指期货的日内投机上,基本市场上能搜集到的各种书籍和报告我都浏览过.不过,从实际 ...

最新文章

  1. (四)Thymeleaf标准表达式之——[3-6] 操作符(文本、算术、布尔、比较及相等)...
  2. Sql Server之旅——第八站 看公司这些DBA们设计的这些复合索引
  3. QT Core | 信号槽03 - 自定义信号与槽
  4. javascript专题汇总
  5. PHP地图规划骑行路径,骑行路线规划
  6. 按钮点击触发的事件只生效一次
  7. windows电脑上一些软件如画图/记事本变成了英文
  8. 百度网盘视频加速代码
  9. 上海科技大学信息科学与技术研讨会(SSIST day1) 笔记
  10. 数据库设计5-逻辑结构设计
  11. 国际化中英文切换,英文内容长度过长的解决问题
  12. 23-1-18 PDManer 工具
  13. malloc的内存申请和释放
  14. python语言创意绘画是什么-Python街机模块的draw系列绘画例子集合
  15. Java实战之亲戚关系计算器(swing版)(1)——项目简述
  16. Jackson与Json的介绍与使用
  17. php中script标签,关于 script 标签你应该知道的
  18. 某mo通过Xposed自动抢红包
  19. 反汇编修改《三国群侠传》最大金钱
  20. 三、Hadoop系统应用之Hadoop集群测试及初体验(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7)

热门文章

  1. 对Max Pooling的理解
  2. 【简短测评】在线音乐播放器,哪一款适合写代码时候使用
  3. 【思维导图怎么画】万彩脑图大师教程 | 插入动画图标
  4. 2020-11-01(电脑耳机声音外放)
  5. Cepton宣布与美国底特律顶级汽车制造商合作,赢得业内最大ADAS激光雷达量产订单
  6. 投资分析研究:天然气分布式能源项目
  7. 蓝牙耳机哪个品牌最好?2023最新学生平价蓝牙耳机推荐
  8. 高质量解读《互联网企业安全高级指南》三部曲——实践篇
  9. Chrome浏览器上传图片或图片另存时浏览器无响应
  10. 人力资源管理信息系统