目录
[🌅 序章:投资的终极矛盾,藏在生活的取舍里](#🌅 序章:投资的终极矛盾,藏在生活的取舍里)
[💡 痛点:为什么不能把鸡蛋放一个篮子?](#💡 痛点:为什么不能把鸡蛋放一个篮子?)
[📖 原理:马科维茨模型的底层逻辑](#📖 原理:马科维茨模型的底层逻辑)
[1. 三大核心定义(通俗拆解)](#1. 三大核心定义(通俗拆解))
[2. 模型核心优化目标](#2. 模型核心优化目标)
[📐 数学之美:从生活逻辑到量化公式](#📐 数学之美:从生活逻辑到量化公式)
[1. 组合收益率公式](#1. 组合收益率公式)
[2. 组合风险(方差)公式](#2. 组合风险(方差)公式)
[3. 标准优化模型(约束条件)](#3. 标准优化模型(约束条件))
[💻 工程落地:MATLAB完整可运行代码](#💻 工程落地:MATLAB完整可运行代码)
[📊 运行结果深度解读](#📊 运行结果深度解读)
[1. 有效前沿曲线含义](#1. 有效前沿曲线含义)
[2. 最优权重配置规律](#2. 最优权重配置规律)
[3. 核心价值总结](#3. 核心价值总结)
[✨ 技术终悟:算法不止算收益,更算取舍](#✨ 技术终悟:算法不止算收益,更算取舍)
[📝 代码运行说明](#📝 代码运行说明)
🌅 序章:投资的终极矛盾,藏在生活的取舍里
生活从来都是一场权衡。把所有积蓄押在一处,看似博取了高收益,也承担了满盘皆输的风险;处处分散投入、不敢进取,又会错失增值的机会。
投资亦是如此。高收益必然伴随高波动,低风险往往对应低回报,收益与风险永远是一对永恒的博弈 。人们穷尽所有理财方式,本质上都在寻找一个答案:如何分配资产,在可控的风险下,拿到最高的稳定收益?
技术是理性的天平,让无序的取舍变成可计算的最优解。而马科维茨投资组合模型,就是现代金融量化的基石------它用数学拆解风险,用优化平衡收益,把人类千百年来的投资取舍,变成了一套严谨、可落地、可量化的最优决策算法。
💡 痛点:为什么不能把鸡蛋放一个篮子?
在没有量化模型之前,投资全凭经验与直觉。普通人的投资误区无非两种:
-
极致激进:重仓单一高收益资产,追逐超额收益,但一旦资产暴跌,风险完全无法对冲;
-
极致保守:无脑分散所有资产,看似规避风险,实则稀释了整体收益,资金利用率极低。
这里藏着一个核心的生活化规律:不同资产的涨跌并非完全同步。股票大涨时债券可能平稳,黄金避险时基金可能回调。
马科维茨最核心的洞察,用生活语言解释就是:利用资产之间的相关性错配,通过合理权重分配,抵消非系统性风险,实现"风险最小、收益最优"的平衡。
通俗类比:就像四季穿搭,单一衣物无法适配全年天气,合理搭配风衣、短袖、棉衣,才能在不同环境下保持舒适。投资组合的权重,就是资产的"最优穿搭方案"。
📖 原理:马科维茨模型的底层逻辑
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 实现马科维茨投资组合优化,无需额外工具箱。包含数据模拟、协方差矩阵计算、最优权重求解、有效前沿绘制、多目标参数对比全流程,注释详细可直接运行。
代码功能说明
-
模拟3类不同风险、不同收益的金融资产;
-
计算资产期望收益率、协方差矩阵;
-
构建马科维茨二次规划模型,求解最优资产权重;
-
绘制投资组合有效前沿、风险收益散点图、权重分布图;
-
对比不同目标收益率下的风险与权重变化规律。
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. 核心价值总结
马科维茨模型彻底打破了"分散投资就是无脑多买资产"的误区,证明了有效的分散投资,是基于资产相关性、风险、收益的量化最优配比,而非主观经验判断。
✨ 技术终悟:算法不止算收益,更算取舍
马科维茨投资组合优化,从来不止是金融量化工具。
它用冰冷的矩阵与迭代计算,诠释了最温柔的生活哲理:世间最优的选择,从来不是极致的激进,也不是一味的保守,而是风险与收益的动态平衡。
人工的取舍靠直觉,机器的取舍靠逻辑。算法帮我们剔除情绪的干扰,在万千资产组合中,找到那条最平稳、最靠谱的增长路径------这也是量化技术,带给现实生活最大的价值。
📝 代码运行说明
本脚本为纯MATLAB原生代码,无需安装任何第三方工具箱,适配所有MATLAB版本;
直接复制全段代码新建 `.m` 文件运行即可,无需额外数据;
运行后自动生成双图可视化窗口,输出最优权重、组合收益、组合风险数据;
可自行修改
beq(2)数值,调整目标收益率,观察权重与风险的联动变化。