1、:p_load(fImport, PerformanceAnalytics, stringb, tidyverse)# 将股票数据加载到一个时间序列对象的函数importSeries = function(symbol,from,to) # 从雅虎读取金融数据 input = yahooSeries(symbol,from = from, to = to)# 列名调整 adjClose = symbol %.% .Adj.Close inputReturn = symbol %.% .Return CReturn = symbol %.% .CReturn# 计算收益率并生成时间序列 inpu
2、t.Return = returns(input,adjClose) colnames(input.Return)1 = inputReturn input = merge(input,input.Return)# 计算累积收益率并生成时间序列 input.first = input,adjClose1 input.CReturn = fapply(input,adjClose, FUN = function(x) log(x) - log(input.first) colnames(input.CReturn)1 = CReturn input = merge(input,input.CRe
3、turn)# 删掉一些无用数据来释放内存 rm(input.first, input.Return, input.CReturn, adjClose, inputReturn, CReturn)# 返回时间序列 return(input)计算年化收益、标准差和夏普比率。# 获取短期、中期和长期政府债券的收益率序列from = 2001-01-01to = 2011-12-16tlt = importSeries(tlt,from,to)shy = importSeries(shyief = importSeries(iefmerged = merge(tlt,shy) % merge(ief)
4、vars = c(tlt.Return, shy.Returnief.Return)# 计算年化收益率 (t = table.AnnualizedReturns(merged,vars, Rf = mean(merged, na.rm=TRUE)# tlt.Return shy.Return ief.Return# Annualized Return 0.0810 0.0303 0.0684# Annualized Std Dev 0.1403 0.0173 0.0740# Annualized Sharpe (Rf=3%) 0.3496 -0.0086 0.4974结果如下:标的tlt.Re
5、turnshy.Returnief.Return年化收益率0.07720.14040.3378年化波动率0.02830.0173-0.0086年化夏普率 (Rf=2.81%)0.06450.07400.4729杠铃策略如果你经常看娱乐投资电视台,你应该听到过 “杠铃策略” 这个术语。这是指一个极端的投资组合配置方案。所有的权重都是极端情况,极端大或者极端小,类似一个杠铃的形状。针对政府债券的投资组合而言,这将意味着购买的债券要么是长期债券或短期债券而不是持有中期债券。那么什么样的风险收益情况下适合采用这个策略?首先, 将风险定义为投资组合的方差。虽然有各种各样的理由不使用方差来界定风险,但它是
6、从最古老的 50 年代开始这种类型的分析都是全新的,定义收益为预期收益。在上面的表中,年收益率表示持有资产的预期收益为 1 年,标准差的平方及方差表示风险。假设投资组合只包括持有长期和短期债券,便于需要计算投资组合的预期收益和风险。收益的计算是很容易的, 这是两种持仓的加权平均收益,权重就是每个资产的投入资本百分比。Rp=WTLTRTLT+WSHYRSHYRp=WTLTRTLT+WSHYRSHYs.t.WTLT+WSHY=1s.t.WTLT+WSHY=1显然这两种资产具有相关性 (在马科维茨于 1952 年的博士论文发表之前, 投资经理不了解相关性并且默认假设为 1 - 马科维茨因此获得了诺贝
7、尔奖)。假设收益是正态分布的,那么投资组合方差将是:Vp=W2TLT2TLT+W2SHY2SHY+WTLTWSHYTLTSHYCorr(TLT,SHY)Vp=WTLT2TLT2+WSHY2SHY2+WTLTWSHYTLTSHYCorr(TLT,SHY)风控模型基于上述知识改变持仓权重并为杠铃策略建立风险收益模型。# 检查相关性corr = cor(merged,vars,use = complete.obsc = corr,# 假设一个杠铃策略是持有长期和短期资产# 定义风险、收益ws = NULLwt = NULLmu = NULLsigma = NULL# 50个观察 n=50# 遍历杠铃
8、策略的权重rTLT = tAnnualized ReturnrSHY = tsTLT = tAnnualized Std DevsSHY = tfor (i in 0:n)wsi = i/n; wti = 1-wsi; mui = wsi * rSHY + wti * rTLT sigmai = wsi*wsi*sSHY*sSHY + wti*wti*sTLT*sTLT + wsi*wti*sSHY*sTLT*c ws = c(ws,wsi) wt = c(wt,wti) mu = c(mu,mui) sigma = c(sigma,sigmai) #风险收益的数据集rrProfile = d
9、ata.frame(ws=ws,wt=wt,mu=mu,sigma=sigma)注意, 上面的方程是二次的,可以配合刚刚创建的点画出抛物线。注意,通常收益数据会放在 X 轴上,而把拟合方差 (风险) 数据作为因变量放在 Y 轴。# 为模型拟合一个二次函数fit = lm(rrProfile$sigma rrProfile$mu + I(rrProfile$mu2)接下来,在图上添加拟合线。# 得到回归系数coe = fit$coefficients# 得到每个回归预测的风险值muf = NULLsfit = NULLfor (i in seq(0,.08,by=.001) muf = c(mu
10、f,i) s = coe1 + coe2*i + coe3*i2 sfit = c(sfit,s)# 绘图plot(rrProfile$sigma, rrProfile$mu, xlim=c(0,.022), ylim=c(0,.08), ylab=Expected Yearly Return xlab=Expected Yearly Variance main=Efficient Frontier for Government Bond Portfolios# 画出预测边值lines(sfit,muf,col=redtseries 包中的 portfolio.optim 比较而言更好用。只需
11、要输入预期收益率, 该函数会直接返回出来最优组合权重。在最低预期收益率 (比如 100% 持有 SHY) 到最高预期收益率 (比如 100持有 TLT) 之间修改输入的收益。注意,portfolio.optim 会使用日收益率做计算,因此代码将不得不做一些处理并假设一年有 255 个交易日。# 添加第三个标的#除非想做一个格点搜索,否则就需要对每个级别的收益减少风险来优化投资组合。# portfolio.optim 在时间序列中不能有 NA 值。m2 = removeNA(merged,vars)wSHY = NULLwIEF = NULLwTLT = NULLer = NULLeStd =
12、NULL# 在收益水平之间不断循环搜索找到最优的投资组合,包括最小值(rSHY)和最大值(rTLT)# portfolio.optim 使用日收益数据,因此不得不做出相应的调整for (i in seq(rSHY+.001),(rTLT-.001),length.out=100) pm = 1+i pm = log(pm)/255 opt = tseries:portfolio.optim(m2,pm=pm) er = c(er,exp(pm*255)-1) eStd = c(eStd,opt$ps*sqrt(255) wTLT = c(wTLT,opt$pw1) wSHY = c(wSHY,opt$pw2) wIEF = c(wIEF,opt$pw3)Efficient Frontier
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1