我如何用R中的几何布朗运动模拟相关股票收益?

我如何用R中的几何布朗运动模拟相关股票收益?,r,simulation,montecarlo,portfolio,R,Simulation,Montecarlo,Portfolio,我正在尝试扩展我已有的代码。我的目标是通过使用历史漂移和波动率来模拟具有几何布朗运动的5只相关股票的投资组合回报(对数回报)。我以前使用过这个代码来模拟一只股票的回报,它工作得非常好 背景:我首先从雅虎金融下载了5家公司(过去5年)的股票价格,并提取了收盘价(因此每个股票价格现在只是一个列向量,而不是一个矩阵)。然后,我使用returns.DAI=diff(log(price.DAI))(这只是戴姆勒股票的一个示例),将这5个价格向量中的每一个都转换为具有对数回报的向量。然后我创建了一个矩阵来组

我正在尝试扩展我已有的代码。我的目标是通过使用历史漂移和波动率来模拟具有几何布朗运动的5只相关股票的投资组合回报(对数回报)。我以前使用过这个代码来模拟一只股票的回报,它工作得非常好

背景:我首先从雅虎金融下载了5家公司(过去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()导入数据时,它总是起作用。是的,我刚刚测试了它。我将再次编辑它。