3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
您好!关于在 JoinQuant(聚宽)平台中使用 ROE(净资产收益率)进行选股时遇到的差异和疑问,主要由数据单位、计算口径(TTM与单季度)以及年化处理三个方面的原因导致。以下是详细的解析:
roe > 0.2 还是 roe > 20 的误区您观察得非常敏锐!在聚宽的财务指标数据表(indicator)中,roe 字段的单位是百分比(%),而不是小数。
indicator.roe > 0.2。这实际上是在筛选 ROE > 0.2% 的股票,这会导致几乎全市场的股票都被选出来。indicator.roe > 20。这才是真正筛选 ROE > 20% 的股票。如果您在测试时使用了 roe > 20 并且只得到了 26 个结果,那么请看下面的计算口径差异解析。
这通常是因为财务数据的统计周期和计算口径不同导致的:
indicator.roe:默认情况下,如果您使用 get_fundamentals 并且按 date 查询,聚宽返回的是最新一期财报的单季度/累计 ROE。例如,如果当前是 5 月份,最新财报是一季报,那么 indicator.roe 就是一季度的 ROE。一个季度 ROE 就能超过 20% 的公司凤毛麟角(所以您只搜出 26 个)。如果您希望对标同花顺/东方财富的选股结果(即年度或 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())
总结:
%,大于 20% 应该写 > 20。indicator.roe_ttm > 20,而不是单季度的 indicator.roe。