社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

周末深研究:因子选择,7 个方向胜过 N个因子!机器学习里的特征因子要怎么选择?!

窥市寻真 • 16 小时前 • 15 次点击  

因子选择:7 个方向胜过 N个因子

创作|程飞
编辑|程飞
正文共:9,842字
含 38 张配图
预计阅读时间:25分钟

目前QMT躺平还有少量位置,需要100W以上,懂的私我~

这不,大晚上的,一个朋友把一份报告甩给我,语气很像失恋:他用了两百多个因子,跑了梯度提升树,特征重要性排出来前十名清清楚楚,样本内漂亮得像教科书,上了真实资金之后,曲线立刻变成一条向下的小斜线。

他问我一句话:到底该怎么选因子。

这个问题我认真算了一遍。不是算他的模型,是我自己从零搭了一遍:本地全 A 数据,4620 只证券,4077 个交易日,2011 年 4 月到 2026 年 6 月,每 20 个交易日切一个截面,一共 186 个截面,在这个面板上构造 20 个只用价格和成交额就能算出来的因子,然后把「选因子」这件事的每一个环节都拆开验一遍。

先说结论,因为它跟大多数教程写的不一样:

把这 20 个因子按强弱排序、逐个等权加进去,最好的一次是 2 个因子,信息比率 0.807。而其中最强的单个因子,自己就有 0.809。也就是说,认真做的加法,结果比不做还差。

但把这些因子先互相剔除、只留下彼此不重复的部分,7 个方向就能做到 1.039,比最强单因子高 28.4%。

所以这篇的答案是:因子选择不是一道加法题,是一道减法题。你真正要选的不是「哪些因子好」,是「哪些因子还不重复」。后面十节,我把这 28.4% 是怎么来的、以及它有多脆弱,一层层拆给你看。

01

先把尺子造出来,然后我差点被自己骗了

口径不清楚的结论,等于没有结论

在选因子之前,得先定一件事:用什么衡量一个因子好不好。这件事上,行业里已经有一套很成熟的尺子,叫信息系数,简称 IC。它的意思是:在同一个时间点上,把所有股票按这个因子的值排个队,再按它们后来的表现排个队,看两个队伍的顺序像不像。

完全一样是 1,完全相反是 -1,毫无关系是 0。IC 只关心顺序,不关心幅度,所以它不会被几只暴涨暴跌的票带偏。

然后是这一节真正想说的部分:我在这套流程上,被自己坑了一次。

第一次跑完,结果是这样的:20 日均线偏离度这个因子的 IC 是 -0.8019。我看到这个数字的第一反应不是高兴,是后背发凉。因为这意味着一个只用收盘价和均线算出来的东西,几乎能完美预测未来 20 天的涨跌。这种东西不存在。它要是存在,市场早就没了。

我去查代码,发现是一个低级到不好意思说的错误:我写了一个取数函数,取「过去 N 天」和取「未来 N 天」的正负号搞反了。于是所有的动量因子算出来的是未来涨跌,而所有的「未来涨跌」算出来的是过去涨跌。拿过去和未来对撞,当然能撞出 -0.80。

这个函数错在哪里,值得单独看一眼。它长这样:取「第 t 天的未来第 k 天」,原本应该写成 out[t] = M[t+k],我写成了 out[t] = M[t-k]。一个减号,损失了一整晚。

我把这个经历写出来,不是为了坦白,是想说一个更重要的判断:当你的回测结果好到不合理的时候,问题几乎一定在你的代码里,不在市场里。这一条比任何因子都值钱。它救过我不止一次。

修好之后,20 个因子的 IC 长这样。横轴是 IC 均值,柱子朝左代表这个因子值越大、后面表现越差。

最强的不是动量,也不是波动率,是成交额(图里那个 lnA):IC 均值 -0.1137,意思是成交额越大的票,后面 20 天表现越差。最弱的是 60 日峰度,IC 只有 +0.0053,基本等于没有。

这个名单本身没什么惊喜,大部分做量化的都能猜到个大概。真正有意思的东西,藏在「0.11 这个数字到底算大还是算小」这个问题里。

02

0.11 的 IC 到底算不算数

拿 100 个瞎编的因子当对照组

0.11 听起来很小。你在任何一篇讲机器学习的文章里,都看不到谁会为 0.11 的相关系数欢呼。但金融数据的相关系数和别的地方不一样,它天生就小,因为里面全是噪声。

