列生成算法在投资组合优化问题中的应用示例
题目描述
考虑一个投资组合优化问题,投资者希望在给定的资产集合中选择资产并分配资金,以在满足预算约束和风险控制的前提下最大化预期收益。假设有大量潜在资产(如数千只股票),但实际投资组合可能仅包含少量资产(稀疏性)。问题可建模为一个线性规划模型,其中决策变量为各资产的投资比例,约束包括总预算约束、风险约束(如跟踪误差限制)和基数约束(限制资产数量)。由于资产数量庞大,直接求解完整模型计算成本高,列生成算法可用于动态生成有价值的资产列(变量),逐步逼近最优解。
解题过程
-
问题建模
- 设资产集合为 \(I = \{1, 2, ..., n\}\)(\(n\) 很大),决策变量 \(x_i\) 表示资产 \(i\) 的投资比例。
- 目标函数:最大化预期收益 \(\sum_{i \in I} r_i x_i\),其中 \(r_i\) 是资产 \(i\) 的预期收益率。
- 约束条件:
- 预算约束:\(\sum_{i \in I} x_i = 1\)(全部资金投资);
- 风险约束:\(\sum_{i \in I} \sigma_i x_i \leq B\)(\(\sigma_i\) 为资产 \(i\) 的风险系数,\(B\) 为风险上限);
- 基数约束:\(\sum_{i \in I} y_i \leq K\)(\(y_i\) 为二元变量,表示是否选择资产 \(i\),\(K\) 为最大资产数),但线性规划松弛中可暂忽略整数性,将其转化为连续约束 \(x_i \leq M y_i\)。
- 由于 \(n\) 很大,直接求解困难,列生成将问题分解为限制主问题(RMP)和定价子问题(Pricing Subproblem)。
-
限制主问题(RMP)初始化
- 初始时,从资产集合 \(I\) 中选择一个小子集 \(S \subset I\)(如随机选 \(K\) 个资产),构建 RMP:
\[ \begin{align*} \max \quad & \sum_{i \in S} r_i x_i \\ \text{s.t.} \quad & \sum_{i \in S} x_i = 1, \\ & \sum_{i \in S} \sigma_i x_i \leq B, \\ & x_i \geq 0 \quad \forall i \in S. \end{align*} \]
- 求解 RMP,得到最优解 \(x^*\) 和对偶变量值 \(\lambda_1\)(对应预算约束)和 \(\lambda_2\)(对应风险约束,需满足 \(\lambda_2 \geq 0\))。
-
定价子问题(检验列的减少成本)
- 目标:检查是否存在未加入 RMP 的资产 \(j \in I \setminus S\),其加入能改善目标函数。
- 根据对偶理论,资产 \(j\) 的减少成本为 \(\bar{c}_j = r_j - \lambda_1 - \sigma_j \lambda_2\)。
- 若 \(\bar{c}_j > 0\),则加入资产 \(j\) 可能提升目标值;否则当前解最优。
- 子问题:寻找最大减少成本的资产,即解 \(\max_{j \in I \setminus S} \{ r_j - \lambda_1 - \sigma_j \lambda_2 \}\)。
- 由于资产数量大,可遍历计算所有资产的减少成本,或利用问题结构高效搜索(如基于风险-收益排序)。
-
迭代过程
- 若找到资产 \(j\) 满足 \(\bar{c}_j > 0\),将其加入 \(S\),更新 RMP 并重新求解。
- 若所有资产的 \(\bar{c}_j \leq 0\),则当前 RMP 的解是原问题的松弛最优解。
- 若原问题包含整数约束(如基数约束),需结合分支定界法生成整数解。
-
收敛与最优性
- 算法在有限步内收敛,因为资产数量有限,每次迭代至少加入一个新区块。
- 最终 RMP 的解给出原问题线性规划松弛的最优投资比例。
- 实际应用中,可结合舍入策略或整数规划扩展处理离散约束。
示例说明
假设 \(n=1000\),初始 \(S\) 包含 10 个资产。第一次求解 RMP 后,对偶变量 \(\lambda_1 = 0.5\),\(\lambda_2 = 0.1\)。计算剩余 990 个资产的减少成本,发现资产 \(j\) 满足 \(r_j = 0.15\),\(\sigma_j = 0.3\),则 \(\bar{c}_j = 0.15 - 0.5 - 0.3 \times 0.1 = -0.35 < 0\),无需加入;若另一资产 \(k\) 满足 \(r_k = 0.8\),\(\sigma_k = 0.2\),则 \(\bar{c}_k = 0.8 - 0.5 - 0.2 \times 0.1 = 0.28 > 0\),将其加入 S 并重新求解 RMP。重复直至无改善。