本文是课程《数据科学与金融计算》第8章的学习笔记,主要介绍均值-方差模型、均值-VaR模型、均值-CVaR模型,用于知识点总结和代码练习,Q&A为问题及解决方案。

往期回顾:

博文 内容
【R】【课程笔记】01 R软件基础知识 数据类型、数据结构、运算、绘图等
【R】【课程笔记】02+03 基于R软件的计算 聚类分析、因子分析、神经网络、支持向量机等
【R】【课程笔记】04+05 数据预处理+收益率计算 金融数据处理、收益率、R与C++等
【R】【课程笔记】06 金融波动模型 GARCH、SV、高频波动模型等
【R】【课程笔记】07 分位数回归与VaR(ES)计算 VaR、ES、极值模型等
【R】【课程笔记】08 金融投资组合决策分析 均值-方差模型、均值-VaR模型、均值-CVaR模型等

目录

  • 8.1 均值-方差分析
  • 8.2 均值-CVaR 模型
    • 一、均值-VaR模型
    • 二、均值-CVaR模型
    • 三、均值-CDaR模型
    • 四、均值-高阶矩模型

8.1 均值-方差分析


证明题:求w(见笔记,图片有误)

options(digits=4, width=70)library(fPortfolio)
library(timeSeries)# 1. 投资线
# (1) 设置参数
mu.1 <- 0.10
mu.2 <- 0.05
sig.1 <- 0.08
sig.2 <- 0.04rhos <- seq(-1, 1, by = 0.5)
weights <- seq(0, 1, length = 100)# (2) 建立投资组合
twoAssetsPortfolio <- function(mu, sigma, weight, rho) {# (1) 计算组合的期望收益和方差mu.p <- weight * mu[1] + (1 - weight) * mu[2]sig2.p <- weight ^ 2 * sigma[1] ^ 2 + 2 * weight * (1 - weight) * rho * sigma[1] *sigma[2] + (1 - weight) ^ 2 * sigma[2] ^ 2sig.p <- sqrt(sig2.p)# (2) 输出ans <- cbind(weight, mu.p, sig.p)colnames(ans) <- c('weights', 'return', 'Std.')return(ans)
}# (3) 画图
portfolio.results_1 <- matrix(NA, nrow = length(weights), ncol = 3)
colnames(portfolio.results_1) <- c('weights', 'return', 'Std.')
portfolio.results_5 <-portfolio.results_4 <-portfolio.results_3 <-portfolio.results_2 <- portfolio.results_1
for (i in seq_along(weights)){weight <- weights[i]portfolio.results_1[i,] <- twoAssetsPortfolio(mu=c(mu.1, mu.2), sigma=c(sig.1, sig.2), weight=weight, rho=1)portfolio.results_2[i,] <- twoAssetsPortfolio(mu=c(mu.1, mu.2), sigma=c(sig.1, sig.2), weight=weight, rho=0.5)portfolio.results_3[i,] <- twoAssetsPortfolio(mu=c(mu.1, mu.2), sigma=c(sig.1, sig.2), weight=weight, rho=0)portfolio.results_4[i,] <- twoAssetsPortfolio(mu=c(mu.1, mu.2), sigma=c(sig.1, sig.2), weight=weight, rho=-0.5)portfolio.results_5[i,] <- twoAssetsPortfolio(mu=c(mu.1, mu.2), sigma=c(sig.1, sig.2), weight=weight, rho=-1)
}par(mfrow=c(1,1))
plot(portfolio.results_1[,'Std.'], portfolio.results_1[,'return'], xlim=c(0, max(sig.1, sig.2)),ylim=c(0.04, max(mu.1, mu.2)), type='l', xlab=expression(sigma[p]), ylab=expression(mu[p]))
lines(portfolio.results_2[,'Std.'], portfolio.results_2[,'return'], lty=2)
lines(portfolio.results_3[,'Std.'], portfolio.results_3[,'return'], lty=3)
lines(portfolio.results_4[,'Std.'], portfolio.results_4[,'return'], lty=4)
lines(portfolio.results_5[,'Std.'], portfolio.results_5[,'return'], lty=5)
points(sig.1, mu.1, pch=20, cex=2, col='red')
points(sig.2, mu.2, pch=20, cex=2, col='red')
legend('bottomleft', legend=c(expression(rho==1), expression(rho==0.5), expression(rho==0),expression(rho==-0.5), expression(rho==-1)), lty=1:5)
title(main='组合投资线')
text(sig.1-0.015, mu.1, '证券1')
text(sig.2+0.01, mu.2, '证券2')# 例:8.2# 2. 均值-方差模型:feasible portfolio
# S&P 500 index (vfinx), European stock index (veurx), Emerging markets fund (veiex)
# Long term bond index (vbltx), Short term bond index (vbisx), Pacific stock index (vpacx)# (1) 画图
my.panel <- function(...) {lines(...)abline(h=0)
}
plot.zoo(projectPrices,xlab="指数" ,main="组合价格")
plot.zoo(projectReturns, panel=my.panel)
par(mfrow=c(2,2))
ret.mat = coredata(projectReturns)
hist(ret.mat[,"vfinx"],main="日收益", xlab="vfinx",ylab="密度", probability=T)
boxplot(ret.mat[,"vfinx"],outchar=T, main='箱线图')
plot(density(ret.mat[,"vfinx"]), main="平滑密度", type="l",xlab="日收益",ylab="密度")
qqnorm(ret.mat[,"vfinx"],main="正态QQ",xlab="理论分位数",ylab="样本分位数")
qqline(ret.mat[,"vfinx"])
par(mfrow=c(1,1))# (2) 计算相关系数
pairs(ret.mat, col="blue")# (3) 特定组合
rts <- as.timeSeries(projectReturns)         ewSpec <- portfolioSpec()
nAssets <- ncol(rts)
setWeights(ewSpec) <- rep(1/nAssets, times=nAssets)# (4) 可行组合
ewPortfolio <- feasiblePortfolio(data=rts, spec=ewSpec, constraints='LongOnly')
print(ewPortfolio)# (5) 展示结果
col <- divPalette(ncol(rts), 'RdBu')
weightsPie(ewPortfolio, radius=0.7, col=col)
weightedReturnsPie(ewPortfolio, radius=0.7, col=col)
mtext(text='等权MV投资组合', side=3, line=1.5, font=2, cex=0.7, adj=0)
covRiskBudgetsPie(ewPortfolio, radius=0.7, col=col)
mtext(text='等权MV投资组合', side=3, line=1.5, font=2, cex=0.7, adj=0)# 例:8.3# 3. 均值-方差模型: minimum risk efficient portfolio
# (1) 设置目标收益
minriskSpec <- portfolioSpec()
targetReturn <- getTargetReturn(ewPortfolio@portfolio)['mean']
setTargetReturn(minriskSpec) <- targetReturn     # add the target return to specification# (2) 优化组合
minriskPortfolio <- efficientPortfolio(data=rts, spec=minriskSpec, constraints='LongOnly')
print(minriskPortfolio)# (3) 展示结果
col <- qualiPalette(ncol(rts), 'Dark2')
weightsPie(minriskPortfolio, radius=0.7, col=col)
weightedReturnsPie(minriskPortfolio, radius=0.7, col=col)
mtext(text='minimal risk MV portoflio', side=3, line=1.5, font=2, cex=0.7, adj=0)
covRiskBudgetsPie(minriskPortfolio, radius=0.7, col=col)
mtext(text='minimal risk MV portoflio', side=3, line=1.5, font=2, cex=0.7, adj=0)#例:8.4# 4. 均值-方差模型: global minimum variance portfolio
# (1) 求组合
globminSpec <- portfolioSpec()
globminPortfolio <- minvariancePortfolio(data=rts, spec=globminSpec, constraints='LongOnly')
print(globminPortfolio)# (2) 结果
col <- seqPalette(ncol(rts), 'YlGn')
weightsPie(globminPortfolio, radius=0.7, col=col)
weightedReturnsPie(globminPortfolio, radius=0.7, col=col)
mtext(text='global minimum variance MV portoflio', side=3, line=1.5, font=2, cex=0.7, adj=0)
covRiskBudgetsPie(globminPortfolio, radius=0.7, col=col)
mtext(text='global minimum variance MV portoflio', side=3, line=1.5, font=2, cex=0.7, adj=0)# 例:8.5# 5. 均值-方差模型: tangency portfolio
# (1) 求组合
tgSpec <- portfolioSpec()
setRiskFreeRate(tgSpec) <- 0.02
tgPortfolio <- tangencyPortfolio(data=rts, spec=tgSpec, constraints='LongOnly')
print(tgPortfolio)# (2) 结果
col <- seqPalette(ncol(rts), 'BuPu')
weightsPie(tgPortfolio, radius=0.7, col=col)
mtext(text='Tangency MV portoflio', side=3, line=1.5, font=2, cex=0.7, adj=0)
weightedReturnsPie(tgPortfolio, radius=0.7, col=col)
mtext(text='minimal risk MV portoflio', side=3, line=1.5, font=2, cex=0.7, adj=0)
covRiskBudgetsPie(tgPortfolio, radius=0.7, col=col)
mtext(text='Tangency MV portoflio', side=3, line=1.5, font=2, cex=0.7, adj=0)col <- rampPalette(ncol(rts), 'purple2green')
weights <- 100*as.vector(getWeights(tgPortfolio))
names <- c( "vfinx","veurx","veiex","vbltx","vbisx","vpacx")
windows()
barplot(height=weights, names.arg=names, horiz=TRUE, las=1, col=col)
title(xlab='权重百分比')# 例:8.6
# 6. 边界
# (1) 计算有效前沿
rtsSpec <- portfolioSpec()
setNFrontierPoints(rtsSpec) <- 5
longFrontier <- portfolioFrontier(rts, rtsSpec)# (2) 绘图
print(longFrontier)
class(longFrontier)
plot(longFrontier)# (3) 交互式
setNFrontierPoints(rtsSpec) <- 25
longFrontier <- portfolioFrontier(rts, rtsSpec)
tailoredFrontierPlot(object=longFrontier, mText='MV portfolio-LongOnly constraints', risk='Cov')# (4) 简易版
weightsPlot(longFrontier, mtext=FALSE)
text <- 'mean-variance portfolio: LongOnly constraints'
mtext(text, side=3, line=3, font=2, cex=0.9)
weightedReturnsPlot(longFrontier, mtext=FALSE)
covRiskBudgetsPlot(longFrontier, mtext=FALSE)

