packages feed

HQu-0.0.0.0: src/Q/Options/ImpliedVol.hs

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE DeriveGeneric              #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE AllowAmbiguousTypes#-}

module Q.Options.ImpliedVol
  (
      module Q.Types
    , module Q.Options
    , LogRelStrike(..)
    , AbsRelStrike(..)
    , MoneynessForwardStrike(..)
    , LogMoneynessForwardStrike(..)
    , MoneynessSpotStrike(..)
    , LogMoneynessSpotStrike(..)
    , VolShift(..)
    , VolType(..)
    , euImpliedVol
  )
  where

import Q.Types
import Q.Options
import Q.Options.BlackScholes
import           GHC.Generics (Generic)
import Data.Vector.Storable (Storable)
import qualified Q.Options.ImpliedVol.Normal as Bacherlier
import qualified Q.Options.ImpliedVol.LetsBeRational as B76


newtype AbsRelStrike = AbsRel Double
  deriving (Generic, Eq, Show, Read, Ord, Num, Fractional, Real, RealFrac, RealFloat, Floating, Storable)

newtype LogRelStrike = LogRel Double
  deriving (Generic, Eq, Show, Read, Ord, Num, Fractional, Real, RealFrac, RealFloat, Floating, Storable)

newtype MoneynessForwardStrike = MoneynessForward Double
  deriving (Generic, Eq, Show, Read, Ord, Num, Fractional, Real, RealFrac, RealFloat, Floating, Storable)

newtype LogMoneynessForwardStrike = LogMoneynessForward Double
  deriving (Generic, Eq, Show, Read, Ord, Num, Fractional, Real, RealFrac, RealFloat, Floating, Storable)

newtype MoneynessSpotStrike = MoneynessSpot Double
  deriving (Generic, Eq, Show, Read, Ord, Num, Fractional, Real, RealFrac, RealFloat, Floating, Storable)

newtype LogMoneynessSpotStrike = LogMoneynessSpot Double
  deriving (Generic, Eq, Show, Read, Ord, Num, Fractional, Real, RealFrac, RealFloat, Floating, Storable)


newtype VolShift = VolShift Double
  deriving (Generic, Eq, Show, Read, Ord, Num, Fractional, Real, RealFrac, RealFloat, Floating, Storable)

data VolType = Normal
             | LogNormal
             | ShiftedLogNormal VolShift
             deriving (Generic, Eq, Show, Read)


euImpliedVol :: VolType -> OptionType -> Forward -> Strike -> YearFrac -> DF -> Premium -> Vol
euImpliedVol Normal cp f k t df premium =
  let r = rateFromDiscount t df
  in Bacherlier.euImpliedVol cp f k t r premium
euImpliedVol (ShiftedLogNormal (VolShift shift)) cp f k t df premium =
  let r = rateFromDiscount t df
  in B76.euImpliedVol cp (f + Forward shift) (k + Strike shift) t r premium
euImpliedVol LogNormal cp f k t df p = euImpliedVol (ShiftedLogNormal 0) cp f k t df p