第二章 工具与数据准备:Python环境搭建、Pandas与NumPy基础、数据源获取
做配对交易,说白了就是跟数据打交道。没有趁手的工具,再好的策略也跑不起来。
这一章,我带你把环境搭好,把基础打牢。别嫌烦,这些准备工作做好了,后面写策略的时候你会感谢我的。
2.1 Python环境搭建
我个人习惯用Anaconda来管理Python环境。为什么?因为它把科学计算常用的包都打包好了,省得你一个一个去pip install。
安装步骤其实很简单:
- 去Anaconda官网下载对应系统的安装包
- 一路默认安装,记得勾选"Add Anaconda to my PATH environment variable"
- 打开终端或Anaconda Prompt,输入
python --version确认安装成功
嗯,这里要注意:如果你用的是Mac或Linux,建议用命令行安装,别用图形界面。我在项目中遇到过图形界面装到一半卡死的情况,后来全改用命令行,再没出过问题。
装好之后,我建议你创建一个独立的虚拟环境:
conda create -n pair_trading python=3.9
conda activate pair_trading
这样你的配对交易环境就跟其他项目隔离开了。万一搞崩了,删掉重来就是,不影响别的项目。
2.2 Pandas与NumPy基础
这两个库是量化交易的左膀右臂。NumPy管数值计算,Pandas管数据处理。说白了,一个负责算,一个负责装。
2.2.1 NumPy:数组与矩阵运算
配对交易里,你经常要算协方差、相关系数、回归系数。这些用原生Python写,慢得你想哭。NumPy用C语言在底层实现,速度能快几十倍。
看个最简单的例子:
import numpy as np
# 创建两个价格序列
price_a = np.array([100.5, 101.2, 102.1, 101.8, 103.0])
price_b = np.array([50.2, 50.8, 51.3, 51.0, 51.7])
# 计算收益率
ret_a = np.diff(price_a) / price_a[:-1]
ret_b = np.diff(price_b) / price_b[:-1]
# 计算相关系数
corr = np.corrcoef(ret_a, ret_b)[0, 1]
print(f"收益率相关系数: {corr:.4f}")
你想想看,如果不用NumPy,光写个相关系数就得十几行循环。用NumPy,一行搞定。
np.array()— 创建数组np.mean()/np.std()— 均值/标准差np.corrcoef()— 相关系数矩阵np.linalg.lstsq()— 最小二乘回归(配对交易的核心!)
2.2.2 Pandas:时间序列处理利器
做配对交易,你的数据全是带时间戳的。Pandas的DataFrame就是为这个场景设计的。
我曾经犯过一个低级错误:用Excel手动整理数据,结果日期格式不统一,导致回测结果全错了。后来我学乖了,所有数据都用Pandas处理,格式统一,还能自动对齐时间轴。
基础操作看这里:
import pandas as pd
# 读取CSV数据
df = pd.read_csv('stock_data.csv', parse_dates=['date'], index_col='date')
# 查看前5行
print(df.head())
# 计算滚动相关系数(配对交易常用)
df['corr_60'] = df['ret_a'].rolling(window=60).corr(df['ret_b'])
# 缺失值处理
df = df.dropna() # 或者 df.fillna(method='ffill')
dropna() 和 fillna() 是你的好朋友。
2.3 数据源获取
数据是量化交易的血液。没有数据,策略就是空中楼阁。
国内常用的数据源有两个:Tushare和JoinQuant。我两个都用过,说说我的感受。
2.3.1 Tushare:免费但有限制
Tushare是老牌的数据接口,免费用户能拿到日线数据,基本够用。但要注意,它有限流,一分钟只能请求200次。
安装和基本用法:
pip install tushare
import tushare as ts
# 设置token(去官网注册获取)
ts.set_token('your_token_here')
pro = ts.pro_api()
# 获取两只股票的历史日线数据
df_600519 = pro.daily(ts_code='600519.SH', start_date='20200101', end_date='20231231')
df_000858 = pro.daily(ts_code='000858.SZ', start_date='20200101', end_date='20231231')
# 合并数据
df = pd.merge(df_600519[['trade_date', 'close']],
df_000858[['trade_date', 'close']],
on='trade_date',
suffixes=('_茅台', '_五粮液'))
我个人习惯把数据存到本地CSV文件里,这样下次回测就不用重复请求了。既省时间,又不会被限流卡住。
2.3.2 JoinQuant:回测平台自带数据
如果你用JoinQuant的在线回测平台,数据是直接提供的,不用自己拉。但如果你要本地跑,还是得用Tushare或者自己找数据源。
JoinQuant的好处是数据质量高,复权处理得干净。坏处是本地用起来没那么灵活。
2.4 本章知识体系
下面这张图,把本章的核心逻辑串起来了。你一看就明白:
说白了,这一章就是帮你把地基打牢。环境搭好了,库用熟了,数据源搞定了,后面写策略就是水到渠成的事。
- 用Anaconda创建独立虚拟环境,别污染系统Python
- NumPy负责数值计算,Pandas负责数据处理,各司其职
- 数据源推荐Tushare起步,本地缓存是必须养成的习惯
- 数据清洗(缺失值、对齐)是回测前最重要的一步,别偷懒
好了,工具准备好了。下一章,我们开始真正动手,写配对交易的策略逻辑。
公众号:蓝海资料掘金营,微信deep3321