3. 开发环境搭建:Python环境、Anaconda、Jupyter Notebook、常用库安装
做量化交易,尤其是做市商系统,说白了就是跟时间赛跑。你的开发环境如果没搭好,后面每一步都会踩坑。我个人习惯是,先把地基打牢,再往上盖楼。这一章,我们就来聊聊怎么搭一个干净、高效、不容易出幺蛾子的Python开发环境。
3.1 为什么选Python?
你可能要问,做高频做市,C++不是更快吗?没错,C++确实快。但做市商报价引擎的研发阶段,需要快速迭代、频繁回测、实时调试。Python的生态太丰富了,pandas处理数据、asyncio处理异步、websockets做实时通信,一套组合拳下来,开发效率极高。我见过不少团队,先用Python把策略逻辑跑通,再转C++上生产。嗯,这也是我推荐的路子。
3.2 Anaconda:环境管理的瑞士军刀
我刚开始做量化那会儿,最头疼的就是依赖冲突。这个库要Python 3.8,那个库要3.9,一不小心就把系统Python搞崩了。后来用了Anaconda,世界清净了。
Anaconda 是一个Python发行版,自带conda包管理器。它能帮你创建独立的虚拟环境,每个环境就像一个小房间,互不干扰。
核心优势:
- 环境隔离:每个项目一个环境,不会互相污染
- 包管理:conda install 比 pip 更擅长处理二进制依赖
- 预装常用库:numpy、pandas、scipy 等开箱即用
安装步骤:
- 去官网下载 Anaconda 安装包(选 Python 3.9+ 版本)
- 安装时勾选「Add Anaconda to my PATH environment variable」
- 打开终端,输入
conda --version验证安装
注意:我曾经因为没勾选PATH选项,导致后面Jupyter Notebook找不到内核,折腾了半天。建议你直接勾上,省心。
3.3 创建专属虚拟环境
做市商引擎对环境要求比较严格。我建议单独创建一个环境,取名 market_maker。
# 创建环境
conda create -n market_maker python=3.9
# 激活环境
conda activate market_maker
# 退出环境
conda deactivate
激活后,终端前面会出现 (market_maker) 字样。这说明你已经在独立环境里了。后面所有操作都在这个环境里进行。
3.4 Jupyter Notebook:交互式开发的利器
做策略研究时,Jupyter Notebook 是我的首选。它能把代码、图表、文档混在一起,特别适合快速验证想法。
安装:
conda install jupyter notebook
启动:
jupyter notebook
浏览器会自动打开一个页面。你可以在里面新建Python文件,写代码、画图、做回测。我习惯把每个策略模块放在不同的Notebook里,比如「数据获取.ipynb」、「信号生成.ipynb」、「回测引擎.ipynb」。这样逻辑清晰,也方便团队协作。
小技巧:在Jupyter里按 Tab 键可以自动补全代码,按 Shift + Enter 执行当前单元格。这两个快捷键能帮你省下不少时间。
3.5 常用库安装
做市商报价引擎,离不开下面这几个库。我一个个说。
3.5.1 pandas:数据处理的核心
pandas 是量化交易的基石。它提供了 DataFrame 结构,能轻松处理时间序列数据。比如订单簿的买卖盘口、历史成交记录,用 pandas 处理起来非常顺手。
conda install pandas
安装后,你可以试试这个简单的例子:
import pandas as pd
# 创建一个简单的订单簿
data = {
'price': [100.1, 100.2, 100.3],
'volume': [1000, 2000, 1500],
'side': ['bid', 'bid', 'ask']
}
df = pd.DataFrame(data)
print(df)
3.5.2 numpy:高性能数值计算
numpy 是 pandas 的底层引擎。做矩阵运算、统计计算时,numpy 比纯Python快几十倍。我在做价差计算时,经常用 numpy 的向量化操作,效率提升很明显。
conda install numpy
3.5.3 asyncio:异步I/O的核心
做市商系统需要同时处理多个交易所的WebSocket连接。如果用同步方式,一个连接卡住,整个系统就瘫痪了。asyncio 就是解决这个问题的。
conda install asyncio
asyncio 是 Python 3.4 引入的标准库。它用 async/await 语法,让你写出看起来像同步代码的异步程序。举个例子:
import asyncio
async def fetch_orderbook(exchange):
print(f"开始获取 {exchange} 的订单簿")
await asyncio.sleep(1) # 模拟网络延迟
print(f"获取 {exchange} 完成")
return f"{exchange} 数据"
async def main():
tasks = [
fetch_orderbook("Binance"),
fetch_orderbook("OKX"),
fetch_orderbook("Bybit")
]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())
你看,三个交易所的数据几乎是同时获取的。这就是异步的魅力。
避坑指南:我曾经在asyncio里混用了同步代码,导致事件循环被阻塞。记住,在 async 函数里不要用 time.sleep(),要用 await asyncio.sleep()。否则整个系统会卡住。
3.5.4 websockets:实时通信的桥梁
做市商需要实时接收交易所的行情推送。WebSocket 是双向通信协议,比轮询HTTP高效得多。
conda install websockets
安装后,你可以写一个简单的WebSocket客户端:
import asyncio
import websockets
async def listen_orderbook():
uri = "wss://stream.binance.com:9443/ws/btcusdt@depth20"
async with websockets.connect(uri) as websocket:
while True:
data = await websocket.recv()
print(f"收到订单簿数据: {data[:100]}...") # 只打印前100字符
asyncio.run(listen_orderbook())
这个例子连接了Binance的深度数据流。每次有订单簿更新,都会实时推送过来。嗯,这就是做市商引擎的「眼睛」。
3.6 环境验证
所有库安装完后,我建议你跑一个完整的验证脚本,确保环境没问题。
import pandas as pd
import numpy as np
import asyncio
import websockets
print("pandas 版本:", pd.__version__)
print("numpy 版本:", np.__version__)
print("asyncio 可用:", hasattr(asyncio, 'run'))
print("websockets 可用:", hasattr(websockets, 'connect'))
# 简单测试
df = pd.DataFrame(np.random.randn(5, 3), columns=['A', 'B', 'C'])
print("\n测试DataFrame:")
print(df)
如果所有库都正常导入,没有报错,那你的开发环境就搭好了。
3.7 本章知识体系
为了让你更直观地理解整个环境搭建的逻辑,我画了一张图。
这张图展示了从Anaconda到最终验证的完整链路。每一步都环环相扣,缺一不可。
3.8 避坑总结
最后,我把自己踩过的坑总结一下,你遇到了可以直接翻回来看看。
| 常见问题 | 原因 | 解决方案 |
|---|---|---|
| conda命令找不到 | 安装时没勾选PATH | 重新安装,或手动添加环境变量 |
| Jupyter内核找不到 | 没在虚拟环境里启动 | 先 conda activate,再 jupyter notebook |
| asyncio报错 | 混用了同步代码 | 检查是否用了 time.sleep(),改为 await asyncio.sleep() |
| websockets连接失败 | 网络问题或地址错误 | 检查交易所文档,确认WebSocket地址正确 |
好了,环境搭建就到这里。你的开发环境已经准备好了,后面我们就可以开始写真正的报价引擎代码了。
公众号:蓝海资料掘金营,微信deep3321