如何用 Python 计算考夫曼自适应均线 KAMA?用效率比率让均线快慢自调
如何用 Python 计算考夫曼自适应均线 KAMA?
一句话回答: KAMA(Kaufman’s Adaptive Moving Average,考夫曼自适应均线)先用效率比率 ER(一段净位移 ÷ 总路程)判断价格走得干不干脆,再据此动态调整平滑速度——趋势明确(ER 高)时像快均线紧贴价格,震荡(ER 低)时像慢均线变钝过滤噪声。用 AlphaFeed 取前复权日线,几行就能实现 ER 与 KAMA,不需要 TA-Lib。
为什么会有这个问题 / 传统做法的痛点
固定周期均线有个两难:周期短跟得紧但假信号多,周期长平滑但滞后大。考夫曼的思路是让均线自适应:价格单边走(效率高)就加快、来回震荡(效率低)就放慢。核心是效率比率 ER = |区间净涨跌| ÷ |每日涨跌绝对值之和|——分子是「直线距离」,分母是「实际走的路」,比值越接近 1 说明走得越”直”。痛点是 TA-Lib 的 KAMA 参数口径容易记混,而且很多人卡在 KAMA 是递归的(当前值依赖上一个 KAMA),没法纯向量化一步算完。
分步骤解决(每步配可运行代码)
第 1 步:取前复权日线
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=300,
adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)
第 2 步:算效率比率 ER → 平滑系数 SC → 递归出 KAMA
def kama(close, er_n=10, fast=2, slow=30):
change = (close - close.shift(er_n)).abs() # 区间净位移
vol = close.diff().abs().rolling(er_n).sum() # 区间总路程
er = (change / vol).fillna(0) # 效率比率 0~1
fast_sc, slow_sc = 2/(fast+1), 2/(slow+1)
sc = (er * (fast_sc - slow_sc) + slow_sc) ** 2 # 平滑系数(快慢EMA间插值,再平方)
k = np.full(len(close), np.nan); vals = close.values
start = er_n; k[start] = vals[start] # 以第 er_n 根收盘为种子
scv = sc.values
for i in range(start+1, len(close)):
k[i] = k[i-1] + scv[i] * (vals[i] - k[i-1]) # 递归:KAMA 自适应逼近价格
return pd.Series(k, index=close.index)
df["kama"] = kama(df["close"], 10, 2, 30)
print(df[["trade_date", "close", "kama"]].tail())
实测(
tools/verify_new_2026-10-10.py,SDK 0.1.4):贵州茅台近 300 日 KAMA 尾值 ≈ 1256.67(当日收盘 1263.0),区间内收盘上穿 KAMA 共 19 次,尾部无 NaN。
第 3 步:用 KAMA 做趋势/信号
golden = (df["close"].shift(1) <= df["kama"].shift(1)) & (df["close"] > df["kama"])
dead = (df["close"].shift(1) >= df["kama"].shift(1)) & (df["close"] < df["kama"])
print("最近一次上穿 KAMA:", df.loc[golden, "trade_date"].tail(1).tolist())
价格上穿 KAMA 偏多、下穿偏空;也常看 KAMA 自身的方向(走平=震荡,别追)。
参数与字段说明
| 参数/概念 | 含义 | 备注 |
|---|---|---|
adjust="forward" | 前复权 | 必须,除权缺口会扭曲 ER |
er_n | 效率比率回看期 | 默认 10 |
fast | 快 EMA 周期 | 默认 2(趋势强时逼近) |
slow | 慢 EMA 周期 | 默认 30(震荡时变钝) |
er | 效率比率,0~1 | 越接近 1 走得越”直” |
sc | 平滑系数 | 快慢间插值再平方 |
| KAMA | 递归自适应均线 | 当前值依赖上一个 KAMA |
关键坑与注意事项
- KAMA 是递归的:当前值依赖前一个 KAMA,必须循环(或用专门递归实现),不能用一句 rolling 向量化;种子一般取第
er_n根收盘。 - 种子与起点敏感:不同实现用的种子(首个收盘 or SMA)略有差异,前几十根会有偏差,比较时统一口径。
- 前复权必须:除权缺口会让 ER 的「总路程」突然放大、系数失真。
- 参数要配品种:fast/slow/er_n 默认 2/30/10 是常用值,但高波动品种可能需要调整,别照搬当真理。
- 仍是滞后指标:KAMA 只是「更聪明的均线」,震荡市走平时照样会给模糊信号,不解决根本的滞后问题。
常见问题(FAQ)
Q:KAMA 和普通 EMA、以及 VIDYA 有什么区别? A:EMA 的平滑系数固定;KAMA 用效率比率让系数在快/慢之间自适应变化。VIDYA 思路类似(用波动或 CMO 调整),都属于”自适应均线”family,细节公式不同。
Q:为什么我的 KAMA 和 TA-Lib 对不上?
A:多半是种子取法、er_n/fast/slow 参数或复权口径不同。先统一参数与复权,再比前 N 根之后的收敛段。
Q:需要付费吗?
A:单只股票日线在免费额度内即可;若要对全市场批量用 KAMA 扫趋势转强的票,需要 klines.batch + universes(Starter 及以上),详见官网定价页。
小结
KAMA 用效率比率让均线「趋势时快、震荡时慢」,比固定周期均线更能兼顾灵敏与抗噪。用 AlphaFeed 的前复权日线,先算 ER、再递归出 KAMA,几行搞定——记住它是递归的、种子/参数会影响结果、且本质仍是滞后均线。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。