交易技术

Python量化系统真的太慢吗:延迟瓶颈分析与C++重构时机

在这个圈子外头,几乎每隔几个月就会冒出一句断言:“Python做量化,慢了。”这句话像一根细针,悄悄扎进无数开发者的心里——尤其是那些刚刚把回测框架、夜盘监控、因子流水线从其他语言迁移到Python的人。它带来的不只是技术上的不安,更像是一种身份上的自我怀疑:我是不是选错了语言?我是不是该从头学C++?我是不是该重写那套已经跑了半年的策略?…

Python量化系统真的太慢吗:延迟瓶颈分析与C++重构时机

问题在于,量化系统里的“慢”,从来不是一个单一指标。策略研究慢、回测吞吐量低、行情接收抖动、订单发出后迟迟没有回报、夜盘偶尔卡住,这些现象都可能被归结为“Python太慢”,但它们背后的原因完全不同。

真正需要回答的也不是Python能不能做量化,而是:你的策略究竟对什么样的延迟敏感?当前的瓶颈是不是发生在Python代码执行这一层?如果确实到了必须使用C++的阶段,应该重写整个系统,还是只替换最热的那一小段?

我们不妨把“Python太慢”这句话当成一面镜子。照见的也许不是语言问题,而是系统测量不完整、边界没有划清,或者团队正在用别人的交易节拍要求自己。

先把“慢”放回它该在的位置

很多关于Python性能的争论,实际上是把好几件不同的事情混在了一起。量化系统中的延迟不是一条均匀的水管,更像是一连串环环相扣的环节:行情到达、消息解析、数据分发、策略计算、风控判断、订单序列化、柜台接收、交易所撮合,最后才是成交或拒单回报。

其中任何一环出现抖动,最终都可能表现为策略“反应慢”。

可以把一条典型的交易链路拆成几个部分:

  • 网络传输延迟:行情从交易所或行情服务商到达你的网卡,需要经过机房、交换机、网卡驱动和操作系统网络栈。服务器部署位置、网络线路和链路拥塞,都会影响这一段。
  • 行情解析与消息分发:收到数据以后,系统要把原始报文解析成程序能够理解的结构,再分发给策略、风控和监控模块。
  • 策略计算延迟:这里才是Python或C++真正直接参与的地方,包括指标更新、信号生成、仓位计算和订单决策。
  • 风控与订单处理延迟:策略产生信号后,还要经过价格、数量、持仓、资金和交易状态检查,随后完成订单序列化并交给柜台接口。
  • 柜台与交易所侧耗时:订单进入券商或期货公司的柜台后,还要经过协议处理、排队、流控以及交易所撮合。这个部分通常不是策略代码能够单方面控制的。

原稿里把撮合返回延迟近似视为零,这个说法需要谨慎。对于策略端排查,可以把交易所侧视为外部变量,但不能把它从真实延迟里抹掉。尤其是在做盘口策略时,发单、排队、成交回报和撤单之间的时间关系,本身就是策略结果的一部分。

当我们喊出“Python太慢”的时候,往往是因为在不恰当的环节感到了压力。某些夜盘里的延迟抖动,可能不是Python计算慢,而是消息订阅线程在峰值压力下出现积压,或者消费者处理不及时;某些做市策略的下单超时,可能来自柜台的排队、流量控制或连接状态;某些回测数据对不齐,归根结底是时间戳处理、索引对齐或数据切片方式有问题,而不是处理器执行算术运算太慢。

在没有把延迟拆成链路之前,直接给语言定罪,通常只是把系统问题缩写成了一个更容易争论的词。

所以,第一步不是重写,而是测量。至少要知道以下几个时间点:

1. 行情报文什么时候到达网卡或行情接口。

2. 程序什么时候完成解析并交给策略。

3. 策略什么时候生成交易信号。

4. 风控什么时候放行订单。

5. 订单什么时候完成序列化并提交给柜台。

6. 柜台什么时候返回受理、拒单或成交状态。

如果这些时间点没有被记录,程序里所谓的“延迟”通常只是一个模糊印象。日志里写着“行情到了”,不代表策略已经拿到;策略函数返回,也不代表订单已经离开进程;柜台接口返回成功,更不代表订单已经进入交易所撮合队列。

