【每周研报复现】基于阻力支撑相对强度(RSRS)的市场择时

原创文章第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两个序列计算的方法,如果谁有方法可以告知一下。

【每周研报复现】基于阻力支撑相对强度(RSRS)的市场择时_第1张图片

指标计算好,策略很快就写好的。这就是我们”积木式“策略开发的好处!

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()

【每周研报复现】基于阻力支撑相对强度(RSRS)的市场择时_第2张图片

年化19.1%,最大回撤50.6%,与研报(未计算交易成本)的结果类似。

【每周研报复现】基于阻力支撑相对强度(RSRS)的市场择时_第3张图片

小结:

今天主要是把RSRS指标在我们自己的AI量化平台上再次开发了一次。几点优化:

1、现在支持后一个因子,使用前一列计算结果了。比如前边计算了mom_20,后边可以使用$mom_20直接引用——这个在qlib框架里是不行的。

2、支持返回多个series,比如RSRS_betas, RSRS_r2,或者像布林带这种,一次可以返回上下两轨,不需要写两次。这个qlib的因子表达式也是不支持的。

复现的结果与研报类似,有兴趣的同学可以继续做标准分及修正标准分。

另外说一句,RSRS指标最近几年似乎不太行,而且官方后续的研报也证实了这一点。但研报里的思路还是不错的,值得我们学习。

完整代码、数据请前往星球-量化专栏下载。

每周复现一篇研报。另外如果问题,请在星球,或者星球专属群中提问。

你可能感兴趣的:(建立自己的算法交易事业,python,numpy,深度学习)