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.