要判断它大不大,最好的办法不是跟别的领域比,是跟自己比。我生成 100 个纯随机因子,每个都跟真因子一样做横截面排名,一样对撞未来 20 天涨跌,看它们能撞出什么来。

100 个随机因子的 IC 全部挤在 0 附近,标准差 0.0014,绝对值最大只有 0.0036。而最强的真实因子是 0.1137,是随机波动水平的 79 倍。

这就是「显著」这个词在这里的真实含义。不是 0.11 很大,是噪声比你想的小得多。186 个截面、每期三千多只股票,这个样本量足以让 0.0014 的随机波动被压到很窄,所以哪怕 0.02 的 IC,都可能是真的。

但也正因为如此,这里有个陷阱:样本越大,越容易把「微不足道」判成「显著」。186 期下来,很多 t 值能到 5 以上,可它们的 IC 只有 0.02。这在统计上完全正确,在交易上完全没有意义。所以我在后面所有比较里,都不看 t 值,只看两件事:IC 多大,以及稳不稳。

这张箱线图是每期 IC 的分布。你会发现有些因子很有意思:均值看着不大,但箱子很长,说明有的年份它极强,有的年份它完全失灵。这种因子在报表上很好看,用起来很难受,因为你永远不知道自己处在它的哪一段。

03

IC 和 ICIR 是同一把尺子,这不是好事

换一个指标,名次变了,但信息没变

做量化的人一定听过一个说法:不要只看 IC,要看 ICIR。理由是 IC 高但忽高忽低的因子不能用,ICIR 才是把「稳」算进去的那个数。ICIR 的定义是 IC 均值除以 IC 的标准差。

这个说法对不对?对。但它有个前提被忽略了。如果所有因子的 IC 标准差都差不多,那 ICIR 就是 IC 乘一个常数,两者是同一把尺子。排序会变,但你拿到的信息完全一样。

换成 ICIR 排序,名次确实变了。成交额波动的 IC 只有 -0.0548,排不到前面,但它的 ICIR 是 -0.809,是全场最高的绝对值,因为它每一期几乎都是负的,几乎不翻正。而市值的 IC 最强(-0.1137),ICIR 只有 -0.709。

听起来是两回事。但把两个数画在一张图上,你就明白它们关系有多近。

20 个点几乎贴着一条斜线。这是一条用平均标准差画出来的参考线,实际点虽然散,但基本沿着它走。这说明在这 20 个因子上,「用 ICIR 代替 IC」并没有带来新的判断维度,它只是把同一件事换了个说法。

这里想说的不是「ICIR 没用」,是另一个更普适的道理:两个指标如果高度相关,同时看它们不会让你更安全,只会让你更自信。而自信,是量化里最贵的一种错觉。

04

因子会馊,但馊的速度不一样

这条决定了你多久调一次仓,不是选哪个

因子的有效期不一样。有的因子今天算出来,明天就没用了,这叫短期反转。有的因子能管 1 年,这叫长期价值。我把同一个因子的 IC 分别对 5 天、10 天、20 天、60 天的未来表现各算了一遍。

灰线是全部 20 个因子,彩线是挑出来有代表性的 8 个。一眼能看出两件事:

第一,大部分因子的有效期在 20 天附近见顶。5 天太短,噪声占主导;60 天太长,信息被稀释。第二,峰值的形状差别很大。有的走平,有的断崖。

为了把形状量化,我算了一个比值:60 日的 IC 绝对值除以 20 日的 IC 绝对值。大于 1 表示越拿越强,小于 1 表示会衰减。

两根最极端的是:非流动性因子 1.47,拉长到 60 天反而更强;20 日动量 0.88,越拿越弱。这两个数字的价值不在排名,在于它们告诉你两件完全不同的事:前者适合慢,后者适合快。你如果用同一套换手频率去跑所有因子,等于逼所有人穿同一码的鞋。

下面是三个因子的 IC 时序。这是我最喜欢看的一类图,因为它能暴露「这个因子到底是一路有效,还是只在某一段有效」。

市值因子:常年为负,但中间翻正过一段。翻正的那一段是 2017 年前后,那两年大票跑赢小票,风格反过来了。如果你在 2016 年底看到它「失效」就把它删掉,你会错过后面十几年的持续有效。

