第三讲:噪声与滤波——从混乱中提取信号
各位同学,今天我们来聊聊交易信号处理中最让人头疼的问题——噪声。说实话,我刚开始做量化那会儿,最烦的就是这个。明明策略回测跑得好好的,一上实盘就变样。后来才明白,不是策略不行,是信号被噪声污染了。
噪声这东西,就像菜市场里的背景音。你想听清楚对面人说话,得先过滤掉周围的嘈杂。交易信号也一样,价格波动里藏着真信号,也混着大量随机扰动。今天我就带大家把这些噪声理清楚,再教你怎么把它们滤掉。
核心观点:交易信号处理,本质上就是一场信号与噪声的战争。谁掌握滤波技术,谁就能在市场中看得更清楚。
3.1 噪声的三种面孔
先说说噪声的分类。我习惯把噪声分成三种:白噪声、粉红噪声、有色噪声。名字听着玄乎,其实没那么复杂。
3.1.1 白噪声
白噪声是最纯粹的随机。它的功率谱密度是平的,也就是说,在所有频率上能量都一样。你想想看,就像收音机没信号时的沙沙声,每个频率都有,但都没规律。
在金融市场里,高频交易数据中的微小波动,很多就是白噪声。我做过一个统计,在1分钟级别的价格数据里,大约有30%-40%的波动属于白噪声。这些波动没有任何预测价值,纯粹是市场随机游走的产物。
我的经验:判断一个序列是不是白噪声,可以看它的自相关函数。如果滞后1阶之后自相关系数就掉到0附近,那基本就是白噪声了。我在2018年处理比特币数据时就发现,5秒级别的价格变化几乎就是白噪声,根本没法用。
3.1.2 粉红噪声
粉红噪声就有点意思了。它的功率谱密度与频率成反比,低频能量大,高频能量小。自然界里很多现象都是粉红噪声,比如心跳、脑电波,甚至股票市场的长期走势。
为什么会这样?因为市场有记忆效应。今天的价格会影响明天的价格,这种相关性让低频成分更突出。我研究过沪深300的日线数据,它的波动特征就很接近粉红噪声——长期趋势明显,短期波动随机。
3.1.3 有色噪声
有色噪声是个大杂烩,只要不是白噪声和粉红噪声,都可以归到这一类。它的功率谱密度有特定的形状,比如低频特别强,或者某个频段特别突出。
在交易中,有色噪声往往对应着某种市场微观结构。比如订单簿的更新频率,或者做市商的报价模式。我曾经在分析期货Tick数据时发现,某些品种的价差序列呈现出明显的蓝色噪声特征(高频能量大),这是因为做市商在频繁调整报价。
| 噪声类型 | 功率谱特征 | 交易中的例子 |
|---|---|---|
| 白噪声 | 平坦 | 高频Tick随机波动 |
| 粉红噪声 | 1/f | 日线价格趋势 |
| 有色噪声 | 特定形状 | 订单簿价差序列 |
3.2 滤波器家族
搞清楚噪声长什么样,接下来就是怎么对付它们。滤波器就是我们的武器。按功能分,主要有四种:低通、高通、带通、带阻。
3.2.1 低通滤波器
低通滤波器,顾名思义,让低频信号通过,衰减高频信号。这是交易中最常用的滤波器。为什么?因为真正的趋势往往是低频的,而噪声是高频的。
我举个例子。你观察一只股票的5分钟K线,价格上上下下,但如果你用低通滤波器把高频波动滤掉,剩下的就是平滑的趋势线。这就是我们常说的「趋势跟踪」的本质——低通滤波。
注意:低通滤波器有个副作用——滞后。滤得越干净,滞后越严重。我刚开始做策略时,为了追求平滑,把滤波器参数设得很低,结果信号滞后了20个周期,进场点位全偏了。后来我学乖了,在平滑度和响应速度之间找平衡。
3.2.2 高通滤波器
高通滤波器正好相反,它让高频通过,衰减低频。这东西在交易中有什么用?嗯,用来检测突变。
比如你想捕捉价格的突然跳变,或者识别趋势的转折点。高通滤波器可以帮你把长期趋势去掉,只留下短期波动。我曾在做均值回归策略时用过高通滤波,效果不错——它能快速识别价格偏离均值的程度。
3.2.3 带通滤波器
带通滤波器只让某个频段的信号通过。这就像你听音乐时只关注中频人声,忽略低频鼓点和高频镲片。
在交易中,带通滤波器可以用来捕捉特定周期的波动。比如你想做5分钟级别的波段交易,就可以设计一个带通滤波器,只保留周期在5-15分钟之间的波动成分。我有个朋友专门做这个,他的策略就是基于带通滤波的,收益很稳定。
3.2.4 带阻滤波器
带阻滤波器是带通的反面,它阻止某个频段的信号通过。这玩意儿在消除特定噪声时很有用。
比如某个品种在特定时间点(比如开盘、收盘)会出现规律性的噪声,你就可以用带阻滤波器把它去掉。我曾经处理过股指期货的数据,发现每天开盘前5分钟有大量的程序化交易噪声,用带阻滤波器滤掉后,信号质量明显提升。
3.3 移动平均与指数平滑
说完了理论,来点实战的。移动平均和指数平滑是交易中最常用的滤波方法,简单但有效。
3.3.1 移动平均
移动平均就是取最近N个数据的平均值。简单吧?但越简单的东西往往越实用。
移动平均本质上是一个低通滤波器。N越大,滤得越干净,但滞后也越大。我一般用5日均线做短线参考,20日均线做中线参考。当然,具体参数得根据品种和周期来调。
# 简单移动平均的Python实现
def sma(data, window):
return data.rolling(window=window).mean()
# 示例:计算5日均线
price = [100, 102, 101, 103, 105, 104, 106]
sma_5 = sma(pd.Series(price), 5)
print(sma_5)
避坑指南:我曾经犯过一个错误——用移动平均做交易信号时,没有考虑未来数据。回测时用了整个序列的移动平均,结果实盘时发现信号滞后了。记住,移动平均只能用历史数据,不能用未来数据。
3.3.2 指数平滑
指数平滑比移动平均更聪明。它给近期的数据更高的权重,远期的数据权重指数衰减。这样既能平滑噪声,又能保持一定的响应速度。
指数平滑的公式很简单:S_t = α * X_t + (1-α) * S_{t-1}。其中α是平滑系数,取值在0到1之间。α越大,对近期数据越敏感。
# 指数平滑的Python实现
def ema(data, alpha):
result = [data[0]]
for i in range(1, len(data)):
result.append(alpha * data[i] + (1-alpha) * result[-1])
return result
# 示例:计算α=0.2的指数平滑
price = [100, 102, 101, 103, 105, 104, 106]
ema_02 = ema(price, 0.2)
print(ema_02)
我个人习惯用指数平滑来做趋势跟踪。它的滞后比移动平均小,而且参数调整更灵活。我一般把α设在0.1到0.3之间,具体看品种的波动率。波动大的品种用大一点的α,波动小的用小一点的α。
3.4 知识体系总览
说了这么多,我们来画个图,把今天的内容串起来。
这张图把今天的内容都串起来了。左边是噪声类型,中间是滤波器,右边是实战方法。三者之间的关系很清楚:先识别噪声类型,再选择合适的滤波器,最后用实战方法落地。
总结一下:噪声识别是信号处理的第一步,滤波是第二步。移动平均和指数平滑是最实用的工具,但要注意参数选择和滞后问题。记住,没有万能的滤波器,只有最适合当前场景的方法。
好了,今天就讲到这里。下一章我们会深入讨论信号失真问题,看看除了噪声之外,还有哪些因素会破坏我们的交易信号。各位回去可以把今天讲的滤波器在历史数据上试试,感受一下不同参数的效果。