(Acest articol a fost publicat pentru prima dată pe DataGeeekși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)
Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.
Prognoza piețelor financiare, cum ar fi indicele STOXX Europe 600, prezintă o provocare clasică de învățare automată: datele sunt în mod inerent zgomotoase, nestaționare și foarte susceptibile la evenimentele bruște ale pieței. Pentru a aborda acest lucru, apelăm la Învățare automată automată (AutoML)— în special cadrul puternic și scalabil oferit de H2O.ai și integrat în R modeltime ecosistem.
Acest articol disecă un flux de lucru MLOps complet, de la achiziția de date și ingineria caracteristicilor până la instruirea și evaluarea modelelor, dezvăluind modul în care un model de înaltă performanță, cu variație redusă a triumfat asupra volatilității pieței.
1. Conducta de prognoză: construirea unui model bogat în caracteristici
Strategia de bază a implicat convertirea problemei seriilor temporale univariate într-o problemă de regresie supravegheată prin generarea de variabile explicative puternice.
A. Date și împărțire
- Ţintă: Prețul de închidere al indicelui STOXX Europe 600.
- Interval de timp: 12 luni de date zilnice (se încheie în 2025-10-31).
- Validare: Un riguros împărțirea în serie de timp cumulativă a fost utilizat, ultimele 15 zile fiind rezervate pentru testare (
assess = "15 days"). Aceasta imită un scenariu de backtesting din lumea reală.
#Install Development Version of modeltime.h2o
devtools::install_github("business-science/modeltime.h2o", force = TRUE)
library(tidymodels)
library(modeltime.h2o)
library(tidyverse)
library(timetk)
#STOXX Europe 600
df_stoxx <-
tq_get("^STOXX", to = "2025-10-31") %>%
select(date, stoxx = close) %>%
mutate(id = "id") %>%
filter(date >= last(date) - months(12)) %>%
drop_na()
#Train/Test Splitting
splits <-
df_stoxx %>%
time_series_split(
assess = "15 days",
cumulative = TRUE
)
B. Ingineria caracteristicilor (Rețeta)
O rețetă robustă cu caracteristici (rec_spec) a fost conceput pentru a surprinde atât dependența de timp, cât și sezonalitatea:
- Întârzieri autoregresive (AR):
step_lag(stoxx, lag = 1:2)a inclus în mod explicit prețul zilei precedente și al celor două zile. Acesta este cea mai importantă caracteristică pentru a capta impulsul și inerția pieței. Am concluzionat că din analiza diagnosticului. - Sezonalitate:
step_fourier(date, period = 365.25, K = 1)a fost folosit pentru a capta efectele ciclice anuale și trimestriale subtile. - Efecte ale calendarului:
step_timeseries_signature(date)caracteristici generate precumdayofweekcare poate fi esențial pentru capturarea anomaliilor cunoscute ale pieței (de exemplu, „efectul luni”).
#Preprocessed data/Feature engineering rec_spec <- recipe(stoxx ~ date, data = training(splits)) %>% step_timeseries_signature(date) %>% step_lag(stoxx, lag = 1:2) %>% step_fourier(date, period = 365.25, K = 1) %>% step_dummy(all_nominal_predictors(), one_hot = TRUE) %>% step_zv(all_predictors()) %>% step_naomit(all_predictors()) #Train train_tbl <- rec_spec %>% prep() %>% bake(training(splits)) #Test test_tbl <- rec_spec %>% prep() %>% bake(testing(splits))
2. Execuție AutoML: Cursa împotriva cronometrului
Am inițiat procesul H2O AutoML folosind automl_reg() sub constrângeri stricte de resurse pentru a identifica rapid cel mai promițător tip de model:
| Parametru | Valoare | Motivație |
max_runtime_secs |
5 | Limită de timp pentru întregul proces. |
max_models |
3 | Limitați numărul de modele de bază de antrenat. |
exclude_algos |
"DeepLearning" |
Excluzând modelele costisitoare din punct de vedere computațional pentru prototipare rapidă. |
#Initialize H2O
h2o.init(
nthreads = -1,
ip = 'localhost',
port = 54321
)
#Model specification and fitting
model_spec <- automl_reg(mode = 'regression') %>%
set_engine(
engine = 'h2o',
max_runtime_secs = 5,
max_runtime_secs_per_model = 3,
max_models = 3,
nfolds = 5,
exclude_algos = c("DeepLearning"),
verbosity = NULL,
seed = 98765
)
model_fitted <-
model_spec %>%
fit(stoxx ~ ., data = train_tbl)
Aceste constrângeri strânse au dus la un clasament care conține doar algoritmii de bază cei mai rapidi și mai performanti:
| Rang | ID model | Algoritm | RMSE de validare încrucișată |
| 1 | DRF_1_AutoML… | Pădure Distribuită Aleatorie | 3,99 |
| 2 | GBM_2_AutoML… | Mașină de creștere a gradului | 4.20 |
| 3 | GLM_1_AutoML… | Model liniar generalizat | 5.50 |
#Evaluation model_fitted %>% automl_leaderboard()
3. Câștigătorul: Distributed Random Forest (DRF)
The Pădure aleatoare distribuită (DRF) a apărut ca lider în faza de validare încrucișată, demonstrând o capacitate superioară de generalizare cu cea mai mică eroare medie pătrată (RMSE) a 3,99.
De ce a câștigat DRF: avantajul variației reduse
Victoria modelului DRF asupra mașinii de creștere a gradului (GBM) cu o precizie în general mai mare este o ilustrare puternică a Compensație părtinire-varianță în date zgomotoase:
- Volatilitatea financiară implică variații mari: Indicele zilnic STOXX este în mod inerent zgomot și predispus la zgomot aleatoriu, o caracteristică a variației mari a modelului.
- Mecanismul de variație scăzută al DRF: Pe DRF se bazează Ambalare (agregare Bootstrap). Antrenează sute de arbori de decizie pe subseturi aleatorii de date și caracteristici. În mod crucial, atunci medii previziunile lor individuale.
- Acest proces de mediere în mod eficient anulează erorile aleatorii (zgomot) învățate de arbori individuali.
- Prin prioritizarea varianței scăzute, DRF a obținut un nivel ridicat stabil și de încredere fit, care era esențial pentru îmblânzirea zgomotului pieței. Creșterea mică a Prejudecății (care vine din mediere și netezire) a fost un preț mic de plătit pentru reducerea masivă a varianței care induce erori.
Performanța setului de testare
Calibrarea modelului DRF principal pe setul final de testare de 15 zile a confirmat performanța sa puternică:
| Metric | Valoarea setată a testului DRF | Interpretare |
| RMSE | 10.9 | Un salt de la RMSE de formare (3,99), tipic pentru datele financiare nestaționare, dar rămâne un rezultat puternic pentru predicția pieței. |
| R-pătrat | 0,537 | Modelul explică peste 53% din variația datelor de testare nevăzute. |
#Modeltime Table
model_tbl <-
modeltime_table(
model_fitted
)
#Calibration to test data
calib_tbl <-
model_tbl %>%
modeltime_calibrate(
new_data = test_tbl
)
#Measure Test Accuracy
calib_tbl %>%
modeltime_accuracy()
În sfârșit, putem construi intervale predictivecare sunt folosite ca un fel de Indicele de rezistență relativă (RSI) în acest context.
#Prediction Intervals
calib_tbl %>%
modeltime_forecast(
new_data = test_tbl,
actual_data = test_tbl
) %>%
plot_modeltime_forecast(
.interactive = FALSE,
.line_size = 1.5
) +
labs(title = "Modeling with Automated ML for the STOXX Europe 600",
subtitle = "Predictive Intervals of Distributed Random Forest Model",
y = "",
x = "") +
scale_y_continuous(labels = scales::label_currency(prefix = "€")) +
scale_x_date(labels = scales::label_date("%b %d"),
date_breaks = "2 days") +
theme_minimal(base_family = "Roboto Slab", base_size = 16) +
theme(plot.title = element_text(face = "bold", size = 16),
plot.subtitle = ggtext::element_markdown(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")


NOTĂ: Acest articol a fost generat cu sprijinul unui asistent AI. Conținutul și structura finală au fost revizuite și aprobate de autor.
