一句话回答: 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 :用 pandasewm(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 取回前复权日线,从单股信号到全市场金叉筛选都能几行搞定。
参考
- AlphaFeed Python SDK 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
- AlphaFeed 官网:https://alphafeed.org/