跨期套利策略简介

什么是跨期套利?

​ 跨期套利**是套利交易中最普遍的一种,是股指期货的跨期套利(Calendar Spread Arbitrage)即为在同一交易所进行同一指数、但不同交割月份的套利活动。

​ 跨期套利**是利用同一商品但不同交割月份之间正常价格差距出现异常变化时进行对冲而获利的,又可分为牛市套利(bull spread)和熊市套利(bear spread)两种形式。例如在进行金属牛市套利时,交易所买入近期交割月份的金属合约,同时卖出远期交割月份的金属合约,希望近期合约价格上涨幅度大于远期合约价格的上帐幅度;而熊市套利则相反,即卖出近期交割月份合约,买入远期交割月份合约,并期望远期合约价格下跌幅度小于近期合约的价格下跌幅度。

什么是价差套利?

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

协整性检验

下图为两个时间序列(“RB1701”,“RB1705”)。

​ !走势

​ 可以看出,两只股票具有同涨同跌的规律,长期以来两只股票的价差比较平稳,当价差变大或变小时,会有某种“力量”使它回归均值,我们的策略也正基于此。但仅凭肉眼观测,肯定是不严谨的,这就需要协整性检验。如果两个股票具有强协整性,那么无论它们中途怎么走的,它们前进的方向总是一样的。

什么是平稳性?

​ 提到协整性,就不得不提平稳性。在数学中,平稳随机过程(Stationary random process)或者严平稳随机过程(Strictly-sense stationary random process),又称狭义平稳过程,是在固定时间和位置的概率分布与所有时间和位置的概率分布相同的随机过程:即随机过程的统计特性不随时间的推移而变化。这样,数学期望和方差这些参数也不随时间和位置变化。平稳在理论上有严平稳和宽平稳两种,在实际应用上宽平稳使用较多。宽平稳的数学定义为:对于时间序列 ​,若对任意的​,满足:

则称时间序列​ 是宽平稳的。

​ 平稳性(stationarity)是一个序列在时间推移中保持稳定不变的性质,或许您对于上图的“价差平稳”不认可,我们将价差做了一阶差分,可以看出,它始终是围绕着一个长期均值(0)在波动。

什么是整性?

如果某一非平稳序列​能够经过​次差分后变成平稳序列,就称该序列为​阶整性,也成为单整,记为

什么是协整性?

协整性是指若两个或多个非平稳的变量序列,其某个线性组合后的序列呈平稳性。

假设两个非平稳时间序列  且有。如果存在某一参数向量 ,使得:

其中,​为正整数,​为协整向量,​为协整系数。

那么  之间存在协整,记为:

 ,~)

如果​,那么:

有:

意味着回归方程

有意义,因为这时​惟一存在。同时,时间序列,​在时间上的实际变动与长期均衡轨道的偏差​是收敛的。就是说,即使在某一时点上,,​的运动方向相互背离,当它们之间存在的长期规律或内在力量迫使它们趋向一致。即​服从均值为0,方差为1的正态分布。因而判定​和​之间存在长期均衡关系。

​ 协整概念是一个强有力的概念。因为协整允许我们刻画两个或多个序列之间的平衡或平稳关系。对于每一个序列单独来说可能是非平稳的,这些序列的矩,如均值、方差或协方差随时间而变化,而这些时间序列的线性组合序列却可能有不随时间变化的性质。

什么是单位根检验?

​ 常用的时间序列数据单整和协整阶数的检验,是所谓的单位根检验。

DF(Dickey-Fuller)检验

​ 考虑时间序列​,有一阶自回归:

其中, 为代估参数, 为白噪声。

如果​,则​ 为随机游走过程;如果​,则​​为0阶平稳过程。基于此,1979年迪基和富勒提出检验​ 检验。称DF检验,其回归方程为:

 

其中,​为待估参数,

具体做法是用最小二乘法求出上式中的​,并检验其负性:

 : 

  : 

如果接受 ,意味着 .如果拒绝,接受,则

ADF(Augmented Dickey-Fuller)检验

如果 D存在自回归,考虑截距 ,趋势项 ,则有ADF检验方程:

为什么需要检验协整性?

​ 如果我们不经检验而求得​,​之间的某种关系,如​。由于这种关系本身可能不存在,得到这样的关系纯属偶然。因而用此关系式所得到的分析,判断和预测结果会不真实乃至荒谬。

怎样检验协整性?

​ 本策略采用“Engle-Granger两步协整检验法”,

​ Engle-Granger两步协整检验法用普通最小二乘法估计这些变量之间的平稳关系系数,然后用单位根检验来检验残差,如果序列是平稳的,则不存在单位根, 否则就会存在单位根。ADF检验的原假设是存在单位根,因此如果得到的统计量显著小于3个置信度(1%,5%,10%)的临界统计值时,说明是拒绝原假设的。

