第二章:宏观因子数据源——从原始数据到交易信号的第一步

做宏观因子动量与反转交易,最怕什么?

不是策略逻辑写错了,而是数据源就出了问题。我见过太多团队,模型跑得飞起,结果回头一看——CPI数据用的是初值,没修正;流动性指标用的是一年前的旧口径。嗯,这种坑,我踩过不止一次。

今天我们就来聊聊,宏观因子数据到底从哪里来,拿到手之后怎么洗,才能让我们的交易系统吃得放心。

2.1 宏观经济指标的四大家族

我个人习惯,把宏观因子分成四大类。说白了,这四类指标基本覆盖了市场定价的所有宏观驱动力。

类别 核心指标 数据频率 对市场的影响逻辑
增长类 GDP、工业增加值、PMI、零售销售 月度/季度 决定企业盈利预期,驱动权益与商品
通胀类 CPI、PPI、核心PCE、薪资增速 月度 影响央行政策路径,驱动利率与汇率
流动性类 M2、社融、SHIBOR、央行资产负债表 周度/月度 直接决定资金成本与资产定价锚
风险偏好类 VIX、信用利差、TED利差、高收益债收益率 日度 反映市场情绪,驱动避险与风险资产切换

你想想看,这四个维度其实构成了一个完整的宏观叙事。增长往上走,通胀温和,流动性宽松,风险偏好高——典型的risk-on环境。反过来,就是避险模式。

关键认知:宏观因子动量策略的核心,就是捕捉这些指标在时间序列上的持续性(动量)或均值回复性(反转)。数据质量直接决定信号质量。

2.2 数据获取渠道——我常用的几个来源

做量化交易,数据源的选择是个老生常谈的问题。我的原则很简单:官方优先,商用补充,开源兜底

2.2.1 官方渠道(免费,但需要处理)

  • 国家统计局:CPI、PPI、工业增加值、固定资产投资。数据最权威,但发布时间有滞后,而且格式不统一。
  • 中国人民银行:M2、社融、LPR、Shibor。流动性数据的核心来源。
  • 国家外汇管理局:外汇储备、结售汇数据。
  • Wind/东方财富:国内商用数据库,API接口比较成熟。我个人习惯用Wind,数据清洗量小很多。

2.2.2 国际数据(做跨市场策略必备)

  • FRED(圣路易斯联储):美国宏观数据的宝库。GDP、CPI、非农、利率,应有尽有。API免费,我经常用。
  • Bloomberg:贵,但数据质量最高。如果你做机构级策略,这笔钱省不了。
  • Quandl / Yahoo Finance:适合快速原型验证,但要注意数据口径问题。

我的经验:刚开始做策略时,别一上来就买最贵的数据库。先用FRED+国家统计局的数据跑通逻辑,验证有效后再上商用数据。省钱又高效。

2.3 数据清洗——80%的时间花在这里

说实话,数据清洗比写策略代码枯燥多了。但没办法,脏数据进去,垃圾信号出来。我曾经因为一个CPI的环比/同比口径没对齐,导致回测曲线漂亮得不像话——实盘直接打脸。

下面是我总结的清洗流程,你直接拿去用。

2.3.1 常见问题与处理方法

问题类型 表现 处理方法
缺失值 某个月份数据为空 前向填充(ffill)或线性插值
异常值 突然跳变超过3个标准差 Winsorize截尾或中位数替换
口径变更 统计方法调整导致断点 使用调整后序列或手动拼接
季节性 春节效应、年末效应 X-13ARIMA-SEATS季节调整
发布滞后 数据公布时间晚于交易时间 对齐到实际可交易时间戳

2.3.2 代码示例:一个简单的清洗流水线

下面是我常用的Python清洗模板。注意,这里只展示核心逻辑,实际使用时需要根据数据源调整。

import pandas as pd
import numpy as np

def clean_macro_data(df, col_name, method='ffill'):
    """
    宏观因子数据清洗函数
    df: DataFrame,索引为日期
    col_name: 待清洗的列名
    """
    # 1. 缺失值处理
    if method == 'ffill':
        df[col_name] = df[col_name].fillna(method='ffill')
    elif method == 'interpolate':
        df[col_name] = df[col_name].interpolate(method='linear')
    
    # 2. 异常值检测(3-sigma)
    mean = df[col_name].mean()
    std = df[col_name].std()
    df[col_name] = df[col_name].clip(lower=mean - 3*std, upper=mean + 3*std)
    
    # 3. 计算同比/环比(根据策略需要)
    df['yoy'] = df[col_name].pct_change(periods=12)  # 同比
    df['mom'] = df[col_name].pct_change(periods=1)   # 环比
    
    return df

# 使用示例
# raw_data = pd.read_csv('cpi_data.csv', index_col='date', parse_dates=True)
# cleaned = clean_macro_data(raw_data, 'CPI_INDEX')

避坑指南:我曾经在清洗社融数据时,直接用pct_change计算环比,结果发现春节月份波动极大。后来改用X-13做季节调整,信号稳定性提升了一个档次。季节性处理,千万别偷懒。

2.4 知识体系总览

下面这张图,是我做宏观因子数据工程的心得总结。你可以把它当作一个检查清单,每次接入新数据源时,对着走一遍。

宏观因子数据工程流程 数据源获取 官方统计(免费) 央行/联储(权威) 商用数据库(Wind/Bloomberg) 开源API(FRED/Quandl) 数据清洗与预处理 缺失值处理 异常值检测 口径对齐 季节调整 滞后对齐 因子构建与标准化 动量因子(Z-score) 反转因子(均值回复) 多因子合成 交易信号生成

这张图其实就讲了一件事:从原始数据到交易信号,中间有三大关卡——获取、清洗、因子化。每一关都可能出问题,每一关都需要你亲自盯着。

一个小建议:刚开始做的时候,别追求数据量多。选3-5个核心指标(比如CPI、PMI、M2、VIX、信用利差),把它们的清洗流程跑通,比什么都强。贪多嚼不烂,这个道理在数据工程里尤其适用。

好了,数据源和清洗方法就聊到这里。下一节我们会深入讨论,如何把这些干净的宏观因子,真正转化成动量与反转的交易信号。到时候,我会分享一个我踩过坑的动量因子构建案例——嗯,那个案例让我亏了不少钱,但也让我真正理解了「数据质量决定策略上限」这句话。


专注资料整理