量化百科

Barra 模型的填坑、讨论帖

由polll创建,最终由polll 被浏览 79 用户

最近一段时间我在微信公众号和知乎专栏上写了一些 Barra factor model 的文章;有不少朋友关注并追问了很多问题。比如:

  • Newey-West 调整怎么做?
  • 对因子收益率协方差矩阵的 eigenfactor risk adjustment 是啥?
  • 对特异性波动率的贝叶斯收缩咋回事儿?

我想干脆开个帖子,**不定期更新我对 Barra 模型的学习笔记和实证心得。**感兴趣的朋友可以关注这个帖子。**这个帖子就不往专栏里放了,因为它的目的是持续的探讨和思考。**以后里面的讨论单独成文时,会放在专栏里。之前已有的文章包括:

正确理解 Barra 的纯因子模型

协方差矩阵的 Newey-West 调整

以后每个更新用分隔符隔开,且在本文开头给出更新日志。

  • 2018/06/27,特异性波动率的贝叶斯收缩
  • 2018/06/27,协方差矩阵的 eigenfactor risk 调整
  • 2018/06/28,纯因子模型求解
  • 2018/07/17,写了一篇纯因子模型求解,里面包括一点简单实证
  • 2018/08/09,做了点 Newey-West 调整的简单验算

2018/08/09 更新:一点关于 Newey-West 的简单验算

本次更新的目的是为了看看经过 Newey-West 调整的协方差矩阵是否满足半正定性质。关于 Newey-West 调整的说明,请参考:

石川:协方差矩阵的 Newey-West 调整​zhuanlan.zhihu.com 图标{w:100}{w:100}

我使用 RQ提供的风格因子收益率进行验证。RQ的风格因子构建模拟了 Barra CNE5 中的十类风格因子。

首先,以沪深 300 为股票池,返回十类因子在给定区间内(2017/08/01 ~ 2018/01/01)的日频因子收益率 dfr 并去均值化,这是一个 DataFrame,index 是日期,columns 是因子名称:

dfr = get_factor_return('2017-08-01','2018-01-01',factors='all',universe='000300.XSHG',method='explicit')
dfr -= dfr.mean()

根据 Newey-West 调整,滞后期 i{w:100}{w:100} 的协方差矩阵数学表达式为(下面除以 T-1{w:100}{w:100} 是为了得到无偏估计):

displaystyle mathbf{Gamma}{w:100}{w:100}

为了得到这个协方差矩阵,定义如下 UDF:

def gamma_func(dfr, i=1):
    T = len(dfr.index)
    tmp = np.zeros([len(dfr.columns),len(dfr.columns)])
    for t in range(0, T - i):
        tmp += np.outer(dfr.ix[t,:],dfr.ix[t+i,:])
    tmp /= (T - 1)
    return pd.DataFrame(tmp, index=dfr.columns, columns=dfr.columns)

有了上述公式后,按照下面的式子进行协方差矩阵的 Newey-West 调整:

begin{array}{rlll} &mathbf{V_f}&=&displaystylemathbf{Gamma}{w:100}{w:100}

假设总滞后期 q = 10{w:100}{w:100} ,Newey-West 调整的代码为:

q = 10
g0 = dfr.cov()
for qi in range(0,q):
    qi += 1
    gi = gamma_func(dfr, qi)
    w = 1 - qi/(1+q)
    g0 += w*(gi + gi.T)

上面得到的最终的 g0 就是经过 Newey-West 调整的协方差矩阵。可以利用下面这个 UDF 来检验它所有的特征值是否均非负,从而判断它是否满足半正定:

def is_pos_def(x):
    return np.all(np.linalg.eigvals(x) >= 0)

如果满足半正定,则该 UDF 返回 True,否则返回 False。

对于上面导入的因子收益率采用这个 Newey-West 调整,最后得到修正后 cov 矩阵的特征值为:

array([6.72759156e-05, 3.60858591e-05, 1.31283264e-05, 7.74735635e-06,
       3.08015235e-06, 2.79164097e-06, 1.92399929e-06, 6.56434188e-07,
       1.12718340e-06, 1.02346240e-06])

它们全都大于等于零,半正定检验结果为 True。