我们以两个序列​和​为例,在检验协整性之前,首先要对序列的单整性进行检验,只有当两个序列单整阶数相同时,才有可能存在协整关系。

在​​具有相同单整阶数,通过单整性检验之后,我们用最小二乘法估计模型:

并计算相应的残差序列:

然后,检验残差序列的平稳性:

利用ADF检验法,检验在上述估计下得到的回归方程的残差​是否平稳(如果​和​不是协整的,则他们的任意组合都是非平稳的,因此残差​将是非平稳的)。也就是说,我们检验残差​的非平稳的假设,就是检验​和​不是协整的假设。

跨期套利策略实现(基于掘金量化平台)

策略思想

• 首先获取套利(RB1801,RB1805)标的价格序列。

• 根据​两步法(1、序列同阶单整 2、​残差平稳)判断序列具有协整关系之后(若无协整关系则全平仓位不进行操作)。

• 通过计算两个真实价格序列回归残差的1.5个标准差上下轨,并在价差突破上轨的时候做空价差,价差突破下轨的时候做多价差并在回归至标准差水平内的时候平仓。

策略主要步骤实现

订阅数据

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需要设置返回值的种类

协整性检验

def cointegration_test(series01, series02):urt_rb1801 = ts.adfuller(np.array(series01), 1)[1]urt_rb1805 = ts.adfuller(np.array(series02), 1)[1]print (ts.adfuller(np.array(series01), 1))# 同时平稳或不平稳则差分再次检验if (urt_rb1801 > 0.1 and urt_rb1805 > 0.1) or (urt_rb1801 < 0.1 and urt_rb1805 < 0.1):urt_diff_rb1801 = ts.adfuller(np.diff(np.array(series01)), 1)[1]urt_diff_rb1805 = ts.adfuller(np.diff(np.array(series02), 1))[1]# 同时差分平稳进行OLS回归的残差平稳检验if urt_diff_rb1801 < 0.1 and urt_diff_rb1805 < 0.1:matrix = np.vstack([series02, np.ones(len(series02))]).Tbeta, c = np.linalg.lstsq(matrix, series01)[0]resid = series01 - beta * series02 - cif ts.adfuller(np.array(resid), 1)[1] > 0.1:result = 0.0else:result = 1.0return beta, c, resid, resultelse:result = 0.0return 0.0, 0.0, 0.0, resultelse:result = 0.0return 0.0, 0.0, 0.0, result

协整性检验需要我们自己定义函数(如以上代码),此函数需要输入两个序列,返回值为回归方程中的各项参数及两序列是否具有协整性的结果。

策略回测分析

回测报告

分析

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

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

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

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

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

附:跨期套利策略源码

