股票多因子量化多头策略之组合优化框架——兼谈收益率、风险、交易成本预测

股票多因子量化多头策略之组合优化框架——兼谈收益率、风险、交易成本预测

量化投资策略往往借助数学规划工具确定资产权重,其一是为了更科学地平衡风险收益等优化目标,其二是以此为媒介加入主观、客观约束,统一投资组合生成过程。本文主要面向股票市场中,基于多因子理论的,短周期交易型纯多头Alpha策略,介绍其投资组合优化方法与实践。对于组合优化必须的收益率、风险、交易成本等输入信息,本文也梳理了其主流的预测方法。

组合优化框架

优化目标与约束

均值-方差优化(MVO)是最广泛使用的优化框架,

$$ \max_w w^T \mu - \frac{\gamma}{2} w^T \Sigma w $$

在此基础上加上对换手成本的线性惩罚,就是本文的优化目标。

$$ \begin{aligned} {maximize} \quad & w^T \mu - \gamma \left(f^T \Sigma_{\lambda} f + w^TDw \right) - c^T |w - w_0| \\ {subject \enspace to} & \quad {\bf 1}^T w = 1\\ & \quad 0 \le w \le w_{max} \\ & \quad f = \beta^Tw \\ & \quad |f| \le f_{max} \\ \end{aligned} $$

其中 \(\mu\) 是对下一交易日收益率期望的预测,由收益率模型给出。 函数中的第二项是使用因子模型分解后的组合风险, \(\gamma\)是风险厌恶系数,详细介绍可参考 《Alpha策略中的风险模型》。由于股票市场中候选资产有数千种之多,协方差矩阵可达数千万规模,使用因子模型降维大大简化了对协方差矩阵的估计和计算。最后一项是对换手的线性惩罚,c是交易成本模型给出的估计(或设定超参数),也可替换为二次惩罚。

约束方面十分简化,以最大化alpha模型的性能释放。仅限制了权重是纯多头满仓运行,且个股权重不超过 \(w_{max}\),风格因子绝对值不超过 \(f_{max}\)。可以证明,个股最高权重限制等价于对期望收益率的压缩修正,缓解收益率预测误差过大问题。由于因子协方差矩阵也不十分可靠,因此组合也限制组合风格暴露的绝对值。和业内常用的指数增强优化的约束相比,由于不对标任何指数,本文取消了跟踪误差约束,使得问题简化为QP问题。其次,优化时不直接限制市值、行业暴露,而是通过风险模型进行隐式约束,杜绝无解的可能,这部分在第三节中详细介绍。

实现

以cvxpy为例,本文的优化问题示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import numpy as np
import scipy.sparse as sp
import cvxpy as cp

def factor_prob():
n = 5000
m = 16
np.random.seed(1)
mu = np.abs(np.random.randn(n, 1))
Sigma_tilde = np.random.randn(m, m)
Sigma_tilde = Sigma_tilde.T.dot(Sigma_tilde)
D = sp.diags(np.random.uniform(0, 0.9, size=n))
F = np.random.randn(n, m)

# Factor model portfolio optimization.
w = cp.Variable(n)
w0 = np.random.uniform(size=n, low=0, high=0.1)
f = cp.Variable(m)
gamma = 2
c = 0.003
Lmax = 0.1
ret = mu.T @ w
risk = cp.quad_form(f, Sigma_tilde) + cp.sum_squares(np.sqrt(D) @ w)
turnover = cp.sum(cp.abs(w - w0))
prob_factor = cp.Problem(
cp.Maximize(ret - gamma * risk - c * turnover),
[cp.sum(w) == 1, f == F.T @ w, w <= Lmax, w >= 0, cp.abs(f) <= 0.5],
)
return prob_factor

计算性能上,对于全市场选股问题,使用因子风险模型会使计算性能提升2~3个数量级,对回测而言几乎是必须的,其余部分则影响不大。求解器差异方面,QP问题相对简单,选择面较广,本文也测试了四种常用求解器速度。总的来说,商业方案比开源方案快上不少,在开源方案中,Clarabel的性能是最优的,与Mosek差异不大,这也是cvxpy新的默认求解器。

耗时 倍数
Mosek 159 ms ± 319 µs 1
ECOS 375 ms ± 2.79 ms 2.35
OSQP 2050 ms ± 27.6 ms 12.89
CLARABEL 280 ms ± 4.9 ms 1.76

收益率预测

