4、线性规划基础:线性规划的标准形式、单纯形法原理、在组合构建中的简单应用

线性规划(Linear Programming, LP)是运筹学中发展最成熟、应用最广泛的优化工具之一。在组合构建场景中,无论是资产配置、行业轮动还是风险平价,其核心往往是在一组线性约束下寻找某个线性目标函数的最优值。本章从线性规划的标准形式出发,剖析单纯形法的几何与代数原理,并展示其在投资组合构建中的典型应用路径。

线性规划在组合构建中的知识框架 标准形式 目标函数:min cᵀx 约束条件:Ax = b 非负限制:x ≥ 0 · 等式约束(引入松弛/剩余变量) · 右端项 b ≥ 0 · 变量非负 单纯形法原理 1. 初始可行基(BFS) 2. 检验数 σⱼ = cⱼ - c_BᵀB⁻¹Aⱼ 3. 入基/出基变量选择 4. 旋转运算(高斯消元) · 顶点迭代,有限步收敛 · 最优性条件:所有 σⱼ ≥ 0 组合构建应用 · 权重变量 wᵢ ≥ 0 · 预算约束 Σwᵢ = 1 · 目标:最大化预期收益 · 或最小化组合风险 · 行业/风格暴露约束 · 换手率限制 组合构建中的线性规划求解流程 问题建模 标准化转换 单纯形迭代 灵敏度分析 组合输出 核心:将投资逻辑转化为线性约束,利用单纯形法在可行域顶点中高效搜索最优解 关键:约束矩阵的稀疏性、数值稳定性、退化处理

4.1 线性规划的标准形式与转换规则

线性规划的标准形式是算法实现与理论分析的统一语言。任何线性规划问题都可以通过代数变换转化为标准形式,从而直接调用成熟的求解器(如CPLEX、Gurobi、SciPy linprog)。标准形式定义如下:

minimize    c₁x₁ + c₂x₂ + ... + cₙxₙ
subject to  a₁₁x₁ + a₁₂x₂ + ... + a₁ₙxₙ = b₁
            a₂₁x₁ + a₂₂x₂ + ... + a₂ₙxₙ = b₂
            ...
            aₘ₁x₁ + aₘ₂x₂ + ... + aₘₙxₙ = bₘ
            x₁, x₂, ..., xₙ ≥ 0

其中 c 为目标系数向量,A 为 m×n 约束矩阵,b 为右端项向量,且要求 b ≥ 0。标准形式的核心特征包括:目标函数为最小化、所有约束为等式、所有变量非负。

4.1.1 非标准形式的转换方法

原始形式转换操作标准形式结果
最大化目标 max cᵀx目标函数乘以 -1min -cᵀx
不等式约束 aᵢᵀx ≤ bᵢ引入松弛变量 sᵢ ≥ 0aᵢᵀx + sᵢ = bᵢ
不等式约束 aᵢᵀx ≥ bᵢ引入剩余变量 sᵢ ≥ 0aᵢᵀx - sᵢ = bᵢ
变量 xⱼ 无符号限制令 xⱼ = xⱼ⁺ - xⱼ⁻xⱼ⁺ ≥ 0, xⱼ⁻ ≥ 0
右端项 bᵢ < 0约束两边乘以 -1-aᵢᵀx = -bᵢ ≥ 0
经验提示:在组合构建中,常见的约束如“行业权重不超过10%”属于 ≤ 型不等式,需要引入松弛变量;而“最低收益目标”属于 ≥ 型不等式,需要引入剩余变量。这些转换虽然简单,但直接影响约束矩阵的稀疏性和求解效率。

4.2 单纯形法原理:从几何直觉到代数实现

单纯形法的核心思想是:线性规划的最优解一定出现在可行域的顶点(极点)上。可行域是由约束条件围成的凸多面体,顶点数量有限但可能极大(组合爆炸)。单纯形法从一个初始顶点出发,沿着可行域的边移动到相邻顶点,每一步都使目标函数值改善,直到达到最优。

4.2.1 单纯形法的代数机制

  1. 初始可行基:从标准形式中选取 m 个线性无关的列向量构成基矩阵 B,对应基变量 x_B = B⁻¹b。若 b ≥ 0,则得到初始基本可行解。
  2. 检验数计算:对每个非基变量 xⱼ,计算检验数 σⱼ = cⱼ - c_BᵀB⁻¹Aⱼ。若所有 σⱼ ≥ 0,当前解已是最优。
  3. 入基与出基:选择检验数最小的负值对应的非基变量入基(最大改善原则),再通过最小比值法则确定出基变量,保证可行性。
  4. 旋转运算:对增广矩阵进行高斯消元,更新基矩阵的逆和所有变量的值,完成一次迭代。
核心原理:单纯形法本质上是在可行域的顶点之间进行“爬山”搜索。由于目标函数是线性的,最优值必然在某个顶点取得。每次迭代相当于沿着一条边移动到相邻顶点,目标函数值单调下降(或至少不上升)。对于标准形式的 m 个等式约束和 n 个变量,顶点数量最多为 C(n,m) 个,但单纯形法通常只需迭代 2m 到 3m 次即可收敛。

4.2.2 退化与循环问题

当基本可行解中存在基变量取值为 0 时,称为退化。退化可能导致目标函数值在多次迭代中不改善,甚至出现循环(理论上存在,实际极少见)。工程中通常采用 Bland 规则(按最小下标选择入基/出基变量)或摄动法来避免循环。

