第1章:傅里叶变换入门——从时域到频域
各位同学,欢迎来到信号失真识别的第一课。
做量化交易这些年,我越来越觉得:看不懂信号的频率结构,就像瞎子摸象。你只看到价格在涨跌,却不知道背后是什么周期在驱动。今天我们就来捅破这层窗户纸——从时域到频域,把傅里叶变换讲明白。
1.1 为什么我们要关心频域?
先问个问题:你盯着K线图看的时候,看到的是什么?
是价格随时间的变化,对吧?这就是时域视角。但你想过没有——一段价格走势,可能是多个不同周期的波动叠加而成的。比如日内的噪声、周度的趋势、月度的周期。
我早期做策略回测时,经常发现一个现象:明明策略在历史数据上表现很好,一上实盘就崩。后来仔细分析才发现——我把高频噪声当成了有效信号。说白了,就是没分清哪些频率是信号,哪些是噪声。
核心思想:任何时域信号,都可以分解为不同频率的正弦波之和。傅里叶变换就是干这个活的——把时间信号拆成频率成分。
1.2 傅里叶级数:从周期信号说起
先别急着害怕公式。傅里叶级数其实就一句话:任何周期函数,都可以写成一堆正弦波和余弦波的叠加。
数学上长这样:
f(t) = a₀ + Σ [aₙ·cos(nω₀t) + bₙ·sin(nω₀t)]
其中:
- ω₀ = 2π/T 是基频
- a₀ 是直流分量(平均值)
- aₙ, bₙ 是各次谐波的系数
嗯,公式看着有点唬人。但说白了,就是告诉你:一个方波,其实是由无数个正弦波拼出来的。
我在做高频交易信号处理时,就遇到过这种情况。一个看似平滑的价格曲线,拆开来看,里面藏着好几个不同周期的波动。如果你只看时域,根本发现不了。
我的习惯:拿到任何时间序列数据,第一件事就是做频谱分析。先看看数据里有哪些频率成分,再决定用什么滤波器。这能省掉后面80%的调试时间。
1.3 从傅里叶级数到傅里叶变换
傅里叶级数只能处理周期信号。但金融数据、交易信号,有几个是严格周期的?
所以我们需要傅里叶变换——它把周期推向无穷大,让非周期信号也能被分析。
连续傅里叶变换的公式:
F(ω) = ∫ f(t)·e^(-jωt) dt
别被积分吓到。你只需要记住:这个变换把时间信号f(t)变成了频率函数F(ω)。F(ω)的模值就是该频率成分的强度。
举个例子:一个50Hz的正弦波,经过傅里叶变换后,会在50Hz处出现一个尖峰。其他频率上几乎为零。这就是频谱。
注意:傅里叶变换假设信号是平稳的。但金融数据往往是非平稳的——波动率会变,趋势会变。所以实际应用中,我们通常用短时傅里叶变换(STFT)或者小波变换来处理。这个后面会讲。
1.4 频谱分析基础
频谱分析,说白了就是看信号的能量分布。横轴是频率,纵轴是幅度(或功率)。
几个关键概念:
- 幅度谱:各频率成分的强度。告诉你哪个频率占主导。
- 相位谱:各频率成分的相位信息。告诉你波形的对齐方式。
- 功率谱:幅度谱的平方。更直观地反映能量分布。
- 频谱分辨率:Δf = fs / N。采样率固定时,数据越长,分辨率越高。
我记得有一次帮朋友分析一个CTA策略的信号。他总觉得策略有延迟,但找不到原因。我拿频谱一看——好家伙,信号里有个明显的50Hz工频干扰。原来是数据采集时没做好屏蔽。去掉这个干扰后,策略表现立马提升了一个档次。
避坑指南:我曾经在分析分钟级数据时,直接用原始数据做FFT,结果频谱图上一片混乱。后来才发现——数据必须先做去趋势和去均值处理,否则直流分量会淹没掉其他频率成分。
1.5 快速傅里叶变换(FFT)简介
直接计算离散傅里叶变换(DFT)的复杂度是O(N²)。对于N=1000的数据,就要算100万次。这在实时交易系统中根本不可行。
FFT(快速傅里叶变换)把复杂度降到了O(N log N)。N=1000时,只需要约1万次计算。快了100倍。
Python里用起来极其简单:
import numpy as np
import matplotlib.pyplot as plt
# 生成一个含噪声的信号
fs = 1000 # 采样率 1000Hz
t = np.arange(0, 1, 1/fs)
f1, f2 = 5, 50 # 两个频率成分
signal = np.sin(2*np.pi*f1*t) + 0.5*np.sin(2*np.pi*f2*t) + 0.2*np.random.randn(len(t))
# FFT
fft_vals = np.fft.fft(signal)
freqs = np.fft.fftfreq(len(signal), 1/fs)
# 只取正频率部分
pos_mask = freqs > 0
plt.plot(freqs[pos_mask], np.abs(fft_vals[pos_mask]))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('频谱分析结果')
plt.show()
你看,代码就这么几行。但背后的事情可不简单。
实用技巧:做FFT之前,记得加窗函数(比如汉宁窗、海明窗)。不加窗的话,频谱会有严重的泄漏——一个频率的能量会"漏"到旁边的频率上去。我刚开始做的时候没注意这个,结果频谱图上一堆假峰,差点被误导。
1.6 知识体系总览
下面这张图,是我自己梳理的本章知识结构。建议你保存下来,学完本章后对照着回顾一遍。
1.7 本章小结
好了,我们来捋一捋今天讲了什么:
- 时域 vs 频域:时域看变化,频域看成分。两者是同一枚硬币的两面。
- 傅里叶级数:周期信号可以拆成多个正弦波。这是频谱分析的起点。
- 傅里叶变换:把周期概念推广到非周期信号。金融数据的主力工具。
- 频谱分析:看幅度谱、相位谱、功率谱。识别信号中的主要频率成分。
- FFT:快速算法,让实时频谱分析成为可能。Python一行代码搞定。
最后说一句:傅里叶变换不是万能的。它假设信号是平稳的、线性的。但金融市场哪有那么乖?所以后面我们会讲短时傅里叶变换、小波变换这些更高级的工具。
不过,先把今天的基础打牢。下一章,我们聊聊如何用这些工具识别信号失真——这才是我们做交易最关心的。
公众号:蓝海资料掘金营,微信deep3321