Quant

量化工程与工具链概览

设计从版本化数据、研究任务和模型制品到订单、监控和复现的工程依赖链。

量化工程与工具链

本章从工程与系统的角度,概览一个典型量化研究与交易平台的技术栈和工具链。相比前几章的资产定价与策略设计,这一章更偏“基础设施”,但对于策略能否在现实世界中稳定、可扩展地运行至关重要。

在理论层面,可以把整个量化平台看作一个离散时间的决策系统:在每个时间步 tt,系统从市场和内部状态中获取信息 X0:tX_{0:t},生成控制(决策)utu_t(目标持仓或订单),随后在市场中得到反馈 YtY_t(成交、收益、风险等)。用符号表示就是一个策略–环境闭环:

ut=πθ(X0:t,Z0:t),Yt=M(ut;market),u_t = \pi_\theta(X_{0:t}, Z_{0:t}), \qquad Y_t = \mathcal{M}(u_t; \text{market}),

其中 πθ\pi_\theta 是由研究平台训练出来、在生产系统中运行的“策略 + 风控 + 执行”组合映射,ZtZ_t 代表内部状态(如风控限额、系统负载)。

本章的目标,是把前几章的理论和统计工具放在这样一个工程系统的框架下去理解:数据平台决定 XtX_t 的质量和可用性,研究平台决定 πθ\pi_\theta 的形式与参数,交易与执行系统决定 M\mathcal{M} 的延迟和成本,风险与监控系统则把 {Yt}\{Y_t\} 变成可解释和可预警的指标序列。

1. 典型系统组成

一个相对完整的量化平台通常包括以下子系统,可以抽象成一个有向无环图(DAG):节点是不同子系统,边是数据与任务的依赖关系:

  1. 数据平台(Data Platform)
    • 负责数据采集、清洗、存储与服务;
  2. 研究平台(Research Platform)
    • 提供回测框架、因子库、统计工具等;
  3. 交易与执行系统(Trading & Execution System)
    • 负责策略信号的接收、订单生成与下单、成交回报处理;
  4. 风险与监控系统(Risk & Monitoring)
    • 实时监控风险指标、策略表现与系统健康状态;
  5. 调度与任务编排(Scheduling & Orchestration)
    • 管理批处理任务(夜间回测、报表生成)与实时任务(行情处理、策略计算)。

不同机构在实现细节和技术选型上差异很大,但上述功能模块在概念上是类似的。形式化一点可以写成:

Platform=(D,R,T,K,S),\text{Platform} = (\mathcal{D}, \mathcal{R}, \mathcal{T}, \mathcal{K}, \mathcal{S}),

其中 D\mathcal{D} 是数据平台,R\mathcal{R} 是研究平台(research)、T\mathcal{T} 是交易与执行系统(trading)、K\mathcal{K} 是风险与监控(risk & monitoring)、S\mathcal{S} 是调度与任务编排(scheduling)。后续各节依次拆解这些组件。

2. 数据平台:从原始数据到“可回测数据”

2.1 数据分层

为了支持研究与生产的双重需求,一个常见的做法是将数据平台分层,并显式区分数据转换算子:

  1. Raw 层Draw\mathcal{D}^{\text{raw}}):
    • 基本不做处理地存储从交易所、数据商、内部系统等获取的原始数据;
    • 保留原始时间戳、字段和格式,便于追溯和重新清洗。
  2. Clean 层Dclean\mathcal{D}^{\text{clean}}):
    • 进行字段标准化、缺失值处理、异常值过滤等;
    • 对不同数据源的数据进行对齐和合并。
  3. Feature/Factor 层Dfactor\mathcal{D}^{\text{factor}}):
    • 在 Clean 数据基础上构建因子和特征;
    • 形成可直接用于回测和建模的“研究数据集”。

在记号上,可以把清洗和因子构建视为两个确定性算子:

Dclean=Tclean(Draw),Dfactor=Tfactor(Dclean).\mathcal{D}^{\text{clean}} = T_{\text{clean}}(\mathcal{D}^{\text{raw}}), \qquad \mathcal{D}^{\text{factor}} = T_{\text{factor}}(\mathcal{D}^{\text{clean}}).

在工程上,可以使用列式存储(如 Parquet)或时序数据库,以优化 I/O 性能和压缩效率。这种分层 + 显式转换算子的设计有利于**数据血缘(data lineage)**追踪:一条因子时间序列可以被精确追溯到对应的原始数据版本和清洗规则。

2.2 数据版本与可重复性

为了保证回测结果可重复,需要对数据版本进行管理:

  • 对每一次清洗和修正记录版本号(例如 vraw,vclean,vfactorv_{\text{raw}}, v_{\text{clean}}, v_{\text{factor}});
  • 在回测任务中记录使用的数据版本;
  • 对重要策略,保留当时使用的数据快照。

