【MATLAB】绘制投资组合的有效前沿

news2025/1/10 12:59:25

文章目录

  • 一、数据准备
  • 二、有效前沿
  • 三、代码
    • 3.1 数据批量读取、预处理
    • 3.2 绘制可行集
    • 3.3 绘制有效前沿
    • 3.4 其它-最大夏普率

一、数据准备

准备多个股票的的历史数据,目的就是找到最优的投资组合。

下载几个标普500里面的公式的股票数据吧,下载方法也可以看我的上一篇文章:【MATLAB】股票(和指数)数据下载–雅虎财经
在这里插入图片描述

用你自己的数据也是一样的。

二、有效前沿

有效前沿(Efficient Frontier)是现代投资组合理论中的一个核心概念,最早由经济学家哈里·马科维茨(Harry Markowitz)于1952年提出。

它表示在给定的风险水平下,能够实现的最高预期收益,或者在给定的预期收益下,能够承担的最低风险。

有效前沿不仅是投资组合选择的理论基础,也广泛应用于其他领域,如资源优化、决策分析等。

在投资领域,有效前沿通常通过均值-方差优化模型进行描述。在该模型中,风险由资产收益的标准差(或方差)表示(也称为波动率)收益由资产的预期收益率表示

有效前沿上的每一个点都代表一个优化的投资组合,它在某个特定风险水平下提供最高的预期回报。


构建有效前沿的基本步骤包括:

  1. 确定投资资产集合:选择能够构成投资组合的资产。这些资产可以是股票、债券、房地产等。

  2. 估计资产的预期收益与风险:计算每个资产的预期收益(通常基于历史数据或市场预期)以及各个资产之间的相关性(即协方差矩阵)。

  3. 计算投资组合的收益与风险:对于不同的资产组合,可以通过加权平均计算组合的预期收益和组合的风险(标准差)。组合的风险不仅依赖于单个资产的风险,还受到各资产之间的相关性影响。

  4. 优化组合:通过数学优化方法(如线性规划、二次规划等),寻找在不同风险水平下提供最大收益的资产组合。这个过程可以利用均值-方差优化或其他先进算法。

  5. 绘制有效前沿:根据不同风险水平下优化出的资产组合,绘制收益-风险图,得到有效前沿曲线。


有效前沿可以通过以下数学公式来描述。假设有一个包含 n n n个资产的投资组合,其中每个资产的预期收益为 r i r_i ri,资产的权重为 x i x_i xi,且资产收益的协方差矩阵为 Σ \Sigma Σ,则投资组合的预期收益 R p R_p Rp和风险 σ p \sigma_p σp分别为:

  • 投资组合预期收益:

R p = ∑ i = 1 n x i r i R_p = \sum_{i=1}^{n} x_i r_i Rp=i=1nxiri

  • 投资组合风险(标准差、波动率):

    σ p = ∑ i = 1 n ∑ j = 1 n x i x j σ i j \sigma_p = \sqrt{\sum_{i=1}^{n} \sum_{j=1}^{n} x_i x_j \sigma_{ij}} σp=i=1nj=1nxixjσij

    其中, σ i j \sigma_{ij} σij是资产 i i i和资产 j j j的协方差。

通过调整资产的权重 x i x_i xi,可以得到一系列不同风险水平下的投资组合,最终形成有效前沿。

你可能看到的是下面的公式,它和前面的是一样的: σ p = w T Σ w \sigma_p = \sqrt{\mathbf{w}^T \Sigma \mathbf{w}} σp=wTΣw

其中:

  • σ p \sigma_p σp 是投资组合的波动率。
  • w \mathbf{w} w 是投资组合的权重向量(例如, w 1 , w 2 , … , w n w_1, w_2, \dots, w_n w1,w2,,wn,表示每个资产在组合中的比例)。
  • Σ \Sigma Σ 是资产收益率的协方差矩阵,描述了不同资产之间的相关性和波动性。

