3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在使用 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 之前,建议采用以下临时方案来规避该问题:
从您提供的数据可以看出,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])
如果策略强依赖于成交量(股数/手数),可以通过 成交额 (amount) / 均价 (vwap) 来进行粗略估算。均价可以通过 (open + close + high + low) / 4 粗略代替,但这仅限于对精度要求不高的场景。
这是一个底层数据类型的定义问题。为了彻底解决宽基指数和极端行情下的天量成交数据溢出,QMT 官方需要在后续的版本更新中:
volume 的字段从 int32 修改为 int64(或 long long)。int 默认支持任意精度)。建议开发者密切关注 QMT 客户端的更新日志,及时升级到修复此问题的最新版本。