3. 开发环境搭建:Python虚拟环境、依赖管理(Poetry)、Docker容器化部署、代码仓库初始化
说实话,搭建开发环境这事儿,看着简单,但坑是真不少。我见过太多人花了一整天装环境,最后发现版本冲突,心态直接崩了。今天咱们就把这套流程捋清楚,让你少走弯路。
3.1 Python虚拟环境:隔离是王道
为什么要用虚拟环境?说白了,就是防止项目之间打架。你想想看,项目A需要Django 3.2,项目B需要Django 4.0,要是装在一个全局环境里,那不得天天报错?
我个人习惯用 venv,Python 3.3+ 自带,不用额外装东西。操作起来也简单:
# 创建虚拟环境
python -m venv venv
# 激活(Windows)
venv\Scripts\activate
# 激活(Mac/Linux)
source venv/bin/activate
# 退出
deactivate
嗯,这里要注意一点:千万别把 venv 文件夹提交到 Git 仓库。我刚开始做项目时就犯过这错,结果同事拉下来发现路径全乱了。正确的做法是在 .gitignore 里加上 venv/。
(venv) 字样。如果没看到,说明没激活成功,检查一下路径。
3.2 依赖管理:Poetry 真香
以前我用 pip freeze > requirements.txt,但后来发现这玩意儿太粗糙了。它只会记录你当前环境里装了什么,不会区分「直接依赖」和「间接依赖」。比如你装了 requests,它依赖 urllib3,但 requirements.txt 里两个都会列出来。哪天 requests 升级了,不再依赖 urllib3,你的文件里还留着它,这就尴尬了。
所以我后来全面转向了 Poetry。它用 pyproject.toml 管理依赖,清晰又优雅。
# 安装 Poetry
pip install poetry
# 初始化项目
poetry init
# 添加依赖
poetry add pandas numpy ta-lib
# 添加开发依赖
poetry add --dev pytest black
# 安装所有依赖
poetry install
# 导出 requirements.txt(给 Docker 用)
poetry export -f requirements.txt --output requirements.txt
我在项目中遇到过一个问题:Poetry 默认会创建虚拟环境,但有时候你希望用自己手动创建的 venv。这时候可以设置:
poetry config virtualenvs.create false
这样 Poetry 就会直接用当前激活的虚拟环境了。
my_trading_bot/
├── pyproject.toml # 项目元数据和依赖声明
├── poetry.lock # 锁定版本(必须提交到 Git)
├── src/
│ └── trading_bot/
│ ├── __init__.py
│ ├── strategies/
│ └── data/
└── tests/
3.3 Docker容器化部署:一次构建,到处运行
做量化交易,最怕的就是「在我电脑上能跑啊」。Docker 就是来解决这个问题的。它把你的应用和所有依赖打包成一个镜像,不管部署到哪,行为都一样。
来看一个典型的 Dockerfile:
# 使用 Python 3.10 作为基础镜像
FROM python:3.10-slim
# 设置工作目录
WORKDIR /app
# 安装系统依赖(ta-lib 需要编译)
RUN apt-get update && apt-get install -y \
build-essential \
libta-lib0 \
libta-lib-dev \
&& rm -rf /var/lib/apt/lists/*
# 复制依赖文件
COPY requirements.txt .
# 安装 Python 依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目代码
COPY . .
# 暴露端口(如果有 API 服务)
EXPOSE 8000
# 启动命令
CMD ["python", "main.py"]
我曾经踩过一个坑:ta-lib 这个库在 pip 安装时经常失败,因为它需要 C 扩展编译。后来我发现用 --no-cache-dir 可以避免缓存导致的奇怪问题,而且用 slim 版本镜像能省不少空间。
构建和运行:
# 构建镜像
docker build -t trading-bot:latest .
# 运行容器
docker run -d --name my-bot \
-v $(pwd)/config:/app/config \
-v $(pwd)/logs:/app/logs \
trading-bot:latest
3.4 代码仓库初始化:Git 是底线
做量化交易,代码就是你的资产。不用 Git 管理,相当于把钱扔地上不管。我见过有人写了一个月的策略,硬盘坏了全没了……那叫一个惨。
初始化流程:
# 初始化仓库
git init
# 添加 .gitignore
echo "venv/" >> .gitignore
echo "__pycache__/" >> .gitignore
echo "*.pyc" >> .gitignore
echo ".env" >> .gitignore
echo "logs/" >> .gitignore
echo "data/" >> .gitignore
# 添加远程仓库(以 GitHub 为例)
git remote add origin git@github.com:yourname/trading-bot.git
# 首次提交
git add .
git commit -m "初始化交易机器人项目"
git push -u origin main
我个人习惯用 分支策略:main 分支只放稳定版本,开发在 dev 分支上进行,每个新功能开一个 feature/xxx 分支。这样万一出问题,回滚也方便。
# Python
venv/
__pycache__/
*.pyc
*.pyo
# 配置文件
.env
config/*.yaml
!config/default.yaml
# 数据
data/
logs/
backtest_results/
# IDE
.vscode/
.idea/
# 系统
.DS_Store
Thumbs.db
3.5 整体架构一览
说了这么多,咱们用一张图把整个开发环境的关系理清楚:
这张图把整个流程串起来了:代码在 Git 里管理 → 本地用 venv + Poetry 开发 → 通过 Dockerfile 构建镜像 → 最终在容器里运行。每一步都有它的作用,缺一不可。
3.6 避坑指南
最后,分享几个我踩过的坑:
- Python 版本不一致:本地用 3.10,服务器用 3.8,结果语法报错。解决方案:在
pyproject.toml里明确指定python = "^3.10"。 - Poetry 锁文件冲突:多人协作时,
poetry.lock经常冲突。我的做法是:谁改依赖谁负责解决冲突,别扔给队友。 - Docker 镜像太大:一开始我用
python:3.10完整版,镜像 1GB+。后来换成slim版本,再配合多阶段构建,直接降到 200MB。 - 忘记挂载数据卷:容器重启后,日志和回测结果全丢了。记住:容器是无状态的,持久化数据必须挂载卷。
好了,开发环境这块就聊到这儿。环境搭好了,后面写策略、跑回测才能安心。记住一句话:环境搞不定,啥都干不成。