迅投QMT社区 门户 查看主题

针对昨日发现的整数溢出问题,进行解析, 可以大概总结为是迅投数据库的原因

发布者: *******2848_wA7de | 发布时间: 2026-5-21 13:13| 查看数: 39| 评论数: 0|帖子模式

下面,我对xtdata.get_market_data_ex()函数进行了分析,发现内部也并没有对int数据类型进行显式的预处理。

xtdata.get_market_data_ex()在获取日线(period = "1d")数据时,流程大概是这样的:

xtdata.get_market_data_ex() ->

内部通过period分支将函数指向_get_market_data_ex_ori_221207()

    if spec_period in {'1m', '5m', '15m', '30m', '60m', '1h', '1d', '1w', '1mon', '1q', '1hy', '1y'}:
        return _get_market_data_ex_ori_221207(field_list, stock_list, spec_period, start_time, end_time, count, dividend_type, fill_data)

然后在_get_market_data_ex_ori_221207()函数内部最终向服务器请求的时client.get_market_data3()

通过转向该函数的声明可以发现,该函数是经过pybind c++静态编译完成的,我们无法查看原始代码和断点测试,但可以知道,返回的数据是buffer。

ret = client.get_market_data3(field_list, stock_list, period, start_time, end_time, count, dividend_type, fill_data, 'v4', enable_read_from_local,
                                  enable_read_from_server, debug_mode, data_dir)
result = {}
    for stock, index, npdatas in ret:
        data = {field: np.frombuffer(b, fi) for field, fi, b in npdatas}
        result[stock] = pd.DataFrame(data=data, index=index)
    return result

6FD08A95-7C09-40AB-B326-83F74CFF80A6.png

那么也就是说,在数据返回时,经过np.frombuffer()解析过后的数据,就是我们可以查看到的最优先级的数据了,我在更新字典前,就是for循环内部data声明后,此处进行了断点测试,观察data当中的数组

f469537fac9d637941a90916e6a00fbf.png

在此时数据就已经是负数了,下面可以看到volumn的数据类型是int64。 e2108c27c577c7b25e7e1d676a3ed822.png

所以,应该是这一部分qmt的数据源本身就是有问题的,而不是环境问题。

大家有什么看法?欢迎交流

python 3.12

xtquant 250516

最新评论

客服专线

400-080-8112

用思考的速度交易,用真诚的态度合作,我们是认真的!
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2026 迅投QMT社区 版权所有 All Rights Reserved. 京ICP备2025122616号-3
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表