摘要
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.cpp 的 class RandomWalkIndex 中实现。滚动保存
最高价、最低价和真实波幅,使实现无需重新读取全部历史就能逐一计算各个候选
期限。
