试图创建我的第一个用户定义的功能

时间:2016-11-16 20:59:52

标签: r

我现在已经使用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

我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

问题是qnorm函数需要概率。如果您在函数中进行单独计算,则d1和d2不会给出概率。我认为他们会给出分位数。我想你想要pnorm而不是qnorm

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返回了最终计算结果。调用函数时,上面的函数不会打印最终结果。