WorldQuant 在 2016 年发表了一篇只有 6 页的论文,标题叫 “101 Formulaic Alphas”,作者 Zura Kakushadze。论文做了一件很简单的事:把 101 个量化因子的计算公式直接公开了。这些因子在 WorldQuant 的生产环境中有 80 个在实际使用,持仓周期 0.6 到 6.4 天,因子之间的平均相关性只有 15.9%。

但论文只给了公式,没有任何解释。Alpha#3 为什么是那个样子,背后在捕捉什么市场现象,一句话都没有。这就是本系列文章要做的事:把 101 个 Alpha 101 因子按经济逻辑分类,拆解公式背后的动机,搞清楚每个因子到底在赌什么。

这个系列分五篇:

  1. 本篇:全局概览,建立分类框架,讲清楚算子是什么意思,给出完整分类对照表
  2. 量价背离类因子详解(32 个因子)
  3. 动量与反转类因子详解(23 个因子)
  4. 波动率与日内结构类因子详解(23 个因子)
  5. 流动性、复合因子与因子组合实战(23 个因子)

Alpha 101 的数据输入

101 个公式用到的原始数据就那么几个字段,全是股票日频行情数据:

字段含义备注
open开盘价
close收盘价
high最高价
low最低价
volume成交量
vwap成交量加权平均价yfinance 不直接提供,需要自算
returns日收益率close / delay(close,1) - 1
cap总市值用于 rank 加权
adv{d}过去 d 天日均成交额adv20 = 过去 20 天日均成交额(price × volume)
IndClass行业分类用于行业中性化

vwap 在论文里出现了十几次,但大多数免费数据源不提供这个字段。近似计算方法:用日内 (high + low + close) / 3 作为粗略替代,或者用分钟线数据计算真实 vwap。对于日频因子研究来说,粗略替代够用了。

adv{d} 有多种变体:adv5adv10adv15adv20adv30adv40adv50adv60adv81adv120adv150adv180。论文中 adv{d} 严格来说是日均成交额(价格 × 成交量)的滚动均值。不过很多开源实现直接用 volume 的均值代替,因为对于 rank 之后的因子来说,成交额和成交量的排名高度相关。

数据源方面,美股用 yfinance 就能拿到 OHLCV,A 股用 Tushare 或 AKShare。

算子详解:读懂公式的钥匙

Alpha 101 的公式看起来吓人,但用到的算子翻来覆去就那么十几个。搞懂这些算子,101 个公式大部分都能直接读懂。

截面算子:在同一天的所有股票之间比较

rank(x):把当天所有股票的 \(x\) 值排名,然后归一化到 0~1 之间。排名最低的股票得 0,最高的得 1。

为什么要 rank?因为不同指标的量纲天差地别。成交量可能是几百万股,收益率是百分之零点几。直接算相关性或做加减法,量纲大的指标会完全压过量纲小的。rank 之后全部变成 0~1 的分位数,苹果和苹果才能比。

rank 还有一个好处:天然抗极端值。某只股票今天成交量暴增 10 倍,raw 值可能把所有统计量搞崩,但 rank 之后它最多也就是排第一(值为 1.0),不会影响其他股票的相对排名。

这就是为什么 101 个因子里 rank 出现了 90 多次。它是整个公式体系的"通用适配器"。

时序算子:在同一只股票的历史上计算

delay(x, d):\(d\) 天前的值。delay(close, 1) = 昨天的收盘价。

delta(x, d):今天的值减去 \(d\) 天前的值。delta(close, 5) = 最近 5 天收盘价变了多少。比 returns 更直接,不做除法归一化,保留了绝对变化幅度的信息。

ts_rank(x, d):当前值在过去 \(d\) 天里排第几。如果今天的收盘价是最近 10 天里最高的,ts_rank(close, 10) 接近 1.0。这个算子把绝对值翻译成"相对于近期历史的位置"。一只股票今天涨了 2%,这算多还是少?如果过去 10 天都在涨 3%+,那 2% 其实偏弱。ts_rank 捕捉的就是这种相对强弱。

ts_argmax(x, d) / ts_argmin(x, d):过去 \(d\) 天内,最大值(或最小值)出现在窗口的第几个位置。返回值是 0-based 索引:0 = 窗口最早的一天,\(d-1\) = 今天。如果 ts_argmax(close, 10) = 9,说明最高价就在今天,价格可能还在上升趋势中。如果 = 0,说明最高价出现在 10 天前的第一天,之后一路下滑。这个算子衡量的是"极值出现在窗口的什么位置",值越大说明极值越近。

correlation(x, y, d):过去 \(d\) 天内 \(x\) 和 \(y\) 的 Pearson 相关系数。量价背离类因子大量使用这个算子,比如计算价格排名和成交量排名的相关性。相关性高说明量价同步,相关性低或为负说明量价背离。

covariance(x, y, d):过去 \(d\) 天内 \(x\) 和 \(y\) 的协方差。和 correlation 类似但不归一化,保留了量纲信息。

decay_linear(x, d):过去 \(d\) 天的加权平均,权重线性递减(最近一天权重最大,\(d\) 天前权重最小)。普通移动平均对每一天一视同仁,但在量化因子里,近期信息通常比远期更有预测力。decay_linear 是一种简单的"越近越重要"加权方案。权重分配:第 1 天(最近)权重 \(d\),第 2 天权重 \(d-1\),以此类推,最后归一化。

stddev(x, d):过去 \(d\) 天 \(x\) 的标准差,就是波动率。

sum(x, d) / product(x, d):过去 \(d\) 天的求和 / 连乘。

min(x, d) / max(x, d):过去 \(d\) 天的最小值 / 最大值。

变换算子

scale(x, a=1):把截面上所有股票的 \(x\) 值缩放,使绝对值之和等于 \(a\)。用处是把因子值转换成"仓位权重"。如果 \(a=1\),scale 之后的因子值直接就是每只股票该分配多少仓位(正值做多,负值做空),全部仓位加起来正好满仓。

signedpower(x, a):保留符号的幂运算,\(\text{sign}(x) \times |x|^a\)。当 \(a > 1\) 时,大的值被放大得更多,小的值被压缩。效果是拉大因子值的差距,让头部和尾部股票的信号更强。

行业中性化

IndNeutralize(x, IndClass):在每个行业内部做截面去均值。

为什么需要这个?假设你的因子是"成交量变化率"。银行股整体成交量就是比医药股大几个数量级。如果不做行业中性化,因子排名会天然偏向成交量大的行业,你选出来的"成交量异常放大"的股票可能全是银行股,根本不是因为它们有 alpha,只是行业特征。

IndNeutralize 之后,银行股和银行股比,医药股和医药股比,去掉了行业层面的系统性差异,剩下的才是个股层面的 alpha 信号。

101 个因子里有 26 个用到了 IndNeutralize。如果你没有行业分类数据,这 26 个因子可以先跳过,剩下 75 个照样能做。

pandas 实现核心算子

import numpy as np
import pandas as pd

def rank(df):
    """截面排名归一化到 [0, 1]"""
    return df.rank(axis=1, pct=True)

def delay(df, d):
    """时移 d 天"""
    return df.shift(d)

def delta(df, d):
    """d 天差分"""
    return df - delay(df, d)

def ts_rank(df, d):
    """当前值在过去 d 天中的排名分位数"""
    return df.rolling(d).apply(
        lambda x: x.rank().iloc[-1] / len(x), raw=False
    )

def ts_argmax(df, d):
    """过去 d 天最大值的位置(0 = 最早,d-1 = 今天)"""
    return df.rolling(d).apply(lambda x: x.argmax(), raw=True)

def ts_argmin(df, d):
    """过去 d 天最小值的位置(0 = 最早,d-1 = 今天)"""
    return df.rolling(d).apply(lambda x: x.argmin(), raw=True)

def decay_linear(df, d):
    """线性衰减加权平均,近期权重大"""
    weights = np.arange(1, d + 1, dtype=float)
    weights /= weights.sum()
    return df.rolling(d).apply(
        lambda x: np.dot(x, weights), raw=True
    )

def scale(df, a=1):
    """截面缩放,使绝对值之和等于 a"""
    return df.mul(a).div(df.abs().sum(axis=1), axis=0)

def signedpower(df, a):
    """保留符号的幂运算"""
    return np.sign(df) * df.abs().pow(a)

def ts_corr(x, y, d):
    """滚动相关系数"""
    return x.rolling(d).corr(y)

