🚀 AI 一键生成 joinquant 策略代码

JoinQuant 获取数据时如何通过 panel=False 优化结构?

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

问题描述

使用 get_price 获取多只股票数据时,返回的 Panel 结构操作太慢,怎么直接获取 DataFrame?

解决方案

在 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)

总结

  1. get_price: 设置 panel=False 可获得 DataFrame。
  2. 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),更适合量化研究和实盘模拟。