对于延迟问题,平均值也不够。一个系统可能大多数时候都很快,但偶尔出现一次明显卡顿,而恰恰是这次卡顿让策略错过了撤单窗口。至少应该同时观察中位数、较高分位延迟和最大值,还要把延迟按照行情状态、交易时段、消息类型和订单类型拆开看。夜盘开盘、收盘前后、行情突发波动时,系统的表现往往和日常平静时完全不同。

先分清研究速度和交易速度

这是很多团队最容易混淆的地方。

回测耗时长,并不等于实盘下单慢。一个策略每天处理大量历史数据,研究人员希望它更快完成参数扫描,这属于研究吞吐量问题;一个实盘策略从行情变化到发出订单只允许经过很短时间,这属于在线延迟问题。两者都可以使用Python,也都可能需要C++,但优化方向并不相同。

研究阶段更关心:

  • 数据读取是否反复发生;
  • 因子是否被重复计算;
  • 是否存在不必要的数据复制;
  • 是否大量使用低效的逐行操作;
  • 并行任务是否真正使用了多核;
  • 回测框架是否被频繁的Python对象创建拖慢。

实盘阶段则更关心:

  • 消息是否积压;
  • 线程调度是否稳定;
  • 是否发生锁竞争;
  • 是否在关键路径上触发内存分配;
  • 网络和柜台接口是否存在抖动;
  • 风控与订单状态是否会阻塞行情处理。

如果把研究吞吐量和实盘延迟混为一谈,最后很容易得到一个过度昂贵的结论:为了让回测快一点,重写全部交易系统;或者为了让一条低频策略的订单快一点,引入一套团队并不熟悉的底层架构。

Python的几个隐形刹车

假如你已经做过测量,也排除了网络、磁盘、行情接口和柜台的影响,那么Python自身的开销确实需要认真面对。它们不是程序错误,而是Python在易用性、开发效率和运行机制之间做出的取舍。

全局解释器锁影响的是并发方式

在传统的CPython实现中,同一进程内多个线程不能同时执行Python字节码。全局解释器锁降低了许多内存管理和对象操作上的复杂性,但也意味着:如果多个线程都在执行计算密集型Python代码,增加线程数并不会自然带来等比例的并行能力。

这件事经常被误解。并不是“Python不能并发”,而是要区分不同类型的并发。

网络连接、文件读取、等待柜台响应等任务,通常可以通过异步机制、多线程或事件循环提升整体利用率。很多底层扩展在执行数值计算或输入输出时也会释放全局解释器锁,因此Python程序并非只能单线程工作。

真正容易被拖住的是:多个线程同时运行大量纯Python循环,里面又有复杂的对象访问、条件判断和动态类型操作。因子计算、逐条处理行情、逐笔更新订单簿,如果全部落在这条路径上,线程数量增加以后,可能只是让线程彼此争用执行机会。

这也是为什么多进程、向量化计算和底层扩展经常比“再开几个线程”更有效。前者改变了执行模型,后者把热点计算移到了由编译型代码实现的库中。

解释执行开销集中在循环和对象操作里

Python代码需要经过解释器执行。每一个看似简单的操作,背后都可能涉及对象查找、类型判断、引用计数和字节码分派。单个操作的开销也许不值得在意,但当它被放进数百万次循环里,差距就会迅速累积。

量化系统里常见的例子包括:

  • 逐条遍历行情数据,并在每一条记录上创建多个临时对象;
  • 在循环中反复访问数据框的列和索引;
  • 每个订单都重新构造完整的字典、字符串和序列化对象;
  • 每次计算信号都重复查找策略配置;
  • 订单簿更新采用大量高层容器操作,而不是针对数据结构做增量更新。

这类问题并不一定需要C++解决。首先可以检查算法是否合理,再考虑把数据结构改成更适合增量更新的形式,减少对象创建,避免不必要的数据复制。研究端可以优先使用NumPy等底层数值库,让循环落到编译型代码中;实时端则可以把最热的行情解析、订单簿维护或订单序列化路径拿出来单独测量。

需要注意的是,向量化并不是万能药。它非常适合批量数据和规则明确的计算,但订单簿更新、逐笔事件处理和复杂状态机往往具有明显的顺序依赖。把一个天然的事件驱动问题硬改成大规模向量运算,有时会让代码更难维护,却没有真正降低关键路径延迟。

垃圾回收和内存分配会制造抖动

