A股回测用Rust重写|akquant全栈实战

核心价值:Rust 内核 + Python 生态,把 A 股回测速度从 Backtrader 的基线拉到 10× 量级

把事件驱动、机器学习、生产级风控塞进同一个量化研究框架。

⚠️ 本文仅作技术交流,不构成投资建议。股市有风险,投资需谨慎。


akquant 是一款专为 量化投研 (Quantitative Research) 打造的高性能混合架构引擎,核心用 Rust 编写,通过 PyO3 暴露给 Python。截至 2026-07-26,已累计 887 commits,GitHub 1,886 Stars248 Forks,MIT 开源,PyPI 一行安装(pip install akquant)。

   

它的核心定位是:用 Rust 铸造极速撮合内核,用 Python 链接数据与 AI 生态,让"事件驱动 + 机器学习 + 生产级风控"在同一个框架下完成。

核心定位:把"研究想法 → 回测验证 → 风控拦截 → 绩效分析"塞进一条 Pipeline,全部用 Python 写策略,底层 Rust 跑。


️ 三层架构:Python 调用 → PyO3 接口 → Rust 核心

akquant 采用 Rust + Python 混合架构,三层层层分明:

 

第 1 层:Python 用户层

  • Strategy API:Strategy 基类提供 on_bar、on_tick、on_order、on_trade、on_timer 回调
  • ML Framework:akquant.ml 模块提供 QuantModel 抽象基类 + SklearnAdapter / PyTorchAdapter
  • Data API:兼容 Pandas,从 CSV、Parquet、内存 DataFrame 直接加载
  • Analysis:plot 模块基于 Plotly,交互式可视化

第 2 层:PyO3 接口层

  • • 利用 PyO3 把 Rust 的核心结构体(Engine、StrategyContext、Bar、Order、RiskManager)暴露为 Python 类
  • • 数据导入(add_arrays)借用 NumPy 缓冲、零拷贝进入引擎
  • • 历史读取(get_history)返回安全快照拷贝(窗口小、开销可忽略)

第 3 层:Rust 核心层(akquant_core)

  • Engine:事件驱动核心,采用 BinaryHeap 管理定时器
  • RiskManager独立拦截层,在 Rust 引擎层直接拦截违规订单
  • MarketManager:支持 SimpleMarket / ChinaMarket 切换,内置 A 股 T+1 规则、涨跌停、中国单一腿保证金
  • Portfolio:独立投资组合管理,实时维护持仓与账户资金
  • ExecutionClient:抽象执行层,支持模拟 + 实盘切换

关键设计:RiskManager 在 Rust 层做拦截,而不是 Python 层。这意味着即便 Python 策略代码存在漏洞,违规订单也根本不会进到撮合引擎。


✨ 五大核心模块

 

模块 1:Polars Alpha101 因子表达式引擎

  • • 内置 akquant.polars_factor 模块,Polars 驱动的高性能因子计算
  • • 支持 Alpha101 风格公式:Rank(Ts_Mean(Close, 5)) 一行回测
  • 自动处理并行计算与数据对齐,对比传统 pandas 写法提速明显

模块 2:Walk-forward 机器学习训练

  • • 内置完整的 ML Pipeline:fit、predict、save、load 标准接口
  • • 策略中通过 set_rolling_window 配置滚动参数,引擎自动触发 on_train_signal 事件
  • 内置 PyTorchAdapter,支持增量训练 (incremental) 和 GPU 加速

模块 3:A 股专属风控(ChinaMarket)

  • T+1 严格风控:严格检查 available_positions,杜绝日内回转交易
  • 涨跌停限制:内置 ±10% 价格笼子检查
  • 可用持仓管理:自动维护 available_positions,扣减冻结数量
  • 资金/持仓限制:RiskConfig 支持最大单笔金额、最大持仓比例、限制名单 (RestrictedListRule)

模块 4:流式 CSV + Pandas 集成

  • • DataFeed.from_csv 支持流式加载超大 CSV 文件,最小化内存占用
  • • 支持直接 pd.read_csv → add_arrays 零拷贝导入
  • • 智能缓存:支持本地 Pickle 缓存,避免重复下载

模块 5:Plotly 交互式可视化

  • • result.viz.report() 一键生成交互式 HTML 报告
  • • 自动渲染:资金曲线、回撤分析、月度热力图、年度收益、归因分解
  • • 配套 QuantStats 集成,支持 result.metrics_df / result.trades_df / result.positions_df