8.2 均值-CVaR 模型

一、均值-VaR模型

1、损失的累积分布函数

其中,p®为收益的概率密度函数,对于置信水平100(1-a)%,w组合投资的VaR可以定义为:

二、均值-CVaR模型

CVaR:损失超过VaR的条件期望。

  • 证明题:见笔记
# 例:8.7
library(fPortfolio)
load('rtsSixIndices.RData')       # 上节结果            # 1. 均值-CVaR 组合
# (1) 可行组合
feasSpec <- portfolioSpec()
setType(feasSpec) <- 'CVaR'
nAssets <- ncol(rts)
setWeights(feasSpec) <- rep(1/nAssets, times=nAssets)
setSolver(feasSpec) <- 'solveRglpk.CVAR'
feasPortfolio <- feasiblePortfolio(data=rts, spec=feasSpec, constraints='LongOnly')
print(feasPortfolio)weightsPie(feasPortfolio, radius=0.7)
text <- 'feasible mean-CVaR portfolio'
mtext(text, side=3, line=1.5, font=2, cex=0.7, adj=0)
weightedReturnsPie(feasPortfolio, radius=0.8, legend=FALSE)
covRiskBudgetsPie(feasPortfolio, radius=0.9, legend=FALSE)# (2) 给定收益最小方差组合
minriskSpec <- portfolioSpec()
setType(minriskSpec) <- 'CVaR'
setAlpha(minriskSpec) <- 0.05
setSolver(minriskSpec) <- 'solveRglpk.CVAR'
setTargetReturn(minriskSpec) <- getTargetReturn(feasPortfolio@portfolio)['mean']
minriskPortfolio <- efficientPortfolio(data=rts, spec=minriskSpec, constraints='LongOnly')
print(minriskPortfolio)weightsPie(minriskPortfolio, radius=0.7)
text <- 'lowest risk mean-CVaR portfolio'
mtext(text, side=3, line=1.5, font=2, cex=0.7, adj=0)
weightedReturnsPie(minriskPortfolio, radius=0.8)
covRiskBudgetsPie(minriskPortfolio, radius=0.9)# (3) 全局最小方差组合
globminSpec <- portfolioSpec()
setType(globminSpec) <- 'CVaR'
setAlpha(globminSpec) <- 0.05
setSolver(globminSpec) <- 'solveRglpk.CVAR'
#setTargetReturn(globminSpec) <- getTargetReturn(feasPortfolio@portfolio)['mean']
globminPortfolio <- minriskPortfolio(data=rts, spec=globminSpec, constraints='LongOnly')
print(globminPortfolio)weightsPie(globminPortfolio, radius=0.7)
text <- 'global minmum risk portfolio'
mtext(text, side=3, line=1.5, font=2, cex=0.7, adj=0)
weightedReturnsPie(globminPortfolio, radius=0.8)
covRiskBudgetsPie(globminPortfolio, radius=0.9)# 2. 均值-CVaR 组合前沿
# (1) 计算长期组合前沿
longSpec <- portfolioSpec()
setType(longSpec) <- 'CVaR'
setAlpha(longSpec) <- 0.05
setNFrontierPoints(longSpec) <- 5
setSolver(longSpec) <- 'solveRglpk.CVAR'
longFrontier <- portfolioFrontier(data=rts, spec=longSpec, constraints='LongOnly')
print(longFrontier)setNFrontierPoints(longSpec) <- 25
longFrontier <- portfolioFrontier(data=rts, spec=longSpec, constraints='LongOnly')
text <- 'mean-CVaR portfolio long only constraints'
tailoredFrontierPlot(object=longFrontier, mText=text, risk='CVaR')weightsPlot(longFrontier, mtext=FALSE)
mtext(text, side=3, line=3, font=2, cex=0.9)
weightedReturnsPlot(longFrontier, mtext=FALSE)
covRiskBudgetsPlot(longFrontier, mtext=FALSE)