从形式上看,一个回测结果可以写成:

BacktestResult=B(Dfactor;θ,ϕ),\text{BacktestResult} = \mathcal{B}\big(\mathcal{D}^{\text{factor}}; \theta, \phi\big),

其中 θ\theta 是策略参数(如因子权重、打分阈值),ϕ\phi 是成本模型与约束参数(参见第 03、04、05 章)。只要锁定 (vraw,vclean,vfactor,θ,ϕ)(v_{\text{raw}}, v_{\text{clean}}, v_{\text{factor}}, \theta, \phi),回测结果理论上应当是可复现的。这有点类似“数据的 Git”,在业界被称为 Data Version Control(DVC)或 data lineage 管理。

3. 回测与研究平台

3.1 回测框架的关键设计点

一个好的回测框架,需要在灵活性严格性之间平衡。从理论上可以把回测框架抽象为一个“理想回测算子”:

B:(D,π,C,R){rp,t}t=1T,\mathcal{B} : (\mathcal{D}, \pi, \mathcal{C}, \mathcal{R}) \mapsto \{r_{p,t}\}_{t=1}^T,

其中:

  • D\mathcal{D}:由数据平台提供的数据集合(含数据版本信息与可用日期);
  • π\pi:策略映射 π:Ftwt\pi: \mathcal{F}_t \to w_tπ:Ftut\pi: \mathcal{F}_t \to u_t(从信息集到权重/订单,参见第 03 章);
  • C\mathcal{C}:成本与执行模型(参见第 05 章);
  • R\mathcal{R}:风险约束和风控规则(参见第 04、06 章)。

“理想”的含义是:在任意时点 tt,回测中的信息集 Ft\mathcal{F}_t 与实盘中可用的信息集一致,不允许访问未来数据。

在这个抽象下,一个回测框架需要在灵活性严格性之间平衡:

  • 灵活性:
    • 支持多种频率(日度、分钟级、事件驱动);
    • 易于接入新的因子和策略逻辑;
  • 严格性:
    • 强制执行“不可看未来”的信息集约束;
    • 对交易成本、滑点、约束等提供统一的建模接口;
    • 保证回测结果在给定数据版本和参数下可重复。

从工程角度,常见做法包括:

  • 数据访问层策略逻辑解耦;
  • 提供统一的接口(如 on_bar, on_tick, on_order_book)供策略实现;
  • 对时间轴进行严格控制,确保策略只能使用 tt 时刻之前已经属于 Ft\mathcal{F}_t 的数据,避免策略“回头看”。

3.2 计算环境:本地 vs 集群

随着数据量(特别是高频 tick/LOB 数据)和策略数量增加,单机计算往往难以满足需求:

  • 可以使用多进程/多线程加速单机回测;
  • 对大量参数组合或蒙特卡洛模拟,可以使用分布式任务队列(如 Celery、Ray 等概念);
  • 对非常大规模的数据分析,可考虑大数据框架(Spark/Flink 等)。

与纯工程项目不同,量化研究的计算通常更偏向“中等规模高密度数值计算”,需要在 I/O、内存和 CPU 利用率之间综合权衡。

4. 交易与执行系统

4.1 系统边界与接口

在许多机构中,策略逻辑与交易系统之间通过清晰的接口进行解耦。抽象来看,策略层输出的是“期望持仓路径”或“订单流” {ut}\{u_t\},交易系统则要把这些目标翻译成实际可执行的订单并发送到市场:

  • 策略系统输出:目标持仓或订单建议;
  • 交易系统负责:
    • 将目标持仓转换为具体订单(价格、数量、类型);
    • 与券商或交易所网关进行通信;
    • 处理订单回报和成交结果;
    • 实施部分风控(如价格保护、速率限制)。

如此一来,策略开发者可以聚焦于信号与组合构建,而不需要过度关心底层协议和网络细节。

4.2 延迟、吞吐与容错

对高频或敏感策略,交易系统需要满足:

  • 低延迟:从行情到订单的延迟尽量小;
  • 高吞吐:能处理高频率的行情更新和订单流;
  • 高可用:系统故障时能快速切换到备用节点或策略降级模式。

