一句话回答:威廉指标 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 / Ln | N 日最高 / 最低 | 区间上下沿 |
| %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