第二章:系统环境与依赖管理

说实话,很多做量化交易的朋友,最后代码跑不起来,不是策略有问题,而是环境崩了。我见过太多人,在本地跑得好好的,一上服务器就各种报错。嗯,这章我们就来解决这个问题。

2.1 Python虚拟环境搭建

Python的依赖管理,说白了就是「隔离」两个字。你想想看,一个项目用TensorFlow 1.x,另一个用2.x,装在一起肯定打架。虚拟环境就是给每个项目一个独立的小房间。

我个人习惯用 venv,因为它是Python自带的,不需要额外装东西。但如果你团队里有人用Windows,有人用Mac,那我建议你直接用 conda,跨平台兼容性好很多。

核心原则:每个交易策略项目,都应该有自己的虚拟环境。别偷懒共用。

创建虚拟环境其实就一行命令:

# 用 venv
python -m venv trading_env

# 激活(Linux/Mac)
source trading_env/bin/activate

# 激活(Windows)
trading_env\Scripts\activate

激活后,你的终端前面会出现 (trading_env) 字样。看到这个,就说明环境隔离成功了。

小技巧:我习惯在项目根目录下建一个 .venv 文件夹,然后用 .gitignore 把它忽略掉。这样既不影响版本控制,又能保证每个人拉代码后自己重建环境。

2.2 依赖包管理:Poetry vs Conda

这里我踩过不少坑。早期我用 pip freeze > requirements.txt,结果发现这玩意儿会把所有依赖的依赖都列出来,版本还锁得死死的。换台机器,经常装不上。

后来我转向了 Poetry。它解决了两个核心问题:

  • 依赖解析:自动帮你算好哪些版本能共存
  • 锁定文件poetry.lock 保证所有人装的一模一样

安装Poetry也很简单:

curl -sSL https://install.python-poetry.org | python3 -

初始化项目:

poetry new multi_agent_trading
cd multi_agent_trading
poetry add pandas numpy ta-lib
poetry add --dev pytest black

看到没?--dev 参数把测试和格式化工具单独放,生产环境不装这些。这个设计很聪明。

但如果你团队里有人用 Conda,那也别硬推Poetry。Conda的优势在于:

  • 能管理非Python依赖(比如C++库)
  • 对Windows用户更友好
  • 环境切换速度更快

我个人建议:纯Python项目用Poetry,涉及C扩展或跨语言依赖用Conda。

注意:千万不要混用pip和conda装同一个包。我曾经这么干过,结果两个版本冲突,调试了整整一天。选一个工具,用到底。

2.3 Docker基础与镜像构建

虚拟环境解决了「同一台机器」的问题。但多智能体系统往往要部署在多台服务器上,这时候Docker就派上用场了。

Docker的核心思想就一句话:把环境和代码打包成一个镜像,到处运行

我给你们看一个典型的 Dockerfile

FROM python:3.10-slim

WORKDIR /app

# 先装依赖(利用Docker缓存层)
COPY pyproject.toml poetry.lock ./
RUN pip install poetry && \
    poetry config virtualenvs.create false && \
    poetry install --no-dev

# 再拷代码
COPY . .

CMD ["python", "main.py"]

这里有个细节:先拷依赖文件,再装依赖,最后拷代码。为什么?因为依赖不常变,代码经常改。这样每次构建时,依赖层可以复用缓存,速度能快好几倍。

构建和运行:

docker build -t trading-agent:latest .
docker run -d --name agent1 trading-agent:latest

避坑指南:我曾经把整个项目文件夹拷进去再装依赖,结果每次改一行代码都要重装所有包,构建一次20分钟。后来改成上面那种分层构建,时间缩短到30秒。

对于多智能体系统,我一般会建多个Docker镜像:

智能体类型 基础镜像 额外依赖
数据采集智能体 python:3.10-slim requests, websocket-client
策略决策智能体 python:3.10-slim numpy, pandas, scikit-learn
执行交易智能体 python:3.10-slim ccxt, pycryptodome

每个智能体独立构建、独立部署。这样如果某个智能体挂了,不影响其他模块。

2.4 版本控制(Git)策略

Git这东西,很多人只会 addcommitpush 三板斧。但在多智能体系统里,这远远不够。

我推荐用 Git Flow 策略,但做了简化:

  • main 分支:只放生产可用的代码
  • develop 分支:日常开发的主战场
  • feature/* 分支:每个新功能一个分支
  • hotfix/* 分支:线上出问题紧急修复

举个例子,你要开发一个「风险控制智能体」:

git checkout -b feature/risk_agent
# 开发、测试...
git add .
git commit -m "feat: 新增风险控制智能体,支持止损和仓位管理"
git checkout develop
git merge feature/risk_agent

这里有个关键点:提交信息要规范。我团队用的是 conventional commits 规范:

类型 说明 示例
feat 新功能 feat: 新增数据缓存模块
fix 修复bug fix: 修复时间戳溢出问题
chore 杂项 chore: 更新依赖版本
docs 文档 docs: 更新API说明

为什么要这么严格?因为多智能体系统涉及多个模块,如果提交信息乱七八糟,回滚的时候根本不知道哪个提交对应哪个功能。

我的习惯:每次提交前,我会先跑一遍测试。如果测试没过,绝对不提交。这个习惯帮我避免了很多次「代码推上去才发现跑不了」的尴尬。

2.5 本章知识体系

下面这张图,是我梳理的本章核心逻辑。你看一眼,就能明白这些工具是怎么配合的:

多智能体交易系统 - 环境与依赖管理 开发环境 Python虚拟环境 (venv/conda) 依赖管理 Poetry / Conda 容器化部署 Docker镜像构建 版本控制 Git Flow策略 从开发到部署的完整链路

你看,整个链路很清晰:先在本地用虚拟环境隔离开发,用Poetry或Conda管理依赖,然后通过Docker打包成镜像,最后用Git控制所有代码变更。每一步都环环相扣。

最后提醒一句:别想着「先写代码,环境后面再配」。我见过太多项目,代码写完了,部署的时候发现依赖装不上,最后重写。环境管理,一定要从第一天就开始做。


公众号:蓝海资料掘金营,微信deep3321