本文,笔者将介绍一个超级复杂的因子,这个因子来自中信建投陈升锐老师的研报《投资者有限关注及注意力捕捉与溢出》。
这篇研报中有多个因子,在此之前笔者对两个实现起来相对容易的因子进行了复现,在基于日常收益的注意力溢出,一个IC和分层回测俱佳的因子!和基于日常换手率的注意力溢出,效果会让人大吃一惊!这两篇文章中。
本文复现的因子叫做基于异常收益率的注意力捕捉,是一个超级复杂的因子,它考虑了涨跌停标的占比、Fama-French三因子模型和动量。
关于这个因子的逻辑,2025年的《因子日历》中是这样描述的,不同股票对同一市场关注度事件的反映程度往往是不同的,可借助个股收益对市场关注度事件的敏感程度来衡量股票对该事件的注意力捕捉效应;捕捉能力越强(敏感程度越高),表明个股更能吸引市场注意,从而导致买盘压力增大,股价高估;上述因子以异常收益占比作为市场关注度事件,极端日收益率是衡量关注度的一个重要指标。出现较高或较低收益都代表关注度高。
计算步骤和代码
从计算步骤来看,这个因子就是一个时序回归。
但是,不得不说,它真的很复杂。
1
计算步骤
以标的的日收益率为被解释变量,以涨跌停占比(可以是全市场的,也可以是标的所属行业的)、市场收益率、SMB因子收益率、HML因子收益率和UMD因子收益率。
其中,SMB因子收益率和HML因子收益率的计算方式和Fama-French三因子模型一致;而UMD因子收益率则是用过去12个月到过去1个月的收益率排序,然后用前30%标的组合的收益率减去后30%的。
2
代码
def __call__(self):
第2-5行,读取行业数据,并确定开始时间和标的数量。这样,后面读取行情和估值数据就能直接对齐了。
第6-8行,读取行情数据,这次除了读取收盘价和复权因子,还读取了涨停价和跌停价。
第9-10行,计算全市场涨跌停标的的占比。
第11-13行,计算日频收益率和动量因子(UMD)。
第14-16行,读取了pb和市值数据用来计算Fama-French三因子模型中的市场收益率、SMB因子收益率和HML因子收益率。
第17-20行,调用cal_premium方法计算因子溢价(因子收益率)。
第21-25行,用BaseDataLoader类将因子溢价的dataframe转换为多个数据透视表。
第26-29行,调用cal_beta计算最后的因子。
def cal_premium(self, idx):
第2行,确定当前计算的时间戳。
第3-6行,拼接数据计算行业中涨跌停标的的比例。
第6-10行,计算UMD因子的因子溢价和市场收益率。
第11-14行,计算SMB和HML因子的因子溢价。
第15行,将series转换为dataframe。
第16-21行,插入计算的结果。
@staticmethod
这个方法计算行业涨跌停占比,比较简单。
def cal_umd_premium(self, data):
这个方法计算UMD因子的因子溢价。
第2行,去掉nan值。
第3行,按照umd因子排序。
第4行,计算30%的标的数量。
第5-7行,计算UMD因子溢价和市场收益率。
def cal_fama(self, data):
SMB和HML因子溢价的计算和UMD的其实是类似的,唯一需要理解的就是Fama-French的原理。当然,笔者的实现和最初的Fama-French不同,笔者是按照全市场每日的pb和市值来计算,Fama-French是按照一个固定的时间(一年一次)重新计算分组然后,并且标的池可以是沪深300。
@staticmethod
这个方法是为了避免重复代码写的,也很简单。
def cal_beta(self, idx):
最后就是时序回归部分了,这部分最近介绍了很多次了,也不赘述了。
因子评价

从相关性来看,用全市场涨跌停标的占比和行业内涨跌停占比计算的因子相关性不高。
从IC上来看,两个因子是差不多的,分层回测区别较大,但是都不好。所以,这里就简单展示一下ind因子的评价结果了。
01
IC分析







02
回归分析


03
换手率分析


04
收益分析


这个因子没啥好总结的了,毕竟它的复杂程度就能阻止大部分人使用它了。
不过,从学习的角度来看,复现一下这个因子对个人能力的提升还是有一些的,如果对量化感兴趣又不知道怎么上手的话,可以尝试以下从复现这种复杂的因子开始。