R语言马科维茨Markowitz均值-方差(风险投资模型)分析最优投资组合数据预期收益率可视化(上)

简介: R语言马科维茨Markowitz均值-方差(风险投资模型)分析最优投资组合数据预期收益率可视化

全文链接:https://tecdat.cn/?p=33146


证券及其它风险资产的投资首先需要解决的是两个核心问题:即预期收益与风险。那么如何测定组合投资的风险与收益和如何平衡这两项指标进行资产分配是市场投资者迫切需要解决的问题。正是在这样的背景下,在50年代和60年代初,马科维茨理论应运而生点击文末“阅读原文”获取完整代码数据


该理论依据以下几个假设:

  1. 投资者在考虑每一次投资选择时,其依据是某一持仓时间内的证券收益的概率分布。
  2. 投资者是根据证券的期望收益率估测证券组合的风险。
  3. 投资者的决定仅仅是依据证券的风险和收益。
  4. 在一定的风险水平上,投资者期望收益最大;相对应的是在一定的收益水平上,投资者希望风险最小。

根据以上假设,马科维茨确立了证券组合预期收益、风险的计算方法和有效边界理论,建立了资产优化配置的均值-方差模型(允许放空):

image.png

若不允许放空,则为:

image.png

随着计算机技术的发展,利用现代统计学和编程语言进行数据分析和投资组合优化变得越来越普遍和容易。R语言作为一种功能强大的数据分析工具,提供了丰富的包和函数来支持马科维茨均值-方差模型的实施和可视化。

本文旨在帮助客户使用R语言实现马科维茨均值-方差模型,并通过可视化方式展示最优投资组合的预期收益率随时间变化的趋势。


4个类别的股票收益率数据:


image.png

image.png

image.png

image.png

类别1和类别2


读取数据、进行投资组合分析,并绘制预期收益率随时间变化的图表。

X0 = read.csv("sample1.csv")

读取名为"sample1.csv"的CSV文件,并将其存储在X0变量中。该文件包含了用于投资组合分析的数据。

nrow(X0)

计算X0数据集的行数,即样本数量。

library(fPortfolio) 
library(tseries)

提供了进行投资组合分析和时间序列分析所需的函数和工具。

col = sample(2:ncol(X0), 5)

从X0数据集中随机选择5个列,将其索引存储在变量col中。这些列将用于构建投资组合。

X = timeSeries(X0[, col])

创建一个时间序列对象X,其中包含X0数据集的选定列。X将用于进行投资组合分析。

Spec

image.png

MV Efficient Portfolio模型是指均值-方差效率组合模型(Mean-Variance Efficient Portfolio Model)。

该模型是由美国经济学家马科维茨(Harry Markowitz)于1952年提出的,在投资组合理论中被广泛应用。

该模型的核心思想是通过最大化预期回报与最小化投资风险之间的权衡,构建出在给定风险水平下收益最高的投资组合。

具体而言,该模型通过计算不同资产在组合中的权重,以及资产之间的相关性,进而确定最优投资组合。其中,均值是表示收益的期望值,方差则是衡量投资组合的风险。

在MV Efficient Portfolio模型中,投资者可以根据自身的风险承受能力和预期收益,选择最优的投资组合。通过将不同资产在投资组合中的权重调整,可以实现在给定风险范围内最大化投资回报。

然而,MV Efficient Portfolio模型也存在一些局限性,例如,它基于历史数据来计算预期回报和风险,并假设投资者的决策行为是理性的。同时,它也没有考虑到市场非理性行为和不确定性的因素。

尽管如此,MV Efficient Portfolio模型仍然是投资组合构建和管理中的重要工具,为投资者提供了一种系统化的方法来优化投资组合,平衡风险和回报。

创建了一个对象Spec,并通过平均值设置了目标收益率。Spec包含了投资组合分析的规格和参数。通过mean(colMeans(X))计算出选定列的平均收益率,并将其设为目标收益率。

Constraints = "Long Only"
Constraints

定义了一个约束条件"Long Only",表示投资组合只能持有多头头寸(不能卖空)。

X = na.omit(X)

删除X中包含缺失值的行。

eo = efficientPortfolio(X, Spec, Constraints)
eo

image.png

用X、Spec和Constraints作为参数,来执行投资组合优化分析,并将结果存储在eo变量中。

jo = getTrgtetrn(eo)
fo = gergRsk(eo)
qo = geeihts(eo)
qo

image.png

分别将eo对象的目标收益率、目标风险和资产权重存储在jo、fo和qo变量中。

