R语言题目:利用浦发银行、中国石化、上汽集团、三一重工和海螺水泥5支上证500成分股five_acsv完成下列操作注意数据已为对数收益率不需要换算:1画出这5支股票的构成的效率前缘图2以2016-11-22到2020-12-31的数据为训练集2021-01-4到2021-11-18的数据为测试集计算出目标日收益率为0002时各资产组合的比例并画出最优配置与随机配置绩效比较图。
由于数据文件未提供,以下代码仅为参考。
1)画出这5支股票的构成的效率前缘图
library(tidyverse)
library(PerformanceAnalytics)
library(RColorBrewer)
# 读取数据
data <- read_csv("five_a.csv")
# 计算年化均值和协方差矩阵
mean_ret <- apply(data, 2, mean) * 252
cov_mat <- cov(data) * 252
# 计算有效前沿
eff_frontier <- portfolio.optim(mean_ret, cov_mat)
# 绘制效率前沿图
colors <- brewer.pal(length(eff_frontier$ps), "Set1")
plot(eff_frontier$p, eff_frontier$ps, type = "l", lwd = 2, col = colors[1])
points(eff_frontier$p, eff_frontier$ps, col = colors[-1], pch = 20, cex = 0.8)
title("Efficient Frontier of Five Stocks")
2)以2016-11-22到2020-12-31的数据为训练集,2021-01-4到2021-11-18的数据为测试集,计算出目标日收益率为0.002时,各资产组合的比例,并画出最优配置与随机配置绩效比较图。
library(ROI)
library(ROI.optim)
library(ROI.plugin.quadprog)
library(ROI.plugin.glpk)
# 划分训练集和测试集
train_data <- data[1:1013, ]
test_data <- data[1014:1260, ]
# 计算训练集的均值和协方差矩阵
train_mean_ret <- apply(train_data, 2, mean) * 252
train_cov_mat <- cov(train_data) * 252
# 定义目标函数和限制条件
obj_fun <- function(w) -w %*% train_mean_ret
const_mat <- rbind(rep(1, ncol(train_data)), diag(ncol(train_data)))
const_dir <- c(1, rep(0, ncol(train_data)))
# 计算最优配置
opt_port <- ROI::ROI_optimization(fn = obj_fun,
constraints = list(A = const_mat,
dir = const_dir,
type = rep(">=", ncol(train_data))),
solver = "quadprog")
# 计算随机配置
set.seed(123)
rand_port <- runif(ncol(train_data))
rand_port <- rand_port / sum(rand_port)
# 计算测试集的收益率和波动率
test_ret <- apply(test_data, 2, mean) * 252
test_vol <- apply(test_data, 2, sd) * sqrt(252)
# 计算最优配置和随机配置的收益率和波动率
opt_ret <- sum(test_ret * opt_port$optimum)
rand_ret <- sum(test_ret * rand_port)
opt_vol <- sqrt(t(opt_port$optimum) %*% train_cov_mat %*% opt_port$optimum)
rand_vol <- sqrt(t(rand_port) %*% train_cov_mat %*% rand_port)
# 计算目标收益率为0.002时的最优配置
target_ret <- 0.002
target_port <- ROI::ROI_solveLP(obj_fun = obj_fun,
const_mat = const_mat,
const_dir = const_dir,
const_rhs = c(target_ret, rep(0, ncol(train_data))),
max = TRUE,
solver = "glpk")
# 绘制最优配置和随机配置绩效比较图
plot(test_vol, test_ret, pch = 20, cex = 0.8, col = "gray50",
xlab = "Volatility", ylab = "Return", main = "Performance Comparison")
abline(a = 0, b = opt_ret / opt_vol, lwd = 2, col = "blue")
abline(a = 0, b = rand_ret / rand_vol, lwd = 2, col = "red")
abline(v = opt_vol, lty = 2, col = "blue")
abline(v = rand_vol, lty = 2, col = "red")
text(opt_vol, opt_ret, "Optimal", pos = 4, col = "blue")
text(rand_vol, rand_ret, "Random", pos = 4, col = "red")
points(sqrt(t(target_port$optimum) %*% train_cov_mat %*% target_port$optimum),
target_ret, pch = 20, col = "green", cex = 1.2)
text(sqrt(t(target_port$optimum) %*% train_cov_mat %*% target_port$optimum),
target_ret, "Target", pos = 4, col = "green")
原文地址: https://www.cveoy.top/t/topic/bJj6 著作权归作者所有。请勿转载和采集!