<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Portfolio on 格物堂</title><link>https://gewutang.cn/tags/portfolio/</link><description>Recent content in Portfolio on 格物堂</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Fri, 09 Aug 2013 00:00:00 +0000</lastBuildDate><atom:link href="https://gewutang.cn/tags/portfolio/index.xml" rel="self" type="application/rss+xml"/><item><title>使用R语言构造投资组合的有效前沿</title><link>https://gewutang.cn/2013/08/09/use-r-to-do-portfolio-optimization/</link><pubDate>Fri, 09 Aug 2013 00:00:00 +0000</pubDate><guid>https://gewutang.cn/2013/08/09/use-r-to-do-portfolio-optimization/</guid><description>&lt;p&gt;构造投资组合是金融投资分析中历久弥新的问题。多年以来，学界、业界提出诸多对投资组合进行优化的方法。比如，最经典的基于收益率均值和收益率波动性进行组合优化，由于马克维滋提出用收益率方差表示收益率的波动性，所以，这种方法又称为的 M-V 方法，即 &lt;code&gt;Mean-Variance&lt;/code&gt; 方法的缩写；后来，又衍生出基于夏普比率（&lt;code&gt;Sharp Ratio&lt;/code&gt;）的投资组合优化方法；近年来，随着&lt;code&gt;VaR&lt;/code&gt; (&lt;code&gt;Value at Risk&lt;/code&gt;) 和 &lt;code&gt;CVaR&lt;/code&gt; (&lt;code&gt;Conditional Vaule at Risk&lt;/code&gt;) 概念的兴起，基于 &lt;code&gt;VaR&lt;/code&gt; 和 &lt;code&gt;CVaR&lt;/code&gt; 对投资组合进行优化的思路也开始勃兴；除此之外，对冲基金届还有一种非常有生命力的投资组合优化方法，即桥水公司（&lt;code&gt;Bridge-Water&lt;/code&gt;）公司提出的风险均摊方法（ &lt;code&gt;Risk Pairy&lt;/code&gt; ），这种方法的核心思路在于，估计组合中各个资产的风险度及其占组合风险的比率，然后，按照该比例对组合头寸进行分配。&lt;/p&gt;&#10;&lt;p&gt;几种方法中，在学界和业界最收关注的还是 &lt;code&gt;M-V&lt;/code&gt; 方法。而在 &lt;code&gt;M-V&lt;/code&gt; 方法中最基本的一个知识点，就是构造投资组合的有效前沿。&lt;/p&gt;&#10;&lt;p&gt;理论这里不再赘述，简单说一下其在 &lt;code&gt;R&lt;/code&gt; 语言中的实现。构造有效前沿的步骤大致可按照获取数据、将数据加工处理为收益率矩阵、以收益率矩阵为输入计算得到有效前沿这三个步骤来完成。下面分布来说一说。&lt;/p&gt;&#10;&lt;p&gt;第一步，获取数据。最简单的方法是使用 &lt;code&gt;quantmod&lt;/code&gt; 中的 &lt;code&gt;getSymbols&lt;/code&gt; 函数。因为要要做的事是构建资产组合，因此，得同时获取多只股票的交易数据，这里取 QQQ/SPY/YHOO 三只股票为例。需要运行的代码：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# 载入 quatnmod 包&#10;require(quantmod) &#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 载入需要的程序包：quantmod&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 载入需要的程序包：xts&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 载入需要的程序包：zoo&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## &#10;## 载入程序包：'zoo'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## The following objects are masked from 'package:base':&#10;## &#10;## as.Date, as.Date.numeric&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 载入需要的程序包：TTR&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Registered S3 method overwritten by 'quantmod':&#10;## method from&#10;## as.zoo.data.frame zoo&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# 下载 QQQ/SPY/TSLA 交易数据&#10;getSymbols(c('QQQ','SPY','TSLA')) &#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;QQQ&amp;quot; &amp;quot;SPY&amp;quot; &amp;quot;TSLA&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;第二步，将交易数据处理为收益率数据。这一步可以用 dailyReturn 函数来完成。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# 计算收益率序列&#10;QQQ&amp;lt;- readRDS(&amp;quot;QQQ.rds&amp;quot;)&#10;SPY&amp;lt;- readRDS(&amp;quot;SPY.rds&amp;quot;)&#10;TSLA&amp;lt;- readRDS(&amp;quot;TSLA.rds&amp;quot;)&#10;&#10;QQQ_ret &amp;lt;- na.omit(ROC(Cl(QQQ),type = &amp;quot;discrete&amp;quot;,na.pad = TRUE))&#10;SPY_ret &amp;lt;- na.omit(ROC(Cl(SPY),type = &amp;quot;discrete&amp;quot;,na.pad = TRUE))&#10;TSLA_ret &amp;lt;- na.omit(ROC(Cl(TSLA),type = &amp;quot;discrete&amp;quot;,na.pad = TRUE))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;第三步，合并收益率序列。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;dat &amp;lt;- na.omit(merge(QQQ_ret,SPY_ret,TSLA_ret))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;第四步，计算投资组合的有效前沿。这一步使用 portfolioFrontier 函数来完成。由于 portfolioFrontier 函数的输入必须是 timeSeries 类，因而，得将数据类型进行转化。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;## 转化为 timeSeries 类&#10;require(timeSeries)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 载入需要的程序包：timeSeries&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 载入需要的程序包：timeDate&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## &#10;## 载入程序包：'timeSeries'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## The following object is masked from 'package:zoo':&#10;## &#10;## time&amp;lt;-&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## The following objects are masked from 'package:graphics':&#10;## &#10;## lines, points&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;dat &amp;lt;- as.timeSeries(dat) &#10;## 载入 fPortfolio&#10;require(fPortfolio)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 载入需要的程序包：fPortfolio&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 载入需要的程序包：fBasics&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## &#10;## 载入程序包：'fBasics'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## The following object is masked from 'package:TTR':&#10;## &#10;## volatility&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 载入需要的程序包：fAssets&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;## 求frontier &#10;Frontier &amp;lt;- portfolioFrontier(dat)&#10;Frontier&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## &#10;## Title:&#10;## MV Portfolio Frontier &#10;## Estimator: covEstimator &#10;## Solver: solveRquadprog &#10;## Optimize: minRisk &#10;## Constraints: LongOnly &#10;## Portfolio Points: 5 of 50 &#10;## &#10;## Portfolio Weights:&#10;## QQQ.Close SPY.Close TSLA.Close&#10;## 1 0.0000 1.0000 0.0000&#10;## 13 0.6345 0.2116 0.1538&#10;## 25 0.5957 0.0000 0.4043&#10;## 37 0.3098 0.0000 0.6902&#10;## 50 0.0000 0.0000 1.0000&#10;## &#10;## Covariance Risk Budgets:&#10;## QQQ.Close SPY.Close TSLA.Close&#10;## 1 0.0000 1.0000 0.0000&#10;## 13 0.5509 0.1442 0.3049&#10;## 25 0.3021 0.0000 0.6979&#10;## 37 0.0911 0.0000 0.9089&#10;## 50 0.0000 0.0000 1.0000&#10;## &#10;## Target Returns and Risks:&#10;## mean Cov CVaR VaR&#10;## 1 0.0005 0.0109 0.0265 0.0165&#10;## 13 0.0009 0.0142 0.0331 0.0227&#10;## 25 0.0013 0.0200 0.0448 0.0303&#10;## 37 0.0016 0.0276 0.0604 0.0407&#10;## 50 0.0021 0.0366 0.0792 0.0522&#10;## &#10;## Description:&#10;## Mon May 5 16:26:15 2025 by user:&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;上面结果中 title 部分表明的是本次操作过程中使用的相关方法。Portfolio Weights 部分返回的是三只股票在投资组合中的头寸比例，每一行的和都是 1 。对于第二行，它表示的是在投资组合中将总头寸以 24.09% 、 75.41% 、 0.50% 的比例分散到三只股票标的上。Covariance Risk Budgets 表示的是协方差风险预算矩阵。Target Return and Risks 表示目标组合的预期收益率和风险数据。&lt;/p&gt;&#10;&lt;p&gt;调用 plot 函数可以对上述结果进行绘图，调用 plot 之后，R 控制台会返回一组绘图选项卡：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;plot(Frontier)&#10;&#10;Make a plot selection (or 0 to exit): &#10;&#10;1: Plot Efficient Frontier&#10;2: Add Minimum Risk Portfolio&#10;3: Add Tangency Portfolio&#10;4: Add Risk/Return of Single Assets&#10;5: Add Equal Weights Portfolio&#10;6: Add Two Asset Frontiers [LongOnly Only]&#10;7: Add Monte Carlo Portfolios&#10;8: Add Sharpe Ratio [Markowitz PF Only]&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;各选项卡对应的绘图类型依次是：有效前沿、最小风险组合、切线组合、单个资产的风险/收益、等权重投资组合、两资产投资组合的有效前沿（禁止卖空）、模特卡罗模拟得到的投资组合、夏普比率。依次选择就可以看到相应的绘图结果。&lt;/p&gt;&#10;</description></item></channel></rss>