Python的内存管理让开发者不需要手动释放每一个对象,但代价是运行时要不断维护对象生命周期。引用计数通常会及时处理不再使用的对象,循环引用则可能交给垃圾回收机制处理。对于低频或中频策略,这些开销通常不构成决定性问题;对于对尾部延迟极其敏感的系统,问题不在平均速度,而在偶发的停顿。

同样,频繁创建和销毁对象也可能带来抖动。行情高峰期间,如果每一条消息都生成多个临时字典、列表和字符串,系统会同时承受解析、内存分配和回收压力。程序平时看起来很快,到了行情集中涌入的时刻,延迟分布却突然拉长。

优化方向可以包括:

  • 让消息对象尽量复用,减少重复分配;
  • 使用更紧凑的数据结构保存高频状态;
  • 把监控、日志和策略关键路径分开,避免日志格式化阻塞主线程;
  • 避免在订单关键路径中进行复杂字符串拼接;
  • 将不影响即时决策的统计、落盘和展示任务异步处理;
  • 对高峰时段的内存使用和垃圾回收行为单独压测。

这里依然不需要急着把“C++”写进结论。只有当这些调整完成以后,关键路径仍然达不到策略需要的稳定性,C++重构才真正有了工程上的理由。

大多数策略并不需要微秒级响应

关于Python延迟对策略收益的影响,不能用一个放之四海而皆准的百分比来概括。不同市场、品种、策略持仓周期、订单类型和竞争环境,决定了延迟的意义。把“绝大多数策略都不受影响”写成精确比例,看起来有说服力,实际上容易掩盖条件。

更稳妥的判断是:对于日频、分钟级、部分秒级以及许多普通Tick级策略,Python带来的运行时开销通常不是收益的第一决定因素。策略信号的质量、数据处理是否正确、交易成本估计是否充分、仓位控制是否稳定,往往比那一点语言层面的延迟更重要。

这并不意味着延迟不重要。它意味着要把延迟放回策略的时间尺度里看。

如果一个策略的持仓周期是几天,信号由收盘数据计算,订单在下一个交易时段执行,那么从信号生成到订单提交之间的少量程序开销,通常不会改变策略的核心逻辑。此时真正值得优化的可能是数据清洗、复权处理、因子计算、组合构建和回测并行效率。

如果一个策略持仓时间是几秒到几分钟,需要根据一篮子因子合成信号,Python通常依然可以胜任。更值得优先检查的是:是否每次行情更新都重复计算整个因子集合,是否反复扫描全部持仓,是否因为对象复制造成不必要的等待,是否在等待柜台回复时堵住了其他任务。

如果一个策略依赖盘口的微小变化,在极短时间内连续撤单、改价和重新挂单,那么问题就完全不同了。此时不仅要看语言执行速度,还要看网卡、内核网络栈、行情协议、订单簿数据结构、线程模型和柜台接口。Python可以继续承担策略编排和监控,但把行情解析、订单簿维护和下单网关全部放在纯Python循环里,通常会越来越难满足稳定的尾部延迟要求。

系统组件Python更适合承担的部分C++更适合承担的部分主要关注点
因子研究与数据清洗数据处理、研究脚本、实验编排特定高耗时算子研究吞吐量、数据复制和内存占用
策略建模与回测策略逻辑、参数管理、结果分析回测引擎中的热点内核批量计算效率和结果一致性
行情接收接口封装、订阅管理、状态监控高并发解析、低延迟分发峰值吞吐和消息积压
实时风控规则配置、告警、异常处理高频计算、状态维护关键路径稳定性
订单网关交易流程编排、重试和监控报文序列化、连接管理尾部延迟和连接可靠性
盘口做市参数控制、策略调度订单簿和快速决策循环微秒级响应与抖动
研究工具和可视化大部分功能通常没有必要开发效率和可维护性

这张表不是在给语言划分高低,而是在提醒我们:语言选择应该落到具体的物理环节。只有当系统真正卡在某一条关键路径上,那一条路径的实现语言才值得被拿出来讨论。

从profile开始,而不是从重写开始

“先做测量,再谈选择”听起来朴素,却是很多系统重构中最容易被跳过的一步。原因也很好理解:怀疑Python慢,比定位瓶颈容易得多;宣布要用C++重写,也比面对一份混乱的性能报告更有行动感。

但性能分析必须尽量贴近真实交易流程。

