问题描述
帮助手册: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', ...),您可以轻松恢复所需的显示精度。在进行量化计算时,请放心,系统会使用完整的精度进行运算。