hasquant-0.5.0.2: test/example/QuantLib/Example/FxForward.hs
module QuantLib.Example.FxForward
(
Result(..)
, run
) where
import QuantLib.Currency
import QuantLib.Instrument
import QuantLib.Instrument.Forward
import qualified QuantLib.InterestRate as IR
import QuantLib.PricingEngine(discountingFxForwardEngine)
import QuantLib.Quote(simpleQuote)
import QuantLib.Settings(setEvaluationDate)
import QuantLib.TermStructure.Yield(flatForward)
import QuantLib.Time.Calendar
import QuantLib.Time.Date hiding(today)
import QuantLib.Time.Schedule(dayCounter, DayCounterConstructor(..), Frequency(..), TimeUnit(..))
data Result = Result
{ npvR :: Double
, fairForwardRateR :: Double
, npvSourceCurrencyR :: Double
, npvTargetCurrencyR :: Double
, npvAtFairRateR :: Double
} deriving Show
run :: IO Result
run = do
setEvaluationDate $ Just today
dc <- dayCounter Actual365FixedStandard
cal <- calendar Null
sourceQ <- simpleQuote sourceRate
targetQ <- simpleQuote targetRate
sourceCurve <- flatForward today sourceQ dc IR.Continuous Annual
targetCurve <- flatForward today targetQ dc IR.Continuous Annual
spotFxQ <- simpleQuote spotFx
eur <- currency EUR
usd <- currency USD
maturity <- advance cal today (1, Years) Unadjusted False
fwd <- fxForward sourceNominal eur targetNominal usd maturity True 2 cal
engine <- discountingFxForwardEngine sourceCurve targetCurve spotFxQ
setPricingEngine fwd engine
npvV <- npv fwd
ffr <- fairForwardRate fwd
npvSrc <- npvSourceCurrency fwd
npvTgt <- npvTargetCurrency fwd
-- exercise the rate-based constructor (fxForward'): a contract struck at
-- the just-computed fair rate must have ~0 NPV, an economic invariant
-- independent of the nominal-based constructor tested above.
fwdAtFairRate <- fxForward' sourceNominal eur usd ffr maturity True 2 cal
setPricingEngine fwdAtFairRate engine
npvFair <- npv fwdAtFairRate
return Result
{ npvR = npvV
, fairForwardRateR = ffr
, npvSourceCurrencyR = npvSrc
, npvTargetCurrencyR = npvTgt
, npvAtFairRateR = npvFair
}
where
today = 2 `january` 2024
sourceRate = 0.03
targetRate = 0.05
spotFx = 1.10
sourceNominal = 1000000.0
targetNominal = 1100000.0
-- vim: set ft=haskell ff=unix ts=8 sts=2 sw=2 et: