3. 环境搭建:Python环境、Pandas/Numpy/Matplotlib安装、高频数据处理库(ArcticDB、DuckDB)介绍
做高频回测,说白了就是跟时间赛跑。你想想看,一秒能来几千笔Tick数据,处理慢了,策略逻辑再牛也白搭。所以环境搭建这一步,我建议你认真对待。别嫌麻烦,后面省下的时间都是你的。
3.1 Python环境:选对版本,少走弯路
我个人习惯用 Python 3.9 或 3.10。为什么?因为高频库对3.11以上的支持有时候会翻车。我在项目中遇到过,ArcticDB在3.12上编译报错,折腾了半天,最后退回3.10才搞定。
推荐用 Miniconda 来管理环境,别用系统自带的Python。干净、隔离、好卸载。
我的标准操作:
# 创建独立环境
conda create -n tick_env python=3.10 -y
conda activate tick_env
# 升级pip
pip install --upgrade pip
💡 小技巧:环境名别起太随意,比如就叫 tick_env,后面项目多了你才知道哪个是哪个。
3.2 Pandas/Numpy/Matplotlib:高频回测三件套
这三个库,做量化的没人不知道。但高频场景下,用法有讲究。
Pandas:别只会用默认参数
Pandas处理Tick数据,最怕内存爆炸。我曾经一次性加载3天的Level2数据,直接把我16G内存干满了。后来学乖了,用 dtype 指定类型,能省一半内存。
import pandas as pd
# 指定dtype,省内存
df = pd.read_csv('tick_data.csv',
dtype={
'price': 'float32',
'volume': 'int32',
'symbol': 'category'
},
parse_dates=['timestamp'])
⚠️ 注意:object 类型是内存杀手。字符串列能转 category 就转,尤其是股票代码这种重复值多的列。
Numpy:向量化操作是王道
高频回测里,循环是敌人。Numpy的向量化操作,速度能快几百倍。我见过有人用for循环算移动平均,处理一天的数据要5分钟。换成Numpy,5秒搞定。
import numpy as np
# 向量化计算收益率
prices = np.array([100.0, 100.5, 101.2, 100.8])
returns = np.diff(prices) / prices[:-1] # 一行搞定
Matplotlib:画图要快,别卡死
回测完总要看看曲线吧。Matplotlib默认渲染很慢,我建议用 agg 后端,或者直接上 mplfinance 画K线。
import matplotlib
matplotlib.use('Agg') # 非交互式,速度快
import matplotlib.pyplot as plt
# 画个简单的价格曲线
plt.plot(df['timestamp'], df['price'])
plt.title('Tick Price')
plt.show()
3.3 高频数据处理库:ArcticDB vs DuckDB
普通数据库处理Tick数据?别想了。我试过MySQL存一天的数据,查询一次要10秒。高频场景下,我们需要专门为时序数据设计的库。
ArcticDB:专为金融时序而生
这是Man Group(全球最大的量化对冲基金之一)开源的库。说白了,它就是为Tick数据量身定做的。支持版本管理、增量更新、超快读取。
from arcticdb import Arctic
# 连接本地存储
ac = Arctic('lmdb://data/tick_db')
# 创建库
ac.create_library('tick_data')
lib = ac['tick_data']
# 写入数据(自动压缩)
lib.write('AAPL', df, metadata={'source': 'NYSE'})
# 读取数据(按时间范围)
data = lib.read('AAPL', date_range=(start, end)).data
我的经验:ArcticDB的压缩率很惊人。同样一份Tick数据,存CSV要2G,存ArcticDB只要300M。而且读取速度比CSV快10倍以上。
DuckDB:分析型数据库的黑马
DuckDB不是专门为金融设计的,但它处理列式存储和SQL查询的能力,在高频回测中非常好用。尤其是做数据清洗时,用SQL写过滤逻辑,比Pandas直观多了。
import duckdb
# 直接查询CSV文件
result = duckdb.sql("""
SELECT symbol,
AVG(price) as avg_price,
COUNT(*) as tick_count
FROM 'tick_data.csv'
WHERE timestamp BETWEEN '2024-01-01' AND '2024-01-02'
GROUP BY symbol
HAVING tick_count > 1000
""").df()
💡 我的建议:ArcticDB用来存原始Tick数据,DuckDB用来做临时分析和清洗。两者互补,效果很好。
3.4 知识体系总览
下面这张图,是我做高频回测环境搭建的核心逻辑。你照着这个思路来,基本不会出错。
3.5 避坑指南
环境搭建看着简单,但坑不少。我把自己踩过的坑列出来,你注意避开。
- Python版本别追新:3.11以上对某些高频库支持不好。我建议用3.10,稳如老狗。
- 别用系统Python:系统自带的Python版本乱,而且权限问题多。用Miniconda隔离,干净利落。
- Pandas的dtype一定要指定:不指定的话,默认用float64和object,内存直接翻倍。我吃过这个亏,16G内存的机器,加载3天数据就崩了。
- ArcticDB的存储路径别用中文:这个库对中文路径支持不好,我曾经因为路径带中文,折腾了一下午才找到原因。
- DuckDB的临时表用完要清理:高频清洗时,临时表多了会占内存。我习惯在脚本末尾加一句
DROP TABLE IF EXISTS temp_table。
⚠️ 重要提醒:环境搭建完成后,一定要做一次压力测试。随便加载一天的高频数据,看看内存占用和读取速度。别等到回测时才发现环境有问题。
好了,环境搭建就这些。工具都装好了,下一章我们开始实战——用Pandas清洗第一份Tick数据。