packages feed

LetsBeRational-1.0.0.0: src/LetsBeRational.hs

{- |
Copyright: (c) 2021 Ghais Issa
SPDX-License-Identifier: MIT
Maintainer: Ghais Issa <0x47@0x49.dev>

Haskell binding for Jaekel's "Let's be Rational" implied volatility calculation
-}

module LetsBeRational
       ( lbr
       ) where
import           Foreign.C.Types
import Data.Coerce (coerce)


foreign import ccall
   "lets_be_rational.h implied_volatility_from_a_transformed_rational_guess" c_lbr ::
     CDouble -> CDouble  -> CDouble -> CDouble  -> CDouble  -> CDouble

-- | Calculate implied volatility for a European option using Let's Be Rational.
lbr :: Int   -- ^ 1 for CALL -1 for PUT.
  -> Double -- ^ Forward
  -> Double -- ^ Strike
  -> Double -- ^ Time to maturity
  -> Double -- ^ Premium
  -> Double -- ^ Implied vol.
lbr cp f k t p = coerce $ c_lbr (coerce p) (coerce f) (coerce k) (coerce t) (coerce (fromIntegral cp::Double))