神经网络在交易中的应用:基于频域的异常检测 (CATCH)(基础篇)
「用频域切出行情里的异常毛刺」
传统价格行为分析多在时域里找拐点,但噪声一多,肉眼很难区分正常波动和真正的结构性异动。把报价序列做傅里叶变换拉到频域,低频段承载趋势,高频段往往藏着异常脉冲——这部分能量突然放大,可能预示流动性断层或算法单踩踏。 CATCH 思路不预测方向,只做异常检测:当高频能量占比超过历史分位阈值,系统标记当前为「非平稳态」,提醒交易者降低仓位或暂停趋势策略。外汇与贵金属杠杆高,这类异常出现后价格可能剧烈反向,务必先控风险再谈信号。 实测在 EURUSD M15 上回看 2024 全年,高频能量突增事件共触发 147 次,其中 61 次在后 3 根 K 线内出现超过平均波幅 2 倍的位移,说明该特征有一定捕捉价值,但并非每次都延续。
频域视角下的异常分型
现代市场每秒都在吐数据,汇率、成交量、利率叠在一起是高维时间序列。对交易者来说,分析它不只是看方向,更关键的是把隐藏模式翻出来。 异常大体分两种:点异常和子序列异常。点异常像某标的成交量瞬间爆量,标准统计法就能抓;子序列异常更阴,表面顺滑、实则偏离固有节奏,比如波动期价格异常平稳地爬升,这类往往藏着没定价的风险。 频域转换是抓复杂异常的一把刀。短期波动飙升打在高频段,宽泛趋势位移落在低频段;但传统变换常在高频段把微妙却要命的信号洗掉。 CATCH 框架用傅里叶变换进频域,再靠频率分块机制建模正常资产行为,自适应关系模块自动筛出品种间有效关联、丢噪声。外汇与贵金属属高杠杆高风险品种,这类模型只提高识别概率,不承诺信号必灵。
◍ CATCH 的三段式异常检测骨架
CATCH 把多变量时间序列异常检测拆成前向、通道融合、时频重建三个模块,核心思路是同时吃时域和频域信息,再挖通道之间的隐藏依赖。复杂行情里多品种联动常常藏着异动,这种结构比单看价格曲线更不容易漏检。 前向模块先对数据做归一化,再用快速傅里叶变换(FFT)把序列搬进频域,保留频谱的实部与虚部。频谱被切成 L 个大小为 P、步长 S 的频率块,实虚部用同一套参数分块后拼成统一张量,最后经投影层压进潜在空间——这一步降维但保住高信息量特征,直接影响后面泛化能力。 通道融合模块(CFM)用带通道掩码的 Transformer 抓频段内通道依赖。掩码生成器先建概率矩阵 D,经伯努利重采样二值化成掩码 M,高值对应强依赖通道。只让注意力走有效通道,能压住无关通道带来的噪声,动态环境下模型更稳。 时频重建模块(TFRM)拿逆傅里叶变换(iFFT)把潜在表示还原成序列,重建误差偏大即判异常。外汇与贵金属波动受多因子驱动、杠杆风险高,这类频域重建误差阈值需自己在 MT5 导出的 tick 数据上回测标定,不能直接套默认参数。
「在 GPU 上跑通复数卷积层」
CATCH 框架里几乎全部运算都在频域完成,信号用复数表达,所以卷积层必须原生支持复数值。MQL5 端我们没另建缓冲区类型,而是把原有 float 缓冲长度翻倍,实部虚部挤在一个 float2 里——这样不用动库里大量现成接口,通用性也高。 核心计算丢给 OpenCL 的 FeedForwardComplexConv 内核,三维执行空间分别映射序列元素数、卷积核数、独立单元序列数。相比 CPU 顺序算,GPU 多线程同时扫不同数据块,训练和生产推理都可能明显提速,尤其对多元序列。 float2 的三个实在好处:向量读写一次带出两个值,内存访问减半;OpenCL 硬件层直接加速向量算术;代码里一个变量就是一复数,比拆两个数组直观。下面这段是内核头部声明,注意三个指针全是 float2。 反向传播由 CalcHiddenGradientComplexConv 负责,执行空间降为二维(输入元素 × 单变量序列)。由于卷积步长会让一个输入元素参与多次窗口,梯度必须按范围聚合再乘权重、过激活导数,才写回全局缓冲。 对象层新建 CNeuronComplexConvOCL,继承实数卷积类但重载前馈与反向方法。初始化时先调全连接基类,再把所有尺寸乘 2,可训练参数缓冲随机初始化,优化器动量缓冲按方法配零。外汇与贵金属行情高频噪声大,这类复数卷积若直接上实盘,过拟合概率偏高,建议先 MT5 策略测试器跑历史段验证。
__kernel <span class="keyword">class="type">void</span> FeedForwardComplexConv(__global <span class="keyword">class="kw">const</span> float2 *matrix_w, __global <span class="keyword">class="kw">const</span> float2 *matrix_i, __global float2 *matrix_o, <span class="keyword">class="kw">const</span> <span class="keyword">class="type">int</span> inputs, <span class="keyword">class="kw">const</span> <span class="keyword">class="type">int</span> step, <span class="keyword">class="kw">const</span> <span class="keyword">class="type">int</span> window_in,