凸优化速览
量化里的优化问题几乎都是凸的
Section titled “量化里的优化问题几乎都是凸的”均值—方差(均值—方差与其失败)、最小方差、风险平价、带交易成本的再平衡——这些组合问题的目标与约束绝大多数能写成凸形式,从而全局最优、求解器成熟、结果可复现。识别一个问题是不是凸的,是工程实践的第一步。
二次规划(QP)——均值—方差、最小方差:
二阶锥规划(SOCP)——约束的是波动率或风险贡献本身:
带交易成本的再平衡可以写成 QP:目标里加 ( 惩罚),仍然凸,且能诱导稀疏——小的权重变化直接归零,抑制换手。
cvxpy 建模
Section titled “cvxpy 建模”import cvxpy as cpimport 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什么会破坏凸性
Section titled “什么会破坏凸性”| 常见需求 | 后果 | 处理 |
|---|---|---|
| 整数约束(最少持仓、整手股数) | 破坏凸性,问题变为 NP 难 | 先解连续问题再取整,或用 MIP 求解器 |
| 基于截距/分位的条件约束(如"top 50 只") | 选择变量是整数 | 用可微近似或两阶段法 |
| 依赖优化的风险度量(如 CVaR 优化带离散情景) | 情景法下仍为 LP,可用;否则需小心 | 用情景集合线性化 |
| 风险平价的等贡献约束 | 非凸(含 ) | 用对数障碍等价形式或逐次凸近似 |
- 先缩放数据:协方差矩阵元素在 量级(日频),直接喂给求解器会放大舍入误差;年化并按量级归一后再求解;
- 协方差先做 Ledoit–Wolf 收缩再喂给
quad_form,并检查其条件数; - 对比两个求解器的解是否一致——权重差异大说明问题病态。
量化中的用法
Section titled “量化中的用法”- 所有组合层优化先写凸形式,整数需求用"连续解 + 取整 + 复检"两步走;
- 换手约束用 (
norm1)而非事后硬砍; - 求解失败的第一反应是检查缩放与条件数,而不是换求解器。
- 整数约束(最少持仓数、整手)破坏凸性,需启发式或 MIP
- 惩罚(换手约束)保持凸性且能诱导稀疏
- 求解器精度与数值稳定性:先缩放数据、再查条件数