成交额波动:均值不亮眼,但几乎没有翻正过。这就是 IR 高的来源,不是强,是稳。

20 日动量:2015 年前后像是两个不同的因子。2015 年上半年它一度接近零,那是极端行情里所有票同涨同跌,排序失去意义。这种「因子在极端市况下失效」不是缺陷,是量价因子的通用属性。你没办法在造因子的时候把它修掉,只能在用的时候知道它会在什么时候骗你。

05

最狠的一刀:把它跟别人互相剔除

这一节是全文的转折点

前面四节都在说「单个因子好不好」。但真正决定你要不要它的,不是它好不好,是它跟已有的那些,有多像。

做法很简单:每一期,把所有股票按每个因子排成 0 到 1 的分数,然后两两算相关。186 期算完取平均,得到一张 20 乘 20 的表。

红是正相关,蓝是负相关。这张图看着花,但有两个地方很扎眼:左上角那几个动量因子互相之间全红,20 日、60 日、120 日、250 日动量,四兄弟几乎是一回事;中右下那一块成交量相关的因子也是红的,成交额比率、成交额波动、量价相关,也在互相解释。

190 个因子对的相关系数分布是这样的:

平均相关系数 0.247,看起来不高。但有 11 对超过 0.7,26 对超过 0.5。0.7 是什么概念?在统计上,两个相关系数 0.7 的变量,其中一个能解释另一个 49% 的变异。在选因子的语境里,这就该当成同一个因子处理。

最像的一对你看一眼就懂:20 日动量 和 20 日均线偏离,本质是同一件事。一个算「今天比 20 天前涨了多少」,一个算「今天比 20 天平均高了多少」,分子分母都在说同一句话。你写两个因子,跑两遍回测,得到两份「独立验证」,其实只验证了一次。

这就是我要说的「最狠的一刀」。具体的做法是:每一期,把每个因子对「其余 19 个因子」做一次横截面回归,只留下回归残差。残差的意思就是「这个因子里,别的因子解释不了的那部分」。然后把残差当成新因子,重新算 IC。

浅蓝是原始,红色是剔除之后。差距大得不像话。整体上,20 个因子的 IC 绝对值加起来,剔除后只剩 18.3%,蒸发了 81.7%。

按单个因子看保留比例:

除了一个特殊情况,其余 19 个全部都掉到 40% 以下,大半在 15% 以内。那个特殊情况是 60 日峰度,它原始 IC 只有 0.0053,分母太小,比值失去意义,剔除后反而变大了。这正好示范了另一件事:比值类指标在分母接近零的时候会骗人,所以要同时看绝对值。

用信息比率画同样的对比,会看到一个很干净的形状:

所有点都落在虚线下方。没有一个例外。虚线是「剔除后不变」的意思,现实中不存在这样的因子,因为你不可能找到一个跟其他 19 个都完全无关的量价指标。

这一张图就是「因子共线」的完整代价:你以为你手里有 20 个因子,实际上大约只有 3.7 个。(20 乘以 18.3%)

所以在评估一个新因子的时候,我的习惯是先问一个问题,而不是先看它的 IC:

横轴是「它跟你现有因子里最像的那个有多像」,纵轴是「它有多强」。左下角那一堆是「又弱又像」,用不着。右上是「又强又像」,这种最容易骗人,因为它数据好看,实际上只是你已有因子的复读机。真正值得加的是左上角:不强,但不重复。

06

分层是最直观的证据,也是最容易骗人的

十组柱子好看,不等于因子能用

行业里还有一个几乎人人都画的图:把股票按因子值分成十组,看每组的平均表现。它的好处是直观,坏处也是直观,人天生就喜欢看台阶,哪怕这个台阶是随机堆出来的。

市值因子(成交额代理)的十组,几乎是一条直线往下。这是最难得的一种形状,因为它是单调的,不是靠两头撑起来的。很多因子只在第一组和第十组有差异,中间八组乱成一团,那种因子的可用性要打对折。

成交额波动,最高那一组明显更差,前面九组比较平。这种形状说明它主要在识别「最极端的异常」,而不是在做连续排序。

20 日动量,越往上越差,最后一组跌得最狠。这张图值得多看几秒,因为它讲的是 A 股最稳定的一个统计事实:短期涨得多的票,后面倾向于跑输。注意这只是统计倾向,不是规律,更不是操作提示。

