
公众号致力于分享量化策略,培训视频,Python,算法研究等相关内容。
『正文』
ˇ
大家好,我是乌克兰剑圣。本季度最后一个策略,我们来写一个跨周期模型。
除了可以自动交易,也显示出了指标线为做手工交易时提供参考。
策略源码
策略由MACD和HalfTrend俩个交易原理构成。HalfTrend是作为小周期的交易逻辑,MACD做为跨周期交易逻辑。本身这些逻辑很好理解,没什么难度。就是写起来麻烦一点,出场这一块我们借鉴【SF24】| 海龟交易策略的“宽窄”改进版 里的出场模块。发现这个模块还是挺好用的,有兴趣的朋友可以看看。
HalfTrend交易逻辑
HalfTrend这个写法其实就是类似SuperTrend("超级趋势线"),我们再老策略【SF14】| Supertrend“超级趋势线”指标魔改升级(源码) 这里面已经写过了。
我观察了一下它们俩个还是略有不同,我们来看原版的代码。
var int trend = 0var int nextTrend = 0var float maxLowPrice = nz(low[1], low)var float minHighPrice = nz(high[1], high)
var float up = 0.0var float down = 0.0float atrHigh = 0.0float atrLow = 0.0float arrowUp = nafloat arrowDown = na
atr2 = atr(100) / 2dev = channelDeviation * atr2
highPrice = high[abs(highestbars(amplitude))]lowPrice = low[abs(lowestbars(amplitude))]highma = sma(high, amplitude)lowma = sma(low, amplitude)
if nextTrend == 1 maxLowPrice := max(lowPrice, maxLowPrice)
if highma < maxLowPrice and close < nz(low[1], low) trend := 1 nextTrend := 0 minHighPrice := highPriceelse minHighPrice := min(highPrice, minHighPrice)
if lowma > minHighPrice and close > nz(high[1], high) trend := 0 nextTrend := 1 maxLowPrice := lowPrice
if trend == 0 if not na(trend[1]) and trend[1] != 0 up := na(down[1]) ? down : down[1] arrowUp := up - atr2 else up := na(up[1]) ? maxLowPrice : max(maxLowPrice, up[1]) atrHigh := up + dev atrLow := up - develse if not na(trend[1]) and trend[1] != 1 down := na(up[1]) ? up : up[1] arrowDown := down + atr2 else down := na(down[1]) ? minHighPrice : min(minHighPrice, down[1]) atrHigh := down + dev atrLow := down - dev
ht = trend == 0 ? up : down
区别就是HalfTrend这里面计算了回溯高低点和SMA均线

效果如下图

转编译到TB和VNPY效果如下图


一眼看过去,作为指标其实还是挺好看。但是这些指标如果写成具体的交易信号绩效可能并不太理想,交易次数比较频繁的,测试下来损耗太高。这就是指标改造策略会产生一个主观落差。因此要改造这个策略,从俩个角度出发。
过滤
出场
MACD跨周期过滤
跨周期函数
Params Numeric nMinSet(3); NumericSeries Price(10); Numeric Length(10);Vars NumericSeries MinsBarIndex; BoolSeries FirstMin(True);
Numeric sFcactor; NumericSeries XAvgValue;Begin If(CurrentBar == 0) { FirstMin = True; }Else { FirstMin = FirstMin[1]; If(FirstMin && IntPart(Minute/nMinSet) != IntPart(Minute[CurrentBar]/nMinSet)) { FirstMin = False; } }
If(IntPart(Minute%nMinSet)==0) { MinsBarIndex = 1; }Else { MinsBarIndex = MinsBarIndex[1] + 1; }
sFcactor = 2 / ( Length + 1 ); if (FirstMin) { XAvgValue = Price; }else { XAvgValue = XAvgValue[MinsBarIndex] + sFcactor * ( Price - XAvgValue[MinsBarIndex] ) ; } Return XAvgValue;End
这个是TB的用户函数,主要是计算EMA跨周期均线,TB论坛很早的写法。
跨周期写好之后,效果如下:

这一段趋势走的并不流畅,一步俩回头。如果不跨周期过滤的话,其实损耗下来也赚不到什么钱的。HalfTrend+MACD+跨周期均线这三个原理结合以后,我很担心过滤过度造成信号较少,但是结果来看还是不错的,主要趋势抓住了。
“宽窄”移动出场
我们知道,海龟的初始开仓分为短周期开仓和长周期开仓,这里我们默认只用短周期开仓,关于长周期的那个区间我们当作调节出场参数的滤波器来使用吧。
思路:长周期和短周期区间本身就是波动幅度变化的动态指标,持有仓位时如果价格在短区间内波动,使用默认出场参数。如果突破了长周期,说明波动率开始放大了,这个时候我们开始调节收敛参数,保住利润。因为开仓条件简单,在趋势中即使止盈出场,也有很多机会再次加入趋势。有些模型在趋势中的交易次数太少,一旦踏空可能2,3个月没有信号。趋势拿的稳固然没错,但是交易信号太少,可操作性不大,波段循环操作更为合理一点。
Dcond_outTrs=CrossOver(C[1],fsDonchianHi[1]); Commentary("fsDonchianHi="+Text(fsDonchianHi)); If(Dcond_outTrs and SendOrderThisBar==True) { out_range=TRS*XX; SendOrderThisBar=False; }

黄色部分是在短周期区间内的状态,红色部分是突破了长周期区间后的加速。
总结
策略思路和算法中规中矩,将俩个原理结合之后还是有一些意外惊喜,这个策略迭代容易,且参数较少。代码普适性较强,适用于商品和股指。
同时,也可以作为指标参考辅助手工交易。提供了TB旗舰版,TBQ,VNPY三个版本的源码。感兴趣的小伙伴拿到源码后,可以在群里或者微信我交流,想想如何继续优化改进。
源码与工作区压缩包

品种绩效2018年至今(实盘成本):
动力煤

铁矿

焦炭

PP

螺纹

纯碱

尿素

EG

EB

白银

苹果

股指
IF

IC

IH

本策略仅作学习交流使用,实盘交易盈亏投资者个人负责。

End
----------------往期精彩内容----------------
算法策略专辑:
6.【算法策略】基于残差动量的横截面期货交易策略
5.【算法策略】商品统计套利之趋势套利策略
4.【算法策略】傅里叶滤波结合跨周期波段模型
量化视频专辑:
量化研究专栏:
量化研究 | 来聊一下量化交易的人工干预、参数失效、筛选品种

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