# coding=utf-8
from __future__ import print_function, absolute_import, unicode_literalsimport numpy as np
from gm.api import *try:import statsmodels.tsa.stattools as ts
except:print('请安装statsmodels库')'''
本策略基于掘金量化交易平台 网址:www.myquant.cn本策略根据EG两步法(1.序列同阶单整2.OLS残差平稳)判断序列具有协整关系之后(若无协整关系则全平仓位不进行操作)
通过计算两个真实价格序列回归残差的0.9个标准差上下轨,并在价差突破上轨的时候做空价差,价差突破下轨的时候做多价差
并在回归至标准差水平内的时候平仓
回测数据为:SHFE.rb1801和SHFE.rb1805的1min数据
回测时间为:2017-09-25 08:00:00到2017-10-01 15:00:00
'''# 协整检验的函数
def cointegration_test(series01, series02):urt_rb1801 = ts.adfuller(np.array(series01), 1)[1]urt_rb1805 = ts.adfuller(np.array(series02), 1)[1]print (ts.adfuller(np.array(series01), 1))# 同时平稳或不平稳则差分再次检验if (urt_rb1801 > 0.1 and urt_rb1805 > 0.1) or (urt_rb1801 < 0.1 and urt_rb1805 < 0.1):urt_diff_rb1801 = ts.adfuller(np.diff(np.array(series01)), 1)[1]urt_diff_rb1805 = ts.adfuller(np.diff(np.array(series02), 1))[1]# 同时差分平稳进行OLS回归的残差平稳检验if urt_diff_rb1801 < 0.1 and urt_diff_rb1805 < 0.1:matrix = np.vstack([series02, np.ones(len(series02))]).Tbeta, c = np.linalg.lstsq(matrix, series01)[0]resid = series01 - beta * series02 - cif ts.adfuller(np.array(resid), 1)[1] > 0.1:result = 0.0else:result = 1.0return beta, c, resid, resultelse:result = 0.0return 0.0, 0.0, 0.0, resultelse:result = 0.0return 0.0, 0.0, 0.0, resultdef init(context):context.goods = ['SHFE.rb1801', 'SHFE.rb1805']# 订阅品种subscribe(symbols=context.goods, frequency='1d', count=31, wait_group=True)def on_bar(context, bars):# 获取过去800个60s的收盘价数据close_01 = context.data(symbol=context.goods[0], frequency='1d', count=31, fields='close')['close'].valuesclose_02 = context.data(symbol=context.goods[1], frequency='1d', count=31, fields='close')['close'].valuesprint (len(close_01),len(close_02))# 展示两个价格序列的协整检验的结果beta, c, resid, result = cointegration_test(close_01, close_02)# 如果返回协整检验不通过的结果则全平仓位等待if not result:print('协整检验不通过,全平所有仓位')order_close_all()return# 计算残差的标准差上下轨mean = np.mean(resid)up = mean + 1.5 * np.std(resid)down = mean - 1.5 * np.std(resid)# 计算新残差resid_new = close_01[-1] - beta * close_02[-1] - c# 获取rb1801的多空仓位position_01_long = context.account().position(symbol=context.goods[0], side=PositionSide_Long)position_01_short = context.account().position(symbol=context.goods[0], side=PositionSide_Short)if not position_01_long and not position_01_short :# 上穿上轨时做空新残差if resid_new > up:order_target_volume(symbol=context.goods[0], volume=50, order_type=OrderType_Market,position_side=PositionSide_Short)print(context.goods[0] + '以市价单开空仓1手')order_target_volume(symbol=context.goods[1], volume=50, order_type=OrderType_Market,position_side=PositionSide_Long)print(context.goods[1] + '以市价单开多仓1手')# 下穿下轨时做多新残差if resid_new < down:order_target_volume(symbol=context.goods[0], volume=50, order_type=OrderType_Market,position_side=PositionSide_Long)print(context.goods[0], '以市价单开多仓1手')order_target_volume(symbol=context.goods[1], volume=50, order_type=OrderType_Market,position_side=PositionSide_Short)print(context.goods[1], '以市价单开空仓1手')# 新残差回归时平仓elif position_01_short:if resid_new <= up:order_close_all()print('价格回归,平掉所有仓位')# 突破下轨反向开仓if resid_new < down:order_target_volume(symbol=context.goods[0], volume=50, order_type=OrderType_Market,position_side=PositionSide_Long)print(context.goods[0], '以市价单开多仓1手')order_target_volume(symbol=context.goods[1], volume=50, order_type=OrderType_Market,position_side=PositionSide_Short)print(context.goods[1], '以市价单开空仓1手')elif position_01_long:if resid_new >= down:order_close_all()print('价格回归,平所有仓位')# 突破上轨反向开仓if resid_new > up:order_target_volume(symbol=context.goods[0], volume=50, order_type=OrderType_Market,position_side=PositionSide_Short)print(context.goods[0], '以市价单开空仓1手')order_target_volume(symbol=context.goods[1], volume=50, order_type=OrderType_Market,position_side=PositionSide_Long)print(context.goods[1], '以市价单开多仓1手')if __name__ == '__main__':'''strategy_id策略ID,由系统生成filename文件名,请与本文件名保持一致mode实时模式:MODE_LIVE回测模式:MODE_BACKTESTtoken绑定计算机的ID,可在系统设置-密钥管理中生成backtest_start_time回测开始时间backtest_end_time回测结束时间backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POSTbacktest_initial_cash回测初始资金backtest_commission_ratio回测佣金比例backtest_slippage_ratio回测滑点比例'''run(strategy_id='23b0ef26-d355-11e7-9259-9cd21ef04ea9',filename='cointeration.py',mode=MODE_BACKTEST,token='c395247a76e8a5caeee699d668d6f550213bc418',backtest_start_time='2017-07-01 08:00:00',backtest_end_time='2017-10-01 16:00:00',backtest_adjust=ADJUST_PREV,backtest_initial_cash=500000,backtest_commission_ratio=0.0001,backtest_slippage_ratio=0.0001)

来源:掘金量化  myquant.cn

相关阅读: | 量化交易  | 期货模拟交易 | python量化交易 | 股票数据  | 量化交易策略 | 机器学习算法  | 多因子选股 |

| 双均线策略 |  网格交易法 |  海龟交易法  |  跨期套利  | 行业轮动  | 指数增强  | 跨品种套利 | 日内交易 |

