OverlapRMA运行移动平均线技术指标详解一、RMA的定义RMARunning Moving Average运行移动平均线也被称为Wilder’s Moving Average威尔德移动平均线是技术分析大师J. Welles Wilder在1978年出版的《技术交易系统新概念》New Concepts in Technical Trading Systems一书中引入的一种特殊移动平均线。核心定位RMA的本质其实是一种指数移动平均线EMA但它采用了一个特定的平滑系数公式。你可以把它理解为“威尔德版本的EMA”而它最著名的应用场景就是作为RSI相对强弱指数指标的核心计算组件。RMA与EMA的区别对比维度RMA运行移动平均EMA指数移动平均平滑系数Alpha固定为1 / period通常为2 / (period 1)与EMA的关系RMA是EMA使用特定Alpha时的一种特例更通用的指数平滑形式典型应用威尔德系列指标RSI、ADX等的核心计算各类趋势跟踪和动量指标对近期价格的权重权重相对较小当period较大时通常给予近期价格更高权重这一公式也说明了为什么RMA或Wilder平滑常被评价为“速度较慢”因为它相当于一个有较长有效周期的EMA。二、RMA的计算方法1. 核心公式RMA的计算基于一个递归公式RMAtPricet×αRMAt−1×(1−α) \mathrm{RMA}_t \mathrm{Price}_t \times \alpha \mathrm{RMA}_{t-1} \times (1 - \alpha)RMAtPricet×αRMAt−1×(1−α)其中平滑系数α\alphaα为周期的倒数α1length \alpha \frac{1}{\mathrm{length}}αlength12. 计算步骤第一步初始化第一个RMA值与EMA类似第一个RMA值通常使用简单移动平均SMA作为初始值。RMAinitialSMA(Price,length) \mathrm{RMA}_{\text{initial}} \mathrm{SMA}(\mathrm{Price}, \mathrm{length})RMAinitialSMA(Price,length)第二步递归计算后续值从第length 1个数据点开始使用递推公式计算RMAt1length×Pricet(1−1length)×RMAt−1 \mathrm{RMA}_t \frac{1}{\mathrm{length}} \times \mathrm{Price}_t \left(1 - \frac{1}{\mathrm{length}}\right) \times \mathrm{RMA}_{t-1}RMAtlength1×Pricet(1−length1)×RMAt−13. 计算示例以length 3为例时间价格计算过程RMA值t1100初始SMA100.00t2105105 × 0.333 100 × 0.667101.67t3102102 × 0.333 101.67 × 0.667101.78t4108108 × 0.333 101.78 × 0.667103.854. pandas_ta中的实现在pandas_ta库中RMA函数直接调用了pandas的ewm方法并传入alpha 1 / length作为平滑参数# pandas_ta中RMA的简化实现defrma(close,length10):alpha1.0/lengthreturnclose.ewm(alphaalpha,min_periodslength).mean()5. 参数说明参数类型默认值说明closepd.Series必需收盘价序列lengthint10RMA的计算周期控制平滑程度offsetint0结果偏移周期数三、RMA的使用方法1. 作为RSI的核心计算组件RMA最广为人知的应用是作为RSI指标的计算基础。在RSI计算中上涨幅度的平滑使用RMA周期14下跌幅度的平滑同样使用RMA周期142. 作为趋势跟踪工具与EMA类似RMA可以作为趋势跟踪均线使用RMA状态趋势含义操作倾向RMA向上运行上升趋势买方力量主导以做多为主RMA向下运行下降趋势卖方力量主导以做空为主RMA走平趋势可能减弱或进入盘整观望3. 价格穿越信号价格与RMA的穿越是最简单的入场/出场信号信号类型触发条件操作建议买入信号价格从下方上穿RMA考虑建立多头仓位卖出信号价格从上方下穿RMA考虑平仓或建立空头4. 与其他指标配合RMA本身并不作为独立的交易信号源使用更多是作为其他指标如RSI、ADX的计算基础。pandas_ta库的许多函数都支持通过mamode参数指定使用RMA作为平滑方式。四、使用pandas_ta计算RMA1. 函数完整参数pandas_ta.overlap.rma(close,lengthNone,offsetNone,**kwargs)返回值pd.Series——RMA值序列。2. 示例代码importpandasaspdimportpandas_taastaimportnumpyasnpimportmatplotlib.pyplotasplt# 第一步准备数据 np.random.seed(42)datespd.date_range(start2023-01-01,end2024-12-31,freqD)nlen(dates)trendnp.linspace(0,45,n)cyclenp.sin(np.linspace(0,6*np.pi,n))*15noisenp.random.randn(n)*3price_series100trendcyclenoise# 添加趋势变化区间price_seriesprice_series.astype(float)foriinrange(300,450):price_series[i]price_series[300](i-300)*0.2foriinrange(450,600):price_series[i]price_series[450]-(i-450)*0.15dfpd.DataFrame(indexdates[:n])df[close]price_series[:n]print(*60)print(数据预览)print(df.head())print(\n*60\n)# 第二步计算RMA # 默认参数 length10df[RMA]ta.rma(df[close])print(RMA计算结果最近10行)print(df[[close,RMA]].tail(10))print(\n*60\n)# 第三步不同周期RMA对比 df[RMA_5]ta.rma(df[close],length5)df[RMA_10]ta.rma(df[close],length10)df[RMA_20]ta.rma(df[close],length20)print(不同周期RMA对比最近5行)print(df[[close,RMA_5,RMA_10,RMA_20]].tail())print(\n*60\n)# 第四步RMA与EMA对比 # 计算等效周期的EMA进行对比# RMA(period) ≈ EMA(2*period - 1)df[EMA_19]ta.ema(df[close],length19)# 对应RMA(10)print(RMA(10) vs EMA(19) 对比最近10行)print(df[[close,RMA_10,EMA_19]].tail(10))print(\n*60\n)# 第五步价格穿越信号 df[price_above_rma]df[close]df[RMA_10]df[cross_above](df[price_above_rma]True)(df[price_above_rma].shift(1)False)df[cross_below](df[price_above_rma]False)(df[price_above_rma].shift(1)True)df[signal]df.loc[df[cross_above],signal]买入价格上穿RMAdf.loc[df[cross_below],signal]卖出价格下穿RMAprint(价格穿越信号统计)print(f买入信号数量{df[cross_above].sum()})print(f卖出信号数量{df[cross_below].sum()})print(\n*60\n)# 第六步策略回测 # 策略价格 RMA 时持仓多头df[position](df[close]df[RMA_10]).astype(int)df[returns]df[close].pct_change()df[strategy_returns]df[position].shift(1)*df[returns]total_return_buyhold(1df[returns]).prod()-1total_return_strategy(1df[strategy_returns]).prod()-1print(*60)print(策略绩效统计RMA穿越策略回测)print(f买入持有策略总收益率{total_return_buyhold:.2%})print(fRMA穿越策略总收益率{total_return_strategy:.2%})print(\n注意此为简化回测仅供参考)print(*60\n)# 第七步可视化 plt.figure(figsize(14,10))plt.subplot(2,1,1)plt.plot(df.index[-200:],df[close][-200:],labelClose Price,linewidth1.5,colorblack)plt.plot(df.index[-200:],df[RMA_10][-200:],labelRMA (10),linewidth1.5,colorblue)plt.plot(df.index[-200:],df[EMA_19][-200:],labelEMA (19) - Equivalent,linewidth1,colororange,linestyle--)plt.title(RMA(10) vs EMA(19) 对比 (Last 200 days),fontsize14)plt.ylabel(Price)plt.legend()plt.grid(True,alpha0.3)plt.subplot(2,1,2)plt.plot(df.index[-200:],df[close][-200:],labelClose Price,linewidth1,alpha0.5,colorblack)plt.plot(df.index[-200:],df[RMA_5][-200:],labelRMA (5) - 短线,linewidth1,alpha0.7)plt.plot(df.index[-200:],df[RMA_10][-200:],labelRMA (10) - 标准,linewidth1.5,colorblue)plt.plot(df.index[-200:],df[RMA_20][-200:],labelRMA (20) - 长线,linewidth1.5,colorgreen)plt.title(RMA不同周期对比与穿越信号,fontsize14)plt.xlabel(Date)plt.ylabel(Price)plt.legend(locupper left)plt.grid(True,alpha0.3)plt.tight_layout()plt.show()五、总结RMA运行移动平均线是技术分析大师威尔德引入的一种特殊移动平均线其核心价值与定位如下维度特点核心定位威尔德版本EMA平滑系数α 1/period与EMA关系RMA(period) ≈ EMA(2×period - 1)主要用途RSI、ADX等威尔德系列指标的计算基础默认参数length10最佳应用场景作为RSI、ADX等指标的平滑工具也可作为趋势跟踪均线主要局限本质是EMA的一种特例不具备独立的理论突破