加载中...

Pandas 金融数据分析实战:从入门到精通

作为金融数据分析师,我们每天都要处理大量的市场数据。Python 的 Pandas 库是处理这类数据的利器。本文将分享一些实用的金融数据处理技巧。

为什么选择 Pandas?

Pandas 为金融数据分析提供了强大的工具:

  • 时间序列处理:原生支持日期索引和时间序列操作
  • 数据对齐:自动处理不同时间点的数据对齐
  • 高效计算:向量化操作大幅提升性能
  • 灵活的数据结构:DataFrame 天然适合表格数据

基础数据处理

读取金融数据

import pandas as pd
import numpy as np

df = pd.read_csv('stock_data.csv', 
                 parse_dates=['date'],
                 index_col='date')

df.head()
df.info()

数据清洗

df = df.dropna()
# 或者用前向填充
df = df.fillna(method='ffill')

df = df.drop_duplicates()

df['volume'] = df['volume'].astype('int64')

常用技术指标计算

移动平均线

df['MA5'] = df['close'].rolling(window=5).mean()
df['MA20'] = df['close'].rolling(window=20).mean()

df['EMA12'] = df['close'].ewm(span=12, adjust=False).mean()
df['EMA26'] = df['close'].ewm(span=26, adjust=False).mean()

收益率计算

df['returns'] = df['close'].pct_change()
df['log_returns'] = np.log(df['close'] / df['close'].shift(1))
df['cumulative_returns'] = (1 + df['returns']).cumprod() - 1

波动率指标

# 历史波动率(20日)
df['volatility'] = df['returns'].rolling(window=20).std() * np.sqrt(252)

# 布林带
df['MA20'] = df['close'].rolling(window=20).mean()
df['std20'] = df['close'].rolling(window=20).std()
df['upper_band'] = df['MA20'] + (df['std20'] * 2)
df['lower_band'] = df['MA20'] - (df['std20'] * 2)

数据重采样

# 日数据转换为周数据
weekly_data = df.resample('W').agg({
    'open': 'first',
    'high': 'max',
    'low': 'min',
    'close': 'last',
    'volume': 'sum'
})

# 日数据转换为月数据
monthly_data = df.resample('M').agg({
    'close': 'last',
    'returns': lambda x: (1 + x).prod() - 1
})

性能优化技巧

用向量化替代循环

# 慢(别这么写)
for i in range(len(df)):
    df.loc[i, 'signal'] = 1 if df.loc[i, 'close'] > df.loc[i, 'MA20'] else 0

# 快
df['signal'] = np.where(df['close'] > df['MA20'], 1, 0)

用 category 节省内存

df['sector'] = df['sector'].astype('category')

实战案例:简单的交易信号

df['signal'] = 0
df.loc[df['MA5'] > df['MA20'], 'signal'] = 1
df.loc[df['MA5'] < df['MA20'], 'signal'] = -1

df['strategy_returns'] = df['signal'].shift(1) * df['returns']
df['strategy_cumulative'] = (1 + df['strategy_returns']).cumprod() - 1

sharpe_ratio = df['strategy_returns'].mean() / df['strategy_returns'].std() * np.sqrt(252)
print(f"夏普比率: {sharpe_ratio:.2f}")

总结

Pandas 是金融数据分析的强大工具,掌握以下要点:

  1. 数据清洗:始终检查和处理缺失值、异常值
  2. 向量化操作:避免循环,使用 Pandas 内置方法
  3. 时间序列:熟练使用 rolling()shift()resample() 等方法
  4. 性能优化:合理使用数据类型,避免不必要的复制

在下一篇文章中,我将分享如何使用这些基础知识构建完整的量化交易回测系统。

参考资源

Author
Tong
© 2025 by Tong 本文基于 CC BY-NC-SA 4.0 许可 CC 协议 必须注明创作者 仅允许将作品用于非商业用途 改编作品必须遵循相同条款进行共享 最后更新:2025/11/14