使用R语言构造投资组合

原作者: 邓一硕

来自: 格物堂

构造投资组合是金融投资分析中历久弥新的问题。多年以来,学界、业界提出诸多对投资组合进行优化的方法。比如,最经典的基于收益率均值和 收益率波动性进行组合优化,由于马克维滋提出用收益率方差表示收益率的波动性,所以,这种方法又称为的$$ \sum M-V $$方法,即 Mean-Variance 方法的缩写;后来,又衍生出基于夏普比率(Sharp Ratio)的投资组合优化方法;近年来,随着VaR (Value at Risk) 和 CVaR(Conditional Vaule at Risk) 概念的兴起,基于 VaRCVaR 对投资组合进行优化的思路也开始勃兴;除此之外,对冲基金届还有一种非常有生命力的投资组合优化方法,即桥水公司(Bridge-Water)公司提出的风险均摊方法( Risk Pairy ),这种方法的核心思路在于,估计组合中各个资产的风险度及其占组合风险的比率,然后,按照该比例对组合头寸进行分配。

几种方法中,在学界和业界最收关注的还是 M-V 方法。而在 M-V 方法中最基本的一个知识点,就是构造投资组合的有效前沿。理论这里不再赘述,简单说一下其在 R 语言中的实现。构造有效前沿的步骤大致可按照获取数据、将数据加工处理为收益率矩阵、以收益率矩阵为输入计算得到有效前沿这三个步骤来完成。下面分布来说一说。

第一步,获取数据。最简单的方法是使用 quantmod 中的 getSymbols 函数。因为要要做的事是构建资产组合,因此,得同时获取多只股票的交易数据,这里取 QQQ/SPY/YHOO 三只股票为例。需要运行的代码:

# 载入 quatnmod 包require(quantmod) # 下载 QQQ/SPY/YHOO 交易数据getSymbols(c('QQQ','SPY','YHOO')) 

第二步,将交易数据处理为收益率数据。这一步可以用 dailyReturn 函数来完成。

# 计算收益率序列QQQ_ret=dailyReturn(QQQ)  SPY_ret=dailyReturn(SPY)YHOO_ret=dailyReturn(YHOO)

第三步,合并收益率序列。

dat=merge(QQQ_ret,SPY_ret,YHOO_ret)

第四步,计算投资组合的有效前沿。这一步使用 portfolioFrontier 函数来完成。由于 portfolioFrontier 函数的输入必须是 timeSeries 类,因而,得将数据类型进行转化。

## 转化为 timeSeries 类require(timeSeries)dat=as.timeSeries(dat)  ## 载入 fPortfoliorequire(fPortfolio)## 求frontier Frontier = portfolioFrontier(dat)Frontier

Title:
 MV Portfolio Frontier 
 Estimator:         covEstimator 
 Solver:            solveRquadprog 
 Optimize:          minRisk 
 Constraints:       LongOnly 
 Portfolio Points:  5 of 50 Portfolio Weights:
   daily.returns daily.returns.1 daily.returns.21         0.0000          1.0000          0.000013        0.2409          0.7541          0.005025        0.4853          0.5090          0.005737        0.7296          0.2640          0.006550        1.0000          0.0000          0.0000Covariance Risk Budgets:
   daily.returns daily.returns.1 daily.returns.21         0.0000          1.0000          0.000013        0.2355          0.7596          0.004925        0.4877          0.5065          0.005837        0.7390          0.2545          0.006550        1.0000          0.0000          0.0000Target Return and Risks:
     mean     mu    Cov  Sigma   CVaR    VaR1  0.0002 0.0002 0.0151 0.0151 0.0368 0.023313 0.0003 0.0003 0.0149 0.0149 0.0361 0.023025 0.0003 0.0003 0.0148 0.0148 0.0358 0.023437 0.0004 0.0004 0.0149 0.0149 0.0356 0.024150 0.0005 0.0005 0.0152 0.0152 0.0357 0.0249Description:
 Fri Aug 09 11:21:31 2013 by user: Owner 