非流动性因子,越难成交的越强,单调性 0.920,是全场最高。但这一类因子有个致命问题:它的强度很大一部分来自「你根本买不到」。研究价值和执行价值是两件事。

距 250 日高点这个因子,形状很乱。它的 IC 只有 -0.0179,本来就不强,分层图也证实了这一点。这种因子在筛选阶段就该被淘汰,不该等到组合之后才发现它没用。

把所有因子的单调性排一下,你就得到了一个比 IC 更严格的门槛:

好的因子单调性绝对值在 0.8 以上,勉强能用的在 0.5 到 0.8,低于 0.3 的基本可以不要。按这个标准,20 个里有一半不达标。

这是把方向调对之后的净值。最强的那个,15 年翻了 3 倍多。但我要提醒一句:这条曲线是「高分组减低分组」的价差,它是一个研究口径,不是任何人能拿到的结果。真实世界里,你要扣掉交易成本、冲击成本、还有你根本借不到券的那部分。这类曲线的正确读法是「这个因子在方向上是不是持续有效」,不是「能赚多少」。

07

加法的两种命运

同样 20 个因子,两条完全相反的路

现在到了最核心的地方。假设你已经把 20 个因子都算好了,接下来怎么组合?行业里最常见的做法是:按强度排序,从强的开始一个个加进去,看组合表现怎么变。

组合 IC 从 1 个因子时的 0.1137,一路到 20 个时是 0.1106。加了 19 个因子,组合 IC 反而略降。中间有点小起伏,但整体就是一条横线。

换信息比率看,稍微乐观点,但也只是稍微:

最好的一次是 2 个因子,0.807。而全场最强的单个因子,是 0.809。

这就是「加法」的真实结果:你辛辛苦苦又造了 19 个因子,最后的组合比最强的那个单独用,还低了 0.002。统计学上这叫没有增益,工程上这叫白干。

为什么会这样?因为你的因子高度同源。20 个因子,81.7% 的信息是重复的,等权相加等于把同一句话说 20 遍。说 20 遍不会让它更真,只会让最好听的那一句被稀释掉。

那如果把重复的部分先剔掉呢?我用第六节那套正交残差,重新做了一遍同样的「逐个加入」实验:

灰线是原始因子直接相加,红线是剔除后再相加。两条线从同一起点出发,走向完全不同。

剔除后:2 个方向 0.834,4 个 0.883,6 个 1.017,7 个 1.039 见顶,之后一路回落到 20 个时的 0.822。

1.039 对比全场最强单因子的 0.809,高 28.4%。这是我在这 20 个因子里找到的唯一一个真实增益,而且它来自减法,不来自加法。

剔干净之后,还能自己站住的就这几个:20 日波动率的残差最强,成交额波动的残差紧随其后。而原始 IC 最强的市值因子,剔除后几乎什么都不剩(残差 IC 只有 -0.0060),因为它的信息被别的因子吃干净了。

注意「7 个之后开始回落」这个形状。它说明多因子组合存在一个最优规模,超过之后,新加入的因子带来的噪声比信息多。这个数字在别的数据集上会变,但「存在一个最优点」这件事,我认为是普遍的。

08

权重和样本外:最后两个问题

一个几乎不重要,一个至关重要

组好因子之后,接下来是给每个因子分权重。这部分在教程里往往占很大篇幅,什么等权、IC 加权、ICIR 加权、最大化信息比率、机器学习调优。我四种都试了。

四种方法的组合 IC 分别是 0.1142、0.1195、0.1185、0.1142。最好的和最差差 0.0053,相对差距 4.6%。在真实交易里,这点差距还不够付一个月的手续费。

净值曲线几乎贴在一起。所以我一直认为,权重方法是因子研究里性价比最低的一块。你在权重上花两周调出来的东西,不如在因子正交性上花两天。

但样本外这件事,重要得多。用前一半时间(2011 年 4 月到 2018 年 11 月)选出 8 个因子,然后完全不改,只看后一半。

这 8 个因子样本外平均保留了 95.3%。这个数字看起来很像好消息,但从研究的角度看,它其实是个混合信号。

好的一面:说明这些量价因子没有躲起来,它们不是过拟合出来的鬼东西,是市场结构里真实存在的规律,换了时间段还在。坏的一面:既然它们这么稳,说明它们也这么老。一个十几年都没变的规律,意味着它已经被无数人验证过、用过。稳定性本身就是拥挤度的另一面。