有效前沿的意义与应用:

  1. 优化投资组合:有效前沿帮助投资者在给定的风险承受能力下,选择最优的资产组合。在风险-收益权衡中,任何位于有效前沿上的投资组合都不能通过改变权重来提高收益而不增加风险。

  2. 风险管理:通过有效前沿,投资者可以直观地了解在不同风险水平下可获得的最大收益,从而做出更为理性的投资决策。

  3. 现代投资理论的基石:有效前沿是现代投资组合理论的核心,它推动了金融市场中基于数学优化的投资策略的广泛应用,如资本资产定价模型(CAPM)等。

  4. 跨领域应用:除了投资领域,有效前沿的思想也应用于多个领域,如供应链管理中的资源分配、生产管理中的成本控制、工程设计中的性能优化等。

尽管有效前沿是一个理论上非常优越的工具,但其也存在一定局限性:

  1. 依赖历史数据:有效前沿的构建依赖于对历史数据的估计,然而,历史收益并不一定能准确预测未来的表现,尤其是在市场波动剧烈时。

  2. 假设过于理想化:现代投资组合理论假设资产收益是正态分布的,而实际上,金融市场中的资产收益可能具有偏度和峰度,这使得均值-方差优化在实际应用中可能存在偏差。

  3. 忽略了投资者的其他需求:有效前沿关注的是收益和风险的权衡,而忽略了投资者的其他需求,如流动性、税务等。

为了克服这些问题,研究人员提出了多种改进方法,例如:

  • 引入更多的风险度量指标:如条件风险价值(CVaR)、最坏情况下的风险(worst-case risk)等。
  • 使用贝叶斯方法:利用贝叶斯推断来改进参数估计,减少数据不确定性对有效前沿的影响。
  • 引入行为金融学的视角:将投资者心理、行为偏差等因素纳入投资决策中,提供更为全面的投资建议。

三、代码

3.1 数据批量读取、预处理

7支股票数据放在一个文件夹里面:
在这里插入图片描述
直接读取该文件夹内所有excel文件,已经股票名称。

%% 读取股票数据,放到一个table里面,只要收盘价格

% 获取stock目录下所有Excel文件
files = dir('stock/*.xlsx');

% 初始化一个空数组,用来存储所有文件的收盘数据
allClosePrices = [];
% 股票名称
stock_name = {};

% 循环遍历每个Excel文件
for i = 1:length(files)
    % 获取当前文件的完整路径
    filePath = fullfile('stock', files(i).name);

    % 保存股票名称
    stock_name = [stock_name,strtok(files(i).name,'_')];

    % 读取Excel文件中的数据
    data = readtable(filePath, 'VariableNamingRule', 'preserve');
    
    % 检查该文件是否包含 '收盘' 列
    if ismember('收盘', data.Properties.VariableNames)
        % 提取 '收盘' 列数据
        closePrices = data.('收盘');
        
        % 将收盘数据合并到 allClosePrices 中
        allClosePrices = [allClosePrices, closePrices];
    else
        warning('文件 %s 不包含 "收盘" 列。', files(i).name);
    end
end

% 创建table
stock_data = table(data.("日期"));
stock_data = [stock_data,array2table(allClosePrices)];

% 列命名
stock_data.Properties.VariableNames = ['日期',stock_name];

结果:
在这里插入图片描述

如果你的数据有缺失值,比如某至股票某些交易日数据丢失了,可以选择删除这一天的所有数据,或者用均值填充,用临近的值填充等。

我使用的数据没有缺失值。

%% 数据预处理,缺失值处理

% 提取一下价格矩阵
price_data = table2array(stock_data(:,2:8));

% 用均值填补缺失值
for i = 1:size(price_data, 2)
    % 计算该列非缺失值的均值
    column_mean = nanmean(price_data(:, i));

    % 找到缺失值的位置并用均值填补
    price_data(isnan(price_data(:, i)), i) = column_mean;
end

