2016-09-27 8 views
1

CSV의 데이터가 포함 된 통화 옵션에 대한 Black-Scholes 기능과 이등분 모델이 있습니다. 그것은 관용을 초과하기 때문에 안쪽 루프에 갇혀있는 것처럼 보입니다. 내 Black-Scholes는 정확하게 계산하지 않으며 입찰가 평균을 사용하고 옵션의 실제 가격 대신 시장 가격을 요구합니다. 몇 시간 동안이 작업을하고 나면 분명히 뭔가 빠져있는 것일 수도 있습니다.R : Black-Scholes 및 이분법을 사용하여 IV 계산, 루프 작동을 거부 함

CSV에 대한 링크는 여기에 있습니다 : 당신은 true의 경우, 항상 사실이다,하는 조건에 while 루프를 사용하고

while(abs(bsmCall(as.numeric(as.character(myData[i,17])), 
        as.numeric(as.character(myData[i,1])), 
        as.numeric(as.character(myData[i,22])), 
        volMid, 
        as.numeric(as.character(myData[i,23])))-(as.numeric(as.character(myData[i,5])))) >= tol) 

: http://s000.tinyupload.com/?file_id=06213890949979926112

######################################################################## 
#Black-Scholes-Merton Call 
bsmCall <- function(S, K, M, sig, r) { 
    yrTime=(M/252) 
    d1 <- (log(S/K)+(r+(sig^2/2))*(yrTime))/(sig*(sqrt(yrTime))) 
    d2 <- d1-sig*(sqrt(yrTime)) 
    C <- (S*(pnorm(d1)))-((pnorm(d2))*K*(exp(-r*yrTime))) 
    return(C) 
} 
######################################################################## 

myData = read.csv("09-26-16.csv", stringsAsFactors=FALSE) #DATA 
myData <- myData[,2:24] #omit first column 

####### start bisection method of CALLS and put IV in database ####### 
i <- 1 # reset counter 
tol <- 0.000001 #tolerance 

while(i <= nrow(myData)) { 
    if((myData[i,5] != 0) & (myData[i,6] != 0)) { 
    volLower <- .0001 #will need to reset with each iteration 
    volUpper <- 1   #will need to reset with each iteration 
    volMid <- (volLower + volUpper)/2 #will need to reset with each iteration 

    while(abs(bsmCall(as.numeric(as.character(myData[i,17])),as.numeric(as.character(myData[i,1])),as.numeric(as.character(myData[i,22])),volMid,as.numeric(as.character(myData[i,23])))-(as.numeric(as.character(myData[i,5])))) >= tol) { 
     if((bsmCall(as.numeric(as.character(myData[i,17])),as.numeric(as.character(myData[i,1])),as.numeric(as.character(myData[i,22])),volMid,as.numeric(as.character(myData[i,23])))-(as.numeric(as.character(myData[i,5])))) < 0) { 
     volLower <- volMid 
     volMid <- (volUpper + volMid)/2 
     } else { 
     volUpper <- volMid 
     volMid <- (volLower + volMid)/2 
     } 
    } 
    myData[i,8] <- volMid 
    } else { myData[i,8] <- 0 } 
    i=i+1 
} 
+0

csv에 링크하는 대신 (링크가 작동하지 않으며 SO가 리소스를 만드는 방법에 대해) 최소한의 재현 가능한 예제를 제공하십시오. http://stackoverflow.com/questions/5963269/how-to-make-a-great -r-reproducible-example. – Shape

+0

귀하의 질문이 실제로 무엇인지 명확하지 않습니다. 이 코드를 실행할 때 실제 R 오류가 있습니까? 아니면 예상대로 행동하지 않는 것입니까? 그렇다면 예상대로 작동하지 않는 이유는 무엇입니까? (그것이 "관용"보다 위에 머물러있는 것은 무엇입니까? "그것은 관용을 넘어선 채로 남아 있습니까?"bmsCall이 예상 한 숫자를 반환하지 않는 문제입니까? 많은 사람들이 Black Scholes eqn과 호출 옵션에 대한 이분법 모델) –

+0

무한 루프로 끝납니다. 다음은 CSV의 데이터 프레임 레크 리 에이션입니다. – Probability1

답변

1

문제는 여기에있다 . 그것은 무한 루프입니다. 데이터의 첫 번째 행에서이 문제가 발생합니다.

이 오류를 수정하는 방법은 유스 케이스에 따라 다르지만, whileif으로 변경하면 즉시 루프가 완료됩니다.

이분법에 대해 질문했습니다. 이 패키지에서 몇은 여기 here에서 또 다른입니다 :

