RSRS这个缩写最近在量化圈被反复提起它全称是Rescaled Range Slope中文常叫重标极差斜率。前几年海通那篇技术分析研报把它带火之后做A股择时的人基本都拿它当过基准策略逻辑看着不复杂但上市公司的回测效果确实能打尤其是跟纯均线系统比反应速度快了不少。这篇博文我想把RSRS从指标原理到回测落地讲透。核心就三件事RSRS是怎么算出来的、为什么它能比传统均线更早识别趋势、以及自己从零搭建一套RSRS回测框架时容易踩的坑。适合想认真做A股量化择时、但不想直接用现成平台黑盒跑策略的人看。1. RSRS策略到底在解决什么问题1.1 传统均线择时的痛点做技术择时的人最早接触的肯定都是双均线或者MACD这类趋势跟踪指标。逻辑很简单价格上穿均线做多下穿均线做空或空仓。问题在于均线本质上是价格的滞后反映它需要价格已经走出一段距离之后才给出方向信号等信号出现行情往往已经走了一大截。震荡市里这个问题更明显。价格在均线上下反复穿越系统会让你来回开仓止损手续费倒贴不说心理上也很难坚持执行。我记得自己最早用20日均线回测沪深300的时候年化收益看起来还行但看一下连续回撤曲线2015年下半年和2016年初那两段几乎是单边挨打。所以市场上一直有人想找一个更早的方向判断工具。RSRS的出发点跟均线完全不同它不看价格本身涨了多少而是看价格序列的波动结构有没有出现“趋势性”特征。1.2 RSRS的计算逻辑从波动结构里找状态RSRS来自分形市场理论里的R/S分析方法。不扯太抽象核心逻辑是这样的取一段价格序列比如过去18个交易日的最高价和最低价分别计算这一段序列的重标极差R/S值。简单说R/S衡量的是这一段序列的累积偏离程度和波动规模之间的关系。然后对多个不同长度的子区间做同样的计算得到一组R/S值再把它们的对数值对区间长度的对数值做线性回归回归出来的斜率就是RSRS。这个斜率跟Hurst指数紧密相关它反映的是序列的长期记忆性斜率明显偏高说明序列存在持续的趋势惯性价格更倾向于沿着同一方向延续斜率接近0.5或者更低说明序列更接近随机游走这时候谈趋势容易被打脸。这就是RSRS比均线高明的地方。均线用价格穿越来确认趋势RSRS用价格波动的内部结构来判断趋势是否成立。前者是结果确认后者是状态感知。1.3 从指标到交易信号标准化RSRS原始RSRS斜率是一个绝对值不同时间段的平均水平会漂移直接拿它定阈值很容易在牛市末期频繁卖飞、在熊市初期频繁误买。所以实际应用的时候通常会对RSRS做标准化把当前RSRS值和过去一段时间的RSRS序列做比较算一个类似Z分数的指标。标准化RSRS (当前RSRS - 历史均值) / 历史标准差考虑到A股涨跌不对称很多人还会用右偏标准分也就是把大于均值的部分和小于均值的部分分开算标准差这样能减少牛市阶段因为RSRS持续偏高导致的过早离场。有了标准分之后信号规则就很清晰了标准分超过阈值就买入或加仓跌破某个阈值就卖出或减仓。阈值和仓位规则可以做成连续映射也可以做成离散档位这一块是策略参数设计的主要内容。2. 策略设计与参数图谱2.1 核心参数体系RSRS策略看着参数少实际要拍板的点不少。我把自己搭建时列的参数项整理了一下大概分成四组。第一组是指标参数最关键的是回看窗口N也就是用多少天的最高价和最低价去做R/S分析。第二个是标准分计算周期也就是用过去多长一段时间的RSRS序列来算均值和标准差。第二个参数很容易被忽略但它直接影响标准化结果的灵敏度周期取太短标准分波动会非常大动不动就触发交易周期取太长标准化响应又太慢。第二组是信号参数包括买入阈值、卖出阈值以及是否区分加减仓档位。这组参数直接决定策略的换手率。我实测下来阈值取太紧比如0.5就买、-0.5就卖策略会陷进反复打脸的状态阈值取太松则容易把已经到手的利润回吐掉。第三组是执行参数包括是否加趋势过滤、是否叠加其他择时因子做二次确认。最后是资金与风险参数包括单次仓位比例、最大回撤止损线、是否启用移动止盈。参数汇总成一张表回测前最好就列清楚不然调来调去很容易记忆混乱最后都不知道自己当前跑的是哪一套配置。2.2 为什么主窗口默认取18天市场里流传最广的RSRS参数是18日。这个数字不是拍脑袋定的它背后有两层考虑。第一层从统计角度做R/S分析需要至少一定数量的样本点才能稳定估计斜率。窗口太短比如5日、8日估算出来的斜率噪声很大信号基本是乱飙。窗口太长比如60日、120日RSRS对市场状态变化的响应速度会明显变慢等它反映出趋势状态行情已经走完一大半了。第二层从A股自身的节奏看18个交易日大概是三个半自然周覆盖了一个月左右的交易区间。这个时间跨度既能较好过滤掉日线级别的无序波动又不会像60日那样过度平滑。换句话说18日是在“信号稳定性”和“响应速度”之间选了一个平衡点。当然这不代表18日一定适合所有标的和所有行情阶段。指数ETF、股指期货、个股这三类标的的波动特性差异很大。我自己做参数敏感性测试时发现N在15到25之间策略整体表现都比较稳定胜率和盈亏比虽然有一点波动但没有出现“参数稍改就大翻脸”的情况。如果你回测的某个标的一换参数结果就天翻地覆那多半不是参数的问题而是策略逻辑本身就不适合这个标的。2.3 阈值与仓位规则从信号到执行的最后一公里标准化RSRS算出来之后还要把数值映射成仓位。最常见的做法是分档标准分大于1.5视为强势趋势状态满仓做多。标准分在1.0到1.5之间视为趋势初步形成半仓试探。标准分从高位回落跌破0.5视为趋势减弱减仓到半仓以下。标准分跌破-0.5视为趋势转为弱势清仓离场。需要注意标准分的分档规则要在回测前一次性定好不要在看过结果之后再去反向调阈值那样做出来的曲线没有意义只是把随机噪声拟合了一遍。仓位管理这块我还见过一种做法是用标准分本身做连续仓位映射比如把标准分按线性比例转换成0到100%的仓位。这种做法的好处是平滑坏处是执行起来比较复杂而且标准分极端值出现的时候容易在情绪上追高。我个人更推荐离散分档简单直接回测和实盘的一致性好很多。3. 回测框架搭建与代码实操3.1 回测框架怎么选做RSRS这类信号清晰的策略回测主流有三种选择用现成的量化平台比如聚宽、米筐用开源框架比如backtrader直接用Pandas自己写一套极简回测引擎。我的建议是如果你只是想快速验证策略有没有效用聚宽这类平台最快数据、撮合、绩效计算都现成。但如果你的目标是搞明白策略每一步的细节还是自己用Pandas搭一个因为RSRS计算里的很多坑平台封装得太好反而看不见出了问题只能干瞪眼。我后来复盘踩过的坑有至少三分之一是回测引擎层面的比如未来函数、停牌期持仓处理、信号与成交时点错配。自己搭引擎虽然累一点但每一行代码都知道它在干嘛排查问题的时候底气完全不同。3.2 数据准备与清洗回测RSRS需要的数据很简单一个标的最低价和最高价序列加上收盘价用来计算持仓收益。我通常用Tushare Pro或者AKShare拉数据指数用前复权数据个股用后复权会更利于长周期回测的准确性。这里有一个细节容易被忽略原始数据的日期索引要保持连续。如果数据里有缺失交易日RSRS计算时rolling窗口的长度就会错位导致斜率计算结果跟真实交易日的状态不一致。处理办法很简单拉完数据以后用交易日历做一次reindex缺失的日期要么填充前值要么直接标记为非交易日剔除。另外如果回测标的是个股建议把上市不足一年的股票剔除掉避免次新股无涨跌幅限制、流动性差这些因素干扰策略表现。ST股票最好也在数据预处理阶段过滤掉RSRS这种纯量价策略完全没有风险意识你不提前过滤它它就会在垃圾标的上教你做人。3.3 RSRS指标计算的Python实现直接上代码。RSRS计算的输入是一段最高价和最低价序列内部步骤包括对数间隔划分、每段区间R/S计算、回归斜率拟合。import numpy as np import pandas as pd def rsrs_slope(high, low, n18): 计算RSRS斜率序列 high: 最高价序列 low: 最低价序列 n: 回看窗口默认18 # 构造对数价差序列 log_hl np.log(high / low) # 初始化容器 slopes np.full(len(high), np.nan) for i in range(n, len(high)): window log_hl.iloc[i-n:i] # 对窗口内序列做子区间长度划分 # 实际R/S分析需要按不同长度计算R/S值这里简化为两区间分半法 half n // 2 rs_list [] for length in [half, n]: sub window.iloc[-length:].values mean_sub np.mean(sub) dev sub - mean_sub cum_dev np.cumsum(dev) # R 累积偏离的最大值-最小值 r np.max(cum_dev) - np.min(cum_dev) s np.std(sub, ddof1) if s 0: rs_list.append(np.nan) else: rs_list.append(r / s) rs_list [x for x in rs_list if not np.isnan(x)] # 对log(rs)和log(length)做线性回归斜率即为RSRS if len(rs_list) 2: x np.log([half, n][:len(rs_list)]) y np.log(rs_list) slope np.polyfit(x, y, 1)[0] slopes[i] slope return pd.Series(slopes, indexhigh.index)上面这个是简化版的R/S计算只取了两个子区间长度做拟合。想更严谨一点可以把窗口内的区间长度扩展到更多档位每个长度都算对应的R/S值然后回归的样本点就多了斜率估计的稳定性也会更好。实际回测中我用的是多区间版本每个窗口内取6到8个长度档位这样单点噪声对斜率的影响会小很多。从结果上看多区间版本和两区间版本的趋势方向基本一致但参数敏感性更低也就是换不同N值跑出来的收益曲线更接近。3.4 信号生成与回测主体指标算完接下去是标准分计算、交易信号生成、持仓收益模拟和绩效统计。我把关键代码贴出来照着这个框架就能跑通一套完整回测。# 计算标准分 def standard_score(rsrs, window300): # 均值和标准差滚动计算 mean_rsrs rsrs.rolling(window, min_periodswindow).mean() std_rsrs rsrs.rolling(window, min_periodswindow).std() # 右偏标准分大于均值部分单独算std above_mean rsrs.where(rsrs mean_rsrs) below_mean rsrs.where(rsrs mean_rsrs) # 简化处理使用总体std实盘可用右偏修正 zscore (rsrs - mean_rsrs) / std_rsrs return zscore # 生成仓位信号 def generate_signals(zscore): signals pd.Series(0, indexzscore.index) signals[zscore 1.5] 1 signals[(zscore 1.0) (zscore 1.5)] 0.5 signals[(zscore 0.5) (zscore 1.0)] 0 signals[zscore -0.5] 0 # 信号用shift(1)避免未来函数 signals signals.shift(1).fillna(0) return signals # 回测主体 def backtest(price, signals): # 简单模拟以信号转天开盘价成交 daily_ret price.pct_change().fillna(0) strategy_ret signals * daily_ret # 扣交易成本换仓时扣双边费用 turnover signals.diff().abs().fillna(0) strategy_ret strategy_ret - turnover * 0.0015 nav (1 strategy_ret).cumprod() return nav, strategy_ret代码里有两个地方特别提醒一下。第一个是标准分计算周期。上面取的300日对应一年半左右的交易日数量。这个数值我拍过很多版120日太灵敏信号频繁500日太钝牛市顶部经常来不及跑。300日算是个折中值可以参考但最好还是在自己回测的标的上做一次敏感性扫描。第二个是信号里加了shift(1)这是回测框架绝对不能省的步骤。没有这一步回测就会用当天收盘才知道的信号参与当天收益计算等于偷偷用了未来数据收益虚高得离谱。这个问题我在第四部分还会详细展开。4. 常见问题与排查实录4.1 未来函数回测收益虚高的头号凶手未来函数这个词做过回测的人应该都不陌生但新手最容易翻车的地方就在这里。RSRS指标是在每天收盘后计算的你最早只能在收盘后知道当天的RSRS值和标准分然后计划第二天执行交易。如果在回测代码里直接按当天收盘信号去匹配当天收益率那就等于在收盘的那一刻你就以收盘价成交了。真实世界里发出信号的时候价格已经定格你不可能用一个已经发生的价格来成交除非你是交易所内部人员。这个问题的典型症状是策略回测曲线极其平滑年化收益高得吓人回撤还特别小怎么看怎么完美。解决办法就是信号统一用shift(1)把信号推迟到下一个交易日生效。我见过一个更隐蔽的变种有人用当前RSRS值去回看“如果昨天就持有仓位今天的收益是多少”这实际上也是未来函数因为持有决策依赖的是今天才知道的信息。判断标准就一条在真实交易场景里这一个信息在当下这个时间点是不是已经知道了不知道就是未来函数。4.2 交易成本与涨跌停过滤RSRS策略的换手率不算极端但阈值设得紧的话一年也有几十次交易交易成本的影响不能忽略。A股实际交易成本包括三块佣金、过户费、印花税。佣金现在普遍能做到万2.5以内最低五元起过户费很便宜十万分之二的水平印花税只在卖出时收取。我回测时常用的参数是单边千分之1.5左右这个数字比实际成本略高一点属于保守估计。除了成本还有涨跌停问题。RSRS发出买入信号的那一天如果标的一字涨停你在盘中根本买不进去信号只能顺延等第二天可能已经涨停板打开了也可能直接高开好几个点你的实际成交价远高于回测里的假设价格。处理办法有两个。一是在信号生成后加一个过滤逻辑涨停日不发出做多信号二是在成交价格模拟上做额外惩罚比如说信号次日如果开盘涨幅超过7%默认这个仓位要延后或者以涨停价根本无法成交。指数ETF因为涨跌停幅度大一点这个问题没那么严重但做个股回测绝对不能忽略。4.3 参数钝化与状态切换的坑RSRS是个状态指标不是预测指标它最大的短板是“状态切换滞后”。市场从趋势市切换到震荡市的时候RSRS值并不会瞬间掉下来它会维持一段时间的偏高状态这段时间里策略可能连续发出做多信号然后连续止损。我自己的几轮测试里2017年上半年那段极窄幅震荡行情标准化RSRS反复在阈值附近徘徊策略一个月内产生了七八次无效交易亏损主要来自手续费和滑点。后来复盘发现不是因为RSRS指标失效而是因为策略缺少一个“市场状态过滤器”。可以参考的方案是叠加一个波动率过滤器当市场进入低波动状态时暂停趋势策略的权利。因为RSRS本质上捕捉的是趋势惯性低波动环境里趋势本来就不存在硬做只是送钱。用ATR真实波幅均值或者过去20日振幅的百分位来做这个过滤器能明显减少震荡市的无效交易次数。4.4 交易成本敏感性测试很多回测报告里只写一组交易成本假设这是不够严谨的。交易成本假设对RSRS这种中高换手策略的影响非常大。我习惯在参数敏感性测试之后再做一组成本敏感性测试分别用单边万5、千1、千1.5三档成本跑同一组参数观察策略收益曲线和最大回撤的变化幅度。如果成本从千0.5升到千1.5之后策略年化收益掉了超过三分之一说明策略盈利严重依赖低交易成本实盘环境里必然会失望。RSRS策略相对良心的地方在于它的信号频率总体可控不像某些日内反转策略一年要换手几百次成本一高直接亏穿。但阈值设得松紧对换手率的影响还是很大回测时看一眼换手率指标别只顾着年化收益。5. 我的实操体会与建议关于RSRS有一点想强调它更适合做仓位管理不适合做交易信号发生器。这话说出来可能跟很多人的预期相反因为大家接触到的RSRS都是“超过阈值就买入跌破阈值就卖出”看起来就是独立信号。但从我自己的实盘体验看把RSRS当独立信号用最大的问题是它在强势单边行情里很容易提前下车。标准化RSRS用的是滚动历史比较当市场连续走强RSRS值长期维持在极高位置均值也跟着水涨船高标准分反而会回落并触发卖出信号结果就是在主升浪中间被甩下车。我的应对方式是把它跟一个长周期趋势判断结合起来用。比如只用RSRS决定“加多少仓”趋势方向由中长期均线或者基本面景气度判断来决定。趋势看多时RSRS标准分高位就满仓低位减到半仓趋势看空时RSRS标准分高位也只给三成以内的试探仓。组合下来既保留了RSRS反应快的优点又减少了它在单边行情里过早退出的毛病。最后再分享一个小细节回测结果出来以后不要只看年化收益和最大回撤重点看收益回撤比。RSRS这类择时策略的极限收益通常跑不过长期满仓持有它的价值在于用更小的回撤换来接近的收益也就是收益回撤比更高。如果某个参数组合年化收益很高但最大回撤跟满仓差不多那这个择时策略等于白做了留着它还不如直接买指数躺着不动。用RSRS这半年多我最大的感受是再好的指标也只是把市场状态描述得比别人更准确一点点真正决定账户结果的是你在每个状态切换节点能不能管住手。策略回测做得越细你对指标脾气的了解就越深实盘的时候反而不会那么紧张。这一点比任何玄乎的参数优化都重要。
企业数字化 ERP 产品动态
相关推荐
MCP协议概述与Client源码解析:用TaoToken统一Key跑通第一个MCP Client /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 10:02:33
鼠标光晕设置全攻略:TaoToken 统一 Key 接入 Windows 截图工具与 Cline 配置骨架 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 11:13:34
中文论文段落写多长读者才不会跟丢?用信息单元数定段长,附可读性自查清单 读自己写的中文论文时,若读到段尾得回头重看一遍才接得上,问题多半不在读者的耐心,而在这一段同时要求对方记住的东西太多。把段落看作装载信息单元的容器,段落长度立刻从模糊的感觉变成可以核对的量。下面给出一套按信息单元数判… · 2026/9/26 11:13:28
文昌钢材采购常见误区盘点:四类核验维度与检测方法 文昌高盐雾环境下采购钢材,防腐性能、资质合规、配送能力、现货库存是四个关键核验维度。本文梳理三类典型踩坑案例,从资质核验方法、镀锌层检测技术、库存核实方式、加工配送评估四个角度展开技术分析,适合工程技术人员、质检人员参考。
一、… · 2026/9/26 11:13:28
各种锁的分类讲解 使用各种锁的过程中,由于种类太多,分不清各种锁到底是什么层面的、底层逻辑有很多很像但是为什么要有这么多种,下面按不同视角进行区分视角 1:【作用域视角】JVM 内锁(进程内锁):同一个 JVM&… · 2026/9/26 11:13:28
联合 查询 为什么要联合查询 ?有时为了查询一个完整的数据, 需要从多个表中同时获取数据数据库是怎么联合查询的 ?在使用联合查询时,数据库获取参与查询的表的笛卡尔积,并把结果汇聚到一个临时表中1. 笛卡尔积笛卡尔积࿱… · 2026/9/26 11:13:28
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46