Bootstrap

阻力支撑指标RSRS策略:光大证券研报复现

昨天我们已经计算好了RSRS指标策略,今天把光大证券的研报复现一下。

由于计算比较耗时,我们会把计算的中间结果的dataframe保存下来。

我们使用hdf5保留数据结果,这里有一个小tip,有点奇怪。

我使用put的时候,使用的key,在判断是否存在于store.keys()里,需要变成“/key”

store = pd.HDFStore('cache.h5')
key_to_store = 'cached_df'
if '/' + key_to_store in store.keys():
    df = store.get(key=key_to_store)

然后开始调整我们的策略。

轮动策略,我们是有策略模板的,并不需要从头开发。

class StrategyRolling(Strategy):

    def __init__(self, name, params={}):
        algo_list = [
            SelectBySignal(signal_buy=params['signal_buy'],signal_sell=params['signal_sell']),
            SelectTopK(K=params['K'], col=params['sort_by']),
            WeightEqually()
        ]
        super(StrategyRolling, self).__init__(name,algo_list=algo_list)

我们的交易信号就是RSRS>1时买入,RSRS<0.8时卖出。

df['to_buy'] = df['RSRS'] > 1
df['to_sell'] =df['RSRS'] < 0.8

SelectBySignal会根据上述信号把复合条件的标的列表选择出来,SelectTopK按sort_by进行排序,选前面K个,然后等权计算权重。

值得一提的是:SelectBySignal有可能空仓的情况。这里需要分两种情况讨论,若原来有持仓,现在空仓,那相当于是清仓。若原来也是空仓,则不需要有动作。

对于这个算子而言,只负责给出signal给出的证券列表——已持仓+信号指标买入-信号指标卖出,不做额外判断。SelectTopK遇空仓时,直接跳过。

图片

图片

年化23.5%,夏普比1.16,只用了一个指标。

但是更加气人的是,只需要用“20日动量”这一个指标,就可以完胜RSRS。

图片

年化达到30%,而且最大回撤更小,动量策略着实一直有效。

那如果把这些指标,揉在一起搁到机器学习模型里,会发生什么样的化合反应呢,这个我也很期待。

我们的策略依然很简单,只是计算了两列信号罢了。

df['to_buy_momentum'] = df['20日动量'] >= 0.08
df['to_sell_momentum'] = df['20日动量'] < 0.0

task_momentum = {

'name': '三大指数-20日动量轮动',
'strategy': 'rolling',
'params': {
'signal_buy': 'to_buy_momentum',
'signal_sell': 'to_sell_momentum',
'K': 1,
'sort_by': '20日动量'
}
}

策略还需要精细化的观察,调优与分析,所以一个良好体验的交互平台必不可少。

之前有一个待定的事宜,就是关于bokeh vs plotly选型的问题,结论是需要使用plotly。

由于wxpython里使用ie7的内核,使用代码可以修改为IE11。
恰好不兼容bokeh的html显示。修改为ie11之后,pyecharts/plotly都没有问题。plotly+dash同样可以实现交互式。 
而在量化系统中,这个主要用于多图表显示,交互相对少一些。

需要系统启动时修改注册表:

self.key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER,
                           r"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION",
                           0, _winreg.KEY_ALL_ACCESS)
try:
    # 设置注册表python.exe 值为 11000(IE11)
    _winreg.SetValueEx(self.key, 'python.exe', 0, _winreg.REG_DWORD, 0x00002af8)
except:
    # 设置出现错误
    print('error in set value!')
self.browser = wx.html2.WebView.New(self, style=0)

所以结论是,使用plotly + wxpython。

今天把动量轮动与基于RSRS指标的轮动都实现了,明天要把这些指标整合到机器学习模型里去。

;