⚡
power-quant-backtest

PowerQuant Backtest

Rust 核心引擎 + Python 绑定,零依赖极速回测

一行 pip install 装,Python 写策略,Rust 跑回测

PowerQuant Backtest(power-quant-backtest)—— Rust 实现的事件驱动回测引擎,通过 PyO3 提供 Python 绑定。BacktestEngine 负责 FIFO 仓位撮合,BarGenerator 合成多周期 K 线,ArrayManager 管理技术指标,BacktestReport 输出含夏普/索提诺/最大回撤的完整统计。Python 库本身零运行时依赖,单 wheel 覆盖 Python 3.12 / 3.13+。

👤会写 Python、想让回测引擎又快又稳的策略开发者;也想给会 Rust 的同事一个可直接 cargo build 的内核。适合做日内突破、双均线、SuperTrend 等典型策略的研究与迭代。 · ⚙️Rust 核心 + Python 绑定 · 📦MIT · v0.1.1 · 🎯Python 3.12 / 3.13+
想看完整 API 与示例?往下看安装 / 架构 / 示例章节;想看源码与发布历史,访问 Gitee 仓库。
01

安装方法

两种方式任选其一 · 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
02

快速开始

20 行 Python 跑通一个完整回测

⚡ 最小可运行

最经典的「价格上穿 MA20 开多,下穿平多」策略。把 bars 换成你的真实 K 线数据即可上线。 完整代码见仓库 examples/01_quickstart.py。

🐍 examples/01_quickstart.py 单均线 MA(20) 策略
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() 输出统计。

03

架构概览

Rust 核心引擎 + Python 绑定 · 一套代码两种用法

Python 层
SingleMaStrategy.on_bar
DualMaStrategy.on_bar
your_strategy.on_bar
用户写策略的地方
PyO3 0.27.2 · abi3-py312 ↕ 零拷贝数据交换
Rust 核心引擎
BacktestEngine · 事件循环 + 撮合
BacktestContext · 账户与订单
BarGenerator · 多周期合成
ArrayManager · OHLCV 数组
BacktestReport · 统计报告
高性能内核 · ~9585 行 Rust

Python 端写策略、调 API;Rust 端跑撮合、算指标、出报告。 中间通过 PyO3 桥接,Bar、Context 等对象在两边自动映射。 同一份 Rust 代码既能编译成 Python 扩展(cdylib),也能作为纯 Rust crate(rlib)给其他 Rust 项目用。

04

核心组件

你需要知道的 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 时注册。

05

Python 示例

面向策略开发者 · 4 个示例覆盖典型场景

01 01_quickstart.py 快速入门

最小可运行回测:单均线 MA(20) 策略,覆盖 engine 创建、合约注册、数据载入、策略定义、报告输出全流程。

BacktestEngine基础订单
02 02_dual_ma.py 双均线 + 多周期

MA(20)/MA(60) 金叉死叉策略,演示 BarGenerator 把 1min 合成 5min / 60min,以及 ArrayManager 滑动窗口管理指标。

BarGeneratorArrayManager做多 + 做空
03 03_range_break.py 日内突破 + 止损止盈

前一交易日高低点定义当日 range,突破上下沿开仓,固定止损 -50 点、止盈 +100 点、尾盘 15:00 强制平仓。

日内止损止盈强平
04 04_trend_adaptive.py SuperTrend + 自适应仓位

基于 ATR(10) 计算 SuperTrend 趋势线,连亏 3 次自动减仓 50%、连亏 5 次进入 10 根 K 线冷却期。

ATRSuperTrend状态机
🐍 双均线策略核心片段 演示 BarGenerator + ArrayManager 组合
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 序列计算指标
        # ↓ 金叉开多 / 死叉开空 ...
06

Rust 示例

面向引擎开发者 · 3 个示例覆盖 Trait 模式

01 examples-rs/dual_ma.rs Strategy Trait 完整实现

Rust 原生 Strategy 接口的标准写法,演示如何在 Rust 中定义策略结构体并实现 on_bar 回调。运行:cargo run --example dual_ma

Strategy Trait标准模式
02 examples-rs/range_break.rs 内置策略驱动示例

调用项目内置的 RangeBreak 策略,演示 Rust 端如何复用 src/strategy/built_in/ 下的现成实现。运行:cargo run --example range_break

built_in复用
03 examples-rs/trend_adaptive.rs 4 状态进阶信号

连亏减仓、冷却期、趋势翻转四个状态机实现,适合 Rust 开发者学习复杂策略状态管理。运行:cargo run --example trend_adaptive

4 状态机进阶
🦀 Rust Strategy Trait 实现模式 cargo run --example dual_ma
// 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![],
    });
}
07

技术规格

依赖、版本与兼容性一览

核心语言 Rust 2021 edition
Python 绑定 PyO3 0.27.2
ABI 兼容 abi3-py312(Python 3.12 / 3.13+)
目标平台 Windows win_amd64(首发)
运行时依赖 零(不依赖 pandas / numpy)
构建工具 maturin ≥ 1.7
Rust 依赖 chrono · serde · serde_json · csv · thiserror · tracing · numpy
当前版本 0.1.1 · 2026-07-15
开源协议 MIT
想看完整源码与设计文档?
Gitee 仓库包含 ~9585 行 Rust 源码、设计文档、CI 配置与所有示例。
📦 访问 Gitee 仓库 →
08

常见问题

使用前的疑问,先在这里找答案

为什么需要用 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。

想直接跑起来试试?
回到顶部「安装方法」,一行 pip install 即可开始。完整示例在 Gitee 仓库 examples/ 目录。
↑ 回到安装