基于线性规划的“多阶段投资组合优化”的随机规划建模与求解示例
字数 4450 2025-12-18 13:38:26

基于线性规划的“多阶段投资组合优化”的随机规划建模与求解示例

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 约束条件

  1. 初始资金约束(在根节点 \(s_0\)\(t=0\)):

\[ \sum_{i=1}^{n} x_i(s_0) = W_0 \]

期初持有的资产总值等于初始资金。假设初始不交易,即 $ y_i(s_0) = z_i(s_0) = 0 $。
  1. 资金流动平衡(自融资)约束(对所有 \(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 \]

  1. 库存平衡约束(对所有节点 \(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 $,此约束被初始资金约束所覆盖。
  1. 非负性约束

\[ x_i(s) \ge 0, \quad y_i(s) \ge 0, \quad z_i(s) \ge 0 \quad \forall s, \forall i \]

不允许卖空(即不能持有负资产)和借贷。
  1. 风险控制约束(示例:下行风险控制)
    可以在每个节点 \(s\) 引入风险控制。例如,约束投资组合价值在任何节点都不低于初始财富的一个固定比例 \(\theta\)(例如 90%):

\[ \sum_{i=1}^{n} x_i(s) \ge \theta W_0 \quad \forall s \]

这是一个简单而严格的风险约束。

3. 线性规划形式与求解思路

上述模型是一个标准的线性规划(LP) 问题:

  • 目标函数是线性的。
  • 所有约束(库存平衡、自融资、风险控制、非负性)都是线性等式或不等式。
  • 决策变量是连续的。

求解步骤

  1. 情景树生成:这是建模的关键。需要基于历史数据或假设,生成一个描述未来资产收益可能路径的树状结构。树的大小(节点数)会直接影响问题的规模。
  2. 模型实例化:将生成的情景树数据(节点关系 \(a(s)\),概率 \(p(s)\),收益率 \(R_i(s)\))、参数( \(W_0, \theta\) )代入上述模型。
  3. 调用线性规划求解器:由于模型是线性规划,可以使用成熟的商业(如CPLEX, Gurobi)或开源(如GPLK, SCIP)求解器直接高效求解。求解器会返回最优的决策变量值 \(x_i^*(s), y_i^*(s), z_i^*(s)\)
  4. 解释策略:最优解给出了一个非预期的策略。对于情景树上的每一个节点 \(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。收益(略)。

建立模型

  1. 目标函数

\[ \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)) \]

  1. 根节点约束

\[ x_A(s_0) + x_B(s_0) = 1000 \]

  1. 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)\)
  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)\)
  3. 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\) 的约束。
  4. t=2 节点自融资(同样以 \(s_3\) 为例):
    • \(z_A(s_3)+z_B(s_3) = y_A(s_3)+y_B(s_3)\)
  5. 风险控制
    • 对所有节点 \(s\)\(x_A(s)+x_B(s) \ge 900\)
  6. 非负性:所有 \(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. 小结

本问题展示了如何将多阶段、不确定环境下的动态投资决策,通过构建情景树转化为一个大规模的、但结构清晰的线性规划问题。其核心思想是用空间(决策树上的众多决策变量)换时间(动态决策的不确定性)。该方法优点在于可以利用强大的线性规划求解器,并能方便地加入各种线性约束(如交易成本、借款约束、行业配置限制等)。主要挑战是情景树可能非常庞大(“维数灾难”),需要结合场景缩减等技巧来控制问题规模。

基于线性规划的“多阶段投资组合优化”的随机规划建模与求解示例 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. 小结 本问题展示了如何将多阶段、不确定环境下的动态投资决策,通过构建情景树转化为一个大规模的、但结构清晰的线性规划问题。其核心思想是 用空间(决策树上的众多决策变量)换时间(动态决策的不确定性) 。该方法优点在于可以利用强大的线性规划求解器,并能方便地加入各种线性约束(如交易成本、借款约束、行业配置限制等)。主要挑战是情景树可能非常庞大(“维数灾难”),需要结合场景缩减等技巧来控制问题规模。