跨期套利策略(附:源码)相关推荐

  1. python 经验模态分解_经验模态分解下的日内趋势交易策略 附源码

    策略分析过程参考  广发证券的研究报告. 其中EMD库的安装参考 1.指标 在每天分钟数据积累mlen个bar的位置,将今日的数据通过EMD分解为噪声部分和趋势部分. 定义信噪比 SNR = std( ...

  2. 经典日内策略——空中花园(附源码)

    空中花园属于期货日内突破策略,是一个相对"粗暴"的策略.   一般来说,如果开盘突破就入场,出错率较高.而这一策略增加了额外的条件,也就是开盘时要大幅高开或者低开,形成一个空窗,然 ...

  3. python量化策略源码_【Python量化投资】趋向系统指标策略 ADX、DMI指标用于股票池(附源码)...

    原标题:[Python量化投资]趋向系统指标策略 ADX.DMI指标用于股票池(附源码) [什么是ADX] ADX(average directional indicator) 平均趋向指数,常用的趋 ...

  4. 掘金量化 | 短周期量价策略(附源码)

    可能不少朋友都有阅读过国泰君安<基于短周期价量特征的多因子选股体系>这篇研报,对其内多达191个量价因子印象深刻.该研报是在2017年中旬发布的,时至今日已过去四年时光,为此大家可能会好奇 ...

  5. 策略究龟交易法(附源码

    原 [策略研究]海龟交易法则(附源码) 海龟交易法则简介 什么是海龟交易法则? ​ ​ 1983年年中,著名的商品投机家理查德.丹尼斯与他的老友比尔.埃克哈特进行了一场辩论,这场辩论是关于伟大的交易员 ...

  6. 股票日回易略(附源码

    原 股票日内回转交易策略(附源码) 什么是日内交易? ​ 日内交易(Day Trade)是一种交易模式.主要是指持仓时间短,不留过夜持仓的交易方式.日内交易捕捉入市后能够马上脱离入市成本的交易机会,入 ...

  7. xavier初始化_深入解读xavier初始化(附源码)

    论文是Understanding the difficulty of training deep feedforward neural networks. 一篇感觉不错的翻译为[Deep Learni ...

  8. CTP接口开发案例(内附源码)

    CTP接口开发(内附源码) 提示:在看本博客之前建议先阅读上期所官方的开发文档(SimNow官网中去下载CTP接口文件),然后在SimNow官网注册模拟账号. 提示:股票CTP接口和期货CTP接口类似 ...

  9. Android植物大战僵尸附源码

    本文介绍cocos2d-android实现的Android植物大战僵尸,最后附源码 内容介绍: 一.游戏最原始的开发框架. 主要会介绍 a)  SurfaceView+SurfaceHolder.Ca ...

  10. 日志组件Log2Net的介绍和使用(附源码开源地址)

    Log2Net是一个用于收集日志到数据库或文件的组件,支持.NET和.NetCore平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...

最新文章

  1. 菜鸟学习物联网---辨析基于Andriod 5.1,Linux,Windows10开发Dragon Board 410c板
  2. 安装cv2(opencv-python)遇到的问题
  3. java临时的api,JAVA API-day03
  4. bootstraptable 分页循环_关于bootstrap-table服务端分页问题
  5. [转]“Ceph浅析”系列之(二)—Ceph的设计思想
  6. servlet中访问mysql无法包含中文的解决
  7. 信息学奥赛一本通C++语言——1040:输出绝对值
  8. 推荐几个阿里、美团、腾讯大佬的公众号,一起学习!
  9. LeetCode 1 两数之和 python
  10. WebStorm 6.0下运行pomelo项目
  11. 多按键多界面二维数组表驱动设计
  12. java定义个字符串_Java定义字符串(2种方式)
  13. windows系统服务器怎么锁屏,使用Windows 8的十个小贴士:自定义锁屏
  14. GMA Round 1 YGGDRASIL
  15. 湘潭大学计算机考研拟录取,湘潭大学2019年硕士研究生拟录取考生公示名单
  16. IPv6 路由信息查看命令
  17. java实现Selenium自动化测试web
  18. 【矩阵论笔记】Hermit标准型
  19. php中json字符串值,如何使用PHP从JSON中提取数据?
  20. c primer plus 第五章编程练习

热门文章

  1. 分享9个ps、pr免费教程网站
  2. GAN手写体生成(MINIST)
  3. 谷粒商城学习笔记(3)-- 分布式组件
  4. 华为手机升级回退_华为手机版本回退 - 卡饭网
  5. .net core快速开发平台,learun自主工作流引擎设计规范
  6. FIT2CLOUD飞致云被权威研究机构评选为中国混合云管理软件领导者
  7. docker 下安装oracle
  8. PyTorch 激励函数
  9. CART决策树----基尼指数划分
  10. 基于FPGA的波束形成verilog开发