回测里可以分别记录数据加载、指标计算、信号生成、组合更新和订单模拟的耗时。实盘里则要把行情接收、消息解析、策略回调、风控、订单发送和回报处理拆开记录。不要只在函数外面套一个计时器,然后用总耗时推断内部原因。总耗时只能告诉你“慢了”,不能告诉你慢在等待、计算、锁、网络还是内存。

用分布看问题,不只看平均值

平均延迟很容易让人放心,也很容易骗人。

假设一段策略代码平时执行得很快,但在行情集中到达时偶尔出现明显停顿。平均值可能依然漂亮,然而对于撤单和追价策略来说,真正影响结果的恰恰是那几个异常时刻。

因此,性能报告至少应该回答:

  • 平静行情和剧烈行情下,延迟分布有没有明显变化;
  • 首次下单和连续下单的耗时是否不同;
  • 不同订单类型是否经过不同的柜台路径;
  • 行情处理和订单处理是否共享线程;
  • 日志、监控和落盘是否会进入关键路径;
  • 延迟增加时,消息是被丢弃、堆积,还是重复处理;
  • 系统重启、重连和夜盘切换时,是否会出现特殊抖动。

如果一个模块的平均耗时不高,但尾部延迟不断放大,优先要查的是排队、锁竞争、连接状态和资源争用。直接把代码翻译成C++,并不能自动消除这些问题。

把性能目标写成策略语言

“低延迟”本身不是目标。目标应该和策略行为绑定。

对于一个分钟级策略,可能更重要的是信号计算在行情批次结束后稳定完成,而不是把单次函数调用压到极限。对于一个撤单敏感的做市策略,则需要明确从行情变化到撤单请求发出的时间预算,还要观察在消息高峰期是否仍然稳定。

可以把目标写成这样的工程问题:

  • 行情到达后,策略允许多长时间完成决策;
  • 订单在超过什么时间后,继续发送已经没有意义;
  • 系统能否承受某个高峰时段的消息量;
  • 关键路径的高分位延迟是否满足策略需求;
  • 在柜台短暂异常时,系统是降级、排队还是直接停止下单;
  • 策略错过一次机会时,是否会因为状态不同步产生更大的风险。

一旦目标这样写出来,C++就不再是“更专业的语言”,而只是若干解决方案中的一个。你也许需要的是改线程模型,也许是换数据结构,也许是拆分服务,还可能只是把一段不必要的同步日志移出交易路径。

真正接近高频边界时,Python会遇到什么

当订单处理要求进入非常短的时间尺度,Python的局限就会从理论问题变成工程问题。

高频系统并不只是把一个循环写得更快。它要求整个链路的抖动都可控:行情消息不能轻易积压,订单簿更新必须及时,风控判断不能被其他任务阻塞,内存分配和锁竞争要尽量减少,网络路径还要有稳定的行为。

在这样的系统里,平均执行速度不是唯一指标。更棘手的是不可预测性。解释器调度、对象创建、垃圾回收、线程争用以及高层接口的额外封装,都可能让尾部延迟出现难以接受的波动。

这也是C++常被用于低延迟交易核心的原因之一。它可以提供更细的内存布局控制、数据结构控制和线程调度控制,也能更直接地接近底层网络和硬件。但这并不意味着C++天然正确。C++代码同样可能因为锁、内存分配、缓存未命中、异常处理、日志阻塞和错误的并发设计而变慢。

C++不是延迟问题的魔法按钮,它只是允许你把更多控制权拿回手里,同时也把更多责任交给了团队。

如果你的策略已经属于盘口做市、极短周期套利或对排队位置高度敏感的订单流策略,就应该认真评估底层语言。但评估对象不能只有策略函数,还包括:

  • 行情协议的解析方式;
  • 订单簿的数据结构;
  • 订单和成交状态机;
  • 风控规则的执行路径;
  • 网络线程与策略线程的关系;
  • 订单序列化和发送机制;
  • 重连、拒单、撤单失败时的处理;
  • 监控、日志和故障切换方案。

只改其中一个函数,可能不会带来预期效果;把所有模块同时重写,则可能把风险扩大到无法控制。低延迟系统最忌讳“只看速度,不看状态”。

混合架构往往是更稳的路径

如果经过测量,确实发现某一段Python代码已经成为关键瓶颈,我不建议立刻采取“今天彻底重写C++”的方案。量化系统和普通软件不同,它的正确性不仅体现在程序能不能运行,还体现在行情状态、持仓状态、订单状态和风控状态能不能长期保持一致。

