跨品种套利 (期货)
跨品种套利
1. 原理
套利是指在买入或卖出一种金融资产的同时卖出或买入另一种相关的金融资产从中利用价差获得套利的过程。
以大商所玉米和淀粉为例,合约分别为DCE.c1801和DCE.cs1801。二者之间相关性为0.7333,价差处于相对稳定合理区间。如图所示。
二者价差整体处于250-350之间。当价差偏离此区间时,可以进行跨品种套利。
1.套利的两种资产必须有一定的相关性。
2.两种合约标的不同,到期时间相同。
3.两种资产之间的价差呈现一定规律。
最常用的方法是利用EG两步法对两个序列做协整检验,判断两个序列是否平稳。只有单整阶数相同,二者才有可能存在一定的关系。
以大豆和豆粕为例,选取其在2017年1月1日至2018年1月1日的主力合约价格时间序列,利用statsmodels包进行协整检验。
利用OLS回归检残差序列是否平稳,残差的t=-2.3214,临界值为-3.4577,说明残差平稳。因此,可以认为二者之间存在一定关系。
对残差进行ks检验,检验结果p=0,说明残差分布为正态分布。
传统利用价差进行跨品种套利的方法是计算出均值和方差,设定开仓、平仓和止损阈值。当新的价格达到阈值时,进行相应的开仓和平仓操作。
因此,常用变动的均值设定阈值。即用过去N天两个标的之间差值的均值和方差。
2. 策略思路
3. 策略代码
# coding=utf-8
from __future__ import print_function, absolute_import, unicode_literals
from gm.api import *
import numpy as np
def init(context):
# 选择的两个合约
context.symbol = ['DCE.j1901', 'DCE.jm1901']
# 订阅历史数据
subscribe(symbols=context.symbol,frequency='1d',count=11,wait_group=True)
def on_bar(context, bars):
# 数据提取
j_close = context.data(symbol=context.symbol[0],frequency='1d',fields='close',count=31).values
jm_close = context.data(symbol=context.symbol[1],frequency='1d',fields='close',count=31).values
# 提取最新价差
new_price = j_close[-1] - jm_close[-1]
# 计算历史价差,上下限,止损点
spread_history = j_close[:-2] - jm_close[:-2]
context.spread_history_mean = np.mean(spread_history)
context.spread_history_std = np.std(spread_history)
context.up = context.spread_history_mean + 0.75 * context.spread_history_std
context.down = context.spread_history_mean - 0.75 * context.spread_history_std
context.up_stoppoint = context.spread_history_mean + 2 * context.spread_history_std
context.down_stoppoint = context.spread_history_mean - 2 * context.spread_history_std
# 查持仓
position_jm_long = context.account().position(symbol=context.symbol[0],side=1)
position_jm_short = context.account().position(symbol=context.symbol[0],side=2)
# 设计买卖信号
# 设计开仓信号
if not position_jm_short and not position_jm_long:
if new_price > context.up:
print('做空价差组合')
order_volume(symbol=context.symbol[0],side=OrderSide_Sell,volume=1,order_type=OrderType_Market,position_effect=1)
order_volume(symbol=context.symbol[1], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Open)
if new_price < context.down:
print('做多价差组合')
order_volume(symbol=context.symbol[0], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Open)
order_volume(symbol=context.symbol[1], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Open)
# 设计平仓信号
# 持jm多仓时
if position_jm_long:
if new_price >= context.spread_history_mean:
# 价差回归到均值水平时,平仓
print('价差回归到均衡水平,平仓')
order_volume(symbol=context.symbol[0], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
order_volume(symbol=context.symbol[1], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
if new_price < context.down_stoppoint:
# 价差达到止损位,平仓止损
print('价差超过止损点,平仓止损')
order_volume(symbol=context.symbol[0], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
order_volume(symbol=context.symbol[1], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
# 持jm空仓时
if position_jm_short:
if new_price <= context.spread_history_mean:
# 价差回归到均值水平时,平仓
print('价差回归到均衡水平,平仓')
order_volume(symbol=context.symbol[0], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
order_volume(symbol=context.symbol[1], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
if new_price > context.up_stoppoint:
# 价差达到止损位,平仓止损
print('价差超过止损点,平仓止损')
order_volume(symbol=context.symbol[0], side=OrderSide_Buy, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
order_volume(symbol=context.symbol[1], side=OrderSide_Sell, volume=1, order_type=OrderType_Market, position_effect=PositionEffect_Close)
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='strategy_id',
filename='main.py',
mode=MODE_BACKTEST,
token='token',
backtest_start_time='2018-02-01 08:00:00',
backtest_end_time='2018-12-31 16:00:00',
backtest_adjust=ADJUST_PREV,
backtest_initial_cash=2000000,
backtest_commission_ratio=0.0001,
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的频率下实现了盈利,在其他频率下,收益均为负,说明该策略对于高频场景的适用有一定限制。
跨品种套利 (期货)相关推荐
- 获取铁矿石和螺纹钢期货数据。对收益率序列进行描述性统计、jb检验,反正是否符合分形市场假说。计算Hurst指数,制定跨品种套利策略,并进行回测,对跨品种套利效果进行评估。寻求改进空间。
源码已上传至github 项目简介 获取铁矿石和螺纹钢期货数据.对收益率序列进行描述性统计.jb检验,反正是否符合分形市场假说.计算Hurst指数,制定跨品种套利策略,并进行回测,对跨品种套利效果进行 ...
- 【点宽专栏】渤海证券——商品期货跨品种择时套利策略
作者:张滔 广东海洋大学 | 信息与计算科学 | 本科 点宽量化俱乐部第一期会员 简要回顾 跨品种套利原理:两不同品种期货,具有一定相关性,根据其价格差波动套利. 研报筛选出的6对组合:豆油-棕榈油. ...
- 跨市场套利——策略简介与风险因素
相对于常见的同市场不同品种套利交易而言,跨市场套利是一种更为复杂.也更为专业的套利方式.通常交易者会同时操作两个市场上品级相同或很相近的商品.本文将为大家简单介绍跨市场套利及跨市场套利的方法策略的相关 ...
- 期货淀粉相关品种(期货淀粉相关品种是什么)
期货国内买卖平台都有哪些?哪个比较靠谱? 国内合格正规的期货交易平台如下: 1.中国金融期货交易所: 中国金融期货交易所,是经国务院同意,中国证监会批准,由上海期货交易所.郑州商品交易所.大连商品交易 ...
- 生活中的跨境套利: YouTube与B站的暴利搬运
二级市场写多了还是有点腻,今后想尝试总结一些生活中的"套利"机会,供大家探讨. 本文没有利益导向,所有观点都纯属我个人的中立看法.我已尽可能地搜集并整理所能掌握的公开信息,如有描述 ...
- 经典的期货量化交易策略大全
1.双均线策略(期货) 双均线策略是简单移动平均线策略的加强版.移动平均线目的是过滤掉时间序列中的高频扰动,保留有用的低频趋势.它以滞后性的代价获得了平滑性,比如,在一轮牛市行情后,只有当价格出现大幅 ...
- 经典的期货量化交易策略大全(含源代码)
1.双均线策略(期货) 双均线策略是简单移动平均线策略的加强版.移动平均线目的是过滤掉时间序列中的高频扰动,保留有用的低频趋势.它以滞后性的代价获得了平滑性,比如,在一轮牛市行情后,只有当价格出现大幅 ...
- 期货网格交策(源码)
原 期货网格交易策略(附源码) 网格交易策略 网格交易策略简介 什么是网格交易策略? 网格交易是利用市场震荡行情获利的一种主动交易策略,其本质是利用投资标的在一段震荡行情中价格在网格区间内的反复运 ...
- 一个量化交易策略师的自白
我之前在全球top5券商工作时也主要以CTA研究为主,每天都在不停的进行各种回测和开发.彼时,部门的CTA交易主要集中在股指期货的日内投机上,基本市场上能搜集到的各种书籍和报告我都浏览过.不过,从实际 ...
最新文章
- (四)Thymeleaf标准表达式之——[3-6] 操作符(文本、算术、布尔、比较及相等)...
- Sql Server之旅——第八站 看公司这些DBA们设计的这些复合索引
- QT Core | 信号槽03 - 自定义信号与槽
- javascript专题汇总
- PHP地图规划骑行路径,骑行路线规划
- 按钮点击触发的事件只生效一次
- windows电脑上一些软件如画图/记事本变成了英文
- 百度网盘视频加速代码
- 上海科技大学信息科学与技术研讨会(SSIST day1) 笔记
- 数据库设计5-逻辑结构设计
- 国际化中英文切换,英文内容长度过长的解决问题
- 23-1-18 PDManer 工具
- malloc的内存申请和释放
- python语言创意绘画是什么-Python街机模块的draw系列绘画例子集合
- Java实战之亲戚关系计算器(swing版)(1)——项目简述
- Jackson与Json的介绍与使用
- php中script标签,关于 script 标签你应该知道的
- 某mo通过Xposed自动抢红包
- 反汇编修改《三国群侠传》最大金钱
- 三、Hadoop系统应用之Hadoop集群测试及初体验(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7)