AlphaFeed Blog

如何用 Python 计算 TRIX 三重指数平滑均线指标?(过滤震荡的趋势指标)

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

如何用 Python 计算 TRIX 三重指数平滑均线指标?

一句话回答: TRIX(Triple Exponential Average)对收盘价做三次指数平滑再取变化率,把短期波动噪音过滤掉,专门识别中长期趋势。用 AlphaFeed 取回前复权日线后,几行 pandas 就能算出 TRIX 与信号线 MATRIX,用金叉/死叉和零轴穿越判断趋势,完全不需要 TA-Lib。

为什么会有这个问题 / 传统做法的痛点

普通均线/MACD 在震荡市里信号频繁、假突破多。TRIX 的思路是「平滑三次」——把日线的短期抖动层层过滤,只留下真正的趋势方向,因此假信号少、适合中长线。坑在于:一是要用前复权价,否则除权跳空污染平滑结果;二是三次 EMA 需要足够长的样本才收敛,短序列头部不可信。

分步骤解决(每步配可运行代码)

第 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)

TRIX 对价格连续性敏感,务必用 adjust="forward"(前复权),避免除权断层。

第 2 步:三重指数平滑 + 变化率

def trix(close: pd.Series, n: int = 12, m: int = 9):
    ema1 = close.ewm(span=n, adjust=False).mean()
    ema2 = ema1.ewm(span=n, adjust=False).mean()
    ema3 = ema2.ewm(span=n, adjust=False).mean()      # 三重平滑
    tr = ema3.pct_change() * 100                       # 变化率(%)
    matrix = tr.rolling(m).mean()                      # 信号线
    return tr, matrix

df["TRIX"], df["MATRIX"] = trix(df["close"], n=12, m=9)
print(df[["trade_date", "close", "TRIX", "MATRIX"]].tail(5).to_string(index=False))

参数与含义:

参数/字段含义常用值
n三次 EMA 的周期12(短)/ 25(更平滑)
m信号线 MATRIX 平均周期9
TRIX三重平滑后的变化率(%)围绕 0 轴波动
MATRIXTRIX 的 m 日均线(信号线)金叉/死叉参照

第 3 步:金叉/死叉与零轴信号

prev_t, prev_s = df["TRIX"].iloc[-2], df["MATRIX"].iloc[-2]
cur_t, cur_s = df["TRIX"].iloc[-1], df["MATRIX"].iloc[-1]

if prev_t <= prev_s and cur_t > cur_s:
    print("TRIX 上穿信号线:金叉(偏多)")
elif prev_t >= prev_s and cur_t < cur_s:
    print("TRIX 下穿信号线:死叉(偏空)")

# 零轴:TRIX>0 多头趋势,<0 空头趋势
print("当前趋势方向:", "多头" if cur_t > 0 else "空头")

第 4 步:全市场批量筛「TRIX 金叉」

codes = ["600519.SH", "000001.SZ", "601318.SH", "000858.SZ", "300750.SZ"]
data = af.klines.batch(codes, period="1d", count=120,
                       adjust="forward", to_dataframe=True)

hits = []
for sym, k in data.items():
    k = k.sort_values("trade_date")
    t, s = trix(k["close"])
    if t.iloc[-2] <= s.iloc[-2] and t.iloc[-1] > s.iloc[-1]:
        hits.append(sym)
print("今日 TRIX 金叉:", hits)

关键坑与注意事项

常见问题(FAQ)

Q:TRIX 和 MACD 有什么区别? A:MACD 是两条 EMA 的差,TRIX 是三重平滑后的变化率。TRIX 平滑更强、假信号更少但更滞后,偏中长线。

Q:参数 n 用 12 还是 25? A:12 更灵敏、25 更平滑。短线用 12,追求过滤噪音的中长线可用 25。先用默认 12/9 观察。

Q:为什么我算的 TRIX 前面是 NaN? A:三重 EMA 加变化率与信号线滚动平均都需要预热期,序列头部为 NaN 属正常,样本取足够长即可。

Q:需要付费吗? A:单只历史日线有免费额度;全市场批量筛 TRIX(klines.batch + universes)需 Starter 及以上。详见定价页。

小结

TRIX 的本质是「三重指数平滑 + 变化率」,用层层平滑过滤短期噪音,专注中长期趋势。实现只需 pandas 的 ewm,不依赖 TA-Lib。关键是用前复权价、样本取足够长,并理解它「低噪音但滞后」的取舍。用 AlphaFeed 取回前复权日线,从单股信号到全市场金叉筛选都能几行搞定。

相关链接:


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