3. 交易信号处理核心概念:Tick级数据与K线数据、订单簿数据结构、信号生成逻辑、延迟来源分析

各位同学,今天我们来聊聊交易信号处理里最基础、也最绕不开的几个概念。说实话,很多做量化的人,写了几年策略,可能都没真正搞懂Tick数据和K线数据到底差在哪。我当年刚入行时也踩过这个坑——用K线回测跑得飞起,一上实盘就亏钱,后来才发现是数据粒度的问题。

3.1 Tick级数据与K线数据

Tick级数据,说白了就是交易所每一笔成交的原始记录。它包含:

  • 成交价格
  • 成交数量
  • 成交时间(精确到微秒甚至纳秒)
  • 成交方向(买方主动还是卖方主动)

我在项目中遇到过最头疼的事:某交易所的Tick数据时间戳居然有重复。你想想看,同一微秒内出现十几笔成交,这怎么处理?后来我不得不加一个自增序列号来区分。

核心要点:Tick数据是交易信号处理的「原材料」。FPGA的优势就在于能直接处理这种原始数据流,不需要像CPU那样先攒一批再处理。

K线数据则是Tick数据的「压缩版」。它把一段时间内的成交汇总成四个价格:开盘价、收盘价、最高价、最低价,外加成交量。嗯,这里要注意:K线会丢失大量细节信息。比如两根完全相同的日K线,背后的Tick走势可能天差地别。

对比维度 Tick级数据 K线数据
数据量 极大(每秒数千笔) 小(每分钟1根)
信息完整度 100% 丢失细节
FPGA处理难度 中等(流水线设计) 简单
策略适用性 高频、做市 中低频、趋势

3.2 订单簿(Order Book)数据结构

订单簿,就是交易所里所有未成交的买单和卖单的集合。它分为两个部分:

  • 买盘(Bid):按价格从高到低排列
  • 卖盘(Ask):按价格从低到高排列

每个价格档位都对应一个委托量。比如:

卖五:10.05  200股
卖四:10.04  150股
卖三:10.03  300股
卖二:10.02  100股
卖一:10.01  500股
-------------------
买一:10.00  400股
买二:9.99   600股
买三:9.98   200股
买四:9.97   300股
买五:9.96   100股

我个人习惯用FPGA维护一个「双端优先队列」来实现订单簿。为什么?因为每次Tick更新时,你需要在微秒级内完成插入、删除、修改操作。CPU做这个要几十微秒,FPGA可以做到纳秒级。

实战技巧:我曾经用FPGA实现过一个256档的订单簿,每档用独立的比较器并行处理。结果呢?更新延迟从CPU的50微秒降到了FPGA的80纳秒。整整600倍的提升。

3.3 信号生成逻辑:以均线金叉为例

均线金叉,就是短期均线上穿长期均线,视为买入信号。反过来死叉就是卖出信号。听起来简单,对吧?但在FPGA里实现,有几个坑要避开。

首先,均线计算需要滑动窗口。比如5周期均线,就是最近5个Tick价格的均值。FPGA里怎么做?用移位寄存器+累加器:

// 伪代码示意
reg [31:0] price_buffer [0:4];  // 5级移位寄存器
reg [31:0] sum;

always @(posedge clk) begin
    if (new_tick) begin
        sum <= sum + new_price - price_buffer[4];
        price_buffer <= {new_price, price_buffer[0:3]};
    end
end

assign ma5 = sum / 5;

嗯,这里要注意:除法在FPGA里很贵。我建议用移位代替除法,或者用查找表。比如除以5可以近似为乘以0.2,而0.2可以用定点数表示。

金叉检测的逻辑更简单:比较两个均线的当前值和上一个值。如果ma5_prev < ma10_prev 且 ma5_curr > ma10_curr,那就是金叉。

避坑指南:我曾经在实盘中发现金叉信号频繁闪烁,后来查了半天,原来是均线计算时用了浮点数。FPGA里浮点运算会引入不确定延迟。换成定点数后,问题立刻解决。

3.4 延迟来源分析

做高频交易,延迟就是成本。每一微秒的延迟,都可能让你错过最佳成交价。我们来拆解一下延迟从哪来:

3.4.1 网络延迟

  • 物理距离:光速在光纤中约20万公里/秒,每公里5微秒
  • 交换机处理:每跳约1-10微秒
  • 协议开销:TCP比UDP慢,因为要握手和重传

我见过最极端的案例:某团队为了省2微秒,把服务器从机房搬到了交易所楼顶,用微波通信代替光纤。你想想看,这得是多大的利润驱动?

3.4.2 操作系统延迟

  • 中断处理:网卡中断CPU,上下文切换约1-10微秒
  • 调度延迟:进程被其他任务抢占,可能几十微秒
  • 内存分配:malloc可能触发缺页中断,几百微秒

说白了,操作系统就不是为实时性设计的。你永远不知道下一秒你的进程会不会被调度出去。

3.4.3 硬件延迟

  • CPU流水线:分支预测失败,浪费10-20个时钟周期
  • 缓存未命中:L1缓存3-5纳秒,L3缓存30-50纳秒,内存100纳秒
  • PCIe传输:数据从网卡到CPU内存,约1-5微秒

FPGA为什么快?因为它绕过了所有这些。数据直接从网卡进FPGA逻辑,不需要经过CPU、操作系统、内存。整个路径的延迟可以控制在100纳秒以内。

总结一下:网络延迟你控制不了太多(除非你租专线),OS延迟可以通过FPGA完全规避,硬件延迟是FPGA的主场。所以,用FPGA做交易信号处理,本质上是把「不可控的延迟」变成「可控的延迟」。

交易信号处理全流程与延迟分布 交易所数据源 网络传输 延迟:1-100μs OS内核处理 延迟:10-100μs CPU信号处理 延迟:50-500μs FPGA直接处理 延迟:50-200ns 信号输出 延迟:<1μs CPU路径总延迟:约100-700μs | FPGA路径总延迟:约1-5μs | 差距:100倍以上 数据源 高延迟环节 低延迟环节

这张图很直观地展示了为什么FPGA在交易信号处理中不可替代。CPU路径要经过网络、OS、内存、CPU流水线,每一步都在消耗宝贵的微秒。而FPGA路径,数据从网卡进来直接进逻辑,中间没有任何「商量」的余地。

我个人建议:如果你做的是T+0级别的策略,用CPU就够了。但如果你要做Tick级别的信号处理,尤其是做市商策略,FPGA几乎是唯一选择。我见过太多团队在CPU上优化到极致,最后还是差那么几微秒,结果被FPGA团队按在地上摩擦。

最后说一句:延迟不是唯一指标,但它是高频交易的「入场券」。没有低延迟,你的策略再好也执行不出去。这就是为什么我们要学FPGA加速交易信号处理。

专注资料整理