从最朴素的监督学习视角来看,收益率预测就是统计给定收益率预测变量 \(X_{i,t}\) 后个股的期望收益率 \(E[r_{i,t}|X_{i,t}]\)。但是这一预测十分困难,首先,由于市场环境、情绪、政策法规等因素影响,从特征与期望收益率的关系 \(f_t:X_t \mapsto R_t\) 是时变的 \(f_t \ne f_{t+1}\)(概念漂移)。针对这一点,一方面是使用集成模型、定期更新等经验性的方法,试图保持机器学习系统在动态情况下准确。另一方面,在处理标签和特征时,要尽量剔除系统性因素影响,如计算超额收益等。其次,个股的期望收益率在事后也是不可知的,我们观测到的真实收益率中,绝大部分方差由随机噪声贡献。与机器学习传统应用场景不同,金融数据的属性决定了训练集中样本量少、标注质量极低,因此使用正则化方法防止模型过拟合是很必要的。

收益率预测的具体方法主要是梯度提升决策树模型(GBDT)和神经网络,各具优势。决策树模型计算速度快,不易过拟合,不需要缺失值填充、分布调整等预处理,在中小规模的表格数据问题中,性能往往优于神经网络。神经网络的优势在于结构、损失函数更灵活,与GBDT互补性强。GBDT通常考虑单样本(某只股票在某一期)的预期收益,但神经网络可以将每一期样本作为一个batch,计算截面上因子相关性,如使用CCC Loss。

$$ CCC=\frac{2 \rho_{x y} \sigma_{x} \sigma_{y}}{\sigma_{x}^{2}+\sigma_{y}^{2}+\left(\mu_{x}-\mu_{y}\right)^{2}} $$

收益率模型的前沿讨论青睐引入图学习处理股票关联关系,引入注意力机制处理时变特征等改进。这些论文的实验都基于相当简单的因子库,与业内实践相去甚远,个人认为有浮而不实的嫌疑,不过思路依然可以借鉴。

金融市场中收益率预测的准确度注定极低,应该更多地将它看作一个因子合成器,将底层因子库蕴含的先验知识与盈利能力整合为一个统一预测。

风险预测

多因子风险模型 的目标是模拟股票协方差内部结构(共同风险+特质风险),从而计算组合波动率。

风险因子

风险因子代表股价共同运动背后的驱动因素。传统上,风险因子是人工构造的,如市值因子——相似市值的股票涨跌也会相似。将截面上的股票收益率对风险因子做回归,可以评价风险模型的解释度。

人工专家因子有两个显著弊端:一是必然存在因子遗漏问题,如结构复杂的非线性因子。二是风险模型因子 \(X_{risk}\) 与收益率模型因子 \(X_{ret}\) 不统一,在组合优化阶段会错估风险。

DRM模型 提出用深度学习模型学习风险因子 \(X_{risk}\),减少工作量的同时,大幅提高了风险模型的上限。我们可以学习收益率预测变量到风险因子的映射 \(g:X_{ret} \mapsto X_{risk}\),甚至加入市值、行业等变量,将他们统一转换为隐式因子,更好地管控组合风险。DRM通过设计损失函数,保障了各个因子的独立性和稳定性。

因子协方差

在获取个股风险因子暴露之后,在截面上回归可以获得因子收益率 \(\lambda_{i,t}\),直观理解是在t时刻暴露一个单位的因子i,会获得多少收益。风险模型的主要目的是让因子收益率绝对值尽量高(波动大),但长期来看不要有明显的方向性。

Barra认为因子收益率的相关系数相对稳定,使用较长周期的历史数据进行估计,而因子波动率则与较近时期的因子收益更加相关。因此,分别计算时间衰减加权的因子收益率相关系数矩阵和方差,组合成 因子收益率协方差矩阵 \(\Sigma_\lambda\)。

如果风险因子是日频的,而投资周期更长(如一周),那么应用风险模型时还要考虑因子收益率的自相关性,应用Newey-West调整,但在本文中投资组合是日频调仓的,所以不需要。

由于风险预测的最终目标是降低最优组合波动率,因此还要考虑最优组合偏差。对 \(\Sigma_\lambda\) 做特征分解得到

$$ \Sigma_\lambda = UDU^T $$

其中 \(D\) 是一个对角阵,包含特征值,\(U\)是对应的特征向量,由于

$$ D = U^T \Sigma_\lambda U $$

形式与计算组合风险完全一致,特征值 \(D\) 也可以看作组合风险,\(U\) 可以看作对应的组合权重。这些组合被barra称为特征组合,用于计算特征因子的收益率 \(R_\lambda U\) 。观察不同特征值大小对应的特征组合偏误统计量,发现低波动组合被低估,高波动组合被高估。对特征值缩放后还原因子协方差矩阵,就完成了特征调整,此时不同特征组合偏差明显减小。

