第 19 课:执行系统 - 从信号到真实成交
如果你把“行情价格”当成“成交价格”,你训练出来的不是交易系统,而是幻觉。
一个常见的致命误会
很多策略回测看起来很美,是因为默认了一个不可能成立的前提:
只要出现信号,我总能在理想价格成交(比如 K 线 Close)。
一旦进入实盘,你会立刻遇到三个现实:滑点、延迟、部分成交/不成交。这些不是“优化项”,而是决定策略能否落地的生死线。
本章将带你深入理解什么是真实成交数据(Real Execution Data),以及为什么它是执行系统(Execution Agent)的地基。
19.1 核心定义
所谓的“真实成交数据”,并不是你从 K 线图上看到的显示价格,而是:
核心逻辑:如果你在那一瞬间真实下达了订单,你最终在什么价格、成交了多少数量、以及经历了多久的延迟。
这是理论回测与实盘交易之间最重要的分水岭。
19.2 真实成交的四大构成要素
要准确模拟真实交易,必须考虑以下四个关键维度:
19.2.1 成交价格(Execution Price)
真实成交价通常与 K 线价格(OHLC)存在显著差异。
- 差异化:5 分钟 K 线的收盘价(Close)只是最后的一笔成交记录,并不代表你的大额订单能以此价全部成交。
- 拆分性:在大额交易中,你的订单可能会被拆分成多笔,分别在不同的微小价位上成交,最终呈现一个加权平均价。
19.2.2 滑点(Slippage)
滑点是理论成交价与实际成交价之间的偏差。它是量化交易中最主要的隐形成本,主要来源于:
- 流动性深度:买卖盘口的深度不足以支撑订单量。
- 市场冲击:你自己的下单行为改变了短期供需,导致价格向不利方向移动。
- 行情波动:在快速波动的行情中,价格瞬息万变。
19.2.3 成交概率与延迟(Probability & Latency)
在真实市场中,挂单并不意味着一定会成交:
- 市价单 (Market Order):追求“即时成交”,代价是往往需要承担更大的滑点。
- 限价单 (Limit Order):追求“价格确定”,但面临以下风险:
- 完全不成交:价格从未触达。
- 部分成交:排在你前面的单子太多,轮到你时流动性已耗尽。
19.2.4 摩擦成本与交易规则
除了价格本身,你还必须支付法定的“入场费”:
- 显性成本:手续费(Commissions)、印花税、过户费。
- 规则限制:最小变动价位(Tick Size)、涨跌停板限制、特定的撮合规则(如价格优先、时间优先)。
19.3 策略视角:为何高频趋势策略对此极度敏感
对于采用 5 分钟趋势 + 高频交易 逻辑的策略而言,真实成交数据的重要性被放大了数倍。
19.3.1 误差的长期累积效应
如果你每天的交易频率在几十到几百笔之间,意味着哪怕每笔仅有 0.01% 的成交价偏差,在复利和高频的影响下,长期的回测曲线也会发生根本性的扭曲。
19.3.2 “K 线收盘价成交”的幻觉
如果你在训练 AI Agent 或回测时简单使用“K 线 Close 价”作为成交价,模型会学到极其危险的逻辑:
- 误判:“一根 K 线结束时,我总能在收盘价瞬间成交。”
- 错觉:“价格突破后,我总能以最优的突破价买入。”
现实逻辑:在现实中,你在当前 K 线结束观察到信号后,最快也只能在 下一根 K 线 的起始处下单。在行情剧烈波动时,你几乎永远无法以观察到的 Close 价成交。
19.4 典型陷阱:缺乏真实数据导致的实战脱节
当系统性地高估信号质量时,策略(特别是强化学习 RL 模型)会产生一系列致命的偏差:
19.4.1 偏好“不可实现”的入场时机
Agent 会演化出一种对“刚好收盘突破”信号的病态偏好。在模拟世界中,突破点是完美的入场价;但在现实中,由于下一根 K 线往往伴随跳空(Gap)或剧烈滑点,Agent 学会的是一种现实世界永远买不到的好时机。
19.4.2 沦为“手续费收割机”
在无滑点和低摩擦的假设下,AI 会认为“多做一笔 = 多赚一笔”,从而疯狂提高交易频率。然而在实盘中,高频交易往往是成本放大器,最终导致线上表现与模拟结果完全脱钩。
19.4.3 错误的因果推断
最危险的情况是 RL 学到了错误的因果关系。例如:
- 错误推论:“当指标达到阈值且刚收盘时买入,必然盈利。”
- 真实因果:这仅仅是一个被理想化成交假设放大的统计假象,而非真正的市场获利逻辑。
19.5 数据双维度:市场级环境 vs. 策略执行表现
要获取真实的成交数据,首先需要明确你到底需要哪一类数据。通常,我们可以将其分为两个维度:
- 维度 A:市场真实成交环境数据(公共环境):这类数据回答的是“如果在当时那个市场环境下下单,一般会发生什么?”
- 维度 B:策略在真实市场中的成交数据(私有表现):这类数据回答的是“当我的 Agent 在真实市场中下单时,具体发生了什么?”
核心策略:如果你要训练“执行型”或“在线 RL Agent”,最终目标一定是获取维度 B 数据。维度 A 仅能作为前期算法开发和冷启动阶段的近似。
19.6 标准化数据模型
19.6.1 为什么需要内部统一格式
当你对接多个券商或交易所时,会立即遇到一个问题:每家使用不同的符号体系。
同一只苹果公司股票:
- Interactive Brokers: AAPL (SMART)
- Alpaca: AAPL
- 港股腾讯: 0700 (IBKR) vs 00700 (港交所)
- A股贵州茅台: 600519 (Wind) vs 600519.SH (通达信)
如果你的系统内部直接使用券商原始符号,一旦切换执行通道或增加新市场,整个信号链路都要改。
19.6.2 Canonical Symbol 设计
核心原则:系统内部使用统一的
SYMBOL.EXCHANGE格式,在边界处做转换。
内部标准格式:
AAPL.NASDAQ → 苹果
0700.HKEX → 腾讯
600519.SSE → 贵州茅台
每个交易通道实现一个 Normalizer:
IBNormalizer: AAPL.NASDAQ ↔ AAPL (SMART)
AlpacaNormalizer: AAPL.NASDAQ ↔ AAPL
FutuNormalizer: 0700.HKEX ↔ 00700.HK
这种设计让核心策略逻辑与具体券商完全解耦。增加新的执行通道时,只需实现一个新的 Normalizer,不需要修改任何策略代码。
19.6.3 符号解析陷阱
看似简单的"股票代码",在生产环境中充满意外。
| 陷阱 | 说明 | 后果 |
|---|---|---|
| 退市股票 | 已退市代码查询不报错,返回空数据或旧数据 | 信号基于幽灵数据生成 |
| 公司行为 | 拆股/合股改变代码(如 Google: GOOG→GOOGL) | 历史数据不连续 |
| 多段代码 | BRK.B、BF.B 等含点号的代码与分隔符冲突 | 解析错误 |
| 陈旧报价 | 盘后/休市期间 API 返回过期价格 | 用昨天的价格下今天的单 |
| 代码复用 | 退市代码被新公司复用 | 回测中张冠李戴 |
防御措施:对每个标的维护一个 instrument_registry,包含上市日期、退市日期、公司行为历史、交易时段等元数据。信号生成前先验证标的状态。
19.7 获取途径:如何获取高保真交易数据?
19.7.1 数据源的层次
Yahoo Finance 够用来学习,但不够用来赚钱。
不同阶段对数据的要求截然不同:
| 阶段 | 数据源 | 精度 | 成本 |
|---|---|---|---|
| 学习/回测 | Yahoo Finance、免费 API | 日线 OHLCV | 免费 |
| 策略开发 | Polygon.io(现已更名为 Massive)、Alpha Vantage | 分钟线 + 基本 L1 | $29-199/月 |
| 生产交易 | Databento、交易所直连 | 实时 L1/L2、逐笔成交 | $500+/月 |
Yahoo Finance 提供的日线数据足以完成本课程的所有练习和回测。但一旦进入生产环境,你需要机构级数据源(如 Databento、交易所直接数据馈送)来获取实时 Level-1/Level-2 行情。数据精度的差异直接决定了滑点估算和成交模拟的准确性。
19.7.2 第一类:可购买或通过接口获取的「市场级数据」
这类数据是"市场事实",反映了当时市场的整体流动性。
- Level-2 / Order Book 数据(最为关键):
- 内容:包含每一档买卖盘的价格与数量、毫秒级逐笔成交(Tick/Trade)记录。
- 用途:用于估算市价单的平均滑点、限价单的成交概率以及构建成交模拟器(Execution Simulator)。
- 来源:交易所官方(最权威但昂贵)、专业数据商(如 Refinitiv)、或部分高级券商 API。
- 逐笔成交数据(Tick Data):
- 虽然看不到盘口排队情况,但能看到每一笔真实的成交价格和成交量,精准度远高于 K 线。
- 模拟交易环境(Paper Trading):
- 警告:多数模拟交易环境的滑点过于理想,且不考虑你的订单对市场的冲击。它只能作为过渡,不可过度依赖。
19.7.3 第二类:必须"由你亲自产生"的真实成交数据
这是唯一能真实反映“你的 Agent + 市场”互动的数据,包含了订单的完整生命周期:
- 全量日志:下单时间、订单类型、期望价、实际成交价(可能多笔)、成交延迟、部分成交/未成交记录、手续费等。
19.8 残酷真相:为什么核心数据无法通过购买获得?
很多开发者会问:“我能不能不实际交易,直接买到这种带滑点的真实数据?”
核心逻辑:答案是否定的。
原因在于:滑点并不是单纯的市场属性,而是“你的行为 + 市场反馈”的共同产物。 你的下单方式(市价/限价)、订单大小、下单时机,都会在盘口产生不同的化学反应。不存在一个“通用的、替你成交过的”真实数据集。
19.9 进化路线:从模拟器到实盘反馈的三个阶段
对于追求实战效果的开发者,推荐遵循以下工程路线:
- 阶段 1:构建执行模拟器
- 利用 Level-2/Tick 数据构建一个“偏保守”的模拟器。
- 目标:淘汰 80% 在理想假设下盈利、但在保守假设下亏损的策略。
- 阶段 2:小资金真实交易(冷启动)
- 以极小仓位进入实盘,不为赚钱,只为采集全量日志。
- 目标:拿到真实的成交失败、极端滑点和延迟样本。
- 阶段 3:数据闭环校正
- 用实盘产生的 B 类数据反向校验阶段 1 的模拟器,使模拟环境越来越接近你的真实执行表现。
19.10 实战建议:针对 5 分钟高频策略的现实方案
结合 5 分钟趋势策略的特性,我给出的最现实建议如下:
- 宁愿高估风险:在构建模型时,宁愿高估滑点,低估成交概率。
- RL 训练分离:初期让 RL Agent 先学习“执行逻辑”(例如:下多大、是否追价、何时放弃),而不是急于学习“预测方向”。
- 尽早入场:一旦策略在“保守模拟器”中表现稳定,应尽早启动小资金实盘。
19.11 总结
显示价 + 滑点 + 概率延迟 + 交易摩擦 = 真实成交数据
只有将这些细节全部纳入考量,避开“理想化成交”的陷阱,量化策略(尤其是 AI 驱动的策略)的回测结果才具备真正的实战参考价值。从“行情数据”向“成交数据”的跨越,是专业量化交易者的必经之路。
19.12 执行通道选择
对于中小规模量化基金,Interactive Brokers (IB) 是事实上的标准选择。
| 维度 | Interactive Brokers | Alpaca | 直连交易所 |
|---|---|---|---|
| 市场覆盖 | 美股 + 港股 + 期货 + 外汇 | 仅美股 | 单一市场 |
| 执行算法 | 原生 TWAP/VWAP/自适应 | 基础市价/限价 | 完全自定义 |
| TCA 数据 | 提供到达价格对比 | 有限 | 需自建 |
| API 成熟度 | TWS API(成熟但复杂) | REST API(简单友好) | FIX 协议 |
| 适合阶段 | 生产交易 | 学习/原型验证 | 大规模专业团队 |
Alpaca 和模拟盘是很好的学习工具和原型验证平台,但它们不是生产终点。当你准备投入真实资金时,IB 的多市场覆盖、原生算法交易和真实 TCA 数据是中小团队最务实的选择。
19.13 多智能体视角
- Execution Agent:把"信号"翻译成可成交的订单(拆单/挂单/追价/撤单),并持续度量执行质量(滑点、成交率、延迟)。
- Risk Agent:把"能成交"变成"值得成交",对高滑点/低流动性/异常延迟触发降仓或拒单。
- Data/Telemetry Agent:沉淀执行数据闭环(订单→成交→成本→PnL),为后续的回放、归因、在线学习提供素材。
本课交付物
完成本课后,你将获得:
- 执行系统的关键概念框架:成交价、滑点、延迟、成交率、摩擦成本
- 数据闭环的采集清单:知道实盘必须记录什么,才能反哺执行与 RL
- 一条可落地的演进路径:保守模拟器 → 小资金实盘采样 → 反向校准模拟器
本课要点回顾
- 真实成交数据 = 成交价 + 滑点 + 概率/延迟 + 交易规则/摩擦成本
- 用 K 线 Close 当成交价会系统性高估策略可实现性
- A 类数据(市场环境)只能近似,B 类数据(你的实盘日志)才可用于校准与进化
延伸阅读
- 背景知识:交易所与订单簿机制 - 理解限价单/市价单的真实撮合语义
- 背景知识:执行模拟器实现 - 4 级执行模拟器的代码实现
- 背景知识:Tick 级回测框架 - 事件驱动回测与队列位置模拟
- FIX 协议入门 - FIX 4.4 消息结构与 QuickFIX 实现
- 附录 A:实盘交易记录标准指南 - 你应该记录哪些字段来形成闭环
下一课预告
第 20 课:生产运维
当系统跑进真实市场,问题不再是“策略对不对”,而是“系统有没有在正确运行”:数据管道健康吗?PnL 是否异常?回撤是否触发熔断?下一课我们把这套系统真正“养起来”。