ex = t(too) * qo
ex

计算投资组合预期收益率ex,通过矩阵乘法将too转置后与权重qo相乘。

image.png

exr = apply(ex, 2, sum)
exr

对ex的每一列求和,得到预期收益率的向量exr。

image.png

以上包含了读取数据、投资组合分析的过程。

对第二个类数据集进行分析:

读取名为"sample2.csv"的CSV文件,并将其存储在变量X0中。然后,计算X0数据集的行数,并加载了两个R包:fPortfolio和tseries。最后,根据随机选择的列索引,创建一个时间序列对象X,其中包含了X0数据集的选定列。

X0 = read.csv("sample2.csv")

读取名为"sample2.csv"的CSV文件,并将其存储在X0变量中。该文件包含了用于后续操作的数据。

nrow(X0)

计算X0数据集的行数,即样本数量。

library(fPofoio) 
library(tsrie)

加载了两个R包。它们提供了进行投资组合分析和时间序列分析所需的函数和工具。

col = sample(2:ncol(X0), 5)

从X0数据集中随机选择5个列,将这些列的索引存储在变量col中。这些列将用于构建时间序列对象X。

X = timeSeries(X0[, col])

创建一个时间序列对象X,其中包含了X0数据集的选定列。X将用于后续操作。

这段代码包含了一个循环,每次循环都会进行投资组合分析并绘制预期收益率随时间变化的折线图。下面是对应代码的解释:

Spec = potolSpec()

创建一个对象Spec,表示投资组合的规格和参数。

setTargetReturn(Spec) = mean(colMeans(X))

设置Spec对象的目标收益率为选定列的平均收益率。

Spec

输出Spec对象,显示投资组合的规格和参数。

image.png

Constants = "Long Only"

定义一个约束条件"Long Only",表示投资组合只能持有多头头寸(不能卖空)。

Constraints

输出约束条件,显示约束条件的内容。

X = na.omit(X)

删除X中包含缺失值的行。

eo = efficientPortfolio(X, Spec, Constraints); eo

执行投资组合优化分析,并将结果存储在eo变量中。

jo = getTargetReturn(eo)

获取eo对象的目标收益率,并将其存储在jo变量中。

fo = gtTrgeRsk(eo)

获取eo对象的目标风险,并将其存储在fo变量中。

qo = geWigts(eo); qo

获取eo对象的资产权重,并将其存储在qo变量中。

image.png

选择X的最后30行(即最近30个时间点)作为变量too存储。

image.png

ex = t(too) * qo; ex

将too转置后与权重qo相乘,得到投资组合预期收益率ex。

image.png

对ex的每一列求和,得到预期收益率的向量exr。

pt = 1:30

image.png

创建一个长度为30的向量pt,用于表示横轴上的日期。

lines(exr, lty = 1, col = 2, lwd = 1)

使用lines函数绘制exr的折线图,并指定线型、颜色和线宽。

整个代码段是一个循环,会重复执行下面的代码块100次:

col = sample(1:ncol(X0), 5)
X = timeSeries(X0[,col])
# 中间省略部分相同的代码...

在每次循环中,随机选择5个列,创建时间序列对象X,进行投资组合分析,并绘制预期收益率随时间变化的折线图。

把两个类别的投资组合预期收益率进行对比


image.png

点击标题查阅往期内容


极值理论 EVT、POT超阈值、GARCH 模型分析股票指数VaR、条件CVaR:多元化投资组合预测风险测度分析


01

02

03

04


R语言马科维茨Markowitz均值-方差(风险投资模型)分析最优投资组合数据预期收益率可视化(下):https://developer.aliyun.com/article/1498083

