第二章:环境搭建与工具链

做量化回测,说白了就是让历史数据在代码里“重演”一遍。但在这之前,你得先把舞台搭好。我见过太多人一上来就写策略,结果卡在环境配置上半天——嗯,这其实是最不值得花时间的地方。

2.1 Python环境配置

我个人习惯用 Anaconda 来管理 Python 环境。为什么?因为它自带了一堆科学计算库,省得你一个个去 pip。你想想看,要是每次换项目都得重新装一遍 NumPy、Pandas,那得多烦人。

我的建议:别用系统自带的 Python,也别直接装最新版。量化回测这块,Python 3.8 到 3.11 都挺稳的。我目前在用 3.10,没出过什么幺蛾子。

安装步骤其实就三步:

  1. 去 Anaconda 官网下载对应系统的安装包
  2. 一路默认安装,记得勾上“Add to PATH”
  3. 打开终端,输入 conda --version 验证

装完之后,我建议你创建一个独立的虚拟环境:

conda create -n backtest python=3.10
conda activate backtest

为什么要搞虚拟环境?我曾经在一个项目里同时用了两个不同版本的 Pandas,结果数据对齐的时候出了各种诡异错误。从那以后,每个项目我都单独建环境,干净又省心。

2.2 Pandas与NumPy安装

这两个库是回测引擎的左右手。NumPy 管数值计算,Pandas 管数据处理。说白了,没有它们,你连 K 线数据都读不进来。

安装命令很简单:

pip install numpy pandas

如果你用的是 Anaconda,其实它们已经预装了。但我会习惯性地更新到最新版:

pip install --upgrade numpy pandas
注意:Pandas 的版本迭代有时候会改 API。比如 pd.append() 在 1.4 版本之后就被弃用了。我建议你锁定版本号,别让“升级”毁了你的回测逻辑。

验证安装是否成功,可以跑个简单的测试:

import numpy as np
import pandas as pd

print(np.__version__)
print(pd.__version__)

# 创建一个简单的 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
print(df)

看到输出版本号和那个小表格,就说明环境没问题了。

2.3 Jupyter Notebook使用

Jupyter Notebook 这东西,说白了就是个交互式 Python 编辑器。你写一段代码,立刻就能看到结果。做量化回测的时候,我特别喜欢用它来调试策略——改个参数,重新跑一下,马上就能看到收益曲线变化。

安装:

pip install jupyter

启动:

jupyter notebook

浏览器会自动弹出来。如果没弹,终端里会显示一个 URL,复制到浏览器打开就行。

小技巧:我习惯在项目根目录下启动 Jupyter,这样 Notebook 里可以直接用相对路径读取数据文件。别问我怎么知道的——有一次我把 Notebook 和数据文件放在不同目录,折腾了半天路径问题。

Jupyter 有几个快捷键你得记住:

  • Shift + Enter:运行当前单元格并跳到下一个
  • Ctrl + Enter:运行当前单元格但不跳转
  • Esc + A:在当前单元格上方插入新单元格
  • Esc + B:在当前单元格下方插入新单元格

我个人最常用的是 Shift + Enter,写一段测一段,效率很高。

2.4 数据源获取

数据是回测的命根子。没有数据,你写再多策略代码都是白搭。这里我介绍两种最常用的数据获取方式。

2.4.1 从 Yahoo Finance 获取数据

Yahoo Finance 提供免费的股票历史数据。要用它,你得先装个 yfinance 库:

pip install yfinance

然后就可以拉数据了:

import yfinance as yf

# 下载苹果公司股票数据
aapl = yf.download('AAPL', start='2020-01-01', end='2023-12-31')
print(aapl.head())

你会得到一个 DataFrame,里面有 Open、High、Low、Close、Volume 这些字段。嗯,这就是我们做回测最基础的数据格式。

避坑指南:我曾经在写回测框架时,直接从 Yahoo Finance 拉了 10 年的分钟级数据。结果网络一波动,数据就断了。后来我加了个重试机制,每次请求失败自动重试 3 次。代码大概长这样:
import time
from functools import retry

@retry(tries=3, delay=2)
def fetch_data(ticker, start, end):
    return yf.download(ticker, start=start, end=end)

# 使用
data = fetch_data('AAPL', '2020-01-01', '2023-12-31')

2.4.2 从本地 CSV 读取数据

很多时候,你的数据可能来自本地文件。比如券商提供的交易数据,或者你自己爬下来的历史行情。CSV 是最通用的格式。

用 Pandas 读取 CSV 非常简单:

import pandas as pd

# 读取本地 CSV 文件
df = pd.read_csv('data/stock_data.csv')

# 看看数据长什么样
print(df.info())
print(df.head())

但这里有个坑——CSV 里的日期通常是字符串,你得把它转成 Pandas 的 datetime 类型,不然回测的时候没法按时间排序:

df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
df.sort_index(inplace=True)
注意:CSV 文件的编码问题。我遇到过好几次,从 Windows 导出的 CSV 是 GBK 编码,在 Mac 上读出来全是乱码。解决办法是读的时候指定编码: pd.read_csv('data.csv', encoding='gbk')

2.5 本章知识体系

下面这张图,是我自己画的环境搭建流程。你看一眼,心里就有数了:

量化回测环境搭建流程 Python 环境 Anaconda / 虚拟环境 核心库安装 NumPy + Pandas 交互工具 Jupyter Notebook 数据源获取 Yahoo Finance / 本地 CSV 回测引擎 策略验证与优化

你看,整个流程其实就五步:装 Python → 装核心库 → 配 Jupyter → 拿数据 → 开始回测。每一步都不复杂,但每一步都有细节。我当年第一次搭环境的时候,光在 Pandas 版本上就折腾了两小时——后来学乖了,直接写个 requirements.txt 锁死版本。

总结一下:环境搭建这事儿,一次配好,后面就只管写策略了。别在这上面省时间,也别在这上面花太多时间。按我上面说的步骤来,半小时内搞定。

专注资料整理