一. 整体架构总览
采用C++高性能核心+Python策略层的混合架构,遵循经典的「数据 → 策略 → 回测/实盘」分层设计。
quantTrading/
├── src/ # C++ 核心库(计算密集型)→ 编译为 quant_core_py 扩展
│ ├── core/ # 基础类型 (Tick/Bar/Order/Signal)
│ ├── indicators/ # 技术指标 (SMA/EMA/MACD/RSI/BOLL/ATR) + 注册表
│ ├── factor/ # 多因子引擎 (DAG 计算图)
│ ├── risk/ # 风控 (仓位/止损/回撤)
│ └── python_bridge/ # pybind11 绑定 → Python 可调用
├── quant/ # Python 框架层
│ ├── data/ # 数据源(akshare) + Parquet 存储 + 交易日历
│ ├── engine/ # 回测引擎/模拟券商/投资组合/绩效报告
│ ├── strategies/ # 策略基类 + demo/advanced 策略
│ ├── signal/ # 实盘信号生产与导出
│ └── utils/ # 结构化日志
├── scripts/ # CLI 入口(下载/回测/优化/实盘)
├── config/ # YAML 配置
└── tests/ # C++(gtest) + Python(pytest) 测试
核心设计决策:性能关键路径放在 C++,策略灵活层放在 Python,通过 pybind11 桥接。
这也是量化系统的常见最佳实践——技术指标、因子计算、风控都是纯数值运算,用 C++ 可
以获得数十倍性能提升,而策略逻辑需要频繁迭代,用 Python 便于快速实验。
二. C++ 高性能核心
2.1 技术指标(indicators/)
每个指标都是「批量计算 + 增量更新」双模式,这是流式行情下的关键设计。以 SMA 为例:
void SMA::update(double price) {
if (count_ < period_) {
buffer_[head_] = price;
sum_ += price;
...
环形缓冲区(head_ 指针取模):增量模式只需 O(1) 时间更新,无需重算整个窗口。
滑动求和(sum_ += price; sum_ -= prices[i-period_+1]):批量计算用增量式
求和替代每次全窗口求和,把 O(n·k) 降到 O(n)。
registry.h 用单例 + 工厂函数 + 类型擦除实现插件式指标注册:
class IndicatorRegistry {
public:
using FactoryFunc = std::function<std::unique_ptr<IndicatorBase>
(const std::string& params)>;
static IndicatorRegistry& instance();
...
#define REGISTER_INDICATOR(name, factory) ...
2.2 因子引擎(factor/engine.h)
采用**计算图(DAG)**模式:
FactorNode 是抽象计算节点,派生 Momentum/Reversal/Volatility/VolumeRatio 等因子。
FactorEngine 统一管理输入数据与因子,compute_all() 批量执行,支持拓扑排序预留。
因子的可组合性为后续扩展复杂因子提供了清晰接口。
2.3 风控(risk/risk_manager.h)
设计了完整的风控规则链:仓位限制、单笔金额、日交易次数、连续止损暂停、个股止损、总回撤控制。
通过 RiskVerdict 枚举表达拒绝原因,RiskManager 聚合各规则,支持开仓前/盘中/收盘后三阶段检
查——这是实盘系统必备的安全网。
2.4 pybind11 桥接(python_bridge/)
将 C++ 类型与枚举暴露给 Python,PYBIND11_MODULE(quant_core_py, m) 作为入口。策略层可直接
from quant_core_py import SMA, Bollinger, FactorEngine。
三. Python 框架层(quant/)
3.1. 数据层(data/)
BaseDataSource 抽象接口:定义 stock_list / daily_bar / trade_calendar,akshare_source
是其实现。面向接口编程使将来替换数据源(如 Tushare、聚宽)无需改动上层。
ParquetStore:按 {code}.parquet 单文件存日线,追加合并去重逻辑保证增量更新幂等;
同时支持 Level2 数据按日期分文件存储。
TradingCalendar:交易日历,用 set 做 O(1) 判断,周末判断做兜底,并支持本地 CSV 缓存。
3.2. 回测引擎(engine/)
这是系统最核心的部分,采用事件驱动架构,四个模块职责分明:
模块 职责
broker.py 模拟券商:委托撮合、费用计算、滑点
portfolio.py 投资组合:现金/持仓/交易日志/每日净值
backtest.py 事件循环:推送行情→收集信号→撮合
reporter.py 绩效指标与图表
BacktestEngine.run() 的核心流程:
对每一天 date:
收集所有股票的当日 K 线 → bars_today
对每只股票调用 strategy.on_bar() 收集信号
对每条信号下单 → broker.execute() 撮合(含滑点、限价判断)
portfolio.update() 结算 → record_daily() 记录净值
broker.py 细致地模拟了真实交易:市价/限价单、滑点(百分比或固定跳数)、佣金(有最低5元)、
印花税(仅卖出)。portfolio.py 用加权平均成本法计算持仓成本,并生成每日快照。
reporter.py 计算总收益、年化、最大回撤、夏普比率、卡玛比率、胜率等核心指标,并输出资金曲线+
月度收益热力图。
3.3. 策略层(strategies/)
base.py 的 Strategy 定义了策略契约:on_init 初始化 + on_bar/on_tick 返回
交易信号。
demo 策略(教学示例):双均线交叉 ma_cross(金叉买/死叉卖)、布林带回归
bollinger_revert(触下轨买/触上轨卖)、网格交易 grid_trade(多层网格低买高卖)。
advanced 策略:截面动量 momentum(买过去 N 日涨幅 Top 20%)、多因子选股
factor_portfolio(调用 C++ 因子引擎算分,z-score 标准化后加权选 Top N)、策略
组合器 portfolio_combiner。注意 ma_cross 策略直接调用 C++ 的 SMA 类做批量预计算,
很好地展示了 C++/Python 混合调用的实战用法。
3.4. 实盘信号(signal/)
producer.py 定时跑策略生成信号,exporter.py 将信号写成 JSON 文件供 QMT(券商量化终端)
读取执行——实现了「信号生成与执行解耦」。
四. 脚本与配置
scripts/ 是整套系统的 CLI 入口,形成完整工作流:
1. download_data.py → 从 akshare 下载行情到本地 Parquet
2. run_backtest.py → 运行回测,输出绩效报告和图表
3. param_optimize.py → 网格搜索参数(itertools.product 穷举组合)
4. start_live.py → 实盘信号生成,导出供 QMT 读取
config/*.yaml 集中管理股票池、策略参数、风控阈值、执行模式,实现配置与代码分离。
五.值得学习的亮点
C++/Python 混合架构:把纯计算(指标/因子/风控)下沉到 C++,策略逻辑留在 Python,
兼顾性能与灵活性,是生产级量化系统的标准做法。
指标双模式设计:批量 + 增量更新 + 环形缓冲区,O(1) 流式更新。
插件式注册表:REGISTER_INDICATOR 宏自动注册,零侵入扩展。
配置驱动实盘:通过 YAML 启停策略、调参、设风控,无需改代码。
三层风控:开仓前/盘中/收盘后分阶段风控,保证实盘安全。
六.可改进方向(仅供参考)
portfolio.py 通过遍历 broker.orders 反查佣金,可用 order_id 建立索引优化。
producer.produce() 目前把所有策略输出都归为 hold,未真正输出买卖动作,实盘逻
辑有待完善。portfolio_combiner 的 combine_signals() 目前只记录日志未返回合成
信号,尚未完成。回测引擎每根 bar 用 DataFrame 过滤查找,日频可接受,但 tick 级
别需优化。如需我深入讲解某个模块(如回测撮合细节、因子引擎的 C++ 实现,或如何扩展
一个新策略),可以告诉我。