mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-17 01:58:06 +00:00
66 lines
3.0 KiB
Markdown
66 lines
3.0 KiB
Markdown
# RMA: Running Moving Average
|
|
|
|
> "Wilder didn't like standard EMA weighting. He wanted history to decay slower. So he invented RMA, which is just EMA with a different alpha, confusing traders for 40 years."
|
|
|
|
The Running Moving Average (RMA), also known as the Smoothed Moving Average (SMMA) or Wilder's Moving Average, is the backbone of J. Welles Wilder's most famous indicators: RSI, ATR, and ADX. It is functionally identical to an Exponential Moving Average (EMA), but with a smoothing factor ($\alpha$) of $1/N$ instead of $2/(N+1)$. This results in a longer "memory" and slower decay than a standard EMA of the same period.
|
|
|
|
## Historical Context
|
|
|
|
Introduced by J. Welles Wilder Jr. in his seminal 1978 book, *New Concepts in Technical Trading Systems*. Wilder developed his systems on a programmable calculator (the HP-67), where memory was scarce. The RMA allowed him to update averages without storing a history buffer, using a simple recursive formula. It remains the standard smoothing method for RSI and ATR.
|
|
|
|
## Architecture & Physics
|
|
|
|
RMA is an infinite impulse response (IIR) filter. In QuanTAlib, `Rma` is implemented as a zero-cost wrapper around the `Ema` class. It simply instantiates an `Ema` with a modified alpha.
|
|
|
|
### The Alpha Confusion
|
|
|
|
Traders often confuse RMA and EMA.
|
|
|
|
* **EMA**: $\alpha = \frac{2}{N+1}$
|
|
* **RMA**: $\alpha = \frac{1}{N}$
|
|
|
|
An RMA of period 14 is mathematically equivalent to an EMA of period 27 ($2N-1$).
|
|
|
|
## Mathematical Foundation
|
|
|
|
The recursive formula is identical to EMA, differing only in the weight.
|
|
|
|
### 1. Smoothing Factor
|
|
|
|
$$ \alpha = \frac{1}{N} $$
|
|
|
|
### 2. Recursive Update
|
|
|
|
$$ RMA_t = \alpha \cdot P_t + (1 - \alpha) \cdot RMA_{t-1} $$
|
|
|
|
Which simplifies to the classic Wilder formula:
|
|
|
|
$$ RMA_t = \frac{P_t + (N-1) \cdot RMA_{t-1}}{N} $$
|
|
|
|
## Performance Profile
|
|
|
|
RMA is extremely lightweight, requiring only a single multiplication and addition per update.
|
|
|
|
### Zero-Allocation Design
|
|
|
|
Since `Rma` wraps `Ema`, it inherits the zero-allocation properties. The calculation is a simple scalar update requiring no heap memory for the calculation step.
|
|
|
|
| Metric | Score | Notes |
|
|
| :--- | :--- | :--- |
|
|
| **Throughput** | Extreme | Single multiplication and addition |
|
|
| **Complexity** | O(1) | Constant time update |
|
|
| **Accuracy** | 4/10 | Significant lag, smooths out details |
|
|
| **Timeliness** | 3/10 | Slowest decay of all averages (Lag ≈ N) |
|
|
| **Overshoot** | 10/10 | Extremely stable, no overshoot |
|
|
| **Smoothness** | 10/10 | Maximum smoothing for volatile data |
|
|
|
|
## Validation
|
|
|
|
RMA is validated against TA-Lib's internal macros used for RSI and ATR calculations.
|
|
|
|
### Common Pitfalls
|
|
|
|
1. **Initialization**: Like EMA, RMA requires a "warmup" period to converge. Wilder often initialized with a Simple Moving Average (SMA) of the first $N$ bars. QuanTAlib follows this convention.
|
|
2. **Naming**: Often called SMMA (Smoothed Moving Average) in other libraries.
|
|
3. **Period Mismatch**: Using an EMA(14) where an RMA(14) is expected will result in a much faster-moving line (equivalent to RMA(7.5)).
|