License C++ Go Rust Python CMake tag Crates.io
Quant1X 是一个多语言量化交易框架,支持 C++、Go、Rust、Python,提供完整的量化交易解决方案,包括数据处理、策略开发、回测引擎、实时交易等功能。
- 多语言支持:C++20、Go 1.27+、Rust 1.97.1+、Python 3.12+
- 高性能:优化的算法和数据结构,支持 SIMD 指令集
- 模块化设计:可插拔的组件架构,易于扩展
- 实时数据:支持 Level1 市场数据
- 策略框架:内置多种技术指标和策略模板
- 回测引擎:高效的回测系统,支持多资产组合
- 网络通信:内置 HTTP/WebSocket 客户端,支持多种协议
- 64位操作系统 (Windows/Linux/macOS)
- 至少 8GB RAM,推荐 16GB+
- 支持 AVX2 指令集的 CPU
| 语言 | 版本要求 | 推荐版本 |
|---|---|---|
| Python | 3.12+ | 3.12.x |
| Go | 1.27+ | 1.27.x |
| Rust | 1.97.1+ | 1.97.1+ (2024) |
| C++ | C++20 | GCC 13+/Clang 17+/MSVC 14.3+ |
| python | golang | rust | c++ |
|---|---|---|---|
| 3.12.x | 1.27.x | 1.97.1+/2024 | gcc13+/clang17+/msvc14.3+ |
安装brew时需要注意避免使用root权限
- 示例的配置文件路径 examples/quant1x.yaml, 需要将配置文件拷贝到用户目录下
- 配置信息分交易、策略和数据三个部分,可以自定义缓存路径
cp examples/quant1x.yaml ~/.quant1x/quant1x.yamlcp examples/quant1x.yaml ~/.q1x/quant1x.yamlcp examples/quant1x.yaml ~/.q1x-rs/quant1x.yaml- 数据源,默认是go版本的配置文件
- 数据源切换, 多语言版本的数据源切换,需要在开发环境的目录配置.env或环境变量,环境变量名QUANT1X_WORK, 值为c++对应q1x,rust对应q1x-rust, 不包含符号点"."
python的运行环境可能存在多个版本冲突的问题,那么怎么来解决多版本的共存的问题呢?使用pyenv。
brew install pyenv
pyenv versions
我的电脑返回以下版本信息
system
3.8.16
* 3.12.9 (set by /Users/${USERNAME}/.pyenv/version)
pyenv install -l
pyenv install 3.12.9
安装python完成之后, python类库管理工具pip已经默认安装完成了
| 工具 | 功能 |
|---|---|
| pip | 类似maven、gradle、go mod的类库管理工具 |
| pip-autoremove | 自动删除类库所有依赖库 |
| pipreqs | 项目/类库交叉依赖检测 |
使用 pip config 命令配置清华镜像源:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip config set install.trusted-host https://pypi.tuna.tsinghua.edu.cn
python环境中依赖管理的配置文件为requirements.txt,类似java的maven pom.xml、golang的go.mod。
pip install -r requirements.txt
pip freeze > requirements.txtpip install pipreqs pipreqs ./ --encoding utf8
pip install --upgrade setuptools wheel twine
python setup.py sdist bdist_wheel
twine upload --repository testpypi dist/*twine upload dist/*import matplotlib matplotlib.matplotlib_fname() #输出matplotlib包所在的配置文件的路径
我选择了SimHei中文字体, 复制到fonts/ttf/目录下
cp -r /Users/${USERNAME}/Library/Fonts/SimHei.ttf fonts/ttf/cd ~/.matplotlib rm -rf *
go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct go env -w GOPRIVATE=gitee.com
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup update
本仓库在 Cargo.toml 中声明了一个名为 q1x 的可执行二进制(路径为 main.rs)。下面是构建与常见运行示例:
- 在开发模式下构建:
cargo build --bin q1x
- 在发布/生产模式下构建(优化):
cargo build --release --bin q1x
- 运行并查看帮助信息:
# 打印程序帮助(包含子命令和选项)
cargo run --bin q1x -- --help- 常见子命令示例(基于项目根
main.rs中使用的 clap 定义):
# 管理服务(install/uninstall/start/stop/status/run) cargo run --bin q1x -- service install cargo run --bin q1x -- service start # 更新缓存数据(calendar / servers / all / base / features) cargo run --bin q1x -- update --all cargo run --bin q1x -- update --calendar
你也可以直接运行已构建的二进制查看实际帮助文本,例如:
# Debug 二进制 .\target\debug\q1x.exe --help # Release 二进制 .\target\release\q1x.exe --help
下面是我在本地运行 target/release/q1x.exe --help 捕获到的输出(供参考):
quant1x - Rust edition
--------------------------------------------------------------------------------
Version : 0.6.10
Author : Quant1X Team
--------------------------------------------------------------------------------
Usage: q1x.exe [OPTIONS] [COMMAND]
Commands:
service Manage the service.
update Update cached data (base / features)
help Print this message or the help of the given subcommand(s)
Options:
--version
Print build version information and exit
--verbose
显示日志信息到终端
--debug
打开日志的调试模式
-h, --help
Print help (see a summary with '-h')
说明与注意事项:
q1x二进制是一个可与库(crate)协同工作的前端:它会尝试调用库中暴露的初始化与子命令钩子(如quant1x::global_init,quant1x::datasets_init,quant1x::engine_daemon等)。如果你直接从源码运行,确保启用了需要的 feature 或在编译时链接到库中实现这些函数的 crate。- 在 Windows 上,可以通过
service子命令与提升参数(--pipe,--elevated-out,--elevated-pipe)交互以支持以服务/守护进程模式运行。具体行为由engine::daemon的实现决定。 - 若打算在 CI 或部署中使用,请优先使用
--release构建并根据目标平台交叉编译或在对应平台上构建以避免 -march/native 引入不可移植的指令集。
如果需要,我可以:
- 为
q1x添加示例配置和 systemd/Windows service 安装脚本。 - 在 README 中加入更详细的运行参数说明(基于库中
engine::daemon的实现)。
本项目的 C/C++ 代码以 C++20 为目标,强烈建议在开发/构建阶段使用较新的编译器和现代构建工具以获得最佳性能与可维护性。
推荐工具链与版本
- 编译器:GCC 14.3+ / Clang 18+ / MSVC (Visual Studio 2022)(MSVC 工具集 14.3+)
- CMake:3.30+(建议最新版)
- 构建器:Ninja(推荐)或 Make/MSBuild
- 包管理:vcpkg 或 Conan(可选,但用于管理第三方依赖非常有用)
常用依赖(示例)
- OpenSSL(网络/加密)
- protobuf(序列化)
- fmt / spdlog(格式化与日志)
Linux/macOS 快速安装(示例)
-
Ubuntu / Debian:
- sudo apt update && sudo apt install -y build-essential cmake ninja-build clang pkg-config
- 若使用 vcpkg,请参考 vcpkg 文档进行安装。
-
macOS (Homebrew):
- brew install cmake ninja llvm vcpkg
Windows(Visual Studio)
- 推荐安装 Visual Studio 2022 + Desktop development with C++,并从 "x64 本机工具命令提示符" 或者 VS 开发者 PowerShell 构建。
- 使用 vcpkg 管理依赖(示例:vcpkg integrate install),并在 CMake 调用中传递
-DCMAKE_TOOLCHAIN_FILE=<vcpkg-root>/scripts/buildsystems/vcpkg.cmake。
构建示例(以仓库根目录为例)
-
使用 Ninja + Clang/GCC(跨平台推荐):
- mkdir -p build && cd build
- cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=20 ..
- cmake --build . --config Release
-
使用 Visual Studio(Windows):
- mkdir build && cd build
- cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release ..
- cmake --build . --config Release
建议的编译选项(可在 CMakeLists 或构建命令中添加)
- Release 编译:-O3 -DNDEBUG
- 可选:启用 LTO(Link Time Optimization)与目标特定指令集:-march=native(仅在目标机测试时启用)
- 针对跨平台性能调优:保持内存对齐、禁用不必要的异常展开(视模块而定)、使用合适的预取/缓存策略
关于性能与编译器选择(说明)
- 在本项目的微基准中,LLVM/Clang 与 MSVC 在某些并发热点代码上生成的汇编与性能通常优于某些 GCC 版本;若追求最高性能,建议在 CI 中使用 clang 或 MSVC 做对比测试。
- 但为保证广泛兼容性,请在主 CI 流水线中测试所有目标编译器(GCC / Clang / MSVC)。
调试与分析工具
- 使用 sanitizers(AddressSanitizer, ThreadSanitizer)在调试构建中快速捕获内存/线程错误:在 CMake 中开启 -DSANITIZE_ADDRESS=ON(项目支持时)。
- 使用 perf / VTune / Windows Performance Analyzer 进行性能剖析。
依赖管理(vcpkg 简短示例)
-
克隆并引导 vcpkg:
git clone https://github.com/microsoft/vcpkg.git ./vcpkg/bootstrap-vcpkg.sh # Linux/macOS .\vcpkg\bootstrap-vcpkg.bat # Windows (PowerShell/CMD)
-
在 CMake 调用中添加 toolchain 文件:
cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake ..
平台特定注意事项
- Windows:注意选择 x64 构建,使用 vcpkg 的 triplet(例如
x64-windows)来安装二进制依赖。 - Linux:若在容器/CI 中构建,尽量固定基础镜像以保证可重复构建(例如
ubuntu:22.04)。 - macOS:使用 Homebrew 管理依赖,并注意 Apple Clang 与 LLVM Clang 之间的小差别。
如果你希望我为项目添加一个方便的 CMake 构建示例(例如 top-level build 脚本和 CI job 示例),我可以继续创建并把它加入仓库。
附加:C++ 具体构建与测试示例
依赖安装(protobuf/其他)示例:
-
protobuf 推荐使用 3.21.11(高版本可能依赖 abseil,引入额外复杂性):
# 下载并解压源码 wget https://gh-proxy.com/github.com/protocolbuffers/protobuf/releases/download/v21.11/protobuf-cpp-3.21.11.zip unzip protobuf-cpp-3.21.11.zip && cd protobuf-3.21.11 mkdir build && cd build cmake -DCMAKE_INSTALL_PREFIX=$HOME/runtime -Dprotobuf_BUILD_TESTS=OFF -G "Unix Makefiles" ../ make -j$(nproc) && make install
-
Windows (MSVC) 编译示例:
mkdir build; cd build cmake -DCMAKE_INSTALL_PREFIX=d:/runtime -G "Visual Studio 17 2022" -A x64 .. cmake --build . --config Release
其它依赖安装(vcpkg 举例):
vcpkg install yaml-cpp zlib asio xtensor mimalloc spdlog fmt duktape benchmark catch2 flatbuffers capnproto
项目快速编译(Debug 示例):
cmake -DCMAKE_BUILD_TYPE=Debug -G Ninja -S . -B cmake-build-debug
cmake --build cmake-build-debug --target q1x -j 18安装主程序示例:
ninja -C cmake-build-debug install
运行测试(ctest):
ctest --test-dir cmake-build-debug --output-on-failure
运行示例程序:
./cmake-build-debug/bin/q1x --help
quant1x/runtime/ringbuffer.h(C++)与 quant1x/runtime/ringbuffer.rs(Rust)为 Vyukov 有界 MPMC 队列的平行实现(Go 见 ringbuffer.go),基准位于仓库根 benches/vyukov_bench.{cpp,rs},详细状态见 ringbuffer.md。
已完成的关键性能对齐(Apple Silicon / arm64 实测):
| 修复项 | 内容 | 效果 |
|---|---|---|
| aarch64 退避指令 | yield → isb,与 Rust core::hint::spin_loop 逐字节对齐 |
8P8C 整轮 4855μs → 1946μs |
| ctor 槽区分配 | std::make_unique<Slot[]> 清零 → aligned_alloc(64) + placement new 只写 seq,对齐 Rust Vec::with_capacity 不初始化语义 |
ctor ~246μs → ~185μs(Rust ~210μs) |
| 基准 harness 计数器 | 共享原子 consumed.fetch_add() → 每线程本地计数、join 后合并,消除复合缓存行争用伪影 |
8P8C 消费速率与 backlog 与 Rust 完全对齐(160 vs 159 M/s) |
修复后 uncontended 吞吐 C++ 107(削除) 131 M/s vs Rust 121 (削除ここまで)125 M/s(噪声带内对齐);队列自身差异均已闭合,无已知性能缺陷。
from quant1x.factors.base import get_cross_section_forward_adjusted_bars # 获取前复权K线数据 code = "sh600000" as_of_date = "2024-12-26" bars = get_cross_section_forward_adjusted_bars(code, as_of_date) print(f"Loaded {len(bars)} adjusted bar records for {code}") # 显示最近5条记录 for bar in bars[-5:]: print(f"Date: {bar.date}, Open: {bar.open:.2f}, Close: {bar.close:.2f}")
package main import ( "fmt" "gitee.com/quant1x/quant1x/quant1x/factors" ) func main() { code := "sh600000" asOfDate := "2024-12-26" // 获取前复权K线数据 bars := factors.GetCrossSectionForwardAdjustedBars(code, asOfDate) fmt.Printf("Loaded %d adjusted bar records for %s\n", len(bars), code) // 显示最近5条记录 start := len(bars) - 5 if start < 0 { start = 0 } for _, bar := range bars[start:] { fmt.Printf("Date: %s, Open: %.2f, Close: %.2f\n", bar.Date, bar.Open, bar.Close) } }
use quant1x::factors::base::get_cross_section_forward_adjusted_bars; fn main() { let code = "sh600000"; let as_of_date = "2024-12-26"; // 获取前复权K线数据 let bars = get_cross_section_forward_adjusted_bars(code, as_of_date); println!("Loaded {} adjusted bar records for {}", bars.len(), code); // 显示最近5条记录 let start = if bars.len() > 5 { bars.len() - 5 } else { 0 }; for bar in &bars[start..] { println!("Date: {}, Open: {:.2}, Close: {:.2}", bar.date, bar.open, bar.close); } }
欢迎贡献代码!请遵循以下步骤:
- Fork 本项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 创建 Pull Request
- 遵循各语言的编码规范
- 添加单元测试
- 更新文档
- 确保所有测试通过
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
注意: 本项目仅用于学习和研究目的,不构成投资建议。在实际交易前,请充分了解和评估各种风险并咨询专业人士。