在量化交易中,**
pandas.DataFrame
** 是最核心的数据结构之一,用于存储和处理多维金融数据(
如股票的 OHLCV 行情
、因子矩阵、组合持仓等)。
以下是 **
DataFrame
常见操作的全面详解与实战示例**,专为量化交易场景设计,涵盖数据读取、清洗、计算、筛选、合并等全流程。
一、什么是 DataFrame?
DataFrame
是一个 **二维表格型数据结构**,类似于 Excel 表格或数据库表。
由多列
Series
组成,每列可有不同数据类型(如 float、int、str),但共享同一索引(通常是时间)。
在量化中常用于:
- 存储单只/多只股票的行情数据(open, high, low, close, volume)
- 构建因子表(momentum, volatility, RSI 等)
- 回测结果记录(日期、仓位、收益、净值)
import pandas as pd
# 示例:创建一个简单的日线 DataFrame
data = {
'open': [150.0, 152.0, 151.5],
'high': [152.5, 153.0, 152.0],
'low': [149.8, 151.2, 150.0],
'close': [152.0, 152.8, 151.8],
'volume': [1200000, 1100000, 950000]
}
dates = pd.date_range('2023-01-01', periods=3)
df = pd.DataFrame(data, index=dates)
print(df)
输出:
open high low close volume
2023-01-01 150.0 152.5 149.8 152.0 1200000
2023-01-02 152.0 153.0 151.2 152.8 1100000
2023-01-03 151.5 152.0 150.0 151.8 950000
二、常见操作分类详解
1. 基础属性查看
| 操作 |
说明 |
df.head(n)
|
/ |
df.tail(n)
|
查看前/后 n 行 |
df.info()
|
查看数据类型、非空值、内存使用 |
df.describe()
|
数值列的统计摘要(均值、标准差等) |
df.shape
|
返回 (行数, 列数) df.columns 所有列名 |
df.index
|
索引(通常是时间) |
示例:
print(df.shape) # (3, 5)
print(df.columns) # Index(['open', 'high', 'low', 'close', 'volume'], dtype='object')
2. 数据选择与访问
| 操作 |
示例 |
说明 |
df['close']
|
提取某一列为 Series |
df[['close', 'volume']]
|
df.loc[label]
|
提取多列为子 DataFrame |
df.loc['2023-01-01']
|
df.iloc[i]
|
按标签(如日期)选取行 |
df.iloc[0]
|
df.loc[start:end]
|
第一行 |
/ |
df.loc['2023-01-01':'2023-01-05']
|
时间切片 |
df[df['close'] > 152]
|
| 条件筛选 |
/ |
/ |
实战: 获取最近5天收盘价大于均线的数据
ma5 = df['close'].rolling(5).mean()
filtered = df[df['close'] > ma5]
3. 新增列与计算字段
| 操作 |
示例 |
df['return'] = df['close'].pct_change()
|
直接赋值 assign() 使用向量化运算 df = df.assign(ma5=df['close'].rolling(5).mean())
|
df['hl_spread'] = df['high'] - df['low']
|
/ |
实战: 构建常用技术指标
df['return'] = df['close'].pct_change() # 日收益率
df['ma5'] = df['close'].rolling(5).mean() # 5日均线
df['ma20'] = df['close'].rolling(20).mean() # 20日均线
df['volatility'] = df['return'].rolling(20).std() * np.sqrt(252) # 年化波动率
4. 数据清洗与处理
| 操作 |
示例 |
说明 |
df.isnull()
|
标记缺失值 df.dropna() 删除含 NaN 的行 |
/ |
df.fillna(0)
|
填充为 0 df.fillna(method='ffill') 向前填充(适合价格) |
/ |
df.replace([np.inf, -np.inf], np.nan)
|
替换无穷大 / |
/ |
推荐流程:
df.dropna(inplace=True) # 删除初始 NaN(如 pct_change 导致)
df.fillna(method='ffill', inplace=True) # 前向填充(应对停牌)
5. 排序与重置索引
| 操作 |
示例 |
说明 |
df.sort_index()
|
按时间正序排列(默认升序) df.sort_values('close', ascending=False) 按收盘价降序 |
/ |
df.reset_index()
|
将索引变回普通列(导出 CSV 前常用) df.set_index('date') 设置某列为索引 |
/ |
注意: 确保时间索引是升序,否则滚动计算会出错。
6. 分组与聚合(GroupBy)
适用于多资产或多周期分析。
| 操作 |
示例 |
说明 |
df.groupby('symbol')
|
按股票代码分组 df.groupby(pd.Grouper(freq='M')) 按月分组 |
/ |
.agg({'close': 'mean', 'volume': 'sum'})
|
聚合多种统计量 / |
/ |
示例: 按月统计平均收盘价和总成交量
monthly = df.groupby(pd.Grouper(freq='M')).agg({
'close': 'mean',
'volume': 'sum'
合并与连接数据
| 操作 |
示例 |
说明 |
pd.concat([df1, df2])
|
上下拼接(如不同时段) |
df1.merge(df2, on='date')
|
| 类似 SQL 的 join |
df.join(other_df, how='left')
|
按索引对齐合并(推荐用于时间序列) |
示例:添加宏观因子
# df: 行情数据,macro: 宏观数据(同索引)
df = df.join(macro[['interest_rate', 'cpi']], how='left')
重采样(Resampling)
将高频数据转换为低频。
| 操作 |
示例 |
说明 |
df.resample('W').last()
|
周线:取每周最后一个值 |
df.resample('M').ohlc()
|
| 月线:生成 OHLC 四值 |
df.resample('5T').mean()
|
5分钟线:取均值(适合成交量) |
示例:从分钟数据转换为日线
min_data = pd.read_csv('minute_data.csv', parse_dates=['time'], index_col='time')
daily = min_data.resample('D').agg({
'price': ['open', 'high', 'low', 'close'],
'volume': 'sum'
})
实战综合示例:完整策略数据处理流程
import pandas as pd
import numpy as np
# 1. 加载数据
df = pd.read_csv('stock_data.csv', parse_dates=['date'], index_col='date')
# 2. 数据检查
print(df.info())
print(df.isnull().sum())
# 3. 清洗数据
df.dropna(inplace=True)
df.fillna(method='ffill', inplace=True)
# 4. 构建指标
df['return'] = df['close'].pct_change()
df['ma5'] = df['close'].rolling(5).mean()
df['ma20'] = df['close'].rolling(20).mean()
# 5. 生成信号
df['signal'] = np.where(
(df['ma5'] > df['ma20']) & (df['ma5'].shift(1) <= df['ma20'].shift(1)),
1, 0
)
# 6. 计算策略收益
df['strategy_return'] = df['signal'].shift(1) * df['return']
df['equity'] = (1 + df['strategy_return']).cumprod()
# 7. 保存结果
df.to_csv('backtest_result.csv')
总结:DataFrame 核心操作速查表(量化专用)
| 类别 |
常用操作 |
| 创建 |
pd.DataFrame(dict, index=...)
|
| 查看 |
.head() , .info() , .describe()
|
| 选择 |
df['col'] , df.loc[] , df.iloc[] , df[condition]
|
| 新增列 |
df['new'] = ... , .assign()
|
| 清洗 |
.dropna() , .fillna() , .replace()
|
| 计算 |
.pct_change() , .rolling().mean() , .diff()
|
| 分组 |
.groupby(...) , .agg()
|
| 合并 |
.merge() , .join() , pd.concat()
|
| 重采样 |
.resample('D').last()
|
| 保存 |
.to_csv() , .to_pickle()
|
学习建议
把
DataFrame
当作“一张动态的金融报表”来理解。
多练习链式操作(method chaining)以提升效率:
df['close'].pct_change().rolling(20).std().plot(title="Volatility")
结合
matplotlib
或
plotly
来可视化你的 DataFrame。