三、均值-CDaR模型

DD风险测度度量从历史峰值的一个下降。

# 例:8.8
library(PerformanceAnalytics)
library(fPortfolio)
library(fPortfolioBacktest)                                             # 2. 计算风险
# (1) 计算 VaR
confidence <- 0.95
VaR.hist <- VaR(rts, p=confidence, method="historical")    # 基于历史模拟
VaR.gaus <- VaR(rts, p=confidence, method="gaussian")      # 基于高斯近似
VaR.modi <- VaR(rts, p=confidence, method="modified")      # using modified Cornish Fisher calc to take non-normal distribution into account# (2) 计算 CVaR or ES
CVaR.hist <- CVaR(rts, p=confidence, method="historical")
CVaR.gaus <- CVaR(rts, p=confidence, method="gaussian")
CVaR.modi <- CVaR(rts, p=confidence, method="modified")      # using modified Cornish Fisher calc to take non-normal distribution into account# (3) 计算 CDD or CDaR (some other packages:fPortfolioBacktest, fBasics, timeSeries, tseries)
DD <- findDrawdowns(rts)                                         # 计算 DD
chart.Drawdown(rts, legend.loc='topright', main='DD图')          # 画图 DD
MDD <- maxDrawdown(rts)
CDD <- CDD(rts, p=confidence)# (4) 结果
risk <- round(rbind(VaR.hist, VaR.gaus, VaR.modi, CVaR.hist, CVaR.gaus, CVaR.modi, MDD, CDD), digits=4)
rownames(risk) <- c('VaR.hist', 'VaR.gaus', 'VaR.modi', 'CVaR.hist', 'CVaR.gaus', 'CVaR.modi', 'MDD', 'CDD')
print(risk)# 3. 滚动分析
# (1) backtest a portfolio
rtsSpec <- portfolioSpec()
setSolver(rtsSpec)  <- "solveRglpk.CVAR"
setAlpha(rtsSpec) <- 0.05
rtsConstraints <- 'LongOnly'
rtsBacktest <- portfolioBacktest()
setWindowsHorizon(rtsBacktest) <- '18m'
setSmootherLambda(rtsBacktest) <- '6m'
names.assets <- colnames(rts)
rtsFormula <- as.formula(paste(paste(names.assets[1],'~'), paste(names.assets[2:length(names.assets)], collapse='+')))
rtsPortfolios <- portfolioBacktesting(formula=rtsFormula, data=timeSeries(rts), spec=rtsSpec,constraints=rtsConstraints,backtest=rtsBacktest, trace=FALSE)
names(rtsPortfolios)
Weights <- round(100*rtsPortfolios$weights,2)
barplot(t(Weights), col=seqPalette(length(names.assets), 'Blues'), legend.text=names.assets[2:length(names.assets)])# (2) smooth the weights from a backtest
backtest <- portfolioBacktest()
setSmootherInitialWeights(backtest) <- rep(1/(length(names.assets)-1), times=length(names.assets)-1)
setSmootherLambda(backtest) <- '12m'
rtsSmooth <- portfolioSmoothing(object=rtsPortfolios, backtest=rtsBacktest)
smoothWeights <- round(100*rtsSmooth$smoothWeights,2)[1:12,]
barplot(t(smoothWeights), col=seqPalette(length(names.assets), 'Blues'), legend.text=names.assets[2:length(names.assets)])# (3) plot and print backtesting results
backtestPlot(rtsSmooth)
netPerformance(rtsSmooth)
backtestStats(rtsSmooth)# (4) write your own statistics functions (such as: DaR, CDaR, Shapiro-Wilk test)rollingCDaR <- function (object)
{.cdar = function(x) {alpha = getAlpha(x)R = as.numeric(getSeries(x) %*% getWeights(x))dd = 100 * drawdowns(as.timeSeries(R)/100)z = quantile(dd, probs = alpha)mean(dd[dd <= z])}portfolios <- object$strategyListans = sapply(portfolios, FUN = .cdar)dates = sapply(portfolios, function(x) rev(rownames(getSeries(x)))[1])alpha = getAlpha(portfolios[[1]])timeSeries(ans, charvec = dates, units = paste("CDaR", alpha, sep = "."))
}
rollingVaR <- function (object)
{.var = function(x) {alpha = getAlpha(x)R = getSeries(x) %*% getWeights(x)quantile(R, probs = alpha)}portfolios <- object$strategyListans = sapply(portfolios, FUN = .var)dates <- sapply(portfolios, function(x) rev(rownames(getSeries(x)))[1])alpha = getAlpha(portfolios[[1]])timeSeries(ans, charvec = dates, units = paste("VaR", alpha, sep = "."))
}
rollingCVaR <- function (object)
{.cvar = function(x) {alpha = getAlpha(x)R = getSeries(x) %*% getWeights(x)z = quantile(R, probs = alpha)mean(as.numeric(R)[R <= z], na.rm = TRUE)}portfolios <- object$strategyListans = sapply(portfolios, FUN = .cvar)dates = sapply(portfolios, function(x) rev(rownames(getSeries(x)))[1])alpha = getAlpha(portfolios[[1]])timeSeries(ans, charvec = dates, units = paste("CVaR", alpha, sep = "."))
}CDaRstats <- backtestStats(rtsSmooth, FUN='rollingCDaR')
head(CDaRstats)
par(mfrow=c(2,2))
plot(backtestStats(rtsSmooth, FUN='rollingSigma'), main='sigma')
plot(backtestStats(rtsSmooth, FUN='rollingVaR'), main='VaR')
plot(backtestStats(rtsSmooth, FUN='rollingCVaR'), main='CVaR')
plot(backtestStats(rtsSmooth, FUN='rollingCDaR'), main='CDaR')

