第二章:资产选择与数据准备
各位同学,咱们直接进入正题。风险预算模型的第一步,说白了就是选资产、找数据。这一步要是没做好,后面再花哨的模型都是空中楼阁。我在这个行业摸爬滚打十几年,见过太多团队在数据上栽跟头——嗯,我自己也踩过不少坑。
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 数据对齐——让所有资产「说同一种语言」
数据对齐,就是把不同频率、不同时间点的数据统一到同一个时间轴上。我习惯用日频数据做风险预算,因为日频数据够用,又不至于太细碎。
对齐步骤:
- 确定基准时间轴(比如每个交易日)
- 把所有资产的价格映射到这个时间轴上
- 对于缺失的交易日,用前一个交易日的数据填充
# 对齐到统一时间轴
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 实战中的几个小技巧
最后,分享几个我自己的实战经验:
- 数据备份:原始数据永远不要动,清洗后的数据另存一份。我吃过亏,清洗到一半发现搞错了,结果原始数据也被覆盖了——那叫一个欲哭无泪。
- 版本管理:每次清洗脚本改动,都要记录版本号。不然三个月后你看着一堆数据,根本不知道哪个版本是对的。
- 自动化:把清洗流程写成脚本,每天定时跑。手动清洗太容易出错了,人不是机器,总会漏掉点什么。
最后说一句:数据准备这件事,看起来简单,做起来全是坑。但只要你按照这个流程走一遍,后面建模的时候就会特别省心。嗯,咱们这一章就到这儿,数据准备好了,下一章就可以开始搭模型了。