×

让AI总结研报,结果它给我瞎编了一堆因子!没想到,这分层回测单调性有点完美!

wang wang 发表于2026-07-15 23:42:51 浏览1 评论0

抢沙发发表评论

让AI总结研报,结果它给我瞎编了一堆因子!没想到,这分层回测单调性有点完美!

残差累积因子

上次,笔者复现了中信建投姚紫薇和陈升锐的当天筹码盈利占比这个因子,有大佬留言说紫薇老师的因子都很不错的。

于是,笔者突发奇想,让AI来找一找姚老师和陈老师的研报,然后有一篇叫作《“逐鹿” Alpha 专题报告 (二十八)—— 分钟因子模型》吸引了笔者的注意力。

但是,找了半天没找到可以看原文的地方,只好让豆老师总结一下这篇研报中的因子,结果它给了我四大类一共12个因子。

作为一个懒人,笔者就不转述了,直接贴图,感觉各位大佬看着也方便点。

本文,笔者要介绍的因子是第四类分钟跨期残差因子中的第三个,量残差累积因子

计算步骤和代码

豆老师给的因子构造很简单,就一句话,每分钟成交量相对近20日同期分时成交量残差求和。

1

计算步骤

对于这句话,笔者的理解是:以当日某分钟成交量为被解释变量,过去20个交易日同分钟成交量为解释变量进行截面回归,然后计算残差。

然后,将当日240个残差进行求和得到日频的因子。

2

代码

def process_single_day(self, idx):    if idx < 20:        return pd.DataFrame({})    file_name = self.files[idx]    date_str = file_name.split('.')[0]    vol = []    for i in range(idx - 20, idx + 1):        file_name = self.files[i]        full_path = os.path.join(self.file_pth, file_name)        data = BaseDataLoader.load_data(full_path, fields=['volume'])        vol.append(data.to_dataframe('volume'))    res = self.cal_lr(vol)    res.name = pd.to_datetime(date_str) + timedelta(hours=15)    return res

第一段代码,主要就是读取过去21个交易日的成交量数据,然后调用cal_lr计算残差。

def cal_lr(self, data):    data = pd.concat(data)    data['minute'] = data.index.hour * 60 + data.index.minute    data = data.groupby('minute', as_index=False, group_keys=False).apply(self.__cal_lr__)    data = data.drop(columns=['minute'])    return data.sum()

cal_lr主要是计算分钟,然后按照分钟聚合,并调用__cal_lr__计算残差。

@staticmethoddef __cal_lr__(group):    codes = group.columns.tolist()    y = group.iloc[-1].values    x = group.iloc[:-1].fillna(0).values    flag = ~np.isnan(y)    x, y = x[:, flag].T, y[flag]    lr = LinearRegression()    lr.fit(x, y)    resi = y - lr.predict(x)    return pd.Series(resi, index=np.array(codes)[flag])

__cal_lr__是整个因子计算的核心。

第3行,获取标的列表。

第4行,获取当日某分钟的成交量,作为被解释变量y。

第5行,获取过去20个交易日同分钟的成交量,作为解释变量x。同时,对解释变量为nan,即存在停牌的情况,用0填充。

第6-7行,去掉被解释变量为nan的标的。

第8-11行,计算残差。

因子评价

在因子评价的时候,笔者分别尝试了均值和标准差两种不同的低频化方式。

用均值低频化,IC绝对值最高的一年是2019年,绝对值刚超过0.06。

用标准差低频化,IC提升了一点,2019年的绝对值超过了0.08。

同时,两者的分层回测看起来不是很差,但是又不完美。于是,笔者进行了一个大胆的尝试,用均值/标准差进行低频化,也就是常说的变异系数。

没想到,这样一处理,不仅IC更高了一点,而且分层回测看起来也更好了一点。

01

IC分析

02

回归分析

03

换手率分析

04

收益分析

上面是均值/标准差的分层回测结果,看起来单调性不错。但是其区分度是在2021年上半年之前建立起来的,后面这一段时间,不同组之间的区分度并没有扩大,这与IC的表现基本一致。
从2021年开始,该因子的IC均值估计只有-0.035左右。
为了对比,笔者将展示一下用均值或标准差低频化的分层回测结果。
先是用标准差低频化的。
其表现为group_1好于group_0,group_3好于group_2。
同时,如果看group0-group4的多空收益的话,也是比上面的均值/标准差要差的。
最后来看看用均值低频化后的分层回测结果。
这个分层回测的缺陷就是中间组的表现在有些时候是最好的,而且它用group0-group4的多空收益将是三者之中最低的。

总结

本来是想让豆老师总结研报的,结果它出现了幻觉,给我弄出来12个因子。

笔者挑了其中一个想法不错的因子进行了尝试,没想到效果还可以,就是不知道这个因子是别的研报或者论文当中的,还是豆老师自己创造的了。

又是一次歪打正着,这个因子至少在整个回测区间里表现出来完美的单调性,和一些研报的因子相比,这个分层回测结果可以说是炸裂了。但是,它最近几年有点失效。

不知道各位大佬能否通过点赞关注推荐和分享的方式来支持一下笔者呢

谢谢大家!

END -