Skip to content

Commit 34e2314

Browse files
author
LuizFCDuarte
committed
✨ Implement stable Sarima
1 parent e9ab01f commit 34e2314

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

src/models/sarima.jl

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,7 @@ function fit!(
576576
Fl = typeofModelElements(model)
577577
isFitted(model) &&
578578
@info("The model has already been fitted. Overwriting the previous results")
579-
@assert objectiveFunction ["mae", "mse", "ml", "bilevel", "elastic_net"] "The objective function $objectiveFunction is not supported. Please use 'mae', 'mse', 'ml', 'bilevel' or 'elastic_net'"
579+
@assert objectiveFunction ["mae", "mse", "ml", "bilevel", "elastic_net", "stable"] "The objective function $objectiveFunction is not supported. Please use 'mae', 'mse', 'ml', 'bilevel', 'elastic_net' or 'stable'"
580580
if objectiveFunction == "elastic_net"
581581
@assert (!isnothing(alpha) || !isnothing(model.alpha)) "In elastic net objective function, alpha must be specified"
582582
end
@@ -808,6 +808,8 @@ function includeSolverParameters!(model::Model, isSilent::Bool = true)
808808
highs = optimizer_with_attributes(HiGHS.Optimizer)
809809
set_optimizer_attribute(model, "nlp_solver", ipopt)
810810
set_optimizer_attribute(model, "mip_solver", highs)
811+
elseif solver_name(model) == "Ipopt"
812+
set_optimizer_attribute(model, "warm_start_init_point", "yes")
811813
end
812814
end
813815

@@ -879,6 +881,14 @@ function objectiveFunctionDefinition!(
879881
elseif objectiveFunction == "bilevel"
880882
@objective(jumpModel, Min, sum(jumpModel[] .^ 2))
881883
set_time_limit_sec(jumpModel, 1.0)
884+
elseif objectiveFunction == "stable"
885+
lb = max(model.p, model.P * model.seasonality, model.q, model.Q * model.seasonality) + 1
886+
@variable(jumpModel, δ >= 0)
887+
@variable(jumpModel, u[lb:T] >= 0)
888+
@constraint(jumpModel, [t = lb:T], δ + u[t] >= jumpModel[][t]^2)
889+
890+
# 70% CVaR
891+
@objective(jumpModel, Min, 0.7*δ + sum(u[t] for t = lb:T))
882892
elseif objectiveFunction == "elastic_net"
883893
if length(parametersVectorExtended) == 0
884894
@objective(jumpModel, Min, sum(jumpModel[] .^ 2))
@@ -946,7 +956,7 @@ Optimizes the SARIMA model using the specified objective function.
946956
function optimizeModel!(jumpModel::Model, model::SARIMAModel, objectiveFunction::String)
947957
JuMP.optimize!(jumpModel)
948958

949-
if objectiveFunction == "elastic_net" && isnothing(model.lambda)
959+
if objectiveFunction == "elastic_net" && isnothing(model.lambda) && getHyperparametersNumber(model) > 1
950960
lambdaPath = getLambdaPath(values(model.y), getHyperparametersNumber(model))
951961
# Based on the lambda path, select the best lambda value according to the information
952962
# criteria BIC
@@ -1481,7 +1491,7 @@ function auto(
14811491
@assert informationCriteria ["aic", "aicc", "bic"]
14821492
@assert integrationTest ["kpss"]
14831493
@assert seasonalIntegrationTest ["seas", "ch", "ocsb"]
1484-
@assert objectiveFunction ["mae", "mse", "ml", "bilevel", "elastic_net"]
1494+
@assert objectiveFunction ["mae", "mse", "ml", "bilevel", "elastic_net", "stable"]
14851495
@assert objectiveFunction == "elastic_net" || isnothing(lambda)
14861496
@assert objectiveFunction == "elastic_net" || isnothing(alpha)
14871497
@assert searchMethod ["stepwise", "stepwiseNaive", "grid"]

0 commit comments

Comments
 (0)