- 金融科技
- 后端
- 数据分析
【免费下载链接】QUANTAXIS
QUANTAXIS 支持任务调度 分布式部署的 股票/期货/期权 数据/回测/模拟/交易/可视化/多账户 纯本地量化解决方案
QUANTAXIS 在 2.1.0 版本中引入 Rust 集成(QARS2 / QUANTAXIS Rust),将数据计算、账户撮合与回测引擎迁移到 Rust 侧,目标是对纯 Python 实现获得 10~100 倍的性能提升。本文以 doc/advanced/rust-integration.md 为核心骨架,结合仓库内 QARSBridge 桥接层与 qapro-rs 源码,系统讲解 QARS2 的架构组成、安装验证、典型用法(MA/动量/因子计算)、Arrow 零拷贝与并行计算等高级特性,并给出仓库内的源码级证据与可复现的性能对比方法。读完本文,你将能够在自己的 QUANTAXIS 环境中启用 Rust 后端、检测其可用性、用 Rust 加速指标与因子计算,并理解背后的数据交换与自动回退机制。
1. 为什么需要 Rust 集成:性能瓶颈与解决思路
QUANTAXIS 是纯本地的量化解决方案,覆盖数据获取、回测、模拟、交易、可视化与多账户管理。当数据量达到数百万根 K 线、回测标的成百上千时,纯 Python 实现的瓶颈会集中在三处:
- 逐行/循环计算:Python 解释器逐条执行循环,MA、动量等滚动类指标计算耗时随数据规模线性恶化;
- 解释器开销:每个数值运算都伴随对象装箱、类型分派等运行时开销;
- 内存占用:重复拷贝的 DataFrame/Series 在大规模因子计算中造成明显的内存压力。
QARS2 的解决思路是把热路径计算下沉到 Rust:
- qars2(qars)核心库:用 Rust 实现数据处理、指标计算与账户撮合逻辑;
- PyO3 绑定:提供 Python 侧可调用的模块接口,完成 Python ↔ Rust 互操作;
- Apache Arrow:作为零拷贝数据交换格式,避免 Python 对象与 Rust 结构之间反复序列化拷贝。
从仓库代码看,这一思路同时落在两个层面:一是独立的 Rust 工程 qapro-rs(QUANTAXIS Rust 版本,支持 SIMD 加速的 polars 依赖);二是 Python 侧的桥接层 QUANTAXIS/QARSBridge/init.py,它对外暴露QARSAccount、QARSBacktest与has_qars_support(),并实现了未安装 Rust 核心时自动回退纯 Python 实现的降级机制(见下文第 4 节)。
2. 核心组件与架构概览
根据 doc/advanced/rust-integration.md 及仓库实现,QARS2 的架构可以拆成三个层次:
| 层次 | 组件 | 职责 |
|---|---|---|
| 计算核心 | qars2 / qapro-rs | 向量化指标计算、SIMD 优化、并行处理 |
| 互操作层 | PyO3 绑定 + Apache Arrow | Python 与 Rust 之间的函数调用与零拷贝数据交换 |
| Python 桥接层 | QARSBridge | 统一 Python 接口、能力检测、自动回退 |
仓库中可印证的实际对应关系:
- Rust 核心工程:qapro-rs 的
Cargo.toml中,polars依赖显式开启了simd、rolling_window、pct_change、moment、ewma、parquet、ndarray等特性(见 qapro-rs/Cargo.toml),这正是"向量化 + SIMD 优化"的直接证据; - 并行计算:依赖
rayon = "1.5"(见 qapro-rs/Cargo.toml),对应文档中parallel_process的多标的并行计算能力; - 数据交换:Rust 侧提供 qapro-rs/src/qadata/arrowbase.rs 与
datafunc.rs等基础数据模块,支撑 Arrow 表结构与队列、极值、均值等基础算子; - Python 桥接:QUANTAXIS/QARSBridge/init.py 通过
import qars3(QARS2 系列 Python 包)尝试加载 Rust 核心,并缓存HAS_QARS标志。
说明:原文档中使用的模块名为
qars2,而当前仓库 QARSBridge 实际导入的是qars3包(from qars3 import QA_QIFIAccount,见 QUANTAXIS/QARSBridge/init.py)。两者同属 QARS2 Rust 核心的 Python 发布形态,具体以你安装到的包版本为准,使用前建议先用下文第 4 节的方法确认当前环境实际可用的模块名。
3. 安装 Rust 核心
3.1 方式一:pip 直接安装(推荐)
根据 QUANTAXIS/QARSBridge/init.py 中的提示,Rust 核心随 QUANTAXIS 的 rust extra 一起安装:
pip install quantaxis[rust]等价地,也可以在 QARS2 源码目录下以可编辑模式安装:
cd /path/to/qars2 pip install -e .3.2 方式二:基于仓库内 Rust 源码编译
仓库内置的 Rust 工程 qapro-rs 支持 Windows / macOS / Linux 三平台编译:
cd qapro-rs cargo build --release需要 SIMD 加速支持时,使用 nightly 工具链编译运行:
cargo +nightly run --color=always --package qapro-rs --release example.tomlqapro-rs运行前需要拉起四个基础设施服务:clickhouse、redis、mongodb、rabbitmq。如果本地没有这些服务,可直接用仓库自带的编排文件启动:
docker-compose -f qapro-rs/database.yaml up -d如果已有部分服务,可以修改database.yaml删掉对应代码块(详见 qapro-rs/readme.md)。启动 API 服务时,默认监听 5000 端口,具体开启的服务在example.toml中配置:
cargo run --release example.toml cargo run --example api --release example.toml4. 验证 Rust 核心是否生效
安装完成后,最稳妥的方式是调用桥接层提供的能力检测函数。仓库中 QUANTAXIS/QARSBridge/init.py 定义了has_qars_support():
from QUANTAXIS.QARSBridge import QARSAccount, QARSBacktest, has_qars_support if has_qars_support(): print("✨ QARS2 Rust 核心已启用,将获得极致性能") else: print("使用 Python 实现,建议 pip install quantaxis[rust]")更详细的状态可以通过版本信息接口获取:
from QUANTAXIS.QARSBridge import get_version_info info = get_version_info() # {'bridge_version': '2.1.0.alpha1', 'has_qars': True, # 'qars_version': 'unknown'/'2.x', 'backend': 'Rust'/'Python'} print(f"后端: {info['backend']}")自动回退机制是桥接层的重要设计(见 QUANTAXIS/QARSBridge/init.py):
- 当
HAS_QARS = True时,QARSAccount指向 Rust 实现 qars_account.py,QARSBacktest指向 Rust 回测引擎; - 当导入失败时,
QARSAccount自动退化为纯 Python 的QIFI_Account,并打印ImportWarning提示安装方式;QARSBacktest则会抛出ImportError(因为回测引擎必须依赖 Rust 核心)。
这意味着你的既有代码无需改动即可平滑升级:装好 Rust 核心自动加速,没装则维持原行为,只是性能不同。
5. 高性能数据处理:核心用法示例
以下示例完整继承自 doc/advanced/rust-integration.md,并与仓库实际接口做了对照说明。
5.1 指标计算(MA)
import qars2 # 若你的环境包名为 qars3,请相应替换 import pandas as pd # 传统方式(慢) data = pd.read_csv('stock_data.csv') ma = data['close'].rolling(20).mean() # Rust 加速方式(100x faster) ma_fast = qars2.ma(data['close'].values, 20)仓库中对应的 Rust 基础算子可见 qapro-rs/src/qadata/datafunc.rs:例如dma(lst, tail)直接对切片计算均值、dhhv/dllv取窗口极值、Que<T>实现固定容量历史 K 线队列,这些都是滚动类指标在 Rust 侧的原语实现。
5.2 QADataFrame 集成
文档给出的 DataFrame 集成方式如下(从 QUANTAXIS 拉取行情后交给 Rust 计算多条均线):
from QUANTAXIS import QA_DataStruct_Stock_day import qars2 # 加载数据 data = QA.QA_fetch_stock_day('000001', '2020-01-01', '2024-12-31') # 使用 Rust 计算指标 df_rust = qars2.QADataFrame(data) ma5 = df_rust.ma(5) ma20 = df_rust.ma(20)在实际仓库中,与"Rust 数据结构 + 高性能计算"对应的落地形态是 QARSBridge 的账户与回测组件(见 QUANTAXIS/QARSBridge/qars_account.py):QARSAccount内部持有 Rust 账户实例_RustQIFIAccount,Python 侧只做参数转发与结果封装,这就是"数据/状态常驻 Rust、Python 只做薄封装"的架构体现。
5.3 因子计算(动量)
# Python 方式(慢) def calculate_momentum(df, period=20): return (df['close'] / df['close'].shift(period) - 1) * 100 # Rust 方式(快) momentum = qars2.momentum(df['close'].values, period=20)Rust 侧对pct_change、moment、pct_change等算子的支持可从 qapro-rs/Cargo.toml 中开启的 polars 特性(pct_change、moment、diff、ewma、rolling_window)得到印证,因子计算无需再经过 Python 循环。
6. 高级特性:Arrow 零拷贝与并行计算
6.1 Arrow 格式数据交换
原文档给出的 Arrow 流程是"Pandas → Arrow Table → Rust 处理 → 转回 Pandas":
import pyarrow as pa import qars2 # 转换为 Arrow Table(零拷贝) arrow_table = pa.Table.from_pandas(df) # Rust 处理 result = qars2.process_arrow(arrow_table) # 转回 Pandas result_df = result.to_pandas()零拷贝的关键在于:Arrow 列式内存布局下,Python(pyarrow)与 Rust(arrow/polars 数据后端)可以共享同一块内存地址,无需逐字段序列化。Rust 侧对应的模块为 qapro-rs/src/qadata/arrowbase.rs,仓库另外还有一套独立的数据桥接参考实现 QUANTAXIS/QADataBridge/arrow_converter.py,可供对比学习。
6.2 多标的并行计算
# 多标的并行计算 codes = ['000001', '000002', '600000'] results = qars2.parallel_process(codes, func=calculate_indicators)Rust 侧并行能力依赖rayon数据并行库(qapro-rs/Cargo.toml)。在 Python 侧,若不使用 Rust 并行,也可以先用multiprocessing.Pool做多进程兜底,两种方式的取舍是:Rust 并行免去了进程间序列化开销,适合高频小任务;多进程适合重 IO 的拉数任务。
7. 性能对比与基准验证方法
原文档给出如下性能对比表:
| 操作 | Python | Rust | 加速比 |
|---|---|---|---|
| MA 计算 | 100ms | 1ms | 100x |
| 数据加载 | 500ms | 10ms | 50x |
| 因子计算 | 1000ms | 15ms | 67x |
上述数据为原文档宣示的性能目标,属于项目方口径。实际加速比与机器、数据规模、是否启用 SIMD(nightly 工具链)强相关,建议在你自己环境里用下文方法实测。
与仓库内另一份文档 doc/advanced/performance-tuning.md 中的基准表相互印证(该表给出"未优化 / 优化后"口径):MA 计算(10 万点)100ms → 1ms(100x)、单标的回测(1 年分钟)30s → 3s(10x)、100 标的并行因子计算 120s → 15s(8x)。
在本地复现基准,可直接对照performance-tuning.md中的计时脚本:
import qars2 import numpy as np import time data = np.random.rand(100000) # Python 实现 start = time.time() result_py = [] for i in range(20, len(data)): result_py.append(np.mean(data[i-20:i])) python_time = time.time() - start # Rust 实现 start = time.time() result_rust = qars2.ma(data, 20) rust_time = time.time() - start print(f"Python 耗时: {python_time*1000:.2f}ms") print(f"Rust 耗时: {rust_time*1000:.2f}ms") print(f"加速比: {python_time/rust_time:.0f}x")8. 从源码看 QARS2 的实际能力边界
8.1 QARSAccount:Rust 高性能账户
QUANTAXIS/QARSBridge/qars_account.py 是对 Rust QIFI 账户的 Python 包装器,其文档注释给出的性能口径为:创建账户 100x(50ms → 0.5ms)、发送订单 100x(5ms → 0.05ms)、账户结算 100x(200ms → 2ms)、10 年日线回测 10x(30s → 3s)。
核心 API 一览:
| 方法 | 用途 |
|---|---|
buy / sell(code, price, date, amount) | 股票买卖 |
buy_open / sell_open / buy_close / sell_close | 期货开平仓(多空) |
buy_closetoday / sell_closetoday | 期货平今 |
get_qifi() | 导出 QIFI 协议账户数据 |
get_positions() | 持仓 DataFrame(多头/空头数量、开仓均价、浮动盈亏、保证金) |
get_account_info() | 权益、可用、保证金、风险度等 |
settle(date) | 账户结算 |
receive_dividend / stock_split | 分红、拆股事件处理 |
from_qifi(qifi_dict) | 从 QIFI 字典重建账户 |
一个完整示例(股票买入 + 期货开仓 + 状态导出):
from QUANTAXIS.QARSBridge import QARSAccount with QARSAccount(account_cookie="my_account", portfolio="default", init_cash=1000000, environment="backtest") as account: # 股票买入 account.buy("000001", 10.5, "2025-01-01", 100) # 期货开仓 account.buy_open("IF2512", 4500.0, "2025-01-01", 1) # 查看持仓与账户 positions = account.get_positions() info = account.get_account_info() print(f"账户权益: {info['balance']:.2f}, 风险度: {info['risk_ratio']:.2%}")注意:from_qifi目前只能恢复账户基础参数,持仓与订单状态的完整恢复依赖 Rust 侧实现,仓库注释中以TODO标注(见 qars_account.py)。
8.2 Rust 基础算子的实现形态
qapro-rs/src/qadata/datafunc.rs 展示了 Rust 侧数据算子的典型实现:
Que<T>:固定容量历史 bar 队列,支持push(溢出自动淘汰)、shift、tail(s)、last_update,是滚动指标在 Rust 侧的状态容器;dma(lst, tail):窗口均值;dhhv/dllv:窗口最高/最低;vec_maximum/vec_minimum等;diff(a, b, abs)、vec_bigger/vec_smaller、vec_gt_count等数组级运算,均为切片上的线性扫描,无 Python 层逐元素开销。
这些原语与第 5 节中的ma、momentum等高层接口是"底层算子 → 高层指标"的分层关系。
9. 实践建议与注意事项
- 先检测后使用:任何依赖 Rust 性能的代码,都应以
has_qars_support()做运行时判断,避免在未安装 Rust 核心的环境中出现意外 ImportError(尤其是QARSBacktest)。 - 模块名差异:文档示例使用
import qars2,当前仓库 QARSBridge 导入的是qars3;请在安装后打印qars3.__version__或直接查看get_version_info()确认实际可用模块。 - SIMD 需要 nightly:如需最大化的向量化收益,Rust 侧请使用 nightly 工具链编译运行(
cargo +nightly run --release),否则默认 stable 工具链也能工作但无法启用部分 SIMD 路径。 - 基础设施依赖:
qapro-rs的完整运行依赖 clickhouse / redis / mongodb / rabbitmq 四个服务,可用docker-compose -f qapro-rs/database.yaml up -d一键拉起;Python 侧的 QARSBridge 桥接则不需要这些服务即可完成账户级操作。 - 性能数据需自测:文档中的加速比(100x / 50x / 67x)为项目方目标口径,真实收益请按第 7 节脚本在你的数据与硬件上复现,同时可参考 doc/advanced/performance-tuning.md 的"未优化 vs 优化后"口径做交叉验证。
10. 相关资源
- 本文核心依据:doc/advanced/rust-integration.md
- 性能优化全景指南(数据层/计算层/策略层/系统层):doc/advanced/performance-tuning.md
- Rust 桥接层实现:QUANTAXIS/QARSBridge/init.py、QUANTAXIS/QARSBridge/qars_account.py
- Rust 核心工程与依赖声明:qapro-rs/readme.md、qapro-rs/Cargo.toml
- Rust 侧数据算子示例:qapro-rs/src/qadata/datafunc.rs、qapro-rs/src/qadata/arrowbase.rs
- Arrow 数据桥接参考实现:QUANTAXIS/QADataBridge/arrow_converter.py
- 金融科技
- 后端
- 数据分析
【免费下载链接】QUANTAXIS
QUANTAXIS 支持任务调度 分布式部署的 股票/期货/期权 数据/回测/模拟/交易/可视化/多账户 纯本地量化解决方案
相关推荐
react-signature-canvas TypeScript类型系统深度剖析:SignatureCanvasProps完整推导
react signature canvas TypeScript类型系统深度剖析:SignatureCanvasProps完整推导 react signatu
金融科技后端数据分析WSABuilds 集成 KernelSU 完整实战指南:Manager 安装、WSA 内核替换与原理剖析
WSABuilds 集成 KernelSU 完整实战指南:Manager 安装、WSA 内核替换与原理剖析 导读 KernelSU 是一个以内核模块(Kerne
开发工具QUANTAXIS 版本演进全解析:从 2.1.0 Rust 集成到发布规范与升级实践
QUANTAXIS 版本演进全解析:从 2.1.0 Rust 集成到发布规范与升级实践 QUANTAXIS 是一个面向股票/期货/期权的纯本地量化解决方案,覆盖
金融科技后端数据分析
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考