2018/07/17 更新:纯因子模型的求解的简单实证

石川:Barra 因子模型截面回归求解​zhuanlan.zhihu.com 图标{w:100}{w:100}


2018/06/28 更新:纯因子模型的求解

有个朋友问 Barra 的截面回归具体数学求解时怎样的,尤其是在求解时如何处理国家因子和行业因子间共线性这个约束条件。今天的更新就来简单说说这方面。

Menchero and Lee (2015) 给出了求解 Barra 截面回归的简要步骤。为了方便起见,下文用粗体的小写字母表示向量、粗体的大写字母表示矩阵。由此,多因子模型可以表示为:

bf r = bf Xbf f+bf u{w:100}{w:100}

其中 bf X{w:100}{w:100} 是因子暴露矩阵。假设一共有 1+P+Q=K{w:100}{w:100} 个因子(1 个国家,P 个行业,Q 个风格),那么 bf X{w:100}{w:100} 是一个 Ntimes K{w:100}{w:100} 阶矩阵:

begin{equation} label{eq:X} bf X = leftbegin{array}{ccccccc} displaystyle 1&X_1^{I_1}&cdots&X_1^{I_P}&X_1^{S_1}&cdots&X_1^{S_Q} displaystyle 1&X_2^{I_1}&cdots&X_2^{I_P}&X_2^{S_1}&cdots&X_2^{S_Q} displaystyle vdots&vdots&ddots&vdots&vdots&ddots&vdots displaystyle1&X_N^{I_1}&cdots&X_N^{I_P}&X_N^{S_1}&cdots&X_N^{S_Q} end{array} right end{equation}{w:100}{w:100}

bf r{w:100}{w:100} 为股票的超额收益向量,即 mathbf{r}=r_1-r_f, r_2-r_f,cdots,r_N-r_f^T{w:100}{w:100}bf f{w:100}{w:100} 为因子的因子收益向量,或 mathbf{f}=f_C, f_{I_1},cdots,f_{I_P},f_{S_1},cdots,f_{S_Q}^T{w:100}{w:100}bf u{w:100}{w:100} 为股票的特异性收益向量,或 mathbf{u}=u_1, u_2,cdots,u_N^T{w:100}{w:100}

bf Omega{w:100}{w:100} 为待求解的纯因子投资组合权重矩阵。它是一个 Ktimes N{w:100}{w:100} 阶的矩阵,它的每一行都是一个 1times N{w:100}{w:100} 的行向量,为其对应因子的投资组合中所有 N 支股票的权重。 bf Omega{w:100}{w:100} 具体可以表达为:

begin{equation} label{eq:omega} bf Omega = leftbegin{array}{cccc} displaystyle omega_{C1} &omega_{C2}&cdots&omega_{CN} displaystyle omega_{I_11} &omega_{I_12}&cdots&omega_{I_1N} displaystyle vdots&vdots&ddots&vdots displaystyle omega_{I_P1} &omega_{I_P2}&cdots&omega_{I_PN} displaystyle omega_{S_11} &omega_{S_12}&cdots&omega_{S_1N} displaystyle vdots&vdots&ddots&vdots displaystyleomega_{S_Q1} &omega_{S_Q2}&cdots&omega_{S_QN} end{array} right end{equation}{w:100}{w:100}

为了求解 bfOmega{w:100}{w:100},我们还需要用到另外两个矩阵,即回归系数矩阵 bf V{w:100}{w:100} 和约束矩阵 bf R{w:100}{w:100}。约束矩阵对应的是下面这个因为国家和行业共线性造成的约束条件:

s_{I_1}f_{I_1}+s_{I_2}f_{I_2}+dots+s_{I_P}f_{I_P}=0{w:100}{w:100}

回归系数矩阵 bf V{w:100}{w:100} 是一个 Ntimes N{w:100}{w:100} 阶对角阵,第 n 个对角元素代表着股票 n 的回归系数 v_n{w:100}{w:100},它和股票 n 的市值权重的平方根即 sqrt {s_n}{w:100}{w:100} 成正比,并满足

sum_n v_n=1{w:100}{w:100}

因此,很容易得到

v_n = frac{sqrt s_n}{sum_{i=1}^Nsqrt s_i}{w:100}{w:100}

