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

参考

相关推荐
还卿一钵无情泪1 小时前
Unsloth 微调 构建自己的大模型 没有GPU也能微调
linux·开发语言·人工智能·python·大模型·nlp·unsloth
倔强的石头1063 小时前
应用账号最小权限实践:读写账号、报表账号、运维账号分层
java·运维·开发语言
传人once3 小时前
页面中心圆圈放大效果如何写
开发语言·javascript·ecmascript
NeilYuen3 小时前
【C++】STL源码仿写(二):vector
开发语言·c++
蜗牛互联网4 小时前
Python消费Responses SSE事件:增量文本、超时与取消
java·开发语言·人工智能·后端·python
statistican_ABin4 小时前
中国国际旅游发展分析报告—基于世界银行国际旅游数据的多维度分析
python·机器学习·旅游
weixin_307779134 小时前
C++代码实现MATLAB中的crossval函数功能
开发语言·c++·算法·matlab
ttwuai4 小时前
Go后台管理系统开源项目:4个官方仓库怎么追溯和核验
开发语言·golang·开源
谢亮_vipxieliang4 小时前
Go Worker Pool 设计——从原理到生产级实现
开发语言·后端·golang