基本思路
空仓并且atr>atrma:
if rsiValue>rsiBuy:
开多单
elfi rsiValue<rsiSell:
开空单
有多头持仓:
if self.rsiValue < self.rsiSell:
平多单,开空单
有空头持仓:
if self.rsiValue > self.rsiBuy:
平空单开多单
回测参数
atrLength = 22 # 计算ATR指标的窗口数
atrMaLength = 10 # 计算ATR均线的窗口数
rsiLength = 5 # 计算RSI的窗口数
rsiEntry = 35 # RSI的开仓信号
self.rsiBuy = 50 + self.rsiEntry
self.rsiSell = 50 - self.rsiEntry
回测结果
参数优化
回测图中看到关键参数:
对于参数:
atrLength = 22 # 计算ATR指标的窗口数
atrMaLength = 10 # 计算ATR均线的窗口数
二者只控制第一笔开仓交易时间/方向(类似择时,后续所有交易都非多即空).所以这2个参数可以暂时不理会。
较为重要的2个参数
rsiLength = 5 # 计算RSI的窗口数
rsiEntry = 35 # RSI的开仓信号
由于rsiLength控制rsi的计算周期,rsiEntry控制了买卖阈值,由于阈值对称的所以只使用一个变量就足够了, 参数优化
setting.addParameter('rsiLength', 5,55,10)
setting.addParameter('rsiEntry', 15,35,5)
结果:
2019-04-16 17:04:39.688957 参数:{'rsiLength': 15, 'rsiEntry': 35},目标:1009033.0454
2019-04-16 17:04:39.688968 参数:{'rsiLength': 25, 'rsiEntry': 30},目标:1009033.0454
2019-04-16 17:04:39.688978 参数:{'rsiLength': 25, 'rsiEntry': 35},目标:1009033.0454
2019-04-16 17:04:39.688987 参数:{'rsiLength': 35, 'rsiEntry': 30},目标:1009033.0454
2019-04-16 17:04:39.688995 参数:{'rsiLength': 45, 'rsiEntry': 25},目标:1009033.0454
2019-04-16 17:04:39.689004 参数:{'rsiLength': 55, 'rsiEntry': 25},目标:1009033.0454
2019-04-16 17:04:39.689013 参数:{'rsiLength': 15, 'rsiEntry': 25},目标:1008501.46148
2019-04-16 17:04:39.689024 参数:{'rsiLength': 45, 'rsiEntry': 30},目标:1007747.00682
2019-04-16 17:04:39.689033 参数:{'rsiLength': 55, 'rsiEntry': 30},目标:1007747.00682
2019-04-16 17:04:39.689042 参数:{'rsiLength': 15, 'rsiEntry': 30},目标:1007084.02996
2019-04-16 17:04:39.689051 参数:{'rsiLength': 25, 'rsiEntry': 20},目标:1006781.83798
2019-04-16 17:04:39.689059 参数:{'rsiLength': 45, 'rsiEntry': 20},目标:1006625.14456
2019-04-16 17:04:39.689067 参数:{'rsiLength': 55, 'rsiEntry': 20},目标:1006625.14456
2019-04-16 17:04:39.689076 参数:{'rsiLength': 35, 'rsiEntry': 25},目标:1006493.14852
2019-04-16 17:04:39.689086 参数:{'rsiLength': 5, 'rsiEntry': 35},目标:1006110.091
2019-04-16 17:04:39.689096 参数:{'rsiLength': 35, 'rsiEntry': 15},目标:1005903.72738
2019-04-16 17:04:39.689105 参数:{'rsiLength': 45, 'rsiEntry': 15},目标:1005598.38058
2019-04-16 17:04:39.689114 参数:{'rsiLength': 25, 'rsiEntry': 25},目标:1005228.646
2019-04-16 17:04:39.689123 参数:{'rsiLength': 35, 'rsiEntry': 20},目标:1004246.28134
2019-04-16 17:04:39.689131 参数:{'rsiLength': 55, 'rsiEntry': 15},目标:1003646.62962
2019-04-16 17:04:39.689140 参数:{'rsiLength': 35, 'rsiEntry': 35},目标:1003168.86948
2019-04-16 17:04:39.689148 参数:{'rsiLength': 45, 'rsiEntry': 35},目标:1003168.86948
2019-04-16 17:04:39.689157 参数:{'rsiLength': 55, 'rsiEntry': 35},目标:1003168.86948
2019-04-16 17:04:39.689166 参数:{'rsiLength': 15, 'rsiEntry': 20},目标:1001145.649
2019-04-16 17:04:39.689174 参数:{'rsiLength': 25, 'rsiEntry': 15},目标:1000352.44112
2019-04-16 17:04:39.689183 参数:{'rsiLength': 15, 'rsiEntry': 15},目标:1000313.52388
2019-04-16 17:04:39.689192 参数:{'rsiLength': 5, 'rsiEntry': 30},目标:999301.5286
2019-04-16 17:04:39.689200 参数:{'rsiLength': 5, 'rsiEntry': 25},目标:994286.31328
2019-04-16 17:04:39.689209 参数:{'rsiLength': 5, 'rsiEntry': 20},目标:990900.77608
2019-04-16 17:04:39.689218 参数:{'rsiLength': 5, 'rsiEntry': 15},目标:989164.8178
最终选择参数: 'rsiLength': 25,'rsiEntry': 30,对应收益1009033.0454
参数稳定性测试
测试各个月份最优结果的下月表现
代码段 小部件
结论:参数组合'rsiLength': 25,'rsiEntry': 30,稳定性尚可02-03月份表现不佳,但是也是正收益
(实际还需要参考历史最大回撤,近20日最大回撤等,由于中间数据没保存下来,就不再重新跑了.)
回测图:
可见这个策略其实是有问题的,仅仅开仓一次,偶然因素很大,这也是回测时为何topn的收益等完全一样的原因.