前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言动量和马科维茨Markowitz投资组合(Portfolio)模型实现

R语言动量和马科维茨Markowitz投资组合(Portfolio)模型实现

作者头像
拓端
发布2020-11-30 10:44:12
9110
发布2020-11-30 10:44:12
举报
文章被收录于专栏:拓端tecdat

原文链接:http://tecdat.cn/?p=17931

动量和马科维茨投资组合模型使 均值方差优化 组合成为可行的解决方案。通过建议并测试:

  • 增加最大权重限制
  • 增加目标波动率约束

来控制 均值方差最优化的解。

下面,我将查看8个资产的结果:

首先,让我们加载所有历史数据

代码语言:javascript
复制

#*****************************************************************
# 加载历史数据
#*****************************************************************


load.packages('quantmod')


# 加载保存的原始数据
#
load('raw.Rdata')






getSymbols.extra(N8.tickers, src = 'yahoo', from = '1970-01-01', env = data, raw.data =
for(i in data$symbolnames) data[[i]] = adjustOHLC(data[[i]]

接下来,让我们测试函数

代码语言:javascript
复制


#*****************************************************************
# 运行测试,每月数据
#*****************************************************************


plot(scale.one(data$prices))
代码语言:javascript
复制

prices = data$prices


plotransition(res[[1]]['2013::'])

接下来,让我们创建一个基准并设置用于所有测试。

代码语言:javascript
复制

#*****************************************************************
# 建立基准
#*****************************************************************
models = list()


commission = list(cps = 0.01, fixed = 10.0, percentage = 0.0)


data$weight[] = NA


model = brun(data, clean.signal=T,

接下来,让我们获取权重,并使用它们来进行回测

代码语言:javascript
复制


#*****************************************************************
#  转换为模型结果
#*****************************************************************
CLA = list(weight = res[[1]], ret = res[[2]], equity = cumprod(1 + res[[2]]), type = "weight")


obj = list(weights = list(CLA = res[[1]]), period.ends

我们可以复制相同的结果

代码语言:javascript
复制


#*****************************************************************
#进行复制
#*****************************************************************
weight.limit = data.frame(last(pric
obj = portfoli(data$prices,
periodicity = 'months', lookback.len = 12, silent=T,
const.ub = weight.limit,urns,1) + colSums(last(hist.returns,3)) +
colSums(last(hist.returns,6)) + colSums(last(hist.returns,12))) / 22
ia
},
min.risk.fns = list(
)

另一个想法是使用Pierre Chretien的平均输入假设

代码语言:javascript
复制


#*****************************************************************
# 让我们使用Pierre的平均输入假设
#*****************************************************************
obj = portfolio(data$prices,
periodicity = 'months', lookback.len = 12, si
create.ia.fn =   create.(c(1,3,6,12), 0),
min.risk.fns = list(
TRISK.AVG = target.risk.portfolio(target.r
)

最后,我们准备看一下结果

代码语言:javascript
复制


#*****************************************************************
#进行回测
#*****************************************************************


plotb(models, plotX = T, log = 'y', Left
代码语言:javascript
复制

layout(1)
barplot(sapply(models, turnover, data)

使用平均输入假设会产生更好的结果。

我想应该注意的主要观点是:避免盲目使用优化。相反,您应该使解决方案更具有稳健性。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拓端数据部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原文链接:http://tecdat.cn/?p=17931
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档