bf V{w:100}{w:100} 则可以表达为

begin{equation} label{eq:regression weight} bf V = leftbegin{array}{cccc} displaystyle v_{1} &0&cdots&0 displaystyle 0 &v_2&cdots&0 displaystyle vdots&vdots&ddots&vdots displaystyle 0 &0&cdots&v_N end{array} right end{equation}{w:100}{w:100}

使用回归系数矩阵是基于如下的考虑:**股票的特异性收益率的标准差(风险)是不相同的。因此在构建纯因子投资组合时,应该加以考虑这一点,使得构建的纯因子投资组合对于它对应的因子风险最低。**这在数学上可以通过在回归时,给股票加上基于特异性风险的回归权重,即带权重的最小二乘法回归。**然而,股票的特异性风险是不可测的。经验表明,股票的特异性风险与它的总市值平方根的倒数成正比。**因此,我们就用市值的平方根来作为回归权重。这就是使用回归系数矩阵 bf V{w:100}{w:100} 的意义。

**使用约束矩阵 bf R{w:100}{w:100} 的原因是为了反映上面提到的那个约束条件在求解时对行业因子收益率的限制条件。**根据 Ruud (2000) 提出的理论,K 个因子收益率之间的约束条件(在此我们仅有一个约束条件)可以由以下等式表达:

begin{equation} label{eq:constraint eq} leftbegin{array}{c} f_Cf_{I_1}vdotsf_{I_P}f_{S_1}vdotsf_{S_Q} end{array} right = leftbegin{array}{cccccccc} displaystyle 1 &0&0&cdots&0&0&cdots&0 displaystyle 0 &1&0&cdots&0&0&cdots&0 displaystyle vdots&vdots&vdots&ddots&vdots&vdots&ddots&vdots displaystyle 0&displaystyle-frac{s_{I_1}}{s_{I_P}} & displaystyle-frac{s_{I_2}}{s_{I_P}}&cdots&displaystyle-frac{s_{I_{P-1}}}{s_{I_P}}&0&cdots&0 displaystyle 0 &0&0&cdots&0&1&cdots&0 displaystyle vdots&vdots&vdots&ddots&vdots&vdots&ddots&vdots displaystyle 0 &0&0&cdots&0&0&cdots&1 end{array} right leftbegin{array}{c} f_Cf_{I_1}vdotsf_{I_{P-1}}f_{S_1}vdotsf_{S_Q} end{array} right+ leftbegin{array}{c} 00vdots00vdots0 end{array} right end{equation}{w:100}{w:100}

上式中,等号右边的矩阵就是约束矩阵 bf R{w:100}{w:100},它是一个 Ktimes K-1{w:100}{w:100} 阶矩阵,这是因为所有K 个因子收益率变量之间有一个约束条件,因此它们的自由度为 K-1。在具体构造 bf R{w:100}{w:100} 时,我们将 f_{I_p}{w:100}{w:100} 用其他行业收益率的线性组合来表达。

在有了 bf X{w:100}{w:100}bf R{w:100}{w:100} 以及 bf V{w:100}{w:100} 之后,利用带约束条件的最小二乘法求解即可得到纯因子投资组合的股票权重矩阵 bfOmega{w:100}{w:100}

mathbf Omega=mathbf Rleft(mathbf R^Tmathbf X^Tmathbf Vmathbf Xmathbf Rright)^{-1}mathbf R^Tmathbf X^Tmathbf V{w:100}{w:100}

其中 -1 表示矩阵的逆矩阵。

得到 bf Omega{w:100}{w:100} 之后,便可由下式计算出所有因子在当期的收益率:

f_k = sum_{n=1}^Nomega_{kn}r_n{w:100}{w:100}

这就是 Barra 模型截面回归的求解。

参考文献

  • Menchero, J. and J.-H. Lee (2015). Efficiently combining multiple sources of alpha. Journal of Investment Management, Vol. 13(4), 71 - 86.
  • Ruud, P. A. (2000). An Introduction to Classical Econometric Theory. New York, NY: Oxford University Press.

2018/06/27 更新:特异性波动率的贝叶斯收缩

