基于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

六、运行示例

  1. 输入参数

    • 资产数量: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

  2. 输出结果

    资产 权重 风险贡献
    股票A 42.3% 45.1%
    股票B 37.6% 38.7%
    股票C 20.1% 16.2%
posted @ 2025-11-17 10:54  kang_ms  阅读(0)  评论(0)    收藏  举报