全文链接:https://tecdat.cn/?p=33146
证券及其它风险资产的投资首先需要解决的是两个核心问题:即预期收益与风险。那么如何测定组合投资的风险与收益和如何平衡这两项指标进行资产分配是市场投资者迫切需要解决的问题。正是在这样的背景下,在50年代和60年代初,马科维茨理论应运而生(点击文末“阅读原文”获取完整代码数据)。
该理论依据以下几个假设:
- 投资者在考虑每一次投资选择时,其依据是某一持仓时间内的证券收益的概率分布。
- 投资者是根据证券的期望收益率估测证券组合的风险。
- 投资者的决定仅仅是依据证券的风险和收益。
- 在一定的风险水平上,投资者期望收益最大;相对应的是在一定的收益水平上,投资者希望风险最小。
根据以上假设,马科维茨确立了证券组合预期收益、风险的计算方法和有效边界理论,建立了资产优化配置的均值-方差模型(允许放空):
若不允许放空,则为:
随着计算机技术的发展,利用现代统计学和编程语言进行数据分析和投资组合优化变得越来越普遍和容易。R语言作为一种功能强大的数据分析工具,提供了丰富的包和函数来支持马科维茨均值-方差模型的实施和可视化。
本文旨在帮助客户使用R语言实现马科维茨均值-方差模型,并通过可视化方式展示最优投资组合的预期收益率随时间变化的趋势。
4个类别的股票收益率数据:
类别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
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
用X、Spec和Constraints作为参数,来执行投资组合优化分析,并将结果存储在eo变量中。
jo = getTrgtetrn(eo) fo = gergRsk(eo) qo = geeihts(eo) qo
分别将eo对象的目标收益率、目标风险和资产权重存储在jo、fo和qo变量中。
ex = t(too) * qo ex
计算投资组合预期收益率ex,通过矩阵乘法将too转置后与权重qo相乘。
exr = apply(ex, 2, sum) exr
对ex的每一列求和,得到预期收益率的向量exr。
以上包含了读取数据、投资组合分析的过程。
对第二个类数据集进行分析:
读取名为"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对象,显示投资组合的规格和参数。
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变量中。
选择X的最后30行(即最近30个时间点)作为变量too存储。
ex = t(too) * qo; ex
将too转置后与权重qo相乘,得到投资组合预期收益率ex。
对ex的每一列求和,得到预期收益率的向量exr。
pt = 1:30
创建一个长度为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,进行投资组合分析,并绘制预期收益率随时间变化的折线图。
把两个类别的投资组合预期收益率进行对比
点击标题查阅往期内容
极值理论 EVT、POT超阈值、GARCH 模型分析股票指数VaR、条件CVaR:多元化投资组合预测风险测度分析
01
02
03
04
R语言马科维茨Markowitz均值-方差(风险投资模型)分析最优投资组合数据预期收益率可视化(下):https://developer.aliyun.com/article/1498083