如何用 Python 计算动量震荡指标 AO(Awesome Oscillator)?不用 TA-Lib
如何用 Python 计算动量震荡指标 AO(Awesome Oscillator)?
一句话回答: AO(Awesome Oscillator,动量震荡指标)由 Bill Williams 提出,公式极简:AO = 中价的 5 日 SMA − 中价的 34 日 SMA,其中中价 = (最高价+最低价)/2。它围绕零轴摆动——AO 在零轴之上=短期动量强于中期(偏多)、之下=偏空;常用零轴穿越、双峰(saucer)判动量转折。用 AlphaFeed 取前复权日线一两行就能算,不需要 TA-Lib。
为什么会有这个问题 / 传统做法的痛点
MACD 用收盘价的 EMA 之差,AO 则用中价(更能代表当日中枢)的两条 SMA 之差,衡量”短期动量 vs 中期动量”的强弱对比。它的优点是直观、零轴清晰、几乎无参数争议(5/34 几乎是定式)。痛点仅在于:有人把中价写成收盘价、或 SMA 写成 EMA,就不是标准 AO 了。
分步骤解决(每步配可运行代码)
第 1 步:取前复权日线(要 high/low)
from alphafeed import AlphaFeed
import numpy as np, pandas as pd
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
df = af.klines.get("600519.SH", period="1d", count=200,
adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)
第 2 步:实现 AO(中价 5 日 SMA − 34 日 SMA)
def awesome(df, s=5, l=34):
med = (df["high"] + df["low"]) / 2 # 中价
return med.rolling(s).mean() - med.rolling(l).mean()
df["ao"] = awesome(df)
print(df[["trade_date", "ao"]].tail())
实测(
tools/verify_new_2026-10-18.py,SDK 0.1.4):贵州茅台近 200 日 AO 尾值 ≈ 8.06(零轴之上,偏多),区间 −88.55 ~ 106.44,期间 AO 上穿零轴 4 次。AO 的绝对值随价格水平变化,看方向与相对大小而非固定阈值。
第 3 步:零轴穿越与双峰(saucer)判读
cross_up = (df["ao"].shift(1) <= 0) & (df["ao"] > 0) # 上穿零轴 → 偏多
cross_down = (df["ao"].shift(1) >= 0) & (df["ao"] < 0) # 下穿零轴 → 偏空
print("最近 AO 上穿零轴:", df.loc[cross_up, "trade_date"].tail(1).tolist())
Williams 的经典信号:零轴穿越(AO 由负转正偏多)、双峰(saucer)(零轴同侧连续柱子的颜色/高度变化)、以及 AO 与价格的背离。
参数与字段说明
| 参数/概念 | 含义 | 备注 |
|---|---|---|
adjust="forward" | 前复权 | 必须,除权缺口会扭曲中价 |
med | (high+low)/2 中价 | AO 用中价,不是收盘 |
s=5 | 短期 SMA | Bill Williams 定式 |
l=34 | 长期 SMA | Bill Williams 定式 |
| AO | 5SMA − 34SMA | 围绕零轴摆动 |
| 零轴穿越 | 多空切换 | 核心信号 |
关键坑与注意事项
- 用中价、用 SMA:标准 AO 是中价 (H+L)/2 的 5 日与 34 日简单移动平均之差;写成收盘价或 EMA 就不是 AO 了。
- 无固定阈值:AO 的绝对值随标的价格水平放大/缩小,不能像 RSI 那样用固定超买超卖线;看方向、零轴、相对高低。
- 震荡市零轴附近反复:价格盘整时 AO 在零轴附近来回穿越,假信号多,需结合趋势过滤。
- 前复权必须:除权缺口会让中价与 AO 失真。
- saucer 信号偏主观:双峰/碟形判读依赖连续柱子的形态,不同实现着色规则不同,别过度机械化。
常见问题(FAQ)
Q:AO 和 MACD 有什么区别? A:AO = 中价的 5/34 SMA 之差;MACD = 收盘价的 12/26 EMA 之差再配信号线。AO 更强调”中价 + 简单均线 + 零轴”,是 Bill Williams 交易体系的一部分;MACD 更通用。两者都围绕零轴看动量。
Q:AO 适合所有周期吗? A:日线最常用。更短周期(分钟)也能算,但噪声更大;5/34 的参数是 Williams 的定式,一般不改。
Q:需要付费吗?
A:单只股票日线在免费额度内即可;若要对全市场批量扫 AO 零轴上穿的票,需要 klines.batch + universes(Starter 及以上),详见官网定价页。
小结
AO 用中价的 5 日与 34 日简单均线之差衡量短期 vs 中期动量,围绕零轴摆动,用零轴穿越、双峰和背离判转折。用 AlphaFeed 的前复权 high/low 一两行即可实现——记住用中价与 SMA、AO 无固定阈值看方向与零轴、震荡市零轴附近易骗线、前复权必须。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。