基于日常收益的注意力溢出,一个IC和分层回测俱佳的因子!

基于日常收益的注意力溢出因子!中信建投研报复现,IC和分层回测俱佳的量化因子。计算每月平均异常收益率作为注意力代理指标,行业+市值分组计算注意力溢出程度,IC稳定超过0.08,分层回测完美单调性。

经过了一段时间的邪修之后,笔者觉得暂时回归正道,继续复现研报中的因子。

本文复现的研报来自中信建投2024年发布的《投资者有限关注及注意力捕捉与溢出》。

这个因子的计算都是基于日频数据的,但是它的计算一点儿也不简单。

首先,从数据上来说,这个因子的计算除了用到了量价数据外,还用到了行业数据和市值数据。值得一提的是,研报中的行业数据是中信一级行业,但是笔者只能弄到申万一级行业的数据,所以笔者是基于申万一级行业的数据来计算这个因子的。

计算步骤

这个因子计算步骤分成两步。

第一步,计算每月平均异常收益率作为注意力代理指标。从数学上来说就是,过去21个交易日的(标的日收益-截面上所有标的日收益的均值)平方的均值。

第二步,计算当期相近股票的注意力均值与个股注意力之差即为注意力溢出程度。这里相近的股票确定标准是这样的,先按照行业分类,然后在每个行业里按照大、中、小市值进行分类。其中,大市值和小市值占比30%,中市值占比40%。

下面,结合代码,深度了解一下这个因子。

代码

def __call__(self):

这一次的因子计算主要通过3个方法来实现,先来看看第一个方法的代码。

第2-3行,读取行业数据,因为笔者的行业数据是从2010年1月4日开始的,所以先读取行业数据,然后其他数据按照行业数据的时间进行读取。

第4行,就是根据行业数据获取数据的起始时间。

第5行,获取行业数据覆盖的标的。

第6-7行,读取日频行情数据,这里传入的lag是为了计算后的注意力是从2020年1月4日开始的。

第8-10行,就是执行上述步骤中的第一步,计算一个注意力。

第11-12行,读取市值数据。

第13-16行,并行调用cal_factors方法来计算因子。

def cal_factors(self, idx):

第二个方法比较简单,就是将同一个交易日的行业、市值和注意力因子的数据拼接为一个dataframe,然后通过对行业进行group_by来执行__cal_factors__方法来计算最后的因子。

@staticmethod

第3行,对group_by之后的数据按照市值进行排序。

第5-12行,就是执行计算步骤中的第二步了。

这里需要注意的是第10行,按照研报中的意思应该是tmp_group['attn'].mean()-tmp_group['attn']。笔者弄反了,不过也就是乘上一个-1的事情,对最终的因子评价其实是没有影响(仅仅影响因子的方向)的。

因子评价

IC分析

回归分析

换手率分析

收益分析

总结

由于这个因子在计算的时候已经用到了过去21个交易日的数据了,所以我们认为计算出来的就是月频的因子了,不再需要用过去21个交易日的均值或者标准差来合成了。

从IC上来看,这个因子的IC绝对值是不错的,几乎每一年都超过了0.08。

从分层回测上来看,这个因子可以说是依旧优秀,多空收益不错。同时,在2021年开始,净值曲线相交的情况也大幅减少。最后,在整个回测区间,也表现出来完美的单调性。

好了,这个因子的介绍到这里也就结束了,想必各位大佬会有一个疑问。

这么复杂的操作,带来的提升是什么?

如果直接用注意力因子,会得到什么样的结果?

如果计算相似股票的时候只考虑行业,不考虑市值又会是怎么样的?

由于篇幅问题,这些疑问笔者将在下一篇文章中揭晓。如果您对这几个问题感兴趣,不妨星标一下本公众号,这样下次更新的时候就可以第一时间看到推送咯。