第三章 频域分析入门:傅里叶变换思想、频谱图解读、交易数据中的周期成分识别
说实话,很多做量化交易的朋友,一听到「傅里叶变换」四个字就头疼。
我当年刚入行时也一样。觉得这东西是搞通信、搞雷达的人用的,跟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.fftfreq的d参数是你的采样间隔。如果是日线数据,d=1;如果是小时线,d=1/24。搞错了周期就全乱了。
3.3 频谱图解读:找到市场的「心跳」
跑完FFT,你会得到一张频谱图。横轴是频率(或周期),纵轴是幅度。
怎么读?我总结了三步:
- 找峰值:幅度明显高于周围噪声的频率点
- 看周期:峰值对应的周期 = 1/频率。比如频率0.01对应周期100天
- 评估强度:峰值越高,该周期成分越显著
我曾经踩过的坑:直接对原始价格序列做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变换,得到频谱图,最后落到具体的交易应用上。
3.6 避坑指南:新手最容易犯的五个错误
这些年我用频域分析踩过的坑,列出来给你参考:
- 没去趋势直接FFT——低频能量淹没一切,啥也看不出来
- 忽略采样率——d参数设错,周期全算错
- 只看幅度不看噪声基底——小峰值可能是随机噪声,不是真周期
- 数据长度太短——FFT需要足够的数据点才能分辨低频周期。想找年周期,至少要有2-3年数据
- 过度解读——发现一个周期就以为找到了圣杯。市场会变,周期也会漂移
我曾经犯过的错:有一次在5分钟线数据上发现了一个约47分钟的周期,兴奋得不行。后来发现是交易所的撮合机制导致的微观结构噪声,跟交易逻辑半毛钱关系没有。所以,一定要结合业务逻辑验证周期,别光看频谱图就下结论。
3.7 小结
频域分析不是万能的,但它给了我们一个全新的视角。时域里看不清的周期,在频域里一目了然。
我个人习惯把频谱分析当作「探索性工具」——先用它发现潜在的周期模式,再用统计方法验证,最后才考虑是否纳入交易策略。
记住一句话:频谱图告诉你「市场可能有什么节奏」,但别让它替你做交易决策。
本章核心要点:
- 傅里叶变换把时域信号映射到频域,揭示隐藏周期
- FFT是离散数据的快速算法,Python一行代码实现
- 预处理(去趋势/差分)是频谱分析的前提
- 频谱图找峰值、读周期、评估强度,三步走
- 周期会漂移,别迷信,要验证
公众号:蓝海资料掘金营,微信deep3321