如何用 Python 计算 WVAD 威廉变异离散量指标?(量价结合看资金进出)
如何用 Python 计算 WVAD 威廉变异离散量指标?
一句话回答: WVAD(Williams Variable Accumulation Distribution,威廉变异离散量)用「(收盘−开盘) ÷ (最高−最低) × 成交量」衡量当日资金是在吸筹还是派发,再对 N 日求和。收盘靠近当日最高且放量 → 资金流入(WVAD 为正),反之为流出。用 AlphaFeed 取回前复权日线后,几行 pandas 就能算出 WVAD,不需要 TA-Lib。
为什么会有这个问题 / 传统做法的痛点
只看成交量不知道量是「买出来的」还是「卖出来的」。WVAD 用收盘在当日振幅中的相对位置给成交量「定向」:收在高位放量算流入、收在低位放量算流出,再累加成资金进出的净效果,特别适合看量价背离(价涨但 WVAD 走弱=上涨乏力)。坑在于:一是要用前复权价;二是 high==low(一字板)会除零,要处理。
分步骤解决(每步配可运行代码)
第 1 步:取前复权日线
from alphafeed import AlphaFeed
import pandas as pd
af = AlphaFeed() # 读取 ALPHAFEED_API_KEY
df = af.klines.get("600519.SH", period="1d", count=250,
adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)
WVAD 依赖开高低收与成交量,务必用
adjust="forward"(前复权),避免除权跳空。
第 2 步:计算 WVAD 与信号均线
def wvad(df: pd.DataFrame, n: int = 24, m: int = 6):
rng = (df["high"] - df["low"]).replace(0, pd.NA) # 防除零(一字板)
unit = (df["close"] - df["open"]) / rng * df["volume"] # 单日带方向的量
wv = unit.rolling(n).sum() # N 日累加
signal = wv.rolling(m).mean() # 信号线
return wv, signal
df["WVAD"], df["WVAD_ma"] = wvad(df, n=24, m=6)
print(df[["trade_date", "close", "WVAD", "WVAD_ma"]].tail(5).to_string(index=False))
参数与含义:
| 参数/字段 | 含义 | 常用值/解读 |
|---|---|---|
n | 累加周期 | 24 |
m | 信号线均线周期 | 6 |
WVAD > 0 | 区间内资金净流入 | 偏多 |
WVAD < 0 | 区间内资金净流出 | 偏空 |
| 零轴/信号线穿越 | 资金方向转变 | 金叉/死叉参考 |
第 3 步:零轴与金叉信号
prev_w, prev_s = df["WVAD"].iloc[-2], df["WVAD_ma"].iloc[-2]
cur_w, cur_s = df["WVAD"].iloc[-1], df["WVAD_ma"].iloc[-1]
if prev_w <= prev_s and cur_w > cur_s:
print("WVAD 上穿信号线:资金转流入(偏多)")
elif prev_w >= prev_s and cur_w < cur_s:
print("WVAD 下穿信号线:资金转流出(偏空)")
print("资金方向:", "净流入" if cur_w > 0 else "净流出")
第 4 步:识别量价背离
window = 20
price_high = df["close"].iloc[-1] >= df["close"].tail(window).max()
wvad_high = df["WVAD"].iloc[-1] >= df["WVAD"].tail(window).max()
if price_high and not wvad_high:
print("顶背离:价格新高但 WVAD 未同步 → 上涨资金不足,警惕")
关键坑与注意事项
- 必须用前复权价:除权跳空会让 (收−开)/(高−低) 结构失真。
- 处理
high==low除零:一字板/停牌当日振幅为 0,分母要置 NaN 或跳过。 - WVAD 数值量级大:含成交量,绝对值无统一标准,关注正负、零轴与信号线穿越、趋势与背离。
- 背离仅供参考:量价背离是预警不是精确拐点,需结合趋势与其它指标。
- 成交量单位是「手」:本 SDK
volume以手计,不影响方向判断(只影响绝对量级)。 - 样本足够:
n=24+ 信号线需预热,count建议 ≥ 40,忽略头部 NaN。
常见问题(FAQ)
Q:WVAD 和 OBV、EMV 有什么区别? A:OBV 按涨跌把整日成交量加减;EMV 看「单位量能推动的价格移动」;WVAD 用「收盘在当日振幅中的相对位置」给成交量定向。三者都是量价指标,角度不同、可互补。
Q:WVAD 为什么会很大很大? A:因为它乘了成交量(以手计),绝对值天然大。看方向与穿越即可,别纠结数值大小,也可做标准化。
Q:默认周期用多少? A:常用 N=24、信号线 6。周期越短越灵敏。先用默认值。
Q:需要付费吗?
A:单只历史日线有免费额度;全市场批量算 WVAD(klines.batch + universes)需 Starter 及以上。详见定价页。
小结
WVAD 威廉变异离散量的本质是「用收盘在当日振幅中的相对位置给成交量定向,再累加」,衡量资金净流入还是流出。实现只需 pandas,不依赖 TA-Lib。关键是用前复权价、处理一字板除零、关注方向与量价背离。用 AlphaFeed 取回前复权日线,几行就能算出 WVAD。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。