hasquant-0.8.0.0: test/hspec/QuantLib/Spec/Index/Commodity.hs
module QuantLib.Spec.Index.Commodity (spec) where
import Test.Hspec
import Control.Exception (bracket_)
import Data.List.NonEmpty(fromList)
import QuantLib.Time.Date
import QuantLib.Time.Calendar(calendar, CalendarConstructor(..))
import QuantLib.Time.Schedule(dayCounter, DayCounterConstructor(..))
import QuantLib.Index
import qualified QuantLib.Index.Commodity as CommodityIndex
import QuantLib.Commodity
import qualified QuantLib.TermStructure.Commodity as CommodityCurve
spec :: Spec
spec = do
describe "CommodityIndex" $ do
it "has no historical fixings and no forward price before any are added" $ do
ho <- commodityType "HO" "Heating Oil"
bbl <- barrelUnitOfMeasure
usd <- commoditySettingsCurrency
cal <- calendar TARGET
idx <- CommodityIndex.commodityIndex "HO empty index" ho usd bbl cal 1000 Nothing
CommodityIndex.isEmpty idx `shouldBe` True
it "forecasts a forward price from a forward curve" $ do
ho <- commodityType "HO" "Heating Oil"
bbl <- barrelUnitOfMeasure
usd <- commoditySettingsCurrency
cal <- calendar TARGET
dc <- dayCounter Actual365FixedStandard
let d0 = 1 `january` 2024
d1 = 1 `february` 2024
curve <- CommodityCurve.commodityCurve "HO curve" ho usd bbl cal (fromList [(d0, 70.0), (d1, 71.0)]) dc
idx <- CommodityIndex.commodityIndex "HO forward index" ho usd bbl cal 1000 (Just curve)
CommodityIndex.forwardPrice idx d0 `shouldReturn` 70.0
it "stores and returns historical fixings via QuantLib.Index's generic addFixing/fixing" $ do
ho <- commodityType "HO" "Heating Oil"
bbl <- barrelUnitOfMeasure
usd <- commoditySettingsCurrency
cal <- calendar TARGET
idx <- CommodityIndex.commodityIndex "HO fixing index" ho usd bbl cal 1000 Nothing
let d0 = 2 `january` 2024 -- a TARGET business day (Jan 1st is a holiday)
bracket_ (clearFixings idx) (clearFixings idx) $ do
addFixing idx d0 72.5 False
CommodityIndex.isEmpty idx `shouldBe` False
CommodityIndex.lastQuoteDate idx `shouldReturn` d0
fixing idx d0 False `shouldReturn` 72.5
-- vim: set ff=unix ts=8 sts=2 sw=2 et: