diff --git a/lib/github.com/monoid-gmbh/kid-annexes/base.fut b/lib/github.com/monoid-gmbh/kid-annexes/base.fut index 660e6cf..1485404 100644 --- a/lib/github.com/monoid-gmbh/kid-annexes/base.fut +++ b/lib/github.com/monoid-gmbh/kid-annexes/base.fut @@ -20,6 +20,9 @@ let market_risk_measure (v:f64): i64 = type moments = (f64,f64,f64,f64,f64,f64,f64) type scenario = [4]f64 +-- | Empty scenario array +let empty: scenario = [f64.nan,f64.nan,f64.nan,f64.nan] + -- | Log Returns (Annex II, 22a) let returns [n] (v: [n]f64): [n-1]f64 = map2 (/) (tail v) (init v) |> map f64.log diff --git a/lib/github.com/monoid-gmbh/kid-annexes/category3.fut b/lib/github.com/monoid-gmbh/kid-annexes/category3.fut index 20cb39a..7d34ce1 100644 --- a/lib/github.com/monoid-gmbh/kid-annexes/category3.fut +++ b/lib/github.com/monoid-gmbh/kid-annexes/category3.fut @@ -46,7 +46,7 @@ let var_equivalent_volatility (p: f64) (t: f64) = (f64.sqrt(3.842-2*f64.log(p))-1.96)/(f64.sqrt t) -- | Category 3 simulations for MRM (Annex II) -let category3 [n] [l] (g: rng) (t: i64) (p: [n][t]f64 -> f64) (v: [n][l]f64): (rng,f64,f64,i64,[]scenario) = +let category3 [n] [l] (g: rng) (t: i64) (p: [n][t]f64 -> f64) (v: [n][l]f64): (rng,f64,f64,i64,[3]scenario) = -- Initial values let s0: [n]f64 = transpose v |> head @@ -104,18 +104,15 @@ let category3 [n] [l] (g: rng) (t: i64) (p: [n][t]f64 -> f64) (v: [n][l]f64): (r , payoff path_scen |> traverse xs[3] |> percentile 90 ] in (join_rng h1, scenarios_ihp) - in -- FIXME: introduction of size types broke intermediate holding periods - -- - -- if (y > 1) then - -- if (y > 3) then - -- let g1 = split_rng 2 g0 - -- let (g2, scenarios_ihps) = unzip - -- [ intermediate_holding_period g1[0] (f64.to_i64 days) -- 1 year - -- , intermediate_holding_period g1[1] (f64.ceil y/2 |> f64.to_i64) ] -- half rhp - -- in (join_rng g2,var,vev,mrm,[scenarios_rhp] ++ scenarios_ihps) - - -- else let (g1, scenarios_ihps) = intermediate_holding_period g0 (f64.to_i64 days) -- 1 year - -- in (g1,var,vev,mrm,[scenarios_rhp] ++ [scenarios_ihps]) - - -- else - (g0,var,vev,mrm,[scenarios_rhp]) + in if (y > 1) then + if (y > 3) then + let g1 = split_rng 2 g0 + let (g2, scenarios_ihps) = unzip + [ intermediate_holding_period g1[0] (f64.to_i64 days) -- 1 year + , intermediate_holding_period g1[1] (f64.ceil y/2 |> f64.to_i64) ] -- half rhp + in (join_rng g2,var,vev,mrm,[scenarios_rhp] ++ scenarios_ihps :> [3]scenario) + + else let (g1, scenarios_ihp) = intermediate_holding_period g0 (f64.to_i64 days) -- 1 year + in (g1,var,vev,mrm,[scenarios_rhp] ++ [scenarios_ihp] ++ [empty] :> [3]scenario) + + else (g0,var,vev,mrm,[scenarios_rhp] ++ [empty] ++ [empty] :> [3]scenario)