楼主: UglyWren
190 0

[其他] 《投资-231》量化交易 - pandas:DataFrame数据结构常见操作 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.1369
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-11-12
最后登录
2018-11-12

楼主
UglyWren 发表于 2025-11-15 15:32:29 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

在量化交易中,**

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。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Dataframe pandas panda Frame 数据结构

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-13 21:45