线性规划模型建模实战(投资组合优化案例)笔记
一、案例背景与目标
1.1 投资场景设定
- 市场存在 n种可投资资产Sᵢ(i=1,2,...,n),需用大额资金M进行一期投资;
- 资产核心参数(示例):
资产Sᵢ 平均收益率rᵢ 风险损失率qᵢ 交易费率pᵢ 最低交易定额uᵢ(元) S₁ - - - 103 S₂ 21% 1.5% 2% 198 S₃ 23% 5.5% 4.5% - S₄ 25% 2.6% 6.5% 40 - 无风险参考:同期银行定期利率 r₀=5%(几乎无风险)。
1.2 核心目标
双目标优化:
- 最大化净收益;
- 最小化总风险。
二、符号规定与基本假设
2.1 符号定义(建模基础)
- Sᵢ:第i种投资项目(如股票、债券);
- rᵢ:Sᵢ的平均收益率;
- qᵢ:Sᵢ的风险损失率(衡量单资产风险);
- pᵢ:Sᵢ的交易费率;
- uᵢ:Sᵢ的最低交易定额(低于此金额按uᵢ算费率);
- xᵢ:投资于Sᵢ的资金金额;
- α:投资风险度(可接受的最大风险上限);
- Q:总收益风险度(需最小化的指标);
- M:总投资资金(数额极大)。
2.2 关键假设(简化建模场景)
- 资金规模假设:M极大,投资到各资产的金额通常>uᵢ(简化交易费计算);
- 风险度量假设:总风险用“所有资产中最大风险”度量(避免风险值超100%的不合理情况);
- 收益分散假设:投资越分散,总收益越小;
- 参数固定假设:投资期内rᵢ、qᵢ、pᵢ均固定,不受其他因素干扰;
- 净收益影响假设:净收益仅由rᵢ、pᵢ、xᵢ决定,与其他无关。
三、核心计算:交易费与净收益
3.1 交易费计算(分段函数)
- 当xᵢ ≤ uᵢ时:交易费 = pᵢ × uᵢ(按最低定额收费);
- 当xᵢ > uᵢ时:交易费 = pᵢ × xᵢ(按实际金额收费);
- 简化处理:因M极大,xᵢ通常>uᵢ,交易费直接按“pᵢ × xᵢ”计算。
3.2 净收益计算
- 单资产净收益 =(平均收益率 - 交易费率)× 投资金额 =
(rᵢ - pᵢ) × xᵢ
; - 总净收益 =
Σ[(rᵢ - pᵢ) × xᵢ]
(需最大化)。
四、核心方法:多目标规划转线性规划
原问题为多目标规划(最大化收益+最小化风险),需转化为单目标线性规划求解,3种核心转化思路:
转化方法 | 核心思路 | 适用场景 |
---|---|---|
固定风险边界 | 1. 设定可接受的风险度α; 2. 约束条件: qᵢ×xᵢ/M ≤ α (所有i);3. 目标:最大化净收益 |
已知投资者风险承受能力(如“最多接受0.6%风险”) |
固定盈利水平 | 1. 设定最低盈利目标k; 2. 约束条件:总净收益 ≥ k; 3. 目标:最小化总风险 |
投资者有明确收益底线(如“净收益≥20%”) |
引入偏好系数 | 1. 设定偏好系数λ(0≤λ≤1,λ越大越重视收益); 2. 目标函数: max [λ×总收益 - (1-λ)×总风险] |
投资者对风险和收益有明确偏好 |
五、模型构建与求解(以“固定风险边界”为例)
5.1 目标函数(适配Matlab linprog
)
linprog
仅支持最小化,需对总净收益加负号转化:
min Z = -Σ[(rᵢ - pᵢ) × xᵢ]
5.2 约束条件
- 风险约束:
qᵢ×xᵢ/M ≤ α
(所有i,控制总风险不超可接受上限); - 资金约束:
Σ[(1 + pᵢ)×xᵢ] = M
(总投资金额+总交易费=总资金M); - 非负约束:
xᵢ ≥ 0
(投资金额不能为负)。
5.3 求解步骤
- 设定α范围:α从0开始,每次递增0.001,直至α=0.5(覆盖合理风险区间);
- 循环求解:对每个α,用
linprog
求解线性规划,得到最优xᵢ(各资产投资金额)和对应最优收益; - 结果记录:整理不同α下的最优收益,用于后续分析。
六、结果分析与投资建议
6.1 风险与收益规律
- 总体趋势:风险度α越高,净收益越高(符合“高风险高收益”原则);
- 关键拐点(实战结果):
- 第一个拐点(α≈0.006/0.6%):
- 拐点左侧(α<0.006):风险小幅上升→收益快速增长(“风险性价比最高”区间);
- 拐点右侧(α>0.006):风险上升→收益增长放缓;
- 第二个拐点(α≈0.025/2.5%):
- 拐点右侧(α>0.025):风险继续上升→收益几乎无变化(“风险无效区间”)。
- 第一个拐点(α≈0.006/0.6%):
6.2 投资建议
- 无风险偏好投资者:选择α≈0.006,对应净收益约20%(低风险+高性价比);
- 中等风险承受者:α控制在0.006~0.025之间(平衡风险与收益);
- 所有投资者:α建议不超过0.025(避免进入“风险无效区间”)。
七、编程注意事项(Matlab linprog
)
- 约束符号处理:若约束为“≥”(如固定盈利目标),需对约束两边加负号,转化为“≤”;
- 上下限设置:仅需下限(如xᵢ≥0)时,上限
ub
设为空([]
);仅需上限时,下限lb
设为空; - 目标函数符号:需“最大化”目标时,必须对目标函数加负号(适配
linprog
的最小化逻辑); - 矩阵格式:约束条件需整理为
A×x ≤ b
的矩阵形式,符合linprog
输入要求。
八、课后作业(线性规划实战)
某厂生产3种产品,每种产品需经A、B两道工序加工,已知工序产能、产品利润等参数,构建线性规划模型求解“最优生产计划”(目标:最大化总利润),课下完成建模与求解,后续讲解。