回测环境搭建:Python环境准备、vn.py库安装、数据库配置、回测数据准备
说实话,很多新手一上来就急着写策略、跑回测,结果卡在环境搭建这一步好几天。我当年也踩过这个坑——Python版本不对、vn.py装不上、MongoDB连不上……折腾一整天,代码一行没写。所以这一章,咱们把地基打牢。
回测环境说白了就四块:Python环境、vn.py库、数据库、回测数据。一块一块来,别急。
1. Python环境准备
vn.py目前稳定支持Python 3.7到3.10。我个人习惯用Python 3.9,兼容性最好,踩坑最少。
第一步:安装Python
去官网下载对应版本,安装时记得勾选「Add Python to PATH」。这个选项不勾,后面命令行里敲python会报找不到命令。
第二步:创建虚拟环境
我建议每个项目都建独立的虚拟环境。为什么?因为不同项目依赖的库版本可能冲突。我曾经在一个环境里同时装了vn.py 2.x和3.x,结果两个都跑不起来……
# 创建虚拟环境
python -m venv vnpy_env
# 激活环境(Windows)
vnpy_env\Scripts\activate
# 激活环境(Mac/Linux)
source vnpy_env/bin/activate
激活后,命令行前面会出现 (vnpy_env) 字样,说明你已经在虚拟环境里了。
venv 或 vnpy_env,方便识别。别取什么 myenv、env1 这种名字,三个月后你自己都分不清。
2. vn.py库安装
环境激活后,直接pip安装。vn.py的安装包分两种:完整版和精简版。
- 完整版:包含所有功能模块,适合新手一次性装好
- 精简版:只装核心回测和交易模块,适合有经验的用户按需添加
我建议新手直接装完整版,省心。
# 安装完整版
pip install vnpy
# 或者安装指定版本(比如2.0.9)
pip install vnpy==2.0.9
安装过程可能会有点慢,因为vn.py依赖的库比较多。如果遇到网络超时,可以换国内镜像源:
pip install vnpy -i https://pypi.tuna.tsinghua.edu.cn/simple
vnpy 如果能启动图形界面,说明安装成功。如果报错说缺少某个DLL(Windows上常见),通常是VC++运行库没装。去微软官网搜「Visual C++ Redistributable」装一下就好。
3. 数据库配置
vn.py支持多种数据库,回测场景下最常用的是MongoDB和InfluxDB。我一般用MongoDB存K线数据,InfluxDB存Tick数据。但如果你只做期货CTA回测,MongoDB完全够用。
3.1 MongoDB安装与配置
去MongoDB官网下载Community Server版本。安装时注意:
- 选择「Complete」安装
- 取消勾选「Install MongoDB Compass」(图形工具,可以单独装)
安装完成后,启动MongoDB服务:
# Windows:在服务里启动 MongoDB 服务
# Mac/Linux:
mongod --dbpath /data/db
然后在vn.py的配置文件中设置数据库连接:
# 在 vnpy/trader/setting.py 或自定义配置中
database = {
"database": "mongodb",
"host": "localhost",
"port": 27017,
"user": "",
"password": ""
}
3.2 InfluxDB(可选)
如果你要存Tick级别的数据,InfluxDB是更好的选择。安装方式类似,但配置稍微复杂一点。我个人建议:新手先别碰InfluxDB,等把MongoDB玩熟了再说。
4. 回测数据准备
环境搭好了,没数据也白搭。回测数据来源主要有三种:
- 从数据商购买(如天勤、万得、聚宽)
- 从交易所官网下载(免费,但格式需要转换)
- 用vn.py自带的下载工具(支持部分数据源)
我一般用第一种,省时间。但为了演示,咱们用vn.py自带的脚本下载螺纹钢(RB)的日线数据:
from vnpy.data.manager import DataManager
from vnpy.trader.constant import Exchange, Interval
# 初始化数据管理器
dm = DataManager()
# 下载螺纹钢连续合约日线数据
dm.download_data(
symbol="RB888",
exchange=Exchange.SHFE,
interval=Interval.DAILY,
start_date="20200101",
end_date="20231231"
)
下载完成后,数据会自动存入MongoDB。你可以用以下代码验证:
# 查询数据
data = dm.load_data(
symbol="RB888",
exchange=Exchange.SHFE,
interval=Interval.DAILY,
start_date="20200101",
end_date="20231231"
)
print(f"共加载 {len(data)} 条K线数据")
print(data.head())
知识体系总览
下面这张图把本章的核心逻辑串起来了,建议保存下来对照着看:
嗯,到这里环境就搭好了。你可能会问:「数据下载完了,然后呢?」别急,下一章咱们就用这些数据跑第一个回测。不过在那之前,我建议你先把MongoDB里的数据查一遍,确认字段完整、没有空值。我见过太多人数据没检查就开跑,结果回测结果全是NaN……
最后说一句:环境搭建这一步,慢就是快。花半天时间把环境搞利索,后面写策略、跑回测会顺畅很多。别像我当年那样,环境没搭好就急着写代码,最后全推倒重来。