GAMS均值方差投资组合优化循环运行报错问题咨询
GAMS均值方差模型代码问题汇总及修正
你提供的代码存在多处语法错误、逻辑偏差、约束缺失问题,具体如下:
- 约束完全缺失:你要求的两个核心约束「季度预期收益率≥0.03」「单资产持仓比例Xi≤0.3」没有在代码中定义对应方程,需要补充对应等式声明和约束。
- 模型/变量调用错误:代码中出现的
m2模型、cost变量均未提前定义,属于无效引用。同时均值方差模型涉及二次项(方差计算),不能用lp(线性规划)求解器求解。 - 循环逻辑完全不符合需求:你需要的是每次传入不同目标收益率计算最优标准差,但现有循环中对不存在的
m2模型求解,('Assets') = optimal_std(trial)、value.1都是无效语法,完全无法实现你要的10次遍历逻辑。 - 目标函数不匹配需求:你明确要求优化目标为最小化投资组合标准差,但现有代码的目标函数是风险调整收益最大化,和你的需求完全不符。
- 无效赋值语法:
MeanVar('Assets') = 0.3;是完全错误的写法,MeanVar是模型名,不能通过这种方式设置单资产持仓上限。
核心修正代码片段
* 补充缺失的约束方程声明 EQUATIONS ReturnReq 最低收益率约束 AssetLimit(i) 单资产持仓上限约束; * 补充约束定义 ReturnReq .. PortReturn =g= 0.03; AssetLimit(i) .. x(i) =l= 0.3; * 重新定义最小化方差的目标函数(标准差是方差开方,最小化方差等价于最小化标准差) ObjDef .. z =e= PortVariance; * 模型定义要包含新的约束 MODEL MeanVar /ReturnDef,VarDef,NormalCon,ObjDef,ReturnReq,AssetLimit/; * 定义10次试验对应的目标收益率(你可以根据自己的表格替换这里的数值) set trial /t1*t10/; parameter target_return(trial) 各次试验的目标收益率 / t1 0.03, t2 0.032, t3 0.034, t4 0.036, t5 0.038, t6 0.04, t7 0.042, t8 0.044, t9 0.046, t10 0.048 /; parameter optimal_std(trial) 记录各次试验的最优标准差; loop(trial, * 每次更新最低收益率约束为当前试验的目标收益率 ReturnReq.rhs = target_return(trial); * 用QCP求解器求解最小化方差 solve MeanVar min z using qcp; * 方差开方得到标准差,存入结果 optimal_std(trial) = sqrt(PortVariance.l); ); * 输出最终结果 display optimal_std;
内容的提问来源于stack exchange,提问作者123dog
相关产品推荐
相关产品推荐

