原创文章第106篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。
今天要复现的研报是:”光大证券_金融工程深度:基于阻力支撑相对强度(RSRS)的市场择时——技术择时系列报告之一“。
研报核心就是提出了一个指标,并以此构建策略。这个指标是RSRS(阻力支撑相对强度)。这个指标,我们基于backtrader实现过,可以参见之前的文章:动量轮动与光大RSRS指标在backtrader的实现;
阻力支撑指标RSRS策略:光大证券研报复现
RSRS指标,相对阻力支撑指标的实现,qlib扩展自己的特征表达式
我们目前的框架,把qlib的因子表达式的代码抽离出来,使用自己的hdf5存储,没有使用qlib自带的数据格式。
因此需要再来做一点介绍。
class RSRS(PairOperator): def __init__(self, feature_left, feature_right, N, M): self.N = N self.M = M super(RSRS, self).__init__(feature_left, feature_right) def _load_internal(self, instrument): series_left = self.feature_left.load(instrument) series_right = self.feature_right.load(instrument) slope = [] R2 = [] # 计算斜率值 n = self.N for i in range(len(series_left)): if i < (self.N - 1): slope.append(pd.NA) R2.append(pd.NA) else: x = series_right[i - n + 1:i + 1] # iloc左闭右开 x = sm.add_constant(x) y = series_left.iloc[i - n + 1:i + 1] regr = sm.OLS(y, x) res = regr.fit() beta = round(res.params[1], 2) # 斜率指标 slope.append(beta) R2.append(res.rsquared) betas = pd.Series(slope, index=series_left.index) betas.name = 'betas' r2 = pd.Series(R2, index=series_left.index) r2.name = 'r2' return betas, r2
用循环的方式使用numpy是无奈之举,没有找到rolling两个序列计算的方法,如果谁有方法可以告知一下。
指标计算好,策略很快就写好的。这就是我们”积木式“策略开发的好处!
e = BacktraderEngine(init_cash=100000, start=datetime(2005, 1, 1), end=datetime(2017, 4, 30)) # 1.添加数据集,即资产候选集 symbols = ['000300.SH'] for s in symbols: e.add_data(s) # 2.特征工程 from engine.datafeed.dataloader import Dataloader names = [] fields = [] fields += ["RSRS($high,$low,18,600)"] names += ['RSRS'] fields += ["Ref($close,-1)/$close - 1"] names += ['label'] names += ['buy', 'sell'] fields += ['$RSRS_betas>1', '$RSRS_betas<0.8'] D = Dataloader() data = D.load_one_df(symbols, names, fields) print(data) # 3. "积木式策略" from engine.strategy.strategy_base import StratgeyAlgoBase from engine.strategy.algos import SelectBySignal, WeightEqually e.cerebro.addstrategy(StratgeyAlgoBase, algo_list=[ SelectBySignal(features=data), WeightEqually() ]) e.run() e.analysis()
年化19.1%,最大回撤50.6%,与研报(未计算交易成本)的结果类似。
小结:
今天主要是把RSRS指标在我们自己的AI量化平台上再次开发了一次。几点优化:
1、现在支持后一个因子,使用前一列计算结果了。比如前边计算了mom_20,后边可以使用$mom_20直接引用——这个在qlib框架里是不行的。
2、支持返回多个series,比如RSRS_betas, RSRS_r2,或者像布林带这种,一次可以返回上下两轨,不需要写两次。这个qlib的因子表达式也是不支持的。
复现的结果与研报类似,有兴趣的同学可以继续做标准分及修正标准分。
另外说一句,RSRS指标最近几年似乎不太行,而且官方后续的研报也证实了这一点。但研报里的思路还是不错的,值得我们学习。
完整代码、数据请前往星球-量化专栏下载。
每周复现一篇研报。另外如果问题,请在星球,或者星球专属群中提问。