01 · 量化工具链
给个人程序员 / 想入行量化的交易者:先备好一套「够用、不折腾」的工具链。本篇不追求工程团队的军备竞赛,只求你在本机用最低成本把研究闭环跑起来。
免责声明:本站全部内容仅用于学习与研究,不构成任何投资建议。市场有风险,投资需谨慎。
一、语言选型:为什么主力是 Python
个人量化的核心工作流是写策略 → 拉数据 → 跑回测 → 看结果,四步里几乎没有一步依赖极致性能。Python 在量化生态的统治地位来自:
| 原因 | 说明 |
|---|---|
| 生态完整 | 取数(AKShare/Tushare/CCXT)、计算(pandas/numpy)、回测(backtrader/vectorbt)、绩效(pyfolio)全有现成库 |
| 迭代快 | 策略想法到验证通常只要几十行,改参数、看曲线是秒级反馈 |
| 学习资料多 | 量化相关教程、社区、开源策略几乎全是 Python |
| 与团队/岗位衔接 | 国内量化岗位的主流语言就是 Python,学会了可直接迁移 |
什么时候 Python 不够用? 当瓶颈不再是「写代码快不快」,而是「跑得够不够快、延迟够不够低」时:
- 数据量级到千万行以上、单次因子计算分钟级起步;
- 需要毫秒级执行(高频 T0、做市);
- 回测要扫几十万组参数、或需要多进程/多机并行。
此时再考虑用 C++ 或 Rust 重写热点模块(如因子计算、撮合模拟),而不是推倒重来。
1.1 C++ / Rust 什么时候需要
| 场景 | 语言 | 说明 |
|---|---|---|
| 高频交易执行 | C++ | 交易所柜台接口(如 CTP)原生就是 C++ DLL,做市/高频必须贴近底层 |
| 重计算引擎 | C++ / Rust | 自研回测撮合、大规模因子库;Rust 更安全、无 GC 停顿 |
| 常规个人量化 | 不需要 | 日线/小时级策略 + 万行级数据,Python 在性能上毫无压力 |
💡 语言选型结论
个人量化阶段**不要用 C++ 起步**。等你有「Python 解决不了的具体问题」时,再针对热点重写,而不是为了用 C++ 而用 C++。
二、核心库清单
| 库 | 用途 | 个人量化里的角色 |
|---|---|---|
| numpy | 数值计算、数组运算 | 一切计算的地基,pandas 的底层 |
| pandas | 表格数据、时间序列处理 | 行情数据的标准容器,回测主战场 |
| matplotlib | 绘图 | 画资金曲线、回撤、指标图 |
| TA-Lib | 150+ 技术指标 | MACD/RSI/布林带等指标一行算完(pip install TA-Lib 需先装 C 库) |
| requests | HTTP 请求 | 拉取 REST 行情、订单接口 |
| websockets / websocket-client | WebSocket | 实时行情订阅 |
| backtrader | 事件驱动回测框架 | 复杂回测的成熟选项(也见 03-第一个回测) |
| vn.py | 交易/回测一体框架 | 想同时覆盖回测与实盘对接时的重型方案 |
| pyfolio | 绩效分析 | 从收益序列一键产出**夏普**/回撤/月度热力图 |
| statsmodels / scipy | 统计检验 | 协整检验、回归,统计**套利**必备 |
| sqlite3(标准库) | 本地存储 | 个人数据量下的零配置数据库 |
最小安装(示例代码仅教学用,实盘风险自负):
# 推荐用 venv 或 uv 管理环境,不要直接装进系统 Python
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install pandas numpy matplotlib \
ta-lib backtrader pyfolio \
requests websocket-client \
akshare tushare ccxt⚠️ ta-lib 安装避坑
ta-lib 在 macOS 上需先 brew install ta-lib,Windows 建议直接用 Anaconda 的 conda install -c conda-forge ta-lib,否则编译容易失败。
三、开发环境
3.1 环境管理:Anaconda vs venv
| 方案 | 适合 | 注意 |
|---|---|---|
| venv + pip | 想保持系统干净、够用即可 | 学习成本最低,本文推荐 |
| uv | 想要 pip 的简单 + 极快的安装 | 现代替代品,uv venv 一行建环境 |
| Anaconda | 不想折腾编译(TA-Lib 等装失败率高) | 体积大、环境混乱风险高;不适合生产脚本 |
💡 环境管理统一原则
每个项目一个虚拟环境,把依赖写进 requirements.txt 或 pyproject.toml,保证换机器能复现。
3.2 编辑器:VS Code 为主
- 必装扩展:Python、Jupyter(notebook 支持)、Pylance。
- 打开项目根目录工作,用右下角切换解释器到项目
.venv。 - 回测性能瓶颈时可先用
%timeit或 profile 定位,别急着换语言。
3.3 Jupyter vs 脚本:什么时候用哪个
| 工作形态 | 用 Jupyter | 用 .py 脚本 |
|---|---|---|
| 探索数据 | ✅ 一边跑一边看表 | |
| 试指标/画图 | ✅ 图表即时呈现 | |
| 策略草稿 | ✅ 改一行重跑一个 cell | |
| 定时任务/增量更新 | ✅ cron / 计划任务直接调 | |
| 回测/参数扫描(跑得久) | ✅ 不依赖界面,可后台跑 | |
| 部署到服务器 | ✅ 脚本是唯一选择 |
💡 建议工作流
Jupyter 里想清楚 → 沉淀成 .py 模块 → cron 跑数据脚本。notebook 是草稿纸,脚本是成品,别让 notebook 成为你的生产环境。
四、数据源选型对比
| 数据源 | 类型 | 覆盖市场 | 主要限制 |
|---|---|---|---|
| AKShare | 免费/开源 | A 股、期货、宏观、基金、部分美股/加密 | 接口稳定性和字段随上游网站变动,需盯更新;无商业保障 |
| Tushare Pro | 免费(积分制) | A 股(行情/财务)为主 | 高级接口要积分,积分靠注册时长/捐赠/任务 |
| Binance API | 免费 | 加密现货/合约行情与交易 | 限频按权重计;有地理与合规限制 |
| CCXT | 免费/开源 | 上百家加密交易所统一接口 | 统一封装牺牲部分平台特性;部分接口需要代理网络 |
| Wind | 付费 | A 股/港股/美股/期货/宏观全覆盖 | 贵(个人基本不现实),数据质量与公司是标配 |
| 聚宽(JoinQuant) | 付费/平台内免费 | A 股/期货/基金 | 数据在平台内使用方便,本地化导出受限 |
| 米筐(RiceQuant) | 付费 | A 股/期货/港美股 | 同上,量化平台绑定 |
个人阶段的选型建议:
- A 股日线研究:AKShare 起步 → 需要稳定财务数据或更规范字段时上 Tushare Pro。
- 期货:AKShare(新浪/东财源)够用于主力合约日线。
- 加密:直接用交易所官方 REST/WebSocket(Binance/OKX),不经过第三方。
- 不要同时依赖唯一数据源:核心数据用两个源交叉核对(见 02-数据获取实战 的数据质量检查)。
五、研究目录结构建议
quant-lab/ # 一个策略一个项目目录
├── .venv/ # 虚拟环境(不提交 git)
├── data/ # 原始数据(拉下来不改动,或只增量追加)
│ ├── raw/ # 原始行情
│ └── processed/ # 清洗后的研究数据
├── strategy/ # 策略代码(每个策略一个模块)
│ ├── dual_ma.py
│ ├── boll_revert.py
│ └── common.py # 指标、工具函数
├── backtest/ # 回测脚本与结果
│ ├── run_dual_ma.py
│ └── results/ # 每次回测的净值/明细导出
├── research/ # Jupyter 草稿、探索笔记
├── scripts/ # 数据增量更新等定时任务
├── config.yaml # 参数与数据源配置
└── requirements.txtdata/是只读资产:脚本只往里写增量,不回改历史。strategy/是你的代码资产:策略本身才几百行,值钱的是这里的沉淀。backtest/results/每次回测导出一份结果文件,带上参数与时间戳命名(如dual_ma_f5_s20_20260816.csv)。
六、版本管理与复现
6.1 git 管什么
| 要管 | 不要管 |
|---|---|
| 策略代码、数据脚本 | data/(原始数据不进 git,可用脚本重拉) |
requirements.txt | .venv/、Jupyter 输出、回测中间结果 |
config.yaml 的模板(真实 token 另存环境变量) | 任何密钥/token(见 04-实盘自动化的密钥安全) |
git init && git add strategy scripts requirements.txt
git commit -m "feat: 双均线策略初版,参数 f5/s20"每次改动策略都提交一次,commit message 写明改动与动机——三天后的你回头看历史,比看代码更值钱。
6.2 实验结果留档
回测结果的「可复现」靠三样东西对齐:代码版本(git commit)+ 参数 + 数据时间范围。建议每次回测后追加一行到实验记录表:
| 日期 | commit | 策略 | 参数 | 数据范围 | 年化 | 最大回撤 | 夏普 | 备注 |
|---|---|---|---|---|---|---|---|---|
| 2026-08-16 | a3f9c2 | dual_ma | 5/20 | 2020-2024 | 18.2% | -22% | 1.1 | 加入手续费后衰减明显 |
一张 CSV 或 Notion 表足够,不要靠脑子记。
七、常见坑:新手必踩的三个
7.1 时区处理
⚠️ 时区不统一是隐形坑
加密行情的时间戳是 UTC 毫秒;A 股数据有的接口给的是北京时间字符串。混用时必须统一到一个时区(建议全部转成 UTC 存储、展示时再转本地):
import pandas as pd
# Binance klines 的 open_time 是 UTC 毫秒时间戳
df = pd.read_csv("data/btcusdt_1h.csv")
df["open_time"] = pd.to_datetime(df["open_time"], unit="ms", utc=True)
df["open_time"] = df["open_time"].dt.tz_convert("Asia/Shanghai") # 展示用7.2 数据对齐
不同数据源、不同合约的索引必须显式对齐再合并。pandas 默认按索引对齐,索引不一致时静默产生 NaN,是回测 bug 的头号来源:
a = pd.Series([1, 2, 3], index=[1, 2, 3]) # 某标的收盘价
b = pd.Series([9, 8, 7], index=[2, 3, 4]) # 另一标的价格
pd.DataFrame({"a": a, "b": b}) # 索引 1/4 处出现 NaN,务必检查💀 未来函数是回测失真的头号来源
回测里用「当天收盘后才算得出来」的指标去参与当天成交,就是在偷看未来,回测会被严重虚高。 信号生成后必须 shift(1) 到次日才生效——这是个人量化研究第一条铁律。
7.3 未来函数(look-ahead bias)
回测里用了「当天收盘后才算得出来」的指标去参与**当天成交**,就是在偷看未来,回测会被严重虚高。最常见两类:
- 用当天的 MA 交叉信号、当天就成交 → 应为次日开盘(或信号后一 bar)成交;
- 用全量数据计算均值/波动率(如 zscore 用整段数据)→ 应只用截至当天的历史(
rolling而不是mean()全量)。
正确姿势(示例代码仅教学用,实盘风险自负):
df["signal"] = (df["ma_fast"] > df["ma_slow"]).astype(int)
df["position"] = df["signal"].shift(1) # 关键:shift(1),次日才生效八、下一步
工具链就绪后,进入 02-数据获取实战:先把 A 股、期货、加密三市场的数据真正拿干净。
⚠️ 风险提示
工具与数据都只是研究的起点,不构成任何收益保证。免费数据源的接口变动、数据缺失、复权错误都可能导致回测结果失真,付费数据同样不保证准确。请始终以「数据质量检查 + 多源交叉验证」作为研究底线。本文内容仅用于学习与研究,不构成任何投资建议。