2. 金融数据基础

做金融数据分析,第一步不是建模,而是把数据“看清楚”。同一只股票,日线、分钟线、复权与不复权价格可能给出完全相反的结论;同一份财报,字段口径不同会导致因子失效。本节围绕金融数据的类型、来源、频率、复权除权、缺失值处理五个核心问题展开,并给出可直接运行的 Python 读取示例。

一、金融数据的四大类型

金融数据按结构可分为四类,理解分类决定了后续存储与处理方式:

  • 行情数据(Time Series):股票、期货、外汇的 OHLCV、买卖盘口、逐笔成交,天然带时间戳,是典型的时间序列。
  • 基本面数据(Cross-sectional):财报三表、估值指标(PE、PB、ROE),按报告期与股票代码两个维度组织,属于面板数据。
  • 文本与另类数据(Unstructured):公告、研报、新闻、舆情、卫星图像,需先做 NLP 或特征抽取才能进入模型。
  • 衍生与宏观数据:利率曲线、CPI、PMI、期权隐含波动率,常用于择时与风险控制。
判断数据类型的一个实用方法:看它的主键。主键是“时间”就是时序;主键是“时间+标的”就是面板;没有固定主键、需要解析的就是非结构化数据。

二、常见数据源与获取方式

数据源的选择直接影响成本、稳定性和合规性。常见来源如下表:

数据源典型内容获取方式适用场景
AkShareA股行情、基金、宏观Python 库,免费教学、快速原型
Tushare行情、财务、指数API + ,积分制中小型研究
Wind / 聚宽全品类金融数据终端或 API,付费机构级研究
Yahoo Finance、ETF、外汇yfinance 库,免费海外市场分析
交易所官网公告、成分股、规则网页/文件下载权威校验

选择数据源时优先关注三点:字段口径是否清晰、历史数据是否可回溯、接口是否有频率限制。免费源常用于教学,但生产环境务必考虑稳定性与授权。

三、数据频率与复权除权

频率决定了策略的适用边界:Tick 与分钟线适合高频与微观结构研究,日线适合中低频因子,周线/月线适合资产配置。频率越高,噪声越大、存储与计算成本越高。

复权是 A 股分析中最容易踩坑的环节。除权除息会造成价格跳空,若直接用不复权价计算收益率,会把“分红送股”误判为“暴跌”。常见处理方式:

  • 前复权:以最新价为基准向前调整,历史价格被改写,适合看走势与回测。
  • 后复权:以上市首日为基准向后调整,历史价不变,适合计算长期真实收益。
  • 不复权:保留原始成交价,适合撮合、盘口与真实成交金额分析。
回测中若混用复权方式,或在不同标的间使用不同基准,会导致收益率不可比。建议在数据加载层统一复权口径,并在元数据中记录。
除权跳空与复权修正对比 价格 时间 除权跳空 不复权价 前复权价 原始价格序列 复权后连续序列

四、缺失值处理与 Python 读取示例

金融数据缺失常见于停牌、节假日、新股上市前、字段未披露。处理策略取决于缺失机制:

  1. 删除:缺失比例极低且随机时可用,但会破坏时间连续性。
  2. 前向填充(ffill):适合停牌价格、估值指标,但会引入“伪平稳”。
  3. 插值:线性或时间插值适合连续变量,不适合跳跃型事件。
  4. 标记缺失:保留 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

五、误区与复盘

初学者最常见的三个误区:

  • 用不复权价算长期收益:会把分红送股当成亏损,严重低估真实回报。
  • 无脑 ffill 所有字段:成交量、换手率被填充后会产生虚假交易信号。
  • 忽略时区与交易日历:跨市场数据对齐时,时区错位会导致“未来函数”。

复盘建议:每次拿到新数据,先做三件事——打印字段与类型、统计缺失率、画出价格与成交量走势。把数据质量检查写成可复用的函数,是构建金融数据分析 Agent 的第一块基石。