上面结果中 title 部分表明的是本次操作过程中使用的相关方法。Portfolio Weights 部分返回的是三只股票在投资组合中的头寸比例,每一行的和都是 1 。对于第二行,它表示的是在投资组合中将总头寸以 24.09% 、 75.41% 、 0.50% 的比例分散到三只股票标的上。Covariance Risk Budgets 表示的是协方差风险预算矩阵。Target Return and Risks 表示目标组合的预期收益率和风险数据。

调用 plot 函数可以对上述结果进行绘图,调用 plot 之后,R 控制台会返回一组绘图选项卡:

plot(Frontier)Make a plot selection (or 0 to exit):

 1:   Plot Efficient Frontier
2:   Add Minimum Risk Portfolio
3:   Add Tangency Portfolio
4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]

各选项卡对应的绘图类型依次是:有效前沿、最小风险组合、切线组合、单个资产的风险/收益、等权重投资组合、两资产投资组合的有效前沿(禁止卖空)、模特卡罗模拟得到的投资组合、夏普比率。依次,选择可以看到相应的绘图结果:

Selection: 1Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]
Selection: 2Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]
Selection: 3Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]
Selection: 4Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]
Selection: 5Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]
Selection: 6Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]
Selection: 7Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]
Selection: 8Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2015-12-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿人谷

如何养成良好的c++编程习惯(1)——内存管理

开篇导读   “养成良好的编程习惯”其实是相当综合的一个命题,可以从多个角度、维度和层次进行论述和评判。如代码的风格、效率和可读性;模块设计的灵活 性、可扩展性...

2955
来自专栏跟着阿笨一起玩NET

采用左右值编码来存储无限分级树形结构的数据库表设计

该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量较大时,可以大大提高列表效率。但是,这种编码方案由...

681
来自专栏圣杰的专栏

DDD理论学习系列(7)-- 值对象

? 1.引言 提到值对象,我们可能立马就想到值类型和引用类型。而在C#中,值类型的代表是strut和enum,引用类型的代表是class、interface、...

2287
来自专栏SeanCheney的专栏

《利用Python进行数据分析·第2版》第14章 数据分析案例14.1 来自Bitly的USA.gov数据14.2 MovieLens 1M数据集14.3 1880-2010年间全美婴儿姓名14.4

本书正文的最后一章,我们来看一些真实世界的数据集。对于每个数据集,我们会用之前介绍的方法,从原始数据中提取有意义的内容。展示的方法适用于其它数据集,也包括你的。...

2755
来自专栏积累沉淀

linux学习之硬盘的存储原理和内部架构

首先,让我们看一下硬盘的发展史: 1956年9月13日,IBM的IBM 350 RAMAC(Random Access Method of Accounting...

2246
来自专栏数据结构与算法

Day3下午解题报告

预计分数:20+40+30=90 实际分数:40+90+60=190 再次人品爆发&&手感爆发&&智商爆发 谁能告诉我为什么T1数据这么水。。 谁能告诉我为什么...

3245
来自专栏生信技能树

了解5个乳腺癌表达数据集

这5个数据集都是以前的研究者发表的,它们 Mainz, Transbig, UPP, and UNT 数据集 分别对应的是: GSE11121,GSE7390,...

1014
来自专栏数据结构与算法

BZOJ1061: [Noi2008]志愿者招募(线性规划)

  申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管。布布刚上任就遇到了一个难

944
来自专栏数据派THU

【数据蒋堂】索引的本质是排序

来源:润乾软件 作者:蒋步星 本文长度为2600字,建议阅读5分钟 本文为你分析索引清理背后的技术原理。 索引是经常用到的技术,但有些程序员对索引的原理了解不深...

1838
来自专栏HansBug's Lab

1339 / 1163: [Baltic2008]Mafia

1163: [Baltic2008]Mafia Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 96  Sol...

2485

扫码关注云+社区