️ 快速上手:5 分钟跑通示例

Step 1 — 安装

# PyPI 一键安装(无需 Rust 环境)
pip install akquant

# 或从源码编译(推荐,启用所有扩展)
git clone https://github.com/akfamily/akquant.git
cd akquant
uv sync
uv run maturin develop

Step 2 — 准备数据

akquant 推荐两种数据源:

import akshare as ak

# 方式 A:使用 akshare 获取 A 股数据
df = ak.stock_zh_a_daily(
    symbol="sh600000",  # 浦发银行
    start_date="20250101",
    end_date="20260701",
)

# 方式 B:自定义因子(任何数值列都会被识别为因子)
df["momentum"] = df["close"] / df["open"]       # 动量因子
df["volatility"] = df["high"] - df["low"]       # 波动率因子
df["sentiment_score"] = compute_sentiment(df)   # 情绪因子

Step 3 — 写策略

from akquant import Strategy, run_backtest

class MyStrategy(Strategy):
    def on_bar(self, bar):
        # 通过 bar.extra 访问所有自定义因子
        mom = bar.extra.get("momentum", 0.0)
        vol = bar.extra.get("volatility", 0.0)
        score = bar.extra.get("sentiment_score", 0.0)

        position = self.get_position(bar.symbol)

        # 综合三因子决策
        if position == 0 and mom > 1.02 and score > 0.8:
            self.buy(bar.symbol, 100)
        elif position > 0 and (vol > 0.05 or score < 0.3):
            self.sell(bar.symbol, 100)

注意:bar.extra 是一个 dict,可以传任意数量的数值字段,akquant 会自动识别并在 Rust 侧打包。

Step 4 — 运行回测

result = run_backtest(
    strategy=MyStrategy,
    data=df,
    symbols="sh600000",
    initial_cash=500_000.0,
    commission_rate=0.0003,  # 万三佣金
)

# 查看绩效
print(f"Total Return: {result.metrics.total_return_pct:.2f}%")
print(f"Sharpe Ratio: {result.metrics.sharpe_ratio:.2f}")
print(f"Max Drawdown: {result.metrics.max_drawdown_pct:.2f}%")

Step 5 — 可视化

# 一行生成交互式 HTML 报告
result.viz.report(
    show=True,                 # 自动在浏览器中打开
    compact_currency=True,     # 金额按 K/M/B 紧凑显示
)

 

这就是 akquant 真实仪表盘:资金曲线、回撤分析、月度热力图、归因分解、年度收益,一张图全说清楚。


与主流回测框架对比

 

关键差异

对比 1:核心架构

  • Backtrader:纯 Python 事件循环,IO 与计算都受 GIL 制约
  • VectorBT:NumPy 向量化,需要把整个时间序列装入内存
  • akquantRust 事件队列 + Python 策略回调,规避 GIL,性能 + 灵活兼得

对比 2:原生 ML 支持

  • Backtrader:需手写 scikit-learn 集成,无滚动训练框架
  • VectorBT:NumPy 主导,深度学习集成需绕道
  • akquant内置 WalkForwardTrainer,策略中直接 set_rolling_window,引擎自动触发 on_train_signal

对比 3:A 股适配

  • Backtrader:需自己实现 T+1、涨跌停
  • VectorBT:完全无中国市场概念
  • akquant内置 ChinaMarket + RiskManager 拦截层,A 股规则开箱即用

