3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
您好!在 JoinQuant 平台上,使用 get_factor_values 获取的因子值与手动通过财务数据计算的值出现差异,通常是由计算口径(特别是 TTM 的定义)和数据快照时间引起的。针对您提到的达威股份(300535.XSHE)PEG 因子值的差异,主要有以下几个排查方向:
根据聚宽因子库的定义,PEG 的公式为:
PEG = PE / (归母公司净利润(TTM)增长率 * 100)
其中,归母公司净利润(TTM)增长率(因子代码:np_parent_company_owners_growth_rate)的严格计算公式是:
[今年归属于母公司所有者的净利润(TTM) / 去年同期归属于母公司所有者的净利润(TTM)] - 1
您手动查询到的净利润增长率 111.03%,很可能是单季度同比或者累计净利润同比(例如中报公布的累计同比),而不是严格的 TTM 同比。TTM(滚动十二个月)的计算需要将过去四个季度的净利润相加,然后再与往前推一年的四个季度净利润之和进行对比。这通常是导致手动计算与因子库结果差异最大的地方。
因子库在计算 PEG 时,分子使用的 PE 是 PE(TTM)。您通过 get_fundamentals_continuously 查询到的 PE 值为 20.4712,请确认查询的是 valuation.pe_ratio(市盈率 TTM)还是 valuation.pe_ratio_lyr(静态市盈率)。如果使用的是静态市盈率,也会导致结果不一致。
聚宽因子库文档中明确指出:
这意味着 9月23日 获取的因子值,实际上是基于 9月22日 收盘后的市值和当时能看到的最新财报(通常是中报)计算出来的快照。如果您手动查询时传入的日期参数或逻辑有微小偏差,市值(影响 PE)就会不同。
为了准确找出差异来源,建议您直接拉取因子库中用于计算 PEG 的两个底层因子:PE 和 np_parent_company_owners_growth_rate,看看因子库底层的数值究竟是多少。
您可以在研究环境中运行以下代码进行验证:
from jqfactor import get_factor_values
# 获取 2021-09-23 当天的底层因子值
factors = ['PEG', 'PE', 'np_parent_company_owners_growth_rate']
data = get_factor_values(securities=['300535.XSHE'],
factors=factors,
start_date='2021-09-23',
end_date='2021-09-23')
peg_val = data['PEG'].iloc[0, 0]
pe_val = data['PE'].iloc[0, 0]
growth_val = data['np_parent_company_owners_growth_rate'].iloc[0, 0]
print(f"因子库 PEG: {peg_val}")
print(f"因子库 PE: {pe_val}")
print(f"因子库 归母净利润TTM增长率: {growth_val * 100}%")
# 验证公式
calculated_peg = pe_val / (growth_val * 100)
print(f"底层因子相除计算的 PEG: {calculated_peg}")
通过上述代码,您大概率会发现因子库中的 np_parent_company_owners_growth_rate 并非 111.03%,而是另一个数值(大约在 263% 左右,假设 PE 为 20.47 的话)。在量化回测中,建议直接使用 get_factor_values 提供的因子值,因为它们经过了严格的截面清洗和对齐,能有效避免未来函数和口径不一的问题。