packages feed

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: