找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4230

积分

0

好友

586

主题
发表于 1 小时前 | 查看: 3| 回复: 0

这次我想复现一个来自兴业证券金工首席郑兆磊老师的因子,源自他于2022年8月29日发布的研报《高频研究系列四:成交量分布中的Alpha》。

此前,我已经尝试过这篇研报里的几个因子,比如与同价成交量相关的,以及一系列关于成交量分布的Alpha因子。今天的主角是成交量极大值分布因子。(研报中还有个成交量分桶熵因子,我还没介绍)

为什么把这个因子留到了一年之后?因为一年前,我也没太搞明白它的计算逻辑。即便是现在,我也不能说完全吃透了,更多是凭着对方法的理解和感觉尝试了一遍。不过,从结果看效果并不差,所以值得写篇文章分享一下。

值得一提的是,同价成交量和成交量分桶熵这两个因子在《因子日历》上是出现过的,但成交量极大值分布这个因子一直没有。我这次尝试也算是一次小小的探索。

关于这个因子的具体逻辑,研报用了大半页来阐述,这里就不全文引用了。我只摘录其中一句核心观点:

因子值越大,说明该股在近一段时间内成交量极大值的分散程度较大,股价曾经或正在出现成交量多次过大,或极值差异明显。此时个股不稳定性极高,整体下行风险较大。

计算步骤与代码实现

说实话,研报里并没有给出像烹饪食谱一样具体的计算步骤,只是提到了会用到Bootstrap重采样这个方法。

我对这个方法还算熟悉,它的核心就是从原始数据中有放回地随机抽取样本,重复多次(比如n次),然后计算这些抽样数据的统计量(如均值)。一个有趣的性质是,当n足够大时,任何一个原始数据点大约有1/e的概率从未被抽中。

基于对研报描述的理解,我梳理了以下实现思路:

1. 总体分析

  1. 第一步:对每个股票的分钟成交量序列进行Bootstrap重采样,以得到“极大值样本数据”。这里我有个疑惑:是按成交量占比加权采样,还是等权采样?如果是等权,如何体现“极大值”的采样倾向?研报没说清楚,我暂时按照等权采样来实现。
  2. 第二步:将采样得到的数据减去其自身的均值后,再计算这些“中心化”后数据的均值,得到第一个因子。该值越大,理论上说明该股票成交量极值出现的次数相对较多,且骤增的量较大。
  3. 第三步:同样是“中心化”后的数据,计算其标准差,得到第二个因子。该标准差越小,说明该股票成交量极大值的量级相对均衡,极值部分差异较小。

2. 代码

实现的关键在于Bootstrap重采样。好在pandas库提供了便捷的sample方法,让代码不至于太复杂。

def process_single_day(self, idx):
    # 加载当日分钟数据
    file_name = self.files[idx]
    date_str = file_name.split('.')[0]
    cur_time = pd.to_datetime(date_str) + timedelta(hours=15)
    file_name = self.files[idx]
    full_path = os.path.join(self.file_pth, file_name)
    data = BaseDataLoader.load_data(full_path, fields=['volume']).to_dataframe('volume')
    resample_data = []
    for i in range(1000):
        new_data = data.iloc[:]
        resample_data.append(new_data.sample(2400, replace=True).mean())
    resample_data = pd.concat(resample_data, axis=1)
    resample_data = resample_data - resample_data.mean(axis=1).values.reshape(-1, 1)
    res = [resample_data.mean(axis=1), resample_data.std(axis=1)]
    res = pd.concat(res, axis=1)
    res.columns = ['resample_mu', 'resample_sigma']
    res['datetime'] = cur_time
    return res
  • 第1-8行:读取指定日期的分钟成交量数据。
  • 第9-12行:执行Bootstrap重采样1000次。每次采样2400个数据点(假设一日有240分钟),并计算这次采样数据的均值。循环结束后,得到一个包含1000个“采样均值”的数据集。这里也有另一种理解:先将所有重采样的原始数据拼在一起,再整体做中心化和计算统计量。理论上我应该都尝试一下,但单次计算就需要近10小时,时间成本太高了。

因子评价

这两个因子的相关性几乎为0,所以相关性图就省略了。

研报中提到,使用过去15个交易日的标准差将因子低频化。为了与我之前的所有因子评价标准保持一致,我选择了过去21个交易日的标准差。

从IC分析来看,两个因子的表现比较接近。因此,在展示具体的收益分析前,我将主要展示 resample_sigma 这个因子的评价结果。而在收益分析部分,则会同时展示两个因子的表现。

01 IC分析

因子IC时间序列图,蓝色为每日IC,橙色为21日移动平均IC

IC累计值曲线图,展示max_cumsum与min_cumsum

月度IC_IR柱状图,展示各年各月的IC信息比率

月度IC均值柱状图,展示各年各月的平均IC

年度IC_IR柱状图

年度IC均值柱状图

从IC来看,这个因子在2018年至2020年间表现出一定的有效性,但自2021年起,效果似乎开始减弱甚至失效。这种随时间变化的现象在因子挖掘过程中很常见,值得深入分析其失效的原因。

02 回归分析

因子收益率时序图,包含原始收益率与21日移动平均

因子收益率累计曲线图

03 换手率分析

各分组平均换手率柱状图

各分组平均行业换手率柱状图

04 收益分析

首先看 resample_sigma 因子(使用标准差低频化)的分层回测结果:

分层回测净值曲线(全分组)

分层回测净值曲线(多空组合)

从分层回测来看,主要的超额收益是在2020年积累的。resample_mu 因子的表现也类似:

resample_mu因子分层回测净值曲线(全分组)

resample_mu因子分层回测净值曲线(多空组合)

即使是使用均值(而非标准差)进行低频化处理的 resample_sigma 因子,其表现也差不多。(而 resample_mu 因子用均值低频化则效果不佳)

低频化方式变更后的分层回测净值曲线(全分组)

低频化方式变更后的分层回测净值曲线(多空组合)

由于这次复现包含了较多基于个人理解的猜测和尝试,其结果必然与原始研报存在出入。不过,这个过程本身对于理解大数据背景下的复杂因子构建逻辑很有帮助。复现顶尖机构的研报确实很烧脑,但也充满了挑战和乐趣。希望这份带有实践性质的复盘,能为同在量化领域探索的朋友们提供一些不一样的视角和启发。如果你对这类因子的构建、回测以及更深入的数据分析话题感兴趣,欢迎在云栈社区交流讨论。

— END —




上一篇:《洛克王国:世界》上线前瞻:魔方工作室如何用工业化产能与长线生态留住5000万玩家?
下一篇:IP配置底层解析:系统自动生成的3类路由与报文收发通路详解
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-15 20:22 , Processed in 0.457269 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表