Barra 的 USE4 research note 把这个问题写的听清楚,可以参考文献(5.2 节和附录 A):Menchero, J., D. J. Orr, and J. Wang (2011)._The Barra US Equity Model (USE4)._MSCI Barra Research Notes.

贝叶斯收缩是一个常见的将先验和后验结合起来的手段,它可以理解为先验和后验的线性组合。在这个具体问题里,Barra 首先计算出了个股自己的特异性波动率,这是后验,然后他们认为这有可能是不准的、有偏的(关于有偏的论述,参考上面参考文献中的 Appendix A),所以需要根据先验来矫正一下这个后验。这就好比先验就是我们认为正确的特异性波动率,所以我们把样本数据计算出来的后验特异性波动率向着先验来 push,这就是“收缩”一词的意思,这就是为什么这个技术较贝叶斯收缩。

那么什么是先验呢?对于任意给定的个股(比如 Apple),Barra 采用一大堆个股特异性收益的波动率的均值作为先验。这个“一大堆”是什么呢?Barra 把所有个股按照市值分成十档,然后找到我们目标个股 —— Apple —— 所在的市值那一档,而这一档中的所有股票就是这“一大堆”。然后计算这一大堆中所有股票的特异性波动率,取它们的平均。怎么取呢?不是简单的等权,而是按照市值加权的。这个使用和 Apple 处在同一市值这一档所有股票(一大堆)按照市值权重计算出来的特异性波动率就是先验。

s_n{w:100}{w:100} 表示市值档位, hat σ_n{w:100}{w:100} 表示 s_n{w:100}{w:100} 中股票 n{w:100}{w:100} 的特异性收益率, w_n{w:100}{w:100} 表示 s_n{w:100}{w:100} 中股票 n{w:100}{w:100} 的按照其市值计算出来的权重。则这个先验的表达式为:

barsigma(s_n)=sum_{nin S_n}w_nhat sigma_n{w:100}{w:100}

有了先验,有了后验,还差一步:把这二者线性组合在一起:

\sigma_n^{SH} \n u_n\bar \sigma(s_n)+(1 \n u_n)\hat \sigma_n

上式中等式左侧就是收缩后的最终特异性波动率,等式右侧的 \n u_n 就是赋予给先验的权重,称为收缩强度系数。

\n u_n 怎么确定呢?**它和目标股票以及它所属的这一市值档中的所有其他股票的预测误差(后验和先验的偏离程度)有关。**具体来说, \n u_n 的表达式为:

\n u_n=\frac{q|\hat\sigma_n-\bar\sigma(s_n)|}{\displaystyle\sqrt{\frac{1}{N(s_n)}\sum_{j\in s_n}(\hat\sigma_j-\bar\sigma(s_n))^2}+q|\hat\sigma_n-\bar\sigma(s_n)|}

上式中,q 是一个经验压缩系数, N(s_n){w:100}{w:100} 是市值档位 s_n{w:100}{w:100} 中所有股票的个数。这个表达式中的分子以及分母中的第二项的 |hatsigma_n-barsigma(s_n)|{w:100}{w:100} 表示了我们的目标股票,比如 Apple,它的后验特异性波动率和其先验之间的偏离程度;而上式分母中的第一项表示了市值档位 s_n{w:100}{w:100} 中所有股票的特异性波动率和其先验偏离程度的标准差

偏离程度标准差是这一大堆股票的平均偏离程度的一个度量;而 |hatsigma_n-barsigma(s_n)|{w:100}{w:100}是目标股票偏离程度的一个度量,最终的压缩权重 \n u_n 就由这二者(以及经验系数 q)决定。可以看到, |hatsigma_n-barsigma(s_n)|{w:100}{w:100}越大, \n u_n 就越大,而不要忘记 \n u_n 是赋予先验的权重。这就是说,对于目标个股,后验越不靠谱(它的偏离程度和所有小伙伴的平均偏离程度相比更高),我们越不能相信后验,而是越要相信先验,所以 \n u_n 越大。反之, |hatsigma_n-barsigma(s_n)|{w:100}{w:100}越小,说明这个目标股票特异性波动率的偏离程度低,我们愿意相信它,所以这时赋予先验的权重 \n u_n 就要小点。

