问题描述
from jqdata import *
from jqfactor import get_factor_values
from jqdata import finance
q1 = query(valuation.code, finance.STK_AUDIT_OPINION.end_date).filter(valuation.code =='600519.XSHG').limit(5)
w1 = get_fundamentals(q1)
log.info(w1)
q2 = query(finance.STK_AUDIT_OPINION.end_date).filter(finance.STK_AUDIT_OPINION.code=='600519.XSHG').limit(5)
w2 = finance.run_query(q2)
log.info(w2)
输出结果为:
2024-11-08 00:00:00 - INFO - code end_date
0 600519.XSHG 1966-12-31
1 600519.XSHG 1989-12-31
2 600519.XSHG 1990-12-31
3 600519.XSHG 1990-12-31
4 600519.XSHG 1990-12-31
2024-11-08 00:00:00 - INFO - end_date
0 2000-12-31
1 2001-06-30
2 2001-12-31
3 2002-03-31
4 2002-06-30
按照说明看,get_fundamentals (股票单季度财务数据)、finance (股票数据,基金数据等)。那我使用这两个语句都可以查询季报的日期,但实际查询结果却差异很大,不知道是什么原因?如果我想查询最新报表日期应该怎么处理?请各位大佬赐教,谢谢!
解决方案
在这两个查询语句中,导致结果差异巨大的核心原因在于API 的适用范围以及跨表查询的限制。
为什么查询结果会不同?
-
get_fundamentals的作用与限制:
get_fundamentals是专门用来查询三大财务报表(income,balance,cash_flow)、估值表(valuation)和财务指标表(indicator)的 API。它在底层会自动根据传入的date参数(默认是前一个交易日)去匹配当时能看到的最新财报数据。
在您的q1查询中,您同时查询了valuation.code和finance.STK_AUDIT_OPINION.end_date。这属于跨模块连表查询。JoinQuant 的 API 不支持将valuation表与finance模块下的表进行连表查询。这种非法的连表操作会导致底层 SQL 产生笛卡尔积或匹配混乱,从而返回了如1966-12-31这种毫无意义的异常脏数据。 -
finance.run_query的作用:
finance.run_query是专门用来查询finance模块(如沪深港通、股东信息、审计意见等)的 API。它没有默认的日期过滤机制,直接返回数据库中的原始记录。
在您的q2查询中,您正确地使用了单表查询,因此返回了真实的、按数据库默认顺序排列的历史记录(从 2000 年开始)。
如何正确查询最新报表日期?
如果您想获取某只股票当前能看到的最新财务报表日期,最标准的方法是使用 get_fundamentals 查询三大报表中的 statDate 字段。因为 get_fundamentals 会自动处理时间点,确保没有未来函数。
方法一:使用 get_fundamentals 获取最新财报日期(推荐)
from jqdata import *
# 查询贵州茅台最新一期利润表的报告期
q = query(
income.code,
income.statDate
).filter(
income.code == '600519.XSHG'
)
# 默认 date 为前一交易日(回测中)或昨日(研究中)
df = get_fundamentals(q)
print(df)
方法二:使用 finance.run_query 获取最新审计意见日期
如果您确实需要查询 finance.STK_AUDIT_OPINION 表中的最新日期,您需要对日期进行降序排列(order_by),并限制返回第一条记录:
from jqdata import *
from jqdata import finance
# 按 end_date 降序排列,获取最新的一条记录
q2 = query(
finance.STK_AUDIT_OPINION.code,
finance.STK_AUDIT_OPINION.end_date
).filter(
finance.STK_AUDIT_OPINION.code == '600519.XSHG'
).order_by(
finance.STK_AUDIT_OPINION.end_date.desc()
).limit(1)
w2 = finance.run_query(q2)
print(w2)
总结建议
- 查询
valuation,income,balance,cash_flow,indicator时,使用get_fundamentals。 - 查询
finance.XXX表时,使用finance.run_query。 - 绝对不要在同一个
query()中混用这两类表。