🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant 平台 get_price 设置 panel=False 后如何方便地计算多只股票的区间涨幅?

joinquant | 发布时间: 2026/6/24
以下内容由 EasyQuant 生成。

问题描述

多维数据 panel=false 后如何计算方便

import pandas as pd
df=get_price(['000001.XSHE','000002.XSHE'],end_date='2020-02-13',count=10,fields=['close','high'],panel=True)
df['close',:,:]
000001.XSHE 000002.XSHE
2020-01-23 15.54 28.98
2020-02-03 13.99 26.63
2020-02-04 14.60 27.62
2020-02-05 14.63 27.64
2020-02-06 14.77 27.90
2020-02-07 14.62 27.50
2020-02-10 14.50 28.67
2020-02-11 14.79 29.08
2020-02-12 14.77 29.08
2020-02-13 14.65 29.95

如果我要计算10天涨幅
只要
df.iloc[-1,:]/df.ilco[0:]-1即可

但如果pandas 未来不能支持panel
df=get_price(['000001.XSHE','000002.XSHE'],end_date='2020-02-13',count=10,fields=['close','high'],panel=False)
df
time code close high
0 2020-01-23 000001.XSHE 15.54 15.92
1 2020-02-03 000001.XSHE 13.99 14.70
2 2020-02-04 000001.XSHE 14.60 14.66
3 2020-02-05 000001.XSHE 14.63 14.89
4 2020-02-06 000001.XSHE 14.77 14.87
5 2020-02-07 000001.XSHE 14.62 14.69
6 2020-02-10 000001.XSHE 14.50 14.53
7 2020-02-11 000001.XSHE 14.79 14.94
8 2020-02-12 000001.XSHE 14.77 14.82
9 2020-02-13 000001.XSHE 14.65 14.88
10 2020-01-23 000002.XSHE 28.98 29.78
11 2020-02-03 000002.XSHE 26.63 27.52
12 2020-02-04 000002.XSHE 27.62 27.87
13 2020-02-05 000002.XSHE 27.64 27.98
14 2020-02-06 000002.XSHE 27.90 28.12
15 2020-02-07 000002.XSHE 27.50 27.60
16 2020-02-10 000002.XSHE 28.67 28.88
17 2020-02-11 000002.XSHE 29.08 29.53
18 2020-02-12 000002.XSHE 29.08 29.30
19 2020-02-13 000002.XSHE 29.95 30.75

那么如何才能方便计算每个股票的10天涨幅呢?

解决方案

在 pandas 0.25 版本之后,Panel 数据结构已经被彻底移除。因此在 JoinQuant 中调用 get_price 获取多只股票数据时,推荐使用 panel=False,此时返回的是一个长格式(Long Format)的 DataFrame。

面对这种长格式数据,要像以前一样方便地计算多只股票的区间涨幅,主要有两种非常高效的 pandas 处理方法:

方法一:使用 pivot 重塑数据(最推荐,最接近原有习惯)

你可以使用 pivot 方法将长格式的 DataFrame 转换回你熟悉的宽格式(Wide Format),即行索引为时间,列索引为股票代码的 DataFrame。这样就可以完全复用你以前的计算逻辑。

import pandas as pd

# 获取数据
df = get_price(['000001.XSHE','000002.XSHE'], end_date='2020-02-13', count=10, fields=['close','high'], panel=False)

# 使用 pivot 将数据重塑为宽格式,提取 'close' 列
df_close = df.pivot(index='time', columns='code', values='close')

# 此时 df_close 的结构就和以前 df['close',:,:] 一模一样了
# 计算10天涨幅
returns = df_close.iloc[-1, :] / df_close.iloc[0, :] - 1
print(returns)

方法二:使用 groupby 分组计算

如果你不想改变数据的形状,可以直接利用 pandas 的 groupby 功能,按股票代码分组后应用计算逻辑。

import pandas as pd

# 获取数据
df = get_price(['000001.XSHE','000002.XSHE'], end_date='2020-02-13', count=10, fields=['close','high'], panel=False)

# 按 'code' 分组,对 'close' 列计算涨幅
returns = df.groupby('code')['close'].apply(lambda x: x.iloc[-1] / x.iloc[0] - 1)
print(returns)

总结

  • pivot 方法:非常适合需要同时对多只股票的同一指标(如收盘价)进行矩阵运算或时间序列分析的场景,代码可读性高,且能无缝衔接旧版基于 Panel 提取出的 DataFrame 的代码。
  • groupby 方法:适合在长格式数据上直接进行聚合计算,不需要改变数据结构。

在量化策略编写中,通常推荐使用 方法一 (pivot),因为它能将数据转化为时间序列矩阵,后续计算移动平均、波动率等技术指标时会更加直观和方便。