09

五个没人告诉你的体检维度

IC、IR、分层之外的筛子

常规流程到这就结束了。但我又加了五个维度,每一个都能筛掉一批看起来没问题的因子。

第一个:这个因子最近灵不灵,能预测它下期灵不灵吗?

我算了每个因子 IC 序列的一阶自相关。结果全部落在 -0.14 到 +0.02 之间,基本等于没有记忆。

这一条把「因子动态轮动」的统计基础直接抽掉了。如果你没法用「过去 12 期这个因子表现好」来预测「下一期它表现好」,那么所有基于历史表现分配权重的轮动方法,本质上都是在追噪声。

第二个:它在涨的时候有用,还是跌的时候有用?

按未来 20 天全市场中位表现的正负,把 186 期分成上涨期(45.2%)和下跌期。绿柱是涨期,红柱是跌期。你会发现明显分家:有些因子在跌期更强,有些在涨期更强,两边都强的很少。

第三个:同一个因子在大票和小票里,是不是同一只因子?

答案是不是。比如 20 日波动率,在大票组里 IC 是 -0.0895,在小票组里只有 -0.0167,强度差 5 倍。而 60 日波动率更极端:大票 -0.0904,小票 -0.0230。点离虚线越远,说明这个因子越「看盘子下菜」。如果你的股票池在大票和小票之间来回切换,同一个因子的表现会跟着漂移,你会误以为是因子失效了。

第四个:强度和换手有关系吗?

没有明显关系。这 20 个因子的每期换手率在 2.8% 到 8.6% 之间,而 IC 从 0.005 到 0.114 都有分布。这其实是个好消息:便宜的好因子存在,你不用为了强度付出高换手的代价。但要注意,这个换手是在「前 10% 分组」口径下算的,它天然低,因为排名变动本来就慢。

第五个:它能年年有效吗?

答案是都不能。这张图是 20 个因子在 16 个年份里的 IC。你横着看任何一行,颜色都不会一致;你竖着看任何一列,也没有哪 1 年所有因子都红。包括那个最强的市值因子,它也有几年是反的。

如果你按「每年都要有效」这个标准去筛因子,你会一个都不剩。反过来说,一个因子如果在某 1 年完全失效,这本身不是淘汰理由,要看它失效的时候有没有规律。

10

一张表,和三个更深的答案

到这里,才算开始

把前面九个维度压缩成一张表:强度、稳定性、单调性、跨年稳定、剔除后留存、低换手,六项各归一化到 0 到 1,排个序。

这张表最有用的一句话是:没有一行是全绿的。最强的市值因子,强度满分,剔除后留存近乎为零;成交额波动的稳定性接近满分,强度只有一半;非流动性强度不错,但换手和可得性都差。

到这里,常规的「因子选择教程」就该收了。但我觉得真正有意思的部分才刚开始,因为上面所有数字合起来,指向三个跟「怎么选」不太一样的问题。

第一个答案:因子不是预测能力,是一个还没被修好的定价错误

如果因子是「预测能力」,那它应该像物理定律一样到处成立。但我们的数据显示,同一个因子在大票和小票里强度差 5 倍,在涨期和跌期不一样,在不同年份不一样,甚至同 1 年不同月份也不一样。

这种「到处都是例外」的东西,不是定律,是一个还没被修好的漏洞。

市场的定价效率在大部分地方是高的,但在某些角落是低的,因为那里有摩擦:钱不够多、信息不够快、规则限制、或者单纯没人愿意去。因子就是这些摩擦的形状。你选因子,其实是在选「你愿意去修哪个漏洞」。

这个视角一换,很多问题就通了。为什么小票的因子更强?因为小票那边人少、摩擦大。为什么非流动性因子看起来这么好,但用不了?因为它的强度恰好来自「你进不去」。为什么市值因子最强?因为 A 股的小票溢价,本质是流动性折价和壳价值的历史残留。这些都不是「规律」,是「状况」。状况会变,规律不会。

第二个答案:81.7% 的重复,说明我们都在同一口井里打水

20 个因子,互相剔除后只剩 18.3% 的信息。这个数字我盯着看了很久。

20 个名字听着不一样:动量、反转、波动、偏度、峰度、非流动性、量价相关、成交额比率。但它们全部由同两样东西算出来:价格和成交量。既然原料只有两样,能榨出来的独立信息就不可能是 20 份。

