本文共 1455 字,大约阅读时间需要 4 分钟。
最初是计划使用股票进行测试的,之前写的策略也大多是基于股票的,但发现米框目前已经不支持股票卖空了,(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是考虑到保证金的消耗,即使卖出得到了钱,但是也需要消耗保证金,所以卖出也是有限制的,并未无限卖出无限得到现金)
代码和回测:
套利可以做事情其实还是挺多的,
优化性的:动态判断2只股票(期货)是否存在协整关系,存在构造组合,低买高卖.并且要持续检查协整关系,一旦关系不在成立并且超过一定时间则清空组合.避免黑天鹅带来的大回撤.
并且基于均值回归也可以结合网格(个人认为网格才是所有策略or指标中最为犀利的)进行操作.高抛低吸.
转载地址:http://yhyws.baihongyu.com/