2016-11-16 8 views
0

私はしばらくの間、簡単なことのためにRを使ってきました。さて、私は資産のBlack-Scholes値を計算する関数を作成しようとしています。これは、金融分野ではかなり標準的なことです。私は構文が正しいと確信していますが、私は奇妙な結果を得ています。ここで私の最初のユーザー定義関数を作成しようとしています

は私のパラメータです:ここでは

myfunction(1000000000,500000000,.04,.2,5) 

は私の関数である。ここでは

myfunction <- function(Firm_Value, Face_Value, Rate, Volatility_Value, Time) 
{ 
s <- Firm_Value 
X <- Face_Value 
r <- Rate 
v <- Volatility_Value 
T <- Time 
t1 <- log(s/X) + (r + v^2/2) * T 
t2 <- v * sqrt(T) 
d1 <- t1/t2 
t3 <- log(s/X) + (r - v^2/2) * T 
d2 <- t3/t2 
ta <- s * qnorm(d1) 
tb <- X * exp(- r * T) * qnorm(d2) 
Equityvalue <- ta - tb 
} 

は私の結果である:

Warning messages: 
1: In qnorm(d1) : NaNs produced 
2: In qnorm(d2) : NaNs produced 

結果は、実際にする必要があります:

$593,035,186.31 

私はここで間違っていますか?

+0

デバッグに役立つ –

+0

ドキュメントから:qnorm(p、平均= 0、sd = 1、lower.tail = TRUE、log.p = FALSE) pは確率のベクトルです。 – stats0007

答えて

3

問題は、qnorm関数が確率を求めていることです。関数内の個々の計算を行うと、d1とd2は確率を与えません。私は代わりに彼らが分位数を与えると思っています。私はあなたがの代わりにpnormを望むと思う。

myfunction <- function(Firm_Value, Face_Value, Rate, Volatility_Value, Time) 
{ 
s <- Firm_Value 
X <- Face_Value 
r <- Rate 
v <- Volatility_Value 
T <- Time 
t1 <- log(s/X) + (r + v^2/2) * T 
t2 <- v * sqrt(T) 
d1 <- t1/t2 
t3 <- log(s/X) + (r - v^2/2) * T 
d2 <- t3/t2 
ta <- s * pnorm(d1) 
tb <- X * exp(- r * T) * pnorm(d2) 
Equityvalue <- ta - tb 
Equityvalue 
} 

注:最後にEquityvalueを追加して最終計算を返しました。上記の関数は、関数を呼び出すときに最終結果を出力しません。

+2

@ brandon-lebeauが書いたように、関数が返すものは最後の行、つまり最後の行の 'Equityvalue'で実行する必要があります。これを 'return(Equityvalue)'で明示的に行うこともできます。 –

+0

イェップ、そうだった。ありがとうBrandon! –

関連する問題