测试指南¶
为了确保 AKQuant 回测引擎的准确性和稳定性,我们建立了一套分层测试体系。本指南将帮助你了解如何运行测试、解读结果以及添加新的测试用例。
测试体系概览¶
AKQuant 的测试分为以下几个层级:
- 单元测试 (Unit Tests)
- Rust: 使用
cargo test运行,覆盖核心算法(撮合、费用计算、风险控制)。 - Python: 使用
pytest运行,覆盖 Python 接口、数据处理和配置解析。
- Rust: 使用
- 黄金测试 (Golden Tests / Integration Tests)
- 使用合成数据(Synthetic Data)模拟特定市场场景(如 T+1、涨跌停、期权行权)。
- 将回测结果(权益曲线、成交记录、指标)与锁定的基线 (Baseline) 进行严格比对。
- 确保任何算法变更都不会意外改变回测结果。
🚀 快速开始¶
1. 准备环境¶
确保你已经安装了开发依赖:
2. 运行所有测试¶
3. 仅运行黄金测试¶
🏆 黄金测试 (Golden Tests)¶
黄金测试是 AKQuant 质量保证的核心。它位于 tests/golden/ 目录下。
目录结构¶
tests/golden/
├── strategies/ # 测试策略代码 (e.g., stock_t1.py)
├── data/ # 自动生成的合成数据 (Parquet 格式)
├── baselines/ # 锁定的基线结果 (标准答案)
├── runner.py # 测试执行器与对比逻辑
├── gen_data.py # 数据生成脚本
└── test_golden.py # Pytest 入口
包含的场景¶
| 测试用例 | 描述 | 验证点 |
|---|---|---|
| stock_t1 | 股票 T+1 交易 | Day 1 买入 Day 2 可卖;Day 3 买入当日卖出被拒。 |
| futures_margin | 期货保证金 | 初始资金仅够 1 手;尝试买入第 2 手时因保证金不足被拒。 |
| option_basic | 期权基础交易 | 验证期权合约的买入、持仓与卖出平仓流程及 PnL。 |
如何更新基线?¶
如果你修改了核心算法(例如改进了撮合逻辑或费用计算),导致回测结果发生预期内的变化,黄金测试会失败。此时你需要更新基线:
- 确认差异: 仔细检查测试失败的输出,确认差异是你修改代码导致的,且符合预期。
- 重新生成基线:
- 提交变更: 将更新后的
tests/golden/baselines/文件随你的代码一起提交。
➕ 如何添加新测试?¶
添加 Python 单元测试¶
在 tests/ 目录下创建新的 test_*.py 文件,使用 pytest 风格编写:
添加新的黄金测试用例¶
- 生成数据: 修改
tests/golden/gen_data.py,添加新的数据生成逻辑。 - 编写策略: 在
tests/golden/strategies/下创建新的策略文件(如my_test.py)。 - 注册测试: 修改
tests/golden/runner.py中的main函数,添加新的run_test调用。 - 生成基线: 运行
python tests/golden/runner.py --generate-baseline。
常见问题 (FAQ)¶
Q: 为什么本地测试通过,CI 却失败了? A: 可能是环境差异(如 Pandas 版本、操作系统浮点数精度)导致的。黄金测试设置了一定的容忍度(Tolerance),但如果差异过大仍会报错。请检查 CI 日志中的差异详情。
Q: 如何调试 Rust 部分的测试?
A: 使用 cargo test 运行 Rust 原生测试。如果需要调试 Python 调用 Rust 的部分,可以参考开发文档中的混合调试指南。