更温和的做法是采用混合架构:保留Python在上层承担策略编排、参数下发、研究分析、监控展示和部分风控规则,把对延迟极其敏感的组件逐步下沉到C++。

常见的拆分方式包括:

  • 用C++实现行情协议解析,Python负责订阅管理和策略回调;
  • 用C++维护高频更新的订单簿,Python只接收已经整理好的状态;
  • 用C++完成订单序列化和发送,Python保留交易意图与参数控制;
  • 将计算密集的因子或组合算法编译成独立扩展;
  • 把实时交易和研究回测分成不同进程,避免研究任务影响交易进程;
  • 使用共享内存或轻量消息机制传输结构化数据,减少重复序列化。

在Python与C++之间建立连接,可以使用PyBind11、ctypes或Cython等方式。PyBind11适合把C++类和函数封装成Python可以直接调用的对象;ctypes依赖更少,但需要严格管理函数签名、内存和跨平台问题;Cython则适合从Python代码出发,逐步把热点部分改成更接近C级别的实现。

进程间通信则需要根据目标取舍。共享内存可以减少数据拷贝,但同步、数据格式和故障恢复都需要自行设计;消息队列更容易解耦模块,使用起来灵活,却会引入序列化和调度开销。所谓低延迟,不是把所有东西都塞进共享内存,而是确认这段通信确实位于关键路径,并且收益足以覆盖复杂度。

混合架构的价值,在于让改造保持可逆。你可以先把一段最热的订单簿更新逻辑替换掉,再用同一份回放数据比较结果;可以先让C++模块以旁路方式运行,只记录结果而不真正下单;也可以保留Python版本作为基准实现,用于回归测试和故障切换。

这比一次性重写全部系统更容易验证,也更容易在夜盘前后回滚。

不要让语言边界变成系统边界

混合架构最常见的失败,并不是C++写得不够快,而是模块之间的接口没有设计好。

如果Python和C++之间传递的是大量临时对象,频繁发生深拷贝,那么底层代码省下来的时间可能会被接口开销吃掉。如果两边各自维护一套订单状态,状态同步又没有明确的唯一来源,那么系统会出现“策略认为已撤单、柜台认为仍在挂单”的危险情况。

因此,在划分模块时需要先明确:

  • 哪个模块拥有行情状态的最终解释权;
  • 哪个模块负责生成订单意图;
  • 哪个模块负责决定订单是否可以发出;
  • 订单状态由谁更新、谁广播;
  • Python侧收到的是原始事件还是整理后的事件;
  • C++模块不可用时,Python是否可以安全降级;
  • 两种实现如何使用同一批历史事件做回放验证。

接口越少越好,但接口不能含糊。一个好的接口不是把所有底层细节暴露给上层,而是把稳定、可验证的状态和事件传递出去。

什么时候才是重构时机

“要不要上C++”最终是一个工程决策,而不是语言偏好。可以从几个方向观察。

首先,看瓶颈是否稳定复现。如果只有一次夜盘卡顿,不能据此证明整个Python系统需要重写。需要在不同交易日、不同消息压力和不同连接状态下重复观察,确认问题确实来自同一条代码路径。

其次,看优化是否已经接近Python层的上限。算法、数据结构、线程模型、日志策略和输入输出都没有明显问题,热点仍然占据关键路径,这时才有必要下沉到C++。

再次,看策略收益是否真的会因延迟改善而改变。延迟降低以后,是否能减少撤单失败、提高成交概率、降低滑点,或者改善风险控制?如果收益链条说不清楚,单纯追求更低的延迟,很容易变成工程团队自我满足。

最后,看团队是否能承担重构后的维护责任。C++带来的不仅是更低的运行时开销,还有编译、部署、内存安全、跨平台、调试、崩溃恢复和版本兼容问题。一个团队如果没有足够的底层开发和故障排查能力,贸然重写可能让系统在纸面上变快,在生产环境里却更脆弱。

我会把以下几种情况视为比较明确的重构信号:

1. 关键路径的高分位延迟长期超过策略允许的时间窗口,而不是偶发异常。

2. 性能分析已经确认主要耗时来自纯Python计算、对象操作或解释器路径。

3. 网络、柜台、数据库和日志等外部因素已经被单独排除。

4. 策略的成交质量或风控结果确实与这段延迟直接相关。

5. 团队能够建立回放、对照、灰度和回滚机制,而不是只准备一份“新版本”。

