Prezicerea prețurilor aurului: backtestarea modelelor ML

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(Acest articol a fost publicat pentru prima dată pe DateAgeeekși a contribuit cu drag la R-Bloggers). (Puteți raporta problema despre conținutul de pe această pagină aici)


Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.

Fitch proiectează o scădere de aproximativ 30% în aur în 2026. Elevarea războiului comercial și conflictul Israel-Iran poate susține această idee. Vom proiecta modul în care prețurile ar putea merge până la sfârșitul anului.

Vom folosi ModelTime.Resample Pachet pentru modelarea prognozei.

library(tidymodels)
library(modeltime)
library(modeltime.resample)
library(tidyverse)
library(tidyquant)
library(timetk)

#Gold Futures
df_gold <- 
  tq_get("GC=F") %>% 
  select(date, close) %>% 
  drop_na()


#Make a Cross-Validation Training Plan
resamples_tscv <- 
  time_series_cv(
  data        = df_gold,
  assess      = "6 months",
  initial     = "5 years",
  skip        = "1 years",
  slice_limit = 4
)

#Begin with a Cross Validation Strategy
resamples_tscv %>%
  tk_time_series_cv_plan() %>%
  plot_time_series_cv_plan(date,
                           close, 
                           .facet_ncol = 2, 
                           .interactive = FALSE)


#Model 1: auto_arima
model_arima <- 
  arima_reg() %>%
  set_engine(engine = "auto_arima") %>% 
  fit(close ~ date, data = df_gold)

#Model 2: prophet
model_prophet <- 
  prophet_reg() %>%
  set_engine(engine = "prophet") %>% 
  fit(close ~ date, data = df_gold)

#Model 3: glmnet
model_glmnet <- 
  linear_reg(penalty = 0.2) %>%
  set_engine("glmnet")

rec_glmnet <- 
  recipe(close ~ ., data = df_gold) %>% 
  step_mutate(date_num = as.numeric(date)) %>% 
  step_date(date, features = "month") %>% 
  step_rm(date) %>% 
  step_dummy(all_nominal_predictors(), one_hot = TRUE) %>% 
  step_normalize(all_numeric_predictors()) 

glmnet_fit <- 
  workflow() %>% 
  add_recipe(rec_glmnet) %>% 
  add_model(model_glmnet) %>% 
  fit(df_gold)
  
#Modeltime Table
gold_models <- 
  modeltime_table(
    model_arima,
    model_prophet,
    glmnet_fit
  )

#Generate Resample Predictions
resamples_fitted <- 
  gold_models %>%
  modeltime_fit_resamples(
    resamples = resamples_tscv,
    control   = control_resamples(verbose = FALSE)
  )

#Accuracy Table
resamples_fitted %>%
  modeltime_resample_accuracy(summary_fns = mean) %>%
  table_modeltime_accuracy(.interactive = FALSE)


#Calibration for the Prophet Model 
calibration_prophet <- 
  model_prophet %>% 
  modeltime_calibrate(new_data = df_gold)

#Accuracy of the finalized model
calibration_prophet %>%
  modeltime_accuracy(metric_set = metric_set(rmse, rsq, mape))


#Forecast Forward
calibration_prophet %>% 
  modeltime_forecast(h = "6 months", 
                     actual_data = df_gold %>% 
                                   filter(date>= as.Date("2025-01-01"))) %>%
  plot_modeltime_forecast(.interactive = FALSE,
                          .legend_show = FALSE,
                          .line_size = 1.5,
                          .color_lab = "",
                          .title = "Gold Futures") +
  
  labs(subtitle = "Predictive Intervals
ML Model") + scale_x_date(expand = expansion(mult = c(.1, .1)), labels = scales::label_date(format = "%b'%y")) + scale_y_continuous(labels = scales::label_currency()) + theme_minimal(base_family = "Roboto Slab", base_size = 20) + theme(legend.position = "none", plot.background = element_rect(fill = "azure", color = "azure"), plot.title = element_text(face = "bold"), axis.text = element_text(face = "bold"), plot.subtitle = ggtext::element_markdown(face = "bold"))

Potrivit modelului Profetului, prețul aurului pare a fi dificil să ajungă din nou la vârf până la sfârșitul anului.

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.