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

打印 上一主题 下一主题

主题 1038|帖子 1038|积分 3114

一、数据准备

  准备多个股票的的历史数据,目的就是找到最优的投资组合。
  下载几个标普500里面的公式的股票数据吧,下载方法也可以看我的上一篇文章:【MATLAB】股票(和指数)数据下载–雅虎财经

  用你自己的数据也是一样的。
  二、有效前沿

  有效前沿(Efficient Frontier)是现代投资组合理论中的一个焦点概念,最早由经济学家哈里·马科维茨(Harry Markowitz)于1952年提出。
  它表示在给定的风险程度下,能够实现的最高预期收益,大概在给定的预期收益下,能够承担的最低风险。
  有效前沿不但是投资组合选择的理论基础,也广泛应用于其他范畴,如资源优化、决议分析等。
  在投资范畴,有效前沿通常通过均值-方差优化模子举行描述。在该模子中,风险由资产收益的标准差(或方差)表示(也称为波动率),收益由资产的预期收益率表示。
  有效前沿上的每一个点都代表一个优化的投资组合,它在某个特定风险程度下提供最高的预期回报。
  
  构建有效前沿的基本步骤包括:
  

  • 确定投资资产集合:选择能够构成投资组合的资产。这些资产可以是股票、债券、房地产等。
  • 估计资产的预期收益与风险:计算每个资产的预期收益(通常基于历史数据或市场预期)以及各个资产之间的相干性(即协方差矩阵)。
  • 计算投资组合的收益与风险:对于不同的资产组合,可以通过加权均匀计算组合的预期收益和组合的风险(标准差)。组合的风险不但依赖于单个资产的风险,还受到各资产之间的相干性影响。
  • 优化组合:通过数学优化方法(如线性规划、二次规划等),寻找在不同风险程度下提供最大收益的资产组合。这个过程可以使用均值-方差优化或其他先进算法。
  • 绘制有效前沿:根据不同风险程度下优化出的资产组合,绘制收益-风险图,得到有效前沿曲线。
  
  有效前沿可以通过以下数学公式来描述。假设有一个包含                                        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=1∑n​xi​ri​
  

  • 投资组合风险(标准差、波动率):
                                                                          σ                                        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=1∑n​j=1∑n​xi​xj​σ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                           Σ 是资产收益率的协方差矩阵,描述了不同资产之间的相干性和波动性。
   
  有效前沿的意义与应用:
  

  • 优化投资组合:有效前沿帮助投资者在给定的风险遭受能力下,选择最优的资产组合。在风险-收益衡量中,任何位于有效前沿上的投资组合都不能通过改变权重来提高收益而不增长风险。
  • 风险管理:通过有效前沿,投资者可以直观地相识在不同风险程度下可获得的最大收益,从而做出更为理性的投资决议。
  • 现代投资理论的基石:有效前沿是现代投资组合理论的焦点,它推动了金融市场中基于数学优化的投资计谋的广泛应用,如资源资产定价模子(CAPM)等。
  • 跨范畴应用:除了投资范畴,有效前沿的思想也应用于多个范畴,如供应链管理中的资源分配、生产管理中的成本控制、工程设计中的性能优化等。
  尽管有效前沿是一个理论上非常良好的工具,但其也存在一定范围性:
  

  • 依赖历史数据:有效前沿的构建依赖于对历史数据的估计,然而,历史收益并不一定能准确预测将来的表现,尤其是在市场波动剧烈时。
  • 假设过于理想化:现代投资组合理论假设资产收益是正态分布的,而现实上,金融市场中的资产收益可能具有偏度和峰度,这使得均值-方差优化在现实应用中可能存在偏差。
  • 忽略了投资者的其他需求:有效前沿关注的是收益和风险的衡量,而忽略了投资者的其他需求,如活动性、税务等。
  为了克服这些问题,研究人员提出了多种改进方法,例如:
  

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

  3.1 数据批量读取、预处理

  7支股票数据放在一个文件夹里面:

直接读取该文件夹内所有excel文件,已经股票名称。
  1. %% 读取股票数据,放到一个table里面,只要收盘价格
  2. % 获取stock目录下所有Excel文件
  3. files = dir('stock/*.xlsx');
  4. % 初始化一个空数组,用来存储所有文件的收盘数据
  5. allClosePrices = [];
  6. % 股票名称
  7. stock_name = {};
  8. % 循环遍历每个Excel文件
  9. for i = 1:length(files)
  10.     % 获取当前文件的完整路径
  11.     filePath = fullfile('stock', files(i).name);
  12.     % 保存股票名称
  13.     stock_name = [stock_name,strtok(files(i).name,'_')];
  14.     % 读取Excel文件中的数据
  15.     data = readtable(filePath, 'VariableNamingRule', 'preserve');
  16.    
  17.     % 检查该文件是否包含 '收盘' 列
  18.     if ismember('收盘', data.Properties.VariableNames)
  19.         % 提取 '收盘' 列数据
  20.         closePrices = data.('收盘');
  21.         
  22.         % 将收盘数据合并到 allClosePrices 中
  23.         allClosePrices = [allClosePrices, closePrices];
  24.     else
  25.         warning('文件 %s 不包含 "收盘" 列。', files(i).name);
  26.     end
  27. end
  28. % 创建table
  29. stock_data = table(data.("日期"));
  30. stock_data = [stock_data,array2table(allClosePrices)];
  31. % 列命名
  32. stock_data.Properties.VariableNames = ['日期',stock_name];
