算法策略 | 商品统计套利之趋势套利策略

松鼠宽客
2020-11-25



公众号致力于分享量化策略,培训视频,Python,程序化交易等相关内容如果你喜欢本文,麻烦分享关注一下公众号非常感谢



赠言
“识局,破局”




引言


大家好,我是乌克兰剑圣。本月的最后一个策略来了,群里的小伙伴之前提到过能不能写一个套利策略。好,本期我们就来开发一个套利策略。套利策略的依据理论有很多,距离法,协整法,随机价差法,时间序列法等等之类的,其中最重要的就是均衡关系。然而,我并不准备罗列一大堆数学公式,因为我也不会 。而是秉持松鼠宽客一贯的作风:0到1,策略落地。


正文


OK,说正事儿。套利标的我选择油脂的YP,因为早年在公司主攻农产品板块,三油俩粕还是比较熟悉的。农产品的波段机会是非常多的,尤其是油粕每年总有那么3-4次波段。如果说你的CTA策略在这个版块表现不好,那是正常的,少有表现好的CTA策略放到上面能和黑色化工媲美,这和品种特性有很大关系。我们来看看YP的套利价差图(15分钟图):


这是15年至今的价差变化,虽然凌乱但还是遵循了均衡关系;



价差的均值回归特性是比较明显的,百分位数计算的上限1200左右,下限500左右。我们有利可图的地方在区间之内,如何抓住这部分利润是策略盈利的关键。至于鱼头鱼尾,咱们就别抢了吧。


先上策略:



抱歉 ,我也没想到在其他品种表现很好的策略上来是这副德性,用太原话讲叫做求胡麻擦。没关系,不怕策略差,就怕不会改。


我们再回到价差这幅图:



我们目的是要吃鱼身,但是发现这条鱼的“刺儿”太多了,而且大小不均,不太好剔除。杂乱无章的价格噪音阻碍了我们赚取主要趋势的利润,这也是策略表现很差的原因,所以重点来了:过滤。


过滤


保持原策略开平仓条件和参数不变,加入波动率计算公式:


      //波动幅度计算      For value1 = 1 To R1        //      {        If(value1==1)NTD1=0;        If (JC[value1] <= HH )           NTD1 = NTD1 + (HH - JC[value1]);         If (JC[value1] >= LL   )        NTD1 = NTD1 + (JC[value1] - LL);       }      For value1 = 1 To R1*2        //      {        If(value1==1)NTD2=0;        If (JC[value1] <= HH2 )            NTD2 = NTD2 + (HH2 - JC[value1]);         If (JC[value1] >= LL2   )        NTD2 = NTD2 + (JC[value1] - LL2);       }      //波动率计算      N1=(NTD1/JC)/Summation((NTD1/JC),R1);      N2=(NTD2/JC)/Summation((NTD2/JC),R1);




策略代码里已经做过防偷价处理,中间的是价差图加上了开平仓的条件线显示。我们从测试报告上看,效果有了很大的提升。但是还没有达到我的预期,我们从绩效图看到16年至19年都没有创新高,处于回撤期中。这样是不行的,现在来看看这段时间的行情是什么样的:



这段时间行情虽然有过几个流畅的波段,但主要还是以短波往复为主。

如何改?我首先想到的是平仓出场的条件是否能灵活一些。


第二版


