我修改了一下代码,我不知道是因为历史代码的规则不同还是什么原因,总之原代码问题真的很多,原代码的get_signal的实际逻辑是:
1.如果沪深300和中证500有一个跌了,就卖掉,当日不执行别的操作。这里就有个问题,那如果另一个是涨的呢,这里没有调仓操作。
2.如果沪深300或者中证500有一个涨了且幅度大于另一个,且当前为空仓状态,则全部买入。这个明显和预期不一样。。
原代码:
```
if (hs300increase< =0 and hold300>0) or (zz500increase< =0 and hold500>0):
return 'sell_the_stocks'
elif hs300increase>zz500increase and hs300increase>0 and (hold300==0 and hold500==0):
return 'ETF300'
elif zz500increase>hs300increase and zz500increase>0 and (hold300==0 and hold500==0):
return 'ETF500'
```
二八轮动策略的思路个人理解如下:
大盘股(沪深300)和中盘股(中证500)哪个前20日动量大,就买入哪个,如果两个走势都弱,就买入债券类资产等待时机(或者空仓)。
我修改后的代码按照如下逻辑:
1.如果沪深300和中证500均为下跌,则全部卖出,空仓(和原文对应,原文本来说的是这种情况要买入国债)
2.当沪深300动量为正且大于中证500动量时:如果当前为空仓,则买入沪深300,如果已买入则不动,如果当前持仓为中证500,则卖出中证500,调仓为沪深300
3.当中证500动量为正且大于沪深300动量时:如果当前为空仓,则买入中证500,如果已买入则不动,如果当前持仓为沪深300,则卖出沪深300,调仓为中证500
```
# 若沪深300和中证500均下跌,则全部卖出
if (hs300increase < 0 and zz500increase < 0) and (hold300 > 0 or hold500 > 0):
return 'sell_the_stocks'
# 如果沪深300动量为正且大于中证500动量0.01,且当前未买入沪深300
elif hs300increase - zz500increase > 0.01 and hs300increase > 0 and hold300 == 0:
return 'ETF300'
# 如果中证500动量为正且大于沪深300动量0.01,且当前未买入中证500
elif zz500increase - hs300increase > 0.01 and zz500increase > 0 and hold500 == 0:
return 'ETF500'
else:
# 如果没有符合上述条件的情况,则保持当前状态
return 'Keep'
```
2023-12-25