这件事有个更尖锐的推论:如果一个团队号称有 500 个因子,那它要么有 500 种数据源,要么只有几十种真信息,剩下的是同一口井里打上来的水,装在不同桶里。而「因子库有多少个」这种指标,鼓励的恰好是打更多的桶。

所以真正的因子研究,增量不在「再想一个公式」,而在「再找一种市场没被记录下来的状态」。财报是一种,舆情是一种,产业链是一种,订单流是一种。只要是别人都在看的价格和成交量,你怎么组合都跳不出这 18.3%。

第三个答案:因子选择是一个自我否定的过程

这是我认为最深的一层,也是最不舒服的一层。

前面说,因子是「还没被修好的定价错误」。那么,使用一个因子这件事本身,就是在修它。你用得越多,错价被抹平得越快。所以每一个有效因子,都自带一个倒计时,而倒计时的速度,恰好等于「有多少人在用它」。

这就造成一个悖论:你越是努力地验证一个因子有效,就越会让它失效。因为验证的过程必然包含「把它标准化、讲清楚、传播出去」。而一个因子一旦被讲清楚,它就从「信息」变成了「共识」,从「共识」变成了「拥挤」,最后变成「流动性供给」。

所以我看到样本外保留 95.3% 的时候,第一反应不是高兴,是心里咯噔一下。十几年都没被修好的漏洞,要么是它太隐蔽,要么是它根本不值得修。而 20 个纯量价因子,大概率属于后者,它们是「已知的、公开的、被写进教科书的」,你能算出 0.11 的 IC,全世界有几十万人都能。

那怎么办?我的看法是:别在因子上找优势,在「别人不愿意做的地方」找优势。不愿意做的原因有很多:数据脏、更新慢、容量小、需要行业知识、熬人的时期长到没人受得了。每一种「不愿意」,都是一道护城河。而一个公式,是没有护城河的。

补一段:机器学习在这里的特殊陷阱

回到开头那位朋友。他用树模型选因子,然后看特征重要性,问题就出在这一步。

特征重要性的定义是「在给定其他特征的前提下,这个特征减少了多少误差」。注意「给定其他特征」这五个字。如果两个因子高度相关(我们的数据里 11 对超过 0.7),模型会把贡献随机分给其中一个,另一个重要性趋近于零。这时候你按重要性排序删掉「不重要」的,可能刚好把那个更干净的删掉了。

而且模型越强,这个问题越严重。一个足够复杂的模型,能把噪声也拟合成「重要特征」。你给它 200 个因子,它会告诉你其中 30 个很重要,样本内确实很重要,样本外全废。这就是我常说的:树的深度,等于它骗你的深度。

所以在机器学习流程里,我认为正确的顺序是:先做正交化筛选,再进模型。让模型面对的是几十个彼此独立的方向,而不是两百个同源指标的排列组合。模型不需要你给它更多信息,它需要你给它更少相关的东西。

如果只记一句:一个可复用的判断顺序

把这篇压缩成一个顺序,我按这五步走:

第一步,先看结果合不合理。IC 超过 0.3、单调得像画出来的、净值曲线光滑得像指数函数,一律先怀疑代码,别怀疑市场。我自己就在这里栽过。

第二步,跟随机因子对一次表。标准差多少、倍数多少,心里要有数。0.11 到底是 79 倍还是 3 倍,结论完全不同。

第三步,先问「它跟谁重复」,再问「它有多强」。相关性超过 0.7 的,当成同一个因子;超过 0.85 的,直接删掉一个。

第四步,剔除后再组合,看有没有真增益。如果直接相加的最好结果还不如最强单因子,说明你手里的东西确实只有一两个真信息。

第五步,最后再调权重。因为它是这五步里最不重要的。你在这一层花的每一小时,单位时间的产出都低于花在第三步上的10 分钟。

最后说一句我自己的感受。这堆数字算完,我没有更会选因子,我只是更清楚「选因子」这三个字被高估了。真正决定结果的,是数据里有没有别人没有的东西,以及你有没有耐心等到它该起作用的时候。公式是最便宜的那部分,也是最容易被复制的那部分。

附

我不确定的地方

第一条,「正交后 7 个最优」不是普适数字。它依赖于我这 20 个因子的具体构成、这段样本的具体市况、以及每 20 个交易日一期的换手节奏。换一批因子、换一个市场,最优点会移动。我确信的是「存在最优点」,不确信它一定是 7。