def ts_cov(x, y, d):
    """滚动协方差"""
    return x.rolling(d).cov(y)

算子速查表

算子类型直觉类比
rank截面排名归一化,消除量纲考试排名 vs 原始分数
delay时序回看 d 天前“昨天的收盘价”
delta时序d 天变化量“这周涨了多少”
ts_rank时序当前值在近期的位置“今天是近期最高还是最低”
ts_argmax时序极值在窗口的位置“最高价出现在窗口第几天”
correlation时序两序列同步程度“量涨价也涨?”
decay_linear时序近期加权均值“越近的数据越重要”
stddev时序波动率“最近波动大不大”
scale截面归一化为仓位权重“总仓位加起来 = 1”
signedpower变换放大头尾信号“强的更强,弱的更弱”
IndNeutralize截面去行业偏差“银行和银行比,医药和医药比”

五大分类:每个因子到底在赌什么

读完算子,可以开始看因子了。101 个因子看上去五花八门,但按背后的经济逻辑归类,其实就五种思路。

量价背离类(32 个因子)

核心逻辑:价格和成交量应该同步。如果价格在涨但成交量在缩,这个上涨可能缺乏支撑。如果成交量突然放大但价格没怎么动,说明买卖双方有分歧,可能在酝酿方向选择。

量价背离是技术分析里最古老的观点之一,Alpha 101 把它公式化了。

Alpha#3 是这类因子里最干净的一个:

