问题描述
想问下问题出在哪里?请指点下,谢谢。
代码:
q=query(indicator.code,
indicator.inc_return,
indicator.roe,).filter(indicator.code=='600519.XSHG');
df=get_fundamentals(q, '2020-5-22')
输出:
code inc_return roe
0 600519.XSHG 9.23 9.18
解决方案
您好!获取到的茅台 ROE 只有 9.18%,问题出在查询的财务报告期上。
问题原因解析
在 JoinQuant 中,使用 get_fundamentals 函数时,如果只传入 date 参数(如您代码中的 '2020-5-22'),系统默认返回的是该日期之前上市公司最新发布的一期财务报表数据。
对于贵州茅台(600519.XSHG)来说,在 2020年5月22日 这个时间点,最新发布的财报是 2020年第一季度财报(一季报)。因此,您查询到的 9.18% 实际上是茅台 2020年第一季度(单季度)的 ROE,而不是全年的 ROE。单季度 9% 左右的 ROE,折算成全年大约在 30% 以上,这与茅台的实际基本面是完全吻合的。
解决方法
如果您希望获取年度的 ROE 或者 滚动十二个月(TTM)的 ROE,可以通过以下两种方式修改代码:
方法一:使用 statDate 参数获取指定年度的财报
如果您想看 2019 年全年的 ROE,不要使用 date 参数,而是使用 statDate 参数指定年份:
q = query(
indicator.code,
indicator.inc_return,
indicator.roe
).filter(indicator.code == '600519.XSHG')
# 获取2019年年报数据
df = get_fundamentals(q, statDate='2019')
print(df)
注意:使用 statDate 在回测中可能会引入未来函数(如果在财报发布前就获取到了数据),请谨慎在交易信号中使用。
方法二:查询 ROE_TTM(滚动十二个月权益回报率)
如果您希望在 '2020-05-22' 这个时间点,获取过去连续四个季度的 ROE(即 TTM 数据,避免未来函数且能反映全年水平),可以查询 indicator.roe_ttm 字段:
q = query(
indicator.code,
indicator.inc_return,
indicator.roe_ttm # 改为查询 TTM 数据
).filter(indicator.code == '600519.XSHG')
# 获取指定日期能看到的最新 TTM 数据
df = get_fundamentals(q, date='2020-05-22')
print(df)
总结:在量化回测中调用财务数据时,一定要区分单季度数据、年度数据和TTM(滚动十二个月)数据。通常在构建选股策略时,推荐使用 TTM 数据(如 roe_ttm),既能反映全年的盈利水平,又能有效避免未来函数。