译 量化投资教程投资组合优化与 R 实践上Word格式文档下载.docx
- 文档编号:14979107
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:9
- 大小:71.06KB
译 量化投资教程投资组合优化与 R 实践上Word格式文档下载.docx
《译 量化投资教程投资组合优化与 R 实践上Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《译 量化投资教程投资组合优化与 R 实践上Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
:
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 量化投资教程投资组合优化与 实践上 量化 投资 教程 组合 优化 实践