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

joinquant 中 get_bars 与 get_price 的区别与性能对比指南

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 数据获取指南:get_bars 与 get_price 性能对比与选择

Question: joinquant 中 get_bars 和 get_price 有什么区别?哪个性能更好?

解决方案

JoinQuant 中 get_bars 与 get_price 的区别与性能对比

在聚宽(JoinQuant)量化交易平台中,get_barsget_price 是最常用的两个历史行情数据获取接口。虽然它们都能用于查询 K 线数据,但在返回数据结构、性能效率、停牌处理以及复权机制上存在显著差异。


一、核心区别对比

特性 / API get_price get_bars
默认返回类型 pandas.DataFramePanel numpy.ndarray(可通过 df=True 返回 DataFrame)
性能表现 较慢(涉及 DataFrame 转换开销) 极快(原生返回 NumPy 数组,内存占用低)
停牌处理 默认用 pre_close 填充(可设 skip_paused 不跳过也不填充停牌,仅返回实际有交易的 bar
支持时间周期 日线 (1d) 与分钟线 (1m) 标准周期 (1m, 5m, 1d, 1w, 1M) 及非标准周期 (Xm)
包含当前 Bar 不支持包含未完结的当前 Bar 支持(通过设置 include_now=True
多标的查询 返回 Panel 或 MultiIndex DataFrame 返回字典 (Key 为标的代码) 或 MultiIndex DataFrame

二、详细特性分析

1. 性能差异

  • get_bars 性能更优:由于默认返回轻量级的 numpy.ndarray,在频繁调用或大批量标的计算时,内存占用小,运行速度显著快于 get_price
  • get_price 内存开销较大:每次调用都会构建 Pandas DataFrame/Panel 对象,数据转换和索引对齐会带来额外的 CPU 与内存开销。

2. 停牌数据处理

  • get_price:为了保证时间轴对齐,停牌期间默认使用上一交易日的收盘价填充。
  • get_bars:直接过滤停牌数据。如果请求 count=10 但中间有 2 天停牌,它只会返回实际交易的 8 根 Bar(或实际存在的数量),不会自动填充。因此在多标的横截面处理时需注意长度一致性。

3. 复权与切片灵活度

  • get_bars:支持设置 fq_ref_date 参数,便于进行指定基准日期的定点复权动态复权;且通过 include_now=True 可以获取盘中当前尚未收盘的实时 Bar 数据。
  • get_price:复权选项仅支持 'pre'(前复权)、'post'(后复权)和 None(不复权)。

三、代码示例

使用 get_bars 获取高性能数据

import datetime
from jqdata import *

# 获取平安银行过去 5 天的日线数据,返回 numpy.ndarray
array_data = get_bars('000001.XSHE', count=5, unit='1d', fields=['date', 'open', 'close'])
print(array_data['close'])  # 直接按字段读取,速度极快

使用 get_price 获取对齐的 DataFrame

from jqdata import *

# 获取多只股票指定时间段的收盘价
df = get_price(['000001.XSHE', '600000.XSHG'], start_date='2023-01-01', end_date='2023-01-10', fields=['close'], panel=False)
print(df)

四、选型建议与最佳实践

  1. 策略回测与高频计算(推荐 get_bars
    • 需要追求回测速度、频繁获取分钟或 Tick 级 K 线时,应优先使用 get_bars(..., df=False)
  2. 多标的数据分析与报表绘制(推荐 get_price
    • 在研究环境或需要自动对齐多只股票时间轴进行矩阵运算时,使用 get_price 更方便。
  3. 避免未来函数
    • 无论使用哪种 API,在盘中获取数据时,均需注意 end_date / end_dt 不能超过当前逻辑时间 context.current_dt