AlphaFeed Blog

如何用 Python 计算费雪变换(Fisher Transform)?让转折点更锐利

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

如何用 Python 计算费雪变换(Fisher Transform)?

一句话回答: 费雪变换(Fisher Transform)由 John Ehlers 提出,先把价格(常用中价高低归一化到 −1~1)再做反双曲正切式变换 0.5·ln((1+x)/(1-x)),把原本”厚中间、薄两端”的价格分布拉成接近正态分布,于是极值被放大、转折点变得又尖又清晰。用 AlphaFeed 取前复权日线,十几行递归就能实现,配一条信号线用金叉择时,不需要 TA-Lib。

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

价格本身的分布接近”钝”的均匀/厚尾形态,拐点处过渡平缓,普通振荡指标在顶/底常常”圆钝”难判。Ehlers 借用统计里的费雪变换:当输入被归一化到 (−1, 1),ln((1+x)/(1-x)) 会把接近 ±1 的值急剧放大,于是价格到达区间极值时费雪线会急速拉升/下插,拐点变得尖锐。痛点是 TA-Lib 没有现成函数,而且它是双重递归(归一化值平滑 + 费雪值平滑),还要把归一化值夹在 ±0.999 防止 ln 爆炸。

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

第 1 步:取前复权日线(用中价 high/low)

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=250,
                   adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)

第 2 步:实现费雪变换(归一化 → 平滑 → 费雪 → 信号线)

def fisher_transform(df, n=9):
    mid = (df["high"] + df["low"]) / 2            # 中价
    lo, hi = mid.rolling(n).min(), mid.rolling(n).max()
    rng = (hi - lo).replace(0, np.nan)
    val = np.zeros(len(df)); fish = np.zeros(len(df))
    midv, lov, rngv = mid.values, lo.values, rng.values
    for i in range(len(df)):
        if np.isnan(rngv[i]):
            continue
        raw = 2 * ((midv[i] - lov[i]) / rngv[i] - 0.5)        # 归一化到 -1~1
        v = 0.33 * raw + 0.67 * (val[i-1] if i > 0 else 0)    # 平滑
        v = max(min(v, 0.999), -0.999)                        # 夹紧防 ln 爆炸
        val[i] = v
        fish[i] = 0.5*np.log((1+v)/(1-v)) + 0.5*(fish[i-1] if i > 0 else 0)  # 费雪+平滑
    f = pd.Series(fish, index=df.index)
    return f, f.shift(1)       # 费雪线, 信号线(前一日费雪值)

df["fisher"], df["fisher_sig"] = fisher_transform(df, 9)
print(df[["trade_date", "fisher", "fisher_sig"]].tail())

实测(tools/verify_new_2026-10-14.py,SDK 0.1.4):贵州茅台近 250 日 Fisher 尾值 ≈ 0.803、信号 ≈ 0.191(费雪在信号线上方,偏多),区间内费雪线上穿信号线共 23 次,数值有限(无溢出)。

第 3 步:金叉/死叉 + 极值反转

golden = (df["fisher"].shift(1) <= df["fisher_sig"].shift(1)) & (df["fisher"] > df["fisher_sig"])
print("最近费雪金叉:", df.loc[golden, "trade_date"].tail(1).tolist())

常用法:费雪线上穿信号线偏多、下穿偏空;费雪线冲到很高/很低后掉头,常对应短期顶/底。

参数与字段说明

参数/概念含义备注
adjust="forward"前复权必须,除权缺口会扭曲归一化
mid(high+low)/2 中价费雪变换输入
n=9归一化回看期常用 9/10
0.33 / 0.67归一化值平滑系数Ehlers 原设
夹紧 ±0.999防 ln 爆炸必须,否则值→∞
信号线前一日费雪值金叉死叉用

关键坑与注意事项

常见问题(FAQ)

Q:费雪变换和 RSI、随机指标有什么不同? A:RSI/KD 把价格压进 0~100 的有界区间;费雪变换则把价格分布”正态化”、放大极值使拐点更尖锐,没有固定上下界。它更强调”转折时刻”的识别。

Q:为什么我的费雪线和某软件不一样? A:多半是归一化周期 n、平滑系数或中价定义(有的用收盘价)不同。先统一参数与输入再比。

Q:需要付费吗? A:单只股票日线在免费额度内即可;若要对全市场批量扫费雪金叉/极值反转,需要 klines.batch + universes(Starter 及以上),详见官网定价页。

小结

费雪变换借统计里的反双曲正切把价格分布”正态化”,放大极值、锐化转折点,配信号线金叉择时。用 AlphaFeed 的前复权中价十几行递归即可实现——记住夹紧 ±0.999 防爆炸、它是双重递归、放大极值也放大噪声、且无固定上下界。

相关链接:


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