假设你在调一杯饮料:糖多一点,口感更讨喜,但负担也更高。投资组合面对类似的取舍——想多拿预期收益,通常要承受更多波动。麻烦在于,资产一多、又规定不能做空或不能借太多钱,怎样找出所有值得考虑的配方,就成了一道不轻松的计算题。
Thomas Schmelzer 的这篇文章提出一个实用转写:把经典的 Markowitz 组合优化,交给现成的 LASSO 路径求解器。LASSO 原本是一种回归方法,会在拟合误差之外惩罚系数的绝对值,从而把部分系数压到零。Schmelzer 与 Trevor Hastie 此前论证,在特定变量变换和约束下,LASSO 的解路径与 Markowitz 临界线算法画的是同一条曲线。这篇新文章则展示,如何直接调用 scikit-learn 的 lars_path 来计算它。
需要先说明:方法、实验和性能数字都来自 Schmelzer 的这一篇文章。虽然作者用独立的二次规划程序核对了结果,但目前材料没有第三方复现。
不再沿曲线逐点摸索
Markowitz 有效前沿,是风险—回报取舍中那条“没有明显更优替代品”的边界:在给定预期收益时,它找风险最低的组合;在给定风险时,它找预期收益最高的组合。
常见计算方式,是先选一排风险偏好参数,再对每个参数分别求解一次二次规划,也就是目标函数含平方项的优化问题。这像在地图上每隔一公里打一个点。点取得越密,计算越多;取得太疏,又可能错过路线转弯的位置。
临界线算法(Critical Line Algorithm,CLA)换了一种走法。随着风险偏好变化,最优权重通常沿直线移动;只有当某项资产进入或退出组合时,方向才改变。这些改变持仓结构的位置叫“角点”。CLA 从一个角点走到下一个角点,不必预先铺设参数网格。
LASSO 路径也有相似结构。惩罚强度变化时,它的系数分段线性移动,只在变量进入或退出时转向;统计学把这些转折称为 knots。论文的关键观察是:经过变量变换后,两边的权重路径与转折点可以对应起来。这里的 LASSO 不是在根据观测数据建立预测模型,而是借用它成熟的路径计算机制。
妙处是换一副坐标
作者从资产收益的协方差矩阵出发。协方差衡量资产如何共同波动,也是组合风险的核心输入。对它取一个矩阵平方根,再把预期收益作相应变换,均值—方差目标就能写成最小二乘形式——也就是让一组系数尽量贴近一个目标向量。
这一步把两个领域接了起来。组合优化里的持仓权重,对应回归里的系数;限制总头寸的 约束,对应 LASSO 对系数绝对值之和的约束;资产进入或退出最优组合,则对应 LASSO 路径上的变量进入或退出。
因此,算法不再反复问“这个风险偏好下的最优组合是什么”,而是一次追踪整条分段线性路径。角点之间的组合可以插值得到。
论文讨论了三种情形。第一种是允许做多和做空,但限制总敞口。做空时,正负头寸可能彼此抵消净值,实际仓位却很大,所以需要用总敞口控制杠杆。作者称,这时普通 LASSO 路径直接对应有效前沿。
第二种是固定杠杆、改变风险偏好。相同路径经过缩放即可复用。
第三种是经典的仅做多、完全投资组合:权重不能为负,且资金全部投出。这里要启用非负 LASSO,但还有一个容易踩到的终点问题。
为什么普通调用会提前停车
直接运行 lars_path(..., positive=True),路径会在最大 Sharpe 比率组合处停止。Sharpe 比率衡量每承担一单位风险获得多少超额收益;它的具体位置取决于收益定义、无风险利率和可行域。
但最大 Sharpe 组合并不是整条有效前沿的终点。继续降低对收益的偏好,组合还会走向最小方差组合,也就是完全投资约束下风险最低的位置。问题出在通用 LASSO 求解器不接受负的惩罚参数,而这段组合路径在原来的写法中恰好需要越过零。
作者的处理是先计算一个响应变量的平移量,把路径整体挪动,使原本落在负区间的部分重新进入求解器可走的范围。这个平移量不能随便指定:论文先根据最小方差组合的支持集——即最终仍有非零权重的资产——计算最后一个角点的界,再留出适当余量。完成这项预计算后,一次 lars_path 调用即可覆盖到最小方差端点。所谓“一次调用”,因此不等于没有额外计算。
数字说明了什么
按论文报告,在最多 500 项资产的因子模型上,路径得到的每个角点都与独立二次规划结果吻合。因子模型用少量共同因素描述大量资产的联动,可避免直接处理全部两两关系。原文抓取材料中的部分误差数值缺失,无法完整转述其精度表。
在作者使用的真实数据测试中,样本包含 494 只 S&P 500 股票、1213 个交易日,时间覆盖 2021 年 7 月至 2026 年 5 月。一次路径调用返回全部 94 个角点,用时 0.14 秒。相比之下,求解 100 个参数点的二次规划网格,冷启动约需 12 秒;复用前次结果的热启动约需 4.9 秒。网格即使花了更多时间,仍不会自动给出落在网格点之间的角点。
这些数字来自一台笔记本电脑上的单篇论文实验,不能直接推广成普遍性能保证。它们真正支持的判断更窄:在作者给定的数据、实现和设置下,成熟的 LASSO 路径工具确实能一次返回完整的转折结构,并与独立求解器相互核验。
为什么值得关注
有意思的不只是“借用一个 Python 函数”。CLA 和 LASSO 分属投资组合与统计学习,两套文献长期各自发展。现在,一类经典组合问题可以直接借用 scikit-learn 和 R 中已经普及的路径算法。对使用者来说,这降低了实现完整前沿的门槛;对研究者来说,它也提醒我们,不同学科里名字完全不同的问题,可能只是坐标写法不同。
它还改变了结果的呈现方式。参数网格给出一串采样点;路径算法给出持仓结构真正发生变化的位置。前者像截图,后者更接近路线图。
局限与未知
- 这种等价依赖特定目标函数、约束和变量变换,不能把“CLA 等于 LASSO”无条件推广到所有组合优化问题。作者也指出,协方差矩阵奇异时,这一对应是否仍成立尚不清楚。
- scikit-learn 的标准路径只能处理一项主要线性约束及统一符号限制。美元中性、同时要求预算与总敞口上限,或包含更多线性约束的组合,不能直接套用本文方案。
- 速度和精度结果来自作者自己的实现与测试。代码虽已公开,并附有固定随机种子的模拟与检查脚本,但材料未提供独立复现或第三方评测。