☰
如何用 Python 计算威廉指标 WR(%R)?(超买超卖判断,不用 TA-Lib)
2026/9/30 7:20:05 网站建设 项目流程

一句话回答:威廉指标 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 步:取复权日线

fromalphafeedimportAlphaFeed 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

defwilliams_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)*-100df["wr"]=williams_r(df,14)print(df[["trade_date","close","wr"]].tail(3).to_string(index=False))

WR 参数与含义:

项取值 / 公式含义
n回看周期14(也用 6/10)
Hn / LnN 日最高 / 最低区间上下沿
%R 区间−100 ~ 0负值指标
超买线> −20收盘接近区间顶部
超卖线< −80收盘接近区间底部

第 3 步:判断超买超卖

defwr_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)"ifv>-20else("超卖(<-80)"ifv<-80else"中性")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——但记住它灵敏、会钝化,需配合趋势与止损,别单独当买卖信号。

参考

  • AlphaFeed Python SDK 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询