6. 重构后的收益可以被观测,例如成交率、撤单及时性、滑点或系统稳定性有所改善。

反过来,如果系统只是回测速度不够,先优化数据读取、任务调度和向量计算;如果实盘偶尔卡顿,先查消息积压、锁、日志和柜台连接;如果策略从来没有对延迟提出明确要求,那么C++可能只是一个让焦虑暂时安静下来的选择。

写到这里,也写给自己

技术栈的选择,是一种很安静的自我审视。

你不能因为某位前辈用C++写了一整套量化系统,就认为自己必须走到那里。那是把别人的交易节拍当成自己的锚,也是量化圈里很常见的一种锚定效应。你也不能因为已经花了半年时间打磨Python代码,就在明明需要更短响应的地方继续将就。那是沉没成本替你做决定。

Python的价值,从来不只是“写起来快”。它让策略研究、数据分析、回测验证、风险监控和交易编排可以在较短时间内形成闭环。对于需要频繁试错的策略团队,这种迭代速度本身就是竞争力。很多策略还没有证明逻辑有效,就先被复杂的底层工程包围,最后损失的不是几百微秒,而是几个月的研究窗口。

C++的价值也不只是“跑得快”。它适合那些已经知道自己要控制什么、为什么要控制、控制之后如何验证的系统。没有明确边界时,C++只会把一个模糊的问题变成更难修改的代码。

用C++不是逃离Python,是给焦虑划出清晰的边界;继续使用Python也不是软弱,而是为真实的策略节奏留下余地。

如果要给正在犹豫的人留一个小作业,我建议不要先打开编辑器创建C++工程,而是打开最近一次夜盘监控日志,找出延迟最高的几个时间点,逐个查看那几毫秒里发生了什么:Python线程是在计算,还是在等待?行情推送有没有积压?柜台连接有没有流控?日志有没有阻塞?订单状态是不是已经和本地记录不一致?

你会发现,绝大多数时候,慢的不是Python,而是整条链路里某个还没有被看清的环节。

而当这件事终于被看清,焦虑往往会自己松下来半口气。真正成熟的量化系统,不是把所有代码都写成最快的语言,而是让每一层都承担与自己相匹配的工作:Python负责变化和表达,C++负责那些已经被测量证明必须极快的路径,网络、柜台和风控则不再被藏在“语言性能”这个大口袋里。

所以,关于Python量化交易延迟与C++重构界限,我更愿意给出一个不那么响亮、但更可靠的判断:先按照策略的时间尺度设计系统,再按照测量结果寻找瓶颈,最后才决定是否重构。不要为了追赶一个想象中的高频世界,提前牺牲仍然有价值的开发效率;也不要在真正需要微秒级响应时,把语言偏好当成继续拖延的理由。

技术最终还是要回到交易本身,回到策略、风险和执行之间那条真实的链路。语言只是其中一段。把这一段放在正确的位置,系统通常就已经快了一半。

Related reading: 量化交易服务器的部署抉择:物理托管与云服务器的延迟与成本博弈 and 量化策略的终极博弈:为什么高质量数据比复杂算法更决定成败.

常见问题

Python做量化真的太慢了吗?
Python本身并非量化系统变慢的唯一原因。很多时候所谓的“慢”是由于系统测量不完整、消息积压、锁竞争或不合理的架构设计导致的,而非Python语言执行速度本身。
什么时候应该考虑用C++重写量化系统?
当关键路径的高分位延迟长期超过策略允许的时间窗口,且通过优化算法、数据结构及线程模型仍无法解决时,才应考虑将热点路径下沉至C++。
回测速度慢和实盘下单慢是一回事吗?
不是。回测耗时长属于研究吞吐量问题,主要受数据读取、因子计算和并行效率影响;实盘下单慢属于在线延迟问题,受消息积压、线程调度、网络及柜台接口等因素影响。
如何通过混合架构提升Python量化系统的性能?
可以保留Python负责策略编排和监控,将行情解析、订单簿维护或订单序列化等对延迟极其敏感的组件用C++实现,并通过PyBind11等方式进行交互。
在排查量化系统延迟时,应该关注哪些指标?
不应只看平均值,而应关注中位数、较高分位延迟和最大值。同时需要拆解行情到达、解析、策略计算、风控放行及柜台返回等关键时间点,观察不同行情压力下的系统表现。