一、高频做市系统概述
各位同学好,我是老张。在量化交易这行摸爬滚打了十来年,今天咱们聊聊高频做市系统。
说实话,我第一次接触高频做市是在2015年。那时候刚进一家自营交易公司,看到屏幕上那些订单以微秒级的速度飞来飞去,说实话有点懵。后来慢慢才明白,这玩意儿说白了就是——用最快的速度,赚最小的价差。
什么是高频做市
高频做市,英文叫High-Frequency Market Making。你想想看,交易所里每天有成千上万的买卖单子。有人想买,有人想卖,但他们的价格不一定能对上。
做市商干的事就是:同时挂出买单和卖单。比如比特币现价30000美元,我挂29999买,挂30001卖。有人卖给我,我就赚1美元;有人从我这儿买,我也赚1美元。
听起来简单吧?但这里有个坑——价格会波动。万一价格突然暴跌,我手里囤了一堆高价货,那就亏大了。
核心要点:高频做市不是赌博,而是管理风险。你赚的不是方向判断的钱,而是流动性的钱。
我见过太多人把做市当成了趋势交易。嗯,结果嘛...基本都亏得很惨。
为什么选择C++与Python混合编程
这个问题我经常被问到。有人觉得用Python就够了,有人觉得必须全上C++。我的答案是:小孩子才做选择,成年人全都要。
咱们来看看各自的优势:
| 特性 | C++ | Python |
|---|---|---|
| 执行速度 | 纳秒级 | 毫秒级 |
| 开发效率 | 低(写一行调半天) | 高(一天能写几百行) |
| 内存控制 | 精细到字节 | 自动管理 |
| 生态库 | 偏底层 | 数据分析、机器学习丰富 |
| 调试难度 | 高(段错误让人崩溃) | 低(报错信息友好) |
你看,这两者其实是互补的。我个人习惯是:C++负责核心交易引擎,Python负责策略研究和回测。
举个例子,我曾经接手过一个项目,全用Python写的做市系统。回测跑得飞快,一上线就崩。为什么?Python的GIL锁在极端行情下直接卡死,订单发不出去。后来我们把订单管理模块用C++重写,Python只做数据分析和监控界面,系统就稳了。
我的建议:别想着用Python做高频交易的核心逻辑。它适合做"大脑",不适合做"手脚"。
系统整体架构设计
好了,咱们来看看一个典型的高频做市系统长什么样。我画了一张图,你一看就明白:
这张图我画得比较简洁,但核心思想都在里面了。从上到下分四层:
第一层:交易所接口层
这一层必须用C++写。为什么?因为延迟就是金钱。你想想看,别人用C++写的程序,从收到行情到发出订单只要5微秒。你用Python,光解析一个JSON就要50微秒。这45微秒的差距,在极端行情下可能就是几十万的盈亏。
我记得有一次做币安的做市,行情剧烈波动时,Python的WebSocket库直接丢包了。后来换成C++的libwebsockets,稳如老狗。
第二层:核心交易引擎
这是整个系统的心脏。包括:
- 订单管理:维护订单状态机,处理撤单、改单
- 风险管理:实时计算敞口、最大亏损
- 做市策略:报价生成、价差调整
- 行情处理:深度合并、价格计算
这一层我强烈建议全用C++。我曾经见过有人用Python写订单管理,结果在高并发下订单状态错乱,同一个订单被成交了两次。嗯,那天的亏损够买一辆车了。
避坑指南:订单状态机一定要用有限状态机实现,别用if-else硬写。我曾经吃过这个亏,后来老老实实用了boost::statechart。
第三层:数据桥接层
这一层是C++和Python的"翻译官"。C++算好的数据怎么传给Python?Python的策略信号怎么发给C++?
我常用的方案:
- 共享内存:最快,适合高频数据
- ZeroMQ:灵活,适合异步通信
- Redis:方便,适合监控数据
我个人偏爱共享内存。为什么?因为它零拷贝。C++往共享内存里写数据,Python直接从里面读,中间没有任何网络开销。
第四层:策略研究与监控层
这一层就是Python的天下了。数据分析用pandas,机器学习用scikit-learn,可视化用matplotlib。开发效率极高。
我一般在这层做三件事:
- 回测:用历史数据验证策略
- 监控:实时看盈亏、持仓、延迟
- 调参:动态调整做市参数
这里有个小技巧:回测和实盘用同一套策略代码。我见过有人回测写一套,实盘又写一套,结果回测赚得盆满钵满,实盘亏得底朝天。为什么?因为两套代码有差异。
核心原则:回测代码 = 实盘代码。唯一的区别是数据来源不同。
好了,第一章的内容就到这里。这套架构我用了好几年,在多个交易所都验证过。当然,具体实现时还有很多细节,咱们后面慢慢聊。
公众号:蓝海资料掘金营,微信deep3321