问题描述
解决方案
在 JoinQuant(聚宽)平台上,因子库中 PEG(市盈率相对盈利增长比率)值大量缺失的情况是广泛存在的,并且这确实是由**明确的特殊原因(算法定义限制)**造成的。
核心原因分析
根据 JoinQuant 官方 API 文档中关于成长因子的定义,PEG 的计算公式及特殊处理逻辑如下:
- 计算公式:
PEG = PE / (归母公司净利润(TTM)增长率 * 100) - 官方特殊处理逻辑:如果 PE 或 增长率为负,则为 nan。
这意味着,只要一家上市公司出现以下两种情况之一,其 PEG 因子值就会在聚宽因子库中显示为缺失(nan):
- 公司亏损:导致市盈率(PE)为负数。
- 业绩下滑:归母净利润(TTM)较上一周期出现负增长。
在 A 股市场中,处于周期底部、业绩短期下滑或本身尚未盈利的公司数量庞大,这就直接导致了在横截面数据上,PEG 因子会出现大面积的 nan 值。
其他次要原因
除了上述核心算法限制外,还有一些常规的财务数据原因会导致缺失:
- 上市时间不足:次新股可能缺乏足够的数据来计算 TTM(滚动十二个月)的利润增长率。
- 财报未披露:部分公司可能因各种原因未及时披露财务数据,导致基础依赖数据缺失。
量化策略中的处理建议
面对大量缺失的 PEG 数据,在编写量化策略时可以采取以下几种处理方式:
-
直接剔除(推荐):PEG 因子通常用于寻找“高成长且估值合理”的股票。既然 PEG 为
nan意味着公司亏损或业绩下滑,这本身就违背了 PEG 选股的初衷。因此,在选股逻辑中直接过滤掉 PEG 为nan的股票是最符合逻辑的做法。# 假设 df 是包含 PEG 因子的 DataFrame df = df.dropna(subset=['PEG']) -
行业均值填充:如果您在进行多因子打分或回归模型,必须保留这些样本,可以使用聚宽提供的数据处理函数进行行业均值填充。例如在使用
neutralize(中性化)函数时,利用fillna参数:from jqfactor import neutralize # 使用申万一级行业均值填充缺失值 neutralize(data, how=['sw_l1'], fillna='sw_l1') -
极值处理:在填充缺失值前后,建议结合
winsorize(去极值)函数,防止部分微利且微增长的公司产生极大的 PEG 值干扰模型。
总结来说,PEG 值的缺失是聚宽为了保证因子经济学意义而做的刻意设计,在策略开发时应将其视为“不符合成长股特征”的信号进行合理处理。