技术分析入门:Stochastic 随机指标与 ATR 波动率

技术分析中,Stochastic(随机指标)用于判断超买超卖,ATR 用于量化波动幅度,两者经常配合使用。

Stochastic 随机指标

%K 线(快线)计算公式:

%K = (当前收盘价 - N 周期最低价) / (N 周期最高价 - N 周期最低价) × 100

%D 线(慢线)= %K 的移动平均线(通常 3 周期 SMA)

常见参数:Stoch(14, 3, 3)

超买超卖的正确理解

  • Stoch > 80:超买区——价格接近近期高点,不等于马上下跌
  • Stoch < 20:超卖区——价格接近近期低点,不等于马上反弹

强趋势中,Stoch 可以在超买区(> 80)持续数周。直接在超买区做空是新手最常见的错误,强上涨趋势中会被持续轧空。

更可靠的使用方式

震荡行情:超买出现死叉(%K 下穿 %D)→ 考虑空;超卖出现金叉(%K 上穿 %D)→ 考虑多。

趋势行情(顺势交易):

  • 下跌趋势中,等反弹到高位出现 Stoch 死叉再做空
  • 上涨趋势中,等回调到低位出现 Stoch 金叉再做多

背离信号

顶背离(看跌):价格创新高,但 Stoch 没有创新高——上涨动能减弱。

价格:100 → 110(新高)
Stoch:95 → 85(未创新高)

背离不代表立即反转,需配合:Stoch 死叉 + 阻力位 + 成交量萎缩,多条件共振才更可靠。

底背离(看涨):价格创新低,但 Stoch 未创新低——空头力量衰竭。

ATR(Average True Range,平均真实波幅)

ATR 回答的是:价格最近平均波动有多大,而不是方向。

True Range(TR)计算

每根 K 线的真实波幅取三个值中的最大值:

TR = max(
    H - L,            # 本根K线高低差
    |H - 昨收|,       # 处理向上跳空
    |L - 昨收|        # 处理向下跳空
)

H = 最高价,L = 最低价

ATR(14) 计算

第一个值:前 14 根 K 线 TR 的简单平均。

后续更新(Wilder 平滑法):

ATR(t) = ATR(t-1) + (TR(t) - ATR(t-1)) / 14

ATR 的实战应用

动态止损

# 不使用固定点数,而是基于当前波动率
stop_loss = entry_price + 1.5 * atr  # 做空的止损
take_profit = entry_price - 3 * atr  # 做空的止盈

固定止损(如 ±2%)在低波动市场太宽,在高波动市场太窄。ATR 止损随市场自适应。

判断追单风险:如果当根 K 线已经运动超过 2~3 个 ATR,追单的风险/收益比明显恶化。

顺势做空的基本逻辑

顺势做空不是”跌多了就空”,而是:

  1. 确认下跌趋势:均线空头排列,价格持续创新低
  2. 等反弹:不追空,等价格反弹到阻力位(云带/均线)
  3. 找信号:Stoch 在高位死叉,或出现顶背离
  4. 进场:止损放在反弹高点上方 1~1.5 ATR

需要避免的情况:

  • 在强上涨趋势中因为超买做空
  • 在重要支撑位附近追空(风险大,利润空间小)
  • 重大消息前开仓(ATR 在消息前后会剧烈变化,技术指标失效)
  • 小周期信号对抗大周期趋势

Python 计算 ATR(简单实现)

import pandas as pd

def calculate_atr(df, period=14):
    df["tr"] = pd.concat([
        df["high"] - df["low"],
        (df["high"] - df["close"].shift(1)).abs(),
        (df["low"] - df["close"].shift(1)).abs(),
    ], axis=1).max(axis=1)

    df["atr"] = df["tr"].ewm(alpha=1/period, adjust=False).mean()
    return df

pandasewm 实现了类 Wilder 的指数加权平均。