$$\text{Alpha#3} = -1 \times \text{correlation}(\text{rank}(\text{open}),\ \text{rank}(\text{volume}),\ 10)$$

一层一层拆:

  1. rank(open):今天所有股票按开盘价排名,归一化到 0~1
  2. rank(volume):今天所有股票按成交量排名,归一化到 0~1
  3. correlation(..., 10):过去 10 天,这两组排名的相关系数
  4. -1 *:取反

过去 10 天里,如果一只股票开盘价排名高的时候成交量排名也高,相关系数为正,乘以 -1 后因子值为负(做空信号)。反过来,如果开盘价排名和成交量排名是反的(量价背离),因子值为正(做多信号)。

为什么量价背离反而是买入信号?一种解释是:开盘价上涨但成交量没跟上来,说明不是散户追涨推动的,可能是基本面在缓慢定价。而开盘价涨、成交量也暴涨的情况,往往是短期过热,容易回调。

Alpha#12 更直接:

$$\text{Alpha#12} = \text{sign}(\text{delta}(\text{volume}, 1)) \times (-1 \times \text{delta}(\text{close}, 1))$$

翻译成白话:如果今天成交量比昨天大(sign(delta(volume, 1)) = +1),就做空今天的价格变动方向(乘以 -1 * delta(close, 1))。如果今天成交量缩了,就做多今天的价格变动方向。

逻辑是:放量上涨后看跌,缩量下跌后看涨。量价配合"异常"的方向更可能反转。

这类因子在 Alpha 101 里数量最多(32 个)。从 WorldQuant 的角度看,量价关系在短期因子里提供了最多的独立信号源。

# Alpha#3 计算示例
# 假设 df_open 和 df_volume 是 DataFrame,行=日期,列=股票
alpha3 = -1 * ts_corr(rank(df_open), rank(df_volume), 10)

动量与反转类(23 个因子)

核心逻辑:股票短期(1~5 天)倾向于反转,中期(10~20 天)倾向于延续。

短期反转的经济直觉很直白:今天涨多了的股票,明天有人获利了结,价格回落。今天跌多了的股票,超卖后有人抄底,价格反弹。这在流动性好的市场里是个稳定现象,背后是做市商和短线交易者的行为模式。

中期动量的来源不同:信息扩散需要时间,好消息出来后不是所有人同时反应,先知先觉的资金先买,后知后觉的资金跟进,形成趋势。

Alpha#9 是一个带条件判断的反转因子:

$$\text{Alpha#9} = \begin{cases} \text{ts_rank}(\text{delta}(\text{close},1),\ 5) & \text{if } 0 < \text{ts_min}(\text{delta}(\text{close},1),\ 5) \\ \text{ts_rank}(\text{delta}(\text{close},1),\ 5) & \text{if } \text{ts_max}(\text{delta}(\text{close},1),\ 5) < 0 \\ -1 \times \text{delta}(\text{close},1) & \text{otherwise} \end{cases}$$

前两个条件在判断趋势是否一致:如果过去 5 天每天都在涨(最小变化 > 0),或者每天都在跌(最大变化 < 0),就用 ts_rank 来衡量当前涨/跌幅在近期的位置。否则(涨跌交替),直接用反转信号。两个趋势分支的公式相同,这不是写错了:论文原文就是对"连续上涨"和"连续下跌"两种趋势给出相同的动量度量,区别体现在 delta(close,1) 的符号上。

这个设计有意思:在单边行情里用动量逻辑(ts_rank),在震荡行情里用反转逻辑。比无脑反转多了一层市场状态判断。

Alpha#20 抓的是跳空缺口的回补:

$$\text{Alpha#20} = -1 \times \text{rank}(\text{open} - \text{delay}(\text{high}, 1)) \times \text{rank}(\text{open} - \text{delay}(\text{close}, 1)) \times \text{rank}(\text{open} - \text{delay}(\text{low}, 1))$$

三项都在衡量今天开盘价相对于昨天 K 线的位置。如果今天高开(跳空高于昨天的 high、close、low),三项都为正,乘积为正,再乘 -1 变成负值(做空信号)。逻辑是:大幅跳空高开往往过度反应,日内倾向于回落。

波动率类(11 个因子)

核心逻辑:波动率有均值回归的特性。高波动之后往往回落,低波动之后往往放大。

更细致地说,波动率类因子捕捉的是"波动率状态切换"的时机。一只股票如果最近 5 天非常平静,突然有一天大幅波动,这往往意味着新信息到来,后续可能有趋势性行情。反过来,持续高波动之后,市场逐渐消化信息,波动率趋于收敛。

Alpha#1 是一个条件波动率信号:

$$\text{Alpha#1} = \text{rank}\Big(\text{ts_argmax}\big(\text{signedpower}(\text{returns} < 0\ ?\ \text{stddev}(\text{returns}, 20)\ :\ \text{close},\ 2),\ 5\big)\Big) - 0.5$$

拆开看:先按条件选信号源(下跌用波动率,上涨用收盘价),用 signedpower 放大差异,ts_argmax 看过去 5 天最大值出现在窗口的哪个位置,最后做截面 rank 再减 0.5(使因子值中心化到 0 附近,正值做多负值做空)。

核心思路:下跌阶段关注波动率,上涨阶段关注价格。下跌时波动率越高说明恐慌越严重,恐慌到极致(ts_argmax 最近发生)反而是反转信号。

波动率类因子数量不多(11 个),但底层思路和波动率交易策略相通:波动率本身就是可以交易的标的。

日内结构类(12 个因子)

核心逻辑:开盘价、收盘价、最高价、最低价的相对关系,反映了日内交易者的行为模式。

比如收盘价比开盘价高多少(日内涨幅),收盘价在日内振幅中的位置(靠近最高价还是最低价),vwap 和收盘价的关系(机构是在均价之上还是之下交易)。

Alpha#101 是结构最简单的一个:

$$\text{Alpha#101} = \frac{\text{close} - \text{open}}{(\text{high} - \text{low}) + 0.001}$$

分子是日内涨跌,分母是日内振幅(加 0.001 防止除零)。这个比值衡量的是"日内收益占振幅的比例"。值接近 +1 说明开盘就是最低价、收盘就是最高价(全天单边上涨)。值接近 0 说明收盘价和开盘价差不多,日内波动都是噪音。

这个因子本身就是一个经典的技术分析指标,叫做 “close location value”。它的预测含义是:全天单边上涨的股票,次日倾向于(微弱地)延续;全天来回震荡最终平收的股票,缺乏方向性动能。

Alpha#42 关注 vwap 和收盘价的关系:

$$\text{Alpha#42} = \frac{\text{rank}(\text{vwap} - \text{close})}{\text{rank}(\text{vwap} + \text{close})}$$

vwap - close > 0 说明加权平均成交价高于收盘价,意味着"大部分成交发生在价格较高的时候",收盘时价格回落了。这往往是机构在日内高位出货的信号。因子对这种行为给出做空信号。

注意 Alpha#42 没有用 delay,它用的全是当天数据。论文里标注这个因子的持仓周期是 0 天,意味着它是一个日内信号。在 T+1 的 A 股市场,这类因子不适用。

流动性与复合类(23 个因子)

核心逻辑:流动性(成交量、换手率)的变化反映了机构资金的进出。

机构交易和散户交易的一个本质区别是:机构的单子太大,不可能一次性买完。一只股票如果连续几天成交量放大但价格没怎么动,很可能是有大资金在分批建仓。成交量突然萎缩,可能是大资金建仓完毕或者市场进入观望状态。

Alpha#7 是一个带条件的流动性信号:

$$\text{Alpha#7} = \begin{cases} -1 \times \text{ts_rank}(\text{abs}(\text{delta}(\text{close},7)),\ 60) \times \text{sign}(\text{delta}(\text{close},7)) & \text{if } \text{adv20} < \text{volume} \\ -1 & \text{otherwise} \end{cases}$$

条件判断:今天的成交量是否超过 20 日均量。如果超过(放量),因子用过去 7 天价格变化的绝对值在 60 天里的排名,乘以变化方向,再取反。如果没放量(缩量),直接给 -1(做空信号)。

逻辑是:缩量的时候一律看空,因为缩量意味着参与度下降,支撑力弱。放量的时候就看价格变化的"力度"在近期历史中处于什么位置,力度越大说明这笔放量越有意义。

这类因子比较复杂,经常嵌套多个算子和条件判断。它们属于"复合因子",融合了量、价、波动率等多维信息。单独理解时比较绕,但赚钱逻辑大多可以归结为"跟着聪明钱走"。

Alpha 101 因子完整分类对照表

下表把 101 个因子全部归入五个类别。“核心算子"列标出该因子最核心的计算逻辑,“IndNeut” 标记是否需要行业中性化。

Alpha 101 factor classification distribution

编号类别核心算子一句话逻辑IndNeut详解篇
#1波动率stddev, ts_argmax下跌时看波动率极值位置第4篇
#2量价背离correlation, rank量价排名走势相关性 + 日内涨跌第2篇
#3量价背离correlation, rank开盘价-成交量排名相关性第2篇
#4动量反转ts_rank低位做空信号第3篇
#5日内结构rank, ts_rank, vwapvwap 偏离的排名变化第4篇
#6量价背离correlation开盘价与成交量的直接相关性第2篇
#7流动性adv, ts_rank, delta放量/缩量条件下的价格动量第5篇
#8动量反转rank, delta, sum开盘价变化与收益排名的交互第3篇
#9动量反转delta, ts_min/max条件反转:趋势 vs 震荡第3篇
#10动量反转delta, ts_min/max与#9 类似的条件动量第3篇
#11量价背离rank, correlation, vwapvwap/close/volume 三者互动第2篇
#12量价背离sign, delta量变方向 × 价变方向第2篇
#13量价背离rank, covariance收盘价与成交量的协方差排名第2篇
#14量价背离correlation, returns开盘价与收益率的相关性第2篇
#15量价背离correlation, rank最高价与成交量排名的相关性第2篇
#16量价背离covariance, rank最高价与成交量的协方差排名第2篇
#17量价背离rank, ts_rank, delta, volume收盘价排名与 volume 动量排名第2篇
#18波动率correlation, stddev收盘价与开盘价的相关性第4篇
#19动量反转returns, delay条件收益率反转第3篇
#20动量反转rank, open, delay跳空缺口回补第3篇
#21波动率mean, stddev, close均值偏离 + 成交量条件第4篇
#22量价背离correlation, delta, stddev最高价与成交量相关性 + 价格变化第2篇
#23动量反转sma, delta, high最高价均值条件反转第3篇
#24动量反转sma, delta, close收盘价均值条件反转第3篇
#25量价背离rank, returns, adv, vwap收益率 × 成交量偏离 × vwap 排名第2篇
#26量价背离correlation, ts_rank, volume时序排名相关性 + 成交量第2篇
#27量价背离rank, correlation, volume量价相关性的排名分位第2篇
#28量价背离correlation, adv, rank成交量与均量的相关性第2篇
#29动量反转delta, ts_rank, returns收盘价变化的排名趋势第3篇
#30动量反转delta, close, volume价量变化的符号交互第3篇
#31流动性rank, adv, correlation, decay_linear流动性 + 量价衰减相关第5篇
#32量价背离scale, correlation均值偏离 × 量价相关性衰减第2篇
#33动量反转rank, open/close开收盘价排名反转第3篇
#34波动率rank, stddev, delta, close波动率排名与价格反转第4篇
#35动量反转rank, returns, volume, ts_rank多因子复合反转第3篇
#36波动率correlation, rank, adv多维相关性排名第4篇
#37动量反转correlation, rank, delay开盘价排名的自相关第3篇
#38动量反转rank, close, open收盘价排名与日内涨幅第3篇
#39动量反转rank, delta, decay_linear, returns衰减动量信号第3篇
#40量价背离rank, stddev, correlation高价波动率 × 成交量排名第2篇
#41日内结构high, low, vwap日内振幅与 vwap 的关系第4篇
#42日内结构rank, vwap, closevwap 与收盘价偏离第4篇
#43量价背离rank, adv, delta, close流动性排名 × 价格变化第2篇
#44量价背离correlation, rank最低价与成交量排名相关性第2篇
#45量价背离rank, delta, correlation, decay_linear收盘价变化排名 × 量价衰减相关第2篇
#46动量反转delay, delta, close条件价格动量第3篇
#47日内结构rank, adv, high, close, vwap流动性加权的 vwap-close 偏离第4篇
#48流动性correlation, rank, delta行业中性量价相关第5篇
#49动量反转delta, delay, close条件价格反转第3篇
#50量价背离correlation, rank, ts_rank, volume量价排名的时序相关第2篇
#51动量反转delta, delay, close条件延迟反转第3篇
#52动量反转delta, ts_min, ts_rank, volume价格低点 + 成交量排名第3篇
#53动量反转delta, close, high, low日内位置变化第3篇
#54日内结构open, close, low日内偏离结构第4篇
#55量价背离correlation, rank, high, low, volume日内振幅与成交量相关第2篇
#56动量反转rank, returns, cap市值与收益排名的交互第3篇
#57波动率decay_linear, rank, ts_argmin, close衰减最低点位置排名第4篇
#58流动性correlation, rank, volume行业中性量价相关第5篇
#59流动性correlation, rank, volume行业中性量价相关变体第5篇
#60量价背离scale, correlation, rank量价相关性 × 日内涨跌缩放第2篇
#61流动性rank, vwap, advvwap 排名与均量排名较量第5篇
#62日内结构rank, vwap, correlation, advvwap 排名 × 量价相关第4篇
#63流动性rank, vwap, delta, decay_linear, adv流动性衰减信号第5篇
#64日内结构rank, correlation, vwap, advvwap 流动性相关排名第4篇
#65日内结构rank, correlation, vwap, advvwap 排名相关性衰减第4篇
#66日内结构rank, decay_linear, vwap, deltavwap 偏离的衰减动量第4篇
#67流动性rank, correlation, high, adv最高价与均量的相关排名第5篇
#68日内结构rank, correlation, high, adv, close最高价-均量相关 × 收盘排名第4篇
#69流动性rank, ts_rank, delta, close, adv行业中性价格动量排名第5篇
#70流动性rank, delta, close, vwap行业中性价格-vwap 变化第5篇
#71流动性decay_linear, correlation, rank, close, adv多层衰减流动性信号第5篇
#72流动性rank, correlation, vwap, adv, decay_linear衰减量价排名相关第5篇
#73日内结构rank, decay_linear, vwap, delta, openvwap 衰减 × 开盘变化第4篇
#74量价背离rank, correlation, close, adv收盘价与均量相关排名第2篇
#75流动性rank, correlation, vwap, volumevwap 与成交量排名的相关性第5篇
#76流动性rank, decay_linear, correlation, vwap衰减 vwap 排名相关第5篇
#77量价背离rank, decay_linear, delta, correlation价格变化衰减 × 量价相关第2篇
#78量价背离rank, correlation, low, adv最低价与均量相关排名第2篇
#79流动性rank, delta, vwap, correlation, close行业中性 vwap 变化排名第5篇
#80流动性rank, delta, close, correlation, adv行业中性变化与量价相关第5篇
#81量价背离rank, correlation, vwap, advvwap 与均量的排名相关第2篇
#82流动性rank, delta, open, correlation, adv行业中性开盘变化排名第5篇
#83波动率rank, delay, high, low日内振幅的滞后排名第4篇
#84动量反转rank, vwap, close, signedpowervwap-close 偏离的幂放大第3篇
#85量价背离rank, correlation, high, adv最高价排名与均量相关第2篇
#86波动率rank, correlation, close, adv, delay滞后量价相关条件信号第4篇
#87流动性rank, decay_linear, delta, vwap, adv衰减 vwap 动量第5篇
#88量价背离rank, decay_linear, correlation, open开盘价排名衰减相关第2篇
#89流动性decay_linear, correlation, rank衰减相关性信号第5篇
#90动量反转rank, correlation, close, adv收盘与均量排名相关反转第3篇
#91流动性rank, correlation, close, adv, decay_linear收盘-均量衰减相关第5篇
#92量价背离rank, decay_linear, delta, correlation多维衰减量价信号第2篇
#93流动性rank, correlation, vwap, adv, decay_linear行业中性衰减 vwap 相关第5篇
#94波动率rank, correlation, adv成交量排名与低位信号第4篇
#95量价背离rank, correlation, high, adv最高价排名与均量相关第2篇
#96波动率decay_linear, rank, ts_argmax, correlation衰减极值位置 × 量价相关第4篇
#97流动性rank, decay_linear, delta, correlation, adv行业中性衰减流动性第5篇
#98波动率rank, decay_linear, correlation, vwap, adv衰减 vwap 相关排名第4篇
#99量价背离rank, correlation, high, volume最高价与成交量排名相关第2篇
#100流动性rank, stddev, correlation, adv波动率与流动性的相关排名第5篇
#101日内结构close, open, high, low日内收益占振幅比第4篇

实操提示

公式里的小数参数不要过度解读。 Alpha#4 里出现了 ts_rank(...) 的窗口期 9.99922,Alpha#35 里有 2.21 这种看起来很精确的数字。这些参数是机器优化出来的,不是人拍脑袋定的。它们在样本内 overfit 的概率很高,换成整数(10、2)效果可能差不多。

26 个因子需要行业分类数据。 表里标了 “IndNeut” 的因子用到了 IndNeutralize,需要每只股票的行业归属。美股用 GICS 或 SIC 分类,A 股用申万行业分类。如果你手头没有行业数据,先做剩下的 75 个因子,这些足够搭建一个像样的因子库了。

少数因子是纯日内信号。 Alpha#42、#54 这类因子没有用 delay,完全基于当天 OHLCV 数据。论文里它们的持仓周期接近 0 天,是日内交易信号。在 T+1 的 A 股市场直接做不了,但可以把信号延迟一天作为次日的选股因子,效果会打折。

单因子 ≠ 策略。 论文发表于 2016 年,距今已经 10 年。任何单个因子在被公开之后都会经历 alpha 衰减,因为太多人用同样的信号交易,超额收益被套利掉。但分类逻辑不会过时:量价背离、动量反转、波动率均值回归这些经济规律不会因为一篇论文的发表而消失。

论文的设计背景是美股大盘股。 这 101 个因子是在约 1000 只美股大盘股上开发的,假设了美元中性、市值加权等约束条件。直接搬到 A 股小盘股或其他市场,某些因子的表现可能差异很大。比如 A 股的 T+1 限制、涨跌停板、散户比例偏高,都会影响反转类因子的有效性。跨市场使用时需要做本地化回测验证。

把单因子当作积木,通过因子组合(多因子模型)来构建策略,才是 Alpha 101 的正确用法。因子之间的平均相关性只有 15.9%,说明它们捕捉的是不同维度的信息,组合后的分散化效果很好。策略评估可以参考量化投资常用指标大全,用夏普比率、最大回撤等指标衡量组合表现。

系列导航

这是 Alpha 101 系列的第一篇,后续四篇会按类别深入拆解具体因子:

如果你对量化交易的基础评估指标还不太熟悉,建议先看量化投资常用指标大全,搞清楚夏普比率、最大回撤这些概念。波动率类因子和波动率交易策略的思路相通,感兴趣可以交叉阅读。