跳到主要内容

金融数据的类型与频率

直觉

在跑任何策略之前,先想清楚两件事:用哪类数据,以及多高频率。这俩选择直接决定了策略能做什么、不能做什么——日内数据能捕捉分钟级机会但成本极高;月频数据便宜但反应迟钝。

三大数据类型

类型例子特点
行情数据OHLCV(开高低收量)最常用,量最大,反映交易行为
基本面数据财报、估值、分红频率低(季度),更新有滞后
另类数据卫星图、舆情、物流信息增量高,但噪声大、难处理

本书内置数据集都是合成行情数据(见 static/data/README.md)。顺手看一眼它们长什么样:

单资产行情 spy_daily.csv

/data/spy_daily.csv

多资产宽表 multi_asset_daily.csv(股/债/商品/REIT):

/data/multi_asset_daily.csv

频率与年化因子

不同频率对应不同的「一年含几个周期」kk,它决定了年化时乘多少、波动开多少次方:

频率kk(一年周期数)
日(交易日)252
52
12
μann=krˉ,σann=σk\mu_{\text{ann}} = k\cdot\bar r, \qquad \sigma_{\text{ann}} = \sigma\sqrt k
「人话」解释:为什么是 k\sqrt k

若各期收益独立,方差可加(nn 期方差 =n×=n\times单期方差),所以 nn 期波动 =σn=\sigma\sqrt n。 「开方」就来自「方差可加、标准差开方」。这也是为什么高频数据年化波动巨大(分钟级的年化波动看着吓人,其实只是 k\sqrt k 被放大了)。

可运行案例:同一资产不同频率的对比

读取 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, "月频")

小结

  • 三类数据:行情 / 基本面 / 另类
  • 频率决定年化因子 kk:收益 ×k\times k,波动 ×k\times\sqrt k
  • 频率越高样本越多,但噪声和成本也越高——选频率要匹配策略逻辑。