一、FPGA交易系统概述:高频交易与FPGA的渊源

大家好,我是你们这门课的主讲人。在量化交易这个圈子里摸爬滚打了十几年,我见过太多人一上来就问我:「FPGA做交易,到底快在哪?」

嗯,这个问题问得好。咱们今天就从根上聊起。

1.1 高频交易为什么需要FPGA?

先说说高频交易。说白了,高频交易就是抢时间。别人还在犹豫要不要下单,你的系统已经完成了从行情解析、策略计算到订单发送的全流程。

传统做法是用CPU。CPU很灵活,什么都能干。但问题也在这——它什么都能干,就意味着它什么都不是最快的。CPU内部有复杂的指令流水线、分支预测、缓存层级……这些设计在通用计算场景下是优势,但在高频交易里,反而成了拖累。

我2015年参与过一个项目,客户用C++写的策略,在Xeon处理器上跑,延迟大概在10微秒左右。听起来很快对吧?但你知道对手方用的是什么吗?FPGA。他们的延迟只有几百纳秒。10微秒对几百纳秒,差了整整一个数量级。结果可想而知,客户的订单永远慢人一步。

核心差异:CPU是软件执行,FPGA是硬件流水线。FPGA的延迟是确定的、可预测的,而CPU的延迟受操作系统调度、缓存命中率等因素影响,波动很大。

1.2 FPGA在交易系统中扮演什么角色?

FPGA在交易系统里,通常干三件事:

  • 行情解析——把网络数据包里的行情数据,快速解析成策略能用的格式。比如从UDP包里提取出买卖盘口、成交记录。
  • 策略计算——在硬件里实现交易逻辑。比如简单的价差套利、统计套利、做市策略。
  • 订单发送——把策略生成的订单,通过网卡直接发到交易所。省去了操作系统协议栈的开销。

这三件事,每一件都要求极低的延迟和极高的确定性。FPGA正好擅长这个。

我记得有一次,一个做市商客户找到我,说他们的策略在CPU上跑,行情来了之后要等好几微秒才能做出反应。我帮他们把策略移植到FPGA上,延迟降到了200纳秒以内。客户当时就愣住了:「这……这真的能行?」

能行。而且很稳。

1.3 课程整体架构与学习路径

这门课一共30章,咱们从零开始,一步步搭建一个完整的FPGA交易系统。我把它分成四个阶段:

阶段 章节 核心内容
基础篇 1-8章 FPGA基础、Verilog语法、时序约束、仿真调试
行情篇 9-16章 网络协议栈、UDP/TCP解析、行情数据解码、多路行情合并
策略篇 17-24章 订单簿维护、价差计算、做市策略、风险控制
系统篇 25-30章 PCIe通信、DMA传输、系统集成、性能调优

我个人建议的学习路径是这样的:

  1. 先打好基础——前8章别跳。Verilog语法、时序约束这些,是后面所有内容的地基。地基不稳,后面盖楼会塌。
  2. 动手仿真——每学完一章,都去写个简单的仿真测试。不要光看不练。FPGA这东西,看十遍不如写一遍。
  3. 从简单策略开始——别一上来就想做复杂的统计套利。先做个简单的价差监控,跑通了再慢慢加功能。
  4. 重视时序——我见过太多人,代码写好了,综合也过了,但上板就跑不起来。为什么?时序没收敛。后面我会专门讲怎么处理时序问题。

小提示:如果你之前没有FPGA经验,别怕。这门课从最基础的Verilog语法讲起。但如果你有C/C++基础,学起来会快很多——很多概念是相通的。

1.4 一个典型的FPGA交易系统长什么样?

下面这张图,是我自己画的一个典型FPGA交易系统的架构。你看一眼,大概就能明白各个模块之间的关系。

FPGA交易系统架构图 网络接口层 10G/25G/100G Ethernet MAC · UDP/IP 协议栈 · 数据包过滤 PTP 时间同步 · 多路数据流分发 行情处理层 行情解码(Level1/Level2) · 订单簿维护 · 快照与增量合并 行情数据缓存 · 多交易所行情同步 策略计算层 价差计算 · 统计套利 · 做市策略 · 信号生成 风险控制(价格检查、仓位限制、自成交预防) 订单执行层 订单编码 · 订单发送 · 订单状态跟踪 · 撤单处理 PCIe DMA 通信 · 与主机端策略交互

你看,从网络接口到行情处理,再到策略计算,最后到订单执行,整个流水线都在FPGA内部完成。数据流是单向的、确定的,没有中断、没有上下文切换、没有缓存抖动。

这就是FPGA能跑赢CPU的核心原因。

注意:FPGA不是万能的。它适合做确定性的、流水线化的计算。如果你的策略需要大量的浮点运算、复杂的机器学习模型,那FPGA可能不是最优选择。这时候可以考虑CPU+FPGA的异构方案。

1.5 我的一些经验之谈

做FPGA交易系统这么多年,我踩过不少坑。说几个印象深刻的:

  • 时序问题——我曾经有一个项目,代码在仿真里跑得好好的,上板就出问题。查了三天,发现是时钟域同步没做好。从那以后,我每写一个跨时钟域的模块,都会加上同步器。
  • 资源估算——很多人低估了FPGA的资源消耗。尤其是BRAM和DSP。我建议你在写代码之前,先估算一下每个模块的资源占用,留出20%的余量。
  • 调试手段——FPGA调试比软件难得多。你不能printf,不能打断点。所以一定要善用仿真和ILA(集成逻辑分析仪)。我个人的习惯是:每写完一个模块,先做独立的仿真验证,再集成到系统中。

嗯,这些经验后面都会详细展开。今天先到这里。

下一章,咱们开始动手写第一行Verilog代码。


公众号:蓝海资料掘金营,微信deep3321