RSI

增量式、因果技术分析文档

摘要

RSI 对单一标量价格流增量计算相对强弱指数。它保存前一个价格,以及持续更新的上涨与下跌幅度状态。

更新 API

value = rtta.RSI(window=14, fillna=True).update(value)

第一个样本用于初始化 prev。当 fillna=True 时,第一次返回 50.0;当 fillna=False 时,预热阶段返回 NaN

工作原理

RSI 比较近期上涨幅度与下跌幅度,并把两者的比率映射为有界振荡值。RTTA 的 C++ 实现在价格上涨时更新上涨状态,在价格下跌时更新下跌状态。预热阶段以当前样本数为平均分母;预热结束后,按 window 采用 Wilder 平滑。

递推公式

令 \(x_t\) 为当前值,\(x_{t-1}\) 为前一值,\(n\) 为 window

\[g_t = \max(x_t - x_{t-1}, 0), \qquad \ell_t = \max(x_{t-1} - x_t, 0)\]

预热阶段,RTTA 只更新实际发生变动的一侧:

\[G_t = \begin{cases} \frac{(t-1)G_{t-1}+g_t}{t}, & g_t > 0 \\ G_{t-1}, & g_t = 0 \end{cases}\]
\[L_t = \begin{cases} \frac{(t-1)L_{t-1}+\ell_t}{t}, & \ell_t > 0 \\ L_{t-1}, & \ell_t = 0 \end{cases}\]

预热结束后,相同的方向性更新改用 (n):

\[G_t = \begin{cases} \frac{(n-1)G_{t-1}+g_t}{n}, & g_t > 0 \\ G_{t-1}, & g_t = 0 \end{cases} \qquad L_t = \begin{cases} \frac{(n-1)L_{t-1}+\ell_t}{n}, & \ell_t > 0 \\ L_{t-1}, & \ell_t = 0 \end{cases}\]

输出为:

\[RS_t = \frac{G_t/n}{L_t/n}, \qquad RSI_t = 100 - \frac{100}{1 + RS_t}\]

如果下跌状态为零,越过最初的单样本路径后,RTTA 返回 100.0

实现说明

递推公式在 src/rtta/indicator.cppclass RSI 中实现。上述方向状态的更新方式与当前 C++ 代码完全一致。

参考资料