可以用几个简单的定量指标来刻画:

  • 端到端延迟:定义从关键行情事件时间戳 TquoteT_{\text{quote}} 到订单进入市场时间戳 TorderT_{\text{order}} 的延迟L=TorderTquote.L = T_{\text{order}} - T_{\text{quote}}.
    对高频策略,不仅 E[L]\mathbb{E}[L] 要小,尾部分布(如 95%、99% 分位)也同样关键。
  • 吞吐能力:在给定硬件和架构下,系统在单位时间内可稳定处理的订单或行情事件数,可以记为 QmaxQ_{\max}。当实际到达率 λ\lambda 接近或超过 QmaxQ_{\max} 时,系统进入“排队”状态,延迟会迅速放大(与简单排队论中的 M/M/1 直觉类似)。
  • 可用性(Availability)
       $$
       \text{Availability} = \frac{\text{正常服务时间}}{\text{总时间}} = \frac{\text{MTBF}}{\text{MTBF} + \text{MTTR}},
       $$
    

    其中 MTBF(mean time between failures)是平均故障间隔时间,MTTR(mean time to repair)是平均修复时间。对量化平台来说,降低 MTTR(快速恢复和自动切换)往往比完全消灭故障更加现实。

这些内容依赖于具体技术栈和架构设计(如异步 I/O、消息队列、内存数据库等),本章只做概念性说明。

5. 风险与监控系统

5.1 实时监控

从抽象角度看,一个监控系统就是把“原始的系统状态和交易记录”映射成一组时间演化的指标向量:

M:{交易日志,持仓,市场数据,系统日志}Rd,M: \{\text{交易日志}, \text{持仓}, \text{市场数据}, \text{系统日志}\} \longrightarrow \mathbb{R}^d,

在时间维度上得到指标时间序列 {Mt}\{M_t\}。典型监控指标包括:

  • 策略层:净值曲线、收益率、风险指标、仓位、资金使用率;
  • 系统层:服务可用性、延迟、错误率、CPU/内存使用;
  • 市场层:波动率水平、成交量、价差变化等。

技术实现上,可以使用:

  • 指标采集(metrics)系统;
  • 日志集中化系统;
  • 告警系统(邮件、短信、IM 等)。

在第 06 章中,我们已经将部分监控指标视为时间序列,进行滚动 t 检验和结构变点检验。从工程角度,风险与监控系统需要:

  • 支持指标的实时计算和存储;
  • 支持对 {Mt}\{M_t\} 做窗口聚合、分解和告警;
  • 保证监控链路本身的可靠性(避免“监控挂了但策略还在跑”)。

5.2 事后分析与报表

  • 每日/每周/每月自动生成策略表现和风险报表;
  • 支持对历史交易进行回顾和归因分析;
  • 为策略迭代和资金配置决策提供量化依据。

6. 调度与任务编排

量化系统中存在多种类型的任务,这些任务天然构成一个有向无环图(DAG):节点是任务,边是前后依赖关系。

  • 批处理:夜间因子更新、历史回测、报表生成;
  • 定时任务:每日开盘前策略预计算、收盘后数据对账;
  • 实时任务:行情订阅、策略计算、下单执行。

我们可以为每个任务 τi\tau_i 赋予:

  • 资源需求(CPU、内存、I/O);
  • 优先级(实盘路径 > 夜间回测 > 报表);
  • 调度约束(例如“必须在开盘前完成”、“依赖某个上游任务成功”)。

从形式化角度看,一个调度系统就是在资源约束和时序约束下,为这一组任务找到一个可行且“足够优”的执行计划。这和经典的任务调度/作业车间问题(job-shop scheduling)有内在联系,工业界常借助已有的调度框架(如 Airflow 等)来实现 DAG 执行。

典型做法是使用:

  • Cron/调度系统管理批处理;
  • 专门的流式计算引擎管理实时任务;
  • 对关键路径设置优先级和资源隔离,避免互相影响。

7. 工程实践建议

从量化研究者与工程师协作的角度,以下实践往往能显著提高整体效率:

  1. 统一的代码规范与文档
    • 对常用的数据结构、接口、命名方式达成共识;
    • 尽量避免同一概念在不同模块被命名成不同的词。
  2. 模块化与可测试性
    • 将策略逻辑、数据访问、执行逻辑拆分成相对独立的模块;
    • 为关键模块编写单元测试和集成测试。
  3. 环境与依赖管理
    • 使用虚拟环境或容器(如 Docker)管理依赖;
    • 在本地、测试和生产环境中保持尽可能一致的软件栈。
  4. 研发流程与发布管理
    • 为策略和系统的更新建立代码审查与发布流程;
    • 对线上版本进行灰度发布或分阶段放量,降低风险。

8. 小结

本章从系统工程的视角勾勒了一个量化平台的主要组成部分:数据、研究、交易、风险与监控、调度。它为前几章的理论和策略提供了落地运行的“载体”。

在实际工作中,资产定价、统计计量和工程技术是三个互相关联的维度:

  • 资产定价提供“策略应当具备什么样的风险–收益特征”的理论基准;
  • 计量方法提供“如何从数据中估计和检验这些特征”的工具;
  • 工程与工具链则保证“这些理论和策略可以在真实市场中以可控方式长期运行”。