加入平仓参数自适应:


      if(CurrentBar>barN)      {      if(ATRN[1]>SY) //当波动率大于上限时,波动率逐步走向过热      {                if (ATRN[1]>ATRN[2])//波动率持续放大,说明趋势在加速,行情波动加大。移动止盈参数也随之增大以免被甩出去;                  //若波动率大于SY,但是波动率开始走弱说明行情可能进入回抽或者震荡,这个时候TRS参数将不再继续增加,即保护利润;        {          TRS=TRS+X;          TRS=Min(TRS,200);        }                      }      if(ATRN[1]<XY)//当波动率小于下限时,波动率逐步走向收缩。      {            if(ATRN[1]<ATRN[2])//波动率持续收缩,说明行情在震荡或者无明显趋势。移动止盈参数也随之减少以免因为参数迟钝在震荡行情亏损过大;                  //若波动率小于XY,但是波动率开始走强说明行情可能进入趋势或者波段,这个时候TRS参数将不再继续减少,即保护仓位;        {          TRS=TRS-X;          TRS=Max(TRS,100);        }      }      BarN=CurrentBar;    }


先在16年-19年样本内反复调整,再到样本外检查普适性避免使用过优参数。我发现加入了参数自适应后,策略绩效整体有了提升,净值从1.2至1.4。但是并没有处理好16-19年这段,问题可能不是出场条件,怎么办?


第三版


改变进场条件,使用周期内的波峰波谷,同时换成ER噪音过滤:


    filter=EffRatio>P ; //ER过滤降噪    //PlotNumeric("EffRatio",EffRatio*100);    Commentary("EffRatio"+Text(EffRatio));    Commentary("ATR"+Text(ATR));    SH=SwingHigh(1,JC,X,N);//计算波峰    SL=SwingLow(1,JC,X,N);//计算波谷    if(SH>0)PlotNumeric("SH",SH);    if(SL>0)PlotNumeric("SL",SL);


改变开仓条件和加入ER滤波器以后,绩效有了显著的增长。我们关注的回撤期从16年7月至2019年缩短至16年12月至18年9月。虽然没有在这段时间盈利,但是其他时间段的盈利提升了不少。在开仓条件里还加入文章开头提到的上限下限的限制,低于下限不开空,高于上限不开多。至于这一点,是基于以前在公司做基本面的统计,也和品种间的替代有关。这也是套利遵循均衡关系的原因实际中价差向下的空间有限,向上的空间可能会超出预期,所以并不是一个对称的关系,我们在极端位置的时候就不要再去顺势交易了,真正有价值的行情在区间里。



能看到这里的小伙伴,为你点一个大大的赞。不要重复造轮子了,去找小松鼠领取课件吧。别忘了转发,关注,点赞哦,有啥想说的在评论区留言或者在群里讨论吧。



策略源码包:





End


咨询详情



长按下方二维码

加客服“小松鼠-松鼠宽客”
微信号: viquant01


对话框回复 YP 咨询源码领取

(俱乐部加入→回复VIP)

加入松鼠俱乐部



----------------往期精彩内容----------------


算法策略专辑:

4.【算法策略】傅里叶滤波结合跨周期波段模型

3.【日内模型】TBquant信号回测版本+python历史回测版源码

2.【日内模型】第二版本基于orderflow的盘口策略(完整源码)

1.【日内模型】基于orderflow的盘口策略开发帖

量化视频专辑:

视频教程 | 手把手系列之"Aberration"策略的优化与升级

视频教程 | 手把手系列之"震荡过滤"突破策略的优化与实现

量化研究专栏:

量化研究 | 来聊一下量化交易的人工干预、参数失效、筛选品种

量化研究 | 残差动量策略刻画与构建(二)

量化研究 | 残差动量策略刻画与构建(一)

量化研究 | 主连复权算法大揭秘[含公式算法]

量化研究 | 策略在指数与主连复权的差异化分析(三)

量化研究 | 策略在指数与主连复权的差异化分析(二)

量化研究 | 策略在指数与主连复权的差异化分析(一)

精品自动交易策略库(近期更新):
【SF22】| 来给你的交易策略加一个"变速箱",五挡起步那种

【SF21】| 利用PSY指标,我们来开发一个短线模型?

【SF20】| 来聊聊平仓离场的方法,如何构建高效,灵活,可靠的出场策略?

【SF19】| 基于VWAP(成交量加权平均价格)开发Alpha均线增强策略

【SF18】| MACD顶底背离+动态区间交易模型源码(技术贴)

【SF17】| 均线波动差构建交易策略

【SF16】| "凹凸"均线形态交易策略源码(技术帖)

【SF15】| 波峰波谷交易策略结合ER降噪过滤

【SF14】| Supertrend“超级趋势线”指标魔改升级(源码)
【SF13】| 实盘策略解密“小品种,小资金”在跑策略源码!

【SF12】| 全新波动率算法,自适应区间+波动率择时!

【SF11】| 成交量来确定阻力支撑点,基于Volume Profile构建交易策略

【SF10】| 如何构建一个胜率超过60%的短线螺纹策略(开发教程)

【SF09】| 资金流向交易策略源码,绩效突出,适应性兼容性强,5分钟交易模型;
【SF08】| 经典KD指标另类使用有奇效,股指商品双版本策略




祝点击在看的小伙伴,账户长虹


分享