[R-SIG-Finance] RQuantLib: AmericanOptionImpliedVolatility bug

Robert Harlow rharlow86 at gmail.com
Sat May 27 13:10:05 CEST 2017


Doesn't the error message say root not bracketed? That is informative because it means there is no root, or no implied volatility, that gives you back your price of 14.5- this is what you should expect given your inputs.  In order for a volatility to exist an option must have a positive time value.

Bob

> On May 26, 2017, at 6:55 PM, Charles Duranceau <cduranceau at nial.ky> wrote:
> 
> Thank you Robert,
> I agree with you this is an extreme case and I don’t expect too much accuracy from the implied volatility I get, but my concern was more about the error message (a NA would have been more desirable)
> By changing the engine I managed a workaround but I thought RQL team (or someone else having the same problem) could be interested with that non-desirable behavior.
>  
> Regards
>  
>  
> From: Robert Harlow [mailto:rharlow86 at gmail.com] 
> Sent: Friday, May 26, 2017 3:32 PM
> To: Charles Duranceau
> Cc: r-sig-finance at r-project.org
> Subject: Re: [R-SIG-Finance] RQuantLib: AmericanOptionImpliedVolatility bug
>  
> Charles, my suggestion (which I doubt you will like) is to wrap your calls to implied volatility root finders (quant lib or any others) in a try block that returns NA on error.  Your example (very little or no time value) can be common if you are using mid prices from bid-ask quotes.  Note that when you plug the answer from your sum of squares root finding routine back into AmericanOption you get a value slightly above 14.5.
>  
> On Fri, May 26, 2017 at 11:46 AM, Charles Duranceau <cduranceau at nial.ky> wrote:
> Hi,
> 
> I found a problem with the function "AmericanOptionImpliedVolatility" in RQantLib which return an error for a specific set of conditions (but cannot identifies exactly what are these).
> I present a case related to a short term, very deep in-the-money put with negative interest rate that generate error message. I present a reproducible example below.
> I found the related function "AmericanOption" with default produce similar error when use in a routine to back-out the implied volatility.
> However, I found good result (no error)  when using the engine="CrankNicolson" :  a naïve routine for backing-out the implied vol with this function return a volatility.
> There's a work around but think this information may add more stability to RQL.
> 
> Best Regards
> Charles
> 
> 
> Case
> RQuantLib Version 4.2
> 
> R version 3.3.2 (64bits)
> 
> library(RQuantLib)
> 
> price = 14.5
> strike = 65
> Spot= 50.5
> Rate = -0.00361
> DividendYield = 0
> Volatility = 0.296
> YearToMaturity = 3/365
> 
> # error when Implied Vol
> AmericanOptionImpliedVolatility("put", price,Spot, strike, DividendYield, Rate,YearToMaturity, Volatility)
> 
> Error in americanOptionImpliedVolatilityEngine(type, value, underlying,  :
> 
> ../../../QuantLib-1.6.2/ql/math/solver1d.hpp:202: In function `QuantLib::Real QuantLib::Solver1D<Impl>::solve(const F&, QuantLib::Real, QuantLib::Real, QuantLib::Real, QuantLib::Real) const [with F = QuantLib::{anonymous}::PriceError; Impl = QuantLib::Brent; QuantLib::Real = double]':
> root not bracketed: f[1e-007,4] -> [1.955446e-003,3.006858e+000]
> 
> #also generate error
> AmericanOption("put", Spot, strike, DividendYield, Rate,YearToMaturity, Volatility)
> 
> # works well
> AmericanOption("put", Spot, strike, DividendYield, Rate,YearToMaturity, Volatility,timeSteps=150, gridPoints=149, engine="CrankNicolson")
> # backing out the implied vol naively works
> fImpliedVol(Volatility,price,"put", Spot, strike, DividendYield, Rate,YearToMaturity)
> 
> 
> fImpliedVol<-function(iniVol,Premium,Callput, Spot, Strike, DivYield, Rate,YrtoMat){
>   ftm<-function(ImpVol,Premium,Callput, Spot, Strike, DivYield, Rate,YrtoMat, iVol)
>   {
>     ov<-AmericanOption(type=Callput, underlying=Spot, strike=Strike,dividendYield=DivYield, riskFreeRate=Rate, maturity=YrtoMat,volatility=ImpVol,
>                        timeSteps=150, gridPoints=149, engine= "CrankNicolson")
>     er<-(Premium-ov$value)^2
>   }
>   imp<-optimize(f=ftm,c(lower = 0, upper = 1.5), tol = 1e-4,Premium,Callput,Spot, Strike, DivYield, Rate,YrtoMat)
>   return(imp$minimum)
> }
> 
> > sessionInfo()
> R version 3.3.2 (2016-10-31)
> Platform: x86_64-w64-mingw32/x64 (64-bit)
> Running under: Windows >= 8 x64 (build 9200)
> 
> locale:
> [1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
> [4] LC_NUMERIC=C                           LC_TIME=English_United States.1252
> 
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets  methods   base
> 
> other attached packages:
> [1] RQuantLib_0.4.3 dplyr_0.5.0
> 
> loaded via a namespace (and not attached):
> [1] zoo_1.8-0        magrittr_1.5     R6_2.1.2         assertthat_0.2.0 DBI_0.6-1        tools_3.3.2      tibble_1.0       Rcpp_0.12.10
>  [9] grid_3.3.2       lattice_0.20-34
> 
> 
> >
> 
> 
> 
> 
>         [[alternative HTML version deleted]]
> 
> 
> _______________________________________________
> R-SIG-Finance at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> -- Subscriber-posting only. If you want to post, subscribe first.
> -- Also note that this is not the r-help list where general R questions should go.
>  

	[[alternative HTML version deleted]]



More information about the R-SIG-Finance mailing list