金融数据的类型与频率
直觉
在跑任何策略之前,先想清楚两件事:用哪类数据,以及多高频率。这俩选择直接决定了策略能做什么、不能做什么——日内数据能捕捉分钟级机会但成本极高;月频数据便宜但反应迟钝。
三大数据类型
| 类型 | 例子 | 特点 |
|---|---|---|
| 行情数据 | OHLCV(开高低收量) | 最常用,量最大,反映交易行为 |
| 基本面数据 | 财报、估值、分红 | 频率低(季度),更新有滞后 |
| 另类数据 | 卫星图、舆情、物流 | 信息增量高,但噪声大、难处理 |
本书内置数据集都是合成行情数据(见 static/data/README.md)。顺手看一眼它们长什么样:
单资产行情 spy_daily.csv:
/data/spy_daily.csv
多资产宽表 multi_asset_daily.csv(股/债/商品/REIT):
/data/multi_asset_daily.csv
频率与年化因子
不同频率对应不同的「一年含几个周期」,它决定了年化时乘多少、波动开多少次方:
| 频率 | (一年周期数) |
|---|---|
| 日(交易日) | 252 |
| 周 | 52 |
| 月 | 12 |
「人话」解释:为什么是 ?
若各期收益独立,方差可加( 期方差 单期方差),所以 期波动 。 「开方」就来自「方差可加、标准差开方」。这也是为什么高频数据年化波动巨大(分钟级的年化波动看着吓人,其实只是 被放大了)。
可运行案例:同一资产不同频率的对比
读取 spy_daily.csv,把日频聚合到周频和月频,比较它们的年化收益与波动——你会发现:频率越低、样本越少,但年化波动估计更稳。
import numpy as np
import pandas as pd
df = pd.read_csv('/data/spy_daily.csv', parse_dates=['date']).set_index('date')
close = df['close']
def stats(r, k, name):
print(f"{name:4s} 样本数={len(r):4d} 年化收益={r.mean()*k:>8.2%} 年化波动={r.std(ddof=0)*np.sqrt(k):>7.2%}")
daily_r = np.log(close / close.shift(1)).dropna()
stats(daily_r, 252, "日频")
weekly_close = close.resample('W').last().dropna()
weekly_r = np.log(weekly_close / weekly_close.shift(1)).dropna()
stats(weekly_r, 52, "周频")
monthly_close = close.resample('ME').last().dropna()
monthly_r = np.log(monthly_close / monthly_close.shift(1)).dropna()
stats(monthly_r, 12, "月频")
小结
- 三类数据:行情 / 基本面 / 另类;
- 频率决定年化因子 :收益 ,波动 ;
- 频率越高样本越多,但噪声和成本也越高——选频率要匹配策略逻辑。