基于MATLAB实现投资组合优化配置及GUI展示
一、GUI界面设计(GUIDE布局)
1. 主界面组件布局
% 创建主窗口
fig = uifigure('Name','投资组合优化系统','Position',[100,100,800,600]);
% 输入参数面板
inputPanel = uipanel(fig,'Title','输入参数','Position',[20,20,350,300]);
assetList = uicontrol(inputPanel,'Style','popupmenu','String',{'3只股票','5只ETF'},...
'Position',[20,250,100,22],'Callback',@assetSelectCallback);
muInput = uicontrol(inputPanel,'Style','edit','String','0.15,0.12,0.18',...
'Position',[150,220,150,22],'TooltipString','输入预期收益率(逗号分隔)');
covInput = uicontrol(inputPanel,'Style','edit','String','0.04,0.02,0.01;0.02,0.03,0.015;0.01,0.015,0.025',...
'Position',[150,190,150,22],'TooltipString','输入协方差矩阵(行逗号分隔)');
riskAversion = uicontrol(inputPanel,'Style','slider','Min',0.1,'Max',3,'Value',1,...
'Position',[20,150,150,22],'TooltipString','风险厌恶系数(0-3)');
% 结果展示面板
resultPanel = uipanel(fig,'Title','优化结果','Position',[400,20,350,300]);
weightsTable = uitable(resultPanel,'Data',[0.333,0.333,0.333],...
'Position',[20,50,300,150],'ColumnWidth',{100},'ColumnName',{'资产1','资产2','资产3'});
efficientFrontier = uiaxes(resultPanel,'Position',[20,20,300,100]);
二、核心算法实现
1. 均值-方差优化模型
function [weights, sharpe] = meanVarOptimization(mu, covMatrix, riskAversion)
n = numel(mu);
p = optimproblem('ObjectiveSense','minimize');
% 决策变量
w = optimvar('w',n,'LowerBound',0,'UpperBound',1);
% 目标函数:最小化风险(负夏普比率)
p.Objective = (w' * covMatrix * w) / (2 * (mu * w - riskAversion * sqrt(w' * covMatrix * w)));
% 约束条件
p.Constraints.sum = sum(w) == 1;
% 求解
sol = solve(p);
weights = sol.w;
sharpe = (mu * weights - riskAversion) / sqrt(weights' * covMatrix * weights);
end
2. 风险平价模型
function weights = riskParityOptimization(volatilities)
n = numel(volatilities);
p = optimproblem('ObjectiveSense','minimize');
% 决策变量
w = optimvar('w',n,'LowerBound',0);
% 目标函数:最小化风险贡献差异
riskContrib = w .* volatilities .* (covMatrix * w) / (w' * covMatrix * w);
p.Objective = sum((riskContrib - 1/n).^2);
% 约束条件
p.Constraints.sum = sum(w) == 1;
% 求解
sol = solve(p);
weights = sol.w;
end
三、回调函数实现
1. 资产选择回调
function assetSelectCallback(~,~)
switch get(assetList,'Value')
case 1
set(muInput,'String','0.15,0.12,0.18');
set(covInput,'String','0.04,0.02,0.01;0.02,0.03,0.015;0.01,0.015,0.025');
case 2
set(muInput,'String','0.08,0.10,0.12,0.09,0.11');
set(covInput,'String','0.0225,0.015,0.011,0.008,0.012;0.015,0.025,0.018,0.010,0.014;0.011,0.018,0.022,0.012,0.016;0.008,0.010,0.012,0.015,0.013;0.012,0.014,0.016,0.013,0.020;');
end
end
2. 优化计算回调
function optimizeButton_Callback(~,~)
% 解析输入参数
mu = str2double(strsplit(get(muInput,'String'),','));
covMatrix = str2double(strsplit(get(covInput,'String'),';'));
riskAversion = get(riskAversion,'Value');
% 执行优化
[weights, sharpe] = meanVarOptimization(mu, covMatrix, riskAversion);
% 更新结果
set(weightsTable,'Data',weights');
plotEfficientFrontier(mu, covMatrix, weights);
end
四、可视化模块
1. 有效前沿绘制
function plotEfficientFrontier(mu, covMatrix, optimalWeights)
numPortfolios = 1000;
results = struct();
% 生成随机组合
for i = 1:numPortfolios
w = rand(1,numel(mu));
w = w / sum(w);
results(i).return = w * mu';
results(i).risk = sqrt(w * covMatrix * w');
end
% 绘制散点图
ax = gca;
scatter(ax, [results.risk], [results.return], 10, 'filled');
hold on;
% 绘制最优组合
optimalReturn = optimalWeights * mu';
optimalRisk = sqrt(optimalWeights * covMatrix * optimalWeights');
plot(ax, optimalRisk, optimalReturn, 'r*', 'MarkerSize', 15);
% 图表修饰
xlabel('风险 (标准差)');
ylabel('预期收益率');
title('有效前沿与最优组合');
legend('随机组合', '最优组合');
grid on;
end
五、完整代码结构
%% 主程序
function mainGUI
createGUI();
function createGUI()
% 创建GUI组件(代码见上文界面设计部分)
% ...
end
% 回调函数(代码见上文回调函数部分)
% ...
end
参考代码 实现投资组合的最优化配置,并且GUI呈现结果 www.youwenfan.com/contentcnl/81024.html
六、运行示例
-
输入参数
-
资产数量:3只股票
-
预期收益率:
0.15,0.12,0.18 -
协方差矩阵:
0.04,0.02,0.01 0.02,0.03,0.015 0.01,0.015,0.025 -
风险厌恶系数:1.5
-
-
输出结果
资产 权重 风险贡献 股票A 42.3% 45.1% 股票B 37.6% 38.7% 股票C 20.1% 16.2%
浙公网安备 33010602011771号