基于之前的策略,增加了资金管理策略,夏普从1.5提高到了2.0。
测试区间仍然是2018-1-1到2021-1-1。
资金:100万
测试品种:苹果,沥青,玻璃,螺纹钢,动力煤,棕榈油
保证金最高使用量:48%
2018年收益率:50%
2019年收益率:0%
2020年收益率:86%
更正:
经yyun网友提醒,发现了一个问题,已经更正程序和回测数据。最新程序测试情况如下:
资金:200万
测试品种:苹果,沥青,玻璃,螺纹钢,动力煤,豆油
保证金最高使用量:48%(主力切换时老合约平仓)
保证金最高使用量:48% ++(主力切换时老合约继续持有至不得不平仓)
另外发现一个有趣的现象:
之前的程序中没有注意到,主力合约切换时,没有处理老合约,造成在合约切换月份5月10月,同一品种存在5月份和10月份2份合约。现在已经增加了代码,处理这个问题。
有趣的现象是:主力合约切换时,保留老合约至不得不平仓,收益率更好。这个是否有普适性需要进一步测试。由于2017年测试不了,只能后续继续观察了。
我猜测:贴近合约到期月份,大概率会延续之前的走势,所有盈利合约继续持有,能扩大盈利。
回测结果是基于老合约继续持有至不得不平仓。
处理老合约代码如下:
# for future in context.portfolio.short_positions.keys():
# if future not in future_list:
# order_target_value(future, 0, side='short')
# for future in context.portfolio.long_positions.keys():
# if future not in future_list:
# order_target_value(future, 0, side='long')
更新:
重新调试了一下参数,结果更好。
基于一个猜想:股市大跌或者大涨,期货都大概率有大行情。股市平盘震荡,期货难挣钱。调试了程序:HS300 方差值较小时,减少资金投入,并采用20日与5日均线来开平仓;HS300方差值较大时,加大资金投入,并采用30日与10日均线来开平仓。之前的方案回撤比较大,现在回测由25%下降到了16%。
更新程序如下,之前下过的朋友可以直接copy,调试。
没有下过的朋友可以下最新的程序。
另外:大家可以自己调试:HS300 方差值,资金使用量,采用的几日均线数据,来看不同的结果。
if hs_trend < 140:
value=(0.36/context.num)*context.ori_cash*(1+context.inc*int(context.day/200))
if MA15>MA20 and MA20 > MA20_1 and MA5>MA5_1 and cur_long==0:
# 开多单
order_target_value(current_month, value, side='long')
# 如果5日均线有涨转跌,清仓
if (MA15< MA20 or MA20 < MA20_1 or MA5< MA5_1) and cur_long > 0 :
order_target_value(current_month, 0, side='long')
# FG 如果20日均线下跌,5日均线下跌,开空单
if MA15< MA20 and MA20 < MA20_1 and MA5< MA5_1 and cur_short==0:
# if future_p < high_10:
# # 开多单
order_target_value(current_month, value, side='short')
# 如果5日均线有张转跌,清仓
if (MA15>MA20 or MA20 > MA20_1 or MA5>MA5_1) and cur_short >0 :
order_target_value(current_month, 0, side='short')
else:
value=(0.84/context.num)*context.ori_cash*(1+context.inc*int(context.day/200))
# FG 如果30日均线上涨,10日均线上涨,开多单
if MA15>MA20 and MA10 > MA10_1 and MA30>MA20_1 and cur_long==0:
# if future_p >low_10: # 开多单
order_target_value(current_month, value, side='long')
# 如果10日均线有涨转跌,清仓
if (MA15< MA20 or MA10 < MA10_1 or MA30< MA30_1) and cur_long > 0 :
order_target_value(current_month, 0, side='long')
# FG 如果30日均线下跌,10日均线下跌,开空单
if MA15< MA20 and MA10 < MA10_1 and MA30< MA30_1 and cur_short==0:
# if future_p < high_10: # # 开多单
order_target_value(current_month, value, side='short')
# 如果10日均线有张转跌,清仓
if (MA15>MA20 or MA10 > MA10_1 or MA30>MA30_1) and cur_short >0 :
order_target_value(current_month, 0, side='short')