2. 金融数据基础
做金融数据分析,第一步不是建模,而是把数据“看清楚”。同一只股票,日线、分钟线、复权与不复权价格可能给出完全相反的结论;同一份财报,字段口径不同会导致因子失效。本节围绕金融数据的类型、来源、频率、复权除权、缺失值处理五个核心问题展开,并给出可直接运行的 Python 读取示例。
一、金融数据的四大类型
金融数据按结构可分为四类,理解分类决定了后续存储与处理方式:
- 行情数据(Time Series):股票、期货、外汇的 OHLCV、买卖盘口、逐笔成交,天然带时间戳,是典型的时间序列。
- 基本面数据(Cross-sectional):财报三表、估值指标(PE、PB、ROE),按报告期与股票代码两个维度组织,属于面板数据。
- 文本与另类数据(Unstructured):公告、研报、新闻、舆情、卫星图像,需先做 NLP 或特征抽取才能进入模型。
- 衍生与宏观数据:利率曲线、CPI、PMI、期权隐含波动率,常用于择时与风险控制。
判断数据类型的一个实用方法:看它的主键。主键是“时间”就是时序;主键是“时间+标的”就是面板;没有固定主键、需要解析的就是非结构化数据。
二、常见数据源与获取方式
数据源的选择直接影响成本、稳定性和合规性。常见来源如下表:
| 数据源 | 典型内容 | 获取方式 | 适用场景 |
|---|---|---|---|
| AkShare | A股行情、基金、宏观 | Python 库,免费 | 教学、快速原型 |
| Tushare | 行情、财务、指数 | API + ,积分制 | 中小型研究 |
| Wind / 聚宽 | 全品类金融数据 | 终端或 API,付费 | 机构级研究 |
| Yahoo Finance | 、ETF、外汇 | yfinance 库,免费 | 海外市场分析 |
| 交易所官网 | 公告、成分股、规则 | 网页/文件下载 | 权威校验 |
选择数据源时优先关注三点:字段口径是否清晰、历史数据是否可回溯、接口是否有频率限制。免费源常用于教学,但生产环境务必考虑稳定性与授权。
三、数据频率与复权除权
频率决定了策略的适用边界:Tick 与分钟线适合高频与微观结构研究,日线适合中低频因子,周线/月线适合资产配置。频率越高,噪声越大、存储与计算成本越高。
复权是 A 股分析中最容易踩坑的环节。除权除息会造成价格跳空,若直接用不复权价计算收益率,会把“分红送股”误判为“暴跌”。常见处理方式:
- 前复权:以最新价为基准向前调整,历史价格被改写,适合看走势与回测。
- 后复权:以上市首日为基准向后调整,历史价不变,适合计算长期真实收益。
- 不复权:保留原始成交价,适合撮合、盘口与真实成交金额分析。
回测中若混用复权方式,或在不同标的间使用不同基准,会导致收益率不可比。建议在数据加载层统一复权口径,并在元数据中记录。
四、缺失值处理与 Python 读取示例
金融数据缺失常见于停牌、节假日、新股上市前、字段未披露。处理策略取决于缺失机制:
- 删除:缺失比例极低且随机时可用,但会破坏时间连续性。
- 前向填充(ffill):适合停牌价格、估值指标,但会引入“伪平稳”。
- 插值:线性或时间插值适合连续变量,不适合跳跃型事件。
- 标记缺失:保留 NaN 并增加缺失指示列,让模型自行学习。
下面用 AkShare 读取一只 A 股日线数据,并演示复权与缺失值处理:
import akshare as ak
import pandas as pd
# 读取前复权日线数据
df = ak.stock_zh_a_hist(
symbol="600519",
period="daily",
start_date="20230101",
end_date="20231231",
adjust="qfq" # qfq 前复权, hfq 后复权, "" 不复权
)
df["日期"] = pd.to_datetime(df["日期"])
df = df.set_index("日期").sort_index()
# 检查缺失值
print(df.isna().sum())
# 前向填充收盘价,并标记原始缺失位置
df["close_ffill"] = df["收盘"].ffill()
df["close_missing"] = df["收盘"].isna().astype(int)
# 计算日收益率
df["ret"] = df["close_ffill"].pct_change()
print(df[["收盘", "close_ffill", "ret"]].tail())
运行日志示例:
日期 收盘 close_ffill ret
2023-12-27 1685.0 1685.0 0.0021
2023-12-28 1700.0 1700.0 0.0089
2023-12-29 1715.0 1715.0 0.0088
日期 收盘 close_ffill ret
2023-12-27 1685.0 1685.0 0.0021
2023-12-28 1700.0 1700.0 0.0089
2023-12-29 1715.0 1715.0 0.0088
五、误区与复盘
初学者最常见的三个误区:
- 用不复权价算长期收益:会把分红送股当成亏损,严重低估真实回报。
- 无脑 ffill 所有字段:成交量、换手率被填充后会产生虚假交易信号。
- 忽略时区与交易日历:跨市场数据对齐时,时区错位会导致“未来函数”。
复盘建议:每次拿到新数据,先做三件事——打印字段与类型、统计缺失率、画出价格与成交量走势。把数据质量检查写成可复用的函数,是构建金融数据分析 Agent 的第一块基石。