4.3 线性规划在组合构建中的简单应用

组合构建问题天然适合线性规划建模。以经典的“均值-方差”框架为基础,我们可以将组合优化问题转化为线性规划形式,从而利用成熟的单纯形法求解器高效获得最优权重。

4.3.1 组合构建的线性规划建模

考虑一个包含 n 个资产的组合,设 wᵢ 为资产 i 的权重,rᵢ 为预期收益率。一个典型的线性规划组合构建问题可以表述为:

最大化     Σ rᵢwᵢ
约束条件   Σ wᵢ = 1          (预算约束)
           wᵢ ≥ 0            (禁止做空)
           Σ βᵢwᵢ ≤ β_max    (行业/风格暴露约束)
           Σ |wᵢ - wᵢ⁰| ≤ T  (换手率限制)

其中 wᵢ⁰ 为初始权重,T 为最大换手率。换手率约束中的值项可以通过引入辅助变量转化为线性形式:令 uᵢ ≥ wᵢ - wᵢ⁰,vᵢ ≥ wᵢ⁰ - wᵢ,则 |wᵢ - wᵢ⁰| = uᵢ + vᵢ,且 uᵢ, vᵢ ≥ 0。

4.3.2 案例拆解:行业中性化组合构建

背景与约束:某资产管理公司管理一只行业中性化股票组合,基准为沪深300指数。投资经理需要在保持行业暴露与基准一致的前提下,最大化组合的预期超额收益。组合包含 50 只股票,分属 10 个行业。

关键输入数据:

  • 每只股票的预期超额收益 αᵢ(由多因子模型估计)
  • 每只股票所属行业 j(i)
  • 基准中每个行业的权重 hⱼ
  • 单只股票最大权重限制:5%
  • 行业偏离限制:|行业权重 - 基准行业权重| ≤ 1%

线性规划模型:

最大化     Σ αᵢwᵢ
约束条件   Σ wᵢ = 1
           wᵢ ≥ 0, wᵢ ≤ 0.05
           Σ_{i∈行业j} wᵢ - hⱼ ≤ 0.01   (行业超配上限)
           hⱼ - Σ_{i∈行业j} wᵢ ≤ 0.01   (行业低配上限)

求解过程与结果:使用 Python 的 SciPy 库调用单纯形法求解器(linprog 方法='highs'),将上述模型转化为标准形式后求解。求解结果如下:

指标基准组合优化组合变化
预期超额收益(年化)0%3.2%+3.2%
行业偏离(最大)0%0.98%接近上限
单票最大权重2.1%4.8%接近上限
有效股票数量5038集中度提升

分析判断过程:求解器在 12 次迭代后收敛,最优解中 12 只股票权重为 0(被剔除),其余 38 只股票中 5 只触及 5% 的上限。行业约束方面,有 3 个行业触及偏离上限,说明这些行业的股票 α 较高,但受限于中性化要求无法进一步超配。

风险与代价:行业中性化约束显著限制了组合的进攻性。若放宽行业偏离限制至 ±2%,预期超额收益可提升至 4.1%,但行业风险敞口相应增大。此外,单纯形法求解的线性规划假设目标函数和约束均为线性,实际中交易成本、冲击成本等非线性因素需要额外处理。

常见误区:初学者容易将组合构建中的非线性约束(如风险约束 wᵀΣw ≤ σ_max)直接放入线性规划模型。这是错误的——风险约束是二次的,需要使用二次规划(QP)或将其线性化(如通过历史场景模拟)。线性规划仅适用于目标函数和约束均为线性的场景。

4.4 灵敏度分析与实际应用要点

单纯形法的一个显著优势是能够提供灵敏度分析信息。在组合构建中,这表现为:

  • 影子价格:约束条件的对偶变量值,表示放松该约束一个单位对目标函数的边际改善。例如,行业偏离限制的影子价格为 0.8%,意味着若将偏离上限从 1% 放宽到 1.1%,预期超额收益可增加约 0.008%。
  • 目标系数灵敏度:每个资产的 αᵢ 在多大范围内变化时,最优组合不变。这有助于判断 α 估计误差对组合的影响。
  • 右端项灵敏度:约束右端值(如预算、权重上限)的变化范围,超出范围后最优基将改变。

4.4.1 组合构建中的工程实践建议

  1. 矩阵稀疏性:组合构建的约束矩阵通常非常稀疏(每个约束只涉及少量变量),应使用稀疏矩阵存储和求解器。
  2. 数值稳定性:当资产数量超过 1000 时,约束矩阵的条件数可能很大,建议先对数据进行标准化处理。
  3. 求解器选择:商业求解器(Gurobi、CPLEX)在数值稳定性和速度上优于开源求解器,但开源方案(HiGHS、GLPK)在中小规模问题上表现足够。
  4. 模型验证:求解后应检查 KKT 条件(对偶可行性、互补松弛性)以验证解的正确性。
总结复盘:线性规划是组合构建的基石工具。通过标准形式转换,我们可以将投资逻辑(预算、行业中性、换手限制)转化为数学约束;通过单纯形法,我们能够在可行域顶点中高效搜索最优解;通过灵敏度分析,我们能够理解约束的“价值”和最优解的稳健性。在实际应用中,务必区分线性与非线性约束,避免模型误设。下一层次,我们将探讨当目标函数或约束引入二次项时,如何从线性规划自然过渡到二次规划,以及内点法如何在大规模组合优化中发挥优势。