PowerQuant Backtest
Rust 核心引擎 + Python 绑定,零依赖极速回测
PowerQuant Backtest(power-quant-backtest)—— Rust 实现的事件驱动回测引擎,通过 PyO3 提供 Python 绑定。BacktestEngine 负责 FIFO 仓位撮合,BarGenerator 合成多周期 K 线,ArrayManager 管理技术指标,BacktestReport 输出含夏普/索提诺/最大回撤的完整统计。Python 库本身零运行时依赖,单 wheel 覆盖 Python 3.12 / 3.13+。
安装方法
两种方式任选其一 · Windows · Python 3.12 / 3.13+
从 Gitee Release 直接装预编译 wheel,无需本地 Rust 工具链。单 wheel 覆盖 Python 3.12 与 3.13+(abi3)。
一键安装
pip install https://gitee.com/power-quant/power-quant-backtest/releases/download/\ v0.1.0/power_quant_backtest-0.1.0-cp312-abi3-win_amd64.whl
验证安装
python -c "from power_quant_backtest import BacktestEngine; \ print(BacktestEngine)"
想改 Rust 内核、调试源码,或不在首发 Windows 平台?走源码构建路径。需要 stable Rust 工具链 + maturin。
构建并安装
# 需要 Rust 工具链(stable)+ maturin pip install maturin maturin build --release --strip pip install target/wheels/*.whl
跑测试
cargo test pytest tests/test_smoke.py
快速开始
20 行 Python 跑通一个完整回测
最经典的「价格上穿 MA20 开多,下穿平多」策略。把 bars 换成你的真实 K 线数据即可上线。
完整代码见仓库 examples/01_quickstart.py。
from power_quant_backtest import BacktestEngine
class SingleMaStrategy:
"""最简单的单均线策略:价格上穿 MA20 开多,下穿平多。"""
def __init__(self, period=20):
self.period = period
self.closes = []
def on_bar(self, bar, context):
self.closes.append(bar.close)
if len(self.closes) < self.period:
return
ma = sum(self.closes[-self.period:]) / self.period
symbol = bar.symbol
long_qty = context.long_quantity(symbol)
if bar.close > ma and long_qty == 0.0:
context.buy(symbol, bar.close, 1.0) # 开多 1 手
elif bar.close < ma and long_qty > 0.0:
context.sell(symbol, bar.close, long_qty) # 平多
def on_start(self, context):
print("策略启动 | 单均线 MA({})".format(self.period))
def on_finish(self, context):
print("策略结束 | 最终资金: {:.2f}".format(context.total_assets))
engine = BacktestEngine(100_000.0) # 初始资金 10 万
engine.add_instrument("RB88", 10.0, 0.00001, 1.0, 1.0, 0.1)
# ↑合约 ↑乘数 ↑手续费率 ↑滑点 ...
engine.add_bars(bars) # 你的 K 线数据
report = engine.run_with_python_strategy(SingleMaStrategy(period=20))
report.print_summary()
↑ 关键模式:BacktestEngine 创建 → add_instrument 注册合约 →
add_bars 灌数据 → run_with_python_strategy 跑策略 →
report.print_summary() 输出统计。
架构概览
Rust 核心引擎 + Python 绑定 · 一套代码两种用法
SingleMaStrategy.on_barDualMaStrategy.on_baryour_strategy.on_barBacktestEngine · 事件循环 + 撮合BacktestContext · 账户与订单BarGenerator · 多周期合成ArrayManager · OHLCV 数组BacktestReport · 统计报告
Python 端写策略、调 API;Rust 端跑撮合、算指标、出报告。
中间通过 PyO3 桥接,Bar、Context 等对象在两边自动映射。
同一份 Rust 代码既能编译成 Python 扩展(cdylib),也能作为纯 Rust crate(rlib)给其他 Rust 项目用。
核心组件
你需要知道的 6 个核心类型
BacktestEngine src/engine/backtest.rs 回测引擎主入口,负责事件循环、订单撮合、账户结算。new(capital) 创建后调用 add_instrument 注册合约、add_bars 灌数据、run_with_python_strategy / run_with_strategy 启动回测。
BarGenerator src/generator/bar_generator.rs K 线合成器:minute_window(5) / hour_window(1) 等工厂方法生成合成器,update(bar) 喂入 1min K 线,到窗口闭合时吐出 5min / 60min / 日线 K 线。
ArrayManager src/generator/array_manager.rs OHLCV 滑动数组:update_bar(bar) 追加数据,close() / high() / low() 取出序列计算指标。inited() 判断预热是否完成(默认 100 根)。
BacktestReport src/report/ 回测结果汇总:资金曲线、每日权益、成交明细、平仓明细。统计指标含夏普比率、索提诺比率、最大回撤、胜率、盈亏比。print_summary() 一键打印。
BacktestContext src/context/ 策略交互上下文:buy / sell / sell_short / buy_cover 下单,long_quantity / short_quantity 查持仓,total_assets 查总权益。position_book 用 FIFO 匹配。
Instrument src/types/instrument.rs 合约元数据:name、multiplier(乘数)、commission_rate(手续费率)、slippage、margin_ratio 等。add_instrument 时注册。
Python 示例
面向策略开发者 · 4 个示例覆盖典型场景
01_quickstart.py 快速入门 最小可运行回测:单均线 MA(20) 策略,覆盖 engine 创建、合约注册、数据载入、策略定义、报告输出全流程。
02_dual_ma.py 双均线 + 多周期 MA(20)/MA(60) 金叉死叉策略,演示 BarGenerator 把 1min 合成 5min / 60min,以及 ArrayManager 滑动窗口管理指标。
03_range_break.py 日内突破 + 止损止盈 前一交易日高低点定义当日 range,突破上下沿开仓,固定止损 -50 点、止盈 +100 点、尾盘 15:00 强制平仓。
04_trend_adaptive.py SuperTrend + 自适应仓位 基于 ATR(10) 计算 SuperTrend 趋势线,连亏 3 次自动减仓 50%、连亏 5 次进入 10 根 K 线冷却期。
from power_quant_backtest import (
BacktestEngine, ArrayManager, BarGenerator,
)
class DualMaStrategy:
"""双均线策略:MA(20)/MA(60) 金叉死叉 + 5min 周期合成。"""
def __init__(self):
self.bg = BarGenerator.minute_window(5) # 1min → 5min 合成
self.am = ArrayManager(100) # 滑动 OHLCV 数组
def on_bar(self, bar, context):
target_bar = self.bg.update(bar)
if target_bar is None or target_bar.state != 2:
return # 5min 窗口未闭合
self.am.update_bar(target_bar)
if not self.am.inited():
return # 预热阶段
closes = self.am.close()
short_ma = sum(closes[-20:]) / 20
long_ma = sum(closes[-60:]) / 60
# ↑ 从 ArrayManager 取出 close 序列计算指标
# ↓ 金叉开多 / 死叉开空 ... Rust 示例
面向引擎开发者 · 3 个示例覆盖 Trait 模式
examples-rs/dual_ma.rs Strategy Trait 完整实现 Rust 原生 Strategy 接口的标准写法,演示如何在 Rust 中定义策略结构体并实现 on_bar 回调。运行:cargo run --example dual_ma
examples-rs/range_break.rs 内置策略驱动示例 调用项目内置的 RangeBreak 策略,演示 Rust 端如何复用 src/strategy/built_in/ 下的现成实现。运行:cargo run --example range_break
examples-rs/trend_adaptive.rs 4 状态进阶信号 连亏减仓、冷却期、趋势翻转四个状态机实现,适合 Rust 开发者学习复杂策略状态管理。运行:cargo run --example trend_adaptive
// examples-rs/dual_ma.rs — Rust Strategy Trait 完整实现模式
// 运行:cargo run --example dual_ma
use power_quant_backtest::{BacktestEngine, Strategy};
pub struct DualMaStrategy {
short_period: usize,
long_period: usize,
closes: Vec<f64>,
}
impl Strategy for DualMaStrategy {
fn on_bar(&mut self, bar: &Bar, ctx: &mut BacktestContext) {
self.closes.push(bar.close);
if self.closes.len() < self.long_period {
return;
}
let short_ma: f64 = self.closes.iter()
.rev().take(self.short_period).sum::<f64>()
/ self.short_period as f64;
let long_ma: f64 = self.closes.iter()
.rev().take(self.long_period).sum::<f64>()
/ self.long_period as f64;
// ↑ Rust 端直接操作 Vec<f64>,零 Python 互开销
// ↓ 金叉死叉下单 ...
}
}
fn main() {
let mut engine = BacktestEngine::new(100_000.0);
engine.add_instrument("RB88", 10.0, 0.00001, 1.0, 1.0, 0.1);
engine.run_with_strategy(DualMaStrategy {
short_period: 20, long_period: 60, closes: vec![],
});
} 技术规格
依赖、版本与兼容性一览
常见问题
使用前的疑问,先在这里找答案
为什么需要用 Rust 写回测引擎?
Python 写的策略在内层循环会被解释器开销拖慢。Rust 实现的撮合引擎跑 year-long 1min K 线通常比纯 Python 快一个数量级以上,参数优化、Walk-forward 这类需要重复跑成百上千次的场景收益尤其明显。
装 wheel 为什么不依赖 pandas / numpy?
Python 绑定层只用了 PyO3 + Rust 标准库 + chrono,数据通过 Bar、ArrayManager 等内置类型交互。需要 pandas 时自己包一层 pd.DataFrame(am.close()) 即可,避免装上一堆重依赖。
支持哪些品种和周期?
add_instrument 注册的合约都可以回测。BarGenerator 当前支持 1min → 5min / 60min / 日线 合成。示例以期货 RB88 螺纹钢为主,股票 / 期权数据格式一致,但保证金 / 行权逻辑需要策略端自行处理。
Python 3.12 以下的版本能用吗?
不能。wheel 是 abi3-py312 构建,最低支持 Python 3.12,同时兼容 3.13 及以上。建议直接用 3.12 或更新版本。
可以只跑 Rust 不带 Python 吗?
可以。crate-type 同时包含 cdylib(给 Python 用)和 rlib(给 Rust 用)。直接把 power_quant_backtest 作为依赖引入其他 Rust 项目即可,examples-rs/ 下有三个纯 Rust 示例。
为什么不开 GitHub Actions 自动构建?
本项目只发布 Gitee。Gitee Go 免费版只有 Linux runner,无法交叉编译 Windows abi3-py312 wheel,所以改成手动 maturin build --release 后用 scripts/publish_gitee.sh 上传到 Gitee Release。