第二章:数据源与采集——汇率数据的“水源地”
做汇率预测,说白了就是跟数据打交道。我见过太多人模型建得花里胡哨,结果数据源没选对,一跑就崩。嗯,今天咱们就聊聊数据从哪来、怎么拿、拿多细。
2.1 常见汇率数据源
数据源这块,我把它分成三类:官方机构、商业终端、还有聚合平台。每个都有它的脾气。
2.1.1 央行与外汇交易中心
这是最权威的数据源。中国人民银行官网每天发布人民币中间价,中国外汇交易中心(CFETS)提供即期、远期、掉期等全品种数据。
我个人习惯:做人民币汇率模型时,优先用CFETS的数据。为什么?因为它就是定价基准,你想想看,市场上所有报价都围着它转。
央行数据的特点:
- 权威性高:官方发布,不可篡改
- 频率固定:每个交易日9:15发布中间价
- 免费获取:官网直接下载,良心
我曾经踩过的坑:央行数据有时会因节假日调整发布时间。有一年国庆节后,我脚本写死了9:15抓取,结果那天数据9:45才出来,模型直接用了前一天的旧值。后来我加了重试机制和节假日日历。
2.1.2 Bloomberg终端
做国际汇率模型,Bloomberg几乎是标配。它覆盖全球300多种货币对,历史数据能追溯到几十年前。
Bloomberg的优势:
- 实时性:毫秒级更新,适合高频策略
- 数据清洗:自带异常值标记,省去很多预处理工作
- 衍生数据:隐含波动率、远期曲线等,直接拿来用
一个小技巧:Bloomberg的API有“调整后价格”和“原始价格”两个字段。做回测时记得用调整后价格,否则分红、拆分会把你的策略曲线搞得乱七八糟。我刚开始做量化时就被这个坑过。
2.1.3 其他免费数据源
如果预算有限,可以考虑:
- FRED(圣路易斯联储):免费,覆盖主要货币对,历史数据全
- OANDA:提供历史汇率API,有免费额度
- Yahoo Finance:简单易用,但数据质量参差不齐
2.2 API接口调用实战
数据源选好了,怎么拿?我一般用Python写采集脚本。下面给个例子,从FRED拉取美元/人民币数据。
import pandas as pd
import requests
from datetime import datetime, timedelta
def fetch_fred_data(series_id='DEXCHUS', start_date='2020-01-01'):
"""
从FRED获取汇率数据
series_id: DEXCHUS 是美元/人民币的代码
"""
url = f'https://api.stlouisfed.org/fred/series/observations'
params = {
'series_id': series_id,
'api_key': 'YOUR_API_KEY', # 去FRED官网免费申请
'file_type': 'json',
'observation_start': start_date,
'sort_order': 'asc'
}
response = requests.get(url, params=params)
data = response.json()
# 解析数据
dates = [obs['date'] for obs in data['observations']]
values = [float(obs['value']) if obs['value'] != '.' else None
for obs in data['observations']]
df = pd.DataFrame({'date': dates, 'rate': values})
df['date'] = pd.to_datetime(df['date'])
df = df.dropna()
return df
# 调用示例
df_usd_cny = fetch_fred_data()
print(df_usd_cny.head())
注意:FRED的API有频率限制,每分钟最多120次请求。我一般加个time.sleep(0.5)避免被封。
2.3 数据频率选择
频率选不对,模型白费。我根据预测周期来定:
| 预测周期 | 推荐频率 | 原因 |
|---|---|---|
| 日内交易 | 分钟级/小时级 | 捕捉微观波动,噪声大但信号多 |
| 短期预测(1-5天) | 日频 | 平衡信息量和噪声,我最常用 |
| 中期预测(1-3个月) | 周频 | 过滤掉日间随机波动,趋势更清晰 |
| 长期预测(半年以上) | 月频 | 关注基本面因素,忽略短期扰动 |
我的经验:做特征工程时,我经常同时保留日频和周频数据。日频用来做短期信号,周频用来做趋势判断。两者结合,效果往往比单一频率好。
2.4 知识体系总览
下面这张图,是我做汇率数据采集时的完整流程。你想想看,从数据源到最终可用的特征,中间要经过多少道工序。
2.5 避坑指南
最后,分享几个我这些年踩过的坑:
- 时区问题:Bloomberg用纽约时间,央行用北京时间。我有一回没做时区转换,模型在亚洲盘和美洲盘之间来回跳,结果可想而知。
- 非交易日处理:外汇市场周末休市,但有些数据源会填充前值。记得用pandas的
asfreq()方法统一处理。 - 数据对齐:不同数据源的日期可能不一致。比如中国节假日美国不休息,这时候要决定是向前填充还是删除缺失值。
我曾经犯过的错:有次做回测,用了Bloomberg的收盘价和央行的中间价,两个时间戳差了6个小时。结果模型在回测里表现完美,实盘一跑就亏。后来我才发现,是数据对齐出了问题。
好了,数据源和采集这块就聊到这。记住一句话:数据质量决定模型上限。花80%的时间在数据上,剩下的20%做模型,这个比例我用了好几年,从来没亏过。
公众号:蓝海资料掘金营,微信deep3321