第二章:环境搭建与工具链
做量化回测,说白了就是让历史数据在代码里“重演”一遍。但在这之前,你得先把舞台搭好。我见过太多人一上来就写策略,结果卡在环境配置上半天——嗯,这其实是最不值得花时间的地方。
2.1 Python环境配置
我个人习惯用 Anaconda 来管理 Python 环境。为什么?因为它自带了一堆科学计算库,省得你一个个去 pip。你想想看,要是每次换项目都得重新装一遍 NumPy、Pandas,那得多烦人。
安装步骤其实就三步:
- 去 Anaconda 官网下载对应系统的安装包
- 一路默认安装,记得勾上“Add to PATH”
- 打开终端,输入
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
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 有几个快捷键你得记住:
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 这些字段。嗯,这就是我们做回测最基础的数据格式。
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)
pd.read_csv('data.csv', encoding='gbk')
2.5 本章知识体系
下面这张图,是我自己画的环境搭建流程。你看一眼,心里就有数了:
你看,整个流程其实就五步:装 Python → 装核心库 → 配 Jupyter → 拿数据 → 开始回测。每一步都不复杂,但每一步都有细节。我当年第一次搭环境的时候,光在 Pandas 版本上就折腾了两小时——后来学乖了,直接写个 requirements.txt 锁死版本。