在上面 \n u_n 的表达式中,唯一剩下的就是要确定经验系数 q 了。Barra 没有具体说,但是不难想象应该是和 Barra 提到的 Bias Statistic 有关(见上面给出的参考文献中的 Appendix A)。贝叶斯收缩的目的就是为了降低个股特异性波动率的 Bias Statistic,所以可以通过综合考虑所有个股特异性波动率收缩前后 Bias statistic 的改进来找到合适的 q 的取值。

**


**

2018/06/27 更新:因子收益率协方差矩阵的 eigenfactor risk 调整

USE4 模型对因子收益率协方差矩阵进行 Newey-West 调整之后,又进行了 eigenfactor risk 调整。关于 eigenfactor 调整,Barra 最详细的文献应该是下面这篇:

Menchero, J., J. Wang, and D. J. Orr (2011). Eigen-adjusted Covariance Matrices. MSCI Research Insight.

然后 Barra 在 USE4 模型中对因子收益率的协方差矩阵进行了 eigenfactor 调整。我们从上面这篇文章说起。

这里请暂时忘记因子,因为该文研究的对象是个股超额收益的的协方差矩阵(超额收益是相对市场而言的,就可以理解为 alpha{w:100}{w:100} ,但是没有考虑 beta{w:100}{w:100} ):

f_{nt}=r_{nt}-R_t^M{w:100}{w:100}

上式中, r_{nt}{w:100}{w:100} 是股票 n 在交易日 t 的收益, R_t^M{w:100}{w:100} 是该日的市场收益, f_{nt}{w:100}{w:100} 是股票在 t 的超额收益。使用不同股票的超额收益序列,就能计算出样本协方差矩阵:

mathbf{V}{w:100}{w:100}

这里 mathbf{V}_0{w:100}{w:100} 是协方差矩阵,而 mathbf{V}_0(mn){w:100}{w:100} 代表这个矩阵中对应的股票 m 和 n 之间的协方差。

**这是个样本协方差矩阵,它只是未知总体的估计,它是无偏估计吗?是否会在某些特定使用方法下有很大的偏差?**这就是 Barra 关心的。研究是否有偏需要个量化指标,Barra 采用了 Bias statistic。无论对于一个股票还是一个投资组合,把它的收益率用它的标准差标准化: b_t=R_t/sigma_t{w:100}{w:100} ,然后计算 b_t{w:100}{w:100} 的标准差:

B=sqrt{frac{1}{tau-1}sum_{t=1}^tau(b_t-bar b)^2}{w:100}{w:100}

Barra 认为,如果股票或者投资组合的波动率估的比较准确,那么 B 的取值应该在 1 左右。他们首先验证了个股随机选择个股权重而构建的投资组合,发现在这两种情况下,B 都离 1 不远 —— very nice。

{w:100}{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='862' height='480'></svg>)

但是,在现实中,我们并不是投资个股或者一个随机的投资组合,所以上面的结论是不够的。我们投资的都是某种最优化后的组合,比如使用马科维茨 mean-variance optimization 框架得到的最优组合。对于这些组合,它们的 Bias statistic 怎样呢?

怎么考虑这个问题呢?Eigenfactor 就登场了。

对于样本协方差矩阵 mathbf{V}_0{w:100}{w:100} ,我们假设它是满秩的,且使用它的所有特征向量构建一个矩阵 mathbf{U}_0{w:100}{w:100} —— 这个矩阵的每一列就是 mathbf{V}_0{w:100}{w:100} 的一个特征向量。利用线性代数的性质,我们可以用 mathbf{U_0}{w:100}{w:100}mathbf{V}_0{w:100}{w:100} “旋转”一下,变成一个对角阵:

mathbf{D}_0=mathbf{U}_0^{-1}mathbf{V}_0mathbf{U}_0{w:100}{w:100}

**这个数学变换有清晰的业务的含义。**假设一共有 N 个股票,则每一个特征向量都是一个 N × 1 的向量,它里面第 n 个数就代表这第 n 支股票的权重。**以该特征向量中的数值作为权重就得到了一个 eigenfactor portfolio。**由于一共有 N 个特征向量,所以有 N 个 eigenfactor portfolios。更关键的是,它们之间时相互独立的,协方差为 0,这在数学上体现在 mathbf{D}_0{w:100}{w:100} 是个对角阵,其对角线上的每一个数值都是对应的 eigenfactor portfolio 的方差。

