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

为什么 JoinQuant 中使用 get_bars 获取期货数据看起来是错的?

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

问题描述

get_bars获取期货数据错误问题

bars = get_bars('EB2105.XDCE', 5, unit='1m', end_dt='2021-02-26 15:00:00', fields=['close'],include_now=False)
bars
打印的数据是下面这个,没有一条是对的,请问是什么问题?
array([(9763.0,), (9769.0,), (9750.0,), (9769.0,), (9761.0,)],
dtype=(numpy.record, [('close', '< f8')]))

解决方案

您好!您遇到的情况并不是数据本身错误,而是由于 get_bars 函数默认的返回数据格式以及期货品种的定价规则导致的视觉上的误解。以下是详细的排查和解决方法:

1. 返回格式问题:为什么是 numpy.record

在 JoinQuant 的 API 中,get_bars 函数有一个参数 df,它的默认值是 False。当 df=False 时,函数会返回一个 numpy.ndarray(NumPy 数组)对象,这就是您看到的 array([(9763.0,), ...], dtype=(numpy.record, ...)) 格式。

这种格式在程序内部计算时效率很高,但直接打印出来人类阅读起来非常不直观,且没有时间戳索引。

解决方法:将 df 参数设置为 True,让其返回我们熟悉的 pandas.DataFrame 格式。

# 增加 df=True 参数
bars = get_bars('EB2105.XDCE', 5, unit='1m', end_dt='2021-02-26 15:00:00', fields=['close'], include_now=False, df=True)
print(bars)

2. 数据数值问题:为什么是 9700 多?

您查询的标的 EB2105.XDCE 是大连商品交易所的苯乙烯(EB) 2105 合约。期货的报价是按照其现货的实际价格(元/吨)来标价的。

在 2021 年 2 月底,苯乙烯(EB)的价格确实在 9700 元/吨左右波动。因此,您看到的 9763.0, 9769.0 等数值,正是该合约在当时真实的分钟线收盘价,数据本身是完全正确的。

3. 时间对齐与 include_now 参数

您设置了 end_dt='2021-02-26 15:00:00'include_now=False

  • include_now=False 表示不包含 end_dt 所在的那个 Bar。
  • 因此,您获取到的 5 根 1 分钟 K 线,实际上是 14:55, 14:56, 14:57, 14:58, 14:59 这 5 分钟的收盘价。

如果您希望包含 15:00 这一分钟的数据,可以将 include_now 设置为 True

总结与建议代码

为了更直观地查看和验证数据,建议您在获取数据时始终带上 date 字段,并开启 df=True

from jqdata import *

# 建议加上 'date' 字段,并设置 df=True
bars = get_bars('EB2105.XDCE', 
                count=5, 
                unit='1m', 
                end_dt='2021-02-26 15:00:00', 
                fields=['date', 'close'], # 加上 date 方便核对时间
                include_now=False, 
                df=True) # 返回 DataFrame

print(bars)

这样打印出来的结果将会是一个带有时间戳和收盘价的清晰表格,您就可以方便地与行情软件(如文华财经、博易大师等)上的历史 K 线进行比对了。