🚀 AI 一键生成 qmt 策略代码

QMT 接口 get_market_data_ex 获取成交量 (volume) 为负数怎么办?

qmt | 发布时间: 2026/5/22
以下内容由 EasyQuant 生成。

问题描述

get_market_data_ex返回的volume字段为负数,建议修复下全流程字段类型为int64

399317.SZ 国证 A 指 获取到的数据如下,20240930 的 volume 为-1911326922,实际应该是 238364040000。

20240924 1727107200000 4230.694 4370.389 4208.352 4370.389 1047221216 9.668594e+11 0.0 15 4200.273 0
20240925 1727193600000 4425.629 4517.913 4417.462 4426.460 1261251652 1.151991e+12 0.0 15 4370.389 0
20240926 1727280000000 4421.022 4604.924 4415.433 4604.923 1258708041 1.155115e+12 0.0 15 4426.460 0
20240927 1727366400000 4689.296 4843.731 4673.142 4827.229 1415230261 1.441951e+12 0.0 15 4604.923 0
20240930 1727625600000 5029.855 5319.392 4960.544 5295.699 -1911326922 2.582803e+12 0.0 15 4827.230 0
20241008 1728316800000 5913.931 5913.931 5408.193 5673.478 -1436706166 3.438503e+12 0.0 15 5295.699 0
20241009 1728403200000 5540.199 5579.463 5234.947 5250.239 -2050792394 2.939199e+12 0.0 15 5673.478 0

解决方案

问题现象分析

在使用 QMT 平台的 ContextInfo.get_market_data_ex 接口获取宽基指数(如 399317.SZ 国证 A 指)的历史行情数据时,当市场成交极其活跃,成交量(volume)可能会返回负数(如 -1911326922)。

为什么会出现负数?(数据溢出)

这是典型的 32位有符号整数 (int32) 溢出 问题。

在计算机系统中,int32 的最大正值是 2,147,483,647(约 21.4 亿)。当实际成交量(如 2024年9月30日的国证A指成交量 238,364,040,000)远超这个数值时,底层 C++ 或数据传输层如果使用了 int32 来存储或解析该字段,高位字节会被截断,导致符号位翻转,最终在 Python 端呈现为毫无规律的负数。

由于高位数据已经丢失,在 Python 客户端无法通过简单的数学运算(如加回 2^32)来还原真实的成交量

临时解决方案

在官方正式将全流程字段类型升级为 int64 之前,建议采用以下临时方案来规避该问题:

1. 使用成交额 (amount) 替代成交量 (volume)

从您提供的数据可以看出,amount(成交额)字段返回的是科学计数法表示的浮点数(如 2.582803e+12),浮点数(double / float64)的上限极高,不会出现溢出问题

在编写策略时,如果需要衡量市场的活跃度或计算资金流向,可以优先使用 amount 字段:

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
    
    # 获取国证A指日线数据
    data = ContextInfo.get_market_data_ex(
        ['close', 'volume', 'amount'], 
        ['399317.SZ'], 
        period='1d'
    )
    
    df = data['399317.SZ']
    # 优先使用 amount 字段进行逻辑判断,避免 volume 溢出带来的干扰
    print("最新成交额:", df['amount'].iloc[-1])

2. 估算真实成交量(粗略替代)

如果策略强依赖于成交量(股数/手数),可以通过 成交额 (amount) / 均价 (vwap) 来进行粗略估算。均价可以通过 (open + close + high + low) / 4 粗略代替,但这仅限于对精度要求不高的场景。

官方修复建议

这是一个底层数据类型的定义问题。为了彻底解决宽基指数和极端行情下的天量成交数据溢出,QMT 官方需要在后续的版本更新中:

  1. 将底层 C++ 结构体中表示 volume 的字段从 int32 修改为 int64(或 long long)。
  2. 确保 Python API 绑定层(如 pybind11/SWIG)在转换该字段时,正确映射为 Python 的长整型(Python 3 中 int 默认支持任意精度)。

建议开发者密切关注 QMT 客户端的更新日志,及时升级到修复此问题的最新版本。