配对(套利)交易之二,符合配对规则回测

最初是计划使用股票进行测试的,之前写的策略也大多是基于股票的,但发现米框目前已经不支持股票卖空了,(2年前有这个功能的).所以又修改为期货的版本.可是呢,米框对期货的支持真的太弱了,回测框架各种报错,还都是完全看不懂的报错,提示信息没啥参考意义.只能通过调整时间区间,找到合适的测试区间来完成回测.坦率讲,只能借鉴下思路.

上一篇文章提到过,目前大部分回测,其实只做到了 "y=x"的水平,包括掘金量化提供的官方教程.实际这种价差概率出现非常小的.大部分都是y=ax+b的形式.

思路如下:

筛选有协整关系股票1,2

price_1

price_2

使用线性回归LinearReg模型

y_predict=LinearReg().fit(price_1,price_2).predict(price_1)

y_predict是使用线性回归预测股票2的价格(对应price_2)

可以得到残差e=diff=y-y_predict

残差符合正态分布,0均值,所以将"y-y_predict"整体看做一个组合(或一个投资标的),按照低买高卖的原则操作

主要纠结点在于:这里的买卖,对应了原始股票(期货)1,2的什么操作,这是需要思考的(也就是应该买那个,卖哪个)

定义:diff=y-y_predict

定义上下界:

up=diff.mean()+diff.std()

down=diff.mean()-diff.std()

操作:高于上界买入,低于卖出

 

假如低于下界:

应当买入组合(y-y_predict)=>(price_2-(a*price_1+b))=>(以价格price_2买入1份股票2 + 以价格price_1卖出a份的股票1-b截距项)

所以:买入实际应当买入2.卖出1,那么截距如何处理?考虑到我们实际买卖过程中,只能操作股票1和股票2,操作不了其他了,所以截距应当算作diff的一部分,

也就是说:真实diff=y-ax=price_b-a*price_a=原始diff+b

那么买入数量呢?由于每一份组合的消耗资金为abs(原始diff+b),所以份数num=cash/abs(原始diff+b)

所以买入股票1:1*num

卖出股票2:a*num

对以上整体重新梳理下:

第一步:协整关系股票1,2

第二步:用price_2=y,price_1=X,线性回归计算系数a,截距b

第三步:计算diff序列:price_2-a*price_1,计算上下界:up=diff.mean()+std(),down=diff.mean()-diff.std()(std的倍率自己控制)

第四步:对每日价格计算diff,比对up和down,低于down则,买入num份2,卖出num*a份1.高于up则卖出num份2,买入num*a份1(和买入相反),num的计算为cash/价格diff(其实价格的diff就是一份组合消耗的现金净值,考虑卖出得到的钱和买入钱的对冲效果,abs是考虑到保证金的消耗,即使卖出得到了钱,但是也需要消耗保证金,所以卖出也是有限制的,并未无限卖出无限得到现金)

代码和回测:https://www.ricequant.com/community/topic/36842/

套利可以做事情其实还是挺多的,

优化性的:动态判断2只股票(期货)是否存在协整关系,存在构造组合,低买高卖.并且要持续检查协整关系,一旦关系不在成立并且超过一定时间则清空组合.避免黑天鹅带来的大回撤.

并且基于均值回归也可以结合网格(个人认为网格才是所有策略or指标中最为犀利的)进行操作.高抛低吸.

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值