问题描述
尝试获取茅台近十年的 roe
print(get_history_fundamentals(['600519.XSHG'], fields=[indicator.roe], watch_date=datetime.date.today(), count=10, interval='1y'))
结果是
code statDate roe
0 600519.XSHG 2013-03-31 10.0000
1 600519.XSHG 2014-03-31 8.3200
2 600519.XSHG 2015-03-31 7.8500
3 600519.XSHG 2016-03-31 7.3700
4 600519.XSHG 2017-03-31 8.0614
5 600519.XSHG 2018-03-31 8.8887
6 600519.XSHG 2019-03-31 9.4700
7 600519.XSHG 2020-03-31 9.1800
8 600519.XSHG 2021-03-31 8.2900
9 600519.XSHG 2022-03-31 8.7000
可是众所周知茅台的 roe 常年高于 20%,请问为什么这里获取到的数据这么低?
解决方案
您好!聚宽的 ROE 计算口径与业界标准是一致的。您获取到的茅台 ROE 数据之所以只有 8%~10% 左右,是因为您获取到的是「单季度」的 ROE,而不是「年度」的 ROE。
问题原因分析
观察您代码的输出结果,statDate 列显示的时间全是 03-31(如 2022-03-31),这代表您获取的是**第一季度(Q1)**的财务报表数据。
在聚宽的 get_history_fundamentals 函数中,默认参数 stat_by_year=False。这意味着函数默认返回的是按季度统计的数据。当您设置 interval='1y' 时,它的逻辑是“每隔一年取一次单季度数据”,所以它取出了过去 10 年里每一年的第一季度(Q1)的 ROE。茅台一季度的 ROE 大概在 8%~10% 左右,全年四个季度累加起来自然就是 30% 左右了。
正确的获取方式
如果您想获取年度财务数据(即年报中的全年 ROE),需要满足以下几个条件:
- 设置
stat_by_year=True。 interval必须是'1y'。- 必须使用
stat_date参数指定年份(例如'2022'),而不能使用watch_date。
修正后的代码示例
请使用以下代码来获取茅台近十年的年度 ROE:
from jqdata import *
import datetime
# 获取茅台近10年的年度ROE
df = get_history_fundamentals(
security=['600519.XSHG'],
fields=[indicator.roe],
stat_date='2022', # 指定从2022年报开始往前推
count=10, # 获取10年的数据
interval='1y', # 间隔为1年
stat_by_year=True # 开启按年度统计
)
print(df)
聚宽 API 文档参考
根据聚宽 API 文档中关于 get_history_fundamentals 的说明:
- stat_by_year:bool, 是否返回年度数据。默认返回的按季度统计的数据(比如income表中只有单个季度的利润)。
- 如果是
True:interval必须是'1y'- 如果指定了
stat_date的话,stat_date必须是一个代表年份整数、字符串,表明统计的年份,比如2019,'2019'。
- 如果是
通过上述修改,您就可以获取到茅台常年高于 20% 的真实年度 ROE 数据了!