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

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

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

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

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

第 1 步:取前复权日线

python 复制代码
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 步:三重指数平滑 + 变化率

python 复制代码
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 轴波动
MATRIX TRIX 的 m 日均线(信号线) 金叉/死叉参照

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

python 复制代码
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 金叉」

python 复制代码
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)

关键坑与注意事项

  • 必须用前复权价:除权跳空会让三重平滑失真,趋势判断出错。
  • 头部数据不可信 :三次 EMA 需要收敛,count 建议 ≥100,忽略序列最前面若干根。
  • TRIX 天生滞后:三重平滑换来低噪音的代价是信号偏慢,适合中长线、不适合抢短差。
  • 震荡市仍会来回:虽比 MACD 少,但极度横盘时金叉死叉也会反复,可配合 ADX 过滤。
  • 单位是百分比变化率:TRIX 数值很小(常在 ±1 以内),关注方向与穿越,不用纠结绝对值大小。
  • adjust=False 的 EMA :用 pandas ewm(adjust=False) 与主流软件口径一致,别漏这个参数。

常见问题(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 取回前复权日线,从单股信号到全市场金叉筛选都能几行搞定。

参考

相关推荐
飞Link2 小时前
什么是 AirSim?一文读懂无人机仿真平台
python·算法·无人机
学逆向的2 小时前
C 堆区内存管理
c语言·开发语言·网络安全
huoyueyi2 小时前
《融天AI-APP从0到1开发实录》
开发语言·lua
曲径海盗2 小时前
【Python 学习第 38 天】for 循环
python·学习笔记·编程入门
在世修行3 小时前
智学文枢:变式题生成引擎
python·ai·pyside·题目生成
OpenAnolis小助手4 小时前
PHP 两个严重漏洞曝光,龙蜥社区 24 小时完成 3 版本修复
开发语言·操作系统·php·龙蜥社区
On The Road :4 小时前
Java 多线程详解:从入门到线程安全
java·python·安全
阿尼卡~4 小时前
VS Code 配置 C 语言开发环境(Windows 10/11):从 GCC 安装到运行、断点调试,一篇搞定
c语言·开发语言·windows
岁月宁静5 小时前
如何设计支持 Skills 的 Agent?一套可扩展的四层架构
python·agent
岁月宁静5 小时前
CrewAI 快速上手:10 分钟搭建你的第一个 Agent 团队
python·agent