{-# 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
, :: 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