【微实验】组合优化matlab实战(马科维茨投资模型):在收益与风险之间,寻找最优的人生配比

目录

[🌅 序章:投资的终极矛盾,藏在生活的取舍里](#🌅 序章:投资的终极矛盾,藏在生活的取舍里)

[💡 痛点:为什么不能把鸡蛋放一个篮子?](#💡 痛点:为什么不能把鸡蛋放一个篮子?)

[📖 原理:马科维茨模型的底层逻辑](#📖 原理:马科维茨模型的底层逻辑)

[1. 三大核心定义(通俗拆解)](#1. 三大核心定义(通俗拆解))

[2. 模型核心优化目标](#2. 模型核心优化目标)

[📐 数学之美:从生活逻辑到量化公式](#📐 数学之美:从生活逻辑到量化公式)

[1. 组合收益率公式](#1. 组合收益率公式)

[2. 组合风险(方差)公式](#2. 组合风险(方差)公式)

[3. 标准优化模型(约束条件)](#3. 标准优化模型(约束条件))

[💻 工程落地:MATLAB完整可运行代码](#💻 工程落地:MATLAB完整可运行代码)

代码功能说明

[📊 运行结果深度解读](#📊 运行结果深度解读)

[1. 有效前沿曲线含义](#1. 有效前沿曲线含义)

[2. 最优权重配置规律](#2. 最优权重配置规律)

[3. 核心价值总结](#3. 核心价值总结)

[✨ 技术终悟:算法不止算收益,更算取舍](#✨ 技术终悟:算法不止算收益,更算取舍)

[📝 代码运行说明](#📝 代码运行说明)

🌅 序章:投资的终极矛盾,藏在生活的取舍里

生活从来都是一场权衡。把所有积蓄押在一处,看似博取了高收益,也承担了满盘皆输的风险;处处分散投入、不敢进取,又会错失增值的机会。

投资亦是如此。高收益必然伴随高波动,低风险往往对应低回报,收益与风险永远是一对永恒的博弈 。人们穷尽所有理财方式,本质上都在寻找一个答案:如何分配资产,在可控的风险下,拿到最高的稳定收益?

技术是理性的天平,让无序的取舍变成可计算的最优解。而马科维茨投资组合模型,就是现代金融量化的基石------它用数学拆解风险,用优化平衡收益,把人类千百年来的投资取舍,变成了一套严谨、可落地、可量化的最优决策算法。

💡 痛点:为什么不能把鸡蛋放一个篮子?

在没有量化模型之前,投资全凭经验与直觉。普通人的投资误区无非两种:

  1. 极致激进:重仓单一高收益资产,追逐超额收益,但一旦资产暴跌,风险完全无法对冲;

  2. 极致保守:无脑分散所有资产,看似规避风险,实则稀释了整体收益,资金利用率极低。

这里藏着一个核心的生活化规律:不同资产的涨跌并非完全同步。股票大涨时债券可能平稳,黄金避险时基金可能回调。

马科维茨最核心的洞察,用生活语言解释就是:利用资产之间的相关性错配,通过合理权重分配,抵消非系统性风险,实现"风险最小、收益最优"的平衡

通俗类比:就像四季穿搭,单一衣物无法适配全年天气,合理搭配风衣、短袖、棉衣,才能在不同环境下保持舒适。投资组合的权重,就是资产的"最优穿搭方案"。

📖 原理:马科维茨模型的底层逻辑

1. 三大定义

资产收益率:单类资产的赚钱能力,对应投资的"回报上限";

资产方差/标准差:资产价格的波动幅度,对应投资的"风险大小",波动越大,爆亏概率越高;

资产相关性:两类资产涨跌的联动程度,相关性越低,对冲风险的效果越好。

2. 优化目标

马科维茨模型是一个带约束的二次规划优化模型,包含两类经典优化场景:

场景一:固定收益率,最小化投资风险(稳健型投资);

场景二:固定风险值,最大化投资收益(进取型投资)。

所有资产的权重之和为1,且权重非负(不允许杠杆做空,贴合普通投资者场景)。

📐 数学之美:从生活逻辑到量化公式

1. 组合收益率公式

投资组合的整体收益率,是各类资产收益率的加权和:

R_p = \\sum_{i=1}\^n w_i R_i

公式释义w_i 为第i类资产的投资权重,R_i 为单资产期望收益率。整体收益由每一份资产的占比和收益共同决定,权重越高,对应资产对总收益的贡献越大。

2. 组合风险(方差)公式

投资风险并非简单的加权平均,核心在于资产间的相关性对冲:

\\sigma_p\^2 = \\sum_{i=1}\^n\\sum_{j=1}\^n w_i w_j \\sigma_{ij}

公式释义\\sigma_{ij} 为资产协方差,代表两类资产的波动联动性。若两类资产负相关,交叉项为负,整体组合方差会降低,实现风险对冲。这也是分散投资能够降低风险的数学本质。

3. 标准优化模型(约束条件)

最小风险、固定收益为例,标准数学模型:

\\min \\quad \\sigma_p\^2 = w\^T \\Sigma w

s.t. \\quad \\sum_{i=1}\^n w_i R_i = R_{target}

\\sum_{i=1}\^n w_i = 1,\\quad w_i \\ge 0

模型解读:目标函数为组合风险最小化,约束分别为:目标收益率约束、资金全额投入约束、无做空杠杆约束,完全贴合普通投资者的真实交易规则。

💻 工程落地:MATLAB完整可运行代码

本段代码基于MATLAB自带二次规划函数 quadprog 实现马科维茨投资组合优化,无需额外工具箱。包含数据模拟、协方差矩阵计算、最优权重求解、有效前沿绘制、多目标参数对比全流程,注释详细可直接运行。

代码功能说明

  1. 模拟3类不同风险、不同收益的金融资产;

  2. 计算资产期望收益率、协方差矩阵;

  3. 构建马科维茨二次规划模型,求解最优资产权重;

  4. 绘制投资组合有效前沿、风险收益散点图、权重分布图;

  5. 对比不同目标收益率下的风险与权重变化规律。

Matlab 复制代码
%% 马科维茨投资组合优化(含点云模拟 + 有效前沿)
clear; clc; close all;

%% 1. 模拟资产数据:3类资产的月度收益率序列
asset_return = [
    0.28, 0.041, 0.02;
    -0.12, 0.034, 0.025;
    0.55, 0.1, 0.028;
    0.29, 0.15, 0.022;
    0.15, 0.1, 0.03;
    0.13, 0.25, 0.029;
    -0.10, 0.02, 0.024;
    -0.07, 0.033, 0.021;
    0.11, 0.045, 0.026;
    -0.02, 0.028, 0.020
];

%% 2. 计算核心参数
mean_return = mean(asset_return);   % 单资产期望收益率
cov_matrix = cov(asset_return);     % 资产协方差矩阵
n_asset = size(asset_return, 2);    % 资产数量

% 数据检验
if ~issymmetric(cov_matrix) || min(eig(cov_matrix)) <= 0
    warning('协方差矩阵非正定,可能影响优化结果');
    cov_matrix = cov_matrix + eye(n_asset) * 1e-10;
end

%% 3. 随机生成大量可行组合(点云模拟)
n_random = 1000;  % 随机组合数量
w_random = zeros(n_random, n_asset);
random_return = zeros(n_random, 1);
random_risk = zeros(n_random, 1);

rng(202608);  % 固定随机种子,保证结果可复现

for i = 1:n_random
    % 生成随机权重:使用Dirichlet分布,保证权重和为1且非负
    w = rand(1, n_asset);
    w = w / sum(w);  % 归一化,权重和为1
    
    % 可选:加入单资产上限约束(与优化一致)
    if max(w) > 0.9
        continue;  % 跳过超过上限的组合
    end
    
    w_random(i, :) = w;
    random_return(i) = mean_return * w';
    random_risk(i) = sqrt(w * cov_matrix * w');
end

% 剔除未填充的行
valid_random = random_risk > 0;
random_return = random_return(valid_random);
random_risk = random_risk(valid_random);

%% 4. 二次规划求解有效前沿
H = 2 * cov_matrix;
f = zeros(n_asset, 1);

Aeq = [ones(1, n_asset); mean_return];
A = [-eye(n_asset); eye(n_asset)];
b = [zeros(n_asset, 1); 0.6 * ones(n_asset, 1)];

options = optimoptions('quadprog', 'Display', 'off', 'Algorithm', 'interior-point-convex');

% 目标收益范围
min_feasible_return = min(mean_return);
max_feasible_return = max(mean_return);
target_return_list = linspace(min_feasible_return, max_feasible_return, 100);

risk_list = zeros(size(target_return_list));
return_list = zeros(size(target_return_list));
valid_idx = true(size(target_return_list));

for i = 1:length(target_return_list)
    beq_temp = [1; target_return_list(i)];
    [~, fval_temp, exitflag] = quadprog(H, f, A, b, Aeq, beq_temp, [], [], [], options);
    if exitflag > 0
        risk_list(i) = sqrt(fval_temp);
        return_list(i) = target_return_list(i);
    else
        valid_idx(i) = false;
    end
end

risk_list = risk_list(valid_idx);
return_list = return_list(valid_idx);

%% 5. 求解特定目标收益下的最优组合
target_return = 0.04;
beq_target = [1; target_return];
[w_opt, fval_opt] = quadprog(H, f, A, b, Aeq, beq_target, [], [], [], options);
port_return = mean_return * w_opt;
port_risk = sqrt(fval_opt);

%% 6. 可视化:点云 + 有效前沿
figure('Color', 'w', 'Position', [100, 100, 1000, 500]);

% 子图1:点云 + 有效前沿 + 最优组合点
subplot(1, 2, 1);
scatter(random_risk, random_return, 8, [0.8, 0.8, 0.8], 'filled', ...
    'DisplayName', '可行组合点云');
hold on;
plot(risk_list, return_list, 'b-', 'LineWidth', 2.5, ...
    'DisplayName', '有效前沿');
scatter(port_risk, port_return, 100, 'k', 'filled', ...
    'DisplayName', '最优组合点');

% 标注单个资产
scatter(std(asset_return(:,1)), mean_return(1), 80, 'r', 'filled', ...
    'DisplayName', '股票');
scatter(std(asset_return(:,2)), mean_return(2), 80, 'g', 'filled', ...
    'DisplayName', '基金');
scatter(std(asset_return(:,3)), mean_return(3), 80, 'b', 'filled', ...
    'DisplayName', '债券');

xlabel('组合风险(标准差)');
ylabel('组合期望收益率');
title('投资组合点云与有效前沿');
legend('Location', 'best');
grid on;

% 子图2:最优资产权重分布
subplot(1, 2, 2);
bar(w_opt, 'FaceColor', '#4472C4');
xlabel('资产类别');
ylabel('投资权重');
title('最优资产配置权重分布');
xticklabels({'股票', '基金', '债券'});
ylim([0, 1]);
grid on;

%% 7. 输出结果
fprintf('====================最优投资组合结果====================\n');
fprintf('最优资产权重:股票=%.4f  基金=%.4f  债券=%.4f\n', w_opt(1), w_opt(2), w_opt(3));
fprintf('组合期望收益率:%.2f %% \n', port_return * 100);
fprintf('组合风险标准差:%.4f \n', port_risk);

% 夏普比率
risk_free_rate = 0.02 / 12;
sharpe_ratio = (port_return - risk_free_rate) / port_risk;
fprintf('夏普比率:%.4f \n', sharpe_ratio);

% 等权组合对比
w_equal = ones(n_asset, 1) / n_asset;
return_equal = mean_return * w_equal;
risk_equal = sqrt(w_equal' * cov_matrix * w_equal);
sharpe_equal = (return_equal - risk_free_rate) / risk_equal;
fprintf('--------------------等权组合对比--------------------\n');
fprintf('等权组合收益率:%.2f %%  风险:%.4f  夏普比率:%.4f\n', ...
    return_equal * 100, risk_equal, sharpe_equal);

📊 运行结果深度解读

1. 有效前沿曲线含义

这是一个二维坐标系:

  • 横轴 :风险(用收益率的标准差衡量)

  • 纵轴:期望收益率

现在,把所有可能的资产配置组合 都画在这个图上,会得到一团散点云

有效前沿就是这团散点云的"左上边缘"------一条从下到上弯曲的曲线。

图中蓝色曲线为马科维茨有效前沿,曲线上的每一个点,都满足------

在给定风险水平下,收益率最高;

在给定期望收益率下,风险最小。

换句话说,有效前沿上的组合是**"不浪费任何风险"**的组合。


代码中有三类资产:股票、基金、债券。它们的期望收益率和风险(标准差)分别是:

资产 期望收益率 风险(标准差)
股票 约 0.064 较高
基金 约 0.033 中等
债券 约 0.023 较低

你可以用无数种方式分配权重。比如:

  • 100% 股票

  • 50% 股票 + 50% 基金

  • 20% 股票 + 30% 基金 + 50% 债券

  • ......

每一种分配方式,都会在"风险-收益"图上对应一个点。

把所有这些点画出来,它们散布在一个区域内。这个区域的左上边缘,就是有效前沿。

在代码中,有效前沿是通过遍历目标收益率来绘制的:

matlab

复制代码
target_return_list = linspace(min_feasible_return, max_feasible_return, 50);
for i = 1:length(target_return_list)
    beq_temp = [1; target_return_list(i)];
    [~,fval_temp] = quadprog(H,f,A,b,Aeq,beq_temp,[],[],[],options);
    risk_list(i) = sqrt(fval_temp);
end

对每一个目标收益率,代码求解出一个风险最小的组合。

  • 如果目标收益率 = 2.3%,最优组合可能是大部分债券。

  • 如果目标收益率 = 6.4%,最优组合可能是大部分股票。

  • 把这些"每个收益率下的最小风险"连成线,就是有效前沿


① 最小方差组合

有效前沿最左端的点。它是所有组合中风险最低的那个,收益率也最低。

② 市场组合 / 最优风险组合

有效前沿上夏普比率最高的点。它是在考虑无风险利率后,风险调整收益最好的组合。

代码中的 w_opt 就是在给定目标收益率 6% 的条件下,落在有效前沿上的一个点。

想象你在一家自助餐厅选菜:

  • 有效前沿 就是那些"花同样的钱,吃得最饱、最营养"的搭配组合。

  • 散点图里的其他点,要么是"花了很多钱但没吃饱",要么是"吃饱了但营养不均衡"。

  • 理性的人只会从有效前沿上选------因为其他选择都是"浪费"。

曲线下方的所有点均为无效投资组合:相同风险下收益更低,相同收益下风险更高,没有配置价值。曲线上方无可行解,是市场无法达到的收益风险边界。

2. 最优权重配置规律

代码中设定目标收益率6%,模型会自动权衡三类资产的风险收益特性:高收益高波动的股票、中风险中收益的基金、低风险稳收益的债券,最终输出最优配比。

上调目标收益率:模型会自动提高高风险资产权重,整体组合风险上升;

下调目标收益率:模型会倾斜低风险债券资产,组合稳定性大幅提升。

3. 核心价值总结

马科维茨模型彻底打破了"分散投资就是无脑多买资产"的误区,证明了有效的分散投资,是基于资产相关性、风险、收益的量化最优配比,而非主观经验判断。


✨ 技术终悟:算法不止算收益,更算取舍

马科维茨投资组合优化,从来不止是金融量化工具。

它用冰冷的矩阵与迭代计算,诠释了最温柔的生活哲理:世间最优的选择,从来不是极致的激进,也不是一味的保守,而是风险与收益的动态平衡。

人工的取舍靠直觉,机器的取舍靠逻辑。算法帮我们剔除情绪的干扰,在万千资产组合中,找到那条最平稳、最靠谱的增长路径------这也是量化技术,带给现实生活最大的价值。

📝 代码运行说明

  1. 本脚本为纯MATLAB原生代码,无需安装任何第三方工具箱,适配所有MATLAB版本;

  2. 直接复制全段代码新建 `.m` 文件运行即可,无需额外数据;

  3. 运行后自动生成双图可视化窗口,输出最优权重、组合收益、组合风险数据;

  4. 可自行修改 beq(2) 数值,调整目标收益率,观察权重与风险的联动变化。

相关推荐
星野川崎2061 小时前
电商多店运维:云机长期挂机频繁掉线、账号无故风控原因剖析与解决方案
大数据·运维·云计算·电商
嘶哈哈哈1 小时前
使用 Labelme 标注遥感目标检测数据集:从类别表、矩形框到 group_id 完整流程
人工智能·目标检测·目标跟踪
kyriewen1 小时前
面试官说"打开你的AI工具"——我才发现,他考的根本不是写代码
前端·人工智能·面试
冬奇Lab1 小时前
Code Agent 解剖(03):各家 LLM 格式不一样,agent 怎么统一对接?
人工智能·开源
lifallen1 小时前
模型不是函数:claude-cookbooks/misc 十四篇的公共底层
人工智能·学习·ai·ai编程
冬奇Lab1 小时前
开源项目第189期:DeepTutor — Agent 原生的终身个性化学习工作台,三层记忆+多引擎RAG+Partners
人工智能·开源·资讯
小柯南敲键盘2 小时前
电商图片翻译工具推荐,批量处理主图视频字幕,免费试用
大数据·人工智能·python·音视频
Nil2082 小时前
leetcode 160相交链表
算法·leetcode·链表
一次旅行2 小时前
2026.08.16 AI产业深度解读|国产大模型全面突围,算力硬件/智能安全/人形机器人四大趋势附落地方案
人工智能·安全·机器人