{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RecordWildCards #-}
module Q.Options.ImpliedVol.InterpolatingSmile where

import Q.Types
import Q.SortedVector (SortedVector)
import Numeric.LinearAlgebra (Vector)
import Q.Options.ImpliedVol.TimeSlice
import Q.Options.ImpliedVol.StrikeInterpolation
import Q.Interpolation
data InterpolatingSmile = StrikeSmile
  {
    InterpolatingSmile -> Forward
smileForward :: Forward
  , InterpolatingSmile -> YearFrac
smileTenor   :: YearFrac
  , InterpolatingSmile -> SortedVector Strike
smileStrikes :: SortedVector Strike
  , InterpolatingSmile -> Vector Vol
smileVols    :: Vector Vol
  , InterpolatingSmile -> StrikeInterpolation
smileInterpolation :: StrikeInterpolation
  , InterpolatingSmile -> StrikeExtrapolation
smileExtrapolation :: StrikeExtrapolation
  , InterpolatingSmile -> Strike
smileMinStrike :: Strike
  , InterpolatingSmile -> Strike
smileMaxStrike :: Strike
  }

instance TimeSlice InterpolatingSmile Strike where
  totalVar :: InterpolatingSmile -> Strike -> TotalVar
totalVar smile :: InterpolatingSmile
smile@StrikeSmile{Vector Vol
YearFrac
Strike
Forward
SortedVector Strike
StrikeExtrapolation
StrikeInterpolation
smileMaxStrike :: Strike
smileMinStrike :: Strike
smileExtrapolation :: StrikeExtrapolation
smileInterpolation :: StrikeInterpolation
smileVols :: Vector Vol
smileStrikes :: SortedVector Strike
smileTenor :: YearFrac
smileForward :: Forward
smileMaxStrike :: InterpolatingSmile -> Strike
smileMinStrike :: InterpolatingSmile -> Strike
smileExtrapolation :: InterpolatingSmile -> StrikeExtrapolation
smileInterpolation :: InterpolatingSmile -> StrikeInterpolation
smileVols :: InterpolatingSmile -> Vector Vol
smileStrikes :: InterpolatingSmile -> SortedVector Strike
smileTenor :: InterpolatingSmile -> YearFrac
smileForward :: InterpolatingSmile -> Forward
..} Strike
k = Double -> TotalVar
TotalVar (Double -> TotalVar) -> Double -> TotalVar
forall a b. (a -> b) -> a -> b
$ YearFrac -> Double -> Double
forall a. TimeScaleable a => YearFrac -> a -> a
scale YearFrac
smileTenor (Double
sigma Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
sigma) where
    (Vol Double
sigma) = InterpolatingSmile -> Strike -> Vol
impliedVol InterpolatingSmile
smile Strike
k

impliedVol :: InterpolatingSmile -> Strike -> Vol
impliedVol StrikeSmile{Vector Vol
YearFrac
Strike
Forward
SortedVector Strike
StrikeExtrapolation
StrikeInterpolation
smileMaxStrike :: Strike
smileMinStrike :: Strike
smileExtrapolation :: StrikeExtrapolation
smileInterpolation :: StrikeInterpolation
smileVols :: Vector Vol
smileStrikes :: SortedVector Strike
smileTenor :: YearFrac
smileForward :: Forward
smileMaxStrike :: InterpolatingSmile -> Strike
smileMinStrike :: InterpolatingSmile -> Strike
smileExtrapolation :: InterpolatingSmile -> StrikeExtrapolation
smileInterpolation :: InterpolatingSmile -> StrikeInterpolation
smileVols :: InterpolatingSmile -> Vector Vol
smileStrikes :: InterpolatingSmile -> SortedVector Strike
smileTenor :: InterpolatingSmile -> YearFrac
smileForward :: InterpolatingSmile -> Forward
..} = StrikeInterpolation
-> SortedVector Strike -> Vector Vol -> Strike -> Vol
forall a k v.
InterpolatorV a k v =>
a -> SortedVector k -> Vector v -> k -> v
interpolateV StrikeInterpolation
smileInterpolation SortedVector Strike
smileStrikes Vector Vol
smileVols