第二章 环境搭建与工具链
说实话,很多做量化的人一上来就急着写策略。我见过太多人,代码跑不起来就怪系统,数据对不上就骂交易所。其实啊,90%的问题都出在环境上。这一章,咱们就把地基打牢。
2.1 Python版本选择——别小看这个决定
我个人习惯用Python 3.10+。为什么?因为asyncio在3.10之后稳定了很多,类型提示也更完善。你想想看,做市引擎跑起来可是7x24小时的,版本选不对,后面全是坑。
我曾经在一个项目里用了Python 3.7,结果asyncio的Task对象没有name属性,导致日志追踪时根本分不清哪个协程在干活。后来全部重装,折腾了两天。
建议直接装3.11或3.12。别犹豫,一步到位。
2.2 虚拟环境管理——隔离是美德
每个项目都应该有自己的虚拟环境。这不是洁癖,是生存法则。
我推荐用 venv,Python自带的,够用。当然,如果你喜欢 conda 也行,但别混用。
# 创建虚拟环境
python -m venv mm_env
# 激活(Windows)
mm_env\Scripts\activate
# 激活(Mac/Linux)
source mm_env/bin/activate
# 退出
deactivate
嗯,这里要注意:激活后,你的终端前面会出现 (mm_env) 字样。如果没有,说明没激活成功。
2.3 核心依赖库安装
做市引擎需要的东西不多,但每个都很关键。我列个清单:
| 库名 | 版本建议 | 用途 |
|---|---|---|
| asyncio | 内置 | 异步事件循环,做市引擎的心脏 |
| websockets | ≥12.0 | 连接交易所的WebSocket接口 |
| pandas | ≥2.0 | 处理订单簿、交易数据 |
| numpy | ≥1.24 | 数值计算,价差分析 |
# 一键安装
pip install websockets pandas numpy
# 或者用requirements.txt
pip install -r requirements.txt
我习惯把版本号固定下来。比如
websockets==12.0。为什么?因为有一次websockets升级了API,我的代码直接崩了。从那以后,我所有项目都用 pip freeze > requirements.txt 锁定版本。
2.4 asyncio——做市引擎的调度核心
说白了,做市引擎就是一堆异步任务在跑。一个任务收行情,一个任务算报价,一个任务发订单。它们不能互相阻塞。
asyncio就是干这个的。它让Python能同时处理多个网络连接,而不需要多线程。
import asyncio
async def fetch_orderbook():
# 模拟从交易所获取订单簿
await asyncio.sleep(0.1)
return {"bid": 100.0, "ask": 100.1}
async def main():
# 并发获取多个订单簿
tasks = [fetch_orderbook() for _ in range(3)]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())
你看,asyncio.gather 可以同时跑多个任务。这在做市引擎里太常用了——同时监控多个交易对。
2.5 websockets——连接交易所的桥梁
交易所的行情数据,基本都是通过WebSocket推送的。你想想看,如果每次都用HTTP去拉数据,延迟得多高?
WebSocket建立一次连接,后面全是全双工通信。做市引擎需要的就是这个。
import asyncio
import websockets
async def listen_market():
uri = "wss://stream.example.com/market"
async with websockets.connect(uri) as ws:
# 订阅行情
await ws.send('{"type": "subscribe", "channel": "orderbook"}')
# 持续接收数据
async for msg in ws:
print(f"收到行情: {msg}")
# 这里可以丢给pandas处理
asyncio.run(listen_market())
WebSocket连接要加心跳检测。我曾经遇到过连接断了但没报错,结果引擎空跑了半小时。后来加了ping/pong机制,问题才解决。
2.6 pandas与numpy——数据处理双雄
做市引擎每秒可能收到上千条行情。这些数据不能直接扔给策略,得先清洗、聚合、计算。
pandas处理表格数据,numpy做数值计算。两者配合,效率很高。
import pandas as pd
import numpy as np
# 模拟订单簿快照
data = {
"price": [100.0, 100.1, 100.2],
"volume": [1.5, 2.0, 0.5],
"side": ["bid", "bid", "ask"]
}
df = pd.DataFrame(data)
# 计算加权平均价
weighted_price = np.average(
df[df["side"] == "bid"]["price"],
weights=df[df["side"] == "bid"]["volume"]
)
print(f"买方加权均价: {weighted_price:.2f}")
说白了,pandas帮你整理数据,numpy帮你算得快。做市引擎里,这两个库是标配。
2.7 环境验证——跑通第一个脚本
装完库,得验证一下。我习惯写个简单的测试脚本:
import asyncio
import websockets
import pandas as pd
import numpy as np
def check_environment():
print(f"Python版本: {sys.version}")
print(f"pandas版本: {pd.__version__}")
print(f"numpy版本: {np.__version__}")
# 简单测试
arr = np.array([1, 2, 3])
df = pd.DataFrame({"a": arr})
print("环境验证通过!")
if __name__ == "__main__":
check_environment()
跑一下,如果没报错,说明环境搭好了。如果有报错,别慌,多半是版本问题或者虚拟环境没激活。
2.8 知识体系总览
这一章的内容,其实就围绕一个核心:让Python能高效地处理实时行情数据。我画了个图,帮你理清关系:
你看,从Python版本到虚拟环境,再到三个核心库,最后支撑起做市引擎。每一层都不能少。
环境搭建别图快。我见过太多人,装完库就开始写策略,结果跑起来各种报错。花半小时把环境搞利索,后面能省三天时间。
好了,环境搭好了,下一章咱们就开始写真正的做市引擎代码了。到时候,这些库都会派上用场。
公众号:蓝海资料掘金营,微信deep3321