系统架构文档 Python 3.12+ / uv / Bun OpenCTP / GM / TQSDK / QMT 单回环安全模型

1. 核心定位与设计哲学

Axile 是一个针对量化投研到实盘落地阶段的多渠道算法交易执行服务与运行守护系统。它不承担高频撮合或复杂事件驱动回测引擎的职责,而是专注于解决量化投资组合在真实柜台落地时的确定性执行、权重与手数换算、开平守卫、持仓估值对账以及风控审计。

单回环安全模型(Local Loopback Only)

Axile 是仅限本机单用户使用的服务,不提供多租户应用级 API 鉴权。服务端及前端严格绑定回环地址(127.0.0.1);外部访问必须依托专用审查隔离网关,从根源消除暴露至公网带来的资金安全隐患。

确定性与只读证据链

任何外部执行动作(报单、撤单、清仓)必须具备前置状态机确认;执行记录具有不可逆证据属性,拒绝破坏性覆盖迁移,历史快照与估值异常采用读时归一(Normalize on Read)与只读试算回填。

2. 端到端执行拓扑(Execution Pipeline)

Axile 的核心执行管线贯穿了从组合目标权重到柜台委托执行的全链路:

Portfolio Targets (组合目标权重输入) Target Sizing Engine (换算目标可执行手数) 1. 柜台持仓查询 (Query Position) 2. 真实权益计算 (Dynamic Equity) 3. 价格时段阻断与安全边界检查 Execution Engine (执行引擎) 依赖注入: Clock, ChannelAdapter, AuditLogger 预检持仓状态 (UNKNOWN 状态立即阻断,不视为 0) 拆解开平与锁仓方向 (Open / Close / CloseToday) 路由算法执行器 (SingleMaker / TWAP / POV / Limit) Channel Adapters (渠道适配层) OpenCTP / 天勤 TqSdk / 掘金 GM / 迅投 QMT

3. 单一契约与读时归一(Execution Contract)

PR #61 核心原则:彻底废弃破坏性历史库表结构清理,确立 status 与 error 的单一法定契约,并在序列化边界进行现算归一。
契约状态 (Status) 错误分类 (Error Category) 风控行为与执行守卫
SUCCESS None 目标持仓完全达成,对账无偏差。
PARTIAL SLIPPAGE / TIMEOUT 部分手数成交,剩余撤单或等待二次触发。
BLOCKED OUT_OF_SESSION / QUOTA 时段阻断但依然换算目标手数,记录偏离原因但不触发违规报单。
FAILED POSITION_UNKNOWN / REJECT 持仓状态未决时坚决不视为 0,禁止盲目开平,进入告警。

4. 多渠道适配层机制(Channel Adapters)

Axile 屏蔽了各主流柜台在代码规则、时段划分、委托推送等维度的异构性,统一抽象为 ChannelAdapter 契约:

5. 持仓估值与市值容错(Valuation & Fallback)

PR #64 & #66 演进:解决缺盘口、非交易时段、茶歇或收盘后,账户持仓市值被击穿为 0 并误触风控告警的问题。

估值系统采用两套独立的解耦逻辑:

  1. 下单前行情新鲜度校验(Execution Market Data):严苛要求当前盘口双边买卖价存在且未超时,否则拒绝执行开平仓。
  2. 持仓盯市估值链(Position Valuation Fallback):
    • 交易中时段:所有活跃持仓合约共享最多 3 秒的 Tick 行情等待;
    • 休市/茶歇时段:直接接受最后有效价(LastPrice),跳过无意义订阅;
    • 推送缺失兜底:通过 CTP 交易 API ReqQryDepthMarketData 发起单合约深度查询,保留历史参考价值;
    • Alembic 0014 数据回填:历史快照按初始执行报价与合约乘数只读试算,确保净值曲线连续性。

6. 时间钟与交易日历(Clock & Schedule)

在 PR #62 与 PR #67 中,Axile 对时间基准进行了全局重构:

统一 Clock 依赖注入

将分散在各处的 time.time() 与 asyncio.sleep() 抽象为 Clock 接口(RealClock 与 SimClock),使生产监控可依赖高精度单调时钟,仿真测试可任意跨越虚拟时间。

交易日历横轴投影

ScheduleClock 内置国内交易日历事实,前端图表在观测序列模式下等距压缩休市区间,在自然时间轴模式下标注休市阴影,完美处理周末与长假跳空。

7. 策略工作台与 LSP 隔离(Python Editor & ty)

为支持用户在线编写自定义调仓与清仓算法,PR #65 引入了现代化 Python Web IDE 架构:

8. 测试架构与隔离分层(Testing Architecture)

随着用例突破 2,000+,PR #63 实现了测试体系的系统性整顿:

测试分层 目录 测试对象与隔离要求
Unit tests/unit/ 纯函数、算力逻辑、数据解析,无 I/O,毫秒级完成。
Contract tests/contract/ 公共 API 导出边界、契约字段序列化与读时归一验证。
Integration tests/integration/ SQLite 并发竞争、子进程管理、IPC 通信,统一标记 @pytest.mark.slow。

9. 核心设计取舍与演化总结

从最近 7 天的演化可以清晰看出 Axile 的核心演化脉络: