packages feed

hasquant-0.5.0.2: test/example/QuantLib/Example/RiskyBond.hs

module QuantLib.Example.RiskyBond
  (
    Result(..)
  , run
  ) where
import QuantLib.InterestRate
import QuantLib.Instrument
import QuantLib.Instrument.Bond hiding(bond)
import QuantLib.PricingEngine
import QuantLib.Quote
import QuantLib.Settings
import QuantLib.TermStructure.Credit hiding(hazardRate, defaultProbability)
import QuantLib.TermStructure.Yield
import QuantLib.Time.Calendar
import QuantLib.Time.Date hiding(today)
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
  today <- adjust target (22 `november` 2005) Following
  setEvaluationDate $ Just today

  actual360dc <- dayCounter (Actual360 False)
  actActBond <- dayCounter ActualActualBond

  hazardRate <- simpleQuote 0.1
  defaultProbability <- flatHazardRate' 0 target hazardRate actual360dc

  riskFreeRate <- simpleQuote 0.02
  riskFree <- flatForward today 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]

  bond <- fixedRateBond 1 faceAmount sch1 couponRates actActBond ModifiedFollowing
            100.0 (Just $ 20 `november` 2004) usGovBond (0, Days) usGovBond Unadjusted False actActBond
            >>= asBond

  eng <- riskyBondEngine defaultProbability recoveryRate riskFree
  asInstrument bond >>= (`setPricingEngine` eng)

  bNpv <- asInstrument bond >>= npv
  bCleanPrice <- currentCleanPrice bond

  return Result { npvR = bNpv, cleanPriceR = bCleanPrice }

-- vim: set ft=haskell ff=unix ts=8 sts=2 sw=2 et: