1. 前言
我们在因子的基本概念中曾介绍过现代金融经济学的核心思想:股票的平均收益率是对持股者承担(系统性)风险的补偿。
在因子模型中,因子暴露代表了股票对某一类风险的暴露,因子溢价代表了投资者买入股票并承担风险所应得到的补偿。因此,股票的平均收益率等于因子暴露和因子溢价的乘积:
股票平均收益率=因子暴露×因子溢价
我们在本章将基于以上内容,完成对因子模型的构建。
2. 因子模型的数学基础
2.1 基础线性方程
因子模型定义股票 i 的收益率 ri 为:
ri=αi+βi1λi1+⋯+βikλik+ϵi
其中:
- λi1,…,λi1:因子溢价;
- βi1,…,βik:因子暴露;
- αi:常数项;
- ϵi:残差项,代表股票的非系统性风险;
- ∑βijfj:代表股票的系统性风险;
2.2 向量表示法
为了简化表达,引入 (K+1) 维列向量 λ与βi :
λi=(1,λi1,…,λik)′
βi=(αi,βi1,…,βik)′
则收益率公式可简写为:
ri=βi′λi+ϵi
2.3 期望收益率与风险分解
对上式取期望,得到:
E(ri)=βi′E(λi)
即股票的平均收益等于因子暴露与因子溢价的乘积,这与我们在因子的基本概念中得到的结论一致。
对上式的方差进行分解,得到分解后的总风险:
V(ri)=βi′V(λi)βi+V(ϵi)
其中 βi′V(λi)βi 代表总风险, V(ϵi) 代表非系统性风险,该公式的含义为:总风险 = 系统性风险 + 非系统性风险。
其中,非系统性风险为可通过分散化投资消除的风险,系统性风险部分为不可通过分散化投资消除的风险,两者的关系如下图所示:
3. 构建模型的准备工作
3.1 因子选取
因子选取是构建模型中最重要也是最复杂的工作,但关于因子的内容在因子与因子选择中已经进行过介绍,这里不再赘述。
值得一提的是,除了因子的基本概念中提到的基本面因子和经济因子之外,有时我们还会加入基于历史收益率数据进行主成分分析得到的统计因子。但我们仍然要时刻牢记:量化模型应当以可靠的经济理论为基础,而非来自数据挖掘。
3.2 无风险利率的处理
正如我们之前所提到的,对于基本面因子,我们需要通过计算股票收益率和因子暴露之间的关系,来估计因子溢价。
但在计算股票收益率的时候,存在这样一个问题:由于投资者获得的一部分股票收益率来自无风险利率(risk-free rate),而非对承担风险的补偿,所以,我们计算因子溢价时实际需要的股票收益率,是原始的股票收益率扣除无风险利率的部分,即:
rit∗=rit−rft
其中,rit 为股票 i 在 t 期间的收益率, rft为 t 期间的无风险收益率。
对美股而言,我们一般使用3个月美国国库券收益率(3-Month U.S. Treasury Bill)作为无风险利率代理变量,对A股而言,我们一般使用1年期国债收益率作为无风险利率代理变量。
3.3 时间间隔与跨度
在获取数据集的时候,存在两个时间上的问题会影响我们数据集的质量:数据点之间的间隔应当如何选择?以及数据集的时间跨度应当如何选择?下面我们以基本面因子的因子溢价估计为例进行说明。
3.3.1 时间间隔
对于时间间隔,最为理想的情况是数据时间间隔可以刚好对应投资周期(即再平衡的频率)。例如,如果组合每月进行一次再平衡,那么数据点之间应当采用的时间间隔为1个月;如果组合每年进行一次再平衡,那么数据点之间应当采用的时间间隔为1年。
但是,我们必须还要考虑估计的准确性。在估计基本面因子溢价时,我们必须要假定股票收益率和因子暴露之间的关系是稳定的,否则统计学上的估计将失去意义。例如:假设股票收益率和因子暴露之间的关系大致在一个月内保持稳定,那么我们就不能将时间间隔设为1年。
那么是否可以将时间间隔设置的尽可能短呢,比如1天或者1小时?结论是也不行,因为股票短期收益率的波动存在随机性(噪音),所以估计的时间太短也会导致估计的准确率下降。
综合以上考虑,我们一般在估计模型参数时采用月度数据,其次使用周度数据,通常不使用日度数据或年度数据。
3.3.2 时间跨度
时间跨度的选择同样面对权衡的问题:如果时间跨度太短,数据仅包括很少时间间隔的样本数据,那么估计的准确度会收到严重影响;如果时间跨度太长,股票收益率和因子暴露之间的关系很可能已经发生变化,估计的理论基础并不成立。
一般来说,我们倾向于采用3-5年的数据作为估计的样本量。
3.4 股票范围的选择
虽然在当前的计算机技术条件下,股票的数量多少已经不再是问题,但我们仍然建议根据股票筛选与排序中介绍的筛选方法,对总体股票池进行初步筛选。因为从理论上来说,我们试图解释的股票范围越大,模型的针对性就越弱。
一般来说,我们建议将初始股票池控制在一千只股票以内。
4. 基本面因子的估计
4.1 因子暴露
对于基本面因子,其因子暴露是已知的,但其中的一些细节需要我们进行关注:
(1)对于月度数据,我们应当选取月初数据而非月末数据。
(2)由于公司按照季度公布其财务数据,但公布数据的时间一般迟于财务数据对应时期(对A股上市公司而言,季报为1个月;半年报为2个月;年报为4个月),所以在模型中,我们对因子暴露数据要考虑该时滞。
以上处理都是为了防止因为“未卜先知”,使得模型错误高估收益率。
4.2 因子溢价
因子溢价是基本面因子的核心估计对象。一般而言,我们认为因子溢价在长期来看(5年之内)是相对稳定的,因此我们可以通过回归来估计因子溢价。
4.2.1 基础模型设定
假设有N只股票,在 T 个时期内的收益率向量为 rt ,因子暴露矩阵为 β ,则模型可以表示为:
rit=βit′λ+ϵit
其中:
- rit:股票 i 在时间 t 的超额收益率。
- βi:股票 i 对因子的暴露度向量。
- λ:待估计的因子溢价向量。
- ϵit:残差项。
实际上,有多种方法来估计上式。其中,最为简单的是普通最小二乘法(OLS)。尽管 OLS 可能并非最可靠的统计量,但 OLS 有着容易获得的优势。我们建议对 OLS 统计量进行一系列稳健性检验后,再决定是否使用其他更为复杂的方法。
4.2.2 因子溢价的 OLS 估计
假设所有股票的残差项 ϵit 具有相同的方差且互不相关,此时因子溢价估计量 λ^ 的一致估计为(无偏估计需将自由度调整为NT−K):
λ^=[t=1∑Ti=1∑N(βit−βˉ)(βit−βˉ)′]−1t=1∑Ti=1∑N(βit−βˉ)(rit−rˉ)
其中:
βˉ=NT1t=1∑Ti=1∑Nβti
rˉ=NT1t=1∑Ti=1∑Nrti
估计量的方差 V(λ^) 为:
V^(λ^)=σ^2(t=1∑Ti=1∑N(βit−βˉ)(βit−βˉ)′)−1
其中 σ^2 是对 ϵit 方差的估计:
σ^2=NT1t=1∑Ti=1∑N(rit−βi′λ^)2
我们一般取方差平方根,得到标准误差来在统计学上衡量估计的准确性。
注意这里的回归是截面回归,公式中加入的时间 T 只是把很多期的截面数据合并估计,这是与之后估计经济因子的因子暴露的显著不同,因为估计经济因子的因子暴露时采用的是时间序列回归。
4.2.2.1 稳健性检验
模型一般只能反映较为接近的真实情况,而不能反映完美的真实情况。但正如我们在量化股票投资的基本原则中提到的原则六:量化模型应当反映持续与稳定的模式。我们应当努力构建一个具有持久性和稳定性的模型。
因此,我们需要进行稳健性检验,以此来判断当估计发生微小变化时,因子溢价的估计是否稳健。如果当前的估计不能通过稳健性检验,那么我们应当尝试使用其他估计方法。
为了检验估计量的稳健性,我们一般会将数据集划分为多个子数据集,观察各子数据集上的估计量之间是否存在很大差异。若各个子区间的估计量差异不超过设定的某一阈值,则认为通过了稳健性检验。
常见的划分方式包括按时间轴划分、按不同行业划分等。
4.2.2.2 异常值与 MAD 估计
OLS 的缺点之一在于其对异常值高度敏感。如果稳健性检验表明 OLS 统计量十分不稳定,那么有必要改为其他对异常值相对不敏感的估计方法。
一种替代方法是最小绝对离差估计(Minimum Absolute Deviation, MAD),有时也被称作中值估计(median estimation)。该方法通过最小化残差绝对值之和而非残差平方和来实现降低对异常值敏感度:
λmini=1∑N∣rit−βi′λ∣
需要注意的是,由于绝对值函数在零点不可导,我们无法像 OLS 那样直接通过对λ 求导来获得解析解。而是将上式转化为线性规划问题求解。
4.2.2.3 异方差与 GLS 估计
只有当不同股票的残差 ϵit 的方差相同时,OLS才是最优的估计方法,但通常情况下不同股票的残差 ϵit 的方差是不同的。计量经济学上将这类非常数方差问题称为异方差(heteroscedasticity)。
此时,最优的估计方法是广义最小二乘法(generalized least-square,GLS),对应因子溢价的 GLS 估计量为:
λ^=t=1∑Ti=1∑N(σiβit−βˉ)(σirit−rˉ)/t=1∑Ti=1∑N(σiβit−βˉ)2
其中:
βˉ=NT1t=1∑Ti=1∑Nσ^βti
rˉ=NT1t=1∑Ti=1∑Nσ^rti
σ^i2=T1t=1∑T(rit−βit′λ^)2
在 GLS 估计中,通过对 βit 和 rit 进行除以 σi 的操作,使得处理后的数据满足残差方差相等的假设,然后再套用 OLS 的公式。
注意到这里有一个“先有鸡还是先有蛋”的问题:公式里 λ 的计算需要知道 σi ,而 σi 的计算又需要知道 λ^,所以在统计软件中,一般是使用迭代来完成这个过程,直到得到收敛值:
第一步:先假设所有股票权重一样,用 OLS 算出一个初始的 λ^ 。
第二步:用这个初始值算出每只股票的残差平方和,进而得到 σ^i2 。
第三步:把这个 σi 代入的 GLS 公式,重新计算一个更准的 λ^ 。
循环:不断重复,直到结果稳定。
4.2.3 零投资组合法估计因子溢价
除了 OLS 估计及其各类变体估计,我们还可以使用之前在因子与因子选择中提到的零投资组合法来估计因子溢价。
我们以 PB 因子为例进行说明,具体流程为:
- 排序:在每个月底,根据所有股票的市净率(PB)从高到低排序。
- 分组:选出 PB 最高的前 x% 股票(高价值组)和最低的后 x% 股票(低价值组),x 的数值一般为 20% 或 33%。
- 对冲:买入高分组,同时卖空低分组。
- 计算:这两个组合的收益率之差,就是这个月该因子的因子溢价 λ 。
通俗来理解,我们就是通过测试“如果只看这个指标去交易,一个月能比别人多赚多少钱”来估计因子溢价。
4.2.4 风险分解
4.2.4.1 建立分解起点
这里我们对风险作出进一步的说明:
已知超额收益率表示为:
ri=βi′λ+ϵi
我们对等式两边同时取方差:
V(ri)=V(βi′λ+ϵi)
4.2.4.2 线性展开
根据概率论中方差的运算性质,若两个随机变量 X 和 Y 存在,则有:
V(X+Y)=V(X)+V(Y)+2Cov(X,Y)
我们将该性质应用于上式,得到:
V(ri)=V(βi′λ)+V(ϵi)+2Cov(βi′λ,ϵi)
由于我们假设因子溢价 λ 与残差项 ϵi 不相关,因此其协方差项为 0:
Cov(βi′λ,ϵi)=0
所以公式简化为:
V(ri)=V(βi′λ)+V(ϵi)
对于其中的第一项,由于 βi 是常数向量(因子暴露在截面上是确定的),根据性质 V(aX)=a2V(X) ,可以转化为:
V(βi′λ)=βi′V(λ)βi
其中, V(λ) 是因子溢价的协方差矩阵,代表了不同因子之间的相关性和各自的波动。 βi′V(λ)βi 整体则代表的系统性风险。
4.2.4.3 最终分解公式
我们最终得到风险分解公式:
V(ri)=系统性风险βi′V(λ)βi+非系统性风险σi2
5. 经济因子的估计
5.1 因子溢价
对于经济因子,其因子溢价一般可以直接获取,但其中也有一些细节需要我们关注:
5.1.1 风险补偿的线性关系
我们之前曾说:因子溢价则是对承担风险所获得补偿的度量。
但是,我们观测到的经济因子数据很可能和实际所需补偿并不一致。例如:本期通货膨胀率为3%,并不意味着我们投资的股票因为受到了通货膨胀的影响时,所以我们要求3%的补偿。这主要有以下两点的原因:
(1)单位不同:通货膨胀率并非以风险术语表示,我们并不能说承担1%的通货膨胀率就应当获得1%的回报;
(2)风险对应关系:并非所有通货膨胀都与风险对应,只有未被预期到的部分才会被认为是风险。
但对于通货膨胀因子(其他类型经济因子见5.1.2节),我们仍然使用通货膨胀率的值(3%->3)作为因子溢价。这是因为我们做出了以下假设:投资者所获得的风险补偿是实际通货膨胀率的线性函数。也就是说,对通货膨胀率x%的暴露并不会带来x%的预期收益率,而是会带来a+bx的预期收益率。
通过这一假设,我们消除了区分真实因子溢价与被观察到的通货膨胀率的必要性,同时,通货膨胀率中被预期到的部分会被常数项a调整。
5.1.2 因子溢价的类型
5.1.2.1 水平型因子
水平型因子本身就代表经济状态或风险程度,因此我们可以直接使用指标的数值作为因子溢价。
典型例子包括失业率、短期利率和我们上面提到的通货膨胀率。
5.1.2.2 变化率型因子
该类因子指标本身是情绪或预期变量,市场更关注变化而非水平,我们需要使用指标的变化率(增长率或变化值)作为因子溢价。
计算方式:
Ft=Xt−1Xt−Xt−1
或:
Ft=Xt−1Xt
或:
Ft=Xt−Xt−1
典型例子包括消费者信心指数、PMI和工业生产指数。
5.1.2.3 利差型因子
该类因子指标的因子溢价使用两个资产收益率之差计算,主要适用于金融市场风险定价变量。
例如,信用风险因子使用高收益债与国债之差衡量,期限结构因子用长短期国债收益率之差衡量。
5.2 因子暴露
经济因子的因子暴露一般是通过股票收益率对因子溢价的时间序列回归来确定。由于回归系数(因子暴露)衡量来被解释变量(股票收益率)对解释变量(因子溢价)变化的敏感程度,因子因子溢价有时也被称为因子敏感度(factor sensitivity)或因子载荷(factor loading)。
5.2.1 标准方法:OLS 回归
经济因子因子暴露的标准估计方法起点与基本面因子的因子溢价估计完全一致,均为:
rit=βi′λt+ϵit
我们希望找到一个 β^i ,使得残差平方和最小,应用最小二乘法估计值为:
β^i=(t=1∑Tλtλt′)−1(t=1∑Tλtrit)
通过对每只股票进行回归,得到所需的因子暴露:
β^1,...,β^N
因子暴露的标准误差为下列方差阵的平方根:
V^(β^i)=σ^i2(t=1∑Tλtλt′)−1
其中 σ^2 是对ϵit 方差的估计:
σ^2=T1t=1∑T(rit−βi′λ)2
以上公式与前面估计基本面因子的因子溢价基本相同,但这里采用的是时间序列回归而非截面回归。
5.2.2 合并公司:线性组合处理
当公司 A 与 B 合并为 AB 时,由于资产的线性组合特性,合并后的风险暴露是原暴露的市值加权:
β^AB=sA+sBsAβ^A+sA+sBsBβ^B
其中 sA,sB 为合并前的市值。
5.2.3 IPO处理:特征匹配法
对于没有历史数据的新公司,我们假设“特征相似的公司,风险暴露也相似”。进而使用以下步骤计算因子暴露:
(1)计算新公司i的基本面特征向量 zi (如市值、杠杆率等)。
(2)在市场上寻找 M 家特征最接近的公司(即满足欧式距离 (zi−zj)′(zi−zj)<e 的公司)。
(3)计算平均值:
β^C=M1(β^1+⋯+β^M)
6. 统计因子的估计
统计因子指的是通过对历史收益率数据进行主成分分析所得到的因子。
注意这里的统计因子与我们之前一直强调的“量化模型应当以可靠的经济理论为基础”并不冲突。因为我们并不是要将上百的因子塞进模型,去找到一个统计学上“巧合”看起来能赚钱的组合,也不是去试上百个因子,找到其中最好的那一个,而是在不预设任何立场的前提下,将高维的、充满噪音的数据压缩成几个核心维度,说明市场整体运动趋势特征。
当然,统计因子同样存在类似数据挖掘的问题:比如在2025年的数据里挖出的主成分,到了2026年可能会完全失效。
6.1 因子溢价与因子暴露
获取统计因子的方法主要是主成分分析(Principal Component Analysis, PCA),核心步骤如下:
假设有 N 只股票在 T 个时期的收益率数据。我们将每个时刻 t 的收益率表示为一个 N 维列向量 rt ,即 rt=(r1t,...rNt)′ ,共有 T 个这样的向量 r1,...rT 。
(1)均值计算
首先计算股票收益率的平均值向量 rˉ :
rˉ=T1t=1∑Trt
(2)计算协方差矩阵
协方差矩阵记录了所有股票两两之间的相关性和各自的波动,其计算公式为:
Σ^=T1t=1∑Trtrt′−rˉrˉ′
(3)矩阵对角化(特征分解)
我们寻找一个正交矩阵Q,使得协方差矩阵转化为对角矩阵 D :
Q′Σ^Q=D
其中:
- D (对角矩阵):对角线上的元素 f1,f2,…,fN 是特征值(Eigenvalues)。它们代表了每个主成分能够解释的“能量”(方差)大小,通常按从大到小排列。
- Q (正交矩阵):每一列 q1,q2,…,qN 称为特征向量(Eigenvectors)。
通俗来理解,我们希望找到在哪些方向上,股票收益率的波动最大。这些方向就是特征向量,而波动的大小就是特征值。
这里计算出的特征向量,就是统计因子的因子暴露。
(4)提取因子溢价
如果我们想要提取前K个最重要的因子,那么我们就可以使用矩阵 Q 的前 K 列对单个股票的收益率进行赋权来得到这 K 个因子的因子溢价:
λ1,t=q1′rt,…,λK,t=qK′rt