3. Python与数据科学基础

金融AI的落地,第一步不是模型,而是数据。Python之所以成为金融AI的事实标准,是因为它把“取数—清洗—计算—可视化—建模”串成了一条可复用的工程链路。本节聚焦这条链路的前半段:用NumPy做数值底座,用Pandas做表格化处理,用可视化做快速诊断,再完成金融数据的获取、清洗与初步特征工程。

核心原理:三层数据结构支撑金融计算

理解Python数据科学栈,关键是分清三层职责。NumPy提供ndarray,是定长、同类型、连续内存的多维数组,所有向量化运算、矩阵分解、随机数生成都建立在它之上;Pandas提供Series与DataFrame,在NumPy之上增加了索引、列名、时间轴和缺失值语义,适合处理带日期和字段名的金融面板数据;可视化库(Matplotlib、Seaborn、Plotly)则把数值转成图形,用于发现异常、验证假设和向业务方解释。

金融数据有三个天然特征:时间索引、缺失与停牌、量纲差异大。价格是百元级,成交量是亿级,收益率是小数级。若不做对齐和标准化,模型会被大量纲特征主导。因此,数据科学基础的本质不是“会调库”,而是建立索引对齐、缺失可解释、量纲可控的工程习惯。

金融数据科学处理链路 数据获取 API / CSV / 数据库 清洗对齐 缺失 / 复权 / 时区 特征工程 收益率 / 波动 / 动量 可视化诊断 分布 / 时序 / 相关 建模 输入 关键工程约束 • 时间索引必须统一为 tz-aware 或统一为 naive,避免跨市场错位 • 缺失值区分“停牌”“未上市”“数据源缺失”,不可一律 fillna(0) • 价格序列优先使用后复权价,避免除权跳空污染收益率 • 特征计算必须防止未来函数,滚动窗口只能使用 t 及之前的数据 • 量纲差异通过标准化或分位数变换处理,树模型可放宽但需验证

方法流程:从原始行情到可用特征

一个可复用的金融数据处理流程通常包含五步。第一步获取:通过Tushare、AkShare、yfinance或券商柜台API拉取行情、财务和宏观数据,落盘为Parquet或CSV,保留原始快照。第二步清洗:统一字段名、时区、交易日历,处理停牌与缺失,做复权。第三步对齐:以交易日为索引,将多标的、多频率数据对齐到同一时间轴。第四步特征:计算收益率、波动率、动量、换手率、估值分位等。第五步诊断:用可视化检查分布、异常点和相关性。

import pandas as pd
import numpy as np

# 读取原始行情,假设已落盘
df = pd.read_parquet("prices.parquet")
df["date"] = pd.to_datetime(df["date"])
df = df.sort_values(["symbol", "date"])

# 后复权价计算日收益率,避免除权跳空
df["ret"] = df.groupby("symbol")["adj_close"].pct_change()

# 20日滚动波动率,注意 min_periods 防止未来函数
df["vol20"] = (df.groupby("symbol")["ret"]
                 .rolling(20, min_periods=10)
                 .std()
                 .reset_index(level=0, drop=True))

# 动量:过去20日累计收益
df["mom20"] = (df.groupby("symbol")["adj_close"]
                 .pct_change(20))

# 缺失值诊断
print(df[["ret", "vol20", "mom20"]].isna().mean())

这段代码体现了三个工程要点:groupby+rolling保证按标的独立计算;min_periods避免窗口不足时产生虚假稳定值;pct_change基于复权价,保证收益率连续。实际项目中,还应把交易日历、停牌标记和涨跌停标记一并保留,供后续模型做样本过滤。

案例场景:多标的日频面板的清洗与特征构建

假设我们要为沪深300成分股构建日频特征面板。原始数据包含日期、代码、开高低收、成交量、成交额和复权因子。常见问题包括:不同股票上市日期不同导致面板前段大量缺失;停牌日无行情但交易日历仍存在;部分字段单位不一致(成交量手与股)。处理策略是:先以交易日历为骨架做reindex,再按标的做ffill仅填充价格类字段,成交量类缺失保留为NaN并加停牌标记;最后统一单位并计算特征。

处理环节典型问题推荐做法风险提示
时间对齐时区、交易日历不一致统一为交易所日历,tz-aware跨市场错位导致虚假相关
缺失处理停牌、未上市、源缺失混杂分类标记,价格ffill,量保留NaNfillna(0)制造虚假信号
复权除权除息跳空使用后复权价计算收益率前复权历史价格会变化
特征计算未来函数、窗口不足groupby+rolling,设min_periods回测虚高、实盘失效
量纲价格与成交量差异大标准化或分位数变换树模型也需验证稳定性

误区与复盘

误区一:把缺失值一律填0。停牌日收益率为0看似合理,但会稀释波动率并制造虚假低波动样本。正确做法是保留NaN并加停牌标记,让模型或回测逻辑显式处理。

误区二:用前复权价做历史回测。前复权价会随最新除权事件变化,导致历史价格被“重写”。回测应使用后复权价或原始价加复权因子。

误区三:滚动窗口未设min_periods。窗口不足时Pandas默认仍会计算,产生早期虚假稳定值。设置min_periods可让不足窗口返回NaN,避免污染训练集。

复盘建议:每完成一次数据清洗,输出一份“数据质量报告”,包含缺失率、异常值比例、时间覆盖范围、字段单位说明和样本量变化。这份报告既是团队协作的契约,也是模型上线后排查数据漂移的基线。特征工程初步阶段,优先保证可解释、可复现、无未来函数,再追求复杂度。

掌握本节内容后,你应能独立完成一条从原始行情到特征面板的最小可用链路,并能识别金融数据中最常见的对齐、缺失和复权陷阱。这是后续因子分析、机器学习和深度学习建模的共同地基。