第二章:市场选择与数据获取
做价差回归交易,第一步不是写策略,而是选对市场、拿对数据。我见过太多人一上来就搞复杂的统计模型,结果数据源本身就有问题——那真是白费功夫。今天咱们就把这块地基打扎实。
2.1 交易品种的选择逻辑
选品种,说白了就是找「能配对」的标的。不是随便两个品种都能做价差回归的。
核心原则:两个品种之间必须有经济逻辑上的强相关性,而不是统计上的伪相关。
我个人习惯把品种分成三类:
- 同品种跨期:比如螺纹钢主力合约和次主力合约。价差波动小,回归性强,适合新手练手。
- 同产业链上下游:比如焦煤和焦炭、豆粕和豆油。逻辑硬,但要注意供需节奏差异。
- 跨市场套利:比如沪深300股指期货和上证50股指期货。流动性好,但要注意交易时间差。
我在项目中遇到过一个问题:有人拿比特币和以太坊做价差回归,统计上相关性高达0.9,但一遇到政策黑天鹅,价差直接崩了。为什么?因为这两个品种的经济逻辑并不牢固——它们各自受不同的监管政策影响。
我的建议:先画一张「品种关系图」,把你想做的品种之间的经济联系写下来。如果写不出三条以上的逻辑关联,就别碰。
2.2 数据源对比:别在数据上省钱
数据是策略的命根子。我见过有人用免费API做回测,结果数据里缺了三天,策略表现好得离谱——一上实盘就亏。嗯,这里要注意。
目前主流的数据源,我整理了一张对比表:
| 数据源 | 覆盖品种 | 数据精度 | 费用 | 适合场景 |
|---|---|---|---|---|
| Wind | 全品种(股票/期货/期权) | Tick级 | 高(年费数万) | 机构级回测 |
| 聚宽/JQData | A股/期货 | 分钟级 | 中等(按量计费) | 个人量化研究 |
| CCXT(加密货币) | 数字货币 | Tick级 | 免费(需自建) | 加密货币套利 |
| AKShare | A股/期货/基金 | 日级为主 | 免费 | 快速原型验证 |
你想想看,如果你的策略是捕捉5分钟级别的价差回归,用日线数据做回测,那结果能信吗?我建议至少用分钟级数据做价差策略回测。
避坑指南:我曾经用聚宽的数据做期货回测,发现某天的开盘价和收盘价完全一样。查了半天,原来是那天该品种涨停了,数据源只记录了涨停价。这种「假数据」会严重扭曲价差计算。
2.3 数据清洗:脏数据是策略杀手
拿到原始数据后,别急着算价差。先做三步清洗:
- 去重:检查是否有重复的时间戳。有些数据源会在行情中断后补发数据,导致同一时间出现两条记录。
- 补缺失:对于非交易时段的数据,直接删除。对于盘中缺失的分钟数据,用前值填充或插值法处理。
- 异常值检测:用3-sigma法则或IQR方法,剔除价格突变的数据点。
下面是我常用的清洗代码片段:
import pandas as pd
import numpy as np
def clean_price_data(df, price_col='close'):
# 去重
df = df.drop_duplicates(subset=['datetime'])
# 按时间排序
df = df.sort_values('datetime')
# 补缺失(前值填充)
df[price_col] = df[price_col].fillna(method='ffill')
# 异常值检测(3-sigma)
mean = df[price_col].mean()
std = df[price_col].std()
df = df[(df[price_col] > mean - 3*std) &
(df[price_col] < mean + 3*std)]
return df
小技巧:清洗完数据后,我习惯画一张「数据完整性热力图」。横轴是日期,纵轴是交易时间,颜色表示是否有数据。一眼就能看出哪些时间段数据有问题。
2.4 数据对齐:价差计算的前提
做价差回归,两个品种的数据必须对齐到同一时间轴。这听起来简单,但坑很多。
举个例子:螺纹钢期货的交易时间是9:00-15:00,而铁矿石期货是9:00-23:00。如果你直接取两个品种的收盘价做价差,那铁矿石的收盘价是23:00的,螺纹钢的收盘价是15:00的——这能比吗?
我常用的对齐方法:
- 时间戳对齐:以其中一个品种的时间轴为基准,对另一个品种的数据进行重采样。
- 交易时段对齐:只取两个品种都交易的时段。比如上面那个例子,只取9:00-15:00的数据。
- 合约换月处理:期货有到期日,换月时价差会跳变。我习惯用「主力合约连续」的方式,或者用持仓量最大的合约作为主力。
核心要点:对齐后的数据,必须保证每个时间点上两个品种的价格都是「可交易的」。否则你的回测就是纸上谈兵。
2.5 本章知识体系
下面这张图,是我做数据准备时的完整流程。你可以把它贴在工位上:
这张图里,每个环节都是环环相扣的。我见过有人跳过数据清洗直接算价差,结果策略回测收益高得离谱——一查,原来是数据里有个异常值,导致价差计算出了bug。
最后提醒一句:数据准备阶段花的时间,会在策略开发阶段十倍地还给你。别急,慢慢来。