hasquant-0.7.0.0: test/hspec/QuantLib/Spec/Index/Commodity.hs
module QuantLib.Spec.Index.Commodity (spec) where
import Test.Hspec
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 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 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 index" ho usd bbl cal 1000 Nothing
let d0 = 2 `january` 2024 -- a TARGET business day (Jan 1st is a holiday)
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: