基于线性规划的“多阶段投资组合优化”的随机规划建模与求解示例
1. 问题描述
假设一位投资者计划在未来的 \(T\) 个时间段内(例如,若干个月)动态调整其投资组合。市场上有 \(n\) 种风险资产(如股票、债券)。投资者在期初有一定数额的初始资金。在每个时间段 \(t\) (\(t = 1, 2, ..., T\)),市场未来收益是不确定的,可以用一系列离散的随机情景(Scenarios)来描述。投资者的目标是,在 \(T\) 期末,最大化其投资组合的期望终端财富,同时控制其在每个时间段的“风险”(例如,约束其投资组合价值在任意情景下,下跌不能超过某个容忍水平)。这是一个典型的多阶段随机规划问题,可以通过构建一个情景树(Scenario Tree)来建模不确定性,并在线性规划框架下求解。
2. 问题建模
2.1 定义参数与决策变量
- 资产与时间:共有 \(n\) 种资产,\(T\) 个决策时期。\(t=0\) 表示初始时刻。
- 不确定性表示:通过一个情景树来描述。树上的每个节点 \(s\) 代表一个“状态”(即在某个时间段,一种特定的市场收益实现)。节点 \(s\) 属于集合 \(S\)。定义:
- \(a(s)\) :节点 \(s\) 的直接父节点。
- \(p(s)\) :节点 \(s\) 的发生概率(所有离开根节点的路径概率之和为1)。
- \(t(s)\) :节点 \(s\) 所处的时间段。
- 价格与收益:在节点 \(s\),资产 \(i\) 的价格为 \(P_i(s)\)。从父节点 \(a(s)\) 到子节点 \(s\) 的过程中,资产 \(i\) 的收益率为 \(R_i(s) = P_i(s) / P_i(a(s))\)。
- 初始财富:\(W_0\)。
- 决策变量:
- \(x_i(s)\) :在节点 \(s\) 持有的资产 \(i\) 的金额(货币单位,如元)。
- \(y_i(s)\) :在节点 \(s\) 买入资产 \(i\) 的金额。
- \(z_i(s)\) :在节点 \(s\) 卖出资产 \(i\) 的金额。
(注意:也可用“份额”作为变量,此处用金额更直观)
2.2 目标函数
最大化终端时刻(即所有 \(t(s)=T\) 的节点)的期望财富:
\[\text{Maximize} \sum_{s: t(s)=T} p(s) \sum_{i=1}^{n} x_i(s) \]
2.3 约束条件
- 初始资金约束(在根节点 \(s_0\), \(t=0\)):
\[ \sum_{i=1}^{n} x_i(s_0) = W_0 \]
期初持有的资产总值等于初始资金。假设初始不交易,即 $ y_i(s_0) = z_i(s_0) = 0 $。
- 资金流动平衡(自融资)约束(对所有 \(s \neq s_0\)):
在非根节点 \(s\),投资者可以买卖资产。假设买卖无交易成本,卖出资产获得的现金必须等于买入其他资产支付的现金。这体现了投资组合的“自融资”特性,即不注入或抽回资金。
\[ \sum_{i=1}^{n} z_i(s) = \sum_{i=1}^{n} y_i(s) \quad \forall s \neq s_0 \]
- 库存平衡约束(对所有节点 \(s\)):
在节点 \(s\) 持有的某项资产 \(i\) 的金额,等于从父节点 \(a(s)\) 继承的资产(考虑价格变动带来的损益),加上买入的金额,减去卖出的金额。
\[ x_i(s) = R_i(s) \cdot x_i(a(s)) + y_i(s) - z_i(s) \quad \forall s \neq s_0, \forall i \]
对于根节点 $ s_0 $,此约束被初始资金约束所覆盖。
- 非负性约束:
\[ x_i(s) \ge 0, \quad y_i(s) \ge 0, \quad z_i(s) \ge 0 \quad \forall s, \forall i \]
不允许卖空(即不能持有负资产)和借贷。
- 风险控制约束(示例:下行风险控制):
可以在每个节点 \(s\) 引入风险控制。例如,约束投资组合价值在任何节点都不低于初始财富的一个固定比例 \(\theta\)(例如 90%):
\[ \sum_{i=1}^{n} x_i(s) \ge \theta W_0 \quad \forall s \]
这是一个简单而严格的风险约束。
3. 线性规划形式与求解思路
上述模型是一个标准的线性规划(LP) 问题:
- 目标函数是线性的。
- 所有约束(库存平衡、自融资、风险控制、非负性)都是线性等式或不等式。
- 决策变量是连续的。
求解步骤:
- 情景树生成:这是建模的关键。需要基于历史数据或假设,生成一个描述未来资产收益可能路径的树状结构。树的大小(节点数)会直接影响问题的规模。
- 模型实例化:将生成的情景树数据(节点关系 \(a(s)\),概率 \(p(s)\),收益率 \(R_i(s)\))、参数( \(W_0, \theta\) )代入上述模型。
- 调用线性规划求解器:由于模型是线性规划,可以使用成熟的商业(如CPLEX, Gurobi)或开源(如GPLK, SCIP)求解器直接高效求解。求解器会返回最优的决策变量值 \(x_i^*(s), y_i^*(s), z_i^*(s)\)。
- 解释策略:最优解给出了一个非预期的策略。对于情景树上的每一个节点 \(s\),都对应一组最优的资产配置 \(x_i^*(s)\) 和交易指令 \(y_i^*(s), z_i^*(s)\)。在实际投资中,投资者在时刻 \(t(s)\) 观察到市场实现(相当于走到了树的某个节点),就按照该节点对应的决策来调整其投资组合。
4. 示例(简化版)
假设:\(T=2\), \(n=2\) (资产A和B), \(W_0=1000\), \(\theta=0.9\)。
情景树:
- \(t=0\):根节点 \(s_0\),概率 \(p(s_0)=1\)。
- \(t=1\):两个子节点 \(s_1\) (概率0.6) 和 \(s_2\) (概率0.4)。收益:
- 到 \(s_1\): \(R_A(s_1)=1.1, R_B(s_1)=1.0\)
- 到 \(s_2\): \(R_A(s_2)=0.9, R_B(s_2)=1.05\)
- \(t=2\):每个 \(t=1\) 节点有两个子节点,共4个终端节点 \(s_3, s_4, s_5, s_6\),概率分别为 0.36, 0.24, 0.24, 0.16。收益(略)。
建立模型:
- 目标函数:
\[ \text{Max } 0.36(x_A(s_3)+x_B(s_3)) + 0.24(x_A(s_4)+x_B(s_4)) + 0.24(x_A(s_5)+x_B(s_5)) + 0.16(x_A(s_6)+x_B(s_6)) \]
- 根节点约束:
\[ x_A(s_0) + x_B(s_0) = 1000 \]
- t=1 节点库存平衡:
- \(s_1\): \(x_A(s_1) = 1.1*x_A(s_0) + y_A(s_1) - z_A(s_1)\), \(x_B(s_1) = 1.0*x_B(s_0) + y_B(s_1) - z_B(s_1)\)
- \(s_2\): \(x_A(s_2) = 0.9*x_A(s_0) + y_A(s_2) - z_A(s_2)\), \(x_B(s_2) = 1.05*x_B(s_0) + y_B(s_2) - z_B(s_2)\)
- t=1 节点自融资:
- \(s_1\): \(z_A(s_1)+z_B(s_1) = y_A(s_1)+y_B(s_1)\)
- \(s_2\): \(z_A(s_2)+z_B(s_2) = y_A(s_2)+y_B(s_2)\)
- t=2 节点库存平衡(以 \(s_3\) 为例,假设其父节点是 \(s_1\)):
- \(x_A(s_3) = R_A(s_3)*x_A(s_1) + y_A(s_3) - z_A(s_3)\)
- \(x_B(s_3) = R_B(s_3)*x_B(s_1) + y_B(s_3) - z_B(s_3)\)
- 类似地,有 \(s_4, s_5, s_6\) 的约束。
- t=2 节点自融资(同样以 \(s_3\) 为例):
- \(z_A(s_3)+z_B(s_3) = y_A(s_3)+y_B(s_3)\)
- 风险控制:
- 对所有节点 \(s\): \(x_A(s)+x_B(s) \ge 900\)
- 非负性:所有 \(x, y, z \ge 0\)。
求解与解释:
将此线性规划模型输入求解器,会得到所有节点的最优决策。例如,在 \(t=0\) 的最优解可能是 \(x_A(s_0)=600, x_B(s_0)=400\)。这意味着期初应投资600于资产A,400于资产B。
- 如果第1阶段走到了节点 \(s_1\)(A资产上涨),求解器会给出对应的 \(y_i(s_1), z_i(s_1)\) 指令,以及新的持仓 \(x_A(s_1), x_B(s_1)\)。
- 如果走到了节点 \(s_2\)(A资产下跌),指令会不同。
这个策略是在期初考虑了所有未来可能性后,给出的一个整体最优的动态应对方案。
5. 小结
本问题展示了如何将多阶段、不确定环境下的动态投资决策,通过构建情景树转化为一个大规模的、但结构清晰的线性规划问题。其核心思想是用空间(决策树上的众多决策变量)换时间(动态决策的不确定性)。该方法优点在于可以利用强大的线性规划求解器,并能方便地加入各种线性约束(如交易成本、借款约束、行业配置限制等)。主要挑战是情景树可能非常庞大(“维数灾难”),需要结合场景缩减等技巧来控制问题规模。