随机游走指数(RandomWalkIndex)

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

摘要

RandomWalkIndex 是随机游走指数(RWI)的流式实现。它逐一考察从 1 到 window 的所有滞后期,把方向性价格位移与“平均真实波幅乘以该滞后期平方根” 比较,并分别返回上行和下行候选值中的最大者。

更新 API

result = rtta.RandomWalkIndex(window=14, fillna=True).update(close, high, low)
# result.high, result.low

工作原理

在简单扩散模型下,价格的典型移动距离大致按 \(\sigma\sqrt{k}\) 增长。RWI 用 平均真实波幅作为波动率尺度,判断价格在任一 \(k\le n\) 的期限内是否走得异常 远。对每一个期限取最大值是 RWI 定义的关键;只使用整个窗口的一个极值和一条 固定 ATR 会得到不同的统计量。

递推公式

window 记为 \(n\),真实波幅定义为:

\[TR_t=\max(H_t-L_t,|H_t-C_{t-1}|,|L_t-C_{t-1}|).\]

对每个 \(k=1,\ldots,n\),使用截止到当前 K 线前一根为止的 \(k\) 个真实波幅:

\[A_{t,k}=\frac1k\sum_{j=1}^{k}TR_{t-j}.\]

于是:

\[RWIHigh_t=\max_{1\le k\le n} \frac{H_t-L_{t-k}}{A_{t,k}\sqrt{k}},\]
\[RWILow_t=\max_{1\le k\le n} \frac{H_{t-k}-L_t}{A_{t,k}\sqrt{k}}.\]

除法采用 RTTA 的安全除法。结果字段 high 对应 RWIHigh,字段 low 对应 RWILow

完整计算需要 window 根此前 K 线,再加当前 K 线。当 fillna=False 时, 前 window 次更新返回 NaN,第 window + 1 次更新得到第一个完整结果。 当 fillna=True 时,启动阶段只在当时已有的滞后期中取最大值;第一个观测的 两个方向均返回 0。

实现说明

递推过程在 src/rtta/indicator.cppclass RandomWalkIndex 中实现。滚动保存 最高价、最低价和真实波幅,使实现无需重新读取全部历史就能逐一计算各个候选 期限。

参考资料