eigenfactor wo adj

eigenfactor w adj

最后应用 波动率偏误调整 (Volatility Regime Adjustment),利用一个时间段的偏误统计量,判断模型是否在系统性地高估或者低估了所有因子的收益风险。在截面上定义偏误统计量

$$ B_{t}^{F}=\sqrt{\frac{1}{K} \sum_{k}\left(\frac{\lambda_{k, t}}{\sigma_{k, t-1}}\right)^{2}} $$

对一段时期的总偏误统计量进行加权平均,得到因子波动率调整系数 \(\overline{B}=\Sigma_t{w_t B_t}\) ,对原因子协方差调整。

$$ \tilde{\Sigma_\lambda} = \overline{B} \Sigma_\lambda $$

特质收益波动率

贝叶斯压缩调整 波动率具有连续性,也具有一定反转特性,即波动率较低的股票,很可能未来时刻波动率升高,同样地,波动率较高的股票,很可能未来波动率降低。为了解决这个问题,Barra使用了贝叶斯收缩的方法进行调整。具体而言,将原预测值向一个先验“收缩”,这个先验就是个股所属的市值范围内的全部个股的平均值。容易想到,我们可以使用其他标准将股票聚类,之后将个股特质波动率的预测值 \({\sigma}{i,t}\) 向所在簇的均值 \(\overline{\sigma_k}\) 收缩。收缩强度 \(v{i,t}\) 与点到簇中心距离、簇内样本方差有关。

$$ \tilde{\sigma}_{i,t} = (1-v_{i,t}){\sigma}_{i,t} + v_{i,t}\overline{\sigma_k} $$

将股票按每日波动率预测值分组,压缩前,各组的偏误统计量呈单调下降趋势,低波动组的波动率被低估,高波动组被高估。使用kmeans算法聚类每日个股风格暴露,将预测值压缩调整后,各组偏误统计量接近1,无明显趋势。

ID Shrinkage

波动率偏误调整 与上一节的波动率偏误调整完全一致,考虑同一时间截面上所有股票的特异波动,判断模型是否在某些时间段内系统性地高估或者低估了所有股票的特异性风险,并根据此波动率偏误对截面上的特异性收益方差矩阵进行整体缩放,从而提高协方差的反应速度。

$$ B_{t}^{D}=\sqrt{\frac{1}{N} \sum_{n}\left(\frac{u_{n, t}}{\sigma_{n, t-1}}\right)^{2}} $$

观察偏误统计量的时序变化,应用VRA后,特质波动率预测反应更灵敏,大幅减少了极端高估/低估情况,统计量在1.0附近波动。

ID VRA

交易成本预测

本文提出的策略主要考虑小资金操作,因此目标函数中对换手率做线性惩罚,c可以是一个设定的常数。

$$ cost = c^T |w - w_0| $$

但严格来说,每只股票的流动性不同,付出的交易成本也存在差异,在组合优化阶段预测交易成本才能更接近最优解。越是接近高频,接近交易的算法总是越讳莫如深,为了让读者直观了解交易成本分析(transaction cost analysis, TCA),在此介绍一种名为I-star的市场冲击模型。

I-Star模型最早由Kissell and Malamut (1998)提出,模型首先建模了订单成交占比造成的价格瞬时冲击

$$ I_{b p}^{*}=a_{1} \cdot\left(\frac{Q}{A D V}\right)^{a 2} \cdot \sigma^{a 3} $$

其中 \(a_1,a_2,a_3\) 均为参数,\(Q\) 为市场不均衡程度(主动买入/卖出量的差额), \(ADV\) 为日均成交量, \(\sigma\) 是股价日波动率。在交易中,I-Star代表的是如果所有股票都投放市场,投资者产生的理论瞬时冲击成本。这部分成本也可被视为吸引更多卖家或买家进入市场所需的总付款,比如卖家为完成订单而给予的折扣。

总的市场冲击成本由瞬时冲击和永久性价格变动两部分组成,

$$ M I_{b p}=b_{1} \cdot I^{*} \cdot P O V^{a_4}+\left(1-b_{1}\right) \cdot I^{*} $$

\(POV\) 为订单成交额占比, \(a_4, b_1\) 为模型参数。

事后统计的交易成本可以用vwap和到达价格 \(P_0\) 计算,

$$ Cost = ln(\frac{vwap}{P_0}) \cdot Side $$

股票多因子量化多头策略之组合优化框架——兼谈收益率、风险、交易成本预测

https://heth.ink/PortfolioOptimization/

作者

YK

发布于

2024-03-18

更新于

2024-03-18

许可协议