第二章:资产选择与数据准备

各位同学,咱们直接进入正题。风险预算模型的第一步,说白了就是选资产、找数据。这一步要是没做好,后面再花哨的模型都是空中楼阁。我在这个行业摸爬滚打十几年,见过太多团队在数据上栽跟头——嗯,我自己也踩过不少坑。

2.1 底层资产怎么选?

选资产不是拍脑袋。我个人习惯,先看三个维度:流动性、代表性、相关性。

  • 流动性:你选的资产能不能方便买卖?比如A股沪深300成分股,流动性没问题。但有些小盘股或者冷门债券,一天都成交不了几笔,这种就别碰了。
  • 代表性:资产能不能代表某类风险因子?比如用沪深300代表大盘股风险,用中证500代表中小盘风险。
  • 相关性:资产之间的相关性要稳定。我遇到过最头疼的事,就是两个资产平时相关性0.3,一到危机时刻直接跳到0.9——那你的风险预算模型就全乱套了。

核心原则:选3-5类低相关资产,每类选1-2个代表性标的。别贪多,5个以内最好管理。

举个例子,一个经典的风险预算组合可能是这样的:

资产类别 代表标的 风险因子
股票 沪深300 ETF 权益风险
债券 国债ETF 利率风险
商品 黄金ETF 通胀/避险
货币 货币基金 现金管理

2.2 数据源怎么选?

数据源这块,我建议你分三层考虑。

第一层:免费公开数据

  • Wind、东方财富Choice:国内最全,但需要付费
  • Yahoo Finance、Alpha Vantage:国际数据免费,但国内访问不稳定
  • 国家统计局、央行官网:宏观数据免费,但更新慢

第二层:专业数据服务

  • Bloomberg、Reuters:贵,但数据质量高
  • Quandl、Intrinio:适合量化研究

第三层:自建数据管道

  • 用Python爬虫抓取交易所数据
  • 用API接口定时拉取

我的建议:初期用免费数据做原型验证,跑通了再上付费数据。我曾经用Yahoo Finance的数据跑了一个策略,回测效果特别好,结果一换到Wind数据,收益直接腰斩——数据质量差异就这么大。

2.3 数据清洗——最脏最累的活

数据清洗,说白了就是「把垃圾变成黄金」。我见过最夸张的情况,一个数据集里30%的数据都有问题。

常见的坑:

  • 缺失值:某天停牌,价格是NaN。怎么处理?前向填充、插值、还是直接删除?
  • 异常值:某天价格突然涨了100倍,明显是数据错误。用3σ法则或者IQR方法检测。
  • 复权问题:股票分红送股后,价格会跳空。必须用后复权或前复权数据。
  • 时间对齐:不同市场交易时间不同,A股9:30开盘,美股9:30开盘(北京时间21:30)。怎么对齐到同一时间轴?

避坑指南:我曾经因为忘记处理复权问题,回测年化收益多算了8%。从那以后,我每次拿到数据第一件事就是检查复权。

下面是我常用的清洗流程:

import pandas as pd
import numpy as np

def clean_price_data(df):
    # 1. 删除全空的行
    df = df.dropna(how='all')
    
    # 2. 前向填充缺失值(最多填充3天)
    df = df.fillna(method='ffill', limit=3)
    
    # 3. 检测异常值(3σ法则)
    z_scores = np.abs((df - df.mean()) / df.std())
    df[z_scores > 3] = np.nan
    
    # 4. 再次填充异常值
    df = df.fillna(method='ffill')
    
    return df

2.4 数据对齐——让所有资产「说同一种语言」

数据对齐,就是把不同频率、不同时间点的数据统一到同一个时间轴上。我习惯用日频数据做风险预算,因为日频数据够用,又不至于太细碎。

对齐步骤:

  1. 确定基准时间轴(比如每个交易日)
  2. 把所有资产的价格映射到这个时间轴上
  3. 对于缺失的交易日,用前一个交易日的数据填充
# 对齐到统一时间轴
def align_data(price_dict, freq='D'):
    # price_dict: {'沪深300': Series, '国债ETF': Series, ...}
    aligned = pd.DataFrame(price_dict)
    aligned = aligned.resample(freq).last()  # 取每个周期的最后一个值
    aligned = aligned.fillna(method='ffill')  # 前向填充
    aligned = aligned.dropna()  # 删除仍然缺失的行
    return aligned

关键点:对齐后的数据,行数要一致,时间索引要连续。如果某个资产缺失太多数据(比如超过20%),建议直接剔除。

2.5 本章知识体系

下面这张图,是我自己总结的资产选择与数据准备的全流程。你照着这个框架走,基本不会出大问题。

资产选择与数据准备全流程 第一步:资产选择 流动性、代表性、相关性 第二步:数据源获取 免费/付费/自建管道 第三步:数据清洗 缺失值、异常值、复权 第四步:数据对齐 统一时间轴、频率转换 第五步:质量检查 完整性、一致性、合理性 第六步:输出数据 日频收益率矩阵 整个流程走下来,大概需要半天到一天时间 但这一步做好了,后面建模会非常顺畅 💡 建议:每次跑模型前,先跑一遍数据质量检查脚本

2.6 实战中的几个小技巧

最后,分享几个我自己的实战经验:

  • 数据备份:原始数据永远不要动,清洗后的数据另存一份。我吃过亏,清洗到一半发现搞错了,结果原始数据也被覆盖了——那叫一个欲哭无泪。
  • 版本管理:每次清洗脚本改动,都要记录版本号。不然三个月后你看着一堆数据,根本不知道哪个版本是对的。
  • 自动化:把清洗流程写成脚本,每天定时跑。手动清洗太容易出错了,人不是机器,总会漏掉点什么。

最后说一句:数据准备这件事,看起来简单,做起来全是坑。但只要你按照这个流程走一遍,后面建模的时候就会特别省心。嗯,咱们这一章就到这儿,数据准备好了,下一章就可以开始搭模型了。

专注资料整理