环境搭建与项目初始化:Python虚拟环境、依赖管理、项目目录结构设计
做量化交易的朋友都知道,回测框架的搭建,第一步往往不是写代码,而是把环境收拾利索。我见过太多人一上来就 pip install,结果项目做到一半,依赖冲突搞得人想砸电脑。嗯,咱们今天就把这一步走稳。
为什么需要虚拟环境?
说白了,虚拟环境就是给你的每个项目一个独立的 Python 解释器空间。你想想看,A 项目用 pandas 1.0,B 项目用 pandas 2.0,要是装在一个全局环境里,那不得天天打架?
我个人习惯是:每个量化项目都开一个独立的虚拟环境。哪怕只是个小脚本,也别偷懒。我曾经在一个回测项目里,因为依赖版本不对,回测结果差了 0.3% 的年化收益,排查了整整两天才发现是 numpy 版本变了,随机数生成逻辑有差异。
方案一:Poetry —— 现代 Python 依赖管理
Poetry 是我目前的主力工具。它把虚拟环境、依赖管理、打包发布全包了,用起来很顺手。
安装 Poetry:
curl -sSL https://install.python-poetry.org | python3 -
初始化项目:
poetry new order-split-backtest
cd order-split-backtest
添加依赖:
poetry add pandas numpy matplotlib
poetry add --dev pytest black flake8
激活虚拟环境:
poetry shell
小技巧: Poetry 会自动生成 pyproject.toml 和 poetry.lock 文件。lock 文件一定要提交到 Git 里,它能保证所有人安装的依赖版本完全一致。我在团队协作时吃过这个亏,有人没锁版本,结果 CI 跑出来的结果和本地不一样。
方案二:Conda —— 适合数据科学场景
如果你经常用 Jupyter Notebook 或者需要管理非 Python 的依赖(比如 C++ 扩展库),Conda 会更合适。我个人在跑一些需要 TA-Lib 这类 C 扩展库的项目时,会优先选 Conda。
conda create -n order-split python=3.10
conda activate order-split
conda install pandas numpy matplotlib
pip install some-pure-python-package
注意: Conda 和 pip 混用时要小心。建议先用 Conda 安装能装的所有包,剩下的再用 pip。顺序反了容易出问题,我踩过这个坑。
项目目录结构设计
一个好的目录结构,能让你的回测框架像乐高积木一样清晰。我经过多次迭代,总结出下面这个结构:
order-split-backtest/
├── pyproject.toml # 项目配置与依赖
├── README.md # 项目说明
├── .gitignore # Git 忽略规则
├── data/ # 数据文件
│ ├── raw/ # 原始数据
│ └── processed/ # 处理后的数据
├── src/ # 源代码
│ ├── __init__.py
│ ├── engine/ # 回测引擎
│ │ ├── __init__.py
│ │ ├── backtest.py # 主回测逻辑
│ │ └── order_book.py # 订单簿模拟
│ ├── strategies/ # 策略模块
│ │ ├── __init__.py
│ │ ├── base.py # 策略基类
│ │ └── twap.py # TWAP 拆单策略
│ ├── analysis/ # 分析模块
│ │ ├── __init__.py
│ │ ├── metrics.py # 绩效指标
│ │ └── reports.py # 报告生成
│ └── utils/ # 工具函数
│ ├── __init__.py
│ ├── logger.py # 日志配置
│ └── config.py # 配置管理
├── tests/ # 测试代码
│ ├── __init__.py
│ ├── test_engine.py
│ └── test_strategies.py
├── notebooks/ # Jupyter Notebook
│ └── exploration.ipynb
└── docs/ # 文档
└── architecture.md
这个结构有几个要点:
- src/ 目录:所有业务代码放这里,按功能模块分文件夹。我习惯把引擎、策略、分析拆开,这样改策略时不会影响到引擎代码。
- tests/ 目录:测试代码和源代码分开。我要求自己每写一个函数,至少写一个对应的测试用例。
- data/ 目录:原始数据和处理后的数据分开存放。我见过有人把数据直接扔在项目根目录,那叫一个乱。
- notebooks/ 目录:用于探索性分析和可视化。但注意,正式的策略逻辑不要写在 Notebook 里,应该提取到 src/ 中。
依赖管理实战建议
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 纯 Python 项目 | Poetry | 简洁、现代、自动锁版本 |
| 数据科学/机器学习 | Conda | 管理非 Python 依赖更方便 |
| 团队协作 | Poetry + lock 文件 | 保证环境一致性 |
| 快速原型 | pip + venv | 轻量、无需额外安装 |
核心原则: 无论用哪个工具,一定要把依赖管理纳入版本控制。我见过太多项目,代码能跑但没人知道依赖是什么,最后只能重装环境一个个试。
本章知识体系
下面这张图,帮你把环境搭建的核心逻辑串起来:
环境搭建这件事,说白了就是给项目建一个「无菌实验室」。你想想看,如果连环境都不稳定,后面写的策略代码再漂亮,跑出来的结果你敢信吗?
我个人建议:花 30 分钟把环境搭好,后面能省下 3 天排查问题的时间。这笔账,怎么算都划算。