这个我之前也复现过!用python写的
我们目前的框架,把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指标最近几年似乎不太行,而且官方后续的研报也证实了这一点。但研报里的思路还是不错的,值得我们学习。
完整代码、数据请前往星球-量化专栏下载。
每周复现一篇研报。另外如果问题,请在星球,或者星球专属群中提问。
这个我之前也复现过!用python写的