复制代码
结果:

  如果你的数据有缺失值,比如某至股票某些生意业务日数据丢失了,可以选择删除这一天的所有数据,大概用均值填充,用临近的值填充等。
     我使用的数据没有缺失值。
   
  1. %% 数据预处理,缺失值处理
  2. % 提取一下价格矩阵
  3. price_data = table2array(stock_data(:,2:8));
  4. % 用均值填补缺失值
  5. for i = 1:size(price_data, 2)
  6.     % 计算该列非缺失值的均值
  7.     column_mean = nanmean(price_data(:, i));
  8.     % 找到缺失值的位置并用均值填补
  9.     price_data(isnan(price_data(:, i)), i) = column_mean;
  10. end
  11. % 删除缺失值
  12. % price_data = rmmissing(price_data);
复制代码
3.2 绘制可行集

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

  1. %% 收益率相关计算
  2. % 计算每日收益率
  3. daily_returns = diff(log(price_data));
  4. % 求每支股票的年化平均收益率
  5. mean_returns = mean(daily_returns)*252;
  6. % 计算收益率的协方差矩阵
  7. cov_matrix = cov(daily_returns)*252;
  8. %% 模拟投资组合
  9. % 设置模拟的投资组合数目
  10. num_portfolios = 2000;
  11. % 初始化权重矩阵为0矩阵
  12. weights = zeros(num_portfolios, length(stock_name));
  13. port_returns = zeros(num_portfolios, 1);
  14. port_volatility = zeros(num_portfolios, 1);
  15. port_sharpe = zeros(num_portfolios, 1);
  16. % 随机生成投资组合权重
  17. for i = 1:num_portfolios
  18.     % 随机权重
  19.     w = rand(1, length(stock_name));
  20.     w = w / sum(w);  % 使权重总和为1
  21.    
  22.     % 计算组合的收益率和波动率
  23.     portfolio_return = sum(w .* mean_returns);
  24.     portfolio_volatility = sqrt(w * cov_matrix * w');
  25.    
  26.     % 存储结果
  27.     weights(i, :) = w;
  28.     port_returns(i) = portfolio_return;
  29.     port_volatility(i) = portfolio_volatility;
  30.    
  31.     % 计算夏普比率,假设无风险利率为2%
  32.     port_sharpe(i) = (portfolio_return -0.02)/ portfolio_volatility;
  33. end
  34. %% 绘制可行集
  35. figure;
  36. scatter(port_volatility, port_returns, 10, port_sharpe, 'filled');
  37. title('有效前沿');
  38. xlabel('波动率');
  39. ylabel('收益率');
  40. grid minor
  41. hold on
复制代码
3.3 绘制有效前沿

  matlab的函数是:Portfolio
  (旧版的叫啥我忘了,反正推荐用新的就行)
  自己去看matlab的帮助文档就行,说的很清晰:
  

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

  
  我的示例:

  1. % 创建 Portfolio 对象
  2. p = Portfolio;
  3. % 设置资产回报率数据(均值和协方差矩阵)
  4. p = Portfolio(p, 'assetmean', mean_returns, 'assetcovar',cov_matrix);
  5. % 设置上、下限为 1,表示权重之和为 1
  6. p = Portfolio(p, 'lowerbudget', 1, 'upperbudget', 1);
  7. % 设置下限为 0,表示不允许空头,最大收益率为xx
  8. p = Portfolio(p, 'lowerbound', 0,'UpperBound',0.5);
  9. plotFrontier(p);
  10. title('可行集和有效前沿');
  11. xlabel('波动率');
  12. ylabel('收益率');
  13. grid minor
  14. hold on
复制代码
3.4 别的-最大夏普率

  夏普比率(Sharpe Ratio) 是衡量投资组合风险调整后收益的指标,通常用来比较不同投资的风险收益表现。夏普比率越高,表示单元风险下的回报越好,投资表现越优秀。
  夏普比率的计算公式为:
                                              S                               =                                                                      R                                        p                                                  −                                                   R                                        f                                                                        σ                                     p                                                             S = \frac{R_p - R_f}{\sigma_p}                        S=σp​Rp​−Rf​​
  其中:
  

  •                                              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                           Rp​−Rf​:投资组合的超额回报(即投资组合回报减去无风险利率)。这个部分衡量了投资组合的现实收益。
  •                                                                σ                                     p                                                      \sigma_p                           σp​:投资组合的风险(波动率)。它表示收益的波动程度。
  夏普比率的应用:
  

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

  • 年化夏普比率:如果收益率是一样平常或月度数据,通常将其年化以便比较:

    • 一样平常数据:                                                                     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                ​

  • 针对不同时间频率的无风险利率:无风险利率的选择应与数据的时间频率一致,确保一致性。–
  
  用的函数都是Portfolio对象的函数,自己去看具体说明。
  1. %% 计算最大夏普率
  2. % 估计有效投资组合以最大化 Portfolio 对象的夏
  3. 普比率
  4. weights = estimateMaxSharpeRatio(p);
  5. [risk, ret] = estimatePortMoments(p, weights);
  6. plot(risk,ret,'*b');
  7. grid minor
  8. max_sharpe_ratio = (ret-0.02)/risk;
  9. fprintf('最大夏普率为:%.4f,对应的波动率为:%.4f, 收益率为:%.4f\n',max_sharpe_ratio,risk,ret);
  10. %% 估计有效边界上指定数量的最优投资组合
  11. % 普比率是投资组合收益率均值与无风险利率之差除以投资组合收益标准差的比率。
  12. % 估计有效边界上指定数量的最优投资组合
  13. pwgt = estimateFrontier(p, 100); % 权重
  14. % 估计投资组合收益波动率(标准差)和均值
  15. [prsk, pret] = estimatePortMoments(p, pwgt);
  16. % 计算它们的夏普率
  17. sharpe_ratio = (pret-0.02)./prsk;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! 更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表