问题描述
同样的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())
总结:
- 聚宽中 ROE 相关的指标单位是
%,大于 20% 应该写> 20。 - 想要获得与外部看盘软件一致的“全年 ROE > 20%”的体验,请使用
indicator.roe_ttm > 20,而不是单季度的indicator.roe。