hasquant-0.7.0.0: test/example/QuantLib/Example/RiskyBond.hs
module QuantLib.Example.RiskyBond
(
Result(..)
, run
) where
import Data.List.NonEmpty(fromList)
import QuantLib.InterestRate
import QuantLib.Instrument
import QuantLib.Instrument.Bond
import QuantLib.PricingEngine
import QuantLib.Quote
import QuantLib.Context
import QuantLib.TermStructure.Credit hiding(hazardRate, defaultProbability)
import QuantLib.TermStructure.Yield
import QuantLib.Time.Calendar
import QuantLib.Time.Date
import QuantLib.Time.Schedule
data Result = Result
{ npvR :: Double
, cleanPriceR :: Double
}
-- ported from ~/Src/QuantLib/test-suite/bonds.cpp:testRiskyBondWithGivenDates
run :: IO Result
run = do
target <- calendar TARGET
usGovBond <- calendar UnitedStatesGovernmentBond
evalDate <- adjust target (22 `november` 2005) Following
setEvaluationDate $ Just evalDate
actual360dc <- dayCounter (Actual360 False)
actActBond <- dayCounter ActualActualBond
hazardRate <- simpleQuote 0.1
defaultProbability <- flatHazardRate (SettlementDays 0 target) hazardRate actual360dc
riskFreeRate <- simpleQuote 0.02
riskFree <- flatForward (ReferenceDate evalDate) riskFreeRate actual360dc Continuous Annual
sch1 <- schedule (Just $ 30 `november` 2004) (30 `november` 2008) (6, Months)
usGovBond Unadjusted Unadjusted Backward False Nothing Nothing
let recoveryRate = 0.4
faceAmount = 1000000.0
couponRates = [0.02875, 0.03, 0.03125, 0.0325]
bnd <- fixedRateBond 1 faceAmount sch1 (fromList couponRates) actActBond ModifiedFollowing
100.0 (Just $ 20 `november` 2004) usGovBond (0, Days) usGovBond Unadjusted False actActBond
>>= asBond
eng <- riskyBondEngine defaultProbability recoveryRate riskFree
asInstrument bnd >>= (`setPricingEngine` eng)
bNpv <- asInstrument bnd >>= npv
bCleanPrice <- currentCleanPrice bnd
return Result { npvR = bNpv, cleanPriceR = bCleanPrice }
-- vim: set ft=haskell ff=unix ts=8 sts=2 sw=2 et: