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做交易信号处理,本质上是把「不可控的延迟」变成「可控的延迟」。
这张图很直观地展示了为什么FPGA在交易信号处理中不可替代。CPU路径要经过网络、OS、内存、CPU流水线,每一步都在消耗宝贵的微秒。而FPGA路径,数据从网卡进来直接进逻辑,中间没有任何「商量」的余地。
我个人建议:如果你做的是T+0级别的策略,用CPU就够了。但如果你要做Tick级别的信号处理,尤其是做市商策略,FPGA几乎是唯一选择。我见过太多团队在CPU上优化到极致,最后还是差那么几微秒,结果被FPGA团队按在地上摩擦。
最后说一句:延迟不是唯一指标,但它是高频交易的「入场券」。没有低延迟,你的策略再好也执行不出去。这就是为什么我们要学FPGA加速交易信号处理。