Ensemble Model for Gold Futures

[This article was first published on DataGeeek, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Goldman Sachs stated that if the FED’s reputation suffers, and investors move only a small portion of their bond holdings into gold, the price of gold could rise to nearly $5,000 an ounce.

But at least now, the ensemble model indicates that gold prices are in an overbought zone.

Source code:

library(tidymodels)
library(tidyverse)
library(modeltime)
library(modeltime.ensemble)
library(timetk)

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


#Splitting
splits <- 
  time_series_split(df_gold, 
                    assess = "30 days", 
                    cumulative = TRUE)

df_train <- training(splits)
df_test <- testing(splits)

#Recipe
rec_spec <- 
  recipe(close ~ ., data = df_train) %>% 
  step_timeseries_signature(date) %>% 
  step_fourier(date, period = 365, K = 5) %>%
  step_dummy(all_nominal_predictors(), one_hot = TRUE) %>% 
  step_zv(all_predictors()) %>% 
  step_normalize(all_numeric_predictors())


#Model 1 - Auto ARIMA
mod_spec_arima <- 
  arima_reg() %>%
  set_engine("auto_arima")

wflw_fit_arima <- 
  workflow() %>%
  add_model(mod_spec_arima) %>%
  add_recipe(rec_spec %>% step_rm(all_predictors(), -date)) %>%
  fit(df_train)

#Model 2 - Prophet
mod_spec_prophet <- 
  prophet_reg() %>%
  set_engine("prophet")

wflw_fit_prophet <- 
  workflow() %>%
  add_model(mod_spec_prophet) %>%
  add_recipe(rec_spec) %>%
  fit(df_train)

#Model 3: Boosted ARIMA
mod_arima_boosted <- 
  arima_boost(
    min_n = 2,
    learn_rate = 0.015
  ) %>%
  set_engine(engine = "auto_arima_xgboost")

wflw_fit_arima_boost <- 
  workflow() %>%
  add_model(mod_arima_boosted) %>%
  add_recipe(rec_spec) %>%
  fit(df_train)

#Modeltime Workflow for Ensemble Forecasting
df_models <- 
  modeltime_table(
    wflw_fit_arima,
    wflw_fit_prophet,
    wflw_fit_arima_boost
  )


#Make an Ensemble
ensemble_fit <- 
  df_models %>%
  ensemble_average(type = "mean")

#Calibration
calibration_tbl <- 
  modeltime_table(
    ensemble_fit
  ) %>%
  modeltime_calibrate(df_test)


#Accuracy
calibration_tbl %>%
  modeltime_accuracy() %>%
  table_modeltime_accuracy(
    .interactive = TRUE
  )


#Predictive intervals
calibration_tbl %>%
  modeltime_forecast(actual_data = df_test,
                     new_data = df_test) %>%
  plot_modeltime_forecast(.interactive = FALSE,
                          .legend_show = FALSE,
                          .line_size = 1.5,
                          .color_lab = "",
                          .title = "Gold Futures") +
  labs(subtitle = "<span style = 'color:dimgrey;'>Predictive Intervals</span> of the <span style = 'color:red;'>Ensemble Model</span>") + 
  scale_y_continuous(labels = scales::label_currency()) +
  scale_x_date(labels = scales::label_date("%b %d"),
               date_breaks = "4 days") +
  theme_minimal(base_family = "Roboto Slab", base_size = 16) +
  theme(plot.subtitle = ggtext::element_markdown(face = "bold"),
        plot.title = element_text(face = "bold"),
        plot.background = element_rect(fill = "azure", color = "azure"),
        panel.background = element_rect(fill = "snow", color = "snow"),
        axis.text = element_text(face = "bold"),
        axis.text.x = element_text(angle = 45, 
                                   hjust = 1, 
                                   vjust = 1),
        legend.position = "none")


To leave a comment for the author, please follow the link and comment on their blog: DataGeeek.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)