相关文章
|
数据采集 机器学习/深度学习 数据可视化
R语言从数据到决策:R语言在商业分析中的实践
【9月更文挑战第1天】R语言在商业分析中的应用广泛而深入,从数据收集、预处理、分析到预测模型构建和决策支持,R语言都提供了强大的工具和功能。通过学习和掌握R语言在商业分析中的实践应用,我们可以更好地利用数据驱动企业决策,提升企业的竞争力和盈利能力。未来,随着大数据和人工智能技术的不断发展,R语言在商业分析领域的应用将更加广泛和深入,为企业带来更多的机遇和挑战。
|
数据可视化 数据挖掘 图形学
R语言基础可视化:使用ggplot2构建精美图形的探索
【8月更文挑战第29天】 `ggplot2`是R语言中一个非常强大的图形构建工具,它基于图形语法提供了一种灵活且直观的方式来创建各种统计图形。通过掌握`ggplot2`的基本用法和美化技巧,你可以轻松地将复杂的数据转化为直观易懂的图形,从而更好地理解和展示你的数据分析结果。希望本文能够为你探索`ggplot2`的世界提供一些帮助和启发。
|
存储 数据采集 数据处理
R语言数据变换:使用tidyr包进行高效数据整形的探索
【8月更文挑战第29天】`tidyr`包为R语言的数据整形提供了强大的工具。通过`pivot_longer()`、`pivot_wider()`、`separate()`和`unite()`等函数,我们可以轻松地将数据从一种格式转换为另一种格式,以满足不同的分析需求。掌握这些函数的使用,将大大提高我们处理和分析数据的效率。
|
数据可视化 数据挖掘 数据处理
R语言高级可视化技巧:使用Plotly与Shiny制作互动图表
【8月更文挑战第30天】通过使用`plotly`和`shiny`,我们可以轻松地创建高度互动的数据可视化图表。这不仅增强了图表的表现力,还提高了用户与数据的交互性,使得数据探索变得更加直观和高效。本文仅介绍了基本的使用方法,`plotly`和`shiny`还提供了更多高级功能和自定义选项,等待你去探索和发现。希望这篇文章能帮助你掌握使用`plotly`和`shiny`制作互动图表的技巧,并在你的数据分析和可视化工作中发挥更大的作用。
R语言基于表格文件的数据绘制具有多个系列的柱状图与直方图
【9月更文挑战第9天】在R语言中,利用`ggplot2`包可绘制多系列柱状图与直方图。首先读取数据文件`data.csv`,加载`ggplot2`包后,使用`ggplot`函数指定轴与填充颜色,并通过`geom_bar`或`geom_histogram`绘图。参数如`stat`, `position`, `alpha`等可根据需要调整,实现不同系列的图表展示。
490 10
|
数据采集 数据可视化 数据挖掘
R语言在金融数据分析中的深度应用:探索数据背后的市场智慧
【9月更文挑战第1天】R语言在金融数据分析中展现出了强大的功能和广泛的应用前景。通过丰富的数据处理函数、强大的统计分析功能和优秀的可视化效果,R语言能够帮助金融机构深入挖掘数据价值,洞察市场动态。未来,随着金融数据的不断积累和技术的不断进步,R语言在金融数据分析中的应用将更加广泛和深入。
|
数据采集 机器学习/深度学习 数据挖掘
R语言数据清洗:高效处理缺失值与重复数据的策略
【8月更文挑战第29天】处理缺失值和重复数据是数据清洗中的基础而重要的步骤。在R语言中,我们拥有多种工具和方法来有效地应对这些问题。通过识别、删除或插补缺失值,以及删除重复数据,我们可以提高数据集的质量和可靠性,为后续的数据分析和建模工作打下坚实的基础。 需要注意的是,处理缺失值和重复数据时,我们应根据实际情况和数据特性选择合适的方法,并在处理过程中保持谨慎,以避免引入新的偏差或错误。
|
数据可视化
R语言可视化设计原则:打造吸引力十足的数据可视化
【8月更文挑战第30天】R语言可视化设计是一个综合性的过程,需要综合运用多个设计原则来创作出吸引力十足的作品。通过明确目标、选择合适的图表类型、合理运用色彩与视觉层次、明确标注与引导视线以及引入互动性与动态效果等原则的应用,你可以显著提升你的数据可视化作品的吸引力和实用性。希望本文能为你提供一些有益的启示和帮助。
|
数据处理
R语言数据合并:掌握`merge`与`dplyr`中`join`的巧妙技巧
【8月更文挑战第29天】如果你已经在使用`dplyr`进行数据处理,那么推荐使用`dplyr::join`进行数据合并,因为它与`dplyr`的其他函数(如`filter()`、`select()`、`mutate()`等)无缝集成,能够提供更加流畅和一致的数据处理体验。如果你的代码中尚未使用`dplyr`,但想要尝试,那么`dplyr::join`将是一个很好的起点。
|
数据采集 存储 数据可视化
R语言时间序列分析:处理与建模时间序列数据的深度探索
【8月更文挑战第31天】R语言作为一款功能强大的数据分析工具,为处理时间序列数据提供了丰富的函数和包。从数据读取、预处理、建模到可视化,R语言都提供了灵活且强大的解决方案。然而,时间序列数据的处理和分析是一个复杂的过程,需要结合具体的应用场景和需求来选择合适的方法和模型。希望本文能为读者在R语言中进行时间序列分析提供一些有益的参考和启示。