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
注意: 敏感信息(如 API Key、数据库密码)千万别写死在 Dockerfile 里。用环境变量或挂载配置文件的方式传入。

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 分支。这样万一出问题,回滚也方便。

推荐的 .gitignore 模板(量化交易专用):
# 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 代码仓库 本地开发环境 Python 虚拟环境 (venv) + Poetry 依赖管理 Docker 镜像构建 (Dockerfile) Docker 容器运行 挂载配置 / 日志 / 数据卷 开发阶段 构建阶段 部署阶段

这张图把整个流程串起来了:代码在 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。
  • 忘记挂载数据卷:容器重启后,日志和回测结果全丢了。记住:容器是无状态的,持久化数据必须挂载卷。
我的建议: 刚开始别追求完美,先把这套流程跑通。哪怕只是打印一句 "Hello Trading",也要走完「本地开发 → Docker 构建 → 容器运行」的完整链路。后面加功能就顺了。

好了,开发环境这块就聊到这儿。环境搭好了,后面写策略、跑回测才能安心。记住一句话:环境搞不定,啥都干不成