系统手册
5. 交易执行层 ADS
将目标持仓落地为实际交易与记账;模拟盘与实盘共用抽象接口;全程状态可恢复、可对账。
作用:把目标持仓落地为真实交易 / 记账;模拟盘与实盘共用抽象接口;全程可恢复、可对账。
源码地图
| 文件 | 关键对象 | 作用 |
|---|---|---|
src/execution/base.py | ExecutionEngine(ABC) / Order / compute_trades | 策略与执行解耦的抽象层 |
src/execution/paper_trader.py | PaperTrader.run_daily / execute_rebalance | 模拟盘:SQLite 持久化、幂等续跑、NAV 恢复 |
src/execution/alpaca_trader.py | AlpacaTrader.execute_rebalance / _wait_for_orders / _compute_slippage | 实盘:真实权益、订单轮询、滑点 |
src/execution/recorder.py | record_* / turnover_from_orders | 按真实权益幂等落库 |
src/execution/run_daily.py | main / should_rebalance | 每日信号 → 交易入口;N 日调仓节流 |
已知问题与修复
重启后持仓状态丢失(#30)
服务重启后 PaperTrader 仅恢复净值、未恢复持仓明细 → 误判为空仓 → 触发全仓买入,换手率异常。解法:Delta 状态对齐,宕机后通过「目标持仓 − 实际持仓」自动补平。见 事故档案 · 重启后状态丢失。
碎股与粉尘持仓(#28)
$25,000 分 10 份买高价股(如 AVGO)时存在离散化误差;权重 <0.1% 的「粉尘持仓」持续推高交易成本 → 优化清仓逻辑。见 事故档案 · 碎股与粉尘持仓。
总仓 >100%(#27)
AlpacaTrader 总敞口计算错误导致权重异常 → 权重计算始终基于真实 account.equity。
量化要点
调仓频率必须与回测一致
默认 REBALANCE_FREQ=5。回测与实盘的调仓频率不一致是模拟盘亏损的主因,而非因子失效。 见 事故档案 · 调仓频率不一致导致摩擦放大。
- 停牌标的市价单会被 Reject,已用
try-except兜底,不影响其余标的。
当前状态
模拟盘上线;实盘在 #40 整改后补齐「真实落库 + 真实滑点 + 5 日调仓节流」(commit 05eab94)。
缺口 / TODO
- 风控未接入执行(#34)。
- 切实盘前模拟盘须「无人值守、零报错」连跑 ≥4 周。