问题描述
各位大神,我请教一个问题:
貌似get_fundamentals获取的数据很不准确,是我的获取方法错误???
比如,假如我要获取 滨江集团最近公布的净利润。
我在同花顺行情软件中查询的结果:
财报统计的季度的最后一天(2015-09-30),净利润(万元):68,480.78
而用get_fundamentals获取的结果:
q = query(
income.code, # 股票代码
income.pubDate, # 公司发布财报日期
income.statDate, # 财报统计的季度的最后一天, 比如2015-03-31, 2015-06-30
income.net_profit # 净利润(元)
).filter(
valuation.code=='002244.XSHE'
)
df = get_fundamentals(q, date='2016-04-15')
df.head()
code pubDate statDate net_profit
002244.XSHE 2015-10-30 2015-09-30 354747328
明显不一样,我是哪里错了???
解决方案
您好!您获取的数据并没有错,导致数据不一致的原因是统计口径不同(单季度数据 vs 累计报告期数据)。
详细解析
-
同花顺等行情软件的默认显示(累计数据):
上市公司公布的财报分为一季报、半年报(中报)、三季报和年报。同花顺等财经网站默认展示的是报告期累计数据。您查询的2015-09-30是三季报,同花顺显示的68,480.78 万元是滨江集团在 2015年第一季度 + 第二季度 + 第三季度的前三季度累计净利润。 -
JoinQuant 平台的默认返回(单季度数据):
考虑到量化分析中,单季度数据更能真实反映公司在该季度的经营状况(避免了历史季度的平滑效应),JoinQuant 的get_fundamentals默认查询和返回的财务指标数据是单季度的。因此,您获取到的354,747,328 元(约 3.54 亿元)仅仅是滨江集团在 2015年第三季度(7月-9月) 这一个季度的净利润。
如何验证?
您可以在同花顺软件中,将财务报表的统计方式从“按报告期”切换为**“按单季度”**统计,您会发现 2015年第三季度的单季净利润与您在 JoinQuant 获取到的 354,747,328 是一致的。
如果我需要获取累计数据怎么办?
如果您在策略中确实需要使用前三季度的累计净利润,可以通过以下方式解决:
方法一:自行累加单季度数据
您可以分别获取该年度 Q1、Q2、Q3 的单季度净利润,然后在代码中进行相加。
# 示例:获取 2015年前三个季度的单季净利润并求和
q = query(
income.statDate,
income.net_profit
).filter(
income.code == '002244.XSHE'
)
# 分别获取 Q1, Q2, Q3 的数据
df_q1 = get_fundamentals(q, statDate='2015q1')
df_q2 = get_fundamentals(q, statDate='2015q2')
df_q3 = get_fundamentals(q, statDate='2015q3')
# 累加净利润
total_net_profit = df_q1['net_profit'][0] + df_q2['net_profit'][0] + df_q3['net_profit'][0]
print("前三季度累计净利润:", total_net_profit)
方法二:使用 TTM 数据(滚动十二个月)
在量化选股中,通常更推荐使用 TTM(Trailing Twelve Months)数据,它能有效消除季节性因素。JoinQuant 提供了 net_profit_ttm 字段,表示过去12个月的净利润之和。
总结
在进行量化财务数据分析时,一定要区分单季度数据(Quarterly)、累计数据(Cumulative/YTD)和滚动十二个月数据(TTM)。JoinQuant 默认提供单季度数据是为了方便构建更精细的量化因子。