平时盯黄金行情,最常碰到的就是价格波动大得让人手心发汗。前几天看着K线一路拉升,RSI蹭蹭往上窜,我就在想,这波是动能还在,还是要回调了?这个时候,RSI就派上用场了,它帮我把直觉量化,把市场情绪用数字表现出来。

RSI 直观感受

RSI 是相对强弱指数,把一段时间内上涨和下跌的幅度比率算出来,再映射到 0~100 之间。说白了就是:数字高了,说明最近买得猛,短期可能要喘口气;数字低了,说明卖得狠,可能会反弹。

我用得最多的是 14 天周期,代码很简洁:

python
import pandas as pd

def calc_rsi(prices, period=14):
    delta = prices.diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    roll_up = up.rolling(period).mean()
    roll_down = down.rolling(period).mean()
    rsi = 100 - (100 / (1 + roll_up / roll_down))
    return rsi

df['RSI'] = calc_rsi(df['close'])

算出来的 RSI 就像心跳一样,涨跌节奏清晰可见,行情一目了然。

超买超卖并非绝对

很多人只看 70/30 的数值来买卖,其实容易踩坑。黄金波动性大,RSI 连续高位或低位很常见。有次 RSI 连续五天在 75 以上,价格还是往上走,这时候硬盯“超买”只会掉队。

我会结合价格趋势来看:上升趋势里 RSI 高更多说明动能还在,而不是马上回调;横盘或下跌里,RSI 高就可能真要回落。

df['trend'] = df['close'].rolling(20).mean()
df['signal'] = '中性'
df.loc[(df['RSI'] > 70) & (df['close'] > df['trend']), 'signal'] = '动能强'
df.loc[(df['RSI'] > 70) & (df['close'] < df['trend']), 'signal'] = '可能回调'
df.loc[(df['RSI'] < 30) & (df['close'] < df['trend']), 'signal'] = '可能反弹'

这样一来,RSI 就不孤立,和趋势一起看,信号更有参考价值。

背离和动态阈值

RSI 有两个小技巧特别管用:

背离:价格创新高,RSI 没跟上,说明上涨动能减弱;价格创新低,RSI 没创新低,说明卖压在减轻。背离信号比单纯的超买超卖更靠谱。

动态阈值:不要死盯 70/30。黄金波动大,RSI 常年在 60~80 或 20~40。用近期极值调整阈值,效果自然不少:

rsi_max = df['RSI'].rolling(50).max()
rsi_min = df['RSI'].rolling(50).min()
df['RSI_norm'] = (df['RSI'] - rsi_min) / (rsi_max - rsi_min) * 100

归一化之后,不同阶段都能判断 RSI 相对强弱,更贴合行情。

数据怎么来

上面的分析跑起来,第一步得把黄金的实时价格稳稳当当地接进来。我以前用免费源老遇到延迟和缺K线的问题,后来行情和策略层直接接了 Alltick 的数据接口,黄金、外汇、数字货币都能覆盖,数据质量和实时性跟免费源不在一个级别。有了可靠的数据基座,RSI计算、动态阈值这些技巧才能真正发挥作用。

一些感受

光看指标不够,但有了 RSI,至少能把市场短期情绪量化出来。黄金动荡,光盯价格和成交量容易被情绪带走。RSI 配合趋势、背离和动态阈值,让策略多了点理性依据。

最近在实盘里试了下,归一化 RSI 来判断超买超卖,比以前直接看 70/30 效果顺眼多了,入场点、止盈点都自然不少,也不容易跟着行情情绪跑。