HQu-0.0.0.0: src/Q/Stats/Arima.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Q.Stats.Arima where
import Control.Monad.State
import Data.Foldable
import Data.Functor.Identity
import Data.Random
import Data.Random.Source
import Data.RVar
import Data.Time
import Numeric.LinearAlgebra
import Q.Stats.TimeSeries
import System.Random.Mersenne.Pure64
import Data.Random.Distribution
import Data.Random.Distribution.Poisson
import Data.Random.Distribution.T
import Data.RVar
import Statistics.Sample
data Ewma d = Ewma Double d
--ll :: (Ewma d) -> [DataPoint Double] -> (Double -> Double)
ll (Ewma lambda d) datapoints = mapM ll_ datapoints where
ll_ :: DataPoint LocalTime Double -> State Double Double
ll_ x@(DataPoint _ v) = do
vart <- get
let vart2 = lambda * vart + (1 - lambda) * v * v
put vart2
return $ logPdf d (sqrt (v * v / vart))
--forecast :: (Distribution d Double) => (Ewma d) -> Int ->
forecast :: forall d. (Distribution d Double) => Ewma (d Double) -> StateT Double RVar Double
forecast (Ewma lambda d) = do
y <- lift $ rvar d
vart <- get
let vart2 = lambda * vart + (1 - lambda) * y * y
put vart2
return (y * sqrt vart)
--forecastN :: Distribution d Double => Ewma (d Double) -> Int -> Double -> RVar ([Double], Double)
forecastN ewma var0 n = sample $ runStateT (replicateM n (forecast ewma)) var0