2016-11-28 101 views
0

我现在正在处理我的大学论文的期权价格估值。 我们需要在R.一些事情编程这是我第一次用编程软件,如R.我已经做了过去两周的工作,这是我竟还:For循环R(特殊情况:维纳过程)

s <- 120 
#Value of the stock today 
sd <- 0.1 
#standard deviation 
d <- 0.003 
#Drift 

N <- 365 
T <-1 
dt <-T/N 
t <- seq(0,T, length=N+1) 
W <- c(0, cumsum(sqrt(dt)*rnorm(N))) 
#plot(t, W, type="l", main="Wiener process", ylim=c(-1,1)) 

S <- s*exp(d+sd*W) 
S 

这是一个简单的广义维纳过程,我想变成蒙特卡洛模拟。 对于S,现在有366(N + 1)个库存路径的值。我需要的是一个“for循环”,它取S的最后一个值并将它分配给一个向量(列表向量),以便我可以运行循环例如10000次,收集每个S的最后一个值并获得矢量。

我不知道如何编程这样一个for循环。 如果你能帮助我或给我一些好的提示,我会很感激。

来自德国 基督教问候

+0

第1步:把你的代码变成一个函数'my_wiener_process'。只有'return()'S'的最后一个值。第2步:'n = 10000; results = rep(NA,n); for(i in 1:n)results [i] < - my_wiener_process()'。 – Gregor

+0

非常感谢。问题是,我甚至不知道如何将我的代码转换为函数 – Monte

+0

把'my_wiener_process < - function(){'放在所有代码之前,并将'return(tail(S,1))}'放在所有代码的结尾。请参阅,例如,[如何在R中编写函数]中的大部分内容(https://www.google.com/search?q=how+to+write+a+function+in+R&ie=utf-8&oe=utf -8) – Gregor

回答

0

我没学过Wiener过程,但我认为这将是代码的简单轮廓你想实现:

stock_prices <- s #Initialise vector of stock prices 
numIter <- 10^4  #Set number of iterations in the for loop 

for(i in 1:numIter) { 
    s <- stock_prices[i] #This is the current stock price (for ith iteration/time step) 

    #Calculate the next stock price here, call it next_price 

    #Add price of next iteration/time step to your vector: 
    stock_prices <- c(stock_prices, next_price) 
} 

stock_prices将是一个向量你模拟的10,000股股票价格。

我不知道如何计算S的下一个股票价格,但是如果您从S的值中随机抽取,那么查看函数sample(请键入?sample获取帮助)可能会很有用。

希望帮助

+1

“增长”循环内的向量是非常糟糕的做法 - 不必要的低效率。参见[R地狱的圆2](http://www.burns-stat.com/pages/Tutor/R_inferno.pdf)。 – Gregor

+0

我同意这不是最高效的,但很容易理解。自从我开始写这篇文章以来,他只是说他不知道如何编写函数,我认为基本/简单的代码比效率更重要。我很高兴你的评论将他排除在外。 – hodgenovice

0

如果你只是想重复运行的代码,把它在一个功能是不错的(但不是绝对必要)。我将把你问题中的所有代码称为<your code>

为了使运行代码的函数,

my_function = function() { 
    <your code> 
} 

的功能,在默认情况下,返回它的最后一行,在这种情况下S。你只需要Stail(S, 1)的最后一个元素。因此,我们可以修改函数只返回:

my_function = function() { 
    <your code> 
    return(tail(S, 1)) 
} 

然后,我们可以把它叫做一个for循环n时间和分配结果。最好是预先分配的矢量的结果,使得存储器的适当大小的块可以预留它前面进行设置:

n = 10000 
results = rep(NA, n) 
for (i in 1:n) { 
    results[i] <- my_function() 
} 

这相当于

n = 10000 
results = rep(NA, n) 
for (i in 1:n) { 
    <your code> 
    results[i] <- tail(S, 1) 
} 

而且,对于这也就等于

results = replicate(n, my_function()) 

这是一个方便的快捷方式。

如果你想成为幻想,你可以参数化的功能:

my_nice_function = function(s = 120, sd = 0.1, d = 0.003, N = 365) { 
    T <- 1 
    dt <- T/N 
    t <- seq(0, T, length = N + 1) 
    W <- c(0, cumsum(sqrt(dt) * rnorm(N))) 
    S <- s * exp(d + sd * W) 
    return(tail(S, 1)) 
} 

现在my_nice_function有默认值,在你的代码,但是你可以很容易地对其进行调整,例如,与sd = 0.2运行50个模拟你可以这样做:

replicate(50, my_nice_function(sd = 0.2))