AlphaFeed Blog

如何用 Python 计算考夫曼自适应均线 KAMA?用效率比率让均线快慢自调

分析与指标 · 代码验证于 2026-10-10

如何用 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

关键坑与注意事项

常见问题(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,几行搞定——记住它是递归的、种子/参数会影响结果、且本质仍是滞后均线。

相关链接:


免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。