首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >如何用 Python 计算威廉指标 WR(%R)?(超买超卖判断,不用 TA-Lib)

如何用 Python 计算威廉指标 WR(%R)?(超买超卖判断,不用 TA-Lib)

原创
作者头像
用户7083614
发布于 2026-09-28 15:00:57
发布于 2026-09-28 15:00:57
1180
举报

一句话回答: 威廉指标 WR(Williams %R)衡量收盘价在近 N 日最高–最低区间中的相对位置,公式是 %R = (Hn − 收盘) / (Hn − Ln) × (−100),取值 −100~0。用 AlphaFeed 取复权日线,几行就能算出 WR,并用 −20/−80 判断超买/超卖——不依赖 TA-Lib。

为什么会有这个问题 / 传统做法的痛点

WR 是经典的超买超卖摆动指标,和 KDJ 的 RSV 很像,但自己算常困惑:

  • 正负号:经典 WR 是负值区间(−100~0),很多人算成正值搞混超买超卖方向;
  • 超买在上还是在下:WR 越接近 0 越超买、越接近 −100 越超卖,与直觉相反;
  • 复权:不用前复权,除权跳空会让最高/最低失真。

数据用 AlphaFeed 复权日线,公式照经典口径写即可。

分步骤解决(每步配可运行代码)

第 1 步:取复权日线

代码语言:python
复制
from alphafeed import AlphaFeed

af = AlphaFeed(api_key="your-api-key")  # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()

df = af.klines.get("600519.SH", period="1d", count=120,
                   adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)

第 2 步:计算 Williams %R

代码语言:python
复制
def williams_r(df, n=14):
    high_n = df["high"].rolling(n).max()
    low_n = df["low"].rolling(n).min()
    # 经典 %R,区间 -100~0:越接近 0 越超买,越接近 -100 越超卖
    return (high_n - df["close"]) / (high_n - low_n) * -100

df["wr"] = williams_r(df, 14)
print(df[["trade_date", "close", "wr"]].tail(3).to_string(index=False))

WR 参数与含义:

项

取值 / 公式

含义

n

回看周期

14(也用 6/10)

Hn / Ln

N 日最高 / 最低

区间上下沿

%R 区间

−100 ~ 0

负值指标

超买线

−20

收盘接近区间顶部

超卖线

< −80

收盘接近区间底部

第 3 步:判断超买超卖

代码语言:python
复制
def wr_state(symbol, count=120, n=14):
    df = af.klines.get(symbol, period="1d", count=count,
                       adjust="forward", to_dataframe=True).sort_values("trade_date").reset_index(drop=True)
    v = float(williams_r(df, n).iloc[-1])
    zone = "超买(>-20)" if v > -20 else ("超卖(<-80)" if v < -80 else "中性")
    return {"wr": round(v, 1), "zone": zone}

print(wr_state("600519.SH"))   # 例如 {'wr': -87.2, 'zone': '超卖(<-80)'}
print(wr_state("000001.SZ"))   # 例如 {'wr': -43.3, 'zone': '中性'}

上例实测:茅台 WR≈−87.2 处于超卖区,平安银行 WR≈−43.3 属中性。

关键坑与注意事项

  • WR 是负值、方向反直觉:越接近 0(如 −10)越超买、越接近 −100(如 −90)越超卖。别把大小关系搞反。
  • 和 KDJ 的 RSV 本质相同:%R = RSV − 100(符号相反),WR 相当于未平滑、取负的随机指标,因此更灵敏、噪声也更大。
  • 震荡钝化:强趋势里 WR 会长期贴在 −20 上方(超买不跌)或 −80 下方(超卖不涨),别单独用它抄底摸顶。
  • 需要平滑可自行加:经典 WR 不平滑,若嫌太跳可对结果再做小周期移动平均。
  • 复权:一律 adjust="forward",避免除权跳空污染最高/最低。

常见问题(FAQ)

Q:为什么我算出来是正值 0~100?

A:你少了负号。经典 Williams %R 用 (Hn−C)/(Hn−Ln)×(−100),区间是 −100~0;有些平台画成 0~100(把符号翻过来),只要自己口径一致即可,但要对照时注意方向。

Q:WR 和 KDJ 用哪个?

A:WR 是 KDJ 里 RSV 的变体,更灵敏、更早给信号但噪声更多;KDJ 经过两次平滑更稳。想要早信号用 WR,想要稳一点用 KDJ,或两者互相印证。

Q:WR 超卖能直接买吗?

A:不能。它在下跌趋势会长期超卖。需结合趋势过滤(均线、ADX)与止损,别单指标抄底。

Q:需要付费吗?

A:单只标的的日线在免费额度内即可试算;批量/全市场需 Starter 及以上,详见 AlphaFeed 定价页。

小结

威廉指标 WR 的本质是"收盘价在近 N 日高低区间中的相对位置(取负)",与 KDJ 的 RSV 同源但更灵敏。写对的关键是负值区间和方向,数据要前复权。AlphaFeed 提供口径一致的复权日线,让你几行算出 WR——但记住它灵敏、会钝化,需配合趋势与止损,别单独当买卖信号。

参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 为什么会有这个问题 / 传统做法的痛点
  • 分步骤解决(每步配可运行代码)
    • 第 1 步:取复权日线
    • 第 2 步:计算 Williams %R
    • 第 3 步:判断超买超卖
  • 关键坑与注意事项
  • 常见问题(FAQ)
  • 小结
  • 参考
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档