% 删除缺失值
% price_data = rmmissing(price_data);

3.2 绘制可行集

随机生成2000个权重即投资组合,然后计算收益率、波动率,画出散点图,就做出了投资组合的可行集。

在这里插入图片描述

%% 收益率相关计算

% 计算每日收益率
daily_returns = diff(log(price_data)); 

% 求每支股票的年化平均收益率
mean_returns = mean(daily_returns)*252;

% 计算收益率的协方差矩阵
cov_matrix = cov(daily_returns)*252;

%% 模拟投资组合

% 设置模拟的投资组合数目
num_portfolios = 2000;
% 初始化权重矩阵为0矩阵
weights = zeros(num_portfolios, length(stock_name));

port_returns = zeros(num_portfolios, 1);
port_volatility = zeros(num_portfolios, 1);
port_sharpe = zeros(num_portfolios, 1);

% 随机生成投资组合权重
for i = 1:num_portfolios
    % 随机权重
    w = rand(1, length(stock_name));
    w = w / sum(w);  % 使权重总和为1
    
    % 计算组合的收益率和波动率
    portfolio_return = sum(w .* mean_returns);

    portfolio_volatility = sqrt(w * cov_matrix * w');
    
    % 存储结果
    weights(i, :) = w;
    port_returns(i) = portfolio_return;
    port_volatility(i) = portfolio_volatility;
    
    % 计算夏普比率,假设无风险利率为2%
    port_sharpe(i) = (portfolio_return -0.02)/ portfolio_volatility;
end

%% 绘制可行集

figure;
scatter(port_volatility, port_returns, 10, port_sharpe, 'filled');
title('有效前沿');
xlabel('波动率');
ylabel('收益率');
grid minor
hold on

3.3 绘制有效前沿

matlab的函数是:Portfolio

(旧版的叫啥我忘了,反正推荐用新的就行)

自己去看matlab的帮助文档就行,说的很清楚:

在这里插入图片描述

有哪些函数,都写的很清楚:

在这里插入图片描述


我的示例:
在这里插入图片描述

% 创建 Portfolio 对象
p = Portfolio;

% 设置资产回报率数据(均值和协方差矩阵)
p = Portfolio(p, 'assetmean', mean_returns, 'assetcovar',cov_matrix);
% 设置上、下限为 1,表示权重之和为 1
p = Portfolio(p, 'lowerbudget', 1, 'upperbudget', 1);
 % 设置下限为 0,表示不允许空头,最大收益率为xx
p = Portfolio(p, 'lowerbound', 0,'UpperBound',0.5);

plotFrontier(p);
title('可行集和有效前沿');
xlabel('波动率');
ylabel('收益率');
grid minor
hold on

3.4 其它-最大夏普率

夏普比率(Sharpe Ratio) 是衡量投资组合风险调整后收益的指标,通常用来比较不同投资的风险收益表现。夏普比率越高,表示单位风险下的回报越好,投资表现越优秀。

夏普比率的计算公式为:
S = R p − R f σ p S = \frac{R_p - R_f}{\sigma_p} S=σpRpRf

其中:

  • S S S 是夏普比率
  • R p R_p Rp 是投资组合的预期收益率
  • R f R_f Rf 是无风险利率(通常使用短期国债收益率或类似的低风险投资的回报率)
  • σ p \sigma_p σp 是投资组合的波动率(即标准差,表示投资组合的风险)

解释:

  • R p − R f R_p - R_f RpRf:投资组合的超额回报(即投资组合回报减去无风险利率)。这个部分衡量了投资组合的实际收益。
  • σ p \sigma_p σp:投资组合的风险(波动率)。它表示收益的波动程度。

夏普比率的应用:

  • 较高的夏普比率表示相对于承担的风险,投资组合的回报较高。换句话说,投资者用较少的风险获得较好的回报。
  • 较低的夏普比率意味着投资组合的回报相对于风险较低,或者相同风险下的回报较差。

夏普比率的改进:

  1. 年化夏普比率:如果收益率是日常或月度数据,通常将其年化以便比较:

    • 日常数据: S annual = S daily × 252 S_{\text{annual}} = S_{\text{daily}} \times \sqrt{252} Sannual=Sdaily×252 (通常一年252个交易日)
    • 月度数据: S annual = S monthly × 12 S_{\text{annual}} = S_{\text{monthly}} \times \sqrt{12} Sannual=Smonthly×12
  2. 针对不同时间频率的无风险利率:无风险利率的选择应与数据的时间频率一致,确保一致性。–


用的函数都是Portfolio对象的函数,自己去看具体说明。

%% 计算最大夏普率

% 估计有效投资组合以最大化 Portfolio 对象的夏
普比率
weights = estimateMaxSharpeRatio(p);

[risk, ret] = estimatePortMoments(p, weights);

plot(risk,ret,'*b');
grid minor

max_sharpe_ratio = (ret-0.02)/risk;
fprintf('最大夏普率为:%.4f,对应的波动率为:%.4f, 收益率为:%.4f\n',max_sharpe_ratio,risk,ret);

%% 估计有效边界上指定数量的最优投资组合

% 普比率是投资组合收益率均值与无风险利率之差除以投资组合收益标准差的比率。

% 估计有效边界上指定数量的最优投资组合
pwgt = estimateFrontier(p, 100); % 权重

% 估计投资组合收益波动率(标准差)和均值
[prsk, pret] = estimatePortMoments(p, pwgt);

% 计算它们的夏普率
sharpe_ratio = (pret-0.02)./prsk;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JuiceFS 2024:开源与商业并进,迈向 AI 原生时代

即将过去的 2024 年,是 JuiceFS 开源版本推出的第 4 年,企业版的第 8 个年头。回顾过去这一年,JuiceFS 社区版依旧保持着快速成长的势头,GitHub 星标突破 11.1K,各项使用指标增长均超过 100%,其中文件系统总…

重生之我在异世界学编程之C语言:枚举联合篇

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文枚举(Enum&#xff0…

6 分布式限流框架

限流的作用 在API对外互联网开放的情况下,是无法控制调用方的行为的。当遇到请求激增或者黑客攻击的情况下,会导致接口占用大量的服务器资源,使得接口响应效率的降低或者超时,更或者导致服务器宕机。 限流是指对应用服务进行限制…

【Linux系列】如何使用 nohup 命令在后台运行脚本

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

门禁系统与消防报警的几种联动方式

1、规范中要求的出入口系统与消防联动 1.1《建筑设计防火规范》GB 50016-2018 1.2《民用建筑电气设计规范》JGJ 16-2008  14.4出入口控制系统 3 设置在平安疏散口的出入口限制装置,应与火灾自动报警系统联动;在紧急状况下应自动释放出入口限制系统&…

Express 加 sqlite3 写一个简单博客

例图: 搭建 命令: 前提已装好node.js 开始创建项目结构 npm init -y package.json:{"name": "ex01","version": "1.0.0","main": "index.js","scripts": {"test": &q…

GetMaterialApp组件的功能与用法

文章目录 1. 知识回顾2. 使用方法2.1 源码分析2.2 常用属性3. 示例代码4. 内容总结我们在上一章回中介绍了"Get包简介"相关的内容,本章回中将介绍GetMaterialApp组件.闲话休提,让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中已经介绍过GetMaterialApp组…

LabVIEW之树形控件

一、树形控件基本构成 树形控件这个名称非常形象,其如同树一样,是典型的分层结构。树形控件的属性和方法使用非常灵活,树形控件的内容既可以静态编辑,也可以通过编程来动态填充。静态编辑树形控件适用于内容不变的应用场景&#…

Inno Setup制作安装包,安装给win加环境变量

加 ; 加环境变量,开启,下面一行 ChangesEnvironmentyes 和 ; 加环境变量wbrj变量名,{app}\project\bin变量值,{app}\后接文件名,{app}表示安装路径。下面一行,{olddata};原来的值上拼接 Root: HKLM; Subkey: “SYSTEM\…

张朝阳惊现CES展,为中国品牌 “代言”的同时,或将布局搜狐新战略!

每年年初,科技圈的目光都会聚焦在美国拉斯维加斯,因为这里将上演一场被誉为 “科技春晚” 的年度大戏 ——CES 国际消费电子展。作为全球规模最大、最具影响力的科技展会之一,CES 吸引了来自 160 多个国家的创新者和行业领导者,是…

UDS诊断之0x27服务—结合实例讲解

前言: 本文讲解的是比较深入一点知识,对于一些刚入门的同学,建议直接先看一遍14229规范,然后找一个实际项目练练手!然后再来看本文,相信你会对0x27服务有更深的认知!!! …

React Router 向路由组件传state参数浏览器回退历史页面显示效果问题

昨天在看尚硅谷张天禹老师讲的 React教程p90,老师讲到 React路由的 replace模式和push模式,老师的演示效果与自己本地操作不太一样。 老师的效果:点击查看消息1,消息2,消息3 再点回退,可以依次查看到 消息…

静态路由配置与调试——计算机网络实训day1

文章目录 操作前准备一、实验目的二、实验要求三、实验过程1、在R1和R2上配置设备名称。基本配置设备命名 2、在R1和R2上配置接口IP地址,并查看IP地址的配置情况。3、在R1和R2上配置静态路由,并查看路由表。静态路由缺省路由(默认路由&#x…

【HeadFirst系列之HeadFirst设计模式】第1天之HeadFirst设计模式开胃菜

HeadFirst设计模式开胃菜 前言 从今日起,陆续分享《HeadFirst设计模式》的读书笔记,希望能够帮助大家更好的理解设计模式,提高自己的编程能力。 今天要分享的是【HeadFirst设计模式开胃菜】,主要介绍了设计模式的基本概念、设计模…

UOS系统和windows系统wps文档显示差异问题解决

最近在使用UOS系统的过程中,发现了一个很有意思的现象。就是在UOS系统上编辑的文档,发到windows系统上,会出现两个文档显示差异很大的情况,文档都是使用一样的wps软件打开的。到底是什么原因导致这种现象的呢?该如何解…

网络应用层HTTP协议

网络应用层HTTP协议 1. HTTP协议介绍 在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如 HTML 文档)。…

B+树的原理及实现

文章目录 B树的原理及实现一、引言二、B树的特性1、结构特点2、节点类型3、阶数 三、B树的Java实现1、节点实现2、B树操作2.1、搜索2.2、插入2.3、删除2.4、遍历 3、B树的Java实现示例 四、总结 B树的原理及实现 一、引言 B树是一种基于B树的树形数据结构,它在数据…

在 macOS 中,设置自动将文件夹排在最前

文章目录 1、第一步访达设置2、第二步排序方式 需要两步设置 1、第一步访达设置 按名称排序的窗口中 2、第二步排序方式 选择名称

【数据库】Unity 使用 Sqlite 数据库

1.找到需要三个 DLL Mono.Data.Sqlite.dllSystem.Data.dllsqlite3.dll 上面两个dll可在本地unity安装目录找到: C:\Program Files\Unity\Hub\Editor\2022.3.xxf1c1\Editor\Data\MonoBleedingEdge\lib\mono\unityjit-win32 下面dll可在sqlite官网下载到&#xff…

国内使用博查SearchAPI进行智能搜索,通过API获取搜索引擎的天气、日历、百科、手机、火车票等信息

在现代开发中,网络资源搜索是关键且常见的需求。博查SearchAPI作为国内领先的智能搜索解决方案,已服务超过2000家企业和16000名开发者,获得腾讯元器、字节扣子、阿里钉钉等官方推荐。该API提供近百亿网页内容及多样的生态合作内容&#xff0c…