Skip to content

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-Lib150+ 技术指标MACD/RSI/布林带等指标一行算完(pip install TA-Lib 需先装 C 库)
requestsHTTP 请求拉取 REST 行情、订单接口
websockets / websocket-clientWebSocket实时行情订阅
backtrader事件驱动回测框架复杂回测的成熟选项(也见 03-第一个回测)
vn.py交易/回测一体框架想同时覆盖回测与实盘对接时的重型方案
pyfolio绩效分析从收益序列一键产出**夏普**/回撤/月度热力图
statsmodels / scipy统计检验协整检验、回归,统计**套利**必备
sqlite3(标准库)本地存储个人数据量下的零配置数据库

最小安装(示例代码仅教学用,实盘风险自负):

bash
# 推荐用 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.txtpyproject.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 股/期货/港美股同上,量化平台绑定

个人阶段的选型建议

  1. A 股日线研究:AKShare 起步 → 需要稳定财务数据或更规范字段时上 Tushare Pro。
  2. 期货:AKShare(新浪/东财源)够用于主力合约日线。
  3. 加密:直接用交易所官方 REST/WebSocket(Binance/OKX),不经过第三方。
  4. 不要同时依赖唯一数据源:核心数据用两个源交叉核对(见 02-数据获取实战 的数据质量检查)。

五、研究目录结构建议

text
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.txt
  • data/只读资产:脚本只往里写增量,不回改历史。
  • strategy/你的代码资产:策略本身才几百行,值钱的是这里的沉淀。
  • backtest/results/ 每次回测导出一份结果文件,带上参数与时间戳命名(如 dual_ma_f5_s20_20260816.csv)。

六、版本管理与复现

6.1 git 管什么

要管不要管
策略代码、数据脚本data/(原始数据不进 git,可用脚本重拉)
requirements.txt.venv/、Jupyter 输出、回测中间结果
config.yaml 的模板(真实 token 另存环境变量)任何密钥/token(见 04-实盘自动化的密钥安全)
bash
git init && git add strategy scripts requirements.txt
git commit -m "feat: 双均线策略初版,参数 f5/s20"

每次改动策略都提交一次,commit message 写明改动与动机——三天后的你回头看历史,比看代码更值钱

6.2 实验结果留档

回测结果的「可复现」靠三样东西对齐:代码版本(git commit)+ 参数 + 数据时间范围。建议每次回测后追加一行到实验记录表:

日期commit策略参数数据范围年化最大回撤夏普备注
2026-08-16a3f9c2dual_ma5/202020-202418.2%-22%1.1加入手续费后衰减明显

一张 CSV 或 Notion 表足够,不要靠脑子记。


七、常见坑:新手必踩的三个

7.1 时区处理

⚠️ 时区不统一是隐形坑

加密行情的时间戳是 UTC 毫秒;A 股数据有的接口给的是北京时间字符串。混用时必须统一到一个时区(建议全部转成 UTC 存储、展示时再转本地):

python
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 的头号来源:

python
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() 全量)。

正确姿势(示例代码仅教学用,实盘风险自负):

python
df["signal"] = (df["ma_fast"] > df["ma_slow"]).astype(int)
df["position"] = df["signal"].shift(1)   # 关键:shift(1),次日才生效

八、下一步

工具链就绪后,进入 02-数据获取实战:先把 A 股、期货、加密三市场的数据真正拿干净。


⚠️ 风险提示

工具与数据都只是研究的起点,不构成任何收益保证。免费数据源的接口变动、数据缺失、复权错误都可能导致回测结果失真,付费数据同样不保证准确。请始终以「数据质量检查 + 多源交叉验证」作为研究底线。本文内容仅用于学习与研究,不构成任何投资建议。

相关阅读

仅供学习与研究,不构成任何投资建议。市场有风险,投资需谨慎。