第三章 频域分析入门:傅里叶变换思想、频谱图解读、交易数据中的周期成分识别

说实话,很多做量化交易的朋友,一听到「傅里叶变换」四个字就头疼。

我当年刚入行时也一样。觉得这东西是搞通信、搞雷达的人用的,跟K线图有什么关系?

直到有一次,我在分析一个商品期货的日线数据时,发现价格总在某个时间窗口内出现规律性波动。用肉眼看了半天,模模糊糊觉得有周期,但说不清。后来试着用傅里叶变换跑了一下,频谱图一出来,几个峰值清清楚楚——原来市场里藏着这么多「看不见的节拍」。

从那以后,频域分析就成了我工具箱里的常客。

3.1 时域 vs 频域:换个角度看数据

我们平时看K线图、看价格序列,这叫「时域」视角。横轴是时间,纵轴是价格。很直观,对吧?

但问题在于:有些信息在时域里是藏起来的。比如一个缓慢的季度周期,叠加在日间的随机波动上,肉眼根本看不出来。

频域分析,说白了就是把数据从「时间轴」映射到「频率轴」。横轴变成频率(周期),纵轴变成强度(能量)。

你想想看,这就像听一首交响乐。时域是录音波形,你能听到声音大小变化;频域是频谱分析仪,你能看到哪些乐器在演奏、每个乐器多响。

核心思想:任何时间序列信号,都可以分解为一系列不同频率的正弦波(或余弦波)的叠加。傅里叶变换就是做这件事的数学工具。

3.2 傅里叶变换:从直觉到公式

我不打算堆公式吓人。但有一个核心公式,我觉得值得看一眼:

X(f) = ∫ x(t) · e^(-j2πft) dt

这个公式在说什么?

  • x(t):你的原始信号,比如收盘价序列
  • e^(-j2πft):一个旋转的「探针」,频率为f
  • 积分:让探针和信号做内积,看看匹配程度

结果X(f)是一个复数。它的模长代表该频率成分的「强度」,相位代表该成分的「起始位置」。

我的个人习惯:在交易数据中,我通常只看幅度谱(模长),相位信息用得少。因为周期是否存在、强度多大,比它从哪开始更重要。

实际代码中,我们用的是快速傅里叶变换(FFT),它是离散版本的高效算法。Python里一行搞定:

import numpy as np

# 假设 prices 是日收盘价序列,长度 N
N = len(prices)
fft_vals = np.fft.fft(prices)
freqs = np.fft.fftfreq(N, d=1)  # d=1 表示日频

# 只取正频率部分(负频率对称,没用)
positive_idx = np.where(freqs > 0)
amps = np.abs(fft_vals[positive_idx]) / N
freqs_pos = freqs[positive_idx]

# 周期 = 1/频率
periods = 1.0 / freqs_pos

嗯,这里要注意:np.fft.fftfreqd参数是你的采样间隔。如果是日线数据,d=1;如果是小时线,d=1/24。搞错了周期就全乱了。

3.3 频谱图解读:找到市场的「心跳」

跑完FFT,你会得到一张频谱图。横轴是频率(或周期),纵轴是幅度。

怎么读?我总结了三步:

  1. 找峰值:幅度明显高于周围噪声的频率点
  2. 看周期:峰值对应的周期 = 1/频率。比如频率0.01对应周期100天
  3. 评估强度:峰值越高,该周期成分越显著

我曾经踩过的坑:直接对原始价格序列做FFT。结果低频部分(趋势)能量巨大,把其他周期全淹没了。后来我学乖了——先做差分或去趋势,再分析周期成分。

正确的做法是:

# 去趋势:用对数收益率代替价格
log_returns = np.diff(np.log(prices))

# 或者用HP滤波去掉趋势成分
# 这里简单演示差分
fft_vals = np.fft.fft(log_returns)
# ... 后续同上

为什么?因为价格序列通常是非平稳的,有趋势、有随机游走。直接FFT会得到一堆虚假的「伪周期」。收益率序列相对平稳,频谱更可信。

3.4 交易数据中的周期成分识别:实战案例

拿我最近分析的一个股指期货数据举例。日线,5年数据,约1250个交易日。

跑完FFT后,频谱图上出现了三个明显的峰值:

峰值编号 周期(交易日) 对应时间 可能来源
1 ~20 约1个月 月度经济数据发布节奏
2 ~63 约1季度 财报季、季末效应
3 ~252 约1年 季节性、财政周期

有意思的是,20天周期和63天周期叠加在一起,形成了某种「拍频」效应。在某些时间段,两个周期同向,波动放大;反向时,波动抵消。

我的建议:别只看单个周期。把几个主要周期叠加起来,看看它们什么时候共振、什么时候抵消。这比单独用任何一个周期做预测都靠谱。

3.5 知识体系框架:频域分析在交易中的位置

下面这张图,是我自己梳理的频域分析知识结构。你可以把它当作本章的「地图」:

频域分析在交易信号提取中的应用框架 原始价格序列 预处理:去趋势 / 差分 / 对数收益率 FFT快速傅里叶变换 频谱图:频率 vs 幅度 应用方向 周期成分识别 滤波去噪 信号预测与共振分析 异常检测

这张图把整个流程串起来了:从原始价格出发,经过预处理,做FFT变换,得到频谱图,最后落到具体的交易应用上。

3.6 避坑指南:新手最容易犯的五个错误

这些年我用频域分析踩过的坑,列出来给你参考:

  • 没去趋势直接FFT——低频能量淹没一切,啥也看不出来
  • 忽略采样率——d参数设错,周期全算错
  • 只看幅度不看噪声基底——小峰值可能是随机噪声,不是真周期
  • 数据长度太短——FFT需要足够的数据点才能分辨低频周期。想找年周期,至少要有2-3年数据
  • 过度解读——发现一个周期就以为找到了圣杯。市场会变,周期也会漂移

我曾经犯过的错:有一次在5分钟线数据上发现了一个约47分钟的周期,兴奋得不行。后来发现是交易所的撮合机制导致的微观结构噪声,跟交易逻辑半毛钱关系没有。所以,一定要结合业务逻辑验证周期,别光看频谱图就下结论。

3.7 小结

频域分析不是万能的,但它给了我们一个全新的视角。时域里看不清的周期,在频域里一目了然。

我个人习惯把频谱分析当作「探索性工具」——先用它发现潜在的周期模式,再用统计方法验证,最后才考虑是否纳入交易策略。

记住一句话:频谱图告诉你「市场可能有什么节奏」,但别让它替你做交易决策。

本章核心要点:

  • 傅里叶变换把时域信号映射到频域,揭示隐藏周期
  • FFT是离散数据的快速算法,Python一行代码实现
  • 预处理(去趋势/差分)是频谱分析的前提
  • 频谱图找峰值、读周期、评估强度,三步走
  • 周期会漂移,别迷信,要验证

公众号:蓝海资料掘金营,微信deep3321