对比 4:文档质量

  • Backtrader:英文为主
  • VectorBT:英文为主
  • akquant完整 16 章中文教材(https://akquant.akfamily.xyz ),含安装、快速开始、API 参考、策略开发、自定义指标、参数优化、时区、多策略、热启动等专题

三个典型使用场景

场景 1:多因子选股策略回测

akquant 的 Polars Alpha101 因子引擎是核心卖点。你可以直接写表达式:

from akquant import polars_factor as pf

# Alpha101 风格因子(一行搞定)
alpha_001 = pf.rank(pf.ts_mean(pf.close, 5))  # 5 日均价的横截面排名
alpha_005 = pf.ts_rank(pf.volume, 10)          # 10 日成交量的时间序列排名

# 组合成综合选股信号
score = alpha_001 * 0.6 + alpha_005 * 0.4

整个流程走 5 步:数据准备 → 因子表达式 → 回测引擎 → 风控拦截 → 绩效分析,全部在同一个 Python 脚本里完成。

场景 2:ML 滚动训练

akquant 把"训练-预测"完全嵌入事件循环。无需手写 scheduler:

class MLStrategy(Strategy):
    def on_init(self):
        # 配置滚动窗口:每 60 个 bar 重新训练一次
        self.set_rolling_window(
            train_window=240,    # 用 240 根 bar 训练
            retrain_every=60,    # 每 60 根 bar 重训
        )
        self.model = None

    def on_train_signal(self, history):
        # 引擎会在合适时机回调这里
        X = history[["momentum", "volatility", "sentiment_score"]]
        y = history["future_return"]
        self.model = SklearnAdapter(RandomForestRegressor())
        self.model.fit(X, y)

    def on_bar(self, bar):
        if self.model is None:
            return
        pred = self.model.predict(bar.extra)
        if pred > 0.02:
            self.buy(bar.symbol, 100)

优势:训练和回测是同一个事件循环,避免了"线下训练 → 线上部署"的一致性问题。

场景 3:参数优化(网格搜索)

akquant 内置多进程网格搜索框架,支持策略参数的高效并行优化

from akquant.optim import GridSearch

gs = GridSearch(
    strategy=MyStrategy,
    data=df,
    param_grid={
        "fast_window": [5, 10, 20],
        "slow_window": [30, 60, 120],
        "threshold": [0.01, 0.02, 0.05],
    },
    metric="sharpe_ratio",
    n_jobs=-1,  # 用满所有 CPU
)
results = gs.run()
print(results.best_params_)

 数据来源:akquant 官方 benchmark(基于 50 标的 × 5000 根 bar 回测,CPU i7-12700H)

用户群体总结

  • • ✅ 量化研究员:Alpha101 因子表达式 + Walk-forward ML 是日常工具
  • • ✅ 量化团队负责人:ChinaMarket + RiskManager 提供 A 股合规底座
  • • ✅ 量化教学/培训机构:16 章中文教材可直接作为教学大纲
  • • ✅ 私募/资管 IT:Rust 性能 + Python 灵活,适合中频策略的实盘化
  • • ❌ 不适合:纯 K 线看图交易者、加密货币高频做市(akquant 主打 A 股中低频)

安装与生态

PyPI 一键安装(无需 Rust 环境):

pip install akquant

可选依赖

  • • akquant[train] — 包含 PyTorch、scikit-learn
  • • akquant[plot] — 包含 Plotly、QuantStats
  • • akquant[akshare] — 包含 akshare 自动数据加载

版本历史

  • • v0.1.0:初始发布(PyO3 基础框架)
  • • v0.1.27:文档更新与示例扩充
  • • v0.1.84:环境管理从 conda 迁移至 uv
  • • v0.2.19:新增 Plotly 交互式报告、Walk-forward ML 框架
  • • 当前 main:持续迭代中

开源协议: MIT


总结

akquant 不是又一个"Backtrader 替代品",它的差异化在于:

  1. 1. Rust 内核:真正的事件驱动 + 零拷贝数据通路,比纯 Python 框架快一个数量级
  2. 2. A 股原生:ChinaMarket + RiskManager 拦截层,T+1 / 涨跌停 / 保证金开箱即用
  3. 3. ML First:内置 WalkForwardTrainer + PyTorchAdapter,把滚动训练和回测放进同一个事件循环
  4. 4. Polars Alpha101 引擎:Rank(Ts_Mean(Close, 5)) 这种表达式一行搞定,无需手写 vectorize
  5. 5. 完整文档:16 章中文教材 + Plotly 交互报告,对个人研究者友好

对量化研究员的实际价值:把"研究想法 → 代码 → 回测 → 风控 → 分析"五个环节合并到同一个 Python 脚本里,不需要再拼装 Backtrader + 自写 T+1 + jupyter 写报告。

推荐指数: ⭐⭐⭐⭐⭐(满分 5 星)

适合人群: A 股量化研究员、私募/资管 IT、量化教学、AI 量化 PhD 学生

立即体验: akquant 官方文档

GitHub 仓库: akfamily/akquant


数据截至 2026-07-29,最新信息请以官网为准。

 

文章来源:https://www.toutiao.com/article/7667861942515253766/

posted @ 2026-07-30 23:15  Leone-  阅读(28)  评论(0)    收藏  举报