跳到正文

Python Pandas 金融数据处理:让市场数据可用

pandas 是 Python 量化金融的基础。理解其数据结构——Series、DataFrame、Panel——将混乱的市场数据转化为可直接分析的数组。

第 7 篇 · 共 8 篇 约 1 分钟

Python 的 pandas 库是 Python 量化金融的基石。几乎每个量化工作流——数据清洗、特征工程、因子分析、回测——都使用 pandas。深入理解其数据结构能让一切都变得更快。

三个核心数据结构

Series:一维标签数组

Series 是带有索引的数据单列:

import pandas as pd
import numpy as np

# 价格序列
prices = pd.Series([100.5, 101.2, 100.8, 102.1],
                  index=pd.to_datetime(['2024-01-02', '2024-01-03',
                                        '2024-01-04', '2024-01-05']))

# 日收益
returns = prices.pct_change()  # 自动逐元素操作

DataFrame:二维表格

DataFrame 是带有行(观测值)和列(变量)的表格。

MultiIndex 用于面板数据

对于多资产、多日期数据,使用 MultiIndex:

index = pd.MultiIndex.from_tuples([
    ('2024-01-02', 'AAPL'),
    ('2024-01-02', 'MSFT'),
    ('2024-01-03', 'AAPL'),
    ('2024-01-03', 'MSFT')
], names=['date', 'asset'])

returns = pd.Series([0.012, 0.008, -0.003, 0.005], index=index)
returns_wide = returns.unstack(level='asset')

金融特定操作

收益和对数收益

def compute_returns(prices):
    """简单收益:(P_t - P_{t-1}) / P_{t-1}"""
    return prices.pct_change()

def compute_log_returns(prices):
    """对数收益:ln(P_t / P_{t-1})"""
    return np.log(prices / prices.shift(1))

对数收益跨时间相加。简单收益的均值计算方式不同。对数收益用于时间序列聚合。

重采样(不同频率)

# 日 → 月末
monthly_prices = prices.resample('M').last()

# 日 → 月均值
monthly_avg = prices.resample('M').mean()

# 季度末
quarterly = prices.resample('Q').last()

滚动窗口

# 20 日移动平均
ma_20 = prices.rolling(window=20).mean()

# 20 日滚动波动率
vol_20 = prices.pct_change().rolling(window=20).std() * np.sqrt(252)

常见陷阱

对齐 bug。 当你组合两个索引不同的 Series 时,pandas 按索引对齐。如果苹果的数据有一个微软没有的假日,结果会有 NaN。在计算前始终 dropna() 或 ffill()。

SettingWithCopyWarning。 链式索引如 df[df['col'] > 0]['new_col'] = value 会产生警告。使用 df.loc。

参考文献

  • McKinney, Python for Data Analysis, 第 5-10 章. O’Reilly, 2023. ISBN: 978-1-492-07231-9.
  • VanderPlas, Python Data Science Handbook, 第 3 章. O’Reilly, 2016. ISBN: 978-1-491-91205-8.