bisect <- function(fn, lower, upper, tol=1.e-07, ...) { 
f.lo <- fn(lower, ...) 
f.hi <- fn(upper, ...) 
feval <- 2 

if (f.lo * f.hi > 0) stop("Root is not bracketed in the specified interval 
\n") 
chg <- upper - lower 

while (abs(chg) > tol) { 
     x.new <- (lower + upper)/2 
     f.new <- fn(x.new, ...) 
     if (abs(f.new) <= tol) break 
     if (f.lo * f.new < 0) upper <- x.new 
     if (f.hi * f.new < 0) lower <- x.new 
     chg <- upper - lower 
     feval <- feval + 1 
} 
list(x = x.new, value = f.new, fevals=feval) 
} 

# An example 
fn1 <- function(x, a) { 
exp(-x) - a*x 
} 

bisect(fn1, 0, 2, a=1) 

bisect(fn1, 0, 2, a=2) 

재귀 버전 :

이 지금까지 내 3 편집 ...

while 루프를 재구성 할 수 있습니다은
bisectMatt <- function(fn, lo, hi, tol = 1e-7, ...) { 

    flo <- fn(lo, ...) 
    fhi <- fn(hi, ...) 

    if(flo * fhi > 0) 
     stop("root is not bracketed by lo and hi") 

    mid <- (lo + hi)/2 
    fmid <- fn(mid, ...) 
    if(abs(fmid) <= tol || abs(hi-lo) <= tol) 
     return(mid) 


    if(fmid * fhi > 0) 
     return(bisectMatt(fn, lo, mid, tol, ...)) 

    return(bisectMatt(fn, mid, hi, tol, ...)) 
} 
+0

그러나 Black-Scholes 가격에서 실제 가격을 뺀 값이 임의로 낮아질 때까지 반복해야합니다. 앞에서 말한 것처럼 첫 번째 조건은 항상 참이므로 이분법 방법은 어떻게 작동합니까? – Probability1

+0

코드가 반복 작성되지 않는 방식으로, 조건이 참일 때 중지됩니다.나는 당신이 무엇을하려고하는지 정확히 모르겠다. 그러나 나는 그 조건이 사실이라면 어떤 행동을 취하고, 그렇지 않다면 다른 것을하거나 다음 반복을 진행하기를 원한다고 생각한다. 만약 당신이 이분법을 사용하려고한다면 당신은 단지'BFfzero()'를 사용할 필요가 있습니다. http://artax.karlin.mff.cuni.cz/r-help/library/NLRoot/html/BFfzero.html 또는 https://www.rforge.net/doc/packages/animation/bisection.method를 참조하십시오. html –

+0

사실입니다. 패키지 중 하나를 사용할 수 있습니다. 나는 그것을 다시 만들려고 노력했다. 나는 아마 그들 중 하나를 사용하여 끝날 것입니다. – Probability1

0

이름 : Jeez입니다 i=1 일 때 각 반복 이후에 while 상태의 유일한 부분 인 volMid을 인쇄하십시오.

i <- 1 
volLower <- .0001 #will need to reset with each iteration 
volUpper <- 1   #will need to reset with each iteration 
volMid <- (volLower + volUpper)/2 #will need to reset with each iteration 

j <- 1 
while(abs(bsmCall(myData[i,17], myData[i,1], myData[i,22],volMid,myData[i,23])-myData[i,5]) >= tol & j < 30) { 
    if(bsmCall(myData[i,17], myData[i,1], myData[i,22],volMid,myData[i,23])-myData[i,5] < 0) { 
volLower <- volMid 
volMid <- (volUpper + volMid)/2 
    } else { 
    print("pos") 
    volUpper <- volMid 
    volMid <- (volLower + volMid)/2 
    } 
    j <- j + 1 
    print(volMid) 
} 

결과 :

#[1] 0.750025 
#[1] 0.8750125 
#[1] 0.9375062 
#[1] 0.9687531 
#[1] 0.9843766 
#[1] 0.9921883 
#[1] 0.9960941 
#[1] 0.9980471 
#[1] 0.9990235 
#[1] 0.9995118 
#[1] 0.9997559 
#[1] 0.9998779 
#[1] 0.999939 
#[1] 0.9999695 
#[1] 0.9999847 
#[1] 0.9999924 
#[1] 0.9999962 
#[1] 0.9999981 
#[1] 0.999999 
#[1] 0.9999995 
#[1] 0.9999998 
#[1] 0.9999999 
#[1] 0.9999999 
#[1] 1 
#[1] 1 
#[1] 1 
#[1] 1 
#[1] 1 
#[1] 1 

volMid 미만 30 반복 후 1으로 수렴하고, 거기에서 밖으로에,이 붙어 있습니다.

+0

나는 이것을 조사해야 할 것이다. 나는 R에 익숙하지 않아서 아직 익숙하지 않은 $ 기호를 사용하고있다. 나는 그 대신에 그것을 사용하려고 시도 할 것이고 어쩌면 더 쉽게 읽을 수 있기 때문에 더 잘 될 것이다. – Probability1

+0

@ Probability1 나는 약간의 편집을했다. 나의 대답에, 나의 마지막 하나에 약간의 오류가 있었다. – Chrisss

+0

사실입니다. 그것은 1로 계속 가고 그 후에 붙어 얻는다. 나는이 모든 것을 고치는 방법에 대해서 아직도 혼란 스럽다. 나는 기본적으로 이것을 복사하려고한다. https://www.r-bloggers.com/the-only-thing-smiling-today-is-volatility/ – Probability1