后续若需要,可以针对本章中的某个子系统(如数据平台或回测框架)单独扩展更技术细节的开发笔记。


9. 自学手册:设计一个可复现的量化研究流水线

9.1 学习目标

学完本章后,你应当能够:

  1. 画出数据平台、研究平台、交易系统、监控系统和调度系统之间的依赖关系;
  2. 说明数据版本、代码版本、参数版本和环境版本如何共同决定一次回测结果;
  3. 为因子更新、回测、报表和上线任务设计 DAG;
  4. 判断一个研究项目是否具备可复现、可测试和可部署条件;
  5. 识别量化工程中常见的耦合、隐式状态和运维风险。

9.2 工程场景

团队里有三位研究员都在使用同一批数据构建因子。A 的回测结果很好,B 复现不了,C 上线后发现生产因子与研究因子不同。问题通常不在某一行模型代码,而在工程链路:

  • 数据是否来自同一版本?
  • 因子计算是否有固定依赖顺序?
  • 回测是否记录了参数和环境?
  • 研究函数是否能在生产批处理里无人工干预运行?
  • 失败任务是否会阻断下游报表和下单?

本章的目标,是让你从“能跑一次”提升到“别人、明天、生产环境也能跑”。

9.3 定义与工作流逻辑

层级关注点典型失败模式
数据层原始数据、清洗数据、因子数据的版本和血缘字段口径变了但回测未记录
研究层因子、模型、回测和报告Notebook 隐式状态导致不可复现
执行层目标权重到订单和成交回报接口变更或限额拒单未处理
监控层指标、日志、告警和报表策略异常但监控链路失效
调度层DAG、依赖、重试和资源隔离上游失败后下游使用旧数据

一个最小可复现研究流水线应包含:

  1. raw -> clean -> factor 的显式数据转换;
  2. 每个转换任务记录输入版本、输出版本和运行时间;
  3. 回测任务记录策略代码版本、参数、成本模型和数据版本;
  4. 报表任务从回测产物生成,不重新隐式计算核心结果;
  5. 失败任务停止依赖它的下游任务,并向负责人告警。

9.4 迷你案例:夜间因子更新 DAG

可以把日频因子更新设计成如下 DAG:

Rendering diagram…

每个节点都应有明确的成功条件。例如“因子质量检查”不只是任务退出码为 0,还包括:有效股票数量不低于阈值、缺失率不异常、与昨日因子相关性在合理范围内、极端值比例没有突然升高。

9.5 常见错误与研究陷阱

  • Notebook 即平台:交互式分析适合探索,但不适合作为唯一生产流水线。
  • 版本只记录代码:数据、参数、环境和外部模型不锁定,回测仍然不可复现。
  • 任务失败后默默使用旧数据:短期看似稳定,长期会让信号时点和数据口径混乱。
  • 研究与生产两套实现长期分叉:同一因子在两个系统中公式略有差异,实盘偏离难以定位。
  • 监控系统没有被监控:指标链路断了,策略仍继续运行,团队误以为一切正常。

9.6 自测题与答案提示

  1. 为什么回测结果应记录数据版本和参数版本? 答案提示:收益由数据、代码、参数和成本模型共同决定;只记录代码无法复现结果。
  2. DAG 中为什么要显式停止依赖失败节点的下游任务? 答案提示:防止下游使用旧数据或半成品数据,造成信号与监控失真。
  3. 什么样的策略逻辑适合从研究迁移到生产? 答案提示:输入输出清晰、无隐式状态、可测试、参数外置、运行时间可控。
  4. 工程指标和投资指标为什么都重要? 答案提示:投资指标衡量策略是否赚钱,工程指标衡量系统是否能稳定地产生这些投资结果。

9.7 小结与过渡

工程章节回答的是“怎样让研究结果长期、稳定、可复现地运行”。没有可靠平台,数据清洗、因子检验、回测和上线监控都会变成一次性手工操作。下一章回到统计与计量方法,讨论如何用更严格的检验判断策略结果是否真实可靠,而不是偶然样本表现。


参考资料(示意性)

  • Cochrane, J. H. (2005). Asset Pricing. (理论背景)
  • Campbell, J. Y., Lo, A. W., & MacKinlay, A. C. (1997). The Econometrics of Financial Markets. (实证与计量方法)
  • Cartea, Á., Jaimungal, S., & Penalva, J. (2015). Algorithmic and High-Frequency Trading. (关于交易系统与执行)
  • Kleppmann, M. (2017). Designing Data-Intensive Applications. (数据平台与系统设计的一般性参考)
Copyright © 2026