🚀 AI 一键生成 joinquant 策略代码

为什么聚宽 (JoinQuant) 的 ROE 选股结果与同花顺/东方财富不同?

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

问题描述

有一些关于roe的计算的疑问

同样的ROE大于20%,聚宽的结果是26个,dfcf和ths都是100多个,感觉结果差异有点大,这是怎么回事?平时我看大家使用ROE测试,代码注释写的净资产收益率大于20%,代码中很多都是用的 roe>0.2,这应该是不对的吧?

解决方案

您好!关于在 JoinQuant(聚宽)平台中使用 ROE(净资产收益率)进行选股时遇到的差异和疑问,主要由数据单位计算口径(TTM与单季度)以及年化处理三个方面的原因导致。以下是详细的解析:

1. 关于 roe > 0.2 还是 roe > 20 的误区

您观察得非常敏锐!在聚宽的财务指标数据表(indicator)中,roe 字段的单位是百分比(%),而不是小数。

  • 错误写法indicator.roe > 0.2。这实际上是在筛选 ROE > 0.2% 的股票,这会导致几乎全市场的股票都被选出来。
  • 正确写法indicator.roe > 20。这才是真正筛选 ROE > 20% 的股票。

如果您在测试时使用了 roe > 20 并且只得到了 26 个结果,那么请看下面的计算口径差异解析。

2. 为什么聚宽的结果(26个)与同花顺/东方财富(100多个)差异巨大?

这通常是因为财务数据的统计周期和计算口径不同导致的:

A. 单季度 vs TTM(滚动十二个月)

  • 聚宽的 indicator.roe:默认情况下,如果您使用 get_fundamentals 并且按 date 查询,聚宽返回的是最新一期财报的单季度/累计 ROE。例如,如果当前是 5 月份,最新财报是一季报,那么 indicator.roe 就是一季度的 ROE。一个季度 ROE 就能超过 20% 的公司凤毛麟角(所以您只搜出 26 个)。
  • 同花顺/东方财富:选股器中默认的“ROE”通常是 ROE(TTM)(过去连续四个季度的滚动 ROE)或者年化 ROE。全年 ROE 大于 20% 的公司通常有 100-200 家左右。

B. 摊薄、加权与扣非

  • ROE 有多种计算方式:全面摊薄 ROE、加权平均 ROE、扣除非经常性损益后的 ROE。不同平台在默认选股时采用的具体公式可能略有不同,这也会导致边缘数据的微小差异,但不会导致 26 vs 100+ 这么大的量级差。量级差的核心原因依然是周期口径(单季 vs 全年/TTM)

3. 如何在聚宽中正确获取 ROE > 20% 的股票?

如果您希望对标同花顺/东方财富的选股结果(即年度或 TTM 级别的 ROE > 20%),您应该使用 ROE(TTM)

聚宽的 indicator 表中直接提供了 roe_ttm(权益回报率TTM)字段。您可以这样编写代码:

from jqdata import *

def initialize(context):
    # 设定基准
    set_benchmark('000300.XSHG')
    # 每天运行一次选股
    run_daily(my_stock_filter, time='09:30')

def my_stock_filter(context):
    # 查询 ROE(TTM) 大于 20% 的股票
    # 注意:roe_ttm 的单位也是 %,所以用 20
    q = query(
        indicator.code,
        indicator.roe_ttm
    ).filter(
        indicator.roe_ttm > 20
    )
    
    # 获取财务数据
    df = get_fundamentals(q, date=context.current_dt.strftime('%Y-%m-%d'))
    
    # 打印选出的股票数量
    log.info(f"当前选出 ROE(TTM) > 20% 的股票数量: {len(df)} 只")
    # log.info(df.head())

总结:

  1. 聚宽中 ROE 相关的指标单位是 %,大于 20% 应该写 > 20
  2. 想要获得与外部看盘软件一致的“全年 ROE > 20%”的体验,请使用 indicator.roe_ttm > 20,而不是单季度的 indicator.roe