四、均值-高阶矩模型

偏度、峰度:

【R】【课程笔记】08 金融投资组合决策分析相关推荐

  1. 【Python】【课程笔记】金融数据分析(一)

    本文是课程<金融数据分析>的学习笔记(一),该系列笔记分为基础篇.Numpy.Pandas和Matplotlib等,本系列用于对知识点总结和代码练习,Q&A为问题及解决方案,参考书 ...

  2. 【R】【课程笔记】04+05 数据预处理+收益率计算

    本文是课程<数据科学与金融计算>第4-5章的学习笔记,主要介绍金融数据处理.收益率计算和R与C++调用,用于知识点总结和代码练习,Q&A为问题及解决方案. 往期回顾: 博文 内容 ...

  3. 【R】【课程笔记】07 分位数回归与VaR(ES)计算

    本文是课程<数据科学与金融计算>第7章的学习笔记,主要介绍计算VaR/ES风险测度的各种方法和极值理论等,用于知识点总结和代码练习,Q&A为问题及解决方案. 往期回顾: 博文 内容 ...

  4. 【R】【课程笔记】02+03 基于R软件的计算

    本文是课程<数据科学与金融计算>第2-3章的学习笔记,主要介绍R语言在统计和机器学习中的应用,用于知识点总结和代码练习,Q&A为问题及解决方案,参考书籍为<R软件及其在金融定 ...

  5. 【模型】【课程笔记】01+02+03 金融风险管理导论

    本文为课程<金融风险管理>第1-3章学习笔记,用于知识点总结和复习,对应教材<Quantitative Risk Management(2015)>,标号为原版书公式以便查阅. ...

  6. python 慕课课程笔记(一)

    python 慕课课程笔记 1.python 是动态语言,而 java 是静态语言.动态语言变量本身的类型时不固定的,而静态语言在变量定义时就必须指定变量的类别. 2. 在python 代码中书写 a ...

  7. Coursera吴恩达《序列模型》课程笔记(1)-- 循环神经网络(RNN)

    红色石头的个人网站:redstonewill.com <Recurrent Neural Networks>是Andrw Ng深度学习专项课程中的第五门课,也是最后一门课.这门课主要介绍循 ...

  8. MyBatis-学习笔记08【08.动态SQL】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  9. 哈佛大学单细胞课程|笔记汇总 (六)

    生物信息学习的正确姿势 NGS系列文章包括NGS基础.在线绘图.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流程).单细胞 ...

