• 【每周研报复现】基于阻力支撑相对强度(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两个序列计算的方法,如果谁有方法可以告知一下。

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

    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指标最近几年似乎不太行,而且官方后续的研报也证实了这一点。但研报里的思路还是不错的,值得我们学习。

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

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

  • 相关阅读:
    输入支付密码加密流程,技术层面
    数据库学习之B-树
    Harbor 镜像复制 每 30 分钟发生一次超时
    【Leetcode】70. 爬楼梯
    【网络协议】
    逍遥自在学C语言 | 关系运算符
    汽车电子专业知识篇(六十一)-特斯拉Model 3的BMS系统
    ThreadLocal
    数据结构之循环链表
    ubuntu18.04平台:新版OpenCV5集成算法使用mjpeg-streamer(流媒体c++库)实现视频流及网页浏览器访问
  • 原文地址:https://blog.csdn.net/weixin_38175458/article/details/127886287