1 votos

Mensaje de error en el cálculo de la volatilidad implícita

Estoy intentando sin éxito encontrar las Volatilidades Implícitas para el SPX en una fecha determinada utilizando información del CBOE, así como el Interés Abierto, pero al ejecutar el código estoy recibiendo un mensaje de error que no puedo resolver.

> ## library(RQuantLib)
> library(RQuantLib)
Loading required package: Rcpp
> ## library(Rcpp)
> library(Rcpp)
> ## Black-Scholes Function
> BS <-
+ function(S, K, T, r, sig, type="C"){
+    d1 <- (log(S/K) + (r + sig^2/2)*T) / (sig*sqrt(T))
+    d2 <- d1 - sig*sqrt(T)
+    if(type=="C"){
+      value <- S*pnorm(d1) - K*exp(-r*T)*pnorm(d2)
+    }
+    if(type=="P"){
+      value <- K*exp(-r*T)*pnorm(-d2) - S*pnorm(-d1)
+    }
+    return(value)
+  }
> ## Function to find BS Implied Vol using Bisection Method
> implied.vol <-
+  function(S, K, T, r, market, type){
+    sig <- 0.20
+    sig.up <- 1
+    sig.down <- 0.001
+    count <- 0
+    err <- BS(S, K, T, r, sig, type) - market   
+    ## repeat until error is sufficiently small or counter hits 1000
+    while(abs(err) > 0.00001 && count<1000){
+      if(err < 0){
+        sig.down <- sig
+        sig <- (sig.up + sig)/2
+      }else{
+        sig.up <- sig
+        sig <- (sig.down + sig)/2
+      }
+      err <- BS(S, K, T, r, sig, type) - market
+      count <- count + 1
+    }  
+    ## return NA if counter hit 1000
+    if(count==1000){
+      return(NA)
+    }else{
+      return(sig)
+    }
+  }
> ## read in data
> dat <- read.csv('C:/Users/Edgar Martinez/Downloads/SPX_data.csv')
> ## read in data
> dat <- read.csv('C:/Users/Edgar Martinez/Downloads/SPX_data.csv')
> ## calculate implied vol for Call
>  S <- 1841.36
>  T <- 20/365
>  r <- 0.01  
>  n <- dim(dat)[1]
>  c.vol.Ask <- rep(0,n)
>  c.vol.Bid <- rep(0,n)
>  p.vol.Ask <- rep(0,n)
> p.vol.Bid <- rep(0,n)
> for(i in 1:n){
+    c.vol.Ask[i] <- implied.vol(S, dat$K[i], T, r, dat$C.Ask[i], "C")
+    c.vol.Bid[i] <- implied.vol(S, dat$K[i], T, r, dat$C.Bid[i], "C")
+    p.vol.Ask[i] <- implied.vol(S, dat$K[i], T, r, dat$P.Ask[i], "P")
+    p.vol.Bid[i] <- implied.vol(S, dat$K[i], T, r, dat$P.Bid[i], "P")
+  }

**Error in while (abs(err) > 1e-05 && count < 1000) { : 
  missing value where TRUE/FALSE needed**

1voto

user6189 Puntos 26

Intenta poner algún paréntesis a tu condición, yo experimenté muchos problemas parecidos a este en el pasado.

+    while( (abs(err) > 0.00001) && (count < 1000) ){

1voto

BigCanOfTuna Puntos 210

En un bucle while, se evalúa la expresión de la condición y, si es TRUE, se ejecuta el bloque. El error le indica que la condición en el bucle no se evaluó a TRUE o FALSE, sino a NA. Así que comprueba cómo defines/calculas 'count' y 'err'.

0voto

scottishwildcat Puntos 146

Veo dos formas:

  1. ¿Podría utilizar EuropeanOptionImpliedVolatility que está contenido en RQuantLib ?
  2. utilizar el print y mira los valores de count y err en cada iteración. Para un ejemplo sencillo mira esto c = 1; print(paste("Hallo:",c));

0voto

doekman Puntos 5187

Si sig==0 entonces BS devuelve NaN por dividir por cero en esta línea:

d1 <- (log(S/K) + (r + sig^2/2)*T) / (sig*sqrt(T))

Eso hace que err para ser NaN .

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X