我如何用R中的几何布朗运动模拟相关股票收益?
我正在尝试扩展我已有的代码。我的目标是通过使用历史漂移和波动率来模拟具有几何布朗运动的5只相关股票的投资组合回报(对数回报)。我以前使用过这个代码来模拟一只股票的回报,它工作得非常好 背景:我首先从雅虎金融下载了5家公司(过去5年)的股票价格,并提取了收盘价(因此每个股票价格现在只是一个列向量,而不是一个矩阵)。然后,我使用我如何用R中的几何布朗运动模拟相关股票收益?,r,simulation,montecarlo,portfolio,R,Simulation,Montecarlo,Portfolio,我正在尝试扩展我已有的代码。我的目标是通过使用历史漂移和波动率来模拟具有几何布朗运动的5只相关股票的投资组合回报(对数回报)。我以前使用过这个代码来模拟一只股票的回报,它工作得非常好 背景:我首先从雅虎金融下载了5家公司(过去5年)的股票价格,并提取了收盘价(因此每个股票价格现在只是一个列向量,而不是一个矩阵)。然后,我使用returns.DAI=diff(log(price.DAI))(这只是戴姆勒股票的一个示例),将这5个价格向量中的每一个都转换为具有对数回报的向量。然后我创建了一个矩阵来组
returns.DAI=diff(log(price.DAI))
(这只是戴姆勒股票的一个示例),将这5个价格向量中的每一个都转换为具有对数回报的向量。然后我创建了一个矩阵来组合5个日志返回向量(returns.matrix),并计算返回矩阵的协方差矩阵。之后,我用chol.decomp=chol(cov.matrix)
对协方差矩阵进行了Cholesky分解。我还创建了一个历史漂移向量(mu's)mu.portfolio=rbind(mu.DAI,mu.ADS,mu.BAS,mu.FME,mu.HEI)
您可能需要使用
图书馆(quantmod);库(性能分析)
下面是完整的代码:
# download prices from yahoo for 5 stocks manually because there are
# mistakes in the data when you use getSymbols()!!!
# ALSO, unfortunately I had to sort the csv's in Excel because
# when you download it from yahoo, it shows the newest price first. ^^
DAI=read.csv("LOCATION ON YOUR COMPUTER/NAME OF YOUR FILE.csv")
ADS=read.csv("LOCATION ON YOUR COMPUTER/NAME OF YOUR FILE.csv")
BAS=read.csv("LOCATION ON YOUR COMPUTER/NAME OF YOUR FILE.csv")
FME=read.csv("LOCATION ON YOUR COMPUTER/NAME OF YOUR FILE.csv")
HEI=read.csv("LOCATION ON YOUR COMPUTER/NAME OF YOUR FILE.csv")
# extracting close prices
price.DAI=DAI[,5]
price.ADS=ADS[,5]
price.BAS=BAS[,5]
price.FME=FME[,5]
price.HEI=HEI[,5]
# calculating log returns
returns.DAI = diff(log(price.DAI))
returns.ADS = diff(log(price.ADS))
returns.BAS = diff(log(price.BAS))
returns.FME = diff(log(price.FME))
returns.HEI = diff(log(price.HEI))
# matrix of returns
returns.matrix=cbind(returns.DAI,returns.ADS,returns.BAS,returns.FME,returns.HEI)
# calculate mu (drift)
mu.DAI=mean(returns.DAI)
mu.ADS=mean(returns.ADS)
mu.BAS=mean(returns.BAS)
mu.FME=mean(returns.FME)
mu.HEI=mean(returns.HEI)
mu.portfolio=rbind(mu.DAI,mu.ADS,mu.BAS,mu.FME,mu.HEI)
# calculate sigma
sigma.DAI=sd(returns.DAI)
sigma.ADS=sd(returns.ADS)
sigma.BAS=sd(returns.BAS)
sigma.FME=sd(returns.FME)
sigma.HEI=sd(returns.HEI)
sigma.pf=rbind(sigma.DAI,sigma.ADS,sigma.BAS,sigma.FME,sigma.HEI)
# covariance matrix
cov.matrix=cov(returns.matrix)
# Cholesky decomposition
chol.decomp=chol(cov.matrix)
现在,这里是我已经扩展但有缺陷的函数:
brownian.motion = function(number,dt,mu=c(0,0,0,0,0),sigma=cov.matrix){
t=seq(from=0,to=number*dt,by=dt)
n=length(t)
# normally distributed gains
dw=rnorm(n-1,mean=mu.portfolio*dt,sd=chol.decomp*sqrt(dt))
# start in 0
w=c(0,lapply(lapply(dw, cumsum), cumsum))
return(w)
}
number=250 #DAX stocks are approximately traded on 250 days per year so that's a one year simulation.
dt=1/number #delta (time steps)
sim=10000 #10000 simulations for each stock return
bm=matrix(nrow = number+1,ncol = sim)
for (i in 1:sim){
bm[,i]=brownian.motion(number,dt,mu.portfolio,cov.matrix)
}
运行此代码时,出现以下错误:
“bm[,i]=布朗运动(数,dt,mu.portfolio,cov.matrix)中的错误:矩阵上的下标数不正确”
谁能帮帮我吗?我越来越绝望,因为我尝试了太多,总是有另一个错误。我甚至不能100%确定我将cholesky分解和协方差矩阵放在哪里在数学上是否正确。如果您需要帮助,您需要提供合理数量的测试数据。我们得到:
object'mu.portfolio
未找到。我建议发布来自dput(tail(mu.portfolio,20))的输出。
好的,我只是尝试将其分解为核心问题,但现在我编辑了问题,以便您可以查看完整的代码。我想另一个错误刚刚发生,因为我将它更改为getSymbols()。现在cholesky分解不再起作用了。上面写着“chol.default(cov.matrix)中的错误:1阶的前导小调不是正定的”,但当我手动下载数据并使用read.csv()导入数据时,它总是起作用。是的,我刚刚测试了它。我将再次编辑它。如果您需要帮助,您需要为测试提供合理数量的数据。我们得到:object'mu.portfolio
未找到。我建议发布来自dput(tail(mu.portfolio,20))的输出。
好的,我只是尝试将其分解为核心问题,但现在我编辑了问题,以便您可以查看完整的代码。我想另一个错误刚刚发生,因为我将它更改为getSymbols()。现在cholesky分解不再起作用了。上面写着“chol.default(cov.matrix)中的错误:1阶的前导小调不是正定的”,但当我手动下载数据并使用read.csv()导入数据时,它总是起作用。是的,我刚刚测试了它。我将再次编辑它。