译 量化投资教程投资组合优化与 R 实践上Word格式文档下载.docx

上传人:b****2 文档编号:14979107 上传时间:2022-10-26 格式:DOCX 页数:9 大小:71.06KB
下载 相关 举报
译 量化投资教程投资组合优化与 R 实践上Word格式文档下载.docx_第1页
第1页 / 共9页
译 量化投资教程投资组合优化与 R 实践上Word格式文档下载.docx_第2页
第2页 / 共9页
译 量化投资教程投资组合优化与 R 实践上Word格式文档下载.docx_第3页
第3页 / 共9页
译 量化投资教程投资组合优化与 R 实践上Word格式文档下载.docx_第4页
第4页 / 共9页
译 量化投资教程投资组合优化与 R 实践上Word格式文档下载.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

译 量化投资教程投资组合优化与 R 实践上Word格式文档下载.docx

《译 量化投资教程投资组合优化与 R 实践上Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《译 量化投资教程投资组合优化与 R 实践上Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。

译 量化投资教程投资组合优化与 R 实践上Word格式文档下载.docx

:

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"

#计算收益率并生成时间序列

input.Return=returns(input[,adjClose])

colnames(input.Return)[1]=inputReturn

input=merge(input,input.Return)

#计算累积收益率并生成时间序列

input.first=input[,adjClose][1]

input.CReturn=fapply(input[,adjClose],

FUN=function(x)log(x)-log(input.first))

colnames(input.CReturn)[1]=CReturn

input=merge(input,input.CReturn)

#删掉一些无用数据来释放内存

rm(input.first,

input.Return,

input.CReturn,

adjClose,

inputReturn,

CReturn)

#返回时间序列

return(input)

}

计算年化收益、标准差和夏普比率。

#获取短期、中期和长期政府债券的收益率序列

from="

2001-01-01"

to="

2011-12-16"

tlt=importSeries("

tlt"

from,to)

shy=importSeries("

shy"

ief=importSeries("

ief"

merged=merge(tlt,shy)%>

%merge(ief)

vars=c("

tlt.Return"

"

shy.Return"

ief.Return"

#计算年化收益率(t=table.AnnualizedReturns(merged[,vars],Rf=mean(merged[,"

],na.rm=TRUE)))

##tlt.Returnshy.Returnief.Return

##AnnualizedReturn0.08100.03030.0684

##AnnualizedStdDev0.14030.01730.0740

##AnnualizedSharpe(Rf=3%)0.3496-0.00860.4974

结果如下:

标的

tlt.Return

shy.Return

ief.Return

年化收益率

0.0772

0.1404

0.3378

年化波动率

0.0283

0.0173

-0.0086

年化夏普率(Rf=2.81%)

0.0645

0.0740

0.4729

杠铃策略

如果你经常看娱乐投资电视台,你应该听到过“杠铃策略”这个术语。

这是指一个极端的投资组合配置方案。

所有的权重都是极端情况,极端大或者极端小,类似一个杠铃的形状。

针对政府债券的投资组合而言,这将意味着购买的债券要么是长期债券或短期债券而不是持有中期债券。

那么什么样的风险收益情况下适合采用这个策略?

首先,将风险定义为投资组合的方差。

虽然有各种各样的理由不使用方差来界定风险,但它是从最古老的50年代开始这种类型的分析都是全新的,定义收益为预期收益。

在上面的表中,年收益率表示持有资产的预期收益为1年,标准差的平方及方差表示风险。

假设投资组合只包括持有长期和短期债券,便于需要计算投资组合的预期收益和风险。

收益的计算是很容易的,这是两种持仓的加权平均收益,权重就是每个资产的投入资本百分比。

Rp=WTLT∗RTLT+WSHY∗RSHYRp=WTLT∗RTLT+WSHY∗RSHY

s.t.WTLT+WSHY=1s.t.WTLT+WSHY=1

显然这两种资产具有相关性(在马科维茨于1952年的博士论文发表之前,投资经理不了解相关性并且默认假设为1-马科维茨因此获得了诺贝尔奖)。

假设收益是正态分布的,那么投资组合方差将是:

Vp=W2TLT∗σ2TLT+W2SHY∗σ2SHY+WTLT∗WSHY∗σTLT∗σSHY∗Corr(TLT,SHY)Vp=WTLT2∗σTLT2+WSHY2∗σSHY2+WTLT∗WSHY∗σTLT∗σSHY∗Corr(TLT,SHY)

风控模型

基于上述知识改变持仓权重并为杠铃策略建立风险收益模型。

#检查相关性

corr=cor(merged[,vars],use="

complete.obs"

c=corr["

"

]

#假设一个杠铃策略是持有长期和短期资产

#定义风险、收益

ws=NULL

wt=NULL

mu=NULL

sigma=NULL

#50个观察n=50

#遍历杠铃策略的权重

rTLT=t["

AnnualizedReturn"

rSHY=t["

sTLT=t["

AnnualizedStdDev"

sSHY=t["

for(iin0:

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=data.frame(ws=ws,wt=wt,mu=mu,sigma=sigma)

注意,上面的方程是二次的,可以配合刚刚创建的点画出抛物线。

注意,通常收益数据会放在X轴上,而把拟合方差(风险)数据作为因变量放在Y轴。

#为模型拟合一个二次函数

fit=lm(rrProfile$sigma~rrProfile$mu+I(rrProfile$mu^2))

接下来,在图上添加拟合线。

#得到回归系数

coe=fit$coefficients

#得到每个回归预测的风险值

muf=NULL

sfit=NULL

for(iinseq(0,.08,by=.001)){

muf=c(muf,i)

s=coe[1]+coe[2]*i+coe[3]*i^2

sfit=c(sfit,s)

#绘图

plot(rrProfile$sigma,

rrProfile$mu,

xlim=c(0,.022),

ylim=c(0,.08),

ylab="

ExpectedYearlyReturn"

xlab="

ExpectedYearlyVariance"

main="

EfficientFrontierforGovernmentBondPortfolios"

#画出预测边值

lines(sfit,muf,col="

red"

tseries包中的portfolio.optim比较而言更好用。

只需要输入预期收益率,该函数会直接返回出来最优组合权重。

在最低预期收益率(比如100%持有SHY)到最高预期收益率(比如100%持有TLT)之间修改输入的收益。

注意,portfolio.optim会使用日收益率做计算,因此代码将不得不做一些处理并假设一年有255个交易日。

#添加第三个标的

#除非想做一个格点搜索,否则就需要对每个级别的收益减少风险来优化投资组合。

#portfolio.optim在时间序列中不能有NA值。

m2=removeNA(merged[,vars])

wSHY=NULL

wIEF=NULL

wTLT=NULL

er=NULL

eStd=NULL

#在收益水平之间不断循环搜索找到最优的投资组合,包括最小值(rSHY)和最大值(rTLT)

#portfolio.optim使用日收益数据,因此不得不做出相应的调整

for(iinseq((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$pw[1])

wSHY=c(wSHY,opt$pw[2])

wIEF=c(wIEF,opt$pw[3])

EfficientFrontier

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1