2、开发环境搭建:Python版本选择、虚拟环境配置、核心依赖库安装

说实话,搭建开发环境这件事,很多新手觉得不值一提。

但我见过太多人,花了两天时间调一个bug,最后发现是Python版本不对。或者依赖库冲突,搞得整个项目跑不起来。嗯,这些坑我都踩过。

今天我们就来把环境搭得干干净净,后面写代码才能顺风顺水。

2.1 Python版本选择:别追新,要追稳

我个人习惯,做量化交易系统,Python版本选3.9或3.10。

为什么不是3.12?你想想看,asyncio在3.9就已经很成熟了,pika、redis-py这些库对3.9的支持也最稳定。我去年有个项目,团队里有人非要用3.11,结果某个异步库的协程调度出了兼容性问题,排查了两天才发现是版本锅。

所以我的建议是:Python 3.9.13Python 3.10.11,这两个版本经过大量生产环境验证,最靠谱。

版本选择要点:
  • 3.9:asyncio 稳定,第三方库兼容性最好
  • 3.10:性能略有提升,结构模式匹配可用
  • 3.11+:新特性多,但部分库可能未适配

2.2 虚拟环境配置:隔离是美德

我曾经在一个服务器上同时维护三个量化项目,每个项目依赖的库版本都不一样。如果没有虚拟环境,那简直就是噩梦。

Python自带的 venv 就够用了。我一般这样操作:

# 创建虚拟环境
python3.9 -m venv trading_env

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

# 激活(Windows)
trading_env\Scripts\activate

# 退出
deactivate

激活后,终端前面会出现 (trading_env) 字样,说明你已经在虚拟环境里了。这时候安装的所有库,都只在这个环境里生效,不会污染系统全局。

小技巧: 我习惯在项目根目录下建一个 .venv 文件夹,然后配置IDE自动识别。这样每次打开项目,终端自动激活虚拟环境,省心。

2.3 核心依赖库安装

好,虚拟环境准备好了,接下来装核心库。这四个库是我们事件驱动系统的骨架:

库名 版本建议 作用
asyncio Python 3.9+ 内置 事件循环、协程调度
pika 1.3.2 RabbitMQ 客户端,消息队列
redis 5.0.0 Redis 客户端,缓存/状态存储
sqlalchemy 2.0.23 ORM,数据库操作

安装命令很简单:

pip install pika==1.3.2 redis==5.0.0 sqlalchemy==2.0.23

asyncio 不需要单独安装,Python 3.9 自带。

2.3.1 asyncio:事件循环的心脏

说白了,asyncio 就是我们的「调度中心」。所有的事件处理、消息收发、定时任务,都靠它来协调。

我刚开始用 asyncio 时,总觉得它和普通的同步代码差不多。后来才发现,协程不是函数,你得用 await 去调用它。这个坑我踩了不止一次。

import asyncio

async def handle_event(event):
    print(f"处理事件: {event}")
    await asyncio.sleep(0.1)  # 模拟IO操作
    return "完成"

async def main():
    result = await handle_event("订单成交")
    print(result)

asyncio.run(main())
注意: 不要在协程里写 time.sleep(),它会阻塞整个事件循环。要用 await asyncio.sleep()

2.3.2 pika:连接RabbitMQ的桥梁

pika 是 Python 操作 RabbitMQ 最常用的库。事件驱动系统里,消息队列就是「血管」,pika 就是连接血管的管道。

我记得第一次用 pika 时,被它的 BlockingConnectionSelectConnection 搞晕了。简单说:

  • BlockingConnection:同步模式,简单但会阻塞
  • SelectConnection:异步模式,配合 asyncio 使用

我们做事件驱动系统,当然选异步模式。

import pika
import asyncio

# 异步连接示例(简化版)
async def connect_rabbitmq():
    connection = await pika.connect("amqp://guest:guest@localhost/")
    channel = await connection.channel()
    return channel

2.3.3 redis:缓存与状态存储

Redis 在我们系统里干两件事:

  1. 缓存:存行情数据、中间计算结果
  2. 状态存储:记录订单状态、账户信息

redis-py 这个库,配合 asyncio 的 aioredis(现在合并到 redis-py 里了)。

import redis.asyncio as aioredis

async def get_redis():
    r = await aioredis.Redis(host='localhost', port=6379, db=0)
    await r.set('order:123', 'filled')
    value = await r.get('order:123')
    print(value)  # b'filled'
    await r.close()
避坑指南: 我曾经在生产环境忘了设置连接池,结果高并发时 Redis 连接数爆了。记得用 redis.ConnectionPool 管理连接。

2.3.4 sqlalchemy:数据库操作的门面

SQLAlchemy 2.0 版本改进了异步支持,可以直接用 async_session。我们用它来操作 MySQL 或 PostgreSQL,存储交易记录、策略参数等持久化数据。

from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker

DATABASE_URL = "mysql+aiomysql://user:pass@localhost/trading"

engine = create_async_engine(DATABASE_URL, echo=True)
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)

async def save_order(order_data):
    async with async_session() as session:
        session.add(order_data)
        await session.commit()

2.4 知识体系总览

下面这张图,帮你理清这四个库在事件驱动系统里的位置:

asyncio 事件循环 pika RabbitMQ 消息队列 事件发布/订阅 redis 缓存 & 状态存储 行情/订单状态 sqlalchemy 持久化存储 事件驱动交易系统 - 核心依赖架构 asyncio 调度一切,pika/redis/sqlalchemy 各司其职

看到没?asyncio 在中间,像心脏一样泵送事件。pika 负责从外部接收消息,redis 负责快速存取状态,sqlalchemy 负责把重要数据落盘。各司其职,互不干扰。

2.5 验证环境是否搭好

装完库,跑个简单的测试脚本,确认一切正常:

import asyncio
import pika
import redis.asyncio as aioredis
from sqlalchemy import create_engine

async def test_env():
    print("asyncio: OK")
    
    # 测试 pika(需要 RabbitMQ 运行)
    # print("pika: OK")
    
    # 测试 redis
    try:
        r = await aioredis.Redis()
        await r.ping()
        print("redis: OK")
        await r.close()
    except:
        print("redis: 连接失败,请检查 Redis 服务")
    
    # 测试 sqlalchemy
    try:
        engine = create_engine("sqlite:///test.db")
        engine.connect()
        print("sqlalchemy: OK")
    except:
        print("sqlalchemy: 连接失败")

asyncio.run(test_env())

如果输出都是 OK,恭喜你,环境搭好了。

最后说一句: 环境搭建是地基,地基不稳,楼盖得再高也白搭。我见过太多人急着写策略,结果环境问题浪费大量时间。花半小时把这一步做好,后面能省下几十个小时。

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