问题描述
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 线进行比对了。