3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 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),因为它能将数据转化为时间序列矩阵,后续计算移动平均、波动率等技术指标时会更加直观和方便。