跳转到内容

凸优化速览

量化里的优化问题几乎都是凸的

Section titled “量化里的优化问题几乎都是凸的”

均值—方差(均值—方差与其失败)、最小方差、风险平价、带交易成本的再平衡——这些组合问题的目标与约束绝大多数能写成凸形式,从而全局最优、求解器成熟、结果可复现。识别一个问题是不是凸的,是工程实践的第一步。

二次规划(QP)——均值—方差、最小方差:

min⁡w  12w⊤Σw−λ μ⊤ws.t.1⊤w=1,  wmin⁡≤w≤wmax⁡.\min_w \; \tfrac{1}{2} w^\top \Sigma w - \lambda\, \mu^\top w \quad \text{s.t.} \quad \mathbf{1}^\top w = 1,\; w_{\min} \le w \le w_{\max}.

二阶锥规划(SOCP)——约束的是波动率或风险贡献本身:

min⁡w  c⊤ws.t.∥L⊤w∥2≤σmax⁡,  Aw≤b.\min_w \; c^\top w \quad \text{s.t.} \quad \lVert L^\top w \rVert_2 \le \sigma_{\max},\; Aw \le b.

带交易成本的再平衡可以写成 QP:目标里加 κ⊤∣w−w0∣\kappa^\top \lvert w - w_0 \rvert(L1L_1 惩罚),仍然凸,且能诱导稀疏——小的权重变化直接归零,抑制换手。

minvar.py
import cvxpy as cp
import numpy as np
def min_variance(Sigma: np.ndarray, w_max: float = 0.10,
turnover: float | None = None, w0: np.ndarray | None = None) -> np.ndarray:
N = Sigma.shape[0]
w = cp.Variable(N)
obj = cp.Minimize(cp.quad_form(w, cp.psd_wrap(Sigma)))
cons = [cp.sum(w) == 1, w >= 0, w <= w_max]
if turnover is not None and w0 is not None:
cons.append(cp.norm1(w - w0) <= turnover) # L1 换手约束,保持凸性
cp.Problem(obj, cons).solve(solver=cp.CLARABEL)
return w.value
常见需求后果处理
整数约束(最少持仓、整手股数)破坏凸性,问题变为 NP 难先解连续问题再取整,或用 MIP 求解器
基于截距/分位的条件约束(如"top 50 只")选择变量是整数用可微近似或两阶段法
依赖优化的风险度量(如 CVaR 优化带离散情景)情景法下仍为 LP,可用;否则需小心用情景集合线性化
风险平价的等贡献约束非凸(含 wi/w⊤Σww_i/\sqrt{w^\top\Sigma w})用对数障碍等价形式或逐次凸近似
  • 先缩放数据:协方差矩阵元素在 10−410^{-4} 量级(日频),直接喂给求解器会放大舍入误差;年化并按量级归一后再求解;
  • 协方差先做 Ledoit–Wolf 收缩再喂给 quad_form,并检查其条件数;
  • 对比两个求解器的解是否一致——权重差异大说明问题病态。
  • 所有组合层优化先写凸形式,整数需求用"连续解 + 取整 + 复检"两步走;
  • 换手约束用 L1L_1(norm1)而非事后硬砍;
  • 求解失败的第一反应是检查缩放与条件数,而不是换求解器。
  • 整数约束(最少持仓数、整手)破坏凸性,需启发式或 MIP
  • L1L_1 惩罚(换手约束)保持凸性且能诱导稀疏
  • 求解器精度与数值稳定性:先缩放数据、再查条件数