【问题标题】:Black-Scholes: difference between VBA code and R code... where's the mistake?Black-Scholes:VBA 代码和 R 代码之间的区别......哪里出错了?
【发布时间】:2012-08-17 16:06:07
【问题描述】:

以下 VBA 代码应该是正确的:

Function BlackScholes(CallPutFlag As String, S As Double, X _
As Double, T As Double, r As Double, v As Double) As Double

Dim d1 As Double, d2 As Double

d1 = (Log(S / X) + (r - v ^ 2 / 2) * T) / (v * Sqr(T))
d2 = d1 - v * Sqr(T)
    If CallPutFlag = "c" Then
     BlackScholes = S * CND(d1) - X * Exp(-r * T) * CND(d2)
    ElseIf CallPutFlag = "p" Then
     BlackScholes = X * Exp(-r * T) * CND(-d2) - S * CND(-d1)
    End If

End Function

'// The cumulative normal distribution function
Public Function CND(X As Double) As Double

Dim L As Double, K As Double
Const a1 = 0.31938153: Const a2 = -0.356563782: Const a3 = 1.781477937:
Const a4 = -1.821255978: Const a5 = 1.330274429

L = Abs(X)
K = 1 / (1 + 0.2316419 * L)
CND = 1 - 1 / Sqr(2 * Application.Pi()) * Exp(-L ^ 2 / 2) * (a1 * K + a2 * K ^ 2 + a3 * K ^ 3 + a4 * K ^ 4 + a5 * K ^ 5)

If X < 0 Then
CND = 1 - CND
End If
End Function

现在我尝试在 R 中做到这一点:

blackscholes <- function(S, X, rf, T, sigma) {
values <- c(2)

d1 <- (log(S/X)+(rf-sigma^2/2)*T)/sigma*sqrt(T)
d2 <- d1 - sigma * sqrt(T)

values[1] <- S*pnorm(d1) - X*exp(-rf*T)*pnorm(d2)
values[2] <- X*exp(-rf*T) * pnorm(-d2) - S*pnorm(-d1)

values
}

使用以下输入,我得到的结果略有不同:

Spot    2,8
Strike  2,9
Risk free   0,01
T   0,083333333
Sigma   0,2

使用'fOptions' R包结果等于VBA的结果,那么我不明白R代码错误在哪里。

有什么想法吗?

【问题讨论】:

    标签: r vba


    【解决方案1】:

    你有一个错误

    d1 <- (log(S/X)+(rf-sigma^2/2)*T)/sigma*sqrt(T)
    

    应该读什么

    d1 <- (log(S/X)+(rf-sigma^2/2)*T)/(sigma*sqrt(T))
    

    【讨论】:

    • 看准那个人。由于不知道 OP 从这些输入中获得了什么价值,这无济于事......
    • 虽然它不会导致错误,但同样值得注意的是values &lt;- c(2) 可能没有按照您的意愿行事。它不是创建一个长度为 2 的向量,而是创建一个长度为 1 且单个值为 2 的向量。该值随后会被后面的赋值覆盖。
    • 感谢您的快速回答,您太棒了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多