第二章:数据源与采集——汇率数据的“水源地”

做汇率预测,说白了就是跟数据打交道。我见过太多人模型建得花里胡哨,结果数据源没选对,一跑就崩。嗯,今天咱们就聊聊数据从哪来、怎么拿、拿多细。

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 知识体系总览

下面这张图,是我做汇率数据采集时的完整流程。你想想看,从数据源到最终可用的特征,中间要经过多少道工序。

汇率数据采集与频率选择流程 数据源层 央行/外汇交易中心 Bloomberg终端 FRED/OANDA等免费源 API采集层 REST API调用 · 数据解析 · 异常处理 · 重试机制 频率选择层 日频(短期预测) 周频(中期预测) 月频(长期预测) 输出:结构化时间序列数据 用于特征工程与模型训练

2.5 避坑指南

最后,分享几个我这些年踩过的坑:

  • 时区问题:Bloomberg用纽约时间,央行用北京时间。我有一回没做时区转换,模型在亚洲盘和美洲盘之间来回跳,结果可想而知。
  • 非交易日处理:外汇市场周末休市,但有些数据源会填充前值。记得用pandas的asfreq()方法统一处理。
  • 数据对齐:不同数据源的日期可能不一致。比如中国节假日美国不休息,这时候要决定是向前填充还是删除缺失值。

我曾经犯过的错:有次做回测,用了Bloomberg的收盘价和央行的中间价,两个时间戳差了6个小时。结果模型在回测里表现完美,实盘一跑就亏。后来我才发现,是数据对齐出了问题。

好了,数据源和采集这块就聊到这。记住一句话:数据质量决定模型上限。花80%的时间在数据上,剩下的20%做模型,这个比例我用了好几年,从来没亏过。


公众号:蓝海资料掘金营,微信deep3321