最新文章

  1. 信息系统项目管理师论文范文-风险管理
  2. 二分法分页 mysql_LeetCode 04寻找两个正序数组的中位数(困难)二分法
  3. java 面试心得总结-BAT、网易
  4. ulead gif animator_搞笑GIF趣图:这风看来很大啊,今天回不来家了7
  5. 同事:别加班了,今天可是你们1024程序员节啊!
  6. html表格接收json数据,Bootstrap-table如何显示后台传过来的JSON数据?
  7. 登录或连接MYSLQ 提示 error 1045 access denied for user 'root@127.0.0.1' 错误
  8. Ubuntu18系统安装使用Nginx
  9. 【主成分分析法】NLPer的断舍离(下篇)
  10. GIS案例练习-----------第六天
  11. MyBatis代码自动生成
  12. 【模糊神经网络】基于matlab的模糊神经网络仿真
  13. SOEM控制伺服电机
  14. 王朝娱乐H5 游戏源码(cocos creator , pomelo + mongDB)搭建教程
  15. C# 将方形图片剪切为圆形(winForm)
  16. asm MGMT库迁移
  17. [Python]阴阳师-抗检测多功能护肝辅助脚本
  18. android 手机 apk安装失败对应码
  19. Jmeter(二十三) - 从入门到精通 - JMeter函数 - 上篇(详解教程)
  20. 熬粥记:煮一碗红豆粥,3次才领悟煮粥大法

热门文章

  1. 历史上的今天:万维网面世 30 周年;微信公众平台正式上线;计算机先驱诞生日...
  2. 2021-2027全球与中国台式能量色散X射线荧光光谱仪市场现状及未来发展趋势
  3. 浅谈一下单片机的定时器功能
  4. android伸缩布局,Android 之协调伸缩CoordinatorLayout,CollapsingToolbarLayout
  5. 基本概念-共益企业、ESG、CSR
  6. 六年级毕业计算机考试成绩,六年级毕业考试分数_六年级毕业考试的成绩是多少...
  7. 【imessage苹果群发推送邮箱】日历软件安装苹果微处理机 通例装置脚本
  8. 不用@微信官网了,用python给自己的微信头像加个小国旗
  9. 关于struts2的通配符问题
  10. [Mysql] RANK()函数 | ROW_NUMBER()函数 | DENSE_RANK()函数