问题描述
解决方案
在 JoinQuant 聚宽平台中,get_price 函数默认在获取多只股票数据时返回 pandas.Panel 结构(旧版 Pandas 数据结构)。由于 Panel 在新版 Pandas 中已被移除且操作效率较低,可以通过设置参数直接获取 DataFrame。
解决方法
在调用 get_price 时,将参数 panel 设置为 False。
这样函数会返回一个 MultiIndex DataFrame(多级索引数据框),其中索引通常包含时间和标的代码,操作起来比 Panel 更快且兼容性更好。
代码示例
# -*- coding: utf-8 -*-
from jqdata import *
def initialize(context):
# 定义股票列表
security_list = ['000001.XSHE', '000002.XSHE', '600000.XSHG']
# 获取数据,设置 panel=False
# 这样返回的就是 DataFrame 结构
df = get_price(
security_list,
start_date='2023-01-01',
end_date='2023-01-10',
frequency='daily',
fields=['open', 'close', 'high', 'low', 'volume'],
panel=False # 关键参数:设置为 False
)
# 打印数据类型和前几行查看结构
print("数据类型:", type(df))
print(df.head())
# 如果需要通过股票代码进行筛选,可以使用 .loc 或 .xs
# 例如获取 000001.XSHE 的数据
# 注意:具体索引层级顺序取决于返回的 DataFrame 结构,通常是 [time, code] 或 [code, time]
# 建议先 print(df.index) 查看索引结构
替代方案:使用 get_bars
除了 get_price,聚宽还提供了效率更高的 get_bars 函数,它专为获取行情设计,且通过参数 df=True 直接返回 DataFrame。
# 使用 get_bars 获取 DataFrame
df_bars = get_bars(
['000001.XSHE', '000002.XSHE'],
count=10,
unit='1d',
fields=['date', 'open', 'close'],
include_now=False,
df=True # 设置为 True 返回 DataFrame
)
print(df_bars)
总结
get_price: 设置panel=False可获得 DataFrame。get_bars: 设置df=True可获得 DataFrame(推荐用于获取大量行情数据)。
Q&A
Q: 为什么 get_price 默认返回 Panel?
A: 这是为了保持对旧策略代码的向后兼容性。早期的 Pandas 版本中 Panel 是处理三维数据(时间、标的、字段)的标准结构,但现在已被废弃。
Q: 设置 panel=False 后返回的 DataFrame 索引是什么样的?
A: 通常是一个多级索引(MultiIndex),包含时间(time/date)和标的代码(code)。具体的层级顺序可能会根据聚宽 SDK 的版本略有不同,建议使用 df.index 查看。
Q: get_bars 和 get_price 有什么区别?
A: get_price 是较老的接口,支持前复权处理逻辑较多,但在处理大量数据时速度较慢。get_bars 是较新的接口,速度更快,支持获取当前时刻数据(include_now),且默认不处理停牌填充(返回实际存在的 bar),更适合量化研究和实盘模拟。