第二条,正交化的顺序会影响结果。我用的是固定顺序的逐步回归(Gram-Schmidt)。换一个顺序,每个因子分到的「独立信息」会不同,虽然总量一致。所以我只拿它做「信息有多少重叠」的证据,不拿它当唯一的因子筛选结论。

第三条,价格是不复权的,我用日涨跌幅重建了代理价。剔除单只单日涨跌幅绝对值超过 21% 的样本(超过任何板块的跌停幅度),一共 4,286 个,占全部样本的 0.0352%。这个处理能挡住送股拆股的假跳空,但挡不住长期停牌后的复牌跳空,那部分会污染一部分波动率因子。所以波动类因子的真实强度,可能比我算的低。

第四条,我没有市值数据,用日均成交额做了代理。成交额和市值高度相关但不是一回事,换手率高的票会被高估。所以「市值因子最强」这个结论,严格来说应该读成「成交额因子最强」。这两者在 A 股的实证里方向一致,但不等价。

第五条,分层净值没有扣成本。第六节那条「15 年 3 倍多」的曲线是价差口径,两边都没有交易成本、没有冲击、没有借券费用。真实结果会显著低于它。它的用途是看方向是否持续,不是看能拿到多少。

第六条,我可能只留下了好看的结果。我一共跑了六七十组统计,写进文章的是这 38 张图。不支持的、没差异的,我没放进来。这不是故意,但我知道人有这个毛病。所以口径和做法我全写在文末,谁愿意重算一遍都行。

第七条,也是最要紧的:这篇所有的数字都是历史统计。它们描述的是过去 15 年 A 股这批股票的行为,不构成对任何标的选择、时机、方向的判断。因子研究最危险的地方就在这里:它看起来像科学,用起来像占卜。


目前QMT躺平还有少量位置,需要100W以上,懂的私我~


合规声明:本文为历史数据的统计描述与方法论讨论,不构成任何投资分析、操作指引或决策依据。全文不涉及任何具体上市公司、证券标的、价格判断与点位预测,不含任何形式的劝诱、承诺或表现暗示。文中所有因子均为公开的价格与成交量衍生的通用统计指标,仅用于说明研究方法,不代表任何可用的策略结论。文中所有测算均为个人依据公开历史数据推演,不代表任何机构观点,读者据此所做的任何决定与行为风险自担。

数据与方法说明:①样本为本地存储的 A 股日行情,2010 年 1 月 4 日至 2026 年 10 月 21 日共 4,077 个交易日,4,620 只证券。②价格不复权,为保证因子可算,用清洗后的日涨跌幅连乘重建代理价,剔除单只单日涨跌幅绝对值超过 21% 的样本共 4,286 个(占 0.0352%)。③未上市与停牌期间的价格缺口,对应位置的因子值一律置空,不参与截面计算。④截面为每 20 个交易日一个,起点 2011 年 4 月 1 日,终点 2026 年 6 月 29 日,共 186 期。⑤因子共 20 个:20/60/120/250 日动量、1 日反转、20/60 日波动率、20 日最大与最差单日、60 日偏度与峰度、距 250 日高点、20/60 日均线偏离、20 日与 250 日成交额之比、20 日成交额波动、60 日量价相关、20 日非流动性、20 日平均成交额对数、20 日振幅、连续同号天数。⑥IC 为每期因子值与未来 20 日表现的截面 Spearman 秩相关;衰减部分另算了未来 5/10/60 日。⑦ICIR 为 IC 均值除以 IC 标准差;信息比率为同一定义。⑧相关系数为 186 个截面 Spearman 相关的平均。⑨正交化为每期对其余 19 个因子做横截面线性回归取残差,按固定顺序逐步进行。⑩分层为按期把因子值分 10 等份,等权计算之后 20 日的平均表现。⑪组合实验为按 IC 绝对值从高到低逐个加入,等权平均秩分数。⑫样本内外分割点为 2018 年 11 月 22 日(第 93 期)。⑬随机因子对照组为 100 组标准正态随机数,遮罩与真实因子一致。⑭所有百分位数为对应样本的简单分位数,未做加权,未做显著性检验。

免责声明:本文所有观点为个人思考,读者据此所做的任何决定与行为,风险自担,与本文作者及本公众号无关。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/203153