🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

为什么在聚宽获取的茅台 ROE 数据偏低?如何正确获取年度 ROE?

joinquant | 发布时间: 2026/5/29
以下内容由 EasyQuant 生成。

问题描述

请问聚宽的 roe 数据计算口径是否与其他地方不同?

尝试获取茅台近十年的 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),需要满足以下几个条件:

  1. 设置 stat_by_year=True
  2. interval 必须是 '1y'
  3. 必须使用 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 数据了!