那么这些 eigenfactor portfolios 的 Bias statistics 如何呢?是否接近 1 呢?很不幸,答案是否定的。下图是按照 eigenfactor portfolios 的样本方差从小到大顺序将这些组合排列(横坐标),然后查看它们的 Bias statistics(纵坐标)。可见,这二者基本成反比 —— 当 eigenfactor 组合的样本方差小时,它的 Bias statistics 非常大,说明估计值非常不准。

{w:100}{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='444' height='477'></svg>)

**即便如此我们仍然会问 —— 这 eigenfactor portfolios 在实际中有含义吗?**如果我们不按照特征向量中的权重来构建投资组合,那么我们仍然不用 care 这些组合的 Bias statistics 是否很大。

**不幸的是,它们有含义!**这就是 Barra 考虑 eigenfactor 调整的原因。以下是 Barra 的原文:

Eigenfactors are not economically intuitive. However, they do play an important role in portfolio optimization. For instance, the first eigenfactor solves for the minimum variance portfolio subject to the constraint that the sum of squared weights adds up to 1. Similarly, the last eigenfactor solves the corresponding maximum variance problem.

这说的就比较清楚了。它的意思是这些 eigenfactor portfolios 在投资组合构建中有很大的意义。比如,方差最小的 eigenfactor 组合就等价于我们以最小化组合方差为优化目标构建的组合(这句话逻辑真完美。。。);方差最大的 eigenfactor 组合就等价于我们以最大化方差为优化目标(不确定是否有人这么干。。。)而构建的投资组合。

总之你明白我的(Barra 的)意思了,这些 eigenfactor 投资组合和我们最终使用这些个股、以某种最优化目标来构建的最优投资组合有着千丝万缕的联系。因此,如果这些 eigenfactor portfolios 的 Bias statistics 很差,那么我们可以预期,我们最优化得到的投资组合的 Bias statistics 也好不到哪去(下图是 Barra 给的模拟产生的最优化组合的 Bias statistics 例子,都高达 1.4 以上)

{w:100}{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='466' height='477'></svg>)

这就是为什么 Barra 要对协方差矩阵进行 eigenfactor 调整。

读到这里,细心的小伙伴可能会说**“wait a minute,你上面这都是个股协方差矩阵啊,但是 USE4 里面是因子协方差矩阵”。**

好,下面我们说 USE4。

对因子协方差矩阵的 eigenfactor 调整的数学方法和上面完全一致。事实上,在《Eigen-adjusted Covariance Matrices》这篇文章的数学推导中,Barra 就说了计算样本协方差矩阵的“assets”可以是 factors,大类资产以及个股:

{w:100}{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1005' height='316'></svg>)

所以从数学上来说,不管上面是个股协方差矩阵还是因子协方差矩阵,都没问题。

从业务上来说呢,同样对因子协方差矩阵做“旋转”。**假设有 K 个因子,因此得到 K 个特征向量。以这些特征向量为权重得到的 eigenfactor portfolios 恰好就是这 K 个纯因子的某种配置组合。**这句话本身就足以 justify 这个调整了!这就是说,我们分析了半天因子,目的就是为了使用这些因子的风险收益特性来一通优化,把这些因子组合在一起,得到一个多因子组合,然而这种优化的风险估计是有偏的(Bias statistics 显著不为 1,见下图)。

{w:100}{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1209' height='831'></svg>)

因此,对因子的协方差矩阵做 eigenfactor risk 调整也是十分必要的。这就是 Barra 采取这个调整的原因。下图比较了调整前(左图)后(右图)的 Bias statistics,效果显著:

{w:100}{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1193' height='459'></svg>)

上面主要从业务逻辑的角度解释了为什么 Barra 要对因子协方差矩阵进行 eigenfactor risk 调整。具体的数学细节基本上是个 Bootstrap 思想,请阅读上面提到的这篇文章或者是 USE4 文档,这里就不赘述了。

标签

BARRA