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

JoinQuant 平台 AH股价格对比 h_a_comp 字段精度为何只有两位小数?

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

问题描述

帮助手册:AH股价格对比 h_a_comp字段精度有bug?

帮助手册:AH股价格对比,h_a_comp字段最近查询结果显示的都是两位小数,不是写着四位小数吗?

h_a_comp 比价(A/H) decimal(10,4)
A股人民币价格/(H股港币价格*港币兑人民币的汇率)

解决方案

在 JoinQuant 聚宽平台上查询 AH 股价格对比数据(finance.STK_AH_PRICE_COMP)时,如果发现 h_a_comp 字段(比价 A/H)显示为两位小数,而文档中注明的数据类型是 decimal(10,4),这通常是由于 Pandas DataFrame 的默认显示设置 导致的,而非底层数据丢失了精度。

问题原因分析

当您使用 finance.run_query() 获取数据时,返回的结果是一个 Pandas DataFrame 对象。Pandas 在控制台或 Jupyter Notebook 中打印 DataFrame 时,为了排版美观,默认可能会对浮点数进行截断显示(通常是保留两位到四位小数,具体取决于版本和全局设置)。

虽然您看到的是两位小数,但底层存储和计算时,数据仍然保留了其原有的精度。

解决方案

如果您希望在打印输出时看到完整的四位小数,可以通过修改 Pandas 的全局显示设置来实现。

方法一:修改 Pandas 显示精度

在查询和打印数据之前,添加以下代码来设置 Pandas 的浮点数显示格式:

import pandas as pd
from jqdata import *

# 设置 Pandas 显示浮点数时保留四位小数
pd.set_option('display.float_format', lambda x: '%.4f' % x)

# 查询万科 AH 股价格的前10条数据
q = query(finance.STK_AH_PRICE_COMP).filter(
    finance.STK_AH_PRICE_COMP.a_code == '000002.XSHE'
).order_by(
    finance.STK_AH_PRICE_COMP.day.desc()
).limit(10)

df = finance.run_query(q)
print(df[['day', 'a_code', 'h_code', 'h_a_comp']])

方法二:直接查看底层数据

如果您只是想确认底层数据是否真的有四位小数,可以直接提取该列的值转换为列表或数组查看:

from jqdata import *

q = query(finance.STK_AH_PRICE_COMP).filter(
    finance.STK_AH_PRICE_COMP.a_code == '000002.XSHE'
).order_by(
    finance.STK_AH_PRICE_COMP.day.desc()
).limit(5)

df = finance.run_query(q)

# 直接打印该列的原始数值
print(df['h_a_comp'].tolist())

总结

文档中描述的 decimal(10,4) 是数据库层面的存储格式,保证了数据的准确性。您在研究环境或回测日志中看到的两位小数仅仅是 Pandas 的显示截断。通过调整 pd.set_option('display.float_format', ...),您可以轻松恢复所需的显示精度。在进行量化计算时,请放心,系统会使用完整的精度进行运算。