2012-08-17 2 views
0

다음 VBA 코드가 정확해야합니다Black-Scholes : VBA 코드와 R 코드의 차이점 ... 실수는 어디에 있습니까?

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에 그것을 할 시도 :

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

: 다음 입력으로

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 
} 

나는 약간 다른 결과를 얻을 수 'fOptions'R 패키지를 사용하면 결과가 VBA 1과 동일하므로 R 코드 실수가 어디인지 이해하지 못합니다.

아이디어가 있으십니까?

+1

확인 (D1)에 대한 공식을 읽어야

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

에 오류가 있습니다. – Roland

답변

8

당신은

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

그 사람을 잘 보았습니다. OP가 그 입력으로부터 얻고있는 가치를 아는 것의 부족으로 도움을받지 못했습니다 ... – Spacedman

+4

그것은 오류로 이어지지는 않지만,'values ​​<- c (2)'는 아마도 무엇을하지 않을 것입니다 네가하는 일이야. 길이 2의 벡터가 아니라 길이가 1 인 단일 값이 2 인 벡터를 만듭니다.이 값은 이후 할당에 의해 덮어 쓰여집니다. – seancarmody

+1

빠른 답변 감사합니다. 훌륭한 답변입니다. – Marco

관련 문제