从"手写回测"到"工程框架",循序渐进,读懂量化交易的底层逻辑与落地工具。
文章目录
-
- [🧭 "量化工具箱"](#🧭 “量化工具箱”)
- [📦 8.1 速览🐯](#📦 8.1 速览🐯)
- [🧠 8.2 核心框架 zipline 深度实战:从安装到第一个回测](#🧠 8.2 核心框架 zipline 深度实战:从安装到第一个回测)
-
- [🏗️ Step 1:安装与环境准备](#🏗️ Step 1:安装与环境准备)
- [🔑 Step 2:注册数据源 API Key(Quandl / Nasdaq Data Link)](#🔑 Step 2:注册数据源 API Key(Quandl / Nasdaq Data Link))
- [📝 Step 3:编写第一个策略 ------ "无脑定投苹果"](#📝 Step 3:编写第一个策略 —— “无脑定投苹果”)
- [🚀 Step 4:运行回测 ------ 让策略"跑"起来](#🚀 Step 4:运行回测 —— 让策略“跑”起来)
- [📂 Step 5:读取回测结果 ------ 深入分析](#📂 Step 5:读取回测结果 —— 深入分析)
- [🧭 8.3 回测流程](#🧭 8.3 回测流程)
- [🔭 8.4 优秀框架](#🔭 8.4 优秀框架)
- [🎯 总结](#🎯 总结)
🧭 "量化工具箱"
在量化策略的开发流程中,回测 是验证策略有效性的核心环节。
从"手写循环"开始------用 Pandas 遍历历史 K 线,逐日模拟买卖------这有助于理解原理,但到了实际工程中,需要更专业、更健壮的框架来应对:
- 数据清洗与对齐
- 事件驱动的逐日撮合
- 业绩归因与风险分析
- 实盘接口对接
📦 8.1 速览🐯
| 库名称 | 安装命令(推荐) | 核心定位 | 一句话点评 |
|---|---|---|---|
| zipline | conda install -c conda-forge zipline |
事件驱动回测 + 实盘交易框架 | Quantopian 出品,回测界的"经典教科书" |
| QuantLib | pip install QuantLib |
金融衍生品定价与数值计算 | 期权、债券、互换的"重型计算器" |
| TA-Lib | pip install TA-Lib |
技术分析指标库(150+ 种) | MACD/RSI/布林带,一行代码全搞定 |
| pyfolio | pip install pyfolio |
投资组合绩效与风险报告 | 与 zipline 无缝集成,一键生成专业分析图表 |
| statsmodels | pip install statsmodels |
统计建模与时间序列分析 | 线性回归、ARIMA、协整检验,策略验证的"统计学基石" |
💡 安装小贴士:zipline 强烈建议用 conda 安装,可避免 Windows 下编译依赖的"奇奇怪怪问题";其余库用 pip 即可。
🧠 8.2 核心框架 zipline 深度实战:从安装到第一个回测
zipline 的设计思想是 "事件驱动" ------ 它模拟真实市场的逐笔/逐日行情推送,策略根据收到的"数据事件"做出交易决策。这种模式天然贴近实盘,也让回测结果更具可信度。
🏗️ Step 1:安装与环境准备
bash
# 使用 conda 创建独立环境(推荐)
conda create -n quant python=3.7
conda activate quant
conda install -c conda-forge zipline
🔑 Step 2:注册数据源 API Key(Quandl / Nasdaq Data Link)
zipline 默认内置了 Quandl 数据包(现为 Nasdaq Data Link),提供美股日线数据。你需要:
- 前往 Nasdaq Data Link 注册免费账号;
- 获取你的 API Key;
- 设置为环境变量(以便 zipline 自动读取):
bash
# Windows (CMD)
set QUANDL_API_KEY=你的key
# macOS / Linux
export QUANDL_API_KEY=你的key
接着下载数据包(数据量较大,首次需等待):
bash
zipline ingest -b quandl # 下载并构建本地数据缓存
zipline bundles # 查看已安装的数据包列表
示例输出:
csvdir <no ingestions>
quandl 2023-12-09 06:02:03.178299
quandl 2023-12-09 05:59:04.273082
quantopian-quandl <no ingestions>
🧠
ingest命令将 Quandl 的原始 CSV 数据转换成 zipline 内部使用的 BColz 压缩格式,后续回测直接读取本地缓存,大幅提升速度。
📝 Step 3:编写第一个策略 ------ "无脑定投苹果"
创建 my_strategy.py,代码如下:
python
from zipline.api import order, record, symbol
def initialize(context):
"""
回测启动时执行一次,用于初始化全局变量或参数。
context 是一个全局容器,可以在不同函数间共享状态。
"""
pass # 本例无特殊初始化
def handle_data(context, data):
"""
每个交易日自动调用一次 ------ 这是策略的"心跳"。
data 对象提供了当前所有证券的实时(历史)价格、成交量等。
"""
# 以当前市价买入 10 股 Apple(AAPL)
order(symbol('AAPL'), 10)
# 记录 AAPL 的当日收盘价,便于事后绘图
record(AAPL=data.current(symbol('AAPL'), 'price'))
核心概念拆解:
initialize(context):仅执行一次,适合设置持仓上限、初始资金、参数常量等。handle_data(context, data):每个交易日被触发,是策略逻辑的核心。order(asset, amount):发送订单,正数买入,负数卖出,zipline 自动以当日收盘价(或下一开盘价)撮合。record(**kwargs):将自定义数据(如价格、指标)存储到回测结果中,后续可导出分析。
🚀 Step 4:运行回测 ------ 让策略"跑"起来
在终端执行:
bash
zipline run -f my_strategy.py --start 2016-1-1 --end 2018-1-1 \
-o buyapple_out.pickle --no-benchmark
运行中你会看到类似日志:
Simulated 503 trading days
first open: 2016-01-04 14:30:00+00:00
last close: 2017-12-29 21:00:00+00:00
参数详解:
| 参数 | 含义 |
|---|---|
run |
zipline 的主回测命令 |
-f my_strategy.py |
指定策略文件路径 |
--start / --end |
回测时间区间(含首尾) |
-o buyapple_out.pickle |
输出文件(pickle 格式),包含完整的绩效数据 |
--no-benchmark |
不对比基准指数(如 S&P 500),若省略则默认对比) |
⚙️ zipline 会从数据包中按日期顺序"播放"历史行情,每播放一个交易日就调用一次
handle_data,并记录所有交易和账户状态。最后将所有数据序列化保存到.pickle文件中。
📂 Step 5:读取回测结果 ------ 深入分析
.pickle 是 Python 的二进制序列化格式,可以轻松加载:
python
import pickle
with open('buyapple_out.pickle', 'rb') as f:
results = pickle.load(f)
# 查看数据列
print(results.columns)
# 输出:Index(['period_open', 'period_close', 'returns', ...], dtype='object')
# 查看前几行(每日绩效明细)
print(results.head())
输出片段(示例):
period_open period_close ... max_leverage excess_return treasury_period_return trading_days period_label
2016-01-04 21:00:00+00:00 2016-01-04 21:00:00+00:00 ... 0.000000 0.0 0.0 1 2016-01
2016-01-05 21:00:00+00:00 2016-01-05 21:00:00+00:00 ... 0.000000 0.0 0.0 1 2016-01
...
- 每日收益率、累计收益、夏普比率、最大回撤、交易次数、杠杆率等;
- 可以配合 pyfolio 生成专业图表:
python
import pyfolio as pf
pf.create_full_tear_sheet(results)
🧭 8.3 回测流程
| 步骤 | 操作内容 | 分支条件 / 备注 |
|---|---|---|
| 1 | 🟢 开始 | --- |
| 2 | 📂 加载数据包(quandl / csvdir) |
准备历史行情数据 |
| 3 | ⚙️ 设置回测参数(起止日期、初始资金) | 配置回测环境 |
| 4 | 🏁 调用 initialize(context) |
一次性初始化函数 |
| 5 | 🔁 逐日循环开始(对每个交易日执行以下子步骤) | --- |
| 5.1 | 📞 调用 handle_data(context, data) |
策略核心逻辑,每天触发 |
| 5.2 | ❓ 判断是否有订单? | 条件分支 |
| 5.2.1 | ✅ 是 → 撮合引擎执行交易,更新持仓与现金 | 模拟实盘撮合 |
| 5.2.2 | ❌ 否 → 跳过(无操作) | 当天不交易 |
| 5.3 | 📊 记录每日绩效(权益、收益率、持仓) | 保存当日快照 |
| 5.4 | ❓ 判断是否还有交易日? | 循环继续条件 |
| 5.4.1 | ✅ 是 → 返回步骤 5,进入下一个交易日 | 继续循环 |
| 5.4.2 | ❌ 否 → 退出循环 | 回测时间区间结束 |
| 6 | 💾 生成回测结果,输出 .pickle 文件 |
保存完整绩效数据 |
| 7 | 📈 (可选)使用 pyfolio 进行可视化分析 |
辅助性能评估 |
| 8 | 🏁 结束 | --- |
🔭 8.4 优秀框架
除了 zipline,国内量化圈还活跃着两个"明星"框架,适合不同场景:
| 框架 | 核心特点 | 适用场景 | 上手难度 |
|---|---|---|---|
| backtrader | 纯 Python 实现,文档详尽,社区活跃;支持多数据源、多策略组合、实盘模拟 | 个人投资者/研究员快速验证思路,教学演示 | ⭐⭐ 友好 |
| vn.py | 国内开源标杆,支持 CTP(期货)、中泰 XTP(股票)等实盘接口;带图形化界面 | 需要对接国内期货/股票实盘的机构或个人开发者 | ⭐⭐⭐⭐ 较高 |
补充:
- backtrader 提供了类似 zipline 的事件驱动模型,但更轻量,且内置了大量技术指标和绘图工具,适合"拿来即用"。
- vn.py 包含完整的交易引擎、风控模块和策略回测组件,并且支持多进程并行优化,适合对性能要求较高的场景。
🎯 总结
| 阶段 | 推荐工具 | 学习目标 |
|---|---|---|
| 原理理解 | 手写 Pandas 回测 + 简单指标 | 搞懂"价格→信号→交易→权益"的闭环 |
| 中级(工程化) | zipline / backtrader | 掌握事件驱动框架,学会分析绩效报告 |
| 高级(实盘部署) | vn.py / 自研系统 | 连接券商/期货接口,实现全自动交易 |
✨ 工具只是"术",策略逻辑和风险控制才是"道"。