diff --git a/aieng-forecasting/aieng/forecasting/data/__init__.py b/aieng-forecasting/aieng/forecasting/data/__init__.py index dc791475..d49b8015 100644 --- a/aieng-forecasting/aieng/forecasting/data/__init__.py +++ b/aieng-forecasting/aieng/forecasting/data/__init__.py @@ -1,8 +1,33 @@ -"""Data service: adapters, series store, and cutoff enforcement.""" +"""Data service: adapters, series store, cutoff enforcement, and feature builders.""" from aieng.forecasting.data.context import ForecastContext +from aieng.forecasting.data.features import ( + StaticFrameAdapter, + apply_one_business_day_feature_lag, + business_daily_expand_from_releases, + business_daily_ffill, + canonical_three_col, + drop_weekend_timestamp_rows, + log_ratio_level_feature, + to_level_feature_from_daily, + to_log_return_feature, +) from aieng.forecasting.data.models import SeriesMetadata, SeriesRecord from aieng.forecasting.data.service import DataService -__all__ = ["DataService", "ForecastContext", "SeriesMetadata", "SeriesRecord"] +__all__ = [ + "DataService", + "ForecastContext", + "SeriesMetadata", + "SeriesRecord", + "StaticFrameAdapter", + "apply_one_business_day_feature_lag", + "business_daily_expand_from_releases", + "business_daily_ffill", + "canonical_three_col", + "drop_weekend_timestamp_rows", + "log_ratio_level_feature", + "to_level_feature_from_daily", + "to_log_return_feature", +] diff --git a/aieng-forecasting/aieng/forecasting/data/features.py b/aieng-forecasting/aieng/forecasting/data/features.py new file mode 100644 index 00000000..afa4725b --- /dev/null +++ b/aieng-forecasting/aieng/forecasting/data/features.py @@ -0,0 +1,191 @@ +"""Reusable, leak-safe covariate feature builders. + +These pure-pandas helpers turn raw market/macro series into the canonical +``(timestamp, value, released_at)`` format consumed by +:class:`~aieng.forecasting.data.service.DataService`, applying the +point-in-time discipline that keeps backtests honest: + +- **One-business-day feature lag** (:func:`apply_one_business_day_feature_lag`): + the feature value at session *t* only uses information through *t-1*. +- **Business-day forward-fill** (:func:`business_daily_ffill`): reindex a daily + series onto a complete Mon–Fri calendar, carrying the last observation across + holidays the covariate's market observed but the target's did not. Without + this, a covariate can end a few days short of a forecast origin and Darts + raises ``past_covariates are not long enough``. +- **Release-driven daily expansion** (:func:`business_daily_expand_from_releases`): + expand a low-frequency series (e.g. monthly macro) onto a daily calendar using + its ``released_at`` stamps, so a value only becomes visible once published. + +They are deliberately instrument-agnostic — the same builders serve the S&P 500 +and WTI crude oil experiments — so covariate-panel construction stays a single +source of truth. Every builder returns a frame with exactly ``timestamp``, +``value`` and ``released_at`` columns; the :class:`DataService` cutoff then +guarantees predictor context views never include unavailable rows. +""" + +from __future__ import annotations + +import numpy as np +import pandas as pd +from aieng.forecasting.data.adapters.base import BaseAdapter + + +class StaticFrameAdapter(BaseAdapter): + """Adapter that returns a precomputed canonical DataFrame. + + Used to register a feature frame that has already been transformed (lagged, + differenced, expanded) by the builders in this module. + """ + + def __init__(self, frame: pd.DataFrame) -> None: + self._frame = frame.copy() + + def fetch(self) -> pd.DataFrame: + """Return a copy of the precomputed frame.""" + return self._frame.copy() + + +def canonical_three_col(df: pd.DataFrame) -> pd.DataFrame: + """Coerce to a tidy, tz-naive ``(timestamp, value, released_at)`` frame.""" + out = df.copy() + out["timestamp"] = pd.to_datetime(out["timestamp"]).dt.tz_localize(None) + out["released_at"] = pd.to_datetime(out["released_at"]).dt.tz_localize(None) + out["value"] = pd.to_numeric(out["value"], errors="coerce") + out = out.dropna(subset=["timestamp", "released_at", "value"]).sort_values("timestamp") + return out[["timestamp", "value", "released_at"]].reset_index(drop=True) + + +def drop_weekend_timestamp_rows(df: pd.DataFrame) -> pd.DataFrame: + r"""Remove rows whose ``timestamp`` is Saturday or Sunday. + + Some FRED daily series (notably effective fed funds ``DFF``) include weekend + dates in early vintages. Forecast tasks and Darts regression models use + ``freq="B"`` (pandas Mon--Fri business days); ``TimeSeries.from_dataframe`` + with ``fill_missing_dates=True`` then raises if any input stamp is not on + that grid. + """ + if df.empty: + return df + x = df.copy() + ts = pd.to_datetime(x["timestamp"]) + return x.loc[ts.dt.dayofweek < 5].reset_index(drop=True) + + +def to_log_return_feature(close_df: pd.DataFrame) -> pd.DataFrame: + """Close-to-close log return of a daily price series. + + ``released_at`` is set to the next business day after the session: a daily + close is known after market close, so the model only sees it from the + following business day. + """ + out = close_df.copy() + out = out[out["value"] > 0].reset_index(drop=True) + out["value"] = np.log(out["value"] / out["value"].shift(1)) + out = out.dropna(subset=["value"]).reset_index(drop=True) + out["released_at"] = pd.to_datetime(out["timestamp"]) + pd.offsets.BDay(1) + return canonical_three_col(out[["timestamp", "value", "released_at"]]) + + +def to_level_feature_from_daily(close_df: pd.DataFrame) -> pd.DataFrame: + """Daily level with a next-business-day ``released_at`` (no transformation).""" + out = close_df.copy() + out["released_at"] = pd.to_datetime(out["timestamp"]) + pd.offsets.BDay(1) + return canonical_three_col(out[["timestamp", "value", "released_at"]]) + + +def business_daily_expand_from_releases( + sparse_df: pd.DataFrame, + *, + start: str, + end: str | None, +) -> pd.DataFrame: + """Expand a release-stamped series onto a daily business calendar. + + Each value becomes visible on its ``released_at`` date and is carried + forward until the next release. Used for low-frequency macro series whose + publication lags the reference month. + """ + x = sparse_df.copy().sort_values("released_at").reset_index(drop=True) + lo = pd.Timestamp(start) + hi = pd.Timestamp(end) if end is not None else x["released_at"].max() + pd.offsets.BDay(1) + if hi < lo: + return pd.DataFrame(columns=["timestamp", "value", "released_at"]) + daily_idx = pd.bdate_range(lo, hi) + rel = x.set_index("released_at")["value"].reindex(daily_idx).ffill() + out = rel.reset_index() + out.columns = ["timestamp", "value"] + out = out.dropna(subset=["value"]).reset_index(drop=True) + out["released_at"] = out["timestamp"] + return canonical_three_col(out) + + +def apply_one_business_day_feature_lag(df: pd.DataFrame) -> pd.DataFrame: + """Shift values so the feature at *t* only uses information through *t-1*.""" + x = df.copy().sort_values("timestamp").reset_index(drop=True) + x["value"] = x["value"].shift(1) + x = x.dropna(subset=["value"]).reset_index(drop=True) + # After lagging, the shifted value is available at row timestamp. + x["released_at"] = x["timestamp"] + return canonical_three_col(x) + + +def business_daily_ffill(df: pd.DataFrame) -> pd.DataFrame: + """Reindex a daily feature onto a complete business-day calendar, forward-filling. + + Daily market series follow different holiday calendars (e.g. the bond market + closes on Columbus Day and Veterans Day while equities trade). Without this, + such a covariate ends a few days short of a target origin and Darts raises + ``past_covariates are not long enough``, silently skipping those origins for + the covariate-using models. + + Forward-filling carries the last observed value across those gaps (and onto + every Mon–Fri business day), so the covariate is defined wherever the target + is. It is leak-safe: it only repeats already-known past information, and the + one-business-day feature lag is still applied afterwards. + """ + if df.empty: + return df + x = df.copy().sort_values("timestamp").reset_index(drop=True) + idx = pd.bdate_range(x["timestamp"].min(), x["timestamp"].max()) + filled = x.set_index("timestamp")["value"].reindex(idx).ffill() + out = filled.reset_index() + out.columns = ["timestamp", "value"] + out = out.dropna(subset=["value"]).reset_index(drop=True) + out["released_at"] = out["timestamp"] + return canonical_three_col(out) + + +def log_ratio_level_feature( + numerator_df: pd.DataFrame, + denominator_df: pd.DataFrame, +) -> pd.DataFrame: + """``log(numerator / denominator)`` as a daily level feature. + + Both inputs are daily ``(timestamp, value)`` close frames. They are inner- + joined on ``timestamp`` (only sessions both series traded), the log ratio is + taken, then forward-filled onto a complete business-day calendar and lagged + one business day. Useful for term-structure / pair spreads such as the + USL/USO oil-futures contango proxy. + """ + num = numerator_df[["timestamp", "value"]].copy() + den = denominator_df[["timestamp", "value"]].copy() + merged = pd.merge(num, den, on="timestamp", how="inner", suffixes=("_num", "_den")) + merged = merged[(merged["value_num"] > 0) & (merged["value_den"] > 0)].reset_index(drop=True) + merged["value"] = np.log(merged["value_num"] / merged["value_den"]) + merged["released_at"] = pd.to_datetime(merged["timestamp"]) + pd.offsets.BDay(1) + frame = canonical_three_col(merged[["timestamp", "value", "released_at"]]) + frame = business_daily_ffill(frame) + return apply_one_business_day_feature_lag(frame) + + +__all__ = [ + "StaticFrameAdapter", + "apply_one_business_day_feature_lag", + "business_daily_expand_from_releases", + "business_daily_ffill", + "canonical_three_col", + "drop_weekend_timestamp_rows", + "log_ratio_level_feature", + "to_level_feature_from_daily", + "to_log_return_feature", +] diff --git a/aieng-forecasting/aieng/forecasting/methods/agentic/predictor.py b/aieng-forecasting/aieng/forecasting/methods/agentic/predictor.py index 502a7617..60fd086a 100644 --- a/aieng-forecasting/aieng/forecasting/methods/agentic/predictor.py +++ b/aieng-forecasting/aieng/forecasting/methods/agentic/predictor.py @@ -235,10 +235,20 @@ def __init__( def predictor_id(self) -> str: """Stable identifier for this predictor. - This is used to identify the predictor in the evaluation results. + This is used to identify the predictor in the evaluation results — and, + via the artefact cache, as a filename component. The model name is folded + in so the same agent run on different models yields distinct ids (and + distinct cache entries). When the proxy is active the agent's ``model`` is + a ``BaseLlm`` wrapper (e.g. ``LiteLlm``) rather than a bare string; in that + case we unwrap its nested ``.model`` (e.g. ``"openai/gemini-3.5-flash"``) + and keep the bare model name. Non-string models with no usable name are + omitted rather than leaking a noisy ``repr`` into the id. """ model = getattr(self._agent, "model", None) - model_suffix = f"_{model}" if isinstance(model, str) else "" + if not isinstance(model, str): + inner = getattr(model, "model", None) + model = inner if isinstance(inner, str) else None + model_suffix = f"_{model.rsplit('/', 1)[-1]}" if model else "" return f"agent_predictor_{self._agent.name}{model_suffix}_{self._forecast_output_modality}" def predict(self, task: ForecastingTask, context: ForecastContext) -> list[Prediction]: diff --git a/implementations/boc_rate_decisions/02_boc_rate_direction_experiment.ipynb b/implementations/boc_rate_decisions/02_boc_rate_direction_experiment.ipynb index cda8ea0e..9a53fd46 100644 --- a/implementations/boc_rate_decisions/02_boc_rate_direction_experiment.ipynb +++ b/implementations/boc_rate_decisions/02_boc_rate_direction_experiment.ipynb @@ -428,7 +428,46 @@ } }, "outputs": [], - "source": "from aieng.forecasting.methods import CategoricalFrequencyPredictor\nfrom boc_rate_decisions.analyst_agent import build_boc_agent_predictor, build_boc_basic_config\nfrom boc_rate_decisions.predictors import build_llmp_direction\n\n\n# Model for the LLM-based predictors (LLMP + agent). Flash-lite is the fast/cheap\n# default so a first Run All stays light; gemini-3.5-flash reasons noticeably\n# better at higher cost/latency. Switch by commenting the two lines below.\nMODEL = \"gemini-3.1-flash-lite-preview\" # fast/cheap default\n# MODEL = \"gemini-3.5-flash\" # stronger reasoning, higher cost/slower\n\nclimatology = CategoricalFrequencyPredictor()\nlogistic = BoCLogisticPredictor() # dispatches to multinomial on categorical tasks\nllmp = build_llmp_direction(model=MODEL, reasoning_effort=None)\nagent = build_boc_agent_predictor(build_boc_basic_config(model=MODEL))\n\n# News-grounded agent variant (web search with temporal cutoffs). Leakage\n# risk is higher on historical dates; enable deliberately, not by default.\n# from boc_rate_decisions.analyst_agent import build_boc_news_config\n# agent_news = build_boc_agent_predictor(build_boc_news_config(model=MODEL))\n\nall_predictors = [climatology, logistic, llmp, agent]\n\nPREDICTOR_COLORS: dict[str, str] = {\n climatology.predictor_id: \"#7f7f7f\",\n logistic.predictor_id: \"#1f77b4\",\n llmp.predictor_id: \"#d62728\",\n agent.predictor_id: \"#ff7f0e\",\n}\nPREDICTOR_LABELS: dict[str, str] = {\n climatology.predictor_id: \"Climatology\",\n logistic.predictor_id: \"Multinomial logistic\",\n llmp.predictor_id: \"LLMP direction\",\n agent.predictor_id: \"Agent (basic)\",\n}\n\nfor p in all_predictors:\n print(f\" {p.predictor_id}\")" + "source": [ + "from aieng.forecasting.methods import CategoricalFrequencyPredictor\n", + "from boc_rate_decisions.analyst_agent import build_boc_agent_predictor, build_boc_basic_config\n", + "from boc_rate_decisions.predictors import build_llmp_direction\n", + "\n", + "\n", + "# Model for the LLM-based predictors (LLMP + agent). Flash-lite is the fast/cheap\n", + "# default so a first Run All stays light; gemini-3.5-flash reasons noticeably\n", + "# better at higher cost/latency. Switch by commenting the two lines below.\n", + "MODEL = \"gemini-3.1-flash-lite-preview\" # fast/cheap default\n", + "# MODEL = \"gemini-3.5-flash\" # stronger reasoning, higher cost/slower\n", + "\n", + "climatology = CategoricalFrequencyPredictor()\n", + "logistic = BoCLogisticPredictor() # dispatches to multinomial on categorical tasks\n", + "llmp = build_llmp_direction(model=MODEL, reasoning_effort=None)\n", + "agent = build_boc_agent_predictor(build_boc_basic_config(model=MODEL))\n", + "\n", + "# News-grounded agent variant (web search with temporal cutoffs). Leakage\n", + "# risk is higher on historical dates; enable deliberately, not by default.\n", + "# from boc_rate_decisions.analyst_agent import build_boc_news_config\n", + "# agent_news = build_boc_agent_predictor(build_boc_news_config(model=MODEL))\n", + "\n", + "all_predictors = [climatology, logistic, llmp, agent]\n", + "\n", + "PREDICTOR_COLORS: dict[str, str] = {\n", + " climatology.predictor_id: \"#7f7f7f\",\n", + " logistic.predictor_id: \"#1f77b4\",\n", + " llmp.predictor_id: \"#d62728\",\n", + " agent.predictor_id: \"#ff7f0e\",\n", + "}\n", + "PREDICTOR_LABELS: dict[str, str] = {\n", + " climatology.predictor_id: \"Climatology\",\n", + " logistic.predictor_id: \"Multinomial logistic\",\n", + " llmp.predictor_id: \"LLMP direction\",\n", + " agent.predictor_id: \"Agent (basic)\",\n", + "}\n", + "\n", + "for p in all_predictors:\n", + " print(f\" {p.predictor_id}\")" + ] }, { "cell_type": "markdown", @@ -1008,7 +1047,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/implementations/boc_rate_decisions/03_rationale_alignment.ipynb b/implementations/boc_rate_decisions/03_rationale_alignment.ipynb index f5923ad8..af38490f 100644 --- a/implementations/boc_rate_decisions/03_rationale_alignment.ipynb +++ b/implementations/boc_rate_decisions/03_rationale_alignment.ipynb @@ -815,7 +815,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/implementations/boc_rate_decisions/99_starter_agent.ipynb b/implementations/boc_rate_decisions/99_starter_agent.ipynb index b2a37a6c..82f9ceb5 100644 --- a/implementations/boc_rate_decisions/99_starter_agent.ipynb +++ b/implementations/boc_rate_decisions/99_starter_agent.ipynb @@ -238,7 +238,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/implementations/energy_oil_forecasting/04_systematic_backtest_eval.ipynb b/implementations/energy_oil_forecasting/04_systematic_backtest_eval.ipynb index 3618c94b..15dd6c72 100644 --- a/implementations/energy_oil_forecasting/04_systematic_backtest_eval.ipynb +++ b/implementations/energy_oil_forecasting/04_systematic_backtest_eval.ipynb @@ -15,11 +15,17 @@ "3. Select the **top contender configurations** based solely on 2025\n", " historical performance (no peeking at 2026).\n", "4. Let the contenders compete in the **2026 Protected Arena**\n", - " (`energy_oil_eval.yaml`) during the geopolitical price shock —\n", - " measuring adaptive real-time responsiveness and calibration.\n", + " (`energy_oil_eval.yaml`) across the geopolitical price shock and its\n", + " aftermath — measuring adaptive real-time responsiveness and calibration.\n", + " The eval window runs through the most recent origin whose 21-business-day\n", + " horizon still resolves against cached data (see `scripts/fetch_wti.py`).\n", "\n", - "All predictors use the same `Predictor` interface introduced in Notebooks 1–2.\n", - "Agent configs are imported from `energy_oil_forecasting.analyst_agent`." + "The line-up spans three families behind one `Predictor` interface: **baselines**\n", + "(Naive, AutoARIMA), **numerical ML** (LightGBM ± a leak-safe covariate panel),\n", + "and **LLM/agent** methods (LLM-process forecasters and a news-reading analyst\n", + "agent) — the last run on *both* project models, `gemini-3.1-flash-lite-preview`\n", + "and `gemini-3.5-flash`. Every predictor is one toggle line in the registry in\n", + "Section 2. Agent configs come from `energy_oil_forecasting.analyst_agent`." ] }, { @@ -33,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 7, "id": "4760f015", "metadata": {}, "outputs": [ @@ -41,15 +47,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "⚡ SMOKE MODE — AGENT_MODEL='gemini-3.1-flash-lite-preview' LLMP_MODEL='gemini-3.1-flash-lite-preview' N_SAMPLES=1\n", + "📊 FULL MODE — MODELS=['gemini-3.1-flash-lite-preview', 'gemini-3.5-flash'] N_SAMPLES=3\n", + "Covariates registered (7): brent_log_ret_1b_l1b, natgas_log_ret_1b_l1b, gasoline_log_ret_1b_l1b, gold_log_ret_1b_l1b, dollar_index_log_ret_1b_l1b, oil_curve_contango_l1b, vix_level_l1b\n", "\n", "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n", "LOADED SPECIFICATIONS:\n", "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n", - "MultiTargetBacktestSpec (spec_id=energy_oil_smoke)\n", - " description: Two-origin smoke backtest for local and CI testing of the NB04 pipeline. Uses the same tasks, horizons, and warmup as energy_oil_backtest but with only 2 weekly origins so the full notebook can be exercised without burning tokens on 51 × 5 predictor evaluations.\n", - " start: 2025-06-02 00:00:00\n", - " end: 2025-06-09 00:00:00\n", + "MultiTargetBacktestSpec (spec_id=energy_oil_backtest)\n", + " description: Weekly rolling backtest in 2025 for daily WTI crude oil price forecasting. Evaluates trajectory forecasts (5, 10, 21 business days) with CRPS/MAE and binary up-shock forecasts (climb > $5 in 5 business days) with Brier Score. Used to select the top contender models.\n", + " start: 2025-01-06 00:00:00\n", + " end: 2025-12-22 00:00:00\n", " stride: 5\n", " warmup: 250\n", " tasks: 1\n", @@ -66,10 +73,10 @@ " units: USD/bbl\n", " frequency: B\n", "\n", - "MultiTargetBacktestSpec (spec_id=energy_oil_eval_smoke)\n", - " description: Two-origin smoke evaluation for local and CI testing of the NB04 pipeline. Uses the same tasks, horizons, warmup, and geopolitical period as energy_oil_eval but with only 2 origins to keep cost negligible.\n", + "MultiTargetBacktestSpec (spec_id=energy_oil_eval)\n", + " description: Prospective/out-of-sample evaluation period in 2026 for daily WTI crude oil. Evaluates selected contender models on 18 weekly origins from the early 2026 geopolitical price shock through its aftermath, to measure adaptive real-time forecasting performance.\n", " start: 2026-02-02 00:00:00\n", - " end: 2026-02-09 00:00:00\n", + " end: 2026-06-01 00:00:00\n", " stride: 5\n", " warmup: 250\n", " tasks: 1\n", @@ -101,7 +108,11 @@ " cached_multi_backtest,\n", " describe_spec,\n", ")\n", - "from energy_oil_forecasting.data import build_wti_service\n", + "from aieng.forecasting.models import ADVANCED_MODEL, LITE_MODEL\n", + "from energy_oil_forecasting.data import (\n", + " DEFAULT_WTI_COVARIATE_SERIES_IDS,\n", + " build_wti_multivariate_service,\n", + ")\n", "\n", "\n", "warnings.filterwarnings(\"ignore\")\n", @@ -110,19 +121,29 @@ "# Set SMOKE_TEST = True to run a 2-origin, 1-sample version of the notebook\n", "# for fast local development and end-to-end CI testing. The full specs run\n", "# 51 backtest + 8 eval origins; smoke runs 2 + 2.\n", - "SMOKE_TEST = True\n", + "SMOKE_TEST = False\n", "\n", - "# ── Model selection ───────────────────────────────────────────────────────────\n", - "# Two project models: \"gemini-3.1-flash-lite-preview\" (lite/default) and\n", - "# \"gemini-3.5-flash\" (advanced). Change these two lines to swap models for the\n", - "# whole notebook (bare proxy names — no \"gemini/\" prefix).\n", - "AGENT_MODEL = \"gemini-3.1-flash-lite-preview\"\n", - "LLMP_MODEL = \"gemini-3.1-flash-lite-preview\"\n", + "# ── Models ────────────────────────────────────────────────────────────────────\n", + "# The project standardises on two Vector-proxy models. Every LLM and agent\n", + "# predictor below is run once per model so we can compare them head-to-head.\n", + "# (bare proxy names — no \"gemini/\" prefix)\n", + "MODELS = [LITE_MODEL, ADVANCED_MODEL] # \"gemini-3.1-flash-lite-preview\", \"gemini-3.5-flash\"\n", "\n", "# ── Derived settings (do not edit below) ─────────────────────────────────────\n", - "N_SAMPLES = 1 if SMOKE_TEST else 3 # trajectories per LLMP call\n", + "N_SAMPLES = 1 if SMOKE_TEST else 3 # trajectories per LLMP-Sampled call\n", + "\n", + "# LightGBM hyperparameters (shared by the univariate and +covariate variants).\n", + "LAGS = 21 # one trading month of lagged target/covariate history\n", + "NUM_SAMPLES_LGBM = 100 if SMOKE_TEST else 200 # Monte-Carlo draws for quantiles\n", + "LGBM_KWARGS = {\"num_threads\": 1, \"n_jobs\": 1, \"verbosity\": -1} # deterministic, quiet\n", "\n", - "data_service = build_wti_service()\n", + "# Data service: WTI target + a leak-safe covariate panel (all Yahoo Finance —\n", + "# Brent, natural gas, gasoline, gold, USD index, the USL/USO futures-curve\n", + "# contango proxy, and VIX). Non-covariate predictors simply ignore the extras,\n", + "# so one service feeds the whole leaderboard. Unavailable tickers are skipped\n", + "# with a warning, so this still runs offline / under partial connectivity.\n", + "data_service = build_wti_multivariate_service()\n", + "COVARIATES = [c for c in DEFAULT_WTI_COVARIATE_SERIES_IDS if c in set(data_service.series_ids)]\n", "\n", "spec_dir = Path(energy_oil_forecasting.__file__).parent / \"specs\"\n", "if SMOKE_TEST:\n", @@ -135,9 +156,8 @@ "with open(spec_dir / eval_file) as f:\n", " eval_spec = MultiTargetBacktestSpec.model_validate(yaml.safe_load(f))\n", "\n", - "print(\n", - " f\"{'⚡ SMOKE MODE' if SMOKE_TEST else '📊 FULL MODE'} — AGENT_MODEL={AGENT_MODEL!r} LLMP_MODEL={LLMP_MODEL!r} N_SAMPLES={N_SAMPLES}\"\n", - ")\n", + "print(f\"{'⚡ SMOKE MODE' if SMOKE_TEST else '📊 FULL MODE'} — MODELS={MODELS} N_SAMPLES={N_SAMPLES}\")\n", + "print(f\"Covariates registered ({len(COVARIATES)}): {', '.join(COVARIATES) or '(none)'}\")\n", "print()\n", "print(\"━\" * 72)\n", "print(\"LOADED SPECIFICATIONS:\")\n", @@ -152,34 +172,151 @@ "metadata": {}, "source": [ "---\n", - "## 2. Statistical Baseline\n", - "\n", - "This reference implementation uses **AutoARIMA** as its chosen statistical\n", - "method. The purpose of this notebook is to characterise AutoARIMA's\n", - "performance thoroughly — understanding where it succeeds, where it fails, and\n", - "in which regimes — so that the adaptive agent in Notebook 5 has a concrete\n", - "foundation to learn from.\n", + "## 2. Candidate Predictors\n", "\n", - "The `Naive (Last Value)` predictor provides the floor: AutoARIMA should beat\n", - "it, and the margin tells us how much structure AutoARIMA extracts from the data.\n", + "This experiment puts a full slate of methods on the same `Predictor` interface and\n", + "the same rolling backtest, spanning three families:\n", "\n", - "> Other statistical and LLM-based methods are explored in separate reference\n", - "> implementations. You can uncomment the commented-out predictors below to\n", - "> compare, but they are not the focus of this experiment.\n", + "| Family | Predictors | Role |\n", + "|---|---|---|\n", + "| **Baselines** | `Naive (Last Value)`, `AutoARIMA` | Carry-forward floor + the classical statistical anchor |\n", + "| **Numerical ML** | `LightGBM`, `LightGBM + cov` (+ optional `Prophet`) | Gradient-boosted quantile regression on lagged price (and a leak-safe covariate panel — Brent, gas, gasoline, gold, USD index, the futures-curve contango proxy, and VIX). LightGBM-with-covariates was the strongest method in the S&P 500 study. |\n", + "| **LLM / Agent** | `LLMP-Sampled`, `LLMP-Grid`, `News Agent` — each on **both** project models | LLM-process forecasters and a news-reading analyst agent, run on `gemini-3.1-flash-lite-preview` *and* `gemini-3.5-flash` |\n", "\n", - "| Predictor | Role |\n", - "|---|---|\n", - "| `LastValuePredictor` | Lower bound — carry-forward baseline |\n", - "| `DartsAutoARIMAPredictor` | **Primary statistical method** — the anchor for adaptive agent training |" + "The predictor cell below is a **registry**: every method is one line with an\n", + "`enabled` flag. Flip a flag to add or drop a predictor — the rest of the\n", + "notebook (backtest, scoring, eval, scorecard) iterates over whatever is active.\n", + "The two baselines are flagged `baseline=True` and are the only results written to\n", + "`adaptive_agent/curriculum/` for Notebooks 5–6, so toggling the others never\n", + "disturbs the downstream training data." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "2f52a6fe", "metadata": {}, - "outputs": [], - "source": "from aieng.forecasting.methods import (\n LastValuePredictor,\n QuantileGridLLMPredictor, # noqa: F401\n QuantileGridLLMPredictorConfig, # noqa: F401\n SampledTrajectoryLLMPredictor, # noqa: F401\n SampledTrajectoryLLMPredictorConfig, # noqa: F401\n)\nfrom aieng.forecasting.methods.numerical.darts_arima import DartsAutoARIMAPredictor\nfrom energy_oil_forecasting.analyst_agent import build_wti_agent_predictor, build_wti_news_config # noqa: F401\nfrom energy_oil_forecasting.prophet_baseline import ProphetPredictor # noqa: F401\n\n\n# ── Predictors ────────────────────────────────────────────────────────────────\n# AutoARIMA is the primary method; Naive is the lower-bound baseline.\n# Both are evaluated in every section — no contender selection needed.\n# NOTE: AutoARIMA re-fits at every origin (slow on first run; cached after).\nPREDICTORS = {\n \"Naive (Last Value)\": LastValuePredictor(),\n \"AutoARIMA\": DartsAutoARIMAPredictor(),\n # ── Optional comparisons (not the focus of this experiment) ──────────────\n # \"Prophet\": ProphetPredictor(),\n # f\"LLMP-Sampled ({LLMP_MODEL})\": SampledTrajectoryLLMPredictor(\n # SampledTrajectoryLLMPredictorConfig(model=LLMP_MODEL, n_samples=N_SAMPLES)\n # ),\n # f\"LLMP-Grid ({LLMP_MODEL})\": QuantileGridLLMPredictor(\n # QuantileGridLLMPredictorConfig(model=LLMP_MODEL)\n # ),\n # f\"News Agent ({AGENT_MODEL})\": build_wti_agent_predictor(\n # build_wti_news_config(model=AGENT_MODEL)\n # ),\n}\n\nprint(f\"Active predictors ({len(PREDICTORS)}):\")\nfor name in PREDICTORS:\n print(f\" {name}\")" + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Active predictors (12):\n", + " Naive (Last Value) (baseline → curriculum/)\n", + " AutoARIMA (baseline → curriculum/)\n", + " LightGBM\n", + " LightGBM + cov\n", + " LLMP-Sampled (gemini-3.1-flash-lite-preview)\n", + " LLMP-Sampled (gemini-3.5-flash)\n", + " LLMP-Sampled + cov (gemini-3.1-flash-lite-preview)\n", + " LLMP-Sampled + cov (gemini-3.5-flash)\n", + " LLMP-Grid (gemini-3.1-flash-lite-preview)\n", + " LLMP-Grid (gemini-3.5-flash)\n", + " News Agent (gemini-3.1-flash-lite-preview)\n", + " News Agent (gemini-3.5-flash)\n" + ] + } + ], + "source": [ + "from dataclasses import dataclass\n", + "from typing import Callable\n", + "\n", + "from aieng.forecasting.methods import (\n", + " LastValuePredictor,\n", + " QuantileGridLLMPredictor,\n", + " QuantileGridLLMPredictorConfig,\n", + " SampledTrajectoryLLMPredictor,\n", + " SampledTrajectoryLLMPredictorConfig,\n", + ")\n", + "from aieng.forecasting.methods.numerical.darts_arima import DartsAutoARIMAPredictor\n", + "from aieng.forecasting.methods.numerical.darts_regression import DartsLightGBMPredictor\n", + "from energy_oil_forecasting.analyst_agent import build_wti_agent_predictor, build_wti_news_config\n", + "from energy_oil_forecasting.prophet_baseline import ProphetPredictor\n", + "\n", + "\n", + "@dataclass\n", + "class PredictorEntry:\n", + " \"\"\"One row in the experiment. Flip ``enabled`` to switch a predictor on/off.\"\"\"\n", + "\n", + " name: str\n", + " factory: Callable[[], object] # lazy — built only when enabled\n", + " enabled: bool = True\n", + " baseline: bool = False # baselines are saved to curriculum/ for NB05–06\n", + "\n", + "\n", + "# LLM / agent factories — each takes a model so the same recipe runs on both.\n", + "# LLMP-Sampled optionally serializes the covariate panel into the prompt\n", + "# (labeled exogenous-series blocks); the others are target-only. A distinct\n", + "# variant_tag keeps the +cov run separate in the cache and on the leaderboard.\n", + "def _llmp_sampled(model, covariates=None):\n", + " return SampledTrajectoryLLMPredictor(\n", + " SampledTrajectoryLLMPredictorConfig(\n", + " model=model,\n", + " n_samples=N_SAMPLES,\n", + " covariate_series_ids=covariates,\n", + " variant_tag=\"cov\" if covariates else None,\n", + " )\n", + " )\n", + "\n", + "\n", + "def _llmp_grid(model):\n", + " return QuantileGridLLMPredictor(QuantileGridLLMPredictorConfig(model=model))\n", + "\n", + "\n", + "def _news_agent(model):\n", + " return build_wti_agent_predictor(build_wti_news_config(model=model))\n", + "\n", + "\n", + "# ── Experiment registry ───────────────────────────────────────────────────────\n", + "# Toggle `enabled` on any line to include/exclude that predictor. LLM and agent\n", + "# methods are listed once per model so each can be switched on/off individually.\n", + "REGISTRY = [\n", + " # Baselines — always saved to curriculum/ for the adaptive-agent notebooks.\n", + " PredictorEntry(\"Naive (Last Value)\", LastValuePredictor, enabled=True, baseline=True),\n", + " PredictorEntry(\"AutoARIMA\", DartsAutoARIMAPredictor, enabled=True, baseline=True),\n", + " # Numerical ML — LightGBM was the strongest method in the S&P 500 study.\n", + " PredictorEntry(\n", + " \"LightGBM\",\n", + " lambda: DartsLightGBMPredictor(lags=LAGS, num_samples=NUM_SAMPLES_LGBM, lgbm_kwargs=LGBM_KWARGS),\n", + " enabled=True,\n", + " ),\n", + " PredictorEntry(\n", + " \"LightGBM + cov\",\n", + " lambda: DartsLightGBMPredictor(\n", + " lags=LAGS,\n", + " lags_past_covariates=LAGS,\n", + " covariate_series_ids=COVARIATES,\n", + " num_samples=NUM_SAMPLES_LGBM,\n", + " lgbm_kwargs=LGBM_KWARGS,\n", + " ),\n", + " enabled=True,\n", + " ),\n", + " PredictorEntry(\"Prophet\", ProphetPredictor, enabled=False),\n", + " # LLM processes and the news agent — one row per model in MODELS.\n", + " PredictorEntry(f\"LLMP-Sampled ({LITE_MODEL})\", lambda: _llmp_sampled(LITE_MODEL), enabled=True),\n", + " PredictorEntry(f\"LLMP-Sampled ({ADVANCED_MODEL})\", lambda: _llmp_sampled(ADVANCED_MODEL), enabled=True),\n", + " # LLMP-Sampled with the covariate panel serialized into the prompt — the one\n", + " # LLM method that can take covariates with no package change. Compare each of\n", + " # these against its target-only twin above to see if context helps the LLM.\n", + " PredictorEntry(f\"LLMP-Sampled + cov ({LITE_MODEL})\", lambda: _llmp_sampled(LITE_MODEL, COVARIATES), enabled=True),\n", + " PredictorEntry(\n", + " f\"LLMP-Sampled + cov ({ADVANCED_MODEL})\", lambda: _llmp_sampled(ADVANCED_MODEL, COVARIATES), enabled=True\n", + " ),\n", + " PredictorEntry(f\"LLMP-Grid ({LITE_MODEL})\", lambda: _llmp_grid(LITE_MODEL), enabled=True),\n", + " PredictorEntry(f\"LLMP-Grid ({ADVANCED_MODEL})\", lambda: _llmp_grid(ADVANCED_MODEL), enabled=True),\n", + " PredictorEntry(f\"News Agent ({LITE_MODEL})\", lambda: _news_agent(LITE_MODEL), enabled=True),\n", + " PredictorEntry(f\"News Agent ({ADVANCED_MODEL})\", lambda: _news_agent(ADVANCED_MODEL), enabled=True),\n", + "]\n", + "\n", + "# Instantiate only the enabled predictors (lazy factories skip the rest).\n", + "PREDICTORS = {e.name: e.factory() for e in REGISTRY if e.enabled}\n", + "_BASELINE_PREDICTORS = {e.name for e in REGISTRY if e.baseline}\n", + "\n", + "print(f\"Active predictors ({len(PREDICTORS)}):\")\n", + "for name in PREDICTORS:\n", + " tag = \" (baseline → curriculum/)\" if name in _BASELINE_PREDICTORS else \"\"\n", + " print(f\" {name}{tag}\")" + ] }, { "cell_type": "markdown", @@ -196,7 +333,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 9, "id": "deae96a9", "metadata": {}, "outputs": [ @@ -204,15 +341,1335 @@ "name": "stdout", "output_type": "stream", "text": [ - "Running 2025 rolling backtest (6 predictor(s))...\n", + "Running 2025 rolling backtest (12 predictor(s))...\n", "LLM/agent runs are expensive — first run will take several minutes.\n", "\n", " Naive (Last Value) ✓\n", " AutoARIMA ✓\n", - " Prophet ✓\n", + " LightGBM ✓\n", + " LightGBM + cov ✓\n", " LLMP-Sampled (gemini-3.1-flash-lite-preview) ✓\n", - " LLMP-Grid (gemini-3.1-flash-lite-preview) ✓\n", - " News Agent (gemini-3.1-flash-lite-preview) ✓\n", + " LLMP-Sampled (gemini-3.5-flash) ✓\n", + " LLMP-Sampled + cov (gemini-3.1-flash-lite-preview) ✓\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Failed to export span batch code: None, reason: HTTPSConnectionPool(host='us.cloud.langfuse.com', port=443): Read timed out. (read timeout=4.999990940093994)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " LLMP-Sampled + cov (gemini-3.5-flash) ✓\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752560.213777041), (, 752560.647323041), (, 752560.799167208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752562.873946083), (, 752563.00918925), (, 752563.075328666)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752565.023874208), (, 752565.027452291), (, 752565.051382041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752566.851667958), (, 752566.922000166), (, 752567.022794208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752568.870130541), (, 752568.937862958), (, 752569.041912125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752573.076007791), (, 752573.163518083), (, 752573.213012416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752575.058452625), (, 752575.062130916), (, 752575.067252041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752576.865883), (, 752576.901488875), (, 752576.991081375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752578.73019175), (, 752578.866843125), (, 752578.903154)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752580.689480791), (, 752580.736072458), (, 752580.861964583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752585.400805875), (, 752585.409352791), (, 752585.499864166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752587.350088333), (, 752587.36412), (, 752587.447975916)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752589.22676775), (, 752589.243004541), (, 752589.315883166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752591.174050416), (, 752591.221462083), (, 752591.350980083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752593.059092), (, 752593.21145425), (, 752593.333180375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752596.971875458), (, 752597.109406666), (, 752597.228887458)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752600.996911166), (, 752601.09532), (, 752601.193937416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752602.709531875), (, 752602.77883225), (, 752602.810979333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752604.213728375), (, 752604.448550083), (, 752604.502018416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752570.757104291), (, 752570.962687625), (, 752570.965926458)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752583.543302791), (, 752583.59231375), (, 752583.625144958)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752595.044528875), (, 752595.179304208), (, 752595.211374125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752606.402679791), (, 752606.531690083), (, 752606.547487916)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752608.052034583), (, 752608.135804875), (, 752608.2446125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752609.839064916), (, 752609.853683416), (, 752609.939426916)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752611.536170375), (, 752611.6195905), (, 752611.685677125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752613.254433416), (, 752613.427181875), (, 752613.494840916)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752615.104240875), (, 752615.128661208), (, 752615.233201083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752617.656768291), (, 752617.660498125), (, 752617.682200458)])']\n", + "connector: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " LLMP-Grid (gemini-3.1-flash-lite-preview) ✓\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752619.305721916), (, 752619.314451791), (, 752619.40523175)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752620.973051041), (, 752621.059973083), (, 752621.06471025)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752622.575834458), (, 752622.78842225), (, 752622.843562583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752624.459984083), (, 752624.581992791), (, 752624.584167375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752626.245899541), (, 752626.262295208), (, 752626.420947625)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752627.996943083), (, 752628.033649458), (, 752628.123443708)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752630.022792041), (, 752630.039414625), (, 752630.35643325)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752632.193563208), (, 752632.416964666), (, 752632.434009208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752634.160928083), (, 752634.173356916), (, 752634.279313958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752635.886463375), (, 752635.919258208), (, 752635.952059875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752637.5639815), (, 752637.649190708), (, 752637.667885416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752639.262013041), (, 752639.320067333), (, 752639.490267791)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752641.090552791), (, 752641.143582458), (, 752641.213361583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752642.7481255), (, 752642.784806375), (, 752642.975488916)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752644.509555708), (, 752644.669720625), (, 752644.726835125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752646.208131166), (, 752646.336548375), (, 752646.339881291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752648.069765666), (, 752648.073395958), (, 752648.075757416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752649.584400416), (, 752649.77885475), (, 752649.781855416)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752651.474517875), (, 752651.508228458), (, 752651.630650083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752653.257308583), (, 752653.470433458), (, 752653.4729585)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752655.146191625), (, 752655.167309), (, 752655.200721)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752657.053431041), (, 752657.072046), (, 752657.08682875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752665.28526425), (, 752665.523323625), (, 752665.579550166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752668.493911208), (, 752669.16020175), (, 752669.415106958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752673.031288041), (, 752673.063179833), (, 752673.362963166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752676.149465958), (, 752676.57323075), (, 752677.302415041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752680.488689875), (, 752680.800127125), (, 752681.091883708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752688.404499583), (, 752689.146935791), (, 752689.157744458)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752692.637086625), (, 752693.026495666), (, 752693.030053875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752695.891041375), (, 752696.302340291), (, 752696.826051416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752699.425734583), (, 752699.976359), (, 752700.09799725)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752703.318070333), (, 752703.840320541), (, 752703.997587666)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752711.840264), (, 752711.843805041), (, 752711.854173541)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752714.835185583), (, 752715.17986175), (, 752715.290335708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752718.660366291), (, 752718.74682225), (, 752718.796090041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752721.690244), (, 752721.741536166), (, 752722.515448958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752725.652256583), (, 752725.907894833), (, 752726.061499041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752732.676571791), (, 752733.2520895), (, 752733.69661125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752736.539257458), (, 752737.281439166), (, 752737.708726125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752740.633645125), (, 752740.947845791), (, 752741.251655083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752744.641530791), (, 752744.654618916), (, 752745.167653208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752684.632275666), (, 752684.635919833), (, 752685.138092375)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752707.914591666), (, 752707.998761916), (, 752708.372197833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752659.573910666), (, 752659.799610708), (, 752661.679157)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752728.909305416), (, 752729.234995125), (, 752729.784602291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752749.262486041), (, 752749.3223485), (, 752749.357170041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752751.779003875), (, 752752.108067166), (, 752753.470615833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752757.433468125), (, 752757.437213916), (, 752757.44239425)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752760.092305541), (, 752760.1651695), (, 752761.166221)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752764.934794333), (, 752765.808651291), (, 752766.75553075)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752769.824826833), (, 752770.030950083), (, 752770.15203425)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752773.977118625), (, 752774.049431), (, 752774.257231625)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752777.727116083), (, 752778.390531416), (, 752778.417952291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752781.832202416), (, 752782.215474666), (, 752782.726982125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752785.37531225), (, 752785.569157208), (, 752785.89902475)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752788.870763083), (, 752788.874377291), (, 752789.018262958)])']\n", + "connector: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " LLMP-Grid (gemini-3.5-flash) ✓\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752792.128774166), (, 752792.251601666), (, 752793.068470166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752796.235022083), (, 752796.309410083), (, 752796.844857916)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752799.711894166), (, 752799.799146083), (, 752801.25898225)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752804.053641125), (, 752805.365178916), (, 752805.502011333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752808.331846333), (, 752808.458144666), (, 752809.316459416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752814.983737125), (, 752815.001245166), (, 752815.093566333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752818.36046925), (, 752818.534293458), (, 752819.590327958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752822.574638458), (, 752823.447525125), (, 752823.790654416)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752828.192925416), (, 752828.206903), (, 752828.459457458)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752831.161308666), (, 752831.185746125), (, 752831.398681583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752833.971679666), (, 752835.295422625), (, 752835.564731)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752838.256285791), (, 752838.517393041), (, 752839.667393291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752842.421301458), (, 752842.425278541), (, 752843.954201708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752846.767205041), (, 752847.544090166), (, 752848.262991)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752851.086385), (, 752852.014986958), (, 752852.390539958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752855.068067458), (, 752855.839588541), (, 752856.506978583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752859.374766541), (, 752861.498919333), (, 752861.757870875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752866.89908725), (, 752868.200745625), (, 752870.176753291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752875.124293583), (, 752875.415708333), (, 752877.657314333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752882.4377265), (, 752882.965839583), (, 752883.932915333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752888.552393791), (, 752888.821369916), (, 752890.762900875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752896.079854625), (, 752896.228828375), (, 752898.263966583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752902.6993905), (, 752903.098236625), (, 752903.123038375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752908.063844125), (, 752908.095992083), (, 752910.321195458)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752915.564483541), (, 752915.618885583), (, 752917.5201785)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752922.425089791), (, 752924.139486166), (, 752925.173013541)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752930.580135291), (, 752932.64056375), (, 752932.835431625)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752937.862618208), (, 752940.757678), (, 752942.627678125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752947.798267708), (, 752948.819810333), (, 752949.907878958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752954.792889708), (, 752955.639836208), (, 752956.808590958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752961.304470791), (, 752961.359666625), (, 752961.564068208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752966.034044416), (, 752968.080719291), (, 752968.275642416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752973.653876125), (, 752973.741190625), (, 752975.545788458)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752981.014582708), (, 752981.997292666), (, 752982.872762875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752988.147000291), (, 752988.581408125), (, 752990.590072375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 752996.378361791), (, 752998.791628333), (, 753000.152250125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753006.8807025), (, 753007.419087083), (, 753016.813611375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753021.792007791), (, 753021.96473925), (, 753022.416803041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753027.454273708), (, 753029.584424625), (, 753029.722566958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753034.49766175), (, 753036.534509791), (, 753036.597268208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753041.903121958), (, 753043.232067166), (, 753043.949974833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753049.051608625), (, 753052.031205958), (, 753053.870787083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753059.377267583), (, 753061.325433166), (, 753061.605325166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753066.744806416), (, 753068.935374291), (, 753068.939080708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753074.52632525), (, 753077.498077625), (, 753077.730556625)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753082.983467291), (, 753083.916806875), (, 753085.784560166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753090.542056458), (, 753092.757019458), (, 753092.791985541)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753097.553133875), (, 753100.376400708), (, 753102.317892625)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753107.0250805), (, 753107.092377125), (, 753108.331306166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753112.779405666), (, 753113.058954958), (, 753114.2441495)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753119.092135916), (, 753119.49704525), (, 753121.020213583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753126.00593025), (, 753126.688972875), (, 753126.921877625)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753131.723653541), (, 753132.026699666), (, 753134.856446083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753139.55084225), (, 753139.707431916), (, 753142.14511125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753148.498501083), (, 753148.595540708), (, 753150.543427125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753155.65585175), (, 753156.353109416), (, 753157.608748583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753162.658926833), (, 753162.784862958), (, 753165.978780333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753171.009757291), (, 753171.186874875), (, 753174.306079208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753179.3238375), (, 753179.541412458), (, 753181.364170791)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753186.205964), (, 753186.27109925), (, 753186.329938958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753191.02638375), (, 753192.470676125), (, 753197.914640125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753202.33155875), (, 753202.884768375), (, 753204.615991166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753209.536366125), (, 753211.2989885), (, 753211.484911708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753216.48901525), (, 753216.4921925), (, 753220.054054791)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753225.258108291), (, 753225.386197958), (, 753227.066197708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753232.140948958), (, 753232.583796375), (, 753232.643719875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753237.654497625), (, 753239.966878583), (, 753241.8558355)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753246.367073458), (, 753247.807507791), (, 753248.443432208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753256.0036195), (, 753260.129746291), (, 753261.141700916)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753268.531029166), (, 753268.630243625), (, 753269.059048208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753275.787019375), (, 753279.805269541), (, 753279.837732208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753286.527849041), (, 753290.447033041), (, 753290.568719458)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753297.390222666), (, 753298.164644458), (, 753301.390058875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753308.967385208), (, 753309.893472875), (, 753314.47741175)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753321.865373041), (, 753322.221206875), (, 753326.037799583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753333.388551125), (, 753333.421193125), (, 753337.7106835)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753345.109293), (, 753345.388076541), (, 753350.128139416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753357.927539458), (, 753358.169478041), (, 753363.7918815)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753374.397570333), (, 753381.253415916), (, 753381.257115583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753388.119703333), (, 753392.934341291), (, 753397.744164916)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753406.20168075), (, 753406.499139), (, 753410.654979708)])']\n", + "connector: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " News Agent (gemini-3.1-flash-lite-preview) ✓\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753417.60881125), (, 753418.018920416), (, 753455.497763)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753462.595886375), (, 753463.166821666), (, 753467.581298791)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753474.748357666), (, 753475.653369958), (, 753477.104002291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753485.991542), (, 753486.020978166), (, 753489.565550791)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753496.983583), (, 753497.044108958), (, 753497.340222166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753504.853368125), (, 753511.286522208), (, 753511.313514458)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753518.30744925), (, 753518.64606675), (, 753527.075114291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753534.448904666), (, 753536.992779541), (, 753538.875892291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753546.191324541), (, 753551.648364166), (, 753551.803738833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753558.6752315), (, 753559.413319833), (, 753563.940495875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753571.0175325), (, 753571.137759125), (, 753575.107285)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753582.266809166), (, 753582.780713208), (, 753586.0949035)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753593.193129666), (, 753593.429545666), (, 753594.1193765)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753601.255079833), (, 753601.317299791), (, 753601.7627305)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753608.823922166), (, 753609.508071875), (, 753613.196892333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753620.263347375), (, 753624.288593083), (, 753625.733018125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753633.470316791), (, 753635.313350083), (, 753638.1035775)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753645.765592875), (, 753649.920455083), (, 753649.923289208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753902.380897666)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753911.357041833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753920.521228666)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753929.825853083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753938.647582208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753947.249774458)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753956.036794083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753964.734981083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753973.612093166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753982.347700083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753991.733810375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754000.223993083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754009.991020125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754017.892392875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754025.75101175)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754034.251932)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754043.18956175)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754052.2705295)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754061.724438708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754069.490359083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754077.577131125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754087.028100416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754096.009165208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754105.324127791)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754112.245601666)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753676.17828575), (, 753680.411900458), (, 753680.57195)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753693.831177541), (, 753694.1552745), (, 753697.6924255)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753705.244186333), (, 753710.845239333), (, 753716.2889725)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753723.648456208), (, 753724.462659041), (, 753725.5622595)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753732.723297958), (, 753736.478016166), (, 753736.629625583)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753744.301543125), (, 753745.019236333), (, 753749.109100875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753764.541686208), (, 753764.849931333), (, 753770.392554916)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753778.544439291), (, 753778.560424916), (, 753779.143499458)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753786.460287208), (, 753786.644455), (, 753791.244942458)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753798.847612458), (, 753798.997245583), (, 753799.461435916)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753810.475267083), (, 753811.341699833), (, 753811.488072625)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753819.940758833), (, 753824.342165708), (, 753824.5123015)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753843.679166541), (, 753843.941074833), (, 753848.082224166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753866.956804333), (, 753871.644055083), (, 753871.833589958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753657.184419208), (, 753657.367208291), (, 753657.575891208)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753664.559418083), (, 753665.801173291), (, 753668.491068083)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753756.2251545), (, 753756.349532458), (, 753756.55482325)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753832.024968625), (, 753832.171912125), (, 753836.524696375)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753855.292006166), (, 753855.483956), (, 753859.877233666)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 753879.893447333), (, 753887.116997416), (, 753892.675638291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754121.246758083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754130.705424375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754138.108009083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754147.131730875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754154.565096583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754163.137810791)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754171.587801083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754180.289316375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754206.017922416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754213.899151833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754223.517087333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754233.046416125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754241.722992083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754249.999680416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754259.169856333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754268.788575708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754278.442776)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754287.910877541)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754296.945816375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754306.159607125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754315.441001333)])']\n", + "connector: \n", + "Raw agent response (schema validation failed):\n", + "\n", + "predict() failed at origin 2025-09-15 (attempt 1/3): Expecting value: line 1 column 1 (char 0) — retrying in 2s\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " News Agent (gemini-3.5-flash) ✓\n", "\n", "All 2025 backtests complete.\n" ] @@ -238,21 +1695,839 @@ "---\n", "## 4. Performance Characterisation\n", "\n", - "We score both predictors on the 2025 backtest data:\n", + "We score every active predictor on the 2025 backtest data:\n", "- **CRPS** (Continuous Ranked Probability Score) — sharpness + calibration combined\n", "- **MAE at h=21d** — point forecast accuracy at the longest horizon\n", "\n", - "The key question is not which method to pick (we've already chosen AutoARIMA),\n", - "but *where* and *by how much* AutoARIMA beats the naive baseline — and where it\n", - "still struggles. Those gaps are exactly what the adaptive agent will learn to address." + "The leaderboard ranks the families against each other — how much structure the\n", + "numerical methods (AutoARIMA, LightGBM ± covariates) extract over the naive\n", + "floor, whether the covariate panel earns its keep, and how the LLM/agent methods\n", + "compare across the two models. Where each method wins and where it struggles in\n", + "2025 is exactly the material the adaptive agent learns from in Notebook 5." ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 10, "id": "e788448d", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754324.387265708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754334.119015333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754343.446184291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754350.361730375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754359.410917208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754369.830710291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754383.061793833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754395.657177791)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754405.914658333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754418.959740541)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754432.19516525)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754440.926241833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754453.427442416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754462.197548375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754473.369202333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754486.226948333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754495.272700291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754508.489042083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754520.514673583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754532.978669041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754545.366618833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754557.84665875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754570.674129)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754584.062219041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754596.349441041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754606.150888083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754617.863233416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754626.753534541)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754673.265060375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754686.254156041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754699.37927725)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754708.443158416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754717.0717905)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754728.202013708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754738.068636041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754750.483801166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754762.524602791)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754774.505520375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754787.077034041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754799.11028375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754809.635246375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754822.550276875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754834.856184625)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754846.894833666)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754858.658008333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754871.495422416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754884.215299166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754894.531603083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754912.460733833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754929.466105375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754945.013893916)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754963.466358291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754981.194848666)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 754999.21988075)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755018.289252125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755030.468649958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755039.034020708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755036.217192083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755047.225529916)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755043.670787125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755055.696424625)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755052.388368708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755064.711890625)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755061.537283541)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755073.229580708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755069.549556583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755080.963450166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755077.976036208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755089.109073666)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755085.587909041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755098.0820245)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755094.246406125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755107.51830825)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755102.932913625), (, 755103.423771875), (, 755103.476048416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755115.531129375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755112.473941)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755125.2552355)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755120.9483405), (, 755120.966736791), (, 755121.808529)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755133.343423875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755130.074934333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755141.682826916)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755138.35194425)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755150.463337208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755146.606748666)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755158.850378333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755155.620784833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755171.241582958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755167.487325041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755179.833826875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755176.360336708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755189.424744125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755185.594588666)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755198.944557125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755195.093150583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755207.173657)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755203.954365416), (, 755204.052748291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755216.221725791)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755212.391164166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755224.809711916)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755221.51196425)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755232.980222041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755229.704498)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755242.33632925)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755238.314530458)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755250.640831708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755247.624429083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755255.900870083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755259.618451208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755267.610403583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755264.35016925)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755276.172093041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755272.837893)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755284.794512708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755281.119773291), (, 755281.189214291), (, 755281.474146083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755292.719791375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755289.34847425)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755302.339780875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755298.955321958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755311.658458666)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755307.679656458), (, 755307.989812041), (, 755308.044621375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755319.75462975)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755316.128285166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755324.807240166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755328.066143375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755336.929740708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755333.44028575)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755345.907983375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755341.741723375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755355.105594833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755351.311153166), (, 755351.318857166), (, 755351.766424291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755365.447629833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755362.28137575)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755374.52989075)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755371.118530583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755383.109723791)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755379.767988583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755391.129254291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755387.7677065)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755400.083700125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755396.08778425)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755404.968038333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755408.428903458)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755416.922344083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755413.74670325)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755425.086389875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755421.733993833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755434.180735041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755429.881031583), (, 755430.012271416), (, 755430.666883625)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755442.374095375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755438.807296166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755447.613136833)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755450.994027166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755459.785814583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755456.134121875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755468.258494)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755465.057881583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755476.352605)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755472.704591791)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755528.514611291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755499.907514625)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755587.249088791)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755546.843783416)])']\n", + "connector: \n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -260,16 +2535,22 @@ "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n", "2025 HISTORICAL BACKTEST — PERFORMANCE SUMMARY:\n", "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n", - " Mean CRPS MAE h=21d\n", - "Predictor \n", - "AutoARIMA 3.866155 NaN\n", - "LLMP-Grid (gemini-3.1-flash-lite-preview) 4.095949 NaN\n", - "LLMP-Sampled (gemini-3.1-flash-lite-preview) 5.074999 NaN\n", - "Naive (Last Value) 5.834998 NaN\n", - "News Agent (gemini-3.1-flash-lite-preview) 6.134875 NaN\n", - "Prophet 12.845009 NaN\n", + " Mean CRPS MAE h=21d\n", + "Predictor \n", + "News Agent (gemini-3.5-flash) 1.798545 2.291586\n", + "LightGBM + cov 2.093759 2.825932\n", + "News Agent (gemini-3.1-flash-lite-preview) 2.135118 2.836897\n", + "LLMP-Grid (gemini-3.5-flash) 2.228059 2.927517\n", + "LightGBM 2.312416 3.280632\n", + "AutoARIMA 2.472053 2.992343\n", + "LLMP-Grid (gemini-3.1-flash-lite-preview) 2.586748 3.495379\n", + "LLMP-Sampled (gemini-3.1-flash-lite-preview) 2.682930 3.164483\n", + "LLMP-Sampled + cov (gemini-3.1-flash-lite-preview) 2.736897 3.344345\n", + "LLMP-Sampled (gemini-3.5-flash) 2.853630 3.299379\n", + "Naive (Last Value) 2.929931 2.929931\n", + "LLMP-Sampled + cov (gemini-3.5-flash) 2.938877 3.595242\n", "\n", - "AutoARIMA CRPS improvement over Naive: 1.9688 (33.7%)\n" + "AutoARIMA CRPS improvement over Naive: 0.4579 (15.6%)\n" ] } ], @@ -312,18 +2593,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "496dc416", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saved 2 backtest result(s) to adaptive_agent/curriculum/\n" + ] + } + ], "source": [ "# ── Save backtest results for NB05 / NB06 ────────────────────────────────────\n", - "# Only the two baseline predictors are written to curriculum/ so that\n", - "# uncommenting the optional predictors above does not pollute the files\n", - "# that NB05 and NB06 depend on.\n", + "# Only the baseline predictors (flagged in the registry above) are written to\n", + "# curriculum/ so that toggling the other predictors on/off does not change the\n", + "# files NB05 and NB06 depend on.\n", "_CURRICULUM_DIR = Path(\"adaptive_agent/curriculum\")\n", "_CURRICULUM_DIR.mkdir(exist_ok=True)\n", - "_BASELINE_PREDICTORS = {\"Naive (Last Value)\", \"AutoARIMA\"}\n", "for _name, _result_dict in backtest_results.items():\n", " if _name not in _BASELINE_PREDICTORS:\n", " continue\n", @@ -340,21 +2628,23 @@ "---\n", "## 5. 2026 Evaluation — Held-Out Test Period\n", "\n", - "We run both predictors on **8 weekly origins in early 2026**\n", - "(`energy_oil_eval.yaml`) — a period of major geopolitical volatility not\n", - "seen during the 2025 backtest.\n", + "We run every active predictor on **18 weekly origins spanning Feb–Jun 2026**\n", + "(`energy_oil_eval.yaml`) — the major geopolitical volatility spike not seen\n", + "during the 2025 backtest, plus its aftermath. The window runs through the\n", + "most recent origin that still fully resolves against cached WTI data (the\n", + "21-business-day horizon needs data 21 business days past the origin).\n", "\n", "This evaluation serves two purposes:\n", - "1. **Measure out-of-sample robustness** — does AutoARIMA's 2025 edge hold\n", - " under a structural regime shift?\n", + "1. **Measure out-of-sample robustness** — do the 2025 edges (statistical,\n", + " covariate, or LLM/agent) hold under a structural regime shift?\n", "2. **Establish the stateless baseline** that the trained adaptive agents in\n", - " Notebook 6 are compared against. Both results are saved to\n", - " `adaptive_agent/curriculum/` for Notebooks 5 and 6 to load." + " Notebook 6 are compared against. The baseline predictors' results are saved\n", + " to `adaptive_agent/curriculum/` for Notebooks 5 and 6 to load." ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 12, "id": "e73f27fb", "metadata": {}, "outputs": [ @@ -365,10 +2655,562 @@ "Running 2026 evaluation...\n", " Naive (Last Value) ✓\n", " AutoARIMA ✓\n", - " Prophet ✓\n", - " LLMP-Sampled (gemini-3.1-flash-lite-preview) ✓\n", - " LLMP-Grid (gemini-3.1-flash-lite-preview) ✓\n", - " News Agent (gemini-3.1-flash-lite-preview) ✓\n", + " LightGBM ✓\n", + " LightGBM + cov ✓\n", + " LLMP-Sampled (gemini-3.1-flash-lite-preview) ✓\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755620.245202583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755651.22417125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755690.38719775)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755717.256602333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755775.39739575)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755741.466064416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755804.440875166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755829.981523625)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755878.899424166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755846.612076916)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755930.839139666)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755904.023050291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756012.910297333)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 755985.022474541)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756036.62356675)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756058.540382375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756109.327299833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756085.278553375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756171.890338291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756140.969835208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756223.60839875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756189.3573185)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756323.862988833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756292.66088875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756386.449756083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756355.9808185)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756485.650788291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756461.151742)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756511.397686708)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756544.698469833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756589.234015416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756564.603384291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756612.016655833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756642.933382083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756694.648885041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756662.610936125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756740.084893833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756714.008325875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756764.318810791)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756909.277067875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756871.700313958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756953.032629125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756988.637815541)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757087.044101791)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757109.983070916)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757145.13540375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757172.449491625)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757233.155694083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757207.341618125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757250.066238708)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757280.191754083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757322.422917125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757298.620782208)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757387.643560166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757360.234712958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757406.614846958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757491.73890475)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757518.121002541)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757543.962416166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757567.351853666)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757609.184678958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757584.803116416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757664.517156541)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757643.311525583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757798.634146583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757761.254253875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758151.275844958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758187.851536625)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758165.526458583)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758213.452022291)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758245.589115958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758317.183962916)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758275.402499)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758416.223334416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758435.350487041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 757434.533197166)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 756793.141535875)])']\n", + "connector: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " LLMP-Sampled (gemini-3.5-flash) ✓\n", + " LLMP-Sampled + cov (gemini-3.1-flash-lite-preview) ✓\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758494.557762375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758473.944237083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758539.090262)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758562.82817425)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758592.947229833)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758624.630967666)])']\n", + "connector: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " LLMP-Sampled + cov (gemini-3.5-flash) ✓\n", + " LLMP-Grid (gemini-3.1-flash-lite-preview) ✓\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758688.800393083)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758651.313733041)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758829.184893416)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758802.285962375)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758904.973871)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758875.640216625)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758942.917746958)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758911.53359175), (, 758912.026008583), (, 758913.052293166)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 759010.84582525)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 758981.003194875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 759066.214550125)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 759036.486189458)])']\n", + "connector: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " LLMP-Grid (gemini-3.5-flash) ✓\n", + " News Agent (gemini-3.1-flash-lite-preview) ✓\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Failed to export span batch code: None, reason: HTTPSConnectionPool(host='us.cloud.langfuse.com', port=443): Read timed out. (read timeout=4.999989986419678)\n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 759134.339808875)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 759106.142334666)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 759165.89067625)])']\n", + "connector: \n", + "Unclosed connector\n", + "connections: ['deque([(, 759190.995199958)])']\n", + "connector: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " News Agent (gemini-3.5-flash) ✓\n", "\n", "2026 evaluation complete.\n" ] @@ -386,10 +3228,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "a49c24d5", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saved 2 eval result(s) to adaptive_agent/curriculum/\n" + ] + } + ], "source": [ "# ── Save eval results for NB06 ───────────────────────────────────────────────\n", "# Only baseline predictors are written so uncommenting optional predictors\n", @@ -410,14 +3260,14 @@ "---\n", "## 6. Scorecard\n", "\n", - "Out-of-sample performance of both stateless predictors on the 2026 eval period.\n", + "Out-of-sample performance of every active predictor on the 2026 eval period.\n", "These numbers are the **stateless baseline** the adaptive agent variants must\n", "beat in Notebook 6 to demonstrate that training added value." ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 14, "id": "31907f29", "metadata": {}, "outputs": [ @@ -428,14 +3278,20 @@ "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n", "2026 EVAL SCORECARD — STATELESS BASELINE:\n", "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n", - " Mean CRPS (2026) MAE h=21d (2026) 80% CI Coverage\n", - "Predictor \n", - "Prophet 2.294532 NaN NaN\n", - "AutoARIMA 6.198680 NaN NaN\n", - "News Agent (gemini-3.1-flash-lite-preview) 7.060907 NaN NaN\n", - "LLMP-Grid (gemini-3.1-flash-lite-preview) 7.624998 NaN NaN\n", - "Naive (Last Value) 8.214998 NaN NaN\n", - "LLMP-Sampled (gemini-3.1-flash-lite-preview) 9.069998 NaN NaN\n" + " Mean CRPS (2026) MAE h=21d (2026) 80% CI Coverage\n", + "Predictor \n", + "News Agent (gemini-3.5-flash) 5.636426 7.084400 66.000000\n", + "LLMP-Grid (gemini-3.5-flash) 9.154656 12.079400 40.000000\n", + "LightGBM 9.389894 11.224602 34.000000\n", + "News Agent (gemini-3.1-flash-lite-preview) 9.647239 12.133200 30.000000\n", + "LightGBM + cov 9.812166 11.595190 24.000000\n", + "LLMP-Grid (gemini-3.1-flash-lite-preview) 9.935248 11.970600 24.000000\n", + "LLMP-Sampled (gemini-3.1-flash-lite-preview) 10.812086 12.098200 6.000000\n", + "AutoARIMA 10.998416 13.804798 31.818182\n", + "LLMP-Sampled + cov (gemini-3.1-flash-lite-preview) 11.511221 12.739600 6.000000\n", + "LLMP-Sampled + cov (gemini-3.5-flash) 11.963690 13.087000 14.000000\n", + "LLMP-Sampled (gemini-3.5-flash) 12.617009 13.567600 6.000000\n", + "Naive (Last Value) 13.643182 13.643182 0.000000\n" ] } ], @@ -468,52 +3324,8611 @@ }, { "cell_type": "markdown", - "id": "9a63283cbaf04dbcab1f6479b197f3a8", + "id": "27f77b30", "metadata": {}, "source": [ "---\n", - "## 7. Core Takeaways\n", + "## 7. Diagnostics — reading past the leaderboard\n", "\n", - "1. **AutoARIMA beats the naive baseline** by extracting local autocorrelation\n", - " structure from the price history. In stable regimes, this translates to\n", - " noticeably better CRPS and MAE.\n", + "The scorecard above is a single number per method. That hides *where* the score\n", + "comes from and *whether the ranking is even real*. The next cells decompose it\n", + "straight from the eval predictions — so they recompute on any rerun, smoke or\n", + "full:\n", "\n", - "2. **AutoARIMA fails under structural regime shifts.** It has no mechanism to\n", - " incorporate news, OPEC+ decisions, or geopolitical context. During the 2026\n", - " price shock, it extrapolates past trends and produces systematically biased,\n", - " under-confident intervals.\n", + "- **CRPS by horizon** — does a method win everywhere, or is its mean dominated by\n", + " one horizon? (For a short forecast, the 5-day calls are easy and nearly tied;\n", + " the ranking is usually decided by the longest horizon.)\n", + "- **Mean CRPS ± standard error** — with only a handful of origins, are the gaps\n", + " between methods bigger than the noise, or is the \"winner\" a coin flip?\n", + "\n", + "With the **smoke spec (2 origins → a few scored points)** expect wide error bars\n", + "and an unstable ranking. That is exactly why a surprising leaderboard here is not\n", + "yet evidence of anything — it is a pipeline check." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "9970844b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n", + "MEAN CRPS BY PREDICTOR × HORIZON (lower = better; 'All' = overall mean):\n", + "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n", + " h=5d h=10d h=21d All\n", + "predictor \n", + "News Agent (gemini-3.5-flash) 5.55 5.58 5.76 5.64\n", + "LLMP-Grid (gemini-3.5-flash) 6.18 8.50 12.38 9.15\n", + "LightGBM 6.43 8.19 13.08 9.39\n", + "News Agent (gemini-3.1-flash-lite-preview) 6.46 8.83 13.21 9.65\n", + "LightGBM + cov 6.53 8.79 13.64 9.81\n", + "LLMP-Grid (gemini-3.1-flash-lite-preview) 6.89 9.23 13.27 9.94\n", + "LLMP-Sampled (gemini-3.1-flash-lite-preview) 8.11 10.12 13.83 10.81\n", + "AutoARIMA 6.28 10.20 15.83 11.00\n", + "LLMP-Sampled + cov (gemini-3.1-flash-lite-preview) 8.20 10.64 15.23 11.51\n", + "LLMP-Sampled + cov (gemini-3.5-flash) 7.95 11.67 15.80 11.96\n", + "LLMP-Sampled (gemini-3.5-flash) 8.77 11.92 16.66 12.62\n", + "Naive (Last Value) 7.80 12.43 19.82 13.64\n" + ] + } + ], + "source": [ + "from energy_oil_forecasting import viz\n", + "from energy_oil_forecasting.analysis import (\n", + " build_price_frame,\n", + " eval_narrative_md,\n", + " extract_agent_rationales,\n", + " leaderboard_with_uncertainty,\n", + " per_horizon_crps,\n", + " predictions_to_frame,\n", + ")\n", + "from IPython.display import HTML, Markdown, display # noqa: A004\n", "\n", - "3. **These failure modes are learnable.** The backtest report surfaces exactly\n", - " which regimes and horizons are problematic — and that is precisely the\n", - " information we hand to the adaptive agent as training material in Notebook 5.\n", "\n", - "4. **The `Predictor` abstraction makes the comparison clean.** The same harness,\n", - " scoring functions, and eval spec work for both stateless methods and the\n", - " adaptive agent variants in Notebook 6.\n", + "# Explode every scored 2026 eval prediction into one tidy row per\n", + "# (predictor, origin, horizon): point, 80% interval, realised price, and CRPS.\n", + "# Everything in Sections 7–10 reads from this frame, so it all recomputes when\n", + "# you flip SMOKE_TEST off and rerun.\n", + "price_df = build_price_frame(data_service)\n", + "eval_frame = predictions_to_frame(eval_results, data_service)\n", + "eval_board = leaderboard_with_uncertainty(eval_frame)\n", + "ph_crps = per_horizon_crps(eval_frame)\n", "\n", + "print(\"━\" * 72)\n", + "print(\"MEAN CRPS BY PREDICTOR × HORIZON (lower = better; 'All' = overall mean):\")\n", + "print(\"━\" * 72)\n", + "print(ph_crps.round(2).to_string())" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "099a188a", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "colorbar": { + "title": { + "text": "CRPS" + } + }, + "colorscale": [ + [ + 0, + "rgb(0,104,55)" + ], + [ + 0.1, + "rgb(26,152,80)" + ], + [ + 0.2, + "rgb(102,189,99)" + ], + [ + 0.3, + "rgb(166,217,106)" + ], + [ + 0.4, + "rgb(217,239,139)" + ], + [ + 0.5, + "rgb(255,255,191)" + ], + [ + 0.6, + "rgb(254,224,139)" + ], + [ + 0.7, + "rgb(253,174,97)" + ], + [ + 0.8, + "rgb(244,109,67)" + ], + [ + 0.9, + "rgb(215,48,39)" + ], + [ + 1, + "rgb(165,0,38)" + ] + ], + "hovertemplate": "%{y}
%{x}: %{z:.3f}", + "text": [ + [ + "7.80", + "12.43", + "19.82", + "13.64" + ], + [ + "8.77", + "11.92", + "16.66", + "12.62" + ], + [ + "7.95", + "11.67", + "15.80", + "11.96" + ], + [ + "8.20", + "10.64", + "15.23", + "11.51" + ], + [ + "6.28", + "10.20", + "15.83", + "11.00" + ], + [ + "8.11", + "10.12", + "13.83", + "10.81" + ], + [ + "6.89", + "9.23", + "13.27", + "9.94" + ], + [ + "6.53", + "8.79", + "13.64", + "9.81" + ], + [ + "6.46", + "8.83", + "13.21", + "9.65" + ], + [ + "6.43", + "8.19", + "13.08", + "9.39" + ], + [ + "6.18", + "8.50", + "12.38", + "9.15" + ], + [ + "5.55", + "5.58", + "5.76", + "5.64" + ] + ], + "textfont": { + "size": 12 + }, + "texttemplate": "%{text}", + "type": "heatmap", + "x": [ + "h=5d", + "h=10d", + "h=21d", + "All" + ], + "y": [ + "Naive (Last Value)", + "LLMP-Sampled (gemini-3.5-flash)", + "LLMP-Sampled + cov (gemini-3.5-flash)", + "LLMP-Sampled + cov (gemini-3.1-flash-lite-preview)", + "AutoARIMA", + "LLMP-Sampled (gemini-3.1-flash-lite-preview)", + "LLMP-Grid (gemini-3.1-flash-lite-preview)", + "LightGBM + cov", + "News Agent (gemini-3.1-flash-lite-preview)", + "LightGBM", + "LLMP-Grid (gemini-3.5-flash)", + "News Agent (gemini-3.5-flash)" + ], + "z": { + "bdata": "JUmSJDMzH0AlSZKkstooQAAAAHjr0TNAL7roIk9JK0Dns0+vEIwhQB4xggSq1SdAD/XWf8WnMECxIhGq6DspQL7I/MWhyR9ARvBcmYNUJ0BwdmsSZpkvQEkIyb1o7SdAKKqP2JlkIEANhd+ih0glQBLZynIQdi5AfWc5t74FJ0DeAduH7R4ZQDo6kqHiZCRATOGG7/anL0CRasJrMP8lQJTOx9c6OSBAteuyYWg9JEBqkGefu6crQADWLbLJnyVAPUYiO8iSG0D8OpfVY3QiQFJh4n1viSpA8w3PwtjeI0DH0XzVih4aQLlTH+25kyFA1wo93YZHK0DmsFIu1J8jQKW3pi5V0hlA5mv1bFqrIUDJqLKI1WkqQDJoJPViSyNANImzMze8GUDNERP6bGEgQNtYYxfuKipAzJdGI6DHIkDCTGVjdroYQJRWMUm4/iBA2x7HCBzDKEDv1sMLL08iQJPDqYpiNBZATpx5s4BQFkCntjdT7w0XQOp0zVqzixZA", + "dtype": "f8", + "shape": "12, 4" + } + } + ], + "layout": { + "height": 640, + "margin": { + "b": 40, + "l": 230, + "r": 40, + "t": 90 + }, + "shapes": [ + { + "line": { + "color": "#333333", + "width": 1.5 + }, + "type": "line", + "x0": 2.5, + "x1": 2.5, + "xref": "x", + "y0": 0, + "y1": 1, + "yref": "y domain" + } + ], + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "font": { + "size": 16 + }, + "text": "Mean CRPS by Predictor × Horizon (lower = better)" + }, + "width": 720, + "xaxis": { + "side": "top", + "title": { + "text": "Horizon" + } + }, + "yaxis": { + "title": { + "text": "" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Heatmap of the table above. Read it left-to-right: the short-horizon columns\n", + "# are usually a near-uniform green (everyone is right), and one long-horizon\n", + "# column carries the colour spread that sets the 'All' ranking.\n", + "viz.make_crps_heatmap(ph_crps)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "c0f3f7b1", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "error_x": { + "array": { + "bdata": "24VyKdVJA0ApQSBys7b1Py4UaSz27fU/TCswAXxV9T8z7GGgJUgBQKqv9FbdCfU/e6zyCQk58z+Ngc/khQ72P9T0WLOh+PI/CqXyBbrC9D9I9U9MH1DyPzHydTwofeI/", + "dtype": "f8" + }, + "color": "#888888", + "thickness": 1.6, + "type": "data", + "width": 6 + }, + "hovertemplate": "%{y}
CRPS %{x:.3f} ± %{error_x.array:.3f}", + "marker": { + "color": [ + "#7f7f7f", + "#2ca02c", + "#2ca02c", + "#2ca02c", + "#1f77b4", + "#2ca02c", + "#2ca02c", + "#1f77b4", + "#2ca02c", + "#1f77b4", + "#2ca02c", + "#2ca02c" + ], + "size": 11 + }, + "mode": "markers", + "showlegend": false, + "type": "scatter", + "x": { + "bdata": "L7roIk9JK0CxIhGq6DspQEkIyb1o7SdAfWc5t74FJ0CRasJrMP8lQADWLbLJnyVA8w3PwtjeI0DmsFIu1J8jQDJoJPViSyNAzJdGI6DHIkDv1sMLL08iQOp0zVqzixZA", + "dtype": "f8" + }, + "y": [ + "Naive (Last Value)", + "LLMP-Sampled (gemini-3.5-flash)", + "LLMP-Sampled + cov (gemini-3.5-flash)", + "LLMP-Sampled + cov (gemini-3.1-flash-lite-preview)", + "AutoARIMA", + "LLMP-Sampled (gemini-3.1-flash-lite-preview)", + "LLMP-Grid (gemini-3.1-flash-lite-preview)", + "LightGBM + cov", + "News Agent (gemini-3.1-flash-lite-preview)", + "LightGBM", + "LLMP-Grid (gemini-3.5-flash)", + "News Agent (gemini-3.5-flash)" + ] + } + ], + "layout": { + "annotations": [ + { + "font": { + "color": "#31a354", + "size": 11 + }, + "showarrow": false, + "text": " best", + "x": 5.636426371374208, + "xanchor": "center", + "xref": "x", + "y": 1, + "yanchor": "bottom", + "yref": "y domain" + } + ], + "height": 558, + "margin": { + "b": 50, + "l": 230, + "r": 40, + "t": 70 + }, + "shapes": [ + { + "line": { + "color": "#31a354", + "dash": "dot", + "width": 1.5 + }, + "type": "line", + "x0": 5.636426371374208, + "x1": 5.636426371374208, + "xref": "x", + "y0": 0, + "y1": 1, + "yref": "y domain" + } + ], + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "font": { + "size": 16 + }, + "text": "Eval Leaderboard — Mean CRPS ± 1 SE (overlap ⇒ tied)" + }, + "width": 760, + "xaxis": { + "gridcolor": "#f0f0f0", + "showgrid": true, + "title": { + "text": "Mean CRPS (lower = better)" + } + }, + "yaxis": { + "title": { + "text": "" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Same leaderboard, now with a standard-error bar on each mean. If the bars of\n", + "# the top methods overlap, their ordering is not statistically distinguishable —\n", + "# the honest verdict when only a few origins have been scored.\n", + "viz.make_leaderboard_interval_chart(eval_board)" + ] + }, + { + "cell_type": "markdown", + "id": "86e50803", + "metadata": {}, + "source": [ + "---\n", + "## 8. What are the top methods actually forecasting?\n", + "\n", + "A CRPS number doesn't show *behaviour*. Below, each leading method's **median\n", + "forecast and 80% interval** are drawn against the realised WTI path at every\n", + "eval origin. This is where the leaderboard becomes legible — watch for who\n", + "tracks the move, who simply anchors to the last price, and whose intervals are\n", + "too narrow to cover the outcome when the market jumps." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "ba384e79", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Showing: News Agent (gemini-3.5-flash), LLMP-Grid (gemini-3.5-flash), LightGBM\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": true, + "type": "scatter", + "x": [ + "2025-12-26T00:00:00", + "2025-12-29T00:00:00", + "2025-12-30T00:00:00", + "2025-12-31T00:00:00", + "2026-01-02T00:00:00", + "2026-01-05T00:00:00", + "2026-01-06T00:00:00", + "2026-01-07T00:00:00", + "2026-01-08T00:00:00", + "2026-01-09T00:00:00", + "2026-01-12T00:00:00", + "2026-01-13T00:00:00", + "2026-01-14T00:00:00", + "2026-01-15T00:00:00", + "2026-01-16T00:00:00", + "2026-01-20T00:00:00", + "2026-01-21T00:00:00", + "2026-01-22T00:00:00", + "2026-01-23T00:00:00", + "2026-01-26T00:00:00", + "2026-01-27T00:00:00", + "2026-01-28T00:00:00", + "2026-01-29T00:00:00", + "2026-01-30T00:00:00", + "2026-02-02T00:00:00" + ], + "xaxis": "x", + "y": [ + 56.7400016784668, + 58.08000183105469, + 57.95000076293945, + 57.41999816894531, + 57.31999969482422, + 58.31999969482422, + 57.130001068115234, + 55.9900016784668, + 57.7599983215332, + 59.119998931884766, + 59.5, + 61.150001525878906, + 62.02000045776367, + 59.189998626708984, + 59.439998626708984, + 60.34000015258789, + 60.619998931884766, + 59.36000061035156, + 61.06999969482422, + 60.630001068115234, + 62.38999938964844, + 63.209999084472656, + 65.41999816894531, + 65.20999908447266, + 62.13999938964844 + ], + "yaxis": "y" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": true, + "type": "scatter", + "x": [ + "2026-02-03T00:00:00", + "2026-02-04T00:00:00", + "2026-02-05T00:00:00", + "2026-02-06T00:00:00", + "2026-02-09T00:00:00", + "2026-02-10T00:00:00", + "2026-02-11T00:00:00", + "2026-02-12T00:00:00", + "2026-02-13T00:00:00", + "2026-02-17T00:00:00", + "2026-02-18T00:00:00", + "2026-02-19T00:00:00", + "2026-02-20T00:00:00", + "2026-02-23T00:00:00", + "2026-02-24T00:00:00", + "2026-02-25T00:00:00", + "2026-02-26T00:00:00", + "2026-02-27T00:00:00", + "2026-03-02T00:00:00", + "2026-03-03T00:00:00" + ], + "xaxis": "x", + "y": [ + 63.209999084472656, + 65.13999938964844, + 63.290000915527344, + 63.54999923706055, + 64.36000061035156, + 63.959999084472656, + 64.62999725341797, + 62.84000015258789, + 62.88999938964844, + 62.33000183105469, + 65.19000244140625, + 66.43000030517578, + 66.38999938964844, + 66.30999755859375, + 65.62999725341797, + 65.41999816894531, + 65.20999908447266, + 67.0199966430664, + 71.2300033569336, + 74.55999755859375 + ], + "yaxis": "y" + }, + { + "error_y": { + "array": [ + 2, + 4 + ], + "arrayminus": [ + 1.7999999999999972, + 3.5 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": true, + "type": "scatter", + "x": [ + "2026-02-09T00:00:00", + "2026-03-03T00:00:00" + ], + "xaxis": "x", + "y": [ + 64, + 61.5 + ], + "yaxis": "y" + }, + { + "error_y": { + "array": [ + 3.430000000000007, + 7.3700000000000045 + ], + "arrayminus": [ + 3.3499999999999943, + 6.039999999999999 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": true, + "type": "scatter", + "x": [ + "2026-02-09T00:00:00", + "2026-03-03T00:00:00" + ], + "xaxis": "x", + "y": [ + 65.88, + 66.41 + ], + "yaxis": "y" + }, + { + "error_y": { + "array": [ + 2.408147967633269, + 3.548615365718092 + ], + "arrayminus": [ + 1.1985169741866173, + 4.652506604793558 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": true, + "type": "scatter", + "x": [ + "2026-02-09T00:00:00", + "2026-03-03T00:00:00" + ], + "xaxis": "x", + "y": [ + 64.31607893595701, + 63.40795619254804 + ], + "yaxis": "y" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-01-05T00:00:00", + "2026-01-06T00:00:00", + "2026-01-07T00:00:00", + "2026-01-08T00:00:00", + "2026-01-09T00:00:00", + "2026-01-12T00:00:00", + "2026-01-13T00:00:00", + "2026-01-14T00:00:00", + "2026-01-15T00:00:00", + "2026-01-16T00:00:00", + "2026-01-20T00:00:00", + "2026-01-21T00:00:00", + "2026-01-22T00:00:00", + "2026-01-23T00:00:00", + "2026-01-26T00:00:00", + "2026-01-27T00:00:00", + "2026-01-28T00:00:00", + "2026-01-29T00:00:00", + "2026-01-30T00:00:00", + "2026-02-02T00:00:00", + "2026-02-03T00:00:00", + "2026-02-04T00:00:00", + "2026-02-05T00:00:00", + "2026-02-06T00:00:00", + "2026-02-09T00:00:00" + ], + "xaxis": "x2", + "y": [ + 58.31999969482422, + 57.130001068115234, + 55.9900016784668, + 57.7599983215332, + 59.119998931884766, + 59.5, + 61.150001525878906, + 62.02000045776367, + 59.189998626708984, + 59.439998626708984, + 60.34000015258789, + 60.619998931884766, + 59.36000061035156, + 61.06999969482422, + 60.630001068115234, + 62.38999938964844, + 63.209999084472656, + 65.41999816894531, + 65.20999908447266, + 62.13999938964844, + 63.209999084472656, + 65.13999938964844, + 63.290000915527344, + 63.54999923706055, + 64.36000061035156 + ], + "yaxis": "y2" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-02-10T00:00:00", + "2026-02-11T00:00:00", + "2026-02-12T00:00:00", + "2026-02-13T00:00:00", + "2026-02-17T00:00:00", + "2026-02-18T00:00:00", + "2026-02-19T00:00:00", + "2026-02-20T00:00:00", + "2026-02-23T00:00:00", + "2026-02-24T00:00:00", + "2026-02-25T00:00:00", + "2026-02-26T00:00:00", + "2026-02-27T00:00:00", + "2026-03-02T00:00:00", + "2026-03-03T00:00:00", + "2026-03-04T00:00:00", + "2026-03-05T00:00:00", + "2026-03-06T00:00:00", + "2026-03-09T00:00:00", + "2026-03-10T00:00:00" + ], + "xaxis": "x2", + "y": [ + 63.959999084472656, + 64.62999725341797, + 62.84000015258789, + 62.88999938964844, + 62.33000183105469, + 65.19000244140625, + 66.43000030517578, + 66.38999938964844, + 66.30999755859375, + 65.62999725341797, + 65.41999816894531, + 65.20999908447266, + 67.0199966430664, + 71.2300033569336, + 74.55999755859375, + 74.66000366210938, + 81.01000213623047, + 90.9000015258789, + 94.7699966430664, + 83.44999694824219 + ], + "yaxis": "y2" + }, + { + "error_y": { + "array": [ + 5, + 7.799999999999997 + ], + "arrayminus": [ + 3.6000000000000014, + 5 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-02-23T00:00:00", + "2026-03-10T00:00:00" + ], + "xaxis": "x2", + "y": [ + 63, + 62 + ], + "yaxis": "y2" + }, + { + "error_y": { + "array": [ + 3.359999999999999, + 4.990000000000009 + ], + "arrayminus": [ + 2.740000000000002, + 4.009999999999998 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-02-23T00:00:00", + "2026-03-10T00:00:00" + ], + "xaxis": "x2", + "y": [ + 62.64, + 61.16 + ], + "yaxis": "y2" + }, + { + "error_y": { + "array": [ + 2.175075791777516, + 2.7741393845874427 + ], + "arrayminus": [ + 1.4453925029217132, + 6.343198258657928 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-02-23T00:00:00", + "2026-03-10T00:00:00" + ], + "xaxis": "x2", + "y": [ + 64.50781263457384, + 64.68245364485004 + ], + "yaxis": "y2" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-01-09T00:00:00", + "2026-01-12T00:00:00", + "2026-01-13T00:00:00", + "2026-01-14T00:00:00", + "2026-01-15T00:00:00", + "2026-01-16T00:00:00", + "2026-01-20T00:00:00", + "2026-01-21T00:00:00", + "2026-01-22T00:00:00", + "2026-01-23T00:00:00", + "2026-01-26T00:00:00", + "2026-01-27T00:00:00", + "2026-01-28T00:00:00", + "2026-01-29T00:00:00", + "2026-01-30T00:00:00", + "2026-02-02T00:00:00", + "2026-02-03T00:00:00", + "2026-02-04T00:00:00", + "2026-02-05T00:00:00", + "2026-02-06T00:00:00", + "2026-02-09T00:00:00", + "2026-02-10T00:00:00", + "2026-02-11T00:00:00", + "2026-02-12T00:00:00", + "2026-02-13T00:00:00" + ], + "xaxis": "x3", + "y": [ + 59.119998931884766, + 59.5, + 61.150001525878906, + 62.02000045776367, + 59.189998626708984, + 59.439998626708984, + 60.34000015258789, + 60.619998931884766, + 59.36000061035156, + 61.06999969482422, + 60.630001068115234, + 62.38999938964844, + 63.209999084472656, + 65.41999816894531, + 65.20999908447266, + 62.13999938964844, + 63.209999084472656, + 65.13999938964844, + 63.290000915527344, + 63.54999923706055, + 64.36000061035156, + 63.959999084472656, + 64.62999725341797, + 62.84000015258789, + 62.88999938964844 + ], + "yaxis": "y3" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-02-17T00:00:00", + "2026-02-18T00:00:00", + "2026-02-19T00:00:00", + "2026-02-20T00:00:00", + "2026-02-23T00:00:00", + "2026-02-24T00:00:00", + "2026-02-25T00:00:00", + "2026-02-26T00:00:00", + "2026-02-27T00:00:00", + "2026-03-02T00:00:00", + "2026-03-03T00:00:00", + "2026-03-04T00:00:00", + "2026-03-05T00:00:00", + "2026-03-06T00:00:00", + "2026-03-09T00:00:00", + "2026-03-10T00:00:00", + "2026-03-11T00:00:00", + "2026-03-12T00:00:00", + "2026-03-13T00:00:00", + "2026-03-16T00:00:00", + "2026-03-17T00:00:00" + ], + "xaxis": "x3", + "y": [ + 62.33000183105469, + 65.19000244140625, + 66.43000030517578, + 66.38999938964844, + 66.30999755859375, + 65.62999725341797, + 65.41999816894531, + 65.20999908447266, + 67.0199966430664, + 71.2300033569336, + 74.55999755859375, + 74.66000366210938, + 81.01000213623047, + 90.9000015258789, + 94.7699966430664, + 83.44999694824219, + 87.25, + 95.7300033569336, + 98.70999908447266, + 93.5, + 96.20999908447266 + ], + "yaxis": "y3" + }, + { + "error_y": { + "array": [ + 3.5799999999999983, + 11.269999999999996, + 19.290000000000006 + ], + "arrayminus": [ + 2.519999999999996, + 7.730000000000004, + 30.709999999999994 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-02-23T00:00:00", + "2026-03-02T00:00:00", + "2026-03-17T00:00:00" + ], + "xaxis": "x3", + "y": [ + 65.72, + 71.23, + 95.71 + ], + "yaxis": "y3" + }, + { + "error_y": { + "array": [ + 3.1999999999999957, + 4.200000000000003, + 5.700000000000003 + ], + "arrayminus": [ + 3, + 3.800000000000004, + 5.099999999999994 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-02-23T00:00:00", + "2026-03-02T00:00:00", + "2026-03-17T00:00:00" + ], + "xaxis": "x3", + "y": [ + 62.4, + 61.7, + 60.3 + ], + "yaxis": "y3" + }, + { + "error_y": { + "array": [ + 1.5661620542482524, + 1.1976983694151642, + 3.677945734416326 + ], + "arrayminus": [ + 3.5777603905807283, + 5.2121990345644775, + 8.340490924000427 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-02-23T00:00:00", + "2026-03-02T00:00:00", + "2026-03-17T00:00:00" + ], + "xaxis": "x3", + "y": [ + 63.82274492839041, + 65.26944502232584, + 63.72796242178093 + ], + "yaxis": "y3" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-01-16T00:00:00", + "2026-01-20T00:00:00", + "2026-01-21T00:00:00", + "2026-01-22T00:00:00", + "2026-01-23T00:00:00", + "2026-01-26T00:00:00", + "2026-01-27T00:00:00", + "2026-01-28T00:00:00", + "2026-01-29T00:00:00", + "2026-01-30T00:00:00", + "2026-02-02T00:00:00", + "2026-02-03T00:00:00", + "2026-02-04T00:00:00", + "2026-02-05T00:00:00", + "2026-02-06T00:00:00", + "2026-02-09T00:00:00", + "2026-02-10T00:00:00", + "2026-02-11T00:00:00", + "2026-02-12T00:00:00", + "2026-02-13T00:00:00", + "2026-02-17T00:00:00", + "2026-02-18T00:00:00", + "2026-02-19T00:00:00", + "2026-02-20T00:00:00", + "2026-02-23T00:00:00" + ], + "xaxis": "x4", + "y": [ + 59.439998626708984, + 60.34000015258789, + 60.619998931884766, + 59.36000061035156, + 61.06999969482422, + 60.630001068115234, + 62.38999938964844, + 63.209999084472656, + 65.41999816894531, + 65.20999908447266, + 62.13999938964844, + 63.209999084472656, + 65.13999938964844, + 63.290000915527344, + 63.54999923706055, + 64.36000061035156, + 63.959999084472656, + 64.62999725341797, + 62.84000015258789, + 62.88999938964844, + 62.33000183105469, + 65.19000244140625, + 66.43000030517578, + 66.38999938964844, + 66.30999755859375 + ], + "yaxis": "y4" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-02-24T00:00:00", + "2026-02-25T00:00:00", + "2026-02-26T00:00:00", + "2026-02-27T00:00:00", + "2026-03-02T00:00:00", + "2026-03-03T00:00:00", + "2026-03-04T00:00:00", + "2026-03-05T00:00:00", + "2026-03-06T00:00:00", + "2026-03-09T00:00:00", + "2026-03-10T00:00:00", + "2026-03-11T00:00:00", + "2026-03-12T00:00:00", + "2026-03-13T00:00:00", + "2026-03-16T00:00:00", + "2026-03-17T00:00:00", + "2026-03-18T00:00:00", + "2026-03-19T00:00:00", + "2026-03-20T00:00:00", + "2026-03-23T00:00:00", + "2026-03-24T00:00:00" + ], + "xaxis": "x4", + "y": [ + 65.62999725341797, + 65.41999816894531, + 65.20999908447266, + 67.0199966430664, + 71.2300033569336, + 74.55999755859375, + 74.66000366210938, + 81.01000213623047, + 90.9000015258789, + 94.7699966430664, + 83.44999694824219, + 87.25, + 95.7300033569336, + 98.70999908447266, + 93.5, + 96.20999908447266, + 96.31999969482422, + 96.13999938964844, + 98.31999969482422, + 88.12999725341797, + 92.3499984741211 + ], + "yaxis": "y4" + }, + { + "error_y": { + "array": [ + 6.5, + 23, + 21.5 + ], + "arrayminus": [ + 6.5, + 18, + 15.5 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-02T00:00:00", + "2026-03-09T00:00:00", + "2026-03-24T00:00:00" + ], + "xaxis": "x4", + "y": [ + 74.5, + 88, + 85.5 + ], + "yaxis": "y4" + }, + { + "error_y": { + "array": [ + 2.299999999999997, + 3.0500000000000114, + 4.650000000000006 + ], + "arrayminus": [ + 2.1999999999999957, + 2.749999999999993, + 3.8999999999999986 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-02T00:00:00", + "2026-03-09T00:00:00", + "2026-03-24T00:00:00" + ], + "xaxis": "x4", + "y": [ + 66.05, + 65.6, + 64.55 + ], + "yaxis": "y4" + }, + { + "error_y": { + "array": [ + 1.1597652314365234, + 2.34436378940417, + 4.593402725442601 + ], + "arrayminus": [ + 2.333259478436858, + 3.5685101606554426, + 3.8115495606647016 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-02T00:00:00", + "2026-03-09T00:00:00", + "2026-03-24T00:00:00" + ], + "xaxis": "x4", + "y": [ + 66.92888696659587, + 65.62766121627956, + 66.06219012602452 + ], + "yaxis": "y4" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-01-26T00:00:00", + "2026-01-27T00:00:00", + "2026-01-28T00:00:00", + "2026-01-29T00:00:00", + "2026-01-30T00:00:00", + "2026-02-02T00:00:00", + "2026-02-03T00:00:00", + "2026-02-04T00:00:00", + "2026-02-05T00:00:00", + "2026-02-06T00:00:00", + "2026-02-09T00:00:00", + "2026-02-10T00:00:00", + "2026-02-11T00:00:00", + "2026-02-12T00:00:00", + "2026-02-13T00:00:00", + "2026-02-17T00:00:00", + "2026-02-18T00:00:00", + "2026-02-19T00:00:00", + "2026-02-20T00:00:00", + "2026-02-23T00:00:00", + "2026-02-24T00:00:00", + "2026-02-25T00:00:00", + "2026-02-26T00:00:00", + "2026-02-27T00:00:00", + "2026-03-02T00:00:00" + ], + "xaxis": "x5", + "y": [ + 60.630001068115234, + 62.38999938964844, + 63.209999084472656, + 65.41999816894531, + 65.20999908447266, + 62.13999938964844, + 63.209999084472656, + 65.13999938964844, + 63.290000915527344, + 63.54999923706055, + 64.36000061035156, + 63.959999084472656, + 64.62999725341797, + 62.84000015258789, + 62.88999938964844, + 62.33000183105469, + 65.19000244140625, + 66.43000030517578, + 66.38999938964844, + 66.30999755859375, + 65.62999725341797, + 65.41999816894531, + 65.20999908447266, + 67.0199966430664, + 71.2300033569336 + ], + "yaxis": "y5" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-03T00:00:00", + "2026-03-04T00:00:00", + "2026-03-05T00:00:00", + "2026-03-06T00:00:00", + "2026-03-09T00:00:00", + "2026-03-10T00:00:00", + "2026-03-11T00:00:00", + "2026-03-12T00:00:00", + "2026-03-13T00:00:00", + "2026-03-16T00:00:00", + "2026-03-17T00:00:00", + "2026-03-18T00:00:00", + "2026-03-19T00:00:00", + "2026-03-20T00:00:00", + "2026-03-23T00:00:00", + "2026-03-24T00:00:00", + "2026-03-25T00:00:00", + "2026-03-26T00:00:00", + "2026-03-27T00:00:00", + "2026-03-30T00:00:00", + "2026-03-31T00:00:00" + ], + "xaxis": "x5", + "y": [ + 74.55999755859375, + 74.66000366210938, + 81.01000213623047, + 90.9000015258789, + 94.7699966430664, + 83.44999694824219, + 87.25, + 95.7300033569336, + 98.70999908447266, + 93.5, + 96.20999908447266, + 96.31999969482422, + 96.13999938964844, + 98.31999969482422, + 88.12999725341797, + 92.3499984741211, + 90.31999969482422, + 94.4800033569336, + 99.63999938964844, + 102.87999725341795, + 101.37999725341795 + ], + "yaxis": "y5" + }, + { + "error_y": { + "array": [ + 10.5, + 14, + 15 + ], + "arrayminus": [ + 8, + 12, + 18 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-09T00:00:00", + "2026-03-16T00:00:00", + "2026-03-31T00:00:00" + ], + "xaxis": "x5", + "y": [ + 84, + 95, + 110 + ], + "yaxis": "y5" + }, + { + "error_y": { + "array": [ + 3.049999999999997, + 4.099999999999994, + 6.300000000000011 + ], + "arrayminus": [ + 2.700000000000003, + 3.500000000000007, + 4.999999999999993 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-09T00:00:00", + "2026-03-16T00:00:00", + "2026-03-31T00:00:00" + ], + "xaxis": "x5", + "y": [ + 66.9, + 66.65, + 66.1 + ], + "yaxis": "y5" + }, + { + "error_y": { + "array": [ + 0.8243555501988453, + 0.819539076298156, + 5.588605465823164 + ], + "arrayminus": [ + 1.3457711357753652, + 4.891892132291034, + 4.411155252119485 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-09T00:00:00", + "2026-03-16T00:00:00", + "2026-03-31T00:00:00" + ], + "xaxis": "x5", + "y": [ + 66.88783720085925, + 67.4880350032759, + 66.75206441696794 + ], + "yaxis": "y5" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-02-02T00:00:00", + "2026-02-03T00:00:00", + "2026-02-04T00:00:00", + "2026-02-05T00:00:00", + "2026-02-06T00:00:00", + "2026-02-09T00:00:00", + "2026-02-10T00:00:00", + "2026-02-11T00:00:00", + "2026-02-12T00:00:00", + "2026-02-13T00:00:00", + "2026-02-17T00:00:00", + "2026-02-18T00:00:00", + "2026-02-19T00:00:00", + "2026-02-20T00:00:00", + "2026-02-23T00:00:00", + "2026-02-24T00:00:00", + "2026-02-25T00:00:00", + "2026-02-26T00:00:00", + "2026-02-27T00:00:00", + "2026-03-02T00:00:00", + "2026-03-03T00:00:00", + "2026-03-04T00:00:00", + "2026-03-05T00:00:00", + "2026-03-06T00:00:00", + "2026-03-09T00:00:00" + ], + "xaxis": "x6", + "y": [ + 62.13999938964844, + 63.209999084472656, + 65.13999938964844, + 63.290000915527344, + 63.54999923706055, + 64.36000061035156, + 63.959999084472656, + 64.62999725341797, + 62.84000015258789, + 62.88999938964844, + 62.33000183105469, + 65.19000244140625, + 66.43000030517578, + 66.38999938964844, + 66.30999755859375, + 65.62999725341797, + 65.41999816894531, + 65.20999908447266, + 67.0199966430664, + 71.2300033569336, + 74.55999755859375, + 74.66000366210938, + 81.01000213623047, + 90.9000015258789, + 94.7699966430664 + ], + "yaxis": "y6" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-10T00:00:00", + "2026-03-11T00:00:00", + "2026-03-12T00:00:00", + "2026-03-13T00:00:00", + "2026-03-16T00:00:00", + "2026-03-17T00:00:00", + "2026-03-18T00:00:00", + "2026-03-19T00:00:00", + "2026-03-20T00:00:00", + "2026-03-23T00:00:00", + "2026-03-24T00:00:00", + "2026-03-25T00:00:00", + "2026-03-26T00:00:00", + "2026-03-27T00:00:00", + "2026-03-30T00:00:00", + "2026-03-31T00:00:00", + "2026-04-01T00:00:00", + "2026-04-02T00:00:00", + "2026-04-06T00:00:00", + "2026-04-07T00:00:00" + ], + "xaxis": "x6", + "y": [ + 83.44999694824219, + 87.25, + 95.7300033569336, + 98.70999908447266, + 93.5, + 96.20999908447266, + 96.31999969482422, + 96.13999938964844, + 98.31999969482422, + 88.12999725341797, + 92.3499984741211, + 90.31999969482422, + 94.4800033569336, + 99.63999938964844, + 102.87999725341795, + 101.37999725341795, + 100.12000274658205, + 111.54000091552734, + 112.41000366210938, + 112.9499969482422 + ], + "yaxis": "y6" + }, + { + "error_y": { + "array": [ + 11, + 13, + 15 + ], + "arrayminus": [ + 10, + 10, + 9 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-16T00:00:00", + "2026-03-23T00:00:00", + "2026-04-07T00:00:00" + ], + "xaxis": "x6", + "y": [ + 108, + 104, + 94 + ], + "yaxis": "y6" + }, + { + "error_y": { + "array": [ + 7.799999999999997, + 9.900000000000006, + 12.299999999999995 + ], + "arrayminus": [ + 8, + 9.5, + 11.099999999999994 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-16T00:00:00", + "2026-03-23T00:00:00", + "2026-04-07T00:00:00" + ], + "xaxis": "x6", + "y": [ + 88, + 85.8, + 82.3 + ], + "yaxis": "y6" + }, + { + "error_y": { + "array": [ + 3.05287920369706, + 3.724124145839653, + 8.264940353309782 + ], + "arrayminus": [ + 2.708428265640336, + 5.413549513750425, + 3.2807530426153164 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-16T00:00:00", + "2026-03-23T00:00:00", + "2026-04-07T00:00:00" + ], + "xaxis": "x6", + "y": [ + 85.20471203310971, + 86.46963346680023, + 85.71500652029715 + ], + "yaxis": "y6" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-02-09T00:00:00", + "2026-02-10T00:00:00", + "2026-02-11T00:00:00", + "2026-02-12T00:00:00", + "2026-02-13T00:00:00", + "2026-02-17T00:00:00", + "2026-02-18T00:00:00", + "2026-02-19T00:00:00", + "2026-02-20T00:00:00", + "2026-02-23T00:00:00", + "2026-02-24T00:00:00", + "2026-02-25T00:00:00", + "2026-02-26T00:00:00", + "2026-02-27T00:00:00", + "2026-03-02T00:00:00", + "2026-03-03T00:00:00", + "2026-03-04T00:00:00", + "2026-03-05T00:00:00", + "2026-03-06T00:00:00", + "2026-03-09T00:00:00", + "2026-03-10T00:00:00", + "2026-03-11T00:00:00", + "2026-03-12T00:00:00", + "2026-03-13T00:00:00", + "2026-03-16T00:00:00" + ], + "xaxis": "x7", + "y": [ + 64.36000061035156, + 63.959999084472656, + 64.62999725341797, + 62.84000015258789, + 62.88999938964844, + 62.33000183105469, + 65.19000244140625, + 66.43000030517578, + 66.38999938964844, + 66.30999755859375, + 65.62999725341797, + 65.41999816894531, + 65.20999908447266, + 67.0199966430664, + 71.2300033569336, + 74.55999755859375, + 74.66000366210938, + 81.01000213623047, + 90.9000015258789, + 94.7699966430664, + 83.44999694824219, + 87.25, + 95.7300033569336, + 98.70999908447266, + 93.5 + ], + "yaxis": "y7" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-17T00:00:00", + "2026-03-18T00:00:00", + "2026-03-19T00:00:00", + "2026-03-20T00:00:00", + "2026-03-23T00:00:00", + "2026-03-24T00:00:00", + "2026-03-25T00:00:00", + "2026-03-26T00:00:00", + "2026-03-27T00:00:00", + "2026-03-30T00:00:00", + "2026-03-31T00:00:00", + "2026-04-01T00:00:00", + "2026-04-02T00:00:00", + "2026-04-06T00:00:00", + "2026-04-07T00:00:00", + "2026-04-08T00:00:00", + "2026-04-09T00:00:00", + "2026-04-10T00:00:00", + "2026-04-13T00:00:00", + "2026-04-14T00:00:00" + ], + "xaxis": "x7", + "y": [ + 96.20999908447266, + 96.31999969482422, + 96.13999938964844, + 98.31999969482422, + 88.12999725341797, + 92.3499984741211, + 90.31999969482422, + 94.4800033569336, + 99.63999938964844, + 102.87999725341795, + 101.37999725341795, + 100.12000274658205, + 111.54000091552734, + 112.41000366210938, + 112.9499969482422, + 94.41000366210938, + 97.87000274658205, + 96.56999969482422, + 99.08000183105467, + 91.27999877929688 + ], + "yaxis": "y7" + }, + { + "error_y": { + "array": [ + 5.88000000000001, + 8.120000000000005, + 9.819999999999991 + ], + "arrayminus": [ + 4.819999999999993, + 6.079999999999998, + 7.180000000000007 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-23T00:00:00", + "2026-03-30T00:00:00", + "2026-04-14T00:00:00" + ], + "xaxis": "x7", + "y": [ + 98.32, + 102.88, + 95.18 + ], + "yaxis": "y7" + }, + { + "error_y": { + "array": [ + 7.5, + 9.099999999999994, + 10.700000000000005 + ], + "arrayminus": [ + 7.300000000000011, + 8.5, + 9.5 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-23T00:00:00", + "2026-03-30T00:00:00", + "2026-04-14T00:00:00" + ], + "xaxis": "x7", + "y": [ + 92.9, + 88, + 78.2 + ], + "yaxis": "y7" + }, + { + "error_y": { + "array": [ + 2.065800830941626, + 1.1442963064246785, + 2.1294013498790463 + ], + "arrayminus": [ + 3.0850032535107914, + 4.036076980567515, + 7.803309660346613 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-23T00:00:00", + "2026-03-30T00:00:00", + "2026-04-14T00:00:00" + ], + "xaxis": "x7", + "y": [ + 97.0192936445251, + 96.69314101927972, + 98.15667266072978 + ], + "yaxis": "y7" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-02-17T00:00:00", + "2026-02-18T00:00:00", + "2026-02-19T00:00:00", + "2026-02-20T00:00:00", + "2026-02-23T00:00:00", + "2026-02-24T00:00:00", + "2026-02-25T00:00:00", + "2026-02-26T00:00:00", + "2026-02-27T00:00:00", + "2026-03-02T00:00:00", + "2026-03-03T00:00:00", + "2026-03-04T00:00:00", + "2026-03-05T00:00:00", + "2026-03-06T00:00:00", + "2026-03-09T00:00:00", + "2026-03-10T00:00:00", + "2026-03-11T00:00:00", + "2026-03-12T00:00:00", + "2026-03-13T00:00:00", + "2026-03-16T00:00:00", + "2026-03-17T00:00:00", + "2026-03-18T00:00:00", + "2026-03-19T00:00:00", + "2026-03-20T00:00:00", + "2026-03-23T00:00:00" + ], + "xaxis": "x8", + "y": [ + 62.33000183105469, + 65.19000244140625, + 66.43000030517578, + 66.38999938964844, + 66.30999755859375, + 65.62999725341797, + 65.41999816894531, + 65.20999908447266, + 67.0199966430664, + 71.2300033569336, + 74.55999755859375, + 74.66000366210938, + 81.01000213623047, + 90.9000015258789, + 94.7699966430664, + 83.44999694824219, + 87.25, + 95.7300033569336, + 98.70999908447266, + 93.5, + 96.20999908447266, + 96.31999969482422, + 96.13999938964844, + 98.31999969482422, + 88.12999725341797 + ], + "yaxis": "y8" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-24T00:00:00", + "2026-03-25T00:00:00", + "2026-03-26T00:00:00", + "2026-03-27T00:00:00", + "2026-03-30T00:00:00", + "2026-03-31T00:00:00", + "2026-04-01T00:00:00", + "2026-04-02T00:00:00", + "2026-04-06T00:00:00", + "2026-04-07T00:00:00", + "2026-04-08T00:00:00", + "2026-04-09T00:00:00", + "2026-04-10T00:00:00", + "2026-04-13T00:00:00", + "2026-04-14T00:00:00", + "2026-04-15T00:00:00", + "2026-04-16T00:00:00", + "2026-04-17T00:00:00", + "2026-04-20T00:00:00", + "2026-04-21T00:00:00" + ], + "xaxis": "x8", + "y": [ + 92.3499984741211, + 90.31999969482422, + 94.4800033569336, + 99.63999938964844, + 102.87999725341795, + 101.37999725341795, + 100.12000274658205, + 111.54000091552734, + 112.41000366210938, + 112.9499969482422, + 94.41000366210938, + 97.87000274658205, + 96.56999969482422, + 99.08000183105467, + 91.27999877929688, + 91.29000091552734, + 94.69000244140624, + 83.8499984741211, + 89.61000061035156, + 92.12999725341795 + ], + "yaxis": "y8" + }, + { + "error_y": { + "array": [ + 9, + 10.5, + 12 + ], + "arrayminus": [ + 6.5, + 8.5, + 9 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-30T00:00:00", + "2026-04-06T00:00:00", + "2026-04-21T00:00:00" + ], + "xaxis": "x8", + "y": [ + 86.5, + 84.5, + 81 + ], + "yaxis": "y8" + }, + { + "error_y": { + "array": [ + 8.549999999999997, + 10.800000000000011, + 15.099999999999994 + ], + "arrayminus": [ + 8.049999999999997, + 9.599999999999994, + 12.049999999999995 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-30T00:00:00", + "2026-04-06T00:00:00", + "2026-04-21T00:00:00" + ], + "xaxis": "x8", + "y": [ + 96.5, + 94.85, + 91.5 + ], + "yaxis": "y8" + }, + { + "error_y": { + "array": [ + 0.8615922921248256, + 0.5040056095808723, + 1.5615465371502495 + ], + "arrayminus": [ + 2.8106503989552465, + 2.751205445541146, + 9.491381849253358 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-30T00:00:00", + "2026-04-06T00:00:00", + "2026-04-21T00:00:00" + ], + "xaxis": "x8", + "y": [ + 97.08841601412756, + 97.8736538480731, + 99.11819105936225 + ], + "yaxis": "y8" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-02-24T00:00:00", + "2026-02-25T00:00:00", + "2026-02-26T00:00:00", + "2026-02-27T00:00:00", + "2026-03-02T00:00:00", + "2026-03-03T00:00:00", + "2026-03-04T00:00:00", + "2026-03-05T00:00:00", + "2026-03-06T00:00:00", + "2026-03-09T00:00:00", + "2026-03-10T00:00:00", + "2026-03-11T00:00:00", + "2026-03-12T00:00:00", + "2026-03-13T00:00:00", + "2026-03-16T00:00:00", + "2026-03-17T00:00:00", + "2026-03-18T00:00:00", + "2026-03-19T00:00:00", + "2026-03-20T00:00:00", + "2026-03-23T00:00:00", + "2026-03-24T00:00:00", + "2026-03-25T00:00:00", + "2026-03-26T00:00:00", + "2026-03-27T00:00:00", + "2026-03-30T00:00:00" + ], + "xaxis": "x9", + "y": [ + 65.62999725341797, + 65.41999816894531, + 65.20999908447266, + 67.0199966430664, + 71.2300033569336, + 74.55999755859375, + 74.66000366210938, + 81.01000213623047, + 90.9000015258789, + 94.7699966430664, + 83.44999694824219, + 87.25, + 95.7300033569336, + 98.70999908447266, + 93.5, + 96.20999908447266, + 96.31999969482422, + 96.13999938964844, + 98.31999969482422, + 88.12999725341797, + 92.3499984741211, + 90.31999969482422, + 94.4800033569336, + 99.63999938964844, + 102.87999725341795 + ], + "yaxis": "y9" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-31T00:00:00", + "2026-04-01T00:00:00", + "2026-04-02T00:00:00", + "2026-04-06T00:00:00", + "2026-04-07T00:00:00", + "2026-04-08T00:00:00", + "2026-04-09T00:00:00", + "2026-04-10T00:00:00", + "2026-04-13T00:00:00", + "2026-04-14T00:00:00", + "2026-04-15T00:00:00", + "2026-04-16T00:00:00", + "2026-04-17T00:00:00", + "2026-04-20T00:00:00", + "2026-04-21T00:00:00", + "2026-04-22T00:00:00", + "2026-04-23T00:00:00", + "2026-04-24T00:00:00", + "2026-04-27T00:00:00", + "2026-04-28T00:00:00" + ], + "xaxis": "x9", + "y": [ + 101.37999725341795, + 100.12000274658205, + 111.54000091552734, + 112.41000366210938, + 112.9499969482422, + 94.41000366210938, + 97.87000274658205, + 96.56999969482422, + 99.08000183105467, + 91.27999877929688, + 91.29000091552734, + 94.69000244140624, + 83.8499984741211, + 89.61000061035156, + 92.12999725341795, + 92.95999908447266, + 95.8499984741211, + 94.4000015258789, + 96.37000274658205, + 99.93000030517578 + ], + "yaxis": "y9" + }, + { + "error_y": { + "array": [ + 7.5, + 9.5, + 12.5 + ], + "arrayminus": [ + 6, + 7, + 9.5 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-06T00:00:00", + "2026-04-13T00:00:00", + "2026-04-28T00:00:00" + ], + "xaxis": "x9", + "y": [ + 100, + 98, + 94.5 + ], + "yaxis": "y9" + }, + { + "error_y": { + "array": [ + 7.699999999999989, + 9.799999999999995, + 12.400000000000006 + ], + "arrayminus": [ + 7, + 8.5, + 9.599999999999994 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-06T00:00:00", + "2026-04-13T00:00:00", + "2026-04-28T00:00:00" + ], + "xaxis": "x9", + "y": [ + 97.4, + 94.8, + 89.8 + ], + "yaxis": "y9" + }, + { + "error_y": { + "array": [ + 3.092529948520422, + 2.307391698257163, + 7.203953632021168 + ], + "arrayminus": [ + 1.8037780421456944, + 4.012917297705144, + 4.23123655621032 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-06T00:00:00", + "2026-04-13T00:00:00", + "2026-04-28T00:00:00" + ], + "xaxis": "x9", + "y": [ + 99.43463410690524, + 97.7857460074704, + 97.9353699186534 + ], + "yaxis": "y9" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-02T00:00:00", + "2026-03-03T00:00:00", + "2026-03-04T00:00:00", + "2026-03-05T00:00:00", + "2026-03-06T00:00:00", + "2026-03-09T00:00:00", + "2026-03-10T00:00:00", + "2026-03-11T00:00:00", + "2026-03-12T00:00:00", + "2026-03-13T00:00:00", + "2026-03-16T00:00:00", + "2026-03-17T00:00:00", + "2026-03-18T00:00:00", + "2026-03-19T00:00:00", + "2026-03-20T00:00:00", + "2026-03-23T00:00:00", + "2026-03-24T00:00:00", + "2026-03-25T00:00:00", + "2026-03-26T00:00:00", + "2026-03-27T00:00:00", + "2026-03-30T00:00:00", + "2026-03-31T00:00:00", + "2026-04-01T00:00:00", + "2026-04-02T00:00:00", + "2026-04-06T00:00:00" + ], + "xaxis": "x10", + "y": [ + 71.2300033569336, + 74.55999755859375, + 74.66000366210938, + 81.01000213623047, + 90.9000015258789, + 94.7699966430664, + 83.44999694824219, + 87.25, + 95.7300033569336, + 98.70999908447266, + 93.5, + 96.20999908447266, + 96.31999969482422, + 96.13999938964844, + 98.31999969482422, + 88.12999725341797, + 92.3499984741211, + 90.31999969482422, + 94.4800033569336, + 99.63999938964844, + 102.87999725341795, + 101.37999725341795, + 100.12000274658205, + 111.54000091552734, + 112.41000366210938 + ], + "yaxis": "y10" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-07T00:00:00", + "2026-04-08T00:00:00", + "2026-04-09T00:00:00", + "2026-04-10T00:00:00", + "2026-04-13T00:00:00", + "2026-04-14T00:00:00", + "2026-04-15T00:00:00", + "2026-04-16T00:00:00", + "2026-04-17T00:00:00", + "2026-04-20T00:00:00", + "2026-04-21T00:00:00", + "2026-04-22T00:00:00", + "2026-04-23T00:00:00", + "2026-04-24T00:00:00", + "2026-04-27T00:00:00", + "2026-04-28T00:00:00", + "2026-04-29T00:00:00", + "2026-04-30T00:00:00", + "2026-05-01T00:00:00", + "2026-05-04T00:00:00", + "2026-05-05T00:00:00" + ], + "xaxis": "x10", + "y": [ + 112.9499969482422, + 94.41000366210938, + 97.87000274658205, + 96.56999969482422, + 99.08000183105467, + 91.27999877929688, + 91.29000091552734, + 94.69000244140624, + 83.8499984741211, + 89.61000061035156, + 92.12999725341795, + 92.95999908447266, + 95.8499984741211, + 94.4000015258789, + 96.37000274658205, + 99.93000030517578, + 106.87999725341795, + 105.06999969482422, + 101.94000244140624, + 106.41999816894533, + 102.2699966430664 + ], + "yaxis": "y10" + }, + { + "error_y": { + "array": [ + 8, + 10, + 12 + ], + "arrayminus": [ + 8, + 9, + 11 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-13T00:00:00", + "2026-04-20T00:00:00", + "2026-05-05T00:00:00" + ], + "xaxis": "x10", + "y": [ + 111, + 107, + 101 + ], + "yaxis": "y10" + }, + { + "error_y": { + "array": [ + 11.5, + 14.700000000000005, + 19.200000000000003 + ], + "arrayminus": [ + 11, + 13.400000000000006, + 16.099999999999994 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-13T00:00:00", + "2026-04-20T00:00:00", + "2026-05-05T00:00:00" + ], + "xaxis": "x10", + "y": [ + 110.2, + 108.5, + 105.1 + ], + "yaxis": "y10" + }, + { + "error_y": { + "array": [ + 3.3871081869549755, + 4.391068945117084, + 3.2897759065050565 + ], + "arrayminus": [ + 5.362135745165503, + 3.568112441676547, + 1.624172994848024 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-13T00:00:00", + "2026-04-20T00:00:00", + "2026-05-05T00:00:00" + ], + "xaxis": "x10", + "y": [ + 104.11581088946544, + 102.30227566156763, + 104.39134584257752 + ], + "yaxis": "y10" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-09T00:00:00", + "2026-03-10T00:00:00", + "2026-03-11T00:00:00", + "2026-03-12T00:00:00", + "2026-03-13T00:00:00", + "2026-03-16T00:00:00", + "2026-03-17T00:00:00", + "2026-03-18T00:00:00", + "2026-03-19T00:00:00", + "2026-03-20T00:00:00", + "2026-03-23T00:00:00", + "2026-03-24T00:00:00", + "2026-03-25T00:00:00", + "2026-03-26T00:00:00", + "2026-03-27T00:00:00", + "2026-03-30T00:00:00", + "2026-03-31T00:00:00", + "2026-04-01T00:00:00", + "2026-04-02T00:00:00", + "2026-04-06T00:00:00", + "2026-04-07T00:00:00", + "2026-04-08T00:00:00", + "2026-04-09T00:00:00", + "2026-04-10T00:00:00", + "2026-04-13T00:00:00" + ], + "xaxis": "x11", + "y": [ + 94.7699966430664, + 83.44999694824219, + 87.25, + 95.7300033569336, + 98.70999908447266, + 93.5, + 96.20999908447266, + 96.31999969482422, + 96.13999938964844, + 98.31999969482422, + 88.12999725341797, + 92.3499984741211, + 90.31999969482422, + 94.4800033569336, + 99.63999938964844, + 102.87999725341795, + 101.37999725341795, + 100.12000274658205, + 111.54000091552734, + 112.41000366210938, + 112.9499969482422, + 94.41000366210938, + 97.87000274658205, + 96.56999969482422, + 99.08000183105467 + ], + "yaxis": "y11" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-14T00:00:00", + "2026-04-15T00:00:00", + "2026-04-16T00:00:00", + "2026-04-17T00:00:00", + "2026-04-20T00:00:00", + "2026-04-21T00:00:00", + "2026-04-22T00:00:00", + "2026-04-23T00:00:00", + "2026-04-24T00:00:00", + "2026-04-27T00:00:00", + "2026-04-28T00:00:00", + "2026-04-29T00:00:00", + "2026-04-30T00:00:00", + "2026-05-01T00:00:00", + "2026-05-04T00:00:00", + "2026-05-05T00:00:00", + "2026-05-06T00:00:00", + "2026-05-07T00:00:00", + "2026-05-08T00:00:00", + "2026-05-11T00:00:00", + "2026-05-12T00:00:00" + ], + "xaxis": "x11", + "y": [ + 91.27999877929688, + 91.29000091552734, + 94.69000244140624, + 83.8499984741211, + 89.61000061035156, + 92.12999725341795, + 92.95999908447266, + 95.8499984741211, + 94.4000015258789, + 96.37000274658205, + 99.93000030517578, + 106.87999725341795, + 105.06999969482422, + 101.94000244140624, + 106.41999816894533, + 102.2699966430664, + 95.08000183105467, + 94.80999755859376, + 95.41999816894533, + 98.06999969482422, + 102.18000030517578 + ], + "yaxis": "y11" + }, + { + "error_y": { + "array": [ + 4.5, + 5.5, + 6.5 + ], + "arrayminus": [ + 4, + 5, + 8 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-20T00:00:00", + "2026-04-27T00:00:00", + "2026-05-12T00:00:00" + ], + "xaxis": "x11", + "y": [ + 106.5, + 110, + 112 + ], + "yaxis": "y11" + }, + { + "error_y": { + "array": [ + 4.1000000000000085, + 5.900000000000006, + 9.699999999999989 + ], + "arrayminus": [ + 3.799999999999997, + 5.299999999999997, + 8.100000000000009 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-20T00:00:00", + "2026-04-27T00:00:00", + "2026-05-12T00:00:00" + ], + "xaxis": "x11", + "y": [ + 96.3, + 95.1, + 92.4 + ], + "yaxis": "y11" + }, + { + "error_y": { + "array": [ + 3.749364122974896, + 4.642627756168125, + 6.169125151194791 + ], + "arrayminus": [ + 2.8324605796252484, + 3.691161011952815, + 9.28729190826772 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-20T00:00:00", + "2026-04-27T00:00:00", + "2026-05-12T00:00:00" + ], + "xaxis": "x11", + "y": [ + 96.88783936856557, + 97.46989403776756, + 96.9156635826384 + ], + "yaxis": "y11" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-16T00:00:00", + "2026-03-17T00:00:00", + "2026-03-18T00:00:00", + "2026-03-19T00:00:00", + "2026-03-20T00:00:00", + "2026-03-23T00:00:00", + "2026-03-24T00:00:00", + "2026-03-25T00:00:00", + "2026-03-26T00:00:00", + "2026-03-27T00:00:00", + "2026-03-30T00:00:00", + "2026-03-31T00:00:00", + "2026-04-01T00:00:00", + "2026-04-02T00:00:00", + "2026-04-06T00:00:00", + "2026-04-07T00:00:00", + "2026-04-08T00:00:00", + "2026-04-09T00:00:00", + "2026-04-10T00:00:00", + "2026-04-13T00:00:00", + "2026-04-14T00:00:00", + "2026-04-15T00:00:00", + "2026-04-16T00:00:00", + "2026-04-17T00:00:00", + "2026-04-20T00:00:00" + ], + "xaxis": "x12", + "y": [ + 93.5, + 96.20999908447266, + 96.31999969482422, + 96.13999938964844, + 98.31999969482422, + 88.12999725341797, + 92.3499984741211, + 90.31999969482422, + 94.4800033569336, + 99.63999938964844, + 102.87999725341795, + 101.37999725341795, + 100.12000274658205, + 111.54000091552734, + 112.41000366210938, + 112.9499969482422, + 94.41000366210938, + 97.87000274658205, + 96.56999969482422, + 99.08000183105467, + 91.27999877929688, + 91.29000091552734, + 94.69000244140624, + 83.8499984741211, + 89.61000061035156 + ], + "yaxis": "y12" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-21T00:00:00", + "2026-04-22T00:00:00", + "2026-04-23T00:00:00", + "2026-04-24T00:00:00", + "2026-04-27T00:00:00", + "2026-04-28T00:00:00", + "2026-04-29T00:00:00", + "2026-04-30T00:00:00", + "2026-05-01T00:00:00", + "2026-05-04T00:00:00", + "2026-05-05T00:00:00", + "2026-05-06T00:00:00", + "2026-05-07T00:00:00", + "2026-05-08T00:00:00", + "2026-05-11T00:00:00", + "2026-05-12T00:00:00", + "2026-05-13T00:00:00", + "2026-05-14T00:00:00", + "2026-05-15T00:00:00", + "2026-05-18T00:00:00", + "2026-05-19T00:00:00" + ], + "xaxis": "x12", + "y": [ + 92.12999725341795, + 92.95999908447266, + 95.8499984741211, + 94.4000015258789, + 96.37000274658205, + 99.93000030517578, + 106.87999725341795, + 105.06999969482422, + 101.94000244140624, + 106.41999816894533, + 102.2699966430664, + 95.08000183105467, + 94.80999755859376, + 95.41999816894533, + 98.06999969482422, + 102.18000030517578, + 101.0199966430664, + 101.16999816894533, + 105.41999816894533, + 108.66000366210938, + 107.7699966430664 + ], + "yaxis": "y12" + }, + { + "error_y": { + "array": [ + 5, + 6.5, + 8 + ], + "arrayminus": [ + 5, + 6.5, + 9 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-27T00:00:00", + "2026-05-04T00:00:00", + "2026-05-19T00:00:00" + ], + "xaxis": "x12", + "y": [ + 96, + 105.5, + 102 + ], + "yaxis": "y12" + }, + { + "error_y": { + "array": [ + 6.200000000000003, + 8, + 11.400000000000006 + ], + "arrayminus": [ + 5.599999999999994, + 7.299999999999997, + 10.599999999999994 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-27T00:00:00", + "2026-05-04T00:00:00", + "2026-05-19T00:00:00" + ], + "xaxis": "x12", + "y": [ + 84.1, + 83.6, + 82.5 + ], + "yaxis": "y12" + }, + { + "error_y": { + "array": [ + 6.976697409267828, + 6.593622209280426, + 6.117087295263502 + ], + "arrayminus": [ + 3.8378465149603898, + 6.565672308332978, + 15.522320422304231 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-27T00:00:00", + "2026-05-04T00:00:00", + "2026-05-19T00:00:00" + ], + "xaxis": "x12", + "y": [ + 85.32536976209812, + 85.20522134010547, + 89.2270323998424 + ], + "yaxis": "y12" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-23T00:00:00", + "2026-03-24T00:00:00", + "2026-03-25T00:00:00", + "2026-03-26T00:00:00", + "2026-03-27T00:00:00", + "2026-03-30T00:00:00", + "2026-03-31T00:00:00", + "2026-04-01T00:00:00", + "2026-04-02T00:00:00", + "2026-04-06T00:00:00", + "2026-04-07T00:00:00", + "2026-04-08T00:00:00", + "2026-04-09T00:00:00", + "2026-04-10T00:00:00", + "2026-04-13T00:00:00", + "2026-04-14T00:00:00", + "2026-04-15T00:00:00", + "2026-04-16T00:00:00", + "2026-04-17T00:00:00", + "2026-04-20T00:00:00", + "2026-04-21T00:00:00", + "2026-04-22T00:00:00", + "2026-04-23T00:00:00", + "2026-04-24T00:00:00", + "2026-04-27T00:00:00" + ], + "xaxis": "x13", + "y": [ + 88.12999725341797, + 92.3499984741211, + 90.31999969482422, + 94.4800033569336, + 99.63999938964844, + 102.87999725341795, + 101.37999725341795, + 100.12000274658205, + 111.54000091552734, + 112.41000366210938, + 112.9499969482422, + 94.41000366210938, + 97.87000274658205, + 96.56999969482422, + 99.08000183105467, + 91.27999877929688, + 91.29000091552734, + 94.69000244140624, + 83.8499984741211, + 89.61000061035156, + 92.12999725341795, + 92.95999908447266, + 95.8499984741211, + 94.4000015258789, + 96.37000274658205 + ], + "yaxis": "y13" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-28T00:00:00", + "2026-04-29T00:00:00", + "2026-04-30T00:00:00", + "2026-05-01T00:00:00", + "2026-05-04T00:00:00", + "2026-05-05T00:00:00", + "2026-05-06T00:00:00", + "2026-05-07T00:00:00", + "2026-05-08T00:00:00", + "2026-05-11T00:00:00", + "2026-05-12T00:00:00", + "2026-05-13T00:00:00", + "2026-05-14T00:00:00", + "2026-05-15T00:00:00", + "2026-05-18T00:00:00", + "2026-05-19T00:00:00", + "2026-05-20T00:00:00", + "2026-05-21T00:00:00", + "2026-05-22T00:00:00", + "2026-05-26T00:00:00" + ], + "xaxis": "x13", + "y": [ + 99.93000030517578, + 106.87999725341795, + 105.06999969482422, + 101.94000244140624, + 106.41999816894533, + 102.2699966430664, + 95.08000183105467, + 94.80999755859376, + 95.41999816894533, + 98.06999969482422, + 102.18000030517578, + 101.0199966430664, + 101.16999816894533, + 105.41999816894533, + 108.66000366210938, + 107.7699966430664, + 98.26000213623048, + 96.3499984741211, + 96.5999984741211, + 93.88999938964844 + ], + "yaxis": "y13" + }, + { + "error_y": { + "array": [ + 6, + 9, + 11.5 + ], + "arrayminus": [ + 6, + 8, + 10 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-05-04T00:00:00", + "2026-05-11T00:00:00", + "2026-05-26T00:00:00" + ], + "xaxis": "x13", + "y": [ + 98, + 99, + 97 + ], + "yaxis": "y13" + }, + { + "error_y": { + "array": [ + 8.5, + 11, + 16.700000000000003 + ], + "arrayminus": [ + 8.5, + 10.5, + 13.299999999999995 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-05-04T00:00:00", + "2026-05-11T00:00:00", + "2026-05-26T00:00:00" + ], + "xaxis": "x13", + "y": [ + 93.5, + 91, + 85.5 + ], + "yaxis": "y13" + }, + { + "error_y": { + "array": [ + 3.3093267857251902, + 1.983145150854952, + 3.9607494296932377 + ], + "arrayminus": [ + 2.0394141199098783, + 4.464146113750573, + 5.885875178920244 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-05-04T00:00:00", + "2026-05-11T00:00:00", + "2026-05-26T00:00:00" + ], + "xaxis": "x13", + "y": [ + 93.9837992111415, + 95.4061986072814, + 94.70375505178318 + ], + "yaxis": "y13" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-03-30T00:00:00", + "2026-03-31T00:00:00", + "2026-04-01T00:00:00", + "2026-04-02T00:00:00", + "2026-04-06T00:00:00", + "2026-04-07T00:00:00", + "2026-04-08T00:00:00", + "2026-04-09T00:00:00", + "2026-04-10T00:00:00", + "2026-04-13T00:00:00", + "2026-04-14T00:00:00", + "2026-04-15T00:00:00", + "2026-04-16T00:00:00", + "2026-04-17T00:00:00", + "2026-04-20T00:00:00", + "2026-04-21T00:00:00", + "2026-04-22T00:00:00", + "2026-04-23T00:00:00", + "2026-04-24T00:00:00", + "2026-04-27T00:00:00", + "2026-04-28T00:00:00", + "2026-04-29T00:00:00", + "2026-04-30T00:00:00", + "2026-05-01T00:00:00", + "2026-05-04T00:00:00" + ], + "xaxis": "x14", + "y": [ + 102.87999725341795, + 101.37999725341795, + 100.12000274658205, + 111.54000091552734, + 112.41000366210938, + 112.9499969482422, + 94.41000366210938, + 97.87000274658205, + 96.56999969482422, + 99.08000183105467, + 91.27999877929688, + 91.29000091552734, + 94.69000244140624, + 83.8499984741211, + 89.61000061035156, + 92.12999725341795, + 92.95999908447266, + 95.8499984741211, + 94.4000015258789, + 96.37000274658205, + 99.93000030517578, + 106.87999725341795, + 105.06999969482422, + 101.94000244140624, + 106.41999816894533 + ], + "yaxis": "y14" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-05-05T00:00:00", + "2026-05-06T00:00:00", + "2026-05-07T00:00:00", + "2026-05-08T00:00:00", + "2026-05-11T00:00:00", + "2026-05-12T00:00:00", + "2026-05-13T00:00:00", + "2026-05-14T00:00:00", + "2026-05-15T00:00:00", + "2026-05-18T00:00:00", + "2026-05-19T00:00:00", + "2026-05-20T00:00:00", + "2026-05-21T00:00:00", + "2026-05-22T00:00:00", + "2026-05-26T00:00:00", + "2026-05-27T00:00:00", + "2026-05-28T00:00:00", + "2026-05-29T00:00:00", + "2026-06-01T00:00:00", + "2026-06-02T00:00:00" + ], + "xaxis": "x14", + "y": [ + 102.2699966430664, + 95.08000183105467, + 94.80999755859376, + 95.41999816894533, + 98.06999969482422, + 102.18000030517578, + 101.0199966430664, + 101.16999816894533, + 105.41999816894533, + 108.66000366210938, + 107.7699966430664, + 98.26000213623048, + 96.3499984741211, + 96.5999984741211, + 93.88999938964844, + 88.68000030517578, + 88.9000015258789, + 87.36000061035156, + 92.16000366210938, + 93.76000213623048 + ], + "yaxis": "y14" + }, + { + "error_y": { + "array": [ + 9.5, + 12, + 14 + ], + "arrayminus": [ + 15, + 18, + 20.5 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-05-11T00:00:00", + "2026-05-18T00:00:00", + "2026-06-02T00:00:00" + ], + "xaxis": "x14", + "y": [ + 105, + 104, + 102.5 + ], + "yaxis": "y14" + }, + { + "error_y": { + "array": [ + 6.950000000000003, + 9.409999999999997, + 13.679999999999993 + ], + "arrayminus": [ + 6.539999999999992, + 8.849999999999994, + 12.579999999999998 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-05-11T00:00:00", + "2026-05-18T00:00:00", + "2026-06-02T00:00:00" + ], + "xaxis": "x14", + "y": [ + 101.88, + 101.78, + 100.42 + ], + "yaxis": "y14" + }, + { + "error_y": { + "array": [ + 2.669484917331033, + 1.5515135529144146, + 11.746813459719988 + ], + "arrayminus": [ + 2.9053198532255635, + 6.34995019572402, + 6.847106853898595 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-05-11T00:00:00", + "2026-05-18T00:00:00", + "2026-06-02T00:00:00" + ], + "xaxis": "x14", + "y": [ + 98.88870250830657, + 100.82378413494186, + 96.49592587645714 + ], + "yaxis": "y14" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-07T00:00:00", + "2026-04-08T00:00:00", + "2026-04-09T00:00:00", + "2026-04-10T00:00:00", + "2026-04-13T00:00:00", + "2026-04-14T00:00:00", + "2026-04-15T00:00:00", + "2026-04-16T00:00:00", + "2026-04-17T00:00:00", + "2026-04-20T00:00:00", + "2026-04-21T00:00:00", + "2026-04-22T00:00:00", + "2026-04-23T00:00:00", + "2026-04-24T00:00:00", + "2026-04-27T00:00:00", + "2026-04-28T00:00:00", + "2026-04-29T00:00:00", + "2026-04-30T00:00:00", + "2026-05-01T00:00:00", + "2026-05-04T00:00:00", + "2026-05-05T00:00:00", + "2026-05-06T00:00:00", + "2026-05-07T00:00:00", + "2026-05-08T00:00:00", + "2026-05-11T00:00:00" + ], + "xaxis": "x15", + "y": [ + 112.9499969482422, + 94.41000366210938, + 97.87000274658205, + 96.56999969482422, + 99.08000183105467, + 91.27999877929688, + 91.29000091552734, + 94.69000244140624, + 83.8499984741211, + 89.61000061035156, + 92.12999725341795, + 92.95999908447266, + 95.8499984741211, + 94.4000015258789, + 96.37000274658205, + 99.93000030517578, + 106.87999725341795, + 105.06999969482422, + 101.94000244140624, + 106.41999816894533, + 102.2699966430664, + 95.08000183105467, + 94.80999755859376, + 95.41999816894533, + 98.06999969482422 + ], + "yaxis": "y15" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-05-12T00:00:00", + "2026-05-13T00:00:00", + "2026-05-14T00:00:00", + "2026-05-15T00:00:00", + "2026-05-18T00:00:00", + "2026-05-19T00:00:00", + "2026-05-20T00:00:00", + "2026-05-21T00:00:00", + "2026-05-22T00:00:00", + "2026-05-26T00:00:00", + "2026-05-27T00:00:00", + "2026-05-28T00:00:00", + "2026-05-29T00:00:00", + "2026-06-01T00:00:00", + "2026-06-02T00:00:00", + "2026-06-03T00:00:00", + "2026-06-04T00:00:00", + "2026-06-05T00:00:00", + "2026-06-08T00:00:00", + "2026-06-09T00:00:00" + ], + "xaxis": "x15", + "y": [ + 102.18000030517578, + 101.0199966430664, + 101.16999816894533, + 105.41999816894533, + 108.66000366210938, + 107.7699966430664, + 98.26000213623048, + 96.3499984741211, + 96.5999984741211, + 93.88999938964844, + 88.68000030517578, + 88.9000015258789, + 87.36000061035156, + 92.16000366210938, + 93.76000213623048, + 96.0199966430664, + 93.04000091552734, + 90.54000091552734, + 91.3000030517578, + 88.19999694824219 + ], + "yaxis": "y15" + }, + { + "error_y": { + "array": [ + 6, + 13 + ], + "arrayminus": [ + 3.5, + 9 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-05-18T00:00:00", + "2026-06-09T00:00:00" + ], + "xaxis": "x15", + "y": [ + 95, + 90 + ], + "yaxis": "y15" + }, + { + "error_y": { + "array": [ + 5, + 11.600000000000009 + ], + "arrayminus": [ + 5, + 10.799999999999995 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-05-18T00:00:00", + "2026-06-09T00:00:00" + ], + "xaxis": "x15", + "y": [ + 94.5, + 89.6 + ], + "yaxis": "y15" + }, + { + "error_y": { + "array": [ + 4.310629068666728, + 3.7793670453956025 + ], + "arrayminus": [ + 3.516989857570451, + 11.49199493198948 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-05-18T00:00:00", + "2026-06-09T00:00:00" + ], + "xaxis": "x15", + "y": [ + 95.80925267864224, + 99.12568942543513 + ], + "yaxis": "y15" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-14T00:00:00", + "2026-04-15T00:00:00", + "2026-04-16T00:00:00", + "2026-04-17T00:00:00", + "2026-04-20T00:00:00", + "2026-04-21T00:00:00", + "2026-04-22T00:00:00", + "2026-04-23T00:00:00", + "2026-04-24T00:00:00", + "2026-04-27T00:00:00", + "2026-04-28T00:00:00", + "2026-04-29T00:00:00", + "2026-04-30T00:00:00", + "2026-05-01T00:00:00", + "2026-05-04T00:00:00", + "2026-05-05T00:00:00", + "2026-05-06T00:00:00", + "2026-05-07T00:00:00", + "2026-05-08T00:00:00", + "2026-05-11T00:00:00", + "2026-05-12T00:00:00", + "2026-05-13T00:00:00", + "2026-05-14T00:00:00", + "2026-05-15T00:00:00", + "2026-05-18T00:00:00" + ], + "xaxis": "x16", + "y": [ + 91.27999877929688, + 91.29000091552734, + 94.69000244140624, + 83.8499984741211, + 89.61000061035156, + 92.12999725341795, + 92.95999908447266, + 95.8499984741211, + 94.4000015258789, + 96.37000274658205, + 99.93000030517578, + 106.87999725341795, + 105.06999969482422, + 101.94000244140624, + 106.41999816894533, + 102.2699966430664, + 95.08000183105467, + 94.80999755859376, + 95.41999816894533, + 98.06999969482422, + 102.18000030517578, + 101.0199966430664, + 101.16999816894533, + 105.41999816894533, + 108.66000366210938 + ], + "yaxis": "y16" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-05-19T00:00:00", + "2026-05-20T00:00:00", + "2026-05-21T00:00:00", + "2026-05-22T00:00:00", + "2026-05-26T00:00:00", + "2026-05-27T00:00:00", + "2026-05-28T00:00:00", + "2026-05-29T00:00:00", + "2026-06-01T00:00:00", + "2026-06-02T00:00:00", + "2026-06-03T00:00:00", + "2026-06-04T00:00:00", + "2026-06-05T00:00:00", + "2026-06-08T00:00:00", + "2026-06-09T00:00:00", + "2026-06-10T00:00:00", + "2026-06-11T00:00:00", + "2026-06-12T00:00:00", + "2026-06-15T00:00:00", + "2026-06-16T00:00:00" + ], + "xaxis": "x16", + "y": [ + 107.7699966430664, + 98.26000213623048, + 96.3499984741211, + 96.5999984741211, + 93.88999938964844, + 88.68000030517578, + 88.9000015258789, + 87.36000061035156, + 92.16000366210938, + 93.76000213623048, + 96.0199966430664, + 93.04000091552734, + 90.54000091552734, + 91.3000030517578, + 88.19999694824219, + 90.02999877929688, + 87.70999908447266, + 84.87999725341797, + 80.75, + 76.05000305175781 + ], + "yaxis": "y16" + }, + { + "error_y": { + "array": [ + 7.340000000000003, + 7.230000000000004 + ], + "arrayminus": [ + 6.659999999999997, + 6.269999999999996 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-06-01T00:00:00", + "2026-06-16T00:00:00" + ], + "xaxis": "x16", + "y": [ + 92.16, + 75.27 + ], + "yaxis": "y16" + }, + { + "error_y": { + "array": [ + 6.700000000000003, + 8 + ], + "arrayminus": [ + 6.699999999999989, + 7.900000000000006 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-06-01T00:00:00", + "2026-06-16T00:00:00" + ], + "xaxis": "x16", + "y": [ + 99.6, + 93.5 + ], + "yaxis": "y16" + }, + { + "error_y": { + "array": [ + 4.375103866136882, + 2.7907944255048136 + ], + "arrayminus": [ + 6.166391245810999, + 6.519215687567382 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-06-01T00:00:00", + "2026-06-16T00:00:00" + ], + "xaxis": "x16", + "y": [ + 101.04057231783618, + 107.86742743264006 + ], + "yaxis": "y16" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-20T00:00:00", + "2026-04-21T00:00:00", + "2026-04-22T00:00:00", + "2026-04-23T00:00:00", + "2026-04-24T00:00:00", + "2026-04-27T00:00:00", + "2026-04-28T00:00:00", + "2026-04-29T00:00:00", + "2026-04-30T00:00:00", + "2026-05-01T00:00:00", + "2026-05-04T00:00:00", + "2026-05-05T00:00:00", + "2026-05-06T00:00:00", + "2026-05-07T00:00:00", + "2026-05-08T00:00:00", + "2026-05-11T00:00:00", + "2026-05-12T00:00:00", + "2026-05-13T00:00:00", + "2026-05-14T00:00:00", + "2026-05-15T00:00:00", + "2026-05-18T00:00:00", + "2026-05-19T00:00:00", + "2026-05-20T00:00:00", + "2026-05-21T00:00:00", + "2026-05-22T00:00:00" + ], + "xaxis": "x17", + "y": [ + 89.61000061035156, + 92.12999725341795, + 92.95999908447266, + 95.8499984741211, + 94.4000015258789, + 96.37000274658205, + 99.93000030517578, + 106.87999725341795, + 105.06999969482422, + 101.94000244140624, + 106.41999816894533, + 102.2699966430664, + 95.08000183105467, + 94.80999755859376, + 95.41999816894533, + 98.06999969482422, + 102.18000030517578, + 101.0199966430664, + 101.16999816894533, + 105.41999816894533, + 108.66000366210938, + 107.7699966430664, + 98.26000213623048, + 96.3499984741211, + 96.5999984741211 + ], + "yaxis": "y17" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-05-26T00:00:00", + "2026-05-27T00:00:00", + "2026-05-28T00:00:00", + "2026-05-29T00:00:00", + "2026-06-01T00:00:00", + "2026-06-02T00:00:00", + "2026-06-03T00:00:00", + "2026-06-04T00:00:00", + "2026-06-05T00:00:00", + "2026-06-08T00:00:00", + "2026-06-09T00:00:00", + "2026-06-10T00:00:00", + "2026-06-11T00:00:00", + "2026-06-12T00:00:00", + "2026-06-15T00:00:00", + "2026-06-16T00:00:00", + "2026-06-17T00:00:00", + "2026-06-18T00:00:00", + "2026-06-22T00:00:00", + "2026-06-23T00:00:00" + ], + "xaxis": "x17", + "y": [ + 93.88999938964844, + 88.68000030517578, + 88.9000015258789, + 87.36000061035156, + 92.16000366210938, + 93.76000213623048, + 96.0199966430664, + 93.04000091552734, + 90.54000091552734, + 91.3000030517578, + 88.19999694824219, + 90.02999877929688, + 87.70999908447266, + 84.87999725341797, + 80.75, + 76.05000305175781, + 76.79000091552734, + 76.5999984741211, + 74.81999969482422, + 73.20999908447266 + ], + "yaxis": "y17" + }, + { + "error_y": { + "array": [ + 4, + 5.5, + 6.5 + ], + "arrayminus": [ + 3.5, + 4.5, + 5 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-06-01T00:00:00", + "2026-06-08T00:00:00", + "2026-06-23T00:00:00" + ], + "xaxis": "x17", + "y": [ + 90, + 87.5, + 72.5 + ], + "yaxis": "y17" + }, + { + "error_y": { + "array": [ + 4.1200000000000045, + 5.47999999999999, + 8.39 + ], + "arrayminus": [ + 3.6799999999999926, + 4.910000000000011, + 6.900000000000006 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-06-01T00:00:00", + "2026-06-08T00:00:00", + "2026-06-23T00:00:00" + ], + "xaxis": "x17", + "y": [ + 94.99, + 92.93, + 88.11 + ], + "yaxis": "y17" + }, + { + "error_y": { + "array": [ + 4.129085448747404, + 3.383115837632829, + 2.058003499218344 + ], + "arrayminus": [ + 3.808728704337142, + 2.3762822803994226, + 3.9488512037813166 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-06-01T00:00:00", + "2026-06-08T00:00:00", + "2026-06-23T00:00:00" + ], + "xaxis": "x17", + "y": [ + 93.9927445788524, + 95.29043814066736, + 96.74480316139892 + ], + "yaxis": "y17" + }, + { + "legendgroup": "hist", + "line": { + "color": "#bdd7e7", + "width": 1.5 + }, + "mode": "lines", + "name": "WTI history", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-04-27T00:00:00", + "2026-04-28T00:00:00", + "2026-04-29T00:00:00", + "2026-04-30T00:00:00", + "2026-05-01T00:00:00", + "2026-05-04T00:00:00", + "2026-05-05T00:00:00", + "2026-05-06T00:00:00", + "2026-05-07T00:00:00", + "2026-05-08T00:00:00", + "2026-05-11T00:00:00", + "2026-05-12T00:00:00", + "2026-05-13T00:00:00", + "2026-05-14T00:00:00", + "2026-05-15T00:00:00", + "2026-05-18T00:00:00", + "2026-05-19T00:00:00", + "2026-05-20T00:00:00", + "2026-05-21T00:00:00", + "2026-05-22T00:00:00", + "2026-05-26T00:00:00", + "2026-05-27T00:00:00", + "2026-05-28T00:00:00", + "2026-05-29T00:00:00", + "2026-06-01T00:00:00" + ], + "xaxis": "x18", + "y": [ + 96.37000274658205, + 99.93000030517578, + 106.87999725341795, + 105.06999969482422, + 101.94000244140624, + 106.41999816894533, + 102.2699966430664, + 95.08000183105467, + 94.80999755859376, + 95.41999816894533, + 98.06999969482422, + 102.18000030517578, + 101.0199966430664, + 101.16999816894533, + 105.41999816894533, + 108.66000366210938, + 107.7699966430664, + 98.26000213623048, + 96.3499984741211, + 96.5999984741211, + 93.88999938964844, + 88.68000030517578, + 88.9000015258789, + 87.36000061035156, + 92.16000366210938 + ], + "yaxis": "y18" + }, + { + "legendgroup": "actual", + "line": { + "color": "#2171b5", + "width": 2.5 + }, + "marker": { + "size": 5 + }, + "mode": "lines+markers", + "name": "Realised price", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-06-02T00:00:00", + "2026-06-03T00:00:00", + "2026-06-04T00:00:00", + "2026-06-05T00:00:00", + "2026-06-08T00:00:00", + "2026-06-09T00:00:00", + "2026-06-10T00:00:00", + "2026-06-11T00:00:00", + "2026-06-12T00:00:00", + "2026-06-15T00:00:00", + "2026-06-16T00:00:00", + "2026-06-17T00:00:00", + "2026-06-18T00:00:00", + "2026-06-22T00:00:00", + "2026-06-23T00:00:00", + "2026-06-24T00:00:00", + "2026-06-25T00:00:00", + "2026-06-26T00:00:00", + "2026-06-29T00:00:00", + "2026-06-30T00:00:00" + ], + "xaxis": "x18", + "y": [ + 93.76000213623048, + 96.0199966430664, + 93.04000091552734, + 90.54000091552734, + 91.3000030517578, + 88.19999694824219, + 90.02999877929688, + 87.70999908447266, + 84.87999725341797, + 80.75, + 76.05000305175781, + 76.79000091552734, + 76.5999984741211, + 74.81999969482422, + 73.20999908447266, + 70.33999633789062, + 71.91999816894531, + 69.2300033569336, + 70.75, + 69.9000015258789 + ], + "yaxis": "y18" + }, + { + "error_y": { + "array": [ + 5.459999999999994, + 6.1200000000000045, + 8.25 + ], + "arrayminus": [ + 4.540000000000006, + 5.3799999999999955, + 5.75 + ], + "color": "#1f77b4", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "News Agent (gemini-3.5-flash)", + "line": { + "color": "#1f77b4", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "News Agent (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-06-08T00:00:00", + "2026-06-15T00:00:00", + "2026-06-30T00:00:00" + ], + "xaxis": "x18", + "y": [ + 90.54, + 84.88, + 70.75 + ], + "yaxis": "y18" + }, + { + "error_y": { + "array": [ + 7.899999999999992, + 10.129999999999995, + 14.590000000000003 + ], + "arrayminus": [ + 7.989999999999995, + 10.47, + 14.100000000000009 + ], + "color": "#ff7f0e", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LLMP-Grid (gemini-3.5-flash)", + "line": { + "color": "#ff7f0e", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LLMP-Grid (gemini-3.5-flash)", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-06-08T00:00:00", + "2026-06-15T00:00:00", + "2026-06-30T00:00:00" + ], + "xaxis": "x18", + "y": [ + 87.42, + 86.48, + 85.45 + ], + "yaxis": "y18" + }, + { + "error_y": { + "array": [ + 4.28133332196731, + 5.306094834521161, + 6.8262832406309 + ], + "arrayminus": [ + 4.693297958729573, + 10.481102691845493, + 14.166214893641822 + ], + "color": "#2ca02c", + "symmetric": false, + "thickness": 1.4, + "type": "data", + "width": 4 + }, + "legendgroup": "LightGBM", + "line": { + "color": "#2ca02c", + "dash": "dot", + "width": 1.4 + }, + "marker": { + "size": 8, + "symbol": "diamond" + }, + "mode": "lines+markers", + "name": "LightGBM", + "showlegend": false, + "type": "scatter", + "x": [ + "2026-06-08T00:00:00", + "2026-06-15T00:00:00", + "2026-06-30T00:00:00" + ], + "xaxis": "x18", + "y": [ + 88.45896674515633, + 87.0580625405234, + 92.87741511084948 + ], + "yaxis": "y18" + } + ], + "layout": { + "annotations": [ + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Feb 02, 2026 WTI $62", + "x": 0.01361111111111111, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Feb 09, 2026 WTI $64", + "x": 0.07083333333333333, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Feb 16, 2026 WTI $62", + "x": 0.12805555555555553, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Feb 23, 2026 WTI $66", + "x": 0.18527777777777776, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Mar 02, 2026 WTI $71", + "x": 0.24249999999999997, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Mar 09, 2026 WTI $95", + "x": 0.2997222222222222, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Mar 16, 2026 WTI $94", + "x": 0.3569444444444444, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Mar 23, 2026 WTI $88", + "x": 0.4141666666666667, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Mar 30, 2026 WTI $103", + "x": 0.47138888888888886, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Apr 06, 2026 WTI $112", + "x": 0.5286111111111111, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Apr 13, 2026 WTI $99", + "x": 0.5858333333333333, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Apr 20, 2026 WTI $90", + "x": 0.6430555555555555, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Apr 27, 2026 WTI $96", + "x": 0.7002777777777778, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "May 04, 2026 WTI $106", + "x": 0.7575, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "May 11, 2026 WTI $98", + "x": 0.8147222222222222, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "May 18, 2026 WTI $109", + "x": 0.8719444444444444, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "May 25, 2026 WTI $94", + "x": 0.9291666666666666, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Jun 01, 2026 WTI $92", + "x": 0.9863888888888888, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + } + ], + "height": 480, + "legend": { + "font": { + "size": 11 + }, + "orientation": "h", + "x": 0, + "xanchor": "left", + "y": -0.18 + }, + "margin": { + "b": 110, + "l": 60, + "r": 20, + "t": 80 + }, + "shapes": [ + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1769990400000, + "x1": 1769990400000, + "xref": "x", + "y0": 0, + "y1": 1, + "yref": "y domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1770595200000, + "x1": 1770595200000, + "xref": "x2", + "y0": 0, + "y1": 1, + "yref": "y2 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1771200000000, + "x1": 1771200000000, + "xref": "x3", + "y0": 0, + "y1": 1, + "yref": "y3 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1771804800000, + "x1": 1771804800000, + "xref": "x4", + "y0": 0, + "y1": 1, + "yref": "y4 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1772409600000, + "x1": 1772409600000, + "xref": "x5", + "y0": 0, + "y1": 1, + "yref": "y5 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1773014400000, + "x1": 1773014400000, + "xref": "x6", + "y0": 0, + "y1": 1, + "yref": "y6 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1773619200000, + "x1": 1773619200000, + "xref": "x7", + "y0": 0, + "y1": 1, + "yref": "y7 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1774224000000, + "x1": 1774224000000, + "xref": "x8", + "y0": 0, + "y1": 1, + "yref": "y8 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1774828800000, + "x1": 1774828800000, + "xref": "x9", + "y0": 0, + "y1": 1, + "yref": "y9 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1775433600000, + "x1": 1775433600000, + "xref": "x10", + "y0": 0, + "y1": 1, + "yref": "y10 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1776038400000, + "x1": 1776038400000, + "xref": "x11", + "y0": 0, + "y1": 1, + "yref": "y11 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1776643200000, + "x1": 1776643200000, + "xref": "x12", + "y0": 0, + "y1": 1, + "yref": "y12 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1777248000000, + "x1": 1777248000000, + "xref": "x13", + "y0": 0, + "y1": 1, + "yref": "y13 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1777852800000, + "x1": 1777852800000, + "xref": "x14", + "y0": 0, + "y1": 1, + "yref": "y14 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1778457600000, + "x1": 1778457600000, + "xref": "x15", + "y0": 0, + "y1": 1, + "yref": "y15 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1779062400000, + "x1": 1779062400000, + "xref": "x16", + "y0": 0, + "y1": 1, + "yref": "y16 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1779667200000, + "x1": 1779667200000, + "xref": "x17", + "y0": 0, + "y1": 1, + "yref": "y17 domain" + }, + { + "line": { + "color": "#aaaaaa", + "dash": "dash", + "width": 1 + }, + "type": "line", + "x0": 1780272000000, + "x1": 1780272000000, + "xref": "x18", + "y0": 0, + "y1": 1, + "yref": "y18 domain" + } + ], + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "font": { + "size": 16 + }, + "text": "Eval Forecasts vs Reality — Median + 80% Interval by Origin" + }, + "width": 7560, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 0.02722222222222222 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis10": { + "anchor": "y10", + "domain": [ + 0.515, + 0.5422222222222223 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis11": { + "anchor": "y11", + "domain": [ + 0.5722222222222222, + 0.5994444444444444 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis12": { + "anchor": "y12", + "domain": [ + 0.6294444444444444, + 0.6566666666666666 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis13": { + "anchor": "y13", + "domain": [ + 0.6866666666666666, + 0.7138888888888889 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis14": { + "anchor": "y14", + "domain": [ + 0.7438888888888888, + 0.7711111111111111 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis15": { + "anchor": "y15", + "domain": [ + 0.8011111111111111, + 0.8283333333333334 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis16": { + "anchor": "y16", + "domain": [ + 0.8583333333333333, + 0.8855555555555555 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis17": { + "anchor": "y17", + "domain": [ + 0.9155555555555556, + 0.9427777777777776 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis18": { + "anchor": "y18", + "domain": [ + 0.9727777777777776, + 1 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis2": { + "anchor": "y2", + "domain": [ + 0.057222222222222216, + 0.08444444444444443 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis3": { + "anchor": "y3", + "domain": [ + 0.11444444444444445, + 0.14166666666666666 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis4": { + "anchor": "y4", + "domain": [ + 0.17166666666666666, + 0.1988888888888889 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis5": { + "anchor": "y5", + "domain": [ + 0.2288888888888889, + 0.25611111111111107 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis6": { + "anchor": "y6", + "domain": [ + 0.2861111111111111, + 0.3133333333333333 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis7": { + "anchor": "y7", + "domain": [ + 0.3433333333333333, + 0.3705555555555555 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis8": { + "anchor": "y8", + "domain": [ + 0.4005555555555555, + 0.42777777777777776 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "xaxis9": { + "anchor": "y9", + "domain": [ + 0.4577777777777778, + 0.48499999999999993 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 10 + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "showgrid": true, + "tickfont": { + "size": 11 + } + }, + "yaxis10": { + "anchor": "x10", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis11": { + "anchor": "x11", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis12": { + "anchor": "x12", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis13": { + "anchor": "x13", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis14": { + "anchor": "x14", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis15": { + "anchor": "x15", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis16": { + "anchor": "x16", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis17": { + "anchor": "x17", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis18": { + "anchor": "x18", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis2": { + "anchor": "x2", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis3": { + "anchor": "x3", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis4": { + "anchor": "x4", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis5": { + "anchor": "x5", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis6": { + "anchor": "x6", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis7": { + "anchor": "x7", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis8": { + "anchor": "x8", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + }, + "yaxis9": { + "anchor": "x9", + "domain": [ + 0, + 1 + ], + "gridcolor": "#f0f0f0", + "matches": "y", + "showgrid": true, + "showticklabels": false, + "tickfont": { + "size": 11 + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot the leaderboard's top methods, and always include the best LLM/agent\n", + "# method for contrast (so the chart compares families even when a baseline leads).\n", + "_leaders = list(eval_board.index[:3])\n", + "_best_llm = next((p for p in eval_board.index if eval_board.loc[p, \"family\"] == \"LLM / Agent\"), None)\n", + "if _best_llm and _best_llm not in _leaders:\n", + " _leaders.append(_best_llm)\n", + "print(f\"Showing: {', '.join(_leaders)}\")\n", + "viz.make_eval_forecast_chart(eval_frame, price_df, _leaders)" + ] + }, + { + "cell_type": "markdown", + "id": "ff950774", + "metadata": {}, + "source": [ + "---\n", + "## 9. Reading the agent's reasoning\n", + "\n", + "The news-reading agent attaches a free-text **rationale** to every forecast, and\n", + "a link to the full **Langfuse trace**. These are pulled straight from the\n", + "prediction metadata. This is where a surprising score becomes interpretable: you\n", + "can read whether the agent actually saw the geopolitical risk, and *how* it\n", + "turned that into a price and an interval — including, often, an interval far too\n", + "narrow for a regime shift." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "f7c42d62", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
News Agent (gemini-3.1-flash-lite-preview)2026-02-02   point $65.5   🔗 Langfuse trace
The WTI forecast is driven by the confluence of OPEC+ production constraints and the significant geopolitical risk premium from the Strait of Hormuz. The market is currently biased toward the upside as it balances the risk of physical supply shocks against the structural supply capability of the US and other non-OPEC+ producers. Volatility is expected to remain high over the next 21 business days.
Horizon note: Short-term momentum is bullish following a late-January rally toward $65. The market is pricing in significant geopolitical risk from Strait of Hormuz tensions, keeping volatility elevated. A 5-day horizon is expected to consolidate these gains, with strong support at $64.
News Agent (gemini-3.1-flash-lite-preview)2026-02-09   point $63.0   🔗 Langfuse trace
The overall forecast assumes that the market remains in a delicate equilibrium. Geopolitical risk—centered on U.S.-Iran tensions—provides a persistent price floor (the 'war premium'), while long-term bearish pressures stemming from non-OPEC production growth and stable demand ensure a capped upside. OPEC+ policy is assumed to remain largely supportive but reactive to price volatility, limiting extreme downside movements unless a fundamental supply-demand shift occurs.
Horizon note: Expect a gradual drift toward slightly lower levels as the market tests the sustainability of the current risk premium in the absence of new, concrete escalation signals.
News Agent (gemini-3.1-flash-lite-preview)2026-02-16   point $63.5   🔗 Langfuse trace
The forecasts as of 2026-02-16 reflect a market currently dominated by geopolitical risk premiums related to the Strait of Hormuz and the Iran-U.S. tension. OPEC+ remains committed to market stability through production management, and the U.S. continues to signal potential SPR interventions if supply security is compromised. The distributions incorporate a clear upward risk skew, reflecting that negative supply developments in the Persian Gulf could trigger rapid price increases.
Horizon note: Short-term horizon reflects continued geopolitical risk premium from Strait of Hormuz tensions, offset slightly by OPEC+'s continued supply restraint and potential U.S. SPR management.
News Agent (gemini-3.1-flash-lite-preview)2026-02-23   point $67.5   🔗 Langfuse trace
The forecast assumes that the geopolitical risk premium related to U.S.-Iran tensions and the Strait of Hormuz will remain a dominant driver in the near term. OPEC+ remains committed to restricting supply to manage price floors. We note a slightly bullish tilt in the short term, but acknowledge significant downside risk if the geopolitical premium evaporates.
Horizon note: Over the next 5 business days, we anticipate continued upward pressure on WTI prices as market participants maintain the geopolitical risk premium due to U.S.-Iran tensions. The price is likely to remain elevated above the $66.40 level seen on Feb 20, with potential for short-term volatility spikes.
News Agent (gemini-3.1-flash-lite-preview)2026-03-02   point $67.5   🔗 Langfuse trace
The WTI forecast is heavily influenced by the elevated geopolitical risk premium stemming from US-Iran tensions in the Persian Gulf. OPEC+ is maintaining production discipline, and the market is cautious. Forecasts assume moderate volatility with skewed upside risk in the short term due to the geopolitical uncertainty, balanced by potential for fundamental cooling if the situation stabilizes.
Horizon note: Short-term momentum is driven by the immediate geopolitical risk premium associated with US-Iran tensions in the Persian Gulf. Prices are expected to remain elevated or slightly drift higher as traders hedge against potential supply disruptions.
News Agent (gemini-3.1-flash-lite-preview)2026-03-09   point $93.5   🔗 Langfuse trace
The forecast reflects the catastrophic supply-side risk triggered by the closure of the Strait of Hormuz in late February 2026. The market is in an acute shock phase; price volatility is elevated, and the upside risk remains dominant as the duration of the conflict and the effectiveness of IEA emergency inventory releases are highly uncertain. Downside protection in the forecast quantiles accounts for the potential (though currently unlikely) scenario of rapid diplomatic de-escalation.
Horizon note: The Strait of Hormuz closure creates extreme, immediate risk. The 5-day horizon remains highly volatile as the market adjusts to the initial shock and prices in the potential for prolonged conflict vs. the impact of announced emergency releases.
News Agent (gemini-3.1-flash-lite-preview)2026-03-16   point $100.5   🔗 Langfuse trace
The forecast is driven by the extreme geopolitical crisis involving the closure of the Strait of Hormuz. The baseline assumption is that global supply will be significantly hampered for at least the next month. While the emergency release of 400M barrels by the IEA is a significant intervention, it is likely to only act as a partial buffer against the massive structural supply loss. Price volatility remains elevated, with risks skewed to the upside if the conflict persists or deepens, while downside risks are capped by the tightness of global inventory levels prior to the crisis.
Horizon note: Market is in a state of high geopolitical tension due to the U.S.-Iran conflict and the closure of the Strait of Hormuz. Short-term price action (5-day) remains heavily skewed toward volatility as traders digest the impact of the emergency IEA reserve release. A price consolidation near current levels is expected as supply chain adjustments are attempted.
News Agent (gemini-3.1-flash-lite-preview)2026-03-23   point $97.5   🔗 Langfuse trace
The WTI crude oil market is currently functioning under a regime of extreme geopolitical shock due to the closure of the Strait of Hormuz. The baseline analysis assumes that the extreme volatility will persist, with prices sensitive to the duration and severity of the regional conflict. SPR releases provide only a temporary buffer. My forecasts utilize a wide distribution to account for the potential for rapid de-escalation versus continued or worsening supply disruption.
Horizon note: Short-term prices are heavily influenced by the extreme geopolitical risk premium stemming from the closure of the Strait of Hormuz. While emergency SPR releases are underway, the market remains highly sensitive to any news regarding the conflict's intensity. I anticipate slight consolidation from recent highs as initial panic subsides, but extreme volatility remains the base case.
News Agent (gemini-3.1-flash-lite-preview)2026-03-30   point $98.5   🔗 Langfuse trace
The forecast reflects the acute geopolitical crisis following the closure of the Strait of Hormuz in late February 2026. The market is in a supply-constrained environment. While the US and international allies have initiated significant SPR releases, the magnitude of the disruption (approx. 10m b/d) outweighs these temporary measures. Prices are expected to trend higher as the market tests the sustainability of the current price regime under severe geopolitical tension.
Horizon note: Short-term volatility remains elevated due to the Strait of Hormuz closure. While coordinated SPR releases provide some psychological relief, supply constraints are real and immediate. The market is trading at the 52-week high, suggesting strong bullish momentum.
News Agent (gemini-3.1-flash-lite-preview)2026-04-06   point $113.5   🔗 Langfuse trace
The forecast reflects a severe geopolitical supply shock resulting from the 2026 Iran war and the blockade of the Strait of Hormuz. We assume that the disruption is ongoing, leading to a rapid depletion of global inventories. The risk distribution is skewed to the upside as supply security remains the dominant market concern, with strategic reserves providing only a temporary, partial buffer.
Horizon note: As of April 6, 2026, the oil market is in extreme turmoil due to the Iran war and the effective closure of the Strait of Hormuz. With 35% of seaborne trade at risk, the immediate term (5 days) is characterized by massive volatility and a significant geopolitical risk premium. Prices are likely to test higher levels as the market prices in a prolonged disruption.
News Agent (gemini-3.1-flash-lite-preview)2026-04-13   point $98.2   🔗 Langfuse trace
The WTI forecast is heavily influenced by the critical geopolitical crisis in the Persian Gulf and the resulting Strait of Hormuz blockade. While U.S. SPR releases are attempting to buffer global supply gaps (approx. 10.1M bpd lost), market sentiment is dominated by extreme risk premiums and physical delivery constraints. The current forecast assumes the blockade remains in place or intensifies, preventing any significant downward correction in price despite demand concerns.
Horizon note: Short-term volatility driven by the Strait of Hormuz blockade and market reaction to recent supply shocks. Expectations of continued geopolitical instability support a modest upward trend as inventory tightness persists.
News Agent (gemini-3.1-flash-lite-preview)2026-04-20   point $86.0   🔗 Langfuse trace
The forecast is centered on the extreme geopolitical risk currently impacting the WTI market: the blockade of the Strait of Hormuz. As of April 20, 2026, the market is in a highly unstable state, with significant production shut-ins and depleting global inventories. SPR releases are mitigating the immediate shock, but a structural deficit persists, supporting an upward bias in the median forecast as time horizon increases, while acknowledging that any signs of de-escalation would lead to rapid, violent price corrections.
Horizon note: Prices recently retreated from peaks near $113 toward $83.85. The near-term horizon reflects high volatility as the market digests the ongoing disruption in the Strait of Hormuz and the impact of recent SPR releases. A slight recovery is anticipated as the extreme price spike of early April corrects, while uncertainty over shipping security keeps the downside risk substantial.
News Agent (gemini-3.1-flash-lite-preview)2026-04-27   point $95.5   🔗 Langfuse trace
As of April 27, 2026, the oil market is trapped in a supply crisis initiated by the conflict in Iran and the closure of the Strait of Hormuz in late February. My forecast is centered on the ongoing geopolitical instability. Key factors: (1) Supply Disruption: 20% of global trade is effectively halted. (2) SPR Policy: Strategic releases are occurring but are failing to offset the severity of the supply gap, with logistical hurdles limiting their efficacy. (3) Demand destruction: High prices are impacting consumption, yet physical scarcity supports elevated price levels. The distribution is skewed to the upside due to the risk of further escalation.
Horizon note: Over the next 5 days, market volatility will be driven by the continued closure of the Strait of Hormuz. The supply risk premium remains high, and any minor escalation or confirmation of limited SPR impact will sustain prices above $90/bbl. The tight balance suggests a slight upward drift.
News Agent (gemini-3.1-flash-lite-preview)2026-05-04   point $103.5   🔗 Langfuse trace
The forecast is anchored by the catastrophic supply shock from the Strait of Hormuz closure (circa May 2026). With substantial global inventory drawdowns and limited immediate supply alternatives, the market is structurally bullish. We maintain a risk-tilted outlook that accounts for significant volatility given the potential for further escalations or sudden diplomatic shifts.
Horizon note: Short-term volatility driven by the Strait of Hormuz closure remains elevated. The market is pricing in sustained supply deficits. While SPR releases provide a floor to supply, the primary trend remains upward bias due to geopolitical risk premiums.
News Agent (gemini-3.1-flash-lite-preview)2026-05-11   point $96.5   🔗 Langfuse trace
The WTI crude market as of May 11, 2026, is dominated by the closure of the Strait of Hormuz. With approximately 25% of global seaborne oil flow effectively halted, the market is pricing in a severe supply-side shock. Strategic reserves are being utilized to mitigate, but are at historical lows. Prices are expected to maintain an elevated, volatile regime characterized by a wide uncertainty band reflecting binary risk regarding shipping lane access.
Horizon note: Short-term volatility driven by the Strait of Hormuz closure remains high. With prices around $95.42, the market is range-bound pending further diplomatic news or confirmation of shipping lane access. Probabilities skewed slightly to the upside due to acute supply risks.
News Agent (gemini-3.1-flash-lite-preview)2026-05-18   point $111.0   🔗 Langfuse trace
As of 2026-05-18, the WTI market is dominated by a major geopolitical supply risk: the closure of the Strait of Hormuz. With OECD oil stocks at two-decade lows and U.S. SPR levels significantly depleted, the market lacks the typical inventory cushion to mitigate supply shocks. My forecast assumes that the geopolitical premium will persist or increase in the near term as diplomatic solutions appear distant. Short-term volatility is exceptionally high, and the potential for a runaway upside spike is greater than the potential for a supply-demand-driven correction.
Horizon note: As the physical disruption in shipping lanes persists, supply-side tightness continues to escalate. With SPR levels at record lows, the market lacks a meaningful buffer against shocks, increasing the risk of sharp upside spikes in the 10-day window.
News Agent (gemini-3.1-flash-lite-preview)2026-05-25   point $95.0   🔗 Langfuse trace
The forecast is predicated on the persistent geopolitical risk premium caused by the closure of the Strait of Hormuz, countered by the aggressive, albeit diminishing, use of the US SPR. We assume a scenario where the conflict remains contained but unresolved, leading to a slow decay in price as the market prices in gradual demand destruction and long-term supply-demand rebalancing.
Horizon note: Over the next 5 business days, the market will likely consolidate around the $96 level as it balances extreme uncertainty regarding the Strait of Hormuz with aggressive US SPR release pressures. A slight consolidation is expected as immediate inventory fears are partially offset by high-frequency demand concerns.
News Agent (gemini-3.1-flash-lite-preview)2026-06-01   point $88.5   🔗 Langfuse trace
The WTI forecast is driven primarily by the acute geopolitical risk premium in the Persian Gulf, where the effective closure of the Strait of Hormuz has created a massive supply bottleneck. Despite modest, incremental increases in OPEC+ production, the market focus remains on record inventory draws and U.S. reliance on the Strategic Petroleum Reserve. The volatility observed throughout May 2026 confirms that prices are sensitive to any signals regarding diplomatic resolution versus long-term conflict, leading to a probabilistic forecast with significant upward bias and fat tails.
Horizon note: Over the next 5 days, market volatility will remain high as traders await potential diplomatic de-escalation in the Persian Gulf. The market is currently consolidating after the late-May slide, but the supply risk premium remains elevated due to the ongoing closure of the Strait of Hormuz.
News Agent (gemini-3.5-flash)2026-02-02   point $64.0   🔗 Langfuse trace
As of February 2, 2026, WTI crude oil has recently rallied to $65.21 due to a combination of temporary weather-related US production losses (~250k bpd) and escalating US-Iran tensions in the Strait of Hormuz. OPEC+ has maintained its production increase pause through Q1 2026 to stabilize prices. Over the 5, 10, and 21 business day horizons, we forecast a gradual mean-reversion trend. This is driven by the resolution of weather-related supply disruptions and a return of focus to structural global oversupply. However, wide and skewed confidence intervals are maintained to reflect the high uncertainty surrounding Middle East geopolitical risks.
Horizon note: Over a 5-business-day horizon (by February 9, 2026), the recent sharp spike in WTI prices from ~$60.60 to $65.21 (driven by US-Iran geopolitical tensions and transient US freeze-offs of ~250k bpd) is expected to face initial resistance. The point forecast of $64.00 assumes a slight pullback as cold weather impacts begin to ease, though the geopolitical premium remains partially active. The interval from $59.50 to $69.00 reflects high short-term volatility, representing either a rapid deflation of the geopolitical premium or an extension of the rally if tensions worsen.
News Agent (gemini-3.5-flash)2026-02-09   point $63.0   🔗 Langfuse trace
Our outlook as of February 9, 2026, balances two highly divergent forces. Fundamentally, global oil supply is expected to outpace demand, with OPEC+ maintaining voluntary pauses to mitigate oversaturation, and institutions forecasting average prices in the mid-$50s. Geopolitically, the risk of escalation in the Persian Gulf adds a $4-$10 risk premium. This dual-regime dynamic results in a highly skewed and wide probability distribution, where a return to fundamentals triggers a drop to the low $50s, while a major conflict triggers an immediate spike past the 52-week high of $75.14.
Horizon note: For the 10-day horizon, the point forecast declines slightly to $63.00, anticipating that the structural oversupply projected by the EIA and IEA will exert gradual downward pressure if no immediate geopolitical disruption occurs. However, uncertainty widens considerably. The 0.05 quantile drops to $56.10 on fears of an eventual OPEC+ production unwind, while the 0.95 quantile rises to $73.10 to reflect the growing 'war premium' and the risk of shipping lane disruptions.
News Agent (gemini-3.5-flash)2026-02-16   point $65.7   🔗 Langfuse trace
This probabilistic forecast reflects a delicate balance between fundamental supply-demand dynamics and a rapidly escalating geopolitical crisis in the Persian Gulf as of mid-February 2026. On the fundamental side, a robust oil surplus driven by the Americas Quintet (U.S., Canada, Brazil, Guyana, and Argentina) and cautious OPEC+ production policies provide a soft supply backdrop. However, the asymmetric risk of military conflict between the United States and Iran and potential closure of the Strait of Hormuz creates a massive right-tail geopolitical risk premium across the 10-day and 21-day horizons.
Horizon note: Over the 5-business-day horizon (target date Feb 23, 2026), WTI is projected to trade in a moderate upward trajectory. OPEC+ maintains voluntary supply cuts through March 2026, which provides a strong baseline support. Concurrently, intensifying U.S.-Iran tensions and military maneuvers in the Strait of Hormuz are building up a persistent geopolitical risk premium, pushing prices up from the recent close of $62.89 to a projected median of $65.72. The distribution reflects narrow uncertainty, as actual physical disruptions are not expected to occur immediately within this short window.
News Agent (gemini-3.5-flash)2026-02-23   point $74.5   🔗 Langfuse trace
Our calibrated forecasts for WTI crude oil as of February 23, 2026, are shaped by the acute tension between soft structural fundamentals (global supply outpacing demand, modest demand growth of ~850kb/d projected by the IEA, and robust non-OPEC+ output) and a rapidly escalating geopolitical crisis in the Persian Gulf. We utilize a highly right-skewed probabilistic model to capture the extreme asymmetric upside risks associated with potential Strait of Hormuz closures, while maintaining a baseline downside scenario reflecting the underlying oversupplied market.
Horizon note: As of February 23, 2026, WTI is trading near $66.39. Over a 5-business-day horizon (targeting early March 2026), we expect short-term upward price pressure. While underlying physical market fundamentals show a structural supply surplus, the immediate focus is dominated by escalating U.S.-Iran geopolitical tensions and naval maneuvers in the Persian Gulf. This is introducing an acute 'war premium.' WTI is projected to trade in the low-to-mid $74s, with an expanded upper tail representing the risk of immediate military escalations before any policy mitigations can take effect.
News Agent (gemini-3.5-flash)2026-03-02   point $84.0   🔗 Langfuse trace
Overall, the WTI crude oil price outlook for March 2026 is defined by the severe geopolitical supply shock of the Strait of Hormuz closure following US/Iran military clashes on February 28, 2026. This has completely upended the previous outlook of a comfortable supply surplus, transforming the market into one of extreme tightness and panic. The forecasts represent a rapidly escalating price path across horizons 5, 10, and 21, characterized by a substantial upside skew to capture the asymmetric threat of prolonged shipping corridor closures and potential damage to Middle East energy infrastructure, mitigated only partially by emergency SPR releases.
Horizon note: At Horizon 5 (March 9, 2026), the oil market is driven by severe panic and a massive geopolitical risk premium following the February 28, 2026 outbreak of military conflict between the US/Israel and Iran. The sudden blockade of the Strait of Hormuz—the world's most critical oil transit corridor handling 20% of global seaborne supply—has triggered a dramatic spike in WTI from its recent close of $67.02 on February 27 to over $71.23 on March 2. Over the next five business days, immediate panic, a surge in war-risk insurance premiums, and the lack of physical alternatives will push the median WTI price to $84.00, with an extremely wide upside tail (up to $103.00 at the 0.95 quantile) if …
News Agent (gemini-3.5-flash)2026-03-09   point $108.0   🔗 Langfuse trace
This forecast is constructed in the context of an extreme geopolitical supply shock starting in late February/early March 2026, leading to a de facto closure of the Strait of Hormuz and a sudden rally in WTI close to $117-$119/bbl on March 9. The near-term forecasts reflect a strong risk premium due to physical shipping bottlenecks and production shut-ins in the Gulf, while the medium-term (21 business days) forecast incorporates a cooling effect from a massive, multi-nation coordinated SPR release and subsequent demand destruction.
Horizon note: Forecast for 5 business days ahead (March 16, 2026). The severe geopolitical shock from the Middle East conflict and the effective closure of the Strait of Hormuz are expected to keep prices highly elevated. While the benchmark spiked to near $119/bbl intraday on March 9, a median expectation of $108/bbl reflects the immediate physical supply bottleneck. Upside risk is significant if direct military escalations occur, while downside risk is buffered by the immediate disruption of Gulf crude exports.
News Agent (gemini-3.5-flash)2026-03-16   point $98.3   🔗 Langfuse trace
The forecasts as of March 16, 2026, are heavily shaped by the historic US-Iran conflict and the effective blockade of the Strait of Hormuz. WTI crude oil prices recently spiked from $67 to nearly $99/bbl. While global strategic inventory releases of 400 million barrels are being deployed, the physical disruption remains the largest in history. Our forecasts project high near-term prices ($98.32 at Horizon 5, $102.88 at Horizon 10) followed by a slight moderation to $95.18 at Horizon 21 as diplomatic overtures begin to emerge, though with an extremely wide margin of uncertainty.
Horizon note: By Horizon 5 (March 23, 2026), WTI crude oil prices are projected to trade near a median of $98.32/bbl. The market remains in a state of high stress following the effective closure of the Strait of Hormuz by the US-Iran conflict. While the coordinated IEA emergency release of 400 million barrels (including the US committing to 172 million barrels from the Strategic Petroleum Reserve) acts as a critical buffer, the loss of physical seaborne supply from Gulf producers maintains a premium of $15-$18/bbl. The downside is limited to ~$84.50 if peace talks are announced, whereas an escalation could trigger a surge toward $112.00.
News Agent (gemini-3.5-flash)2026-03-23   point $86.5   🔗 Langfuse trace
WTI crude prices surged from ~$65 in late February to nearly $99 by March 20, 2026, due to the outbreak of the US-Iran conflict and the subsequent closure of the Strait of Hormuz. However, on March 23, 2026, prices plummeted to $88.13 as the market reacted to the start of diplomatic talks. This forecast incorporates: 1) the massive 172-million-barrel US SPR release (and 400-million-barrel total global release) which physically caps domestic WTI; 2) the potential for a diplomatic resolution which would return prices to the $65-$75 fundamental range; 3) a widening Brent-WTI spread due to local US supply insulation; and 4) the residual risk of a breakdown in talks leading to a re-escalation.
Horizon note: For the 5-day horizon (targeting late March 2026), the price forecast takes into account the major shift on March 23 where WTI closed at $88.13, a $10.19 drop from the March 20 close of $98.32. This drop was sparked by the initiation of US-Iran diplomatic talks. The point forecast is set at $86.50, reflecting expectations that diplomatic efforts will continue to defuse the Strait of Hormuz crisis, though high volatility remains. The upper tail ($100-$105) reflects the risk of talks collapsing, while the lower tail ($72-$76) reflects a rapid diplomatic breakthrough and resolution.
News Agent (gemini-3.5-flash)2026-03-30   point $100.0   🔗 Langfuse trace
This forecast is constructed under the context of the March 2026 US-Iran crisis and the closure of the Strait of Hormuz. We model WTI crude prices beginning at the March 30 close of $101.30 per barrel. The forecast incorporates the stabilizing but delayed physical effect of the historic 400-million-barrel emergency oil release from IEA nations, alongside emerging global demand destruction. Due to extreme geopolitical uncertainty, the probability bands are widened significantly to reflect the potential for rapid de-escalation versus further military escalations.
Horizon note: Over a 5-day horizon, the market remains locked in intense geopolitical tension following Iran's de facto closure of the Strait of Hormuz to US and allied vessels. Although coordinated releases from international strategic reserves are scheduled to begin, the physical supply deficit of Middle Eastern crude supports WTI prices near the $100.00 level. High daily volatility (with daily swings of 4-5% observed in late March) is expected to persist, keeping the price distributions wide.
News Agent (gemini-3.5-flash)2026-04-06   point $111.0   🔗 Langfuse trace
WTI crude oil is experiencing extraordinary volatility and trading near multi-year highs of $111.54/bbl due to the ongoing conflict in the Middle East and the closure of the Strait of Hormuz since late February 2026, which has shut in over 9 million b/d of crude production. However, massive offsetting forces are at play: a historic, coordinated global release of 400 million barrels of strategic reserves (including 172 million from the US SPR), rising OPEC+ output starting in May, and demand destruction from high energy costs. Over the next 5 to 21 business days, these physical supplies and potential diplomatic progress are expected to gradually ease domestic tightness, leading to a downward …
Horizon note: Over the next 5 business days, near-term supply concerns and geopolitical panic will likely keep WTI elevated near its recent peak around $111/bbl. Extreme daily volatility ($5-$10 moves) is expected to persist as shipping lanes remain blocked, with the 95% confidence interval spanning from $95 to $127.
News Agent (gemini-3.5-flash)2026-04-13   point $106.5   🔗 Langfuse trace
The global oil market is in the midst of an unprecedented supply crisis. The collapse of peace talks in Pakistan on April 12-13, 2026, prompted the U.S. to implement a naval blockade of Iranian ports, shutting off a critical energy artery. Although emergency SPR drawdowns are providing short-term relief, physical tightness is expected to persist through May. Prices are forecasted to surge and peak in late spring before gradually easing back toward historical fundamentals as ceasefire negotiations resume later in the quarter.
Horizon note: At 5 business days out (April 20, 2026), the market is fully absorbing the shock of the U.S. naval blockade of Iranian ports ordered on April 13 following the collapse of peace talks in Pakistan. With shipping lanes highly disrupted, panic buying is expected to push WTI higher from its April 10 close of $96.57 to a projected point forecast of $106.50.
News Agent (gemini-3.5-flash)2026-04-20   point $96.0   🔗 Langfuse trace
The WTI crude oil forecast as of April 20, 2026, is driven by the severe conflict in the Persian Gulf and the status of the Strait of Hormuz. Following a brief ceasefire in early April that temporarily lowered WTI to $83.85, the resumption of hostilities and U.S. vessel seizures have reignited supply disruption concerns. In response, prices are projected to rise significantly in the short-to-medium term (Horizons 5 and 10) to reflect the acute supply squeeze, before experiencing a marginal moderation by Horizon 21 as diplomatic channels start negotiating a resolution.
Horizon note: As of April 20, 2026, the breakdown of the temporary ceasefire over the weekend (due to the U.S. seizure of an Iranian vessel and the subsequent re-closure of the Strait of Hormuz) is driving WTI crude oil sharply upward. By Horizon 5 (April 27, 2026), WTI is expected to trade around $96.00 as the market reprices the geopolitical risk premium. Uncertainty is high given the rapid shift from the ceasefire drop on April 17 ($83.85) to the renewed hostilities.
News Agent (gemini-3.5-flash)2026-04-27   point $98.0   🔗 Langfuse trace
This forecast is constructed in light of the significant geopolitical supply shock arising from the US-Iran conflict and the subsequent closure of the Strait of Hormuz. Following a brief ceasefire in mid-April that temporarily cooled prices, the breakdown of diplomatic negotiations on April 27 has reintroduced strong bullish momentum. While aggressive emergency SPR exchanges and looming global demand destruction act as a ceiling, the physical loss of supply maintains a exceptionally high risk premium across all horizons.
Horizon note: Near-term forecast (5 business days) reflects upward pressure on WTI crude following the April 27 cancellation of the second round of peace talks in Pakistan by the US administration. With the Strait of Hormuz remaining closed, a massive physical supply deficit of over 10 million bpd persists. Short-term risk is tilted to the upside, but cushioned by aggressive US and international coordinated SPR releases.
News Agent (gemini-3.5-flash)2026-05-04   point $105.0   🔗 Langfuse trace
Global crude oil markets are facing their most severe supply crisis on record following the closure of the Strait of Hormuz on February 28, 2026. WTI surged past $100 and continues to trade with an immense geopolitical risk premium. Mitigating factors include a coordinated global release of 400 million barrels of strategic reserves and high-price demand destruction, which help cap the upper limit of the forecasts. However, extreme volatility remains the defining characteristic of this period, justifying highly dispersed probability distributions across all horizons.
Horizon note: Over the 5-day horizon (targeting mid-May 2026), prices are expected to remain highly elevated, hovering around a median of $105.00/bbl due to the ongoing closure of the Strait of Hormuz since late February 2026. Spot trading as of May 4 has spiked to ~$106.42, showing persistent upward pressure. The distribution is wide: the lower tail (0.05 at $78.00) reflects the potential for sudden breakthrough negotiations or a temporary easing of shipping restrictions, while the upper tail (0.95 at $122.0) accounts for direct military escalation in the Gulf.
News Agent (gemini-3.5-flash)2026-05-11   point $95.0   🔗 Langfuse trace
WTI oil markets are characterized by extreme volatility and a significant geopolitical 'war premium' following the closure of the Strait of Hormuz in late February 2026. The price fell from its peak of over $112 in April to around $95 on May 8, 2026, on reports of a draft MoU for a 60-day ceasefire between the U.S. and Iran. These forecasts reflect the high-stakes binary paths the market faces, with peace talks potentially sending prices into the $70s and a breakdown of talks threatening to spike prices past $115.
Horizon note: At the 5-business-day horizon (May 15, 2026), the market is heavily focused on whether President Trump will sign the draft memorandum of understanding (MoU) with Iran for a 60-day ceasefire. The recent drop from $106.42 to $95.08 in early May was triggered by reports of this draft MoU. If the MoU is approved and signed, prices are expected to drop quickly toward $84–$88. However, if the draft is rejected or if there is a renewed confrontation in the Strait of Hormuz, prices will rapidly spike back to $102–$108. If the high-stakes negotiations drag on without a resolution, WTI will likely hover close to the current $95 level.
News Agent (gemini-3.5-flash)2026-05-18   point $92.2   🔗 Langfuse trace
As of May 18, 2026, WTI crude oil is trading in an extremely volatile range near multi-year highs due to the closure of the Strait of Hormuz since February 2026. However, the market is poised for a major downward correction over the next 21 business days. The primary catalyst is the anticipated mid-June US-Iran ceasefire framework, which includes a 60-day truce and the gradual reopening of the critical shipping lane. This de-escalation completely unwinds the 'war premium' at the same time OPEC+ increases production quotas and global demand growth targets are revised lower. We provide a calibrated probabilistic forecast that centers the point forecast (0.50 quantile) on the realized …
Horizon note: At Horizon 10 (Monday, June 1, 2026, or T+10 trading days from the last close), the point forecast is set to $92.16/bbl (with potential alternative trading-day definitions close to $93.76). De-escalation momentum has accelerated, with market participants aggressively pricing in the normalization of transit through the Strait of Hormuz. OPEC+ policy signals continue to point toward a gradual unwinding of cuts (an incremental quota increase of 188,000 bpd for June is scheduled), while macroeconomic headwinds and weak global demand growth expectations (downgraded to 1.0-1.1 million bpd by the IEA) are amplifying downward pressure.
News Agent (gemini-3.5-flash)2026-05-25   point $90.0   🔗 Langfuse trace
This forecast captures the transition of the WTI crude oil market from a highly disrupted, geopolitically risk-driven environment in mid-May 2026 to a fundamentals-led surplus environment by late June 2026. Key drivers include the unwinding of the U.S.-Iran conflict's war premium, the gradual recovery of exports through the Strait of Hormuz, ongoing OPEC+ output quota increases, and macro demand headwinds.
Horizon note: At Horizon 5 (late May/early June 2026), WTI crude oil prices are expected to gradually ease from the recent high of $96.60 to a median of $90.00. Although the Strait of Hormuz remains heavily disrupted by the U.S.-Iran conflict, diplomatic signals regarding a potential ceasefire are beginning to soften the geopolitical war premium. OPEC+ is continuing its gradual unwinding of voluntary production cuts, adding moderate supply, while the U.S. continues to utilize the Strategic Petroleum Reserve (SPR) to mitigate supply gaps, keeping the market volatile but biased slightly downward.
News Agent (gemini-3.5-flash)2026-06-01   point $90.5   🔗 Langfuse trace
WTI oil prices are transitioning from a geopolitical panic-driven regime (Strait of Hormuz crisis) to a supply-normalization and demand-headwind-driven regime. The resolution of tensions between the US and Iran and progressive ceasefire talks are rapidly deflating the geopolitical risk premium that previously sent WTI above $112. At the same time, OPEC+'s modest supply hikes and slowing global economic demand are establishing a more bearish fundamental outlook, driving a mean-reversion process back toward the low $70s by the end of June 2026.
Horizon note: At the 5-day horizon (June 5, 2026), WTI crude is projected to rebound slightly from its late-May correction, averaging $90.54. The market remains highly sensitive to geopolitical developments in the Middle East. While a tentative ceasefire framework between the US and Iran has eased immediate blockade fears, ongoing shipping disruptions in the Strait of Hormuz and a massive drop in global crude inventories keep a short-term risk premium active, preventing a total collapse of prices.
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# One card per (agent, origin): the rationale, the per-horizon note, and a link\n", + "# to the full reasoning trace. Empty only if no LLM/agent predictor is enabled.\n", + "eval_rationales = extract_agent_rationales(eval_results)\n", + "display(HTML(viz.render_rationales_html(eval_rationales)))" + ] + }, + { + "cell_type": "markdown", + "id": "919e6fe2", + "metadata": {}, + "source": [ + "---\n", + "## 10. Takeaways — computed from this run\n", + "\n", + "The summary below is **generated from the eval results in memory, not\n", + "hard-coded**, so it always matches what actually ran: the real winner, whether\n", + "its lead clears the noise floor, the horizon that decided the ranking, the\n", + "best-performing family, and a calibration line. Flip `SMOKE_TEST` off, rerun,\n", + "and these takeaways update themselves with the full leaderboard." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "fe4b4d17", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "1. **News Agent (gemini-3.5-flash)** has the best mean CRPS (5.64) on the 2026 evaluation, ahead of **LLMP-Grid (gemini-3.5-flash)** (9.15) by 3.52 — a gap larger than the combined standard error — a real edge over this window.\n", + "2. The leaderboard is **decided at h=21d**, where CRPS ranges 0.2–36.4 across methods; at the short h=5d horizon the methods are nearly tied (range 0.2–27.8). A handful of long-horizon points drives the whole ranking.\n", + "3. **By family** (mean CRPS): Numerical ML 9.85, LLM / Agent 10.16, Baseline 13.64. Best family this window: **Numerical ML**.\n", + "4. **Calibration:** News Agent (gemini-3.5-flash)'s 80% interval covered 66% of outcomes (target 80%) over its 50 scored point(s). With this few, coverage this far from target is itself a small-sample artefact, not necessarily mis-calibration.\n", + "5. Based on 18 origins / 544 scored points." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(eval_narrative_md(eval_frame, smoke=SMOKE_TEST)))" + ] + }, + { + "cell_type": "markdown", + "id": "9a63283cbaf04dbcab1f6479b197f3a8", + "metadata": {}, + "source": [ "---\n", - "## 8. What stateless methods can't do\n", + "## 11. What stateless methods can't do\n", "\n", - "AutoARIMA is calibrated once and never updated. This is intentional here —\n", - "it creates a clean baseline — but it leaves a systematic gap:\n", + "Sections 7–10 score and dissect this run on its own terms. But every method here\n", + "shares one structural limit, independent of who topped the leaderboard: it is\n", + "calibrated (or prompted) **once and never updated between rounds**. That is\n", + "intentional — it creates a clean baseline — but it leaves a systematic gap:\n", "\n", - "- **No error feedback.** If AutoARIMA consistently produces intervals that are\n", - " too narrow in elevated-vol regimes, it will keep making the same mistake.\n", - " There is no mechanism to update calibration between rounds.\n", + "- **No error feedback.** If a method's intervals are consistently too narrow in\n", + " an elevated-vol regime (read the coverage line in Section 10, and the squashed\n", + " error bars in Section 8), it keeps making the same mistake. Nothing updates its\n", + " calibration between origins.\n", "\n", - "- **No market context.** AutoARIMA sees only price history. A human analyst\n", - " reviewing its output would immediately ask: *what's in the news?*\n", + "- **No strategy evolution.** Each prediction starts from the same prior — the\n", + " same fitted model, or the same prompt. Resolved outcomes disappear without\n", + " influencing future forecasts.\n", "\n", - "- **No strategy evolution.** Each prediction starts from the same prior.\n", - " Resolved outcomes disappear without influencing future forecasts.\n", + "- **Context without memory.** Even the news agent re-reads the world each origin;\n", + " it does not accumulate what worked. The rationales in Section 9 are written\n", + " fresh every time, with no record of how the last one resolved.\n", "\n", - "→ **Notebook 5** introduces adaptive agents that study AutoARIMA's 2025\n", - "performance, record systematic observations, and calibrate their strategies\n", - "accordingly. At inference time, each agent receives the live AutoARIMA estimate\n", - "and decides how to adjust it — applying what it learned from training.\n", + "→ **Notebook 5** introduces adaptive agents that study the 2025 backtest, record\n", + "systematic observations, and calibrate their strategies accordingly. At inference\n", + "time, each agent receives the live stateless estimate and decides how to adjust\n", + "it — applying what it learned from training.\n", "\n", "→ **Notebook 6** evaluates whether any training approach actually improved\n", - "out-of-sample performance on the held-out 2026 data." + "out-of-sample performance on the held-out 2026 data — measured against the\n", + "stateless baseline this notebook just established." ] } ], @@ -533,7 +11948,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/implementations/energy_oil_forecasting/06_protected_eval.ipynb b/implementations/energy_oil_forecasting/06_protected_eval.ipynb index c82f8a5f..f39acaad 100644 --- a/implementations/energy_oil_forecasting/06_protected_eval.ipynb +++ b/implementations/energy_oil_forecasting/06_protected_eval.ipynb @@ -1,559 +1,559 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "7fb27b941602401d91542211134fc71a", - "metadata": {}, - "source": [ - "# WTI Crude Oil — Protected Evaluation (Notebook 6 of 7)\n", - "\n", - "> **Part 6 of 7.** Requires Notebook 5 to have been run first —\n", - "> the trained strategy (`wti-strategy-trained/`) must exist.\n", - "\n", - "This notebook answers one question: **did the self-directed study session improve\n", - "the agent's forecasting?**\n", - "\n", - "We evaluate two versions of the adaptive agent on held-out 2026 data —\n", - "a period of significant WTI price volatility neither agent has ever seen:\n", - "\n", - "| Variant | Strategy | Training |\n", - "|---|---|---|\n", - "| **Untrained** | `wti-strategy/` | None — initial domain priors only |\n", - "| **Trained** | `wti-strategy-trained/` | One self-directed study session (NB05) |\n", - "\n", - "Stateless methods (AutoARIMA, Naive) from NB04 provide an external reference point.\n", - "Both adaptive agent variants are **frozen** during evaluation — no strategy updates —\n", - "so any difference is attributable solely to the training session." - ] + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# WTI Crude Oil — Protected Evaluation (Notebook 6 of 7)\n", + "\n", + "> **Part 6 of 7.** Requires Notebook 5 to have been run first —\n", + "> the trained strategy (`wti-strategy-trained/`) must exist.\n", + "\n", + "This notebook answers one question: **did the self-directed study session improve\n", + "the agent's forecasting?**\n", + "\n", + "We evaluate two versions of the adaptive agent on held-out 2026 data —\n", + "a period of significant WTI price volatility neither agent has ever seen:\n", + "\n", + "| Variant | Strategy | Training |\n", + "|---|---|---|\n", + "| **Untrained** | `wti-strategy/` | None — initial domain priors only |\n", + "| **Trained** | `wti-strategy-trained/` | One self-directed study session (NB05) |\n", + "\n", + "Stateless methods (AutoARIMA, Naive) from NB04 provide an external reference point.\n", + "Both adaptive agent variants are **frozen** during evaluation — no strategy updates —\n", + "so any difference is attributable solely to the training session." + ], + "id": "7fb27b941602401d91542211134fc71a" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 0. Setup & Freeze" + ], + "id": "acae54e37e7d407bbb7b55eff062a284" + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "import warnings\n", + "from pathlib import Path\n", + "\n", + "import pandas as pd\n", + "from aieng.forecasting.evaluation import (\n", + " MultiTargetBacktestSpec,\n", + " cached_multi_backtest,\n", + ")\n", + "from aieng.forecasting.evaluation.backtest import BacktestResult\n", + "from energy_oil_forecasting.adaptive_agent import build_wti_adaptive_predictor\n", + "from energy_oil_forecasting.adaptive_agent.curriculum.snapshot_utils import (\n", + " state_checksum,\n", + ")\n", + "from energy_oil_forecasting.analysis import score_backtest_results\n", + "from energy_oil_forecasting.data import build_wti_service\n", + "\n", + "\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "# ── Paths ─────────────────────────────────────────────────────────────────────\n", + "_NB_DIR = Path(\".\")\n", + "_SKILLS_ROOT = _NB_DIR / \"adaptive_agent\" / \"skills\"\n", + "_CURRICULUM_DIR = _NB_DIR / \"adaptive_agent\" / \"curriculum\"\n", + "_SPECS_DIR = _NB_DIR / \"specs\"\n", + "\n", + "SEED_STRATEGY_DIR = _SKILLS_ROOT / \"wti-strategy\" # untrained baseline\n", + "TRAINED_STRATEGY_DIR = _SKILLS_ROOT / \"wti-strategy-trained\" # after self-directed study\n", + "\n", + "# Both adaptive variants — used for eval, loading, and state checks:\n", + "ADAPTIVE_VARIANTS = {\n", + " \"Agent — untrained\": SEED_STRATEGY_DIR,\n", + " \"Agent — trained\": TRAINED_STRATEGY_DIR,\n", + "}\n", + "\n", + "# ── Model ─────────────────────────────────────────────────────────────────────\n", + "# Two project models: \"gemini-3.1-flash-lite-preview\" (lite/default) and\n", + "# \"gemini-3.5-flash\" (advanced). The adaptive agent uses the advanced model.\n", + "AGENT_MODEL = \"gemini-3.5-flash\"\n", + "\n", + "# ── Run guard ─────────────────────────────────────────────────────────────────\n", + "# Set True on first run; commit outputs; leave False for reproducibility.\n", + "RUN_EVAL = False\n", + "\n", + "# ── Data service ──────────────────────────────────────────────────────────────\n", + "data_service = build_wti_service()\n", + "print(\"Setup complete.\")" + ], + "execution_count": null, + "outputs": [], + "id": "9a63283cbaf04dbcab1f6479b197f3a8" + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# ── Freeze: record pre-eval checksums ────────────────────────────────────────\n", + "_pre_eval_checksums = {name: state_checksum(d) for name, d in ADAPTIVE_VARIANTS.items()}\n", + "print(\"Pre-eval checksums recorded:\")\n", + "for name, ck in _pre_eval_checksums.items():\n", + " print(f\" {name}: {ck[:16]}...\")" + ], + "execution_count": null, + "outputs": [], + "id": "8dd0d8092fe74a7c96281538738b07e2" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. The Knowledge-Cutoff Teaching Point\n", + "\n", + "**Gemini's parametric knowledge cutoff is approximately January 2025.**\n", + "This has a concrete implication for this evaluation:\n", + "\n", + "- The **training period** (2025) is at or near the model's parametric knowledge\n", + " horizon. During the self-directed study in NB05, the agent was instructed to\n", + " fetch data via yfinance and reason from what it computed — not from memorized\n", + " facts about 2025 WTI prices.\n", + "\n", + "- The **evaluation period** (Feb–Jun 2026) is definitively post-cutoff.\n", + " During eval, the agent must rely entirely on:\n", + " 1. Live Google Search (with `cutoff_date` enforcement per origin)\n", + " 2. Code execution (for statistical analysis of fetched data)\n", + " 3. Its accumulated strategy state (from the training session)\n", + "\n", + "This is a clean test of what the training phase actually adds: it cannot be\n", + "attributed to the model's parametric knowledge of the eval period." + ], + "id": "72eea5119410473aa328ad9291626812" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Load Stateless Eval Results\n", + "\n", + "Notebook 4 saved 2026 eval results for AutoARIMA and Naive baselines.\n", + "We load them here as external reference points — no re-run needed." + ], + "id": "8edb47106e1a46a883d545849b8ab81b" + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# ── Load eval results from NB04 ─────────────────────────────────────────────\n", + "# Load only stateless results (not agent-specific files).\n", + "_stateless_jsons = [\n", + " f for f in sorted(_CURRICULUM_DIR.glob(\"eval_*.json\")) if not f.stem.removeprefix(\"eval_\").startswith(\"Agent\")\n", + "]\n", + "if not _stateless_jsons:\n", + " raise FileNotFoundError(\n", + " \"No stateless eval result files found in adaptive_agent/curriculum/. \"\n", + " \"Run 04_systematic_backtest_eval.ipynb first.\"\n", + " )\n", + "\n", + "all_eval_results: dict[str, BacktestResult] = {}\n", + "for f in _stateless_jsons:\n", + " name = f.stem.removeprefix(\"eval_\").replace(\"_\", \" \")\n", + " all_eval_results[name] = BacktestResult.model_validate_json(f.read_text())\n", + "\n", + "print(f\"Loaded {len(all_eval_results)} stateless eval result(s):\")\n", + "for name, r in all_eval_results.items():\n", + " print(f\" {name}: {len(r.predictions)} predictions, mean CRPS = {r.mean_score:.4f}\")" + ], + "execution_count": null, + "outputs": [], + "id": "10185d26023b46108eb7d9f57d49d2b3" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 3. Evaluate Adaptive Agent Variants\n", + "\n", + "Both adaptive variants are evaluated on the same 2026 eval spec used by\n", + "the stateless predictors in NB04.\n", + "\n", + "> **Run guard:** `RUN_EVAL = False` by default. Set to `True` on first run,\n", + "> commit the saved result files, and leave `False` for reproducibility." + ], + "id": "8763a12b2bbd4a93a75aff182afb95dc" + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "import yaml # noqa: PLC0415\n", + "\n", + "\n", + "with open(_SPECS_DIR / \"energy_oil_eval.yaml\") as _f:\n", + " eval_spec = MultiTargetBacktestSpec.model_validate(yaml.safe_load(_f))\n", + "\n", + "\n", + "def _safe_key(name: str) -> str:\n", + " return name.replace(\" \", \"_\").replace(\"(\", \"\").replace(\")\", \"\").replace(\"—\", \"\").strip(\"_\")\n", + "\n", + "\n", + "if RUN_EVAL:\n", + " print(\"Running adaptive agent variants on 2026 eval spec...\")\n", + " print(\"(Live API calls — first run may take several minutes.)\\n\")\n", + "\n", + " for variant_name, strategy_dir in ADAPTIVE_VARIANTS.items():\n", + " predictor = build_wti_adaptive_predictor(strategy_dir=strategy_dir, model=AGENT_MODEL)\n", + " result_dict = cached_multi_backtest(predictor, eval_spec, data_service)\n", + " result = next(iter(result_dict.values()))\n", + " all_eval_results[variant_name] = result\n", + " safe = _safe_key(variant_name)\n", + " (_CURRICULUM_DIR / f\"eval_{safe}.json\").write_text(result.model_dump_json(), encoding=\"utf-8\")\n", + " print(f\" {variant_name}: mean CRPS = {result.mean_score:.4f} ✓\")\n", + "\n", + " print(\"\\nEval complete.\")\n", + "else:\n", + " # Load committed results for all adaptive variants\n", + " for variant_name in ADAPTIVE_VARIANTS:\n", + " safe = _safe_key(variant_name)\n", + " _f = _CURRICULUM_DIR / f\"eval_{safe}.json\"\n", + " if _f.exists():\n", + " all_eval_results[variant_name] = BacktestResult.model_validate_json(_f.read_text())\n", + " print(\"RUN_EVAL = False — using committed outputs (or set True to re-run).\")\n", + "print(f\"Eval results available: {list(all_eval_results)}\")" + ], + "execution_count": null, + "outputs": [], + "id": "7623eae2785240b9bd12b16a66d81610" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 4. Before vs After — Comparative Scorecard\n", + "\n", + "All predictors evaluated on the same 2026 eval origins.\n", + "Lower CRPS is better.\n", + "\n", + "| | What it represents |\n", + "|---|---|\n", + "| **Agent — untrained** | Adaptive architecture + news search, zero training |\n", + "| **Agent — trained** | Same, plus one self-directed study session |\n", + "| AutoARIMA | Best stateless statistical method from NB04 |\n", + "| Naive | Last-value baseline |" + ], + "id": "7cdc8c89c7104fffa095e18ddfef8986" + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "scorecard_rows = []\n", + "for name, result in all_eval_results.items():\n", + " _result_for_scoring = result if isinstance(result, dict) else {name: result}\n", + " scores = score_backtest_results(_result_for_scoring, data_service)\n", + " scorecard_rows.append(\n", + " {\n", + " \"Predictor\": name,\n", + " \"Mean CRPS\": round(scores.get(\"mean_crps\", float(\"nan\")), 3),\n", + " \"MAE h=21d\": round(scores.get(\"mae_h21\", float(\"nan\")), 3),\n", + " \"80% CI Coverage\": f\"{scores.get('coverage_80', float('nan')):.1f}%\",\n", + " }\n", + " )\n", + "\n", + "df_scorecard = pd.DataFrame(scorecard_rows).set_index(\"Predictor\")\n", + "df_scorecard = df_scorecard.sort_values(\"Mean CRPS\")\n", + "\n", + "print(\"━\" * 72)\n", + "print(\"2026 PROTECTED EVAL (sorted by CRPS, lower is better):\")\n", + "print(\"━\" * 72)\n", + "print(df_scorecard.to_string())" + ], + "execution_count": null, + "outputs": [], + "id": "b118ea5561624da68c537baed56e602f" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 5. Forecast Comparison — All Eval Origins, h=21d\n", + "\n", + "One panel per predictor, all eval origins on a shared time axis.\n", + "Each panel shows the realised WTI price (black line), the 21-day-ahead\n", + "point forecast (diamond), and the 80% prediction interval (vertical bar).\n", + "Ordered by CRPS score — best at top." + ], + "id": "938c804e27f84196a10c8828c723f798" + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "from datetime import datetime\n", + "\n", + "import plotly.graph_objects as go\n", + "from plotly.subplots import make_subplots\n", + "\n", + "\n", + "_full_series = data_service.get_series(\"wti_crude_oil_price\", as_of=datetime.now())\n", + "_price_ts = pd.to_datetime(_full_series[\"timestamp\"])\n", + "_price_vals = _full_series[\"value\"].values\n", + "\n", + "_COLORS = {\n", + " \"Naive (Last Value)\": \"#aaaaaa\",\n", + " \"AutoARIMA\": \"#4e8fc7\",\n", + " \"Agent — untrained\": \"#f4a261\",\n", + " \"Agent — trained\": \"#6a0572\",\n", + "}\n", + "# Show predictors in scorecard order (best CRPS first)\n", + "_PREDICTOR_ORDER = [p for p in df_scorecard.index if p in _COLORS]\n", + "\n", + "\n", + "def _has_forecast(payload) -> bool:\n", + " return hasattr(payload, \"point_forecast\") and hasattr(payload, \"quantiles\")\n", + "\n", + "\n", + "# Collect the longest-horizon prediction per (predictor, origin)\n", + "_h21: dict[tuple[str, str], object] = {}\n", + "for name, result in all_eval_results.items():\n", + " for pred in result.predictions:\n", + " if not _has_forecast(pred.payload):\n", + " continue\n", + " horizon = (pd.Timestamp(pred.forecast_date) - pd.Timestamp(pred.as_of)).days\n", + " key = (name, str(pred.as_of.date()))\n", + " existing = _h21.get(key)\n", + " if existing is None:\n", + " _h21[key] = pred\n", + " else:\n", + " existing_h = (pd.Timestamp(existing.forecast_date) - pd.Timestamp(existing.as_of)).days\n", + " if horizon > existing_h:\n", + " _h21[key] = pred\n", + "print(f\"h-max predictions collected: {len(_h21)}\")\n", + "\n", + "_origins = sorted({str(pred.as_of.date()) for result in all_eval_results.values() for pred in result.predictions})\n", + "_t0 = pd.Timestamp(_origins[0]) - pd.Timedelta(days=14)\n", + "_t1 = pd.Timestamp(_origins[-1]) + pd.Timedelta(days=28)\n", + "_mask = (_price_ts >= _t0) & (_price_ts <= _t1)\n", + "_ctx_dates = _price_ts[_mask]\n", + "_ctx_prices = _price_vals[_mask]\n", + "\n", + "_n_rows = len(_PREDICTOR_ORDER)\n", + "fig = make_subplots(\n", + " rows=_n_rows,\n", + " cols=1,\n", + " shared_xaxes=True,\n", + " vertical_spacing=0.03,\n", + " subplot_titles=_PREDICTOR_ORDER,\n", + ")\n", + "\n", + "for row_idx, name in enumerate(_PREDICTOR_ORDER, 1):\n", + " color = _COLORS[name]\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=_ctx_dates,\n", + " y=_ctx_prices,\n", + " mode=\"lines\",\n", + " name=\"Actual\",\n", + " line={\"color\": \"black\", \"width\": 1.5},\n", + " showlegend=(row_idx == 1),\n", + " legendgroup=\"actual\",\n", + " ),\n", + " row=row_idx,\n", + " col=1,\n", + " )\n", + "\n", + " for origin in _origins:\n", + " pred = _h21.get((name, origin))\n", + " if pred is None:\n", + " continue\n", + " fc_date = pd.Timestamp(pred.forecast_date)\n", + " pt = pred.payload.point_forecast\n", + " lo = pred.payload.quantiles.get(0.1, pt)\n", + " hi = pred.payload.quantiles.get(0.9, pt)\n", + " fig.add_shape(\n", + " type=\"line\",\n", + " x0=pd.Timestamp(origin),\n", + " x1=pd.Timestamp(origin),\n", + " y0=0,\n", + " y1=1,\n", + " yref=\"paper\",\n", + " xref=f\"x{row_idx}\" if row_idx > 1 else \"x\",\n", + " line={\"dash\": \"dot\", \"color\": \"#cccccc\", \"width\": 1},\n", + " row=row_idx,\n", + " col=1,\n", + " )\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=[fc_date, fc_date],\n", + " y=[lo, hi],\n", + " mode=\"lines\",\n", + " line={\"color\": color, \"width\": 4},\n", + " showlegend=False,\n", + " legendgroup=name,\n", + " ),\n", + " row=row_idx,\n", + " col=1,\n", + " )\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=[fc_date],\n", + " y=[pt],\n", + " mode=\"markers\",\n", + " marker={\"color\": color, \"size\": 9, \"symbol\": \"diamond\", \"line\": {\"color\": \"white\", \"width\": 1}},\n", + " name=name,\n", + " showlegend=False,\n", + " legendgroup=name,\n", + " ),\n", + " row=row_idx,\n", + " col=1,\n", + " )\n", + "\n", + "fig.update_layout(\n", + " title=\"h=21d forecasts — point (diamond) + 80% CI (bar)\",\n", + " height=220 * _n_rows,\n", + " width=950,\n", + " showlegend=False,\n", + " margin={\"t\": 60, \"b\": 40},\n", + ")\n", + "for i in range(1, _n_rows + 1):\n", + " fig.update_yaxes(title_text=\"USD/bbl\", title_font_size=10, row=i, col=1)\n", + "fig.show()" + ], + "execution_count": null, + "outputs": [], + "id": "504fb2a444614c0babb325280ed9130a" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 6. What the Agents Said — Rationale Comparison\n", + "\n", + "Each adaptive agent records its reasoning in the prediction metadata.\n", + "Below are the rationales from the first eval origin for the untrained and trained\n", + "agents — the clearest way to see whether the self-directed study session changed\n", + "what the agent attends to and how it frames its uncertainty." + ], + "id": "59bbdb311c014d738909a11f9e486628" + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "from IPython.display import Markdown\n", + "from IPython.display import display as ipy_display\n", + "\n", + "\n", + "_first_origin = sorted({str(p.as_of.date()) for p in next(iter(all_eval_results.values())).predictions})[0]\n", + "\n", + "for name in [\"Agent — untrained\", \"Agent — trained\"]:\n", + " if name not in all_eval_results:\n", + " continue\n", + " preds = [p for p in all_eval_results[name].predictions if str(p.as_of.date()) == _first_origin]\n", + " if not preds:\n", + " continue\n", + " rationale = preds[0].metadata.get(\"rationale\", \"*(no rationale stored)*\")\n", + " ipy_display(Markdown(f\"### {name}\\n*Origin: {_first_origin}*\\n\\n> {rationale.strip()}\"))\n", + " print()" + ], + "execution_count": null, + "outputs": [], + "id": "b43b363d81ae4b689946ece5c682cd59" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 7. Freeze Verification\n", + "\n", + "Confirm the evaluation did not trigger any skill state mutations.\n", + "Checksums should match the pre-eval values recorded in Setup." + ], + "id": "8a65eabff63a45729fe45fb5ade58bdc" + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "print(\"State integrity check (both variants should be unchanged):\")\n", + "all_ok = True\n", + "for name, d in ADAPTIVE_VARIANTS.items():\n", + " ck_after = state_checksum(d)\n", + " ok = ck_after == _pre_eval_checksums[name]\n", + " all_ok = all_ok and ok\n", + " print(f\" {name}: {'✓ unchanged' if ok else '⚠ MODIFIED'}\")\n", + "\n", + "if not all_ok:\n", + " print(\"\\nWarning: the agent updated its strategy during evaluation.\")\n", + " print(\"See Closing Note for how to explore this intentionally.\")" + ], + "execution_count": null, + "outputs": [], + "id": "c3933fab20d04ec698c2621248eb3be0" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 8. Closing Note — Unfreezing\n", + "\n", + "The adaptive agents here were **frozen** during evaluation: no strategy updates\n", + "during the eval period. This gives a clean before/after comparison.\n", + "\n", + "But in live deployment, you would not freeze the agent. After each resolved\n", + "prediction, you would send a resolution message and let the agent decide whether\n", + "to record an observation or update a hypothesis. Over time, the strategy evolves.\n", + "\n", + "**To explore unfreezing:**\n", + "\n", + "1. Set `RUN_EVAL = True`.\n", + "2. Remove the state checksum assertion (or ignore the warning).\n", + "3. Modify the eval loop to send a resolution message after each prediction:\n", + "\n", + "```python\n", + "resolution_msg = (\n", + " f'The actual WTI price on {pred.forecast_date.date()} was {actual:.2f}. '\n", + " f'Your point forecast was {pred.payload.point_forecast:.2f} '\n", + " f'(error: {pred.payload.point_forecast - actual:+.2f}). '\n", + " 'Please review whether this outcome is relevant to any open hypothesis.'\n", + ")\n", + "await runner.run_text_async(resolution_msg)\n", + "```\n", + "\n", + "4. Re-run and compare the final strategy state to the frozen baseline.\n", + "\n", + "To continue interactively with the trained agent, launch the ADK web interface:\n", + "\n", + "```bash\n", + "cd implementations/energy_oil_forecasting\n", + "WTI_STRATEGY_DIR=adaptive_agent/skills/wti-strategy-trained \\\\\n", + " uv run adk web adaptive_agent/\n", + "```\n", + "\n", + "Open `http://localhost:8000`. See Notebook 5 for suggested conversation starters." + ], + "id": "be42fd1a" + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.12.12" + } }, - { - "cell_type": "markdown", - "id": "acae54e37e7d407bbb7b55eff062a284", - "metadata": {}, - "source": [ - "---\n", - "## 0. Setup & Freeze" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9a63283cbaf04dbcab1f6479b197f3a8", - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "from pathlib import Path\n", - "\n", - "import pandas as pd\n", - "from aieng.forecasting.evaluation import (\n", - " MultiTargetBacktestSpec,\n", - " cached_multi_backtest,\n", - ")\n", - "from aieng.forecasting.evaluation.backtest import BacktestResult\n", - "from energy_oil_forecasting.adaptive_agent import build_wti_adaptive_predictor\n", - "from energy_oil_forecasting.adaptive_agent.curriculum.snapshot_utils import (\n", - " state_checksum,\n", - ")\n", - "from energy_oil_forecasting.analysis import score_backtest_results\n", - "from energy_oil_forecasting.data import build_wti_service\n", - "\n", - "\n", - "warnings.filterwarnings(\"ignore\")\n", - "\n", - "# ── Paths ─────────────────────────────────────────────────────────────────────\n", - "_NB_DIR = Path(\".\")\n", - "_SKILLS_ROOT = _NB_DIR / \"adaptive_agent\" / \"skills\"\n", - "_CURRICULUM_DIR = _NB_DIR / \"adaptive_agent\" / \"curriculum\"\n", - "_SPECS_DIR = _NB_DIR / \"specs\"\n", - "\n", - "SEED_STRATEGY_DIR = _SKILLS_ROOT / \"wti-strategy\" # untrained baseline\n", - "TRAINED_STRATEGY_DIR = _SKILLS_ROOT / \"wti-strategy-trained\" # after self-directed study\n", - "\n", - "# Both adaptive variants — used for eval, loading, and state checks:\n", - "ADAPTIVE_VARIANTS = {\n", - " \"Agent — untrained\": SEED_STRATEGY_DIR,\n", - " \"Agent — trained\": TRAINED_STRATEGY_DIR,\n", - "}\n", - "\n", - "# ── Model ─────────────────────────────────────────────────────────────────────\n", - "# Two project models: \"gemini-3.1-flash-lite-preview\" (lite/default) and\n", - "# \"gemini-3.5-flash\" (advanced). The adaptive agent uses the advanced model.\n", - "AGENT_MODEL = \"gemini-3.5-flash\"\n", - "\n", - "# ── Run guard ─────────────────────────────────────────────────────────────────\n", - "# Set True on first run; commit outputs; leave False for reproducibility.\n", - "RUN_EVAL = False\n", - "\n", - "# ── Data service ──────────────────────────────────────────────────────────────\n", - "data_service = build_wti_service()\n", - "print(\"Setup complete.\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8dd0d8092fe74a7c96281538738b07e2", - "metadata": {}, - "outputs": [], - "source": [ - "# ── Freeze: record pre-eval checksums ────────────────────────────────────────\n", - "_pre_eval_checksums = {name: state_checksum(d) for name, d in ADAPTIVE_VARIANTS.items()}\n", - "print(\"Pre-eval checksums recorded:\")\n", - "for name, ck in _pre_eval_checksums.items():\n", - " print(f\" {name}: {ck[:16]}...\")" - ] - }, - { - "cell_type": "markdown", - "id": "72eea5119410473aa328ad9291626812", - "metadata": {}, - "source": [ - "---\n", - "## 1. The Knowledge-Cutoff Teaching Point\n", - "\n", - "**Gemini's parametric knowledge cutoff is approximately January 2025.**\n", - "This has a concrete implication for this evaluation:\n", - "\n", - "- The **training period** (2025) is at or near the model's parametric knowledge\n", - " horizon. During the self-directed study in NB05, the agent was instructed to\n", - " fetch data via yfinance and reason from what it computed — not from memorized\n", - " facts about 2025 WTI prices.\n", - "\n", - "- The **evaluation period** (Feb–Mar 2026) is definitively post-cutoff.\n", - " During eval, the agent must rely entirely on:\n", - " 1. Live Google Search (with `cutoff_date` enforcement per origin)\n", - " 2. Code execution (for statistical analysis of fetched data)\n", - " 3. Its accumulated strategy state (from the training session)\n", - "\n", - "This is a clean test of what the training phase actually adds: it cannot be\n", - "attributed to the model's parametric knowledge of the eval period." - ] - }, - { - "cell_type": "markdown", - "id": "8edb47106e1a46a883d545849b8ab81b", - "metadata": {}, - "source": [ - "---\n", - "## 2. Load Stateless Eval Results\n", - "\n", - "Notebook 4 saved 2026 eval results for AutoARIMA and Naive baselines.\n", - "We load them here as external reference points — no re-run needed." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "10185d26023b46108eb7d9f57d49d2b3", - "metadata": {}, - "outputs": [], - "source": [ - "# ── Load eval results from NB04 ─────────────────────────────────────────────\n", - "# Load only stateless results (not agent-specific files).\n", - "_stateless_jsons = [\n", - " f for f in sorted(_CURRICULUM_DIR.glob(\"eval_*.json\")) if not f.stem.removeprefix(\"eval_\").startswith(\"Agent\")\n", - "]\n", - "if not _stateless_jsons:\n", - " raise FileNotFoundError(\n", - " \"No stateless eval result files found in adaptive_agent/curriculum/. \"\n", - " \"Run 04_systematic_backtest_eval.ipynb first.\"\n", - " )\n", - "\n", - "all_eval_results: dict[str, BacktestResult] = {}\n", - "for f in _stateless_jsons:\n", - " name = f.stem.removeprefix(\"eval_\").replace(\"_\", \" \")\n", - " all_eval_results[name] = BacktestResult.model_validate_json(f.read_text())\n", - "\n", - "print(f\"Loaded {len(all_eval_results)} stateless eval result(s):\")\n", - "for name, r in all_eval_results.items():\n", - " print(f\" {name}: {len(r.predictions)} predictions, mean CRPS = {r.mean_score:.4f}\")" - ] - }, - { - "cell_type": "markdown", - "id": "8763a12b2bbd4a93a75aff182afb95dc", - "metadata": {}, - "source": [ - "---\n", - "## 3. Evaluate Adaptive Agent Variants\n", - "\n", - "Both adaptive variants are evaluated on the same 2026 eval spec used by\n", - "the stateless predictors in NB04.\n", - "\n", - "> **Run guard:** `RUN_EVAL = False` by default. Set to `True` on first run,\n", - "> commit the saved result files, and leave `False` for reproducibility." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7623eae2785240b9bd12b16a66d81610", - "metadata": {}, - "outputs": [], - "source": [ - "import yaml # noqa: PLC0415\n", - "\n", - "\n", - "with open(_SPECS_DIR / \"energy_oil_eval.yaml\") as _f:\n", - " eval_spec = MultiTargetBacktestSpec.model_validate(yaml.safe_load(_f))\n", - "\n", - "\n", - "def _safe_key(name: str) -> str:\n", - " return name.replace(\" \", \"_\").replace(\"(\", \"\").replace(\")\", \"\").replace(\"—\", \"\").strip(\"_\")\n", - "\n", - "\n", - "if RUN_EVAL:\n", - " print(\"Running adaptive agent variants on 2026 eval spec...\")\n", - " print(\"(Live API calls — first run may take several minutes.)\\n\")\n", - "\n", - " for variant_name, strategy_dir in ADAPTIVE_VARIANTS.items():\n", - " predictor = build_wti_adaptive_predictor(strategy_dir=strategy_dir, model=AGENT_MODEL)\n", - " result_dict = cached_multi_backtest(predictor, eval_spec, data_service)\n", - " result = next(iter(result_dict.values()))\n", - " all_eval_results[variant_name] = result\n", - " safe = _safe_key(variant_name)\n", - " (_CURRICULUM_DIR / f\"eval_{safe}.json\").write_text(result.model_dump_json(), encoding=\"utf-8\")\n", - " print(f\" {variant_name}: mean CRPS = {result.mean_score:.4f} ✓\")\n", - "\n", - " print(\"\\nEval complete.\")\n", - "else:\n", - " # Load committed results for all adaptive variants\n", - " for variant_name in ADAPTIVE_VARIANTS:\n", - " safe = _safe_key(variant_name)\n", - " _f = _CURRICULUM_DIR / f\"eval_{safe}.json\"\n", - " if _f.exists():\n", - " all_eval_results[variant_name] = BacktestResult.model_validate_json(_f.read_text())\n", - " print(\"RUN_EVAL = False — using committed outputs (or set True to re-run).\")\n", - "print(f\"Eval results available: {list(all_eval_results)}\")" - ] - }, - { - "cell_type": "markdown", - "id": "7cdc8c89c7104fffa095e18ddfef8986", - "metadata": {}, - "source": [ - "---\n", - "## 4. Before vs After — Comparative Scorecard\n", - "\n", - "All predictors evaluated on the same 2026 eval origins.\n", - "Lower CRPS is better.\n", - "\n", - "| | What it represents |\n", - "|---|---|\n", - "| **Agent — untrained** | Adaptive architecture + news search, zero training |\n", - "| **Agent — trained** | Same, plus one self-directed study session |\n", - "| AutoARIMA | Best stateless statistical method from NB04 |\n", - "| Naive | Last-value baseline |" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b118ea5561624da68c537baed56e602f", - "metadata": {}, - "outputs": [], - "source": [ - "scorecard_rows = []\n", - "for name, result in all_eval_results.items():\n", - " _result_for_scoring = result if isinstance(result, dict) else {name: result}\n", - " scores = score_backtest_results(_result_for_scoring, data_service)\n", - " scorecard_rows.append(\n", - " {\n", - " \"Predictor\": name,\n", - " \"Mean CRPS\": round(scores.get(\"mean_crps\", float(\"nan\")), 3),\n", - " \"MAE h=21d\": round(scores.get(\"mae_h21\", float(\"nan\")), 3),\n", - " \"80% CI Coverage\": f\"{scores.get('coverage_80', float('nan')):.1f}%\",\n", - " }\n", - " )\n", - "\n", - "df_scorecard = pd.DataFrame(scorecard_rows).set_index(\"Predictor\")\n", - "df_scorecard = df_scorecard.sort_values(\"Mean CRPS\")\n", - "\n", - "print(\"━\" * 72)\n", - "print(\"2026 PROTECTED EVAL (sorted by CRPS, lower is better):\")\n", - "print(\"━\" * 72)\n", - "print(df_scorecard.to_string())" - ] - }, - { - "cell_type": "markdown", - "id": "938c804e27f84196a10c8828c723f798", - "metadata": {}, - "source": [ - "---\n", - "## 5. Forecast Comparison — All Eval Origins, h=21d\n", - "\n", - "One panel per predictor, all eval origins on a shared time axis.\n", - "Each panel shows the realised WTI price (black line), the 21-day-ahead\n", - "point forecast (diamond), and the 80% prediction interval (vertical bar).\n", - "Ordered by CRPS score — best at top." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "504fb2a444614c0babb325280ed9130a", - "metadata": {}, - "outputs": [], - "source": [ - "from datetime import datetime\n", - "\n", - "import plotly.graph_objects as go\n", - "from plotly.subplots import make_subplots\n", - "\n", - "\n", - "_full_series = data_service.get_series(\"wti_crude_oil_price\", as_of=datetime.now())\n", - "_price_ts = pd.to_datetime(_full_series[\"timestamp\"])\n", - "_price_vals = _full_series[\"value\"].values\n", - "\n", - "_COLORS = {\n", - " \"Naive (Last Value)\": \"#aaaaaa\",\n", - " \"AutoARIMA\": \"#4e8fc7\",\n", - " \"Agent — untrained\": \"#f4a261\",\n", - " \"Agent — trained\": \"#6a0572\",\n", - "}\n", - "# Show predictors in scorecard order (best CRPS first)\n", - "_PREDICTOR_ORDER = [p for p in df_scorecard.index if p in _COLORS]\n", - "\n", - "\n", - "def _has_forecast(payload) -> bool:\n", - " return hasattr(payload, \"point_forecast\") and hasattr(payload, \"quantiles\")\n", - "\n", - "\n", - "# Collect the longest-horizon prediction per (predictor, origin)\n", - "_h21: dict[tuple[str, str], object] = {}\n", - "for name, result in all_eval_results.items():\n", - " for pred in result.predictions:\n", - " if not _has_forecast(pred.payload):\n", - " continue\n", - " horizon = (pd.Timestamp(pred.forecast_date) - pd.Timestamp(pred.as_of)).days\n", - " key = (name, str(pred.as_of.date()))\n", - " existing = _h21.get(key)\n", - " if existing is None:\n", - " _h21[key] = pred\n", - " else:\n", - " existing_h = (pd.Timestamp(existing.forecast_date) - pd.Timestamp(existing.as_of)).days\n", - " if horizon > existing_h:\n", - " _h21[key] = pred\n", - "print(f\"h-max predictions collected: {len(_h21)}\")\n", - "\n", - "_origins = sorted({str(pred.as_of.date()) for result in all_eval_results.values() for pred in result.predictions})\n", - "_t0 = pd.Timestamp(_origins[0]) - pd.Timedelta(days=14)\n", - "_t1 = pd.Timestamp(_origins[-1]) + pd.Timedelta(days=28)\n", - "_mask = (_price_ts >= _t0) & (_price_ts <= _t1)\n", - "_ctx_dates = _price_ts[_mask]\n", - "_ctx_prices = _price_vals[_mask]\n", - "\n", - "_n_rows = len(_PREDICTOR_ORDER)\n", - "fig = make_subplots(\n", - " rows=_n_rows,\n", - " cols=1,\n", - " shared_xaxes=True,\n", - " vertical_spacing=0.03,\n", - " subplot_titles=_PREDICTOR_ORDER,\n", - ")\n", - "\n", - "for row_idx, name in enumerate(_PREDICTOR_ORDER, 1):\n", - " color = _COLORS[name]\n", - " fig.add_trace(\n", - " go.Scatter(\n", - " x=_ctx_dates,\n", - " y=_ctx_prices,\n", - " mode=\"lines\",\n", - " name=\"Actual\",\n", - " line={\"color\": \"black\", \"width\": 1.5},\n", - " showlegend=(row_idx == 1),\n", - " legendgroup=\"actual\",\n", - " ),\n", - " row=row_idx,\n", - " col=1,\n", - " )\n", - "\n", - " for origin in _origins:\n", - " pred = _h21.get((name, origin))\n", - " if pred is None:\n", - " continue\n", - " fc_date = pd.Timestamp(pred.forecast_date)\n", - " pt = pred.payload.point_forecast\n", - " lo = pred.payload.quantiles.get(0.1, pt)\n", - " hi = pred.payload.quantiles.get(0.9, pt)\n", - " fig.add_shape(\n", - " type=\"line\",\n", - " x0=pd.Timestamp(origin),\n", - " x1=pd.Timestamp(origin),\n", - " y0=0,\n", - " y1=1,\n", - " yref=\"paper\",\n", - " xref=f\"x{row_idx}\" if row_idx > 1 else \"x\",\n", - " line={\"dash\": \"dot\", \"color\": \"#cccccc\", \"width\": 1},\n", - " row=row_idx,\n", - " col=1,\n", - " )\n", - " fig.add_trace(\n", - " go.Scatter(\n", - " x=[fc_date, fc_date],\n", - " y=[lo, hi],\n", - " mode=\"lines\",\n", - " line={\"color\": color, \"width\": 4},\n", - " showlegend=False,\n", - " legendgroup=name,\n", - " ),\n", - " row=row_idx,\n", - " col=1,\n", - " )\n", - " fig.add_trace(\n", - " go.Scatter(\n", - " x=[fc_date],\n", - " y=[pt],\n", - " mode=\"markers\",\n", - " marker={\"color\": color, \"size\": 9, \"symbol\": \"diamond\", \"line\": {\"color\": \"white\", \"width\": 1}},\n", - " name=name,\n", - " showlegend=False,\n", - " legendgroup=name,\n", - " ),\n", - " row=row_idx,\n", - " col=1,\n", - " )\n", - "\n", - "fig.update_layout(\n", - " title=\"h=21d forecasts — point (diamond) + 80% CI (bar)\",\n", - " height=220 * _n_rows,\n", - " width=950,\n", - " showlegend=False,\n", - " margin={\"t\": 60, \"b\": 40},\n", - ")\n", - "for i in range(1, _n_rows + 1):\n", - " fig.update_yaxes(title_text=\"USD/bbl\", title_font_size=10, row=i, col=1)\n", - "fig.show()" - ] - }, - { - "cell_type": "markdown", - "id": "59bbdb311c014d738909a11f9e486628", - "metadata": {}, - "source": [ - "---\n", - "## 6. What the Agents Said — Rationale Comparison\n", - "\n", - "Each adaptive agent records its reasoning in the prediction metadata.\n", - "Below are the rationales from the first eval origin for the untrained and trained\n", - "agents — the clearest way to see whether the self-directed study session changed\n", - "what the agent attends to and how it frames its uncertainty." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b43b363d81ae4b689946ece5c682cd59", - "metadata": {}, - "outputs": [], - "source": [ - "from IPython.display import Markdown\n", - "from IPython.display import display as ipy_display\n", - "\n", - "\n", - "_first_origin = sorted({str(p.as_of.date()) for p in next(iter(all_eval_results.values())).predictions})[0]\n", - "\n", - "for name in [\"Agent — untrained\", \"Agent — trained\"]:\n", - " if name not in all_eval_results:\n", - " continue\n", - " preds = [p for p in all_eval_results[name].predictions if str(p.as_of.date()) == _first_origin]\n", - " if not preds:\n", - " continue\n", - " rationale = preds[0].metadata.get(\"rationale\", \"*(no rationale stored)*\")\n", - " ipy_display(Markdown(f\"### {name}\\n*Origin: {_first_origin}*\\n\\n> {rationale.strip()}\"))\n", - " print()" - ] - }, - { - "cell_type": "markdown", - "id": "8a65eabff63a45729fe45fb5ade58bdc", - "metadata": {}, - "source": [ - "---\n", - "## 7. Freeze Verification\n", - "\n", - "Confirm the evaluation did not trigger any skill state mutations.\n", - "Checksums should match the pre-eval values recorded in Setup." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c3933fab20d04ec698c2621248eb3be0", - "metadata": {}, - "outputs": [], - "source": [ - "print(\"State integrity check (both variants should be unchanged):\")\n", - "all_ok = True\n", - "for name, d in ADAPTIVE_VARIANTS.items():\n", - " ck_after = state_checksum(d)\n", - " ok = ck_after == _pre_eval_checksums[name]\n", - " all_ok = all_ok and ok\n", - " print(f\" {name}: {'✓ unchanged' if ok else '⚠ MODIFIED'}\")\n", - "\n", - "if not all_ok:\n", - " print(\"\\nWarning: the agent updated its strategy during evaluation.\")\n", - " print(\"See Closing Note for how to explore this intentionally.\")" - ] - }, - { - "cell_type": "markdown", - "id": "be42fd1a", - "metadata": {}, - "source": [ - "---\n", - "## 8. Closing Note — Unfreezing\n", - "\n", - "The adaptive agents here were **frozen** during evaluation: no strategy updates\n", - "during the eval period. This gives a clean before/after comparison.\n", - "\n", - "But in live deployment, you would not freeze the agent. After each resolved\n", - "prediction, you would send a resolution message and let the agent decide whether\n", - "to record an observation or update a hypothesis. Over time, the strategy evolves.\n", - "\n", - "**To explore unfreezing:**\n", - "\n", - "1. Set `RUN_EVAL = True`.\n", - "2. Remove the state checksum assertion (or ignore the warning).\n", - "3. Modify the eval loop to send a resolution message after each prediction:\n", - "\n", - "```python\n", - "resolution_msg = (\n", - " f'The actual WTI price on {pred.forecast_date.date()} was {actual:.2f}. '\n", - " f'Your point forecast was {pred.payload.point_forecast:.2f} '\n", - " f'(error: {pred.payload.point_forecast - actual:+.2f}). '\n", - " 'Please review whether this outcome is relevant to any open hypothesis.'\n", - ")\n", - "await runner.run_text_async(resolution_msg)\n", - "```\n", - "\n", - "4. Re-run and compare the final strategy state to the frozen baseline.\n", - "\n", - "To continue interactively with the trained agent, launch the ADK web interface:\n", - "\n", - "```bash\n", - "cd implementations/energy_oil_forecasting\n", - "WTI_STRATEGY_DIR=adaptive_agent/skills/wti-strategy-trained \\\\\n", - " uv run adk web adaptive_agent/\n", - "```\n", - "\n", - "Open `http://localhost:8000`. See Notebook 5 for suggested conversation starters." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "name": "python", - "version": "3.12.12" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/implementations/energy_oil_forecasting/99_starter_agent.ipynb b/implementations/energy_oil_forecasting/99_starter_agent.ipynb index 4f1673f6..20b4c2b7 100644 --- a/implementations/energy_oil_forecasting/99_starter_agent.ipynb +++ b/implementations/energy_oil_forecasting/99_starter_agent.ipynb @@ -224,7 +224,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/implementations/energy_oil_forecasting/adaptive_agent/curriculum/backtest_AutoARIMA.json b/implementations/energy_oil_forecasting/adaptive_agent/curriculum/backtest_AutoARIMA.json index 1924ecb3..d37704e5 100644 --- a/implementations/energy_oil_forecasting/adaptive_agent/curriculum/backtest_AutoARIMA.json +++ b/implementations/energy_oil_forecasting/adaptive_agent/curriculum/backtest_AutoARIMA.json @@ -1 +1 @@ -{"spec":{"task":{"task_id":"wti_oil_price_forecast","target_series_id":"wti_crude_oil_price","horizons":[5,10,21],"frequency":"B","description":"WTI Crude Oil continuous front-month futures Close price (yfinance symbol: CL=F), projected 5, 10, and 21 trading days ahead.","resolution_fn":"observed_value_at_resolution_timestamp"},"start":"2025-01-06T00:00:00","end":"2025-12-22T00:00:00","stride":5,"warmup":250,"description":"Weekly rolling backtest in 2025 for daily WTI crude oil price forecasting. Evaluates trajectory forecasts (5, 10, 21 business days) with CRPS/MAE and binary up-shock forecasts (climb > $5 in 5 business days) with Brier Score. Used to select the top contender models."},"predictor_id":"darts_autoarima","predictions":[{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.015562","as_of":"2025-01-06T00:00:00","forecast_date":"2025-01-13T00:00:00","payload":{"point_forecast":74.1661522589726,"quantiles":{"0.05":67.16285584426693,"0.1":68.60014799770993,"0.2":70.07461390989292,"0.3":71.71645443973048,"0.4":72.87936028459387,"0.5":74.1661522589726,"0.6":75.33855082421024,"0.7":76.62261505513705,"0.8":77.9826068683292,"0.9":79.5404247898506,"0.95":81.190774038603}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.015562","as_of":"2025-01-06T00:00:00","forecast_date":"2025-02-04T00:00:00","payload":{"point_forecast":74.47310552634595,"quantiles":{"0.05":59.34244641293798,"0.1":62.784001249359314,"0.2":66.55361568046081,"0.3":69.32540633752404,"0.4":71.74856896274466,"0.5":74.47310552634595,"0.6":76.77310336215626,"0.7":79.04429576633392,"0.8":82.08791653828567,"0.9":84.81454424122579,"0.95":88.58513788496417}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.052917","as_of":"2025-01-13T00:00:00","forecast_date":"2025-01-27T00:00:00","payload":{"point_forecast":76.03523784771988,"quantiles":{"0.05":65.54378070946629,"0.1":67.89199953226023,"0.2":70.59440702001471,"0.3":72.60191567176857,"0.4":74.24564652703188,"0.5":76.03523784771988,"0.6":77.59498637225583,"0.7":79.35891763632344,"0.8":81.66945578136686,"0.9":84.0922041896703,"0.95":87.03911441322256}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.052917","as_of":"2025-01-13T00:00:00","forecast_date":"2025-02-11T00:00:00","payload":{"point_forecast":76.77461343722493,"quantiles":{"0.05":62.573995122384446,"0.1":65.0434030979378,"0.2":68.9271052567605,"0.3":71.82984875414189,"0.4":74.6511431419417,"0.5":76.77461343722493,"0.6":78.61265936718986,"0.7":80.98789067339466,"0.8":84.11126065943135,"0.9":88.00499968176636,"0.95":90.94669326235302}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.090447","as_of":"2025-01-20T00:00:00","forecast_date":"2025-01-27T00:00:00","payload":{"point_forecast":78.18862302377354,"quantiles":{"0.05":70.98608858061331,"0.1":72.38660254452142,"0.2":74.28045677224804,"0.3":75.71473304808818,"0.4":77.01107747461008,"0.5":78.18862302377354,"0.6":79.1434334241743,"0.7":80.50785621183347,"0.8":81.87571178639547,"0.9":83.50988288048892,"0.95":84.8211683152528}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.090447","as_of":"2025-01-20T00:00:00","forecast_date":"2025-02-03T00:00:00","payload":{"point_forecast":77.75418491613605,"quantiles":{"0.05":68.11449649884412,"0.1":69.40301646420137,"0.2":72.15800957979974,"0.3":73.669299850678,"0.4":75.85775396103588,"0.5":77.75418491613605,"0.6":79.66011024918954,"0.7":81.0664261653459,"0.8":83.53907490700918,"0.9":86.44596897318817,"0.95":89.18316905789408}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.090447","as_of":"2025-01-20T00:00:00","forecast_date":"2025-02-18T00:00:00","payload":{"point_forecast":77.54306738675652,"quantiles":{"0.05":63.050193649446335,"0.1":65.55913483174612,"0.2":69.40397632757069,"0.3":72.74156739431432,"0.4":74.96887731482411,"0.5":77.54306738675652,"0.6":80.21608153435734,"0.7":82.66545046682498,"0.8":85.25879454070562,"0.9":89.39306458505865,"0.95":93.12450367751278}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.127798","as_of":"2025-01-27T00:00:00","forecast_date":"2025-02-03T00:00:00","payload":{"point_forecast":74.72110439911573,"quantiles":{"0.05":66.71250814006996,"0.1":69.2796817546158,"0.2":70.92319889594935,"0.3":72.36195451071356,"0.4":73.4774284712028,"0.5":74.72110439911573,"0.6":76.14364092835876,"0.7":77.05034140055213,"0.8":78.30250030010144,"0.9":80.57446434518691,"0.95":82.62028283515961}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.127798","as_of":"2025-01-27T00:00:00","forecast_date":"2025-02-10T00:00:00","payload":{"point_forecast":75.08799428467469,"quantiles":{"0.05":64.9898289002261,"0.1":67.11437927629947,"0.2":69.61525528268338,"0.3":71.48593391710865,"0.4":73.1260086056451,"0.5":75.08799428467469,"0.6":76.60483307911784,"0.7":78.21300275049539,"0.8":80.20318562537054,"0.9":82.31979602625871,"0.95":84.12339598665622}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.127798","as_of":"2025-01-27T00:00:00","forecast_date":"2025-02-25T00:00:00","payload":{"point_forecast":75.76939160005543,"quantiles":{"0.05":61.42067857223936,"0.1":64.13003978412249,"0.2":68.11674586035278,"0.3":70.6107108413265,"0.4":72.77544338738919,"0.5":75.76939160005543,"0.6":77.47895958567524,"0.7":79.8049483176847,"0.8":83.03095719828482,"0.9":86.91738657397205,"0.95":89.17198498582648}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.164829","as_of":"2025-02-03T00:00:00","forecast_date":"2025-02-10T00:00:00","payload":{"point_forecast":72.86452984914862,"quantiles":{"0.05":65.49915570076477,"0.1":67.26430056184199,"0.2":69.02584090057304,"0.3":70.34545265578555,"0.4":71.58431197979317,"0.5":72.86452984914862,"0.6":73.88470503341223,"0.7":74.85498525473226,"0.8":76.36853375873052,"0.9":77.87372176802917,"0.95":79.12197991496689}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.164829","as_of":"2025-02-03T00:00:00","forecast_date":"2025-03-04T00:00:00","payload":{"point_forecast":73.61869050666226,"quantiles":{"0.05":57.33638795412636,"0.1":60.15120713441179,"0.2":65.44358502733489,"0.3":68.46814202090557,"0.4":71.16472949171063,"0.5":73.61869050666226,"0.6":75.94095815298066,"0.7":77.56134601694932,"0.8":80.73466083458821,"0.9":84.25813731017837,"0.95":88.23674586790025}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.201346","as_of":"2025-02-10T00:00:00","forecast_date":"2025-02-24T00:00:00","payload":{"point_forecast":71.091956629576,"quantiles":{"0.05":60.75604836590092,"0.1":62.61196835791096,"0.2":65.58261401954414,"0.3":67.91670003156077,"0.4":69.40053120280403,"0.5":71.091956629576,"0.6":72.67370426028408,"0.7":74.04874334416199,"0.8":76.21401525661207,"0.9":78.31873194133219,"0.95":80.74425466695911}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.201346","as_of":"2025-02-10T00:00:00","forecast_date":"2025-03-11T00:00:00","payload":{"point_forecast":70.79025644252248,"quantiles":{"0.05":56.76295600248761,"0.1":59.85339566614456,"0.2":63.63501811588251,"0.3":66.2852774053866,"0.4":68.78561895386653,"0.5":70.79025644252248,"0.6":72.93774098304719,"0.7":75.2405707336712,"0.8":77.70030807794538,"0.9":82.11642843722873,"0.95":87.3789164246618}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.237308","as_of":"2025-02-17T00:00:00","forecast_date":"2025-02-24T00:00:00","payload":{"point_forecast":71.079336331306,"quantiles":{"0.05":63.78800882526367,"0.1":65.32675253934626,"0.2":67.06913321938207,"0.3":68.81774766990755,"0.4":70.07634013886495,"0.5":71.079336331306,"0.6":72.24558829863018,"0.7":73.38554646853162,"0.8":75.00117667720835,"0.9":76.62632730135252,"0.95":78.18556122159261}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.237308","as_of":"2025-02-17T00:00:00","forecast_date":"2025-03-03T00:00:00","payload":{"point_forecast":70.29698726194431,"quantiles":{"0.05":60.74405248953911,"0.1":63.06446032092341,"0.2":65.17587233643273,"0.3":67.00094404057906,"0.4":68.50744428215386,"0.5":70.29698726194431,"0.6":72.13989579981785,"0.7":73.57811888710656,"0.8":75.9824941052852,"0.9":78.63854497425908,"0.95":80.58309506362552}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.237308","as_of":"2025-02-17T00:00:00","forecast_date":"2025-03-18T00:00:00","payload":{"point_forecast":70.97246085505247,"quantiles":{"0.05":55.82130015839571,"0.1":59.55163360234687,"0.2":62.85882647657617,"0.3":66.06266525421562,"0.4":68.6418097226456,"0.5":70.97246085505247,"0.6":73.31628482166413,"0.7":75.51052078147963,"0.8":78.84816215472229,"0.9":82.40692225658117,"0.95":84.81236081220226}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.273464","as_of":"2025-02-24T00:00:00","forecast_date":"2025-03-03T00:00:00","payload":{"point_forecast":70.71414547029747,"quantiles":{"0.05":63.8463754567506,"0.1":65.32883917473647,"0.2":66.9383137131858,"0.3":68.31085262708118,"0.4":69.47937579740055,"0.5":70.71414547029747,"0.6":71.75552254251726,"0.7":72.70147632883402,"0.8":74.05058995222997,"0.9":75.51243395877664,"0.95":77.14028680920305}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.273464","as_of":"2025-02-24T00:00:00","forecast_date":"2025-03-10T00:00:00","payload":{"point_forecast":70.06279426627117,"quantiles":{"0.05":59.28086001024928,"0.1":62.21850802596504,"0.2":64.75326525192217,"0.3":66.84835804216435,"0.4":68.68083099265554,"0.5":70.06279426627117,"0.6":71.4641579535131,"0.7":73.17212841076991,"0.8":75.53487073892624,"0.9":78.05800693837342,"0.95":79.70706895321256}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.273464","as_of":"2025-02-24T00:00:00","forecast_date":"2025-03-25T00:00:00","payload":{"point_forecast":70.96061230357401,"quantiles":{"0.05":54.79798013423229,"0.1":58.44504325421701,"0.2":62.81683866287115,"0.3":65.77407326289664,"0.4":68.011431931604,"0.5":70.96061230357401,"0.6":73.05255376197759,"0.7":75.39192831637078,"0.8":78.53513679067585,"0.9":81.37208465138693,"0.95":85.27789838933343}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.309454","as_of":"2025-03-03T00:00:00","forecast_date":"2025-03-10T00:00:00","payload":{"point_forecast":69.51573706240735,"quantiles":{"0.05":62.602298350318385,"0.1":64.33775461635044,"0.2":66.08139720995732,"0.3":67.5217594019182,"0.4":68.52639528398265,"0.5":69.51573706240735,"0.6":70.71048378266593,"0.7":71.88712749668795,"0.8":73.66702190836112,"0.9":75.13443765850867,"0.95":76.56349944070374}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.309454","as_of":"2025-03-03T00:00:00","forecast_date":"2025-03-17T00:00:00","payload":{"point_forecast":69.57548362979485,"quantiles":{"0.05":59.80068565001224,"0.1":61.61736068362088,"0.2":64.4864475186693,"0.3":66.2466093329622,"0.4":68.22842972293513,"0.5":69.57548362979485,"0.6":71.77015318693212,"0.7":73.25495148076254,"0.8":75.47583436536686,"0.9":77.42391974069058,"0.95":80.59951884685017}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.309454","as_of":"2025-03-03T00:00:00","forecast_date":"2025-04-01T00:00:00","payload":{"point_forecast":70.2035869238139,"quantiles":{"0.05":55.023798791174656,"0.1":59.44153825330761,"0.2":62.74029892799443,"0.3":65.78683078082996,"0.4":68.16668577711954,"0.5":70.2035869238139,"0.6":72.4793573089762,"0.7":75.31144276871129,"0.8":78.03810550147762,"0.9":81.23724239534859,"0.95":85.40631048666766}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.350028","as_of":"2025-03-10T00:00:00","forecast_date":"2025-03-17T00:00:00","payload":{"point_forecast":66.90566795316843,"quantiles":{"0.05":60.43552070744905,"0.1":61.84245616903729,"0.2":63.39478267020813,"0.3":64.6981135676767,"0.4":65.8137863039808,"0.5":66.90566795316843,"0.6":67.80940545570797,"0.7":69.17307450011603,"0.8":70.55093461360637,"0.9":72.17327695198537,"0.95":73.55638026786082}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.350028","as_of":"2025-03-10T00:00:00","forecast_date":"2025-03-24T00:00:00","payload":{"point_forecast":66.80638051768628,"quantiles":{"0.05":56.82513638999975,"0.1":58.801517158616534,"0.2":61.14157841290674,"0.3":63.81142746997162,"0.4":65.29881899549058,"0.5":66.80638051768628,"0.6":68.36416995928002,"0.7":70.08234167848886,"0.8":71.8388194042144,"0.9":74.67588012414258,"0.95":77.43671010879147}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.350028","as_of":"2025-03-10T00:00:00","forecast_date":"2025-04-08T00:00:00","payload":{"point_forecast":67.3195642027693,"quantiles":{"0.05":53.044151662126154,"0.1":55.448818606661725,"0.2":59.086292965152175,"0.3":62.02259881774265,"0.4":64.55626264022753,"0.5":67.3195642027693,"0.6":69.34041089281641,"0.7":72.49332607810614,"0.8":75.25756748032443,"0.9":78.3064739350975,"0.95":82.01375950937413}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.386971","as_of":"2025-03-17T00:00:00","forecast_date":"2025-03-24T00:00:00","payload":{"point_forecast":66.64483862206276,"quantiles":{"0.05":59.850101929725966,"0.1":61.56322523904076,"0.2":62.94893006114485,"0.3":64.59729699058921,"0.4":65.6512852225223,"0.5":66.64483862206276,"0.6":68.23728067942608,"0.7":69.36744689014674,"0.8":70.8116514250823,"0.9":72.73596796752624,"0.95":74.04482813442374}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.386971","as_of":"2025-03-17T00:00:00","forecast_date":"2025-03-31T00:00:00","payload":{"point_forecast":67.25237524326084,"quantiles":{"0.05":57.486249269142725,"0.1":58.73128858218357,"0.2":62.00019414089394,"0.3":64.28235416812414,"0.4":65.84316896393177,"0.5":67.25237524326084,"0.6":68.92608972688564,"0.7":70.47115622833506,"0.8":72.82976390838132,"0.9":75.67646561582146,"0.95":76.98546841039406}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.386971","as_of":"2025-03-17T00:00:00","forecast_date":"2025-04-15T00:00:00","payload":{"point_forecast":66.96333322031556,"quantiles":{"0.05":53.59540871247286,"0.1":56.328847282330585,"0.2":59.25829875005627,"0.3":62.21614974494167,"0.4":64.76775100396257,"0.5":66.96333322031556,"0.6":68.97522878355463,"0.7":71.72069805550662,"0.8":74.46375409935509,"0.9":79.17122007547368,"0.95":81.89009394994783}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.422578","as_of":"2025-03-24T00:00:00","forecast_date":"2025-03-31T00:00:00","payload":{"point_forecast":68.56371568493682,"quantiles":{"0.05":61.74627201089714,"0.1":62.95760051987872,"0.2":64.85227233921977,"0.3":66.36476178767258,"0.4":67.47224700596927,"0.5":68.56371568493682,"0.6":69.7684872862179,"0.7":70.69908642296983,"0.8":71.999141939688,"0.9":73.6406269732877,"0.95":75.13934038807459}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.422578","as_of":"2025-03-24T00:00:00","forecast_date":"2025-04-07T00:00:00","payload":{"point_forecast":67.54826198984239,"quantiles":{"0.05":58.76633072154439,"0.1":60.408144954809494,"0.2":62.68837641310648,"0.3":64.49715210460165,"0.4":65.88646011281072,"0.5":67.54826198984239,"0.6":69.34889621697545,"0.7":71.12907290774915,"0.8":73.16962188080274,"0.9":75.37114344924127,"0.95":77.77849789096099}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.422578","as_of":"2025-03-24T00:00:00","forecast_date":"2025-04-22T00:00:00","payload":{"point_forecast":68.414777792405,"quantiles":{"0.05":53.490690217780624,"0.1":56.887031302418045,"0.2":60.33585876722434,"0.3":63.10109034715021,"0.4":66.3370260904747,"0.5":68.414777792405,"0.6":70.82294140938941,"0.7":72.86157908839606,"0.8":75.91874602673137,"0.9":79.48031803835535,"0.95":82.2231876054492}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.458345","as_of":"2025-03-31T00:00:00","forecast_date":"2025-04-07T00:00:00","payload":{"point_forecast":69.3591848324611,"quantiles":{"0.05":61.780298898296564,"0.1":63.27986071154485,"0.2":65.36822450173156,"0.3":66.95141125234812,"0.4":67.91167953718413,"0.5":69.3591848324611,"0.6":70.31218540833167,"0.7":71.5719773088643,"0.8":72.52885302848982,"0.9":74.9603992799292,"0.95":76.03347070972748}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.458345","as_of":"2025-03-31T00:00:00","forecast_date":"2025-04-14T00:00:00","payload":{"point_forecast":69.31692980390864,"quantiles":{"0.05":59.34550907086575,"0.1":61.48727065080813,"0.2":64.27705990778723,"0.3":66.2068080475986,"0.4":67.77043311143849,"0.5":69.31692980390864,"0.6":70.64029753069528,"0.7":72.24865684061281,"0.8":73.84695096560647,"0.9":77.45218882326839,"0.95":79.70023260779094}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.458345","as_of":"2025-03-31T00:00:00","forecast_date":"2025-04-29T00:00:00","payload":{"point_forecast":69.27561553077872,"quantiles":{"0.05":56.0723956559097,"0.1":58.94846783766386,"0.2":61.85869024954146,"0.3":64.40708754244575,"0.4":66.78520963228331,"0.5":69.27561553077872,"0.6":71.72050096205443,"0.7":74.18983188240553,"0.8":77.18229703915696,"0.9":80.24920653974283,"0.95":82.89975958124478}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.493856","as_of":"2025-04-07T00:00:00","forecast_date":"2025-04-14T00:00:00","payload":{"point_forecast":62.21154794568575,"quantiles":{"0.05":55.18634354951701,"0.1":56.56116379550858,"0.2":58.316453059301224,"0.3":59.79049640664565,"0.4":60.78998676224416,"0.5":62.21154794568575,"0.6":63.44664978999987,"0.7":64.57732402408058,"0.8":66.14128344689776,"0.9":67.41181125436557,"0.95":68.84083264326314}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.493856","as_of":"2025-04-07T00:00:00","forecast_date":"2025-04-21T00:00:00","payload":{"point_forecast":62.22315416548117,"quantiles":{"0.05":52.266158069484476,"0.1":54.417898178064846,"0.2":56.973813422452125,"0.3":58.64419574390682,"0.4":60.7645747979695,"0.5":62.22315416548117,"0.6":63.77999776223206,"0.7":64.9889107465779,"0.8":67.40320540734172,"0.9":69.67180161424919,"0.95":71.66995936092823}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.493856","as_of":"2025-04-07T00:00:00","forecast_date":"2025-05-06T00:00:00","payload":{"point_forecast":61.954828880058464,"quantiles":{"0.05":48.39652742778133,"0.1":51.268419115848374,"0.2":54.92893779613973,"0.3":57.17360953676775,"0.4":59.59718124074289,"0.5":61.954828880058464,"0.6":64.33425888466087,"0.7":66.5929281499132,"0.8":69.7608060010403,"0.9":73.4346972614239,"0.95":76.23938266264202}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.529960","as_of":"2025-04-14T00:00:00","forecast_date":"2025-04-21T00:00:00","payload":{"point_forecast":61.52311034250785,"quantiles":{"0.05":54.38104213739602,"0.1":56.003808799212955,"0.2":57.74749372003761,"0.3":59.290182514927956,"0.4":60.4533829972257,"0.5":61.52311034250785,"0.6":62.45430583415399,"0.7":63.55718748220126,"0.8":64.92927992537005,"0.9":66.75012757467097,"0.95":67.89567623339592}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.529960","as_of":"2025-04-14T00:00:00","forecast_date":"2025-04-28T00:00:00","payload":{"point_forecast":61.068022369777424,"quantiles":{"0.05":51.69581510139456,"0.1":53.900724367236776,"0.2":56.201086787273084,"0.3":58.05160858180455,"0.4":59.62783461118306,"0.5":61.068022369777424,"0.6":62.827609824048544,"0.7":64.54541250204632,"0.8":66.88323438693797,"0.9":69.15736854321358,"0.95":72.53969432613451}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.529960","as_of":"2025-04-14T00:00:00","forecast_date":"2025-05-13T00:00:00","payload":{"point_forecast":61.87062929314382,"quantiles":{"0.05":48.878968419555534,"0.1":51.446891294190934,"0.2":53.566149037847765,"0.3":56.7054684462243,"0.4":59.27430717731009,"0.5":61.87062929314382,"0.6":63.96621763573362,"0.7":66.37921436284478,"0.8":70.1075556676505,"0.9":72.5507456365578,"0.95":75.24012515283984}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.565681","as_of":"2025-04-21T00:00:00","forecast_date":"2025-04-28T00:00:00","payload":{"point_forecast":64.71987634407068,"quantiles":{"0.05":57.712543523299075,"0.1":59.121802858570824,"0.2":61.13383149547568,"0.3":62.43981352173074,"0.4":63.6983974959561,"0.5":64.71987634407068,"0.6":65.8377062054114,"0.7":66.78420937260063,"0.8":68.68569612613692,"0.9":70.28636197527139,"0.95":71.66471798713435}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.565681","as_of":"2025-04-21T00:00:00","forecast_date":"2025-05-05T00:00:00","payload":{"point_forecast":64.79906987767333,"quantiles":{"0.05":55.08585826442429,"0.1":57.37490780204896,"0.2":59.735246960586025,"0.3":61.47411765857742,"0.4":63.02978074359268,"0.5":64.79906987767333,"0.6":66.45598696806755,"0.7":68.3230826732314,"0.8":70.40408034586144,"0.9":72.94682795590758,"0.95":74.84657841378035}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.565681","as_of":"2025-04-21T00:00:00","forecast_date":"2025-05-20T00:00:00","payload":{"point_forecast":64.91730451129739,"quantiles":{"0.05":51.081062909170775,"0.1":54.40806847979423,"0.2":57.48470624608951,"0.3":60.263979437289215,"0.4":62.92020291231062,"0.5":64.91730451129739,"0.6":67.03796116056405,"0.7":69.49936996200977,"0.8":72.65112157601477,"0.9":75.87096631126681,"0.95":78.67379077751791}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.641391","as_of":"2025-04-28T00:00:00","forecast_date":"2025-05-05T00:00:00","payload":{"point_forecast":62.72979862961851,"quantiles":{"0.05":55.702398400071075,"0.1":57.32113778627019,"0.2":59.14845636652095,"0.3":60.58145825725499,"0.4":61.685258220683274,"0.5":62.72979862961851,"0.6":63.858813388537754,"0.7":64.85224649657712,"0.8":66.5415713508186,"0.9":68.21491015108153,"0.95":69.58398465053683}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.641391","as_of":"2025-04-28T00:00:00","forecast_date":"2025-05-12T00:00:00","payload":{"point_forecast":63.293044528996376,"quantiles":{"0.05":53.87024052373915,"0.1":55.563120545059576,"0.2":58.300532297856314,"0.3":60.05300945342398,"0.4":61.82877374716485,"0.5":63.293044528996376,"0.6":64.84692518529052,"0.7":66.51942422308635,"0.8":68.63698916476706,"0.9":70.91124951130479,"0.95":73.67247200985814}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.641391","as_of":"2025-04-28T00:00:00","forecast_date":"2025-05-27T00:00:00","payload":{"point_forecast":62.505730944551274,"quantiles":{"0.05":49.126617819035445,"0.1":51.60001024029547,"0.2":55.11876936378756,"0.3":58.64268565176281,"0.4":60.431034658428395,"0.5":62.505730944551274,"0.6":64.72325281239256,"0.7":67.0500988838273,"0.8":70.14309181954899,"0.9":74.14150711861389,"0.95":77.28846199987305}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.677126","as_of":"2025-05-05T00:00:00","forecast_date":"2025-05-12T00:00:00","payload":{"point_forecast":58.31161632284507,"quantiles":{"0.05":51.82724201638964,"0.1":53.45729311798357,"0.2":55.06369741489889,"0.3":56.30120233899865,"0.4":57.16933797695104,"0.5":58.31161632284507,"0.6":59.476788417074104,"0.7":60.57120186285336,"0.8":62.35716518761768,"0.9":63.945010607556505,"0.95":65.28325552454369}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.677126","as_of":"2025-05-05T00:00:00","forecast_date":"2025-05-19T00:00:00","payload":{"point_forecast":58.80501983612929,"quantiles":{"0.05":49.294180614742956,"0.1":51.21213898674031,"0.2":53.590156485636165,"0.3":55.34883488698704,"0.4":56.954330256697794,"0.5":58.80501983612929,"0.6":60.160342568812474,"0.7":61.587316865952964,"0.8":63.67176200626552,"0.9":66.60467104798421,"0.95":68.28092193183194}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.677126","as_of":"2025-05-05T00:00:00","forecast_date":"2025-06-03T00:00:00","payload":{"point_forecast":57.667729870716514,"quantiles":{"0.05":44.89456569005164,"0.1":47.842407487835416,"0.2":50.678606124169214,"0.3":52.873786494826426,"0.4":55.67498562238532,"0.5":57.667729870716514,"0.6":59.52806832151059,"0.7":61.9563007242384,"0.8":64.00790892417405,"0.9":68.95949107345184,"0.95":72.6505780595114}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.713896","as_of":"2025-05-12T00:00:00","forecast_date":"2025-05-19T00:00:00","payload":{"point_forecast":61.15065748879006,"quantiles":{"0.05":54.98868502415765,"0.1":56.06936824763784,"0.2":57.93286183144466,"0.3":58.94460463699164,"0.4":60.105076803313366,"0.5":61.15065748879006,"0.6":62.07434242808817,"0.7":63.122445804352054,"0.8":64.57079621813702,"0.9":66.75954212069347,"0.95":68.19448138505219}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.713896","as_of":"2025-05-12T00:00:00","forecast_date":"2025-06-10T00:00:00","payload":{"point_forecast":61.366457956961995,"quantiles":{"0.05":46.366635278477,"0.1":49.45511771232954,"0.2":52.8330079798879,"0.3":55.875860790075045,"0.4":58.57009341733111,"0.5":61.366457956961995,"0.6":63.833001134239915,"0.7":65.84159520142894,"0.8":68.24993749047867,"0.9":71.77359499480686,"0.95":75.93924175800983}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.750537","as_of":"2025-05-19T00:00:00","forecast_date":"2025-06-02T00:00:00","payload":{"point_forecast":62.11981176225422,"quantiles":{"0.05":52.389619903314994,"0.1":54.44347046941073,"0.2":57.1937441331696,"0.3":59.20826321800616,"0.4":60.50242724412688,"0.5":62.11981176225422,"0.6":64.37882029366108,"0.7":66.05433914469995,"0.8":68.38693732034999,"0.9":70.63987003484294,"0.95":72.93371492048207}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.750537","as_of":"2025-05-19T00:00:00","forecast_date":"2025-06-17T00:00:00","payload":{"point_forecast":61.68755272315515,"quantiles":{"0.05":47.61321326383379,"0.1":50.74614159969607,"0.2":54.31815792981121,"0.3":56.79662260411309,"0.4":59.041344993864286,"0.5":61.68755272315515,"0.6":63.87066930444557,"0.7":67.06228907337604,"0.8":70.10328567851738,"0.9":73.8932468131003,"0.95":78.26836777802409}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.787075","as_of":"2025-05-26T00:00:00","forecast_date":"2025-06-02T00:00:00","payload":{"point_forecast":61.98807112636308,"quantiles":{"0.05":54.9875805644785,"0.1":56.13742984496372,"0.2":57.798562672818065,"0.3":59.22627072287308,"0.4":60.68675719265987,"0.5":61.98807112636308,"0.6":63.08926252123794,"0.7":64.04058675764384,"0.8":65.56568820205314,"0.9":67.22638161333826,"0.95":68.80926042387911}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.787075","as_of":"2025-05-26T00:00:00","forecast_date":"2025-06-09T00:00:00","payload":{"point_forecast":61.38591138586695,"quantiles":{"0.05":51.67411686131192,"0.1":53.81691204716384,"0.2":56.00778479773879,"0.3":58.22171425621872,"0.4":59.74613644862434,"0.5":61.38591138586695,"0.6":62.81825024579748,"0.7":64.72036155478963,"0.8":66.87884981569646,"0.9":69.46850512099806,"0.95":72.22369385057145}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.787075","as_of":"2025-05-26T00:00:00","forecast_date":"2025-06-24T00:00:00","payload":{"point_forecast":61.091241554439904,"quantiles":{"0.05":47.65788517773074,"0.1":50.43517981916137,"0.2":54.41387945566104,"0.3":56.93811734080073,"0.4":58.87213086352233,"0.5":61.091241554439904,"0.6":63.65274869488918,"0.7":65.54129145085953,"0.8":69.09433791096254,"0.9":73.13457410794442,"0.95":75.15721309173682}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.824774","as_of":"2025-06-02T00:00:00","forecast_date":"2025-06-09T00:00:00","payload":{"point_forecast":60.66471175407206,"quantiles":{"0.05":53.94372766549223,"0.1":55.20710897801151,"0.2":57.07995784973285,"0.3":58.41517902070738,"0.4":59.51016075707526,"0.5":60.66471175407206,"0.6":61.73631640856649,"0.7":62.64242413567758,"0.8":64.05042252870979,"0.9":66.26794262045814,"0.95":67.69095446199034}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.824774","as_of":"2025-06-02T00:00:00","forecast_date":"2025-06-16T00:00:00","payload":{"point_forecast":60.57455552997307,"quantiles":{"0.05":51.643818363825005,"0.1":53.54471440749074,"0.2":55.75335535806142,"0.3":57.5220108224953,"0.4":59.069421247613334,"0.5":60.57455552997307,"0.6":62.55705559666917,"0.7":64.04664639779594,"0.8":65.77532211699136,"0.9":68.85030012875123,"0.95":70.80607121240153}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.824774","as_of":"2025-06-02T00:00:00","forecast_date":"2025-07-01T00:00:00","payload":{"point_forecast":60.57163034831626,"quantiles":{"0.05":45.996921513020254,"0.1":48.54111074627493,"0.2":51.86886309729595,"0.3":55.053275383602234,"0.4":57.55827558124615,"0.5":60.57163034831626,"0.6":63.14009760378816,"0.7":65.55235765079891,"0.8":68.14981316745202,"0.9":73.2658046340487,"0.95":77.11762569579952}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.862492","as_of":"2025-06-09T00:00:00","forecast_date":"2025-06-16T00:00:00","payload":{"point_forecast":64.6371002397618,"quantiles":{"0.05":57.84960019702711,"0.1":58.937559115293034,"0.2":60.82091169021206,"0.3":62.228833626013255,"0.4":63.42002115062383,"0.5":64.6371002397618,"0.6":65.65519871268485,"0.7":66.72160986451446,"0.8":68.46200336593066,"0.9":70.44470999651723,"0.95":72.32817036097518}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.862492","as_of":"2025-06-09T00:00:00","forecast_date":"2025-06-23T00:00:00","payload":{"point_forecast":64.6773580050924,"quantiles":{"0.05":53.75769697803745,"0.1":56.93966810127041,"0.2":59.340369550658856,"0.3":61.41101621518208,"0.4":62.86114760947972,"0.5":64.6773580050924,"0.6":66.2763967817339,"0.7":67.85889653834997,"0.8":69.63545421879881,"0.9":72.09644994539626,"0.95":74.96443034849204}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.862492","as_of":"2025-06-09T00:00:00","forecast_date":"2025-07-08T00:00:00","payload":{"point_forecast":64.94599239873651,"quantiles":{"0.05":49.840772846069825,"0.1":53.45172172077322,"0.2":56.288969106202174,"0.3":59.70740628467077,"0.4":62.609459220196584,"0.5":64.94599239873651,"0.6":67.4106985890972,"0.7":69.87328622536145,"0.8":72.83297376924972,"0.9":75.48972987467265,"0.95":78.69297227692148}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.900881","as_of":"2025-06-16T00:00:00","forecast_date":"2025-06-23T00:00:00","payload":{"point_forecast":73.26377822447805,"quantiles":{"0.05":65.99286794759952,"0.1":67.70468441831778,"0.2":69.26972400858264,"0.3":70.8997662855057,"0.4":72.28891385680454,"0.5":73.26377822447805,"0.6":74.24151608277097,"0.7":75.22023386820725,"0.8":76.50482962102392,"0.9":78.30390486538562,"0.95":79.454986636454}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.900881","as_of":"2025-06-16T00:00:00","forecast_date":"2025-06-30T00:00:00","payload":{"point_forecast":73.59863167357233,"quantiles":{"0.05":63.27447387949303,"0.1":65.1944535587463,"0.2":67.91179557801689,"0.3":70.32845571443704,"0.4":71.70679206946761,"0.5":73.59863167357233,"0.6":75.0877521823497,"0.7":76.78949727832963,"0.8":78.97559906953231,"0.9":80.69568804415388,"0.95":82.56021303747923}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.900881","as_of":"2025-06-16T00:00:00","forecast_date":"2025-07-15T00:00:00","payload":{"point_forecast":73.66161817214257,"quantiles":{"0.05":57.832615270194076,"0.1":61.603388739072564,"0.2":65.50756970955102,"0.3":68.61160412015116,"0.4":71.14285425404007,"0.5":73.66161817214257,"0.6":75.46124999420715,"0.7":77.67733295745192,"0.8":81.05287404868892,"0.9":84.09229183799847,"0.95":87.04632951758308}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.937657","as_of":"2025-06-23T00:00:00","forecast_date":"2025-06-30T00:00:00","payload":{"point_forecast":75.17300457752899,"quantiles":{"0.05":67.89972829640332,"0.1":69.76326812833946,"0.2":71.81396099748183,"0.3":73.05420082658723,"0.4":74.11573457806529,"0.5":75.17300457752899,"0.6":76.2220888385087,"0.7":77.26742575649222,"0.8":78.66880828880389,"0.9":80.37243117001077,"0.95":81.72296645185979}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.937657","as_of":"2025-06-23T00:00:00","forecast_date":"2025-07-07T00:00:00","payload":{"point_forecast":74.8691595353722,"quantiles":{"0.05":64.66517584470759,"0.1":67.01891964523436,"0.2":69.9665801351711,"0.3":71.84265571786509,"0.4":73.23632184440166,"0.5":74.8691595353722,"0.6":76.31392211121016,"0.7":77.94194484164406,"0.8":79.81735881969676,"0.9":82.36290612390373,"0.95":84.65637185876083}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.937657","as_of":"2025-06-23T00:00:00","forecast_date":"2025-07-22T00:00:00","payload":{"point_forecast":74.80104847774004,"quantiles":{"0.05":60.352680189489234,"0.1":63.4479890080179,"0.2":67.56817867996288,"0.3":70.30025583089042,"0.4":72.54081413826917,"0.5":74.80104847774004,"0.6":77.07684673822041,"0.7":79.08420758756012,"0.8":82.17196954670013,"0.9":86.24944248132503,"0.95":88.8842333722468}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.974172","as_of":"2025-06-30T00:00:00","forecast_date":"2025-07-07T00:00:00","payload":{"point_forecast":65.7547750916916,"quantiles":{"0.05":59.04807644589783,"0.1":60.397868131787085,"0.2":62.03175907319525,"0.3":63.54500045424085,"0.4":64.50700756708275,"0.5":65.7547750916916,"0.6":66.62377307497182,"0.7":67.78312321902834,"0.8":69.16389434335868,"0.9":71.0938138068088,"0.95":72.62359175847901}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.974172","as_of":"2025-06-30T00:00:00","forecast_date":"2025-07-14T00:00:00","payload":{"point_forecast":64.83245538043727,"quantiles":{"0.05":55.96754125098325,"0.1":58.14150930350155,"0.2":60.16335727647871,"0.3":62.22886911043385,"0.4":63.482073741542294,"0.5":64.83245538043727,"0.6":66.6026111676416,"0.7":67.91449901061311,"0.8":70.30640422421241,"0.9":72.80081971425358,"0.95":74.85301421207143}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.974172","as_of":"2025-06-30T00:00:00","forecast_date":"2025-07-29T00:00:00","payload":{"point_forecast":65.22226786468507,"quantiles":{"0.05":51.48544954467653,"0.1":54.233662115844886,"0.2":57.64974824567858,"0.3":60.17662830950945,"0.4":63.115214575525854,"0.5":65.22226786468507,"0.6":67.17025669814825,"0.7":69.50917001392179,"0.8":72.44094480736726,"0.9":75.82965906289155,"0.95":79.1856598497618}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.011378","as_of":"2025-07-07T00:00:00","forecast_date":"2025-07-14T00:00:00","payload":{"point_forecast":66.44818898666114,"quantiles":{"0.05":58.580340844702,"0.1":60.45883740922171,"0.2":62.647434379648836,"0.3":64.09862020862614,"0.4":65.54541567866428,"0.5":66.44818898666114,"0.6":67.64541139307353,"0.7":68.61889705956638,"0.8":69.62189090579739,"0.9":71.84394162022876,"0.95":73.40616016865464}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.011378","as_of":"2025-07-07T00:00:00","forecast_date":"2025-07-21T00:00:00","payload":{"point_forecast":66.93256873749502,"quantiles":{"0.05":56.91473970051225,"0.1":58.69789922941635,"0.2":61.22821081352949,"0.3":63.34727245577003,"0.4":65.36134325729888,"0.5":66.93256873749502,"0.6":68.29583842180112,"0.7":69.98993348700725,"0.8":72.30484967095067,"0.9":74.81145829371972,"0.95":77.6994664825163}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.011378","as_of":"2025-07-07T00:00:00","forecast_date":"2025-08-05T00:00:00","payload":{"point_forecast":66.76924614892272,"quantiles":{"0.05":51.55166005553985,"0.1":54.89501414391625,"0.2":58.41836899585689,"0.3":61.40398723528655,"0.4":64.09670598090597,"0.5":66.76924614892272,"0.6":68.64794182533032,"0.7":71.2097322819558,"0.8":74.21704416874068,"0.9":77.99272358096701,"0.95":83.56402642590187}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.048215","as_of":"2025-07-14T00:00:00","forecast_date":"2025-07-21T00:00:00","payload":{"point_forecast":68.63992277369164,"quantiles":{"0.05":61.78323231744696,"0.1":63.48978024354282,"0.2":65.42483879313733,"0.3":66.80870617769703,"0.4":67.66960554398393,"0.5":68.63992277369164,"0.6":69.58487388099513,"0.7":70.70511383685711,"0.8":72.43033822104795,"0.9":73.8867870683892,"0.95":74.94754290547226}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.048215","as_of":"2025-07-14T00:00:00","forecast_date":"2025-07-28T00:00:00","payload":{"point_forecast":68.7671490843907,"quantiles":{"0.05":58.10586694514443,"0.1":60.02604988439252,"0.2":62.46824435938506,"0.3":64.8892608714224,"0.4":66.96093492707948,"0.5":68.7671490843907,"0.6":70.90830181955559,"0.7":72.1684394685746,"0.8":74.0952966615533,"0.9":76.1708384915114,"0.95":77.52340120050299}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.048215","as_of":"2025-07-14T00:00:00","forecast_date":"2025-08-12T00:00:00","payload":{"point_forecast":69.02752576716813,"quantiles":{"0.05":52.84758587807434,"0.1":57.884526184743045,"0.2":61.5343137087113,"0.3":64.33025585512404,"0.4":66.48709936431565,"0.5":69.02752576716813,"0.6":71.45514604856062,"0.7":73.0803941417533,"0.8":75.47004873856868,"0.9":79.08234753378365,"0.95":81.72151457607039}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.085555","as_of":"2025-07-21T00:00:00","forecast_date":"2025-07-28T00:00:00","payload":{"point_forecast":67.2982175590702,"quantiles":{"0.05":59.997839284753084,"0.1":61.65206857475341,"0.2":63.30929617128935,"0.3":64.98317456827242,"0.4":66.13048766075224,"0.5":67.2982175590702,"0.6":68.71805762853643,"0.7":69.81662246312004,"0.8":71.49996766570183,"0.9":72.90769381735649,"0.95":74.74549597038413}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.085555","as_of":"2025-07-21T00:00:00","forecast_date":"2025-08-04T00:00:00","payload":{"point_forecast":67.25181395839695,"quantiles":{"0.05":56.179605202988206,"0.1":59.36530454123594,"0.2":62.004234406889765,"0.3":64.090442460192,"0.4":65.35790177272825,"0.5":67.25181395839695,"0.6":69.09097116491557,"0.7":70.75650159915867,"0.8":73.15829969849801,"0.9":75.29157729381012,"0.95":78.30141595321243}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.085555","as_of":"2025-07-21T00:00:00","forecast_date":"2025-08-19T00:00:00","payload":{"point_forecast":67.33095415702851,"quantiles":{"0.05":54.225424855932694,"0.1":57.08742939442974,"0.2":60.54109171329202,"0.3":62.96853240245304,"0.4":65.10954772469158,"0.5":67.33095415702851,"0.6":69.59397941743737,"0.7":72.01820220188824,"0.8":75.85597320268857,"0.9":78.67822288047985,"0.95":80.88313148845282}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.122296","as_of":"2025-07-28T00:00:00","forecast_date":"2025-08-04T00:00:00","payload":{"point_forecast":65.06396014322416,"quantiles":{"0.05":58.309149393068125,"0.1":59.66634630670148,"0.2":61.20028526386153,"0.3":62.64389053644349,"0.4":63.94983715416106,"0.5":65.06396014322416,"0.6":66.17644671590826,"0.7":67.23237301194021,"0.8":68.76931134839003,"0.9":70.95998143788583,"0.95":72.02245474163966}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.122296","as_of":"2025-07-28T00:00:00","forecast_date":"2025-08-11T00:00:00","payload":{"point_forecast":65.06803908684023,"quantiles":{"0.05":55.806386581424405,"0.1":57.73900930996799,"0.2":59.90123787767409,"0.3":61.58019660382878,"0.4":63.39999302808002,"0.5":65.06803908684023,"0.6":66.9192609635448,"0.7":68.4291418231225,"0.8":69.95107955261496,"0.9":71.76337202136929,"0.95":73.84107531153744}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.122296","as_of":"2025-07-28T00:00:00","forecast_date":"2025-08-26T00:00:00","payload":{"point_forecast":64.8263381781639,"quantiles":{"0.05":51.41541438308386,"0.1":54.22570212466906,"0.2":57.55389108707654,"0.3":60.214341067941085,"0.4":61.975212992846274,"0.5":64.8263381781639,"0.6":67.36408564500942,"0.7":70.03433229759514,"0.8":73.15878070937269,"0.9":76.3379279282605,"0.95":78.8834712767483}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.158773","as_of":"2025-08-04T00:00:00","forecast_date":"2025-08-11T00:00:00","payload":{"point_forecast":67.45220172643276,"quantiles":{"0.05":59.68496148151029,"0.1":61.766420310697065,"0.2":63.91358417351179,"0.3":65.20594168836901,"0.4":66.34071771280512,"0.5":67.45220172643276,"0.6":68.49889622183784,"0.7":69.5368663311368,"0.8":70.97399486731774,"0.9":72.6563025990657,"0.95":74.15407916876991}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.158773","as_of":"2025-08-04T00:00:00","forecast_date":"2025-08-18T00:00:00","payload":{"point_forecast":67.53247702565103,"quantiles":{"0.05":56.242094718032114,"0.1":58.93753359786791,"0.2":62.18948605330926,"0.3":64.35832511063802,"0.4":65.86910392618269,"0.5":67.53247702565103,"0.6":69.09016740611666,"0.7":70.87946368099921,"0.8":72.68389990188741,"0.9":74.76796297057551,"0.95":77.01084176479053}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.158773","as_of":"2025-08-04T00:00:00","forecast_date":"2025-09-02T00:00:00","payload":{"point_forecast":67.15678612361818,"quantiles":{"0.05":53.104183086164205,"0.1":56.327954836141785,"0.2":60.2652334473431,"0.3":62.63174991247651,"0.4":64.68870964123255,"0.5":67.15678612361818,"0.6":69.52653882902337,"0.7":72.12551401418536,"0.8":75.51050408334706,"0.9":79.23525531541539,"0.95":82.07670360321961}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.195219","as_of":"2025-08-11T00:00:00","forecast_date":"2025-08-18T00:00:00","payload":{"point_forecast":63.861044265150156,"quantiles":{"0.05":56.5892432183263,"0.1":58.40573265899781,"0.2":60.19352829317507,"0.3":61.74632684375629,"0.4":62.512325771210534,"0.5":63.861044265150156,"0.6":64.76833352101644,"0.7":66.02358859465659,"0.8":67.51023050696213,"0.9":69.46343520233735,"0.95":70.38663592884144}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.195219","as_of":"2025-08-11T00:00:00","forecast_date":"2025-08-25T00:00:00","payload":{"point_forecast":63.78276848511955,"quantiles":{"0.05":52.58315617887367,"0.1":55.55592919624658,"0.2":58.157050996683616,"0.3":60.145355381999515,"0.4":62.016894032011706,"0.5":63.78276848511955,"0.6":65.68640755414675,"0.7":67.20291159185577,"0.8":69.07009045601943,"0.9":72.11039510221394,"0.95":75.30233127814246}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.195219","as_of":"2025-08-11T00:00:00","forecast_date":"2025-09-09T00:00:00","payload":{"point_forecast":63.62631120075858,"quantiles":{"0.05":49.11446946259364,"0.1":52.53932945999558,"0.2":56.95350644593195,"0.3":59.62162513520438,"0.4":62.21875565076915,"0.5":63.62631120075858,"0.6":66.38405047402198,"0.7":68.93086295299942,"0.8":72.00757334977088,"0.9":75.38440410172653,"0.95":77.93658582176482}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.232069","as_of":"2025-08-18T00:00:00","forecast_date":"2025-08-25T00:00:00","payload":{"point_forecast":62.66288390415383,"quantiles":{"0.05":55.816827783063545,"0.1":57.6733508937379,"0.2":59.29768189427421,"0.3":60.40696772881973,"0.4":61.52873055678874,"0.5":62.66288390415383,"0.6":63.60698832329353,"0.7":64.81897018951969,"0.8":66.35918310782519,"0.9":68.12151348433477,"0.95":69.54792731078035}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.232069","as_of":"2025-08-18T00:00:00","forecast_date":"2025-09-16T00:00:00","payload":{"point_forecast":62.51267584571779,"quantiles":{"0.05":48.68435088108201,"0.1":51.27365331535361,"0.2":54.76499909769026,"0.3":58.15093828027979,"0.4":60.21985516907881,"0.5":62.51267584571779,"0.6":65.51413649921541,"0.7":67.22201197143131,"0.8":70.43180943752058,"0.9":74.05254308862315,"0.95":77.14117255762106}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.269376","as_of":"2025-08-25T00:00:00","forecast_date":"2025-09-08T00:00:00","payload":{"point_forecast":63.51610021751887,"quantiles":{"0.05":54.28889825385314,"0.1":55.93910053150722,"0.2":58.46437304554443,"0.3":60.328629121899304,"0.4":62.014472395481015,"0.5":63.51610021751887,"0.6":64.9806686658286,"0.7":66.58402710897018,"0.8":68.5947729526141,"0.9":71.87687845287256,"0.95":74.77263806963194}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.269376","as_of":"2025-08-25T00:00:00","forecast_date":"2025-09-23T00:00:00","payload":{"point_forecast":62.94400044455489,"quantiles":{"0.05":47.41738377245813,"0.1":51.22309796079071,"0.2":55.215461017693166,"0.3":58.28960884543948,"0.4":60.78999178076116,"0.5":62.94400044455489,"0.6":65.49004461226733,"0.7":67.65062207019832,"0.8":69.84482264626031,"0.9":73.99365932723872,"0.95":76.91451907599084}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.306732","as_of":"2025-09-01T00:00:00","forecast_date":"2025-09-08T00:00:00","payload":{"point_forecast":64.2233248495199,"quantiles":{"0.05":56.68735159160959,"0.1":58.67297531032016,"0.2":60.92076584752751,"0.3":62.25035832492945,"0.4":63.30042066423976,"0.5":64.2233248495199,"0.6":65.1220650393619,"0.7":65.99313504081456,"0.8":67.45280445480171,"0.9":69.18348757385975,"0.95":70.53975801879878}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.306732","as_of":"2025-09-01T00:00:00","forecast_date":"2025-09-15T00:00:00","payload":{"point_forecast":64.0163591480717,"quantiles":{"0.05":54.46964950980343,"0.1":56.234454683083456,"0.2":58.603229581087966,"0.3":60.671472332230785,"0.4":62.257734815404014,"0.5":64.0163591480717,"0.6":66.00794716819357,"0.7":67.30608594050692,"0.8":68.89375013142093,"0.9":71.36225765388608,"0.95":73.4130575212308}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.306732","as_of":"2025-09-01T00:00:00","forecast_date":"2025-09-30T00:00:00","payload":{"point_forecast":63.79359610596843,"quantiles":{"0.05":49.06514597622246,"0.1":52.21335531462145,"0.2":56.635358189330724,"0.3":59.27149721666101,"0.4":61.65980831447243,"0.5":63.79359610596843,"0.6":66.47681239771812,"0.7":69.10781371602727,"0.8":71.70063315408089,"0.9":74.97739470104295,"0.95":78.24176793295238}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.343675","as_of":"2025-09-08T00:00:00","forecast_date":"2025-09-15T00:00:00","payload":{"point_forecast":61.609078629176295,"quantiles":{"0.05":55.14416046632252,"0.1":56.41132289650029,"0.2":58.094681036398896,"0.3":59.32068700621303,"0.4":60.28725757063681,"0.5":61.609078629176295,"0.6":63.05802365496884,"0.7":64.24376711942851,"0.8":65.71320392621314,"0.9":67.49096579601958,"0.95":69.3343504700638}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.343675","as_of":"2025-09-08T00:00:00","forecast_date":"2025-09-22T00:00:00","payload":{"point_forecast":61.86140055728127,"quantiles":{"0.05":50.52950082090016,"0.1":54.032878017849654,"0.2":56.46127612000976,"0.3":58.351106240106766,"0.4":59.99236995379495,"0.5":61.86140055728127,"0.6":63.48691711149231,"0.7":64.85699213212331,"0.8":66.53611684500235,"0.9":69.33880585698294,"0.95":71.64125451009929}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.343675","as_of":"2025-09-08T00:00:00","forecast_date":"2025-10-07T00:00:00","payload":{"point_forecast":62.45719229474905,"quantiles":{"0.05":48.1055417203344,"0.1":51.853176339989076,"0.2":55.54629285028219,"0.3":57.878723902504284,"0.4":59.877268232588555,"0.5":62.45719229474905,"0.6":64.41432319575529,"0.7":66.84703932763325,"0.8":69.18089354175653,"0.9":72.10382784278048,"0.95":75.81462094480815}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.380400","as_of":"2025-09-15T00:00:00","forecast_date":"2025-09-22T00:00:00","payload":{"point_forecast":62.49880112126475,"quantiles":{"0.05":56.08930639296613,"0.1":57.34820772774647,"0.2":58.89801149313099,"0.3":60.24335853742699,"0.4":61.303428835069035,"0.5":62.49880112126475,"0.6":63.64776539472213,"0.7":64.6331988095092,"0.8":65.99515546236609,"0.9":67.70879337044109,"0.95":69.24224761880599}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.380400","as_of":"2025-09-15T00:00:00","forecast_date":"2025-09-29T00:00:00","payload":{"point_forecast":62.42301070024675,"quantiles":{"0.05":53.03827561838033,"0.1":55.23063069435691,"0.2":57.548459538527105,"0.3":59.61121840926782,"0.4":60.781181311483266,"0.5":62.42301070024675,"0.6":64.05331086709865,"0.7":65.58881479097569,"0.8":67.6942468079193,"0.9":70.0193756016162,"0.95":72.27305842550935}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.380400","as_of":"2025-09-15T00:00:00","forecast_date":"2025-10-14T00:00:00","payload":{"point_forecast":63.45316000700699,"quantiles":{"0.05":48.1570311650626,"0.1":51.63666705044304,"0.2":55.30305307147789,"0.3":58.47941678110724,"0.4":61.06730480200687,"0.5":63.45316000700699,"0.6":65.46511766878757,"0.7":67.3790271005977,"0.8":70.26151188446248,"0.9":73.56939988203615,"0.95":75.94967934446699}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.417116","as_of":"2025-09-22T00:00:00","forecast_date":"2025-09-29T00:00:00","payload":{"point_forecast":62.731058090408254,"quantiles":{"0.05":55.24903636897334,"0.1":57.227329994624085,"0.2":58.631498453911064,"0.3":60.198343245534836,"0.4":61.49390132998157,"0.5":62.731058090408254,"0.6":63.76465942682938,"0.7":64.74831234931473,"0.8":66.13500115541542,"0.9":68.25311436721489,"0.95":69.52833447255516}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.417116","as_of":"2025-09-22T00:00:00","forecast_date":"2025-10-06T00:00:00","payload":{"point_forecast":62.738725746745075,"quantiles":{"0.05":52.41381336570663,"0.1":54.55247364417292,"0.2":56.959746071897875,"0.3":58.85532502956241,"0.4":60.78351679222973,"0.5":62.738725746745075,"0.6":64.36449256543567,"0.7":65.97676307431719,"0.8":67.96061938989057,"0.9":70.87476001619044,"0.95":72.70223248502867}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.417116","as_of":"2025-09-22T00:00:00","forecast_date":"2025-10-21T00:00:00","payload":{"point_forecast":62.308119306843835,"quantiles":{"0.05":47.186099715837415,"0.1":51.39827794415509,"0.2":54.90607468349641,"0.3":57.47781624127801,"0.4":60.142802923664554,"0.5":62.308119306843835,"0.6":64.56327806980485,"0.7":67.20407415215216,"0.8":70.49191085409154,"0.9":73.62035326027731,"0.95":77.41173119258087}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.452873","as_of":"2025-09-29T00:00:00","forecast_date":"2025-10-06T00:00:00","payload":{"point_forecast":65.1721843790198,"quantiles":{"0.05":57.02734936136384,"0.1":59.69948731320884,"0.2":61.397703519133216,"0.3":62.790841806657255,"0.4":63.91093868014435,"0.5":65.1721843790198,"0.6":66.54332831495078,"0.7":67.78840332995614,"0.8":69.12101654956672,"0.9":70.94952973239458,"0.95":72.78856942945154}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.452873","as_of":"2025-09-29T00:00:00","forecast_date":"2025-10-13T00:00:00","payload":{"point_forecast":65.8972000770163,"quantiles":{"0.05":56.673806259381365,"0.1":58.66657846323779,"0.2":61.23291620231374,"0.3":63.08024614613575,"0.4":64.39909207122061,"0.5":65.8972000770163,"0.6":67.71846101712318,"0.7":69.46481070547351,"0.8":71.57371101679841,"0.9":74.112561228341,"0.95":77.48263628655683}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.452873","as_of":"2025-09-29T00:00:00","forecast_date":"2025-10-28T00:00:00","payload":{"point_forecast":65.31430729477464,"quantiles":{"0.05":48.57645513068685,"0.1":53.49539942881438,"0.2":58.107893021530536,"0.3":61.255638969351246,"0.4":63.320726888142715,"0.5":65.31430729477464,"0.6":68.03620255876211,"0.7":70.84350790905638,"0.8":73.87248225483735,"0.9":77.71676698423975,"0.95":79.33672311053542}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.488963","as_of":"2025-10-06T00:00:00","forecast_date":"2025-10-13T00:00:00","payload":{"point_forecast":61.31680490902265,"quantiles":{"0.05":54.060459469792235,"0.1":55.67926966199758,"0.2":57.18342206167782,"0.3":58.79827639375215,"0.4":59.984673389192025,"0.5":61.31680490902265,"0.6":62.296343170570324,"0.7":63.569909159683256,"0.8":64.74065584510646,"0.9":66.10016455840807,"0.95":67.97603773539726}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.488963","as_of":"2025-10-06T00:00:00","forecast_date":"2025-10-20T00:00:00","payload":{"point_forecast":60.8249150627762,"quantiles":{"0.05":51.1524744967769,"0.1":53.228642322645555,"0.2":55.43161206867745,"0.3":57.55645489765682,"0.4":59.38521730742524,"0.5":60.8249150627762,"0.6":62.496513751475284,"0.7":64.27493561054605,"0.8":66.45446195514934,"0.9":69.35408361104615,"0.95":71.68367866734988}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.488963","as_of":"2025-10-06T00:00:00","forecast_date":"2025-11-04T00:00:00","payload":{"point_forecast":61.372250612525725,"quantiles":{"0.05":47.52276048379804,"0.1":50.18258697672593,"0.2":53.83836477633907,"0.3":56.954743773958164,"0.4":59.38778444446891,"0.5":61.372250612525725,"0.6":63.22953877112251,"0.7":65.33133577068475,"0.8":68.33216525182735,"0.9":71.555642146815,"0.95":75.17716237932814}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.525409","as_of":"2025-10-13T00:00:00","forecast_date":"2025-10-20T00:00:00","payload":{"point_forecast":59.09514755247197,"quantiles":{"0.05":52.03333351991812,"0.1":52.943238407867774,"0.2":55.021044589169165,"0.3":56.57829904170278,"0.4":57.8295762675939,"0.5":59.09514755247197,"0.6":60.203872713448874,"0.7":61.11646839098547,"0.8":62.71194355500136,"0.9":64.2423001443887,"0.95":65.68016368249316}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.525409","as_of":"2025-10-13T00:00:00","forecast_date":"2025-10-27T00:00:00","payload":{"point_forecast":58.784412878141865,"quantiles":{"0.05":48.25690606401172,"0.1":51.04625662618699,"0.2":53.40785845758442,"0.3":55.27730496055346,"0.4":57.09857749115983,"0.5":58.784412878141865,"0.6":60.45554271497663,"0.7":62.15985226583446,"0.8":64.36252139196472,"0.9":66.82434068894842,"0.95":69.55260488049508}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.525409","as_of":"2025-10-13T00:00:00","forecast_date":"2025-11-11T00:00:00","payload":{"point_forecast":58.60366773291503,"quantiles":{"0.05":44.01161901748328,"0.1":48.0618032037203,"0.2":51.493082911912644,"0.3":54.49059167756522,"0.4":56.575785415008106,"0.5":58.60366773291503,"0.6":60.60203264900459,"0.7":62.66215421158794,"0.8":65.10530552882655,"0.9":68.71931627869198,"0.95":71.86379027166134}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.561460","as_of":"2025-10-20T00:00:00","forecast_date":"2025-10-27T00:00:00","payload":{"point_forecast":57.65382262476332,"quantiles":{"0.05":51.5120530260177,"0.1":52.58520519552495,"0.2":54.42253893393565,"0.3":55.64806296884075,"0.4":56.61183572523716,"0.5":57.65382262476332,"0.6":58.62517595876249,"0.7":59.68772733810354,"0.8":61.10312373043642,"0.9":63.172573390530516,"0.95":64.35649059126577}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.561460","as_of":"2025-10-20T00:00:00","forecast_date":"2025-11-03T00:00:00","payload":{"point_forecast":57.75038095500746,"quantiles":{"0.05":46.8980421711304,"0.1":49.34664993957199,"0.2":51.723802111676925,"0.3":54.05437953887037,"0.4":56.04287553660859,"0.5":57.75038095500746,"0.6":59.0994284934686,"0.7":60.947135074517405,"0.8":62.835114445341304,"0.9":64.87882943418865,"0.95":68.59080554815674}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.561460","as_of":"2025-10-20T00:00:00","forecast_date":"2025-11-18T00:00:00","payload":{"point_forecast":57.94324073625181,"quantiles":{"0.05":44.28774616328778,"0.1":47.39827891505581,"0.2":51.20233290555772,"0.3":53.69515900742394,"0.4":55.54944984346764,"0.5":57.94324073625181,"0.6":59.831749161526176,"0.7":62.104770581874284,"0.8":65.28299962094921,"0.9":67.97364880664917,"0.95":70.70949212322743}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.598379","as_of":"2025-10-27T00:00:00","forecast_date":"2025-11-03T00:00:00","payload":{"point_forecast":61.87704601450989,"quantiles":{"0.05":54.604179938582725,"0.1":55.99875027521574,"0.2":57.34197268822477,"0.3":59.16687685693856,"0.4":60.53383362116467,"0.5":61.87704601450989,"0.6":62.910101836643165,"0.7":63.966468153836395,"0.8":65.44978004151137,"0.9":66.7144429321575,"0.95":68.3292294341153}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.598379","as_of":"2025-10-27T00:00:00","forecast_date":"2025-11-10T00:00:00","payload":{"point_forecast":61.13379789126919,"quantiles":{"0.05":51.38247412465876,"0.1":53.927402841533926,"0.2":56.384829141095096,"0.3":58.12089085237822,"0.4":59.58262730387091,"0.5":61.13379789126919,"0.6":62.905707192423804,"0.7":64.76562423524469,"0.8":66.65801007035515,"0.9":69.3283826700061,"0.95":70.8537022784792}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.598379","as_of":"2025-10-27T00:00:00","forecast_date":"2025-11-25T00:00:00","payload":{"point_forecast":61.89882480546862,"quantiles":{"0.05":45.61715242149206,"0.1":50.14253220123992,"0.2":54.524135982408005,"0.3":57.324652514447074,"0.4":59.56495405313967,"0.5":61.89882480546862,"0.6":64.0075983937654,"0.7":66.28867530285704,"0.8":68.90833140445605,"0.9":72.12018240071572,"0.95":75.32975549603361}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.675272","as_of":"2025-11-03T00:00:00","forecast_date":"2025-11-10T00:00:00","payload":{"point_forecast":60.624983390087266,"quantiles":{"0.05":54.38130306272949,"0.1":55.236371511177424,"0.2":57.204765903102235,"0.3":58.52171785549745,"0.4":59.61124154999118,"0.5":60.624983390087266,"0.6":62.28670527839202,"0.7":63.28367874543714,"0.8":64.78336735614917,"0.9":66.2975607989494,"0.95":67.78789207017208}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.675272","as_of":"2025-11-03T00:00:00","forecast_date":"2025-11-17T00:00:00","payload":{"point_forecast":60.62323123602162,"quantiles":{"0.05":50.91434736191001,"0.1":53.57341569646551,"0.2":55.41655471727177,"0.3":57.47448048216972,"0.4":59.04763513162219,"0.5":60.62323123602162,"0.6":62.25613940032537,"0.7":63.754726619192546,"0.8":65.54892045807212,"0.9":68.32259009800413,"0.95":70.63124807425939}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.675272","as_of":"2025-11-03T00:00:00","forecast_date":"2025-12-02T00:00:00","payload":{"point_forecast":61.33200740672578,"quantiles":{"0.05":46.99912272104898,"0.1":49.22264266448273,"0.2":52.64773719474935,"0.3":55.965690668152796,"0.4":58.45720477162719,"0.5":61.33200740672578,"0.6":63.26787831941366,"0.7":65.27395276851927,"0.8":68.17309882597354,"0.9":72.49958995820722,"0.95":75.37697102080405}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.712912","as_of":"2025-11-10T00:00:00","forecast_date":"2025-11-17T00:00:00","payload":{"point_forecast":59.60033279705006,"quantiles":{"0.05":53.00101656199584,"0.1":54.21165981656911,"0.2":56.18976092798646,"0.3":57.39671810867577,"0.4":58.66852514233413,"0.5":59.60033279705006,"0.6":60.817149879138306,"0.7":62.21982514416743,"0.8":63.629599883309304,"0.9":65.33037245816897,"0.95":66.62237644867244}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.712912","as_of":"2025-11-10T00:00:00","forecast_date":"2025-11-24T00:00:00","payload":{"point_forecast":60.00267868738996,"quantiles":{"0.05":50.57864599505556,"0.1":52.309650702509494,"0.2":54.88421921678247,"0.3":56.7450632939695,"0.4":58.48073405407224,"0.5":60.00267868738996,"0.6":61.53604775718482,"0.7":63.14563763644716,"0.8":65.12860131952777,"0.9":67.61021413281873,"0.95":69.41578157002235}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.712912","as_of":"2025-11-10T00:00:00","forecast_date":"2025-12-09T00:00:00","payload":{"point_forecast":58.95737509645275,"quantiles":{"0.05":43.513791041284655,"0.1":47.52866482514823,"0.2":51.84707770742207,"0.3":55.040036917698274,"0.4":56.98959560755751,"0.5":58.95737509645275,"0.6":61.33280879380727,"0.7":63.74589747409177,"0.8":66.88013323161401,"0.9":70.14963885653927,"0.95":72.77593830003104}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.750136","as_of":"2025-11-17T00:00:00","forecast_date":"2025-11-24T00:00:00","payload":{"point_forecast":60.003451617531624,"quantiles":{"0.05":53.52468803702608,"0.1":54.77032936088628,"0.2":56.147951459096475,"0.3":57.856096557703,"0.4":59.12861755631,"0.5":60.003451617531624,"0.6":61.14360359341722,"0.7":62.18160747260179,"0.8":63.42966347222379,"0.9":65.7542086809182,"0.95":66.83128310654848}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.750136","as_of":"2025-11-17T00:00:00","forecast_date":"2025-12-01T00:00:00","payload":{"point_forecast":60.17224515957075,"quantiles":{"0.05":50.120668094863184,"0.1":52.548805512989226,"0.2":54.7180470622055,"0.3":56.914309861347334,"0.4":58.29768864232582,"0.5":60.17224515957075,"0.6":62.021712143046585,"0.7":63.2041428082265,"0.8":65.50117117960117,"0.9":68.79840385725475,"0.95":70.49388327821875}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.750136","as_of":"2025-11-17T00:00:00","forecast_date":"2025-12-16T00:00:00","payload":{"point_forecast":60.04241263787104,"quantiles":{"0.05":46.55608893641318,"0.1":49.93430895362998,"0.2":53.1416244469093,"0.3":55.604940287282716,"0.4":58.16450354750046,"0.5":60.04241263787104,"0.6":62.30119759922213,"0.7":64.69721765986557,"0.8":67.05480601213775,"0.9":70.40564111868126,"0.95":73.56360612073411}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.787542","as_of":"2025-11-24T00:00:00","forecast_date":"2025-12-01T00:00:00","payload":{"point_forecast":57.79484226399893,"quantiles":{"0.05":50.58194964137175,"0.1":52.00470092438123,"0.2":54.29348214960064,"0.3":55.49709903066394,"0.4":56.63150619279039,"0.5":57.79484226399893,"0.6":59.08016116150368,"0.7":60.238193599007374,"0.8":61.52973785314778,"0.9":63.510001224605716,"0.95":65.11742675511547}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.787542","as_of":"2025-11-24T00:00:00","forecast_date":"2025-12-08T00:00:00","payload":{"point_forecast":57.726000454841355,"quantiles":{"0.05":48.525017606032804,"0.1":51.03403905164545,"0.2":53.14461734087678,"0.3":55.29036831982342,"0.4":56.55866806690557,"0.5":57.726000454841355,"0.6":59.50988584759761,"0.7":61.08659939184494,"0.8":62.6514556109424,"0.9":65.59139188878461,"0.95":68.36709000525542}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.787542","as_of":"2025-11-24T00:00:00","forecast_date":"2025-12-23T00:00:00","payload":{"point_forecast":57.94865996324758,"quantiles":{"0.05":43.25849631416199,"0.1":46.35839893108661,"0.2":49.838853071594535,"0.3":53.01983726488515,"0.4":55.42924745771082,"0.5":57.94865996324758,"0.6":60.13307810455704,"0.7":62.343397822061995,"0.8":64.9388280838263,"0.9":68.88737671376369,"0.95":72.15374500242096}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.824811","as_of":"2025-12-01T00:00:00","forecast_date":"2025-12-08T00:00:00","payload":{"point_forecast":58.82098161303345,"quantiles":{"0.05":51.6757374250239,"0.1":53.32460335795571,"0.2":55.14562364152101,"0.3":56.632760979675744,"0.4":58.03949005115638,"0.5":58.82098161303345,"0.6":59.92991504175742,"0.7":60.96903012665181,"0.8":62.67173142210672,"0.9":64.02126395274813,"0.95":65.91025593638943}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.824811","as_of":"2025-12-01T00:00:00","forecast_date":"2025-12-15T00:00:00","payload":{"point_forecast":58.07586817606054,"quantiles":{"0.05":48.16055210090203,"0.1":50.689650159217294,"0.2":52.985998208610965,"0.3":54.89787893934039,"0.4":56.23282123194919,"0.5":58.07586817606054,"0.6":59.29153903236238,"0.7":61.04996144870761,"0.8":63.177730336616996,"0.9":65.32172114484489,"0.95":67.23357823951805}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.824811","as_of":"2025-12-01T00:00:00","forecast_date":"2025-12-30T00:00:00","payload":{"point_forecast":58.86094051720018,"quantiles":{"0.05":44.955082398572884,"0.1":47.65107651173558,"0.2":51.21992983840243,"0.3":54.59337254810742,"0.4":56.351069562728846,"0.5":58.86094051720018,"0.6":61.45624327006673,"0.7":63.28195857043944,"0.8":66.14142878567742,"0.9":69.41345197487215,"0.95":72.19307782795097}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.862185","as_of":"2025-12-08T00:00:00","forecast_date":"2025-12-15T00:00:00","payload":{"point_forecast":60.57009822459476,"quantiles":{"0.05":53.625754691383804,"0.1":55.03268611327565,"0.2":56.88669007957307,"0.3":57.89351347573175,"0.4":59.28157890182228,"0.5":60.57009822459476,"0.6":61.566057997321984,"0.7":62.64499229144876,"0.8":64.33229587619687,"0.9":66.2521802865861,"0.95":67.16193107306644}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.862185","as_of":"2025-12-08T00:00:00","forecast_date":"2025-12-22T00:00:00","payload":{"point_forecast":60.60487204971581,"quantiles":{"0.05":50.46948653056272,"0.1":53.038610727951045,"0.2":55.06620606205682,"0.3":57.08887592761351,"0.4":58.775293839415376,"0.5":60.60487204971581,"0.6":61.9995024264006,"0.7":63.72928685632514,"0.8":65.85277150872881,"0.9":68.16748243667713,"0.95":69.95659984953969}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.862185","as_of":"2025-12-08T00:00:00","forecast_date":"2026-01-06T00:00:00","payload":{"point_forecast":59.99477637384158,"quantiles":{"0.05":45.3748877035218,"0.1":49.22555921284082,"0.2":52.75327928497272,"0.3":55.24118332864046,"0.4":57.52984080662163,"0.5":59.99477637384158,"0.6":62.60186198736041,"0.7":64.5834408332585,"0.8":67.86985482963644,"0.9":71.51500977314991,"0.95":73.42011062422135}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.899367","as_of":"2025-12-15T00:00:00","forecast_date":"2025-12-22T00:00:00","payload":{"point_forecast":57.32299729031905,"quantiles":{"0.05":50.42497629395935,"0.1":51.546757618704625,"0.2":53.37409645771291,"0.3":54.76615438278936,"0.4":55.97639958391711,"0.5":57.32299729031905,"0.6":58.416588623254135,"0.7":59.55703195596739,"0.8":61.219264146772176,"0.9":63.145364190602464,"0.95":64.93751504400772}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.899367","as_of":"2025-12-15T00:00:00","forecast_date":"2025-12-29T00:00:00","payload":{"point_forecast":57.59957333164523,"quantiles":{"0.05":47.478556961865515,"0.1":50.03402692358805,"0.2":52.82674849381492,"0.3":54.473224754896556,"0.4":56.12049704827318,"0.5":57.59957333164523,"0.6":58.95364998550857,"0.7":61.02548610383259,"0.8":63.13274239971331,"0.9":65.74278770223097,"0.95":67.25529503265682}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.899367","as_of":"2025-12-15T00:00:00","forecast_date":"2026-01-13T00:00:00","payload":{"point_forecast":57.24199642753163,"quantiles":{"0.05":41.70618702550256,"0.1":46.632588040187805,"0.2":50.71246173143043,"0.3":53.11106143819335,"0.4":55.45235402997608,"0.5":57.24199642753163,"0.6":59.53255405176859,"0.7":62.1118403310809,"0.8":65.20543544408868,"0.9":69.70027079090309,"0.95":73.75566763185932}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.936220","as_of":"2025-12-22T00:00:00","forecast_date":"2025-12-29T00:00:00","payload":{"point_forecast":56.47459504122693,"quantiles":{"0.05":49.19412782690346,"0.1":51.044540555308416,"0.2":52.3820477536203,"0.3":53.98975720471506,"0.4":55.215563478019114,"0.5":56.47459504122693,"0.6":57.78585437661241,"0.7":59.14494193053734,"0.8":60.629862878445394,"0.9":62.72281661643346,"0.95":64.18930150747416}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.936220","as_of":"2025-12-22T00:00:00","forecast_date":"2026-01-05T00:00:00","payload":{"point_forecast":56.9768162258314,"quantiles":{"0.05":47.14482194672344,"0.1":49.657341226048125,"0.2":51.82958194336556,"0.3":53.72005841633327,"0.4":55.206933038493965,"0.5":56.9768162258314,"0.6":58.63917381933086,"0.7":60.04618025259135,"0.8":62.12100931179543,"0.9":64.10333694840546,"0.95":65.84144888020919}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.936220","as_of":"2025-12-22T00:00:00","forecast_date":"2026-01-20T00:00:00","payload":{"point_forecast":56.61346936718535,"quantiles":{"0.05":44.2027379493987,"0.1":46.51688619247766,"0.2":49.73614408304166,"0.3":52.48204650273595,"0.4":54.52565783982262,"0.5":56.61346936718535,"0.6":58.72123954875116,"0.7":60.88884521591259,"0.8":63.04836946774913,"0.9":67.41849762341035,"0.95":70.01784189995146}},"metadata":{}}],"scores":[2.788544245712532,2.526967394150948,2.1330261502981123,2.8117695154529234,2.959067241711675,2.778470777167786,3.7057505670723905,1.3856091218013413,2.018747997281983,3.9188793011534266,1.1605342933579996,3.4193691302416704,1.6277679374947316,3.093307445270043,1.187000431516004,1.8474978216081759,3.048146301975465,1.4943598396445554,2.5772895138583305,2.5794574402696675,2.1628685144621334,1.986074910905964,2.38599582611258,1.1289012659141806,1.941764636764677,4.488441562826934,1.5703156195902108,2.648224349655257,3.589591733430066,1.8107076132560047,4.219895318711169,3.0815757291344914,5.898428380595285,4.714806611364325,5.264942822239969,1.2416973951274648,1.6387570871306936,2.6424880969004656,1.3258758682490446,1.6948834681701719,2.496828314755124,1.7279260201982471,4.719240423114635,2.507238217324109,3.4656405414113673,1.6919888469157183,2.3649822331294215,2.1223969563679947,2.5681161030784576,3.6079170665095126,1.2885244429321103,2.9398516075249894,1.7546397044019328,8.070193812783529,1.2156871541876364,2.519461174063274,2.67845904595357,2.8593786891137456,7.481989958673911,3.429002714440574,4.667401613787003,2.47642672273396,2.8884903817462213,2.7600685000332974,5.070844729538482,4.157096508426347,7.629746655222999,4.211764263426534,5.172825600529374,1.53667396628954,1.7635416609425192,2.950468850462455,1.159051835098995,1.6558627461109054,2.5421642630362307,1.2402121490545555,1.9885698540194656,3.5623483887069805,1.2649632899179064,1.789346590413274,3.312565378646668,1.2692797143464776,1.670755811729782,2.5323032632460247,2.0692700270467714,2.6043837398341383,2.488861770082465,1.1458712435725418,1.8228583926866115,2.365614912367571,1.4853393813269686,2.5483811510382157,1.679749969534626,2.346356934165365,1.364663272635304,1.6847403729724097,2.4848093892515744,1.3954031255835644,1.6773591210825853,2.2168996703492794,1.1000124784609338,1.6274312829585211,3.096084043973489,1.1989185183868492,1.80061563155266,3.1666124523650456,2.1337654897853007,4.043187550920444,3.6585869885141937,1.3896570449419134,2.291269747769841,2.201564002742057,1.349352475347344,2.0526722955168966,2.3781649031407106,2.1812614966090407,2.3229379994051524,2.5347528085323545,1.2437374529117757,1.6901048761758017,2.886483687768067,1.2176931360567844,1.614132721265784,2.594227133533419,1.162664479518612,1.6615871403950462,2.314887732279848,1.2415520068576746,1.7351849012395317,3.1603957668099274,1.3430693611661695,1.577495095350081,2.349803379940885,1.0906773731306831,1.6391362875902291,2.346443135325585,2.1382947890919257,1.980887784014711,2.6599127941657112,1.2528020877741597,1.612247184358568,2.9092276890941013,1.443129812743821,1.6813205701071625,2.71316911953155],"mean_crps":2.472053187755704,"ran_at":"2026-06-02T11:12:20.944411","skipped_origins":0} +{"spec":{"task":{"task_id":"wti_oil_price_forecast","target_series_id":"wti_crude_oil_price","horizons":[5,10,21],"frequency":"B","description":"WTI Crude Oil continuous front-month futures Close price (yfinance symbol: CL=F), projected 5, 10, and 21 trading days ahead.","payload_type":"continuous","categories":null,"resolution_fn":"observed_value_at_resolution_timestamp"},"start":"2025-01-06T00:00:00","end":"2025-12-22T00:00:00","stride":5,"origin_dates":null,"warmup":250,"description":"Weekly rolling backtest in 2025 for daily WTI crude oil price forecasting. Evaluates trajectory forecasts (5, 10, 21 business days) with CRPS/MAE and binary up-shock forecasts (climb > $5 in 5 business days) with Brier Score. Used to select the top contender models."},"predictor_id":"darts_autoarima","predictions":[{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.015562","as_of":"2025-01-06T00:00:00","forecast_date":"2025-01-13T00:00:00","payload":{"point_forecast":74.1661522589726,"quantiles":{"0.05":67.16285584426693,"0.1":68.60014799770993,"0.2":70.07461390989292,"0.3":71.71645443973048,"0.4":72.87936028459387,"0.5":74.1661522589726,"0.6":75.33855082421024,"0.7":76.62261505513705,"0.8":77.9826068683292,"0.9":79.5404247898506,"0.95":81.190774038603}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.015562","as_of":"2025-01-06T00:00:00","forecast_date":"2025-02-04T00:00:00","payload":{"point_forecast":74.47310552634595,"quantiles":{"0.05":59.34244641293798,"0.1":62.784001249359314,"0.2":66.55361568046081,"0.3":69.32540633752404,"0.4":71.74856896274466,"0.5":74.47310552634595,"0.6":76.77310336215626,"0.7":79.04429576633392,"0.8":82.08791653828567,"0.9":84.81454424122579,"0.95":88.58513788496417}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.052917","as_of":"2025-01-13T00:00:00","forecast_date":"2025-01-27T00:00:00","payload":{"point_forecast":76.03523784771988,"quantiles":{"0.05":65.54378070946629,"0.1":67.89199953226023,"0.2":70.59440702001471,"0.3":72.60191567176857,"0.4":74.24564652703188,"0.5":76.03523784771988,"0.6":77.59498637225583,"0.7":79.35891763632344,"0.8":81.66945578136686,"0.9":84.0922041896703,"0.95":87.03911441322256}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.052917","as_of":"2025-01-13T00:00:00","forecast_date":"2025-02-11T00:00:00","payload":{"point_forecast":76.77461343722493,"quantiles":{"0.05":62.573995122384446,"0.1":65.0434030979378,"0.2":68.9271052567605,"0.3":71.82984875414189,"0.4":74.6511431419417,"0.5":76.77461343722493,"0.6":78.61265936718986,"0.7":80.98789067339466,"0.8":84.11126065943135,"0.9":88.00499968176636,"0.95":90.94669326235302}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.090447","as_of":"2025-01-20T00:00:00","forecast_date":"2025-01-27T00:00:00","payload":{"point_forecast":78.18862302377354,"quantiles":{"0.05":70.98608858061331,"0.1":72.38660254452142,"0.2":74.28045677224804,"0.3":75.71473304808818,"0.4":77.01107747461008,"0.5":78.18862302377354,"0.6":79.1434334241743,"0.7":80.50785621183347,"0.8":81.87571178639547,"0.9":83.50988288048892,"0.95":84.8211683152528}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.090447","as_of":"2025-01-20T00:00:00","forecast_date":"2025-02-03T00:00:00","payload":{"point_forecast":77.75418491613605,"quantiles":{"0.05":68.11449649884412,"0.1":69.40301646420137,"0.2":72.15800957979974,"0.3":73.669299850678,"0.4":75.85775396103588,"0.5":77.75418491613605,"0.6":79.66011024918954,"0.7":81.0664261653459,"0.8":83.53907490700918,"0.9":86.44596897318817,"0.95":89.18316905789408}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.090447","as_of":"2025-01-20T00:00:00","forecast_date":"2025-02-18T00:00:00","payload":{"point_forecast":77.54306738675652,"quantiles":{"0.05":63.050193649446335,"0.1":65.55913483174612,"0.2":69.40397632757069,"0.3":72.74156739431432,"0.4":74.96887731482411,"0.5":77.54306738675652,"0.6":80.21608153435734,"0.7":82.66545046682498,"0.8":85.25879454070562,"0.9":89.39306458505865,"0.95":93.12450367751278}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.127798","as_of":"2025-01-27T00:00:00","forecast_date":"2025-02-03T00:00:00","payload":{"point_forecast":74.72110439911573,"quantiles":{"0.05":66.71250814006996,"0.1":69.2796817546158,"0.2":70.92319889594935,"0.3":72.36195451071356,"0.4":73.4774284712028,"0.5":74.72110439911573,"0.6":76.14364092835876,"0.7":77.05034140055213,"0.8":78.30250030010144,"0.9":80.57446434518691,"0.95":82.62028283515961}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.127798","as_of":"2025-01-27T00:00:00","forecast_date":"2025-02-10T00:00:00","payload":{"point_forecast":75.08799428467469,"quantiles":{"0.05":64.9898289002261,"0.1":67.11437927629947,"0.2":69.61525528268338,"0.3":71.48593391710865,"0.4":73.1260086056451,"0.5":75.08799428467469,"0.6":76.60483307911784,"0.7":78.21300275049539,"0.8":80.20318562537054,"0.9":82.31979602625871,"0.95":84.12339598665622}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.127798","as_of":"2025-01-27T00:00:00","forecast_date":"2025-02-25T00:00:00","payload":{"point_forecast":75.76939160005543,"quantiles":{"0.05":61.42067857223936,"0.1":64.13003978412249,"0.2":68.11674586035278,"0.3":70.6107108413265,"0.4":72.77544338738919,"0.5":75.76939160005543,"0.6":77.47895958567524,"0.7":79.8049483176847,"0.8":83.03095719828482,"0.9":86.91738657397205,"0.95":89.17198498582648}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.164829","as_of":"2025-02-03T00:00:00","forecast_date":"2025-02-10T00:00:00","payload":{"point_forecast":72.86452984914862,"quantiles":{"0.05":65.49915570076477,"0.1":67.26430056184199,"0.2":69.02584090057304,"0.3":70.34545265578555,"0.4":71.58431197979317,"0.5":72.86452984914862,"0.6":73.88470503341223,"0.7":74.85498525473226,"0.8":76.36853375873052,"0.9":77.87372176802917,"0.95":79.12197991496689}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.164829","as_of":"2025-02-03T00:00:00","forecast_date":"2025-03-04T00:00:00","payload":{"point_forecast":73.61869050666226,"quantiles":{"0.05":57.33638795412636,"0.1":60.15120713441179,"0.2":65.44358502733489,"0.3":68.46814202090557,"0.4":71.16472949171063,"0.5":73.61869050666226,"0.6":75.94095815298066,"0.7":77.56134601694932,"0.8":80.73466083458821,"0.9":84.25813731017837,"0.95":88.23674586790025}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.201346","as_of":"2025-02-10T00:00:00","forecast_date":"2025-02-24T00:00:00","payload":{"point_forecast":71.091956629576,"quantiles":{"0.05":60.75604836590092,"0.1":62.61196835791096,"0.2":65.58261401954414,"0.3":67.91670003156077,"0.4":69.40053120280403,"0.5":71.091956629576,"0.6":72.67370426028408,"0.7":74.04874334416199,"0.8":76.21401525661207,"0.9":78.31873194133219,"0.95":80.74425466695911}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.201346","as_of":"2025-02-10T00:00:00","forecast_date":"2025-03-11T00:00:00","payload":{"point_forecast":70.79025644252248,"quantiles":{"0.05":56.76295600248761,"0.1":59.85339566614456,"0.2":63.63501811588251,"0.3":66.2852774053866,"0.4":68.78561895386653,"0.5":70.79025644252248,"0.6":72.93774098304719,"0.7":75.2405707336712,"0.8":77.70030807794538,"0.9":82.11642843722873,"0.95":87.3789164246618}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.237308","as_of":"2025-02-17T00:00:00","forecast_date":"2025-02-24T00:00:00","payload":{"point_forecast":71.079336331306,"quantiles":{"0.05":63.78800882526367,"0.1":65.32675253934626,"0.2":67.06913321938207,"0.3":68.81774766990755,"0.4":70.07634013886495,"0.5":71.079336331306,"0.6":72.24558829863018,"0.7":73.38554646853162,"0.8":75.00117667720835,"0.9":76.62632730135252,"0.95":78.18556122159261}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.237308","as_of":"2025-02-17T00:00:00","forecast_date":"2025-03-03T00:00:00","payload":{"point_forecast":70.29698726194431,"quantiles":{"0.05":60.74405248953911,"0.1":63.06446032092341,"0.2":65.17587233643273,"0.3":67.00094404057906,"0.4":68.50744428215386,"0.5":70.29698726194431,"0.6":72.13989579981785,"0.7":73.57811888710656,"0.8":75.9824941052852,"0.9":78.63854497425908,"0.95":80.58309506362552}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.237308","as_of":"2025-02-17T00:00:00","forecast_date":"2025-03-18T00:00:00","payload":{"point_forecast":70.97246085505247,"quantiles":{"0.05":55.82130015839571,"0.1":59.55163360234687,"0.2":62.85882647657617,"0.3":66.06266525421562,"0.4":68.6418097226456,"0.5":70.97246085505247,"0.6":73.31628482166413,"0.7":75.51052078147963,"0.8":78.84816215472229,"0.9":82.40692225658117,"0.95":84.81236081220226}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.273464","as_of":"2025-02-24T00:00:00","forecast_date":"2025-03-03T00:00:00","payload":{"point_forecast":70.71414547029747,"quantiles":{"0.05":63.8463754567506,"0.1":65.32883917473647,"0.2":66.9383137131858,"0.3":68.31085262708118,"0.4":69.47937579740055,"0.5":70.71414547029747,"0.6":71.75552254251726,"0.7":72.70147632883402,"0.8":74.05058995222997,"0.9":75.51243395877664,"0.95":77.14028680920305}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.273464","as_of":"2025-02-24T00:00:00","forecast_date":"2025-03-10T00:00:00","payload":{"point_forecast":70.06279426627117,"quantiles":{"0.05":59.28086001024928,"0.1":62.21850802596504,"0.2":64.75326525192217,"0.3":66.84835804216435,"0.4":68.68083099265554,"0.5":70.06279426627117,"0.6":71.4641579535131,"0.7":73.17212841076991,"0.8":75.53487073892624,"0.9":78.05800693837342,"0.95":79.70706895321256}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.273464","as_of":"2025-02-24T00:00:00","forecast_date":"2025-03-25T00:00:00","payload":{"point_forecast":70.96061230357401,"quantiles":{"0.05":54.79798013423229,"0.1":58.44504325421701,"0.2":62.81683866287115,"0.3":65.77407326289664,"0.4":68.011431931604,"0.5":70.96061230357401,"0.6":73.05255376197759,"0.7":75.39192831637078,"0.8":78.53513679067585,"0.9":81.37208465138693,"0.95":85.27789838933343}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.309454","as_of":"2025-03-03T00:00:00","forecast_date":"2025-03-10T00:00:00","payload":{"point_forecast":69.51573706240735,"quantiles":{"0.05":62.602298350318385,"0.1":64.33775461635044,"0.2":66.08139720995732,"0.3":67.5217594019182,"0.4":68.52639528398265,"0.5":69.51573706240735,"0.6":70.71048378266593,"0.7":71.88712749668795,"0.8":73.66702190836112,"0.9":75.13443765850867,"0.95":76.56349944070374}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.309454","as_of":"2025-03-03T00:00:00","forecast_date":"2025-03-17T00:00:00","payload":{"point_forecast":69.57548362979485,"quantiles":{"0.05":59.80068565001224,"0.1":61.61736068362088,"0.2":64.4864475186693,"0.3":66.2466093329622,"0.4":68.22842972293513,"0.5":69.57548362979485,"0.6":71.77015318693212,"0.7":73.25495148076254,"0.8":75.47583436536686,"0.9":77.42391974069058,"0.95":80.59951884685017}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.309454","as_of":"2025-03-03T00:00:00","forecast_date":"2025-04-01T00:00:00","payload":{"point_forecast":70.2035869238139,"quantiles":{"0.05":55.023798791174656,"0.1":59.44153825330761,"0.2":62.74029892799443,"0.3":65.78683078082996,"0.4":68.16668577711954,"0.5":70.2035869238139,"0.6":72.4793573089762,"0.7":75.31144276871129,"0.8":78.03810550147762,"0.9":81.23724239534859,"0.95":85.40631048666766}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.350028","as_of":"2025-03-10T00:00:00","forecast_date":"2025-03-17T00:00:00","payload":{"point_forecast":66.90566795316843,"quantiles":{"0.05":60.43552070744905,"0.1":61.84245616903729,"0.2":63.39478267020813,"0.3":64.6981135676767,"0.4":65.8137863039808,"0.5":66.90566795316843,"0.6":67.80940545570797,"0.7":69.17307450011603,"0.8":70.55093461360637,"0.9":72.17327695198537,"0.95":73.55638026786082}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.350028","as_of":"2025-03-10T00:00:00","forecast_date":"2025-03-24T00:00:00","payload":{"point_forecast":66.80638051768628,"quantiles":{"0.05":56.82513638999975,"0.1":58.801517158616534,"0.2":61.14157841290674,"0.3":63.81142746997162,"0.4":65.29881899549058,"0.5":66.80638051768628,"0.6":68.36416995928002,"0.7":70.08234167848886,"0.8":71.8388194042144,"0.9":74.67588012414258,"0.95":77.43671010879147}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.350028","as_of":"2025-03-10T00:00:00","forecast_date":"2025-04-08T00:00:00","payload":{"point_forecast":67.3195642027693,"quantiles":{"0.05":53.044151662126154,"0.1":55.448818606661725,"0.2":59.086292965152175,"0.3":62.02259881774265,"0.4":64.55626264022753,"0.5":67.3195642027693,"0.6":69.34041089281641,"0.7":72.49332607810614,"0.8":75.25756748032443,"0.9":78.3064739350975,"0.95":82.01375950937413}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.386971","as_of":"2025-03-17T00:00:00","forecast_date":"2025-03-24T00:00:00","payload":{"point_forecast":66.64483862206276,"quantiles":{"0.05":59.850101929725966,"0.1":61.56322523904076,"0.2":62.94893006114485,"0.3":64.59729699058921,"0.4":65.6512852225223,"0.5":66.64483862206276,"0.6":68.23728067942608,"0.7":69.36744689014674,"0.8":70.8116514250823,"0.9":72.73596796752624,"0.95":74.04482813442374}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.386971","as_of":"2025-03-17T00:00:00","forecast_date":"2025-03-31T00:00:00","payload":{"point_forecast":67.25237524326084,"quantiles":{"0.05":57.486249269142725,"0.1":58.73128858218357,"0.2":62.00019414089394,"0.3":64.28235416812414,"0.4":65.84316896393177,"0.5":67.25237524326084,"0.6":68.92608972688564,"0.7":70.47115622833506,"0.8":72.82976390838132,"0.9":75.67646561582146,"0.95":76.98546841039406}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.386971","as_of":"2025-03-17T00:00:00","forecast_date":"2025-04-15T00:00:00","payload":{"point_forecast":66.96333322031556,"quantiles":{"0.05":53.59540871247286,"0.1":56.328847282330585,"0.2":59.25829875005627,"0.3":62.21614974494167,"0.4":64.76775100396257,"0.5":66.96333322031556,"0.6":68.97522878355463,"0.7":71.72069805550662,"0.8":74.46375409935509,"0.9":79.17122007547368,"0.95":81.89009394994783}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.422578","as_of":"2025-03-24T00:00:00","forecast_date":"2025-03-31T00:00:00","payload":{"point_forecast":68.56371568493682,"quantiles":{"0.05":61.74627201089714,"0.1":62.95760051987872,"0.2":64.85227233921977,"0.3":66.36476178767258,"0.4":67.47224700596927,"0.5":68.56371568493682,"0.6":69.7684872862179,"0.7":70.69908642296983,"0.8":71.999141939688,"0.9":73.6406269732877,"0.95":75.13934038807459}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.422578","as_of":"2025-03-24T00:00:00","forecast_date":"2025-04-07T00:00:00","payload":{"point_forecast":67.54826198984239,"quantiles":{"0.05":58.76633072154439,"0.1":60.408144954809494,"0.2":62.68837641310648,"0.3":64.49715210460165,"0.4":65.88646011281072,"0.5":67.54826198984239,"0.6":69.34889621697545,"0.7":71.12907290774915,"0.8":73.16962188080274,"0.9":75.37114344924127,"0.95":77.77849789096099}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.422578","as_of":"2025-03-24T00:00:00","forecast_date":"2025-04-22T00:00:00","payload":{"point_forecast":68.414777792405,"quantiles":{"0.05":53.490690217780624,"0.1":56.887031302418045,"0.2":60.33585876722434,"0.3":63.10109034715021,"0.4":66.3370260904747,"0.5":68.414777792405,"0.6":70.82294140938941,"0.7":72.86157908839606,"0.8":75.91874602673137,"0.9":79.48031803835535,"0.95":82.2231876054492}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.458345","as_of":"2025-03-31T00:00:00","forecast_date":"2025-04-07T00:00:00","payload":{"point_forecast":69.3591848324611,"quantiles":{"0.05":61.780298898296564,"0.1":63.27986071154485,"0.2":65.36822450173156,"0.3":66.95141125234812,"0.4":67.91167953718413,"0.5":69.3591848324611,"0.6":70.31218540833167,"0.7":71.5719773088643,"0.8":72.52885302848982,"0.9":74.9603992799292,"0.95":76.03347070972748}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.458345","as_of":"2025-03-31T00:00:00","forecast_date":"2025-04-14T00:00:00","payload":{"point_forecast":69.31692980390864,"quantiles":{"0.05":59.34550907086575,"0.1":61.48727065080813,"0.2":64.27705990778723,"0.3":66.2068080475986,"0.4":67.77043311143849,"0.5":69.31692980390864,"0.6":70.64029753069528,"0.7":72.24865684061281,"0.8":73.84695096560647,"0.9":77.45218882326839,"0.95":79.70023260779094}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.458345","as_of":"2025-03-31T00:00:00","forecast_date":"2025-04-29T00:00:00","payload":{"point_forecast":69.27561553077872,"quantiles":{"0.05":56.0723956559097,"0.1":58.94846783766386,"0.2":61.85869024954146,"0.3":64.40708754244575,"0.4":66.78520963228331,"0.5":69.27561553077872,"0.6":71.72050096205443,"0.7":74.18983188240553,"0.8":77.18229703915696,"0.9":80.24920653974283,"0.95":82.89975958124478}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.493856","as_of":"2025-04-07T00:00:00","forecast_date":"2025-04-14T00:00:00","payload":{"point_forecast":62.21154794568575,"quantiles":{"0.05":55.18634354951701,"0.1":56.56116379550858,"0.2":58.316453059301224,"0.3":59.79049640664565,"0.4":60.78998676224416,"0.5":62.21154794568575,"0.6":63.44664978999987,"0.7":64.57732402408058,"0.8":66.14128344689776,"0.9":67.41181125436557,"0.95":68.84083264326314}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.493856","as_of":"2025-04-07T00:00:00","forecast_date":"2025-04-21T00:00:00","payload":{"point_forecast":62.22315416548117,"quantiles":{"0.05":52.266158069484476,"0.1":54.417898178064846,"0.2":56.973813422452125,"0.3":58.64419574390682,"0.4":60.7645747979695,"0.5":62.22315416548117,"0.6":63.77999776223206,"0.7":64.9889107465779,"0.8":67.40320540734172,"0.9":69.67180161424919,"0.95":71.66995936092823}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.493856","as_of":"2025-04-07T00:00:00","forecast_date":"2025-05-06T00:00:00","payload":{"point_forecast":61.954828880058464,"quantiles":{"0.05":48.39652742778133,"0.1":51.268419115848374,"0.2":54.92893779613973,"0.3":57.17360953676775,"0.4":59.59718124074289,"0.5":61.954828880058464,"0.6":64.33425888466087,"0.7":66.5929281499132,"0.8":69.7608060010403,"0.9":73.4346972614239,"0.95":76.23938266264202}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.529960","as_of":"2025-04-14T00:00:00","forecast_date":"2025-04-21T00:00:00","payload":{"point_forecast":61.52311034250785,"quantiles":{"0.05":54.38104213739602,"0.1":56.003808799212955,"0.2":57.74749372003761,"0.3":59.290182514927956,"0.4":60.4533829972257,"0.5":61.52311034250785,"0.6":62.45430583415399,"0.7":63.55718748220126,"0.8":64.92927992537005,"0.9":66.75012757467097,"0.95":67.89567623339592}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.529960","as_of":"2025-04-14T00:00:00","forecast_date":"2025-04-28T00:00:00","payload":{"point_forecast":61.068022369777424,"quantiles":{"0.05":51.69581510139456,"0.1":53.900724367236776,"0.2":56.201086787273084,"0.3":58.05160858180455,"0.4":59.62783461118306,"0.5":61.068022369777424,"0.6":62.827609824048544,"0.7":64.54541250204632,"0.8":66.88323438693797,"0.9":69.15736854321358,"0.95":72.53969432613451}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.529960","as_of":"2025-04-14T00:00:00","forecast_date":"2025-05-13T00:00:00","payload":{"point_forecast":61.87062929314382,"quantiles":{"0.05":48.878968419555534,"0.1":51.446891294190934,"0.2":53.566149037847765,"0.3":56.7054684462243,"0.4":59.27430717731009,"0.5":61.87062929314382,"0.6":63.96621763573362,"0.7":66.37921436284478,"0.8":70.1075556676505,"0.9":72.5507456365578,"0.95":75.24012515283984}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.565681","as_of":"2025-04-21T00:00:00","forecast_date":"2025-04-28T00:00:00","payload":{"point_forecast":64.71987634407068,"quantiles":{"0.05":57.712543523299075,"0.1":59.121802858570824,"0.2":61.13383149547568,"0.3":62.43981352173074,"0.4":63.6983974959561,"0.5":64.71987634407068,"0.6":65.8377062054114,"0.7":66.78420937260063,"0.8":68.68569612613692,"0.9":70.28636197527139,"0.95":71.66471798713435}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.565681","as_of":"2025-04-21T00:00:00","forecast_date":"2025-05-05T00:00:00","payload":{"point_forecast":64.79906987767333,"quantiles":{"0.05":55.08585826442429,"0.1":57.37490780204896,"0.2":59.735246960586025,"0.3":61.47411765857742,"0.4":63.02978074359268,"0.5":64.79906987767333,"0.6":66.45598696806755,"0.7":68.3230826732314,"0.8":70.40408034586144,"0.9":72.94682795590758,"0.95":74.84657841378035}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.565681","as_of":"2025-04-21T00:00:00","forecast_date":"2025-05-20T00:00:00","payload":{"point_forecast":64.91730451129739,"quantiles":{"0.05":51.081062909170775,"0.1":54.40806847979423,"0.2":57.48470624608951,"0.3":60.263979437289215,"0.4":62.92020291231062,"0.5":64.91730451129739,"0.6":67.03796116056405,"0.7":69.49936996200977,"0.8":72.65112157601477,"0.9":75.87096631126681,"0.95":78.67379077751791}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.641391","as_of":"2025-04-28T00:00:00","forecast_date":"2025-05-05T00:00:00","payload":{"point_forecast":62.72979862961851,"quantiles":{"0.05":55.702398400071075,"0.1":57.32113778627019,"0.2":59.14845636652095,"0.3":60.58145825725499,"0.4":61.685258220683274,"0.5":62.72979862961851,"0.6":63.858813388537754,"0.7":64.85224649657712,"0.8":66.5415713508186,"0.9":68.21491015108153,"0.95":69.58398465053683}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.641391","as_of":"2025-04-28T00:00:00","forecast_date":"2025-05-12T00:00:00","payload":{"point_forecast":63.293044528996376,"quantiles":{"0.05":53.87024052373915,"0.1":55.563120545059576,"0.2":58.300532297856314,"0.3":60.05300945342398,"0.4":61.82877374716485,"0.5":63.293044528996376,"0.6":64.84692518529052,"0.7":66.51942422308635,"0.8":68.63698916476706,"0.9":70.91124951130479,"0.95":73.67247200985814}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.641391","as_of":"2025-04-28T00:00:00","forecast_date":"2025-05-27T00:00:00","payload":{"point_forecast":62.505730944551274,"quantiles":{"0.05":49.126617819035445,"0.1":51.60001024029547,"0.2":55.11876936378756,"0.3":58.64268565176281,"0.4":60.431034658428395,"0.5":62.505730944551274,"0.6":64.72325281239256,"0.7":67.0500988838273,"0.8":70.14309181954899,"0.9":74.14150711861389,"0.95":77.28846199987305}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.677126","as_of":"2025-05-05T00:00:00","forecast_date":"2025-05-12T00:00:00","payload":{"point_forecast":58.31161632284507,"quantiles":{"0.05":51.82724201638964,"0.1":53.45729311798357,"0.2":55.06369741489889,"0.3":56.30120233899865,"0.4":57.16933797695104,"0.5":58.31161632284507,"0.6":59.476788417074104,"0.7":60.57120186285336,"0.8":62.35716518761768,"0.9":63.945010607556505,"0.95":65.28325552454369}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.677126","as_of":"2025-05-05T00:00:00","forecast_date":"2025-05-19T00:00:00","payload":{"point_forecast":58.80501983612929,"quantiles":{"0.05":49.294180614742956,"0.1":51.21213898674031,"0.2":53.590156485636165,"0.3":55.34883488698704,"0.4":56.954330256697794,"0.5":58.80501983612929,"0.6":60.160342568812474,"0.7":61.587316865952964,"0.8":63.67176200626552,"0.9":66.60467104798421,"0.95":68.28092193183194}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.677126","as_of":"2025-05-05T00:00:00","forecast_date":"2025-06-03T00:00:00","payload":{"point_forecast":57.667729870716514,"quantiles":{"0.05":44.89456569005164,"0.1":47.842407487835416,"0.2":50.678606124169214,"0.3":52.873786494826426,"0.4":55.67498562238532,"0.5":57.667729870716514,"0.6":59.52806832151059,"0.7":61.9563007242384,"0.8":64.00790892417405,"0.9":68.95949107345184,"0.95":72.6505780595114}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.713896","as_of":"2025-05-12T00:00:00","forecast_date":"2025-05-19T00:00:00","payload":{"point_forecast":61.15065748879006,"quantiles":{"0.05":54.98868502415765,"0.1":56.06936824763784,"0.2":57.93286183144466,"0.3":58.94460463699164,"0.4":60.105076803313366,"0.5":61.15065748879006,"0.6":62.07434242808817,"0.7":63.122445804352054,"0.8":64.57079621813702,"0.9":66.75954212069347,"0.95":68.19448138505219}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.713896","as_of":"2025-05-12T00:00:00","forecast_date":"2025-06-10T00:00:00","payload":{"point_forecast":61.366457956961995,"quantiles":{"0.05":46.366635278477,"0.1":49.45511771232954,"0.2":52.8330079798879,"0.3":55.875860790075045,"0.4":58.57009341733111,"0.5":61.366457956961995,"0.6":63.833001134239915,"0.7":65.84159520142894,"0.8":68.24993749047867,"0.9":71.77359499480686,"0.95":75.93924175800983}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.750537","as_of":"2025-05-19T00:00:00","forecast_date":"2025-06-02T00:00:00","payload":{"point_forecast":62.11981176225422,"quantiles":{"0.05":52.389619903314994,"0.1":54.44347046941073,"0.2":57.1937441331696,"0.3":59.20826321800616,"0.4":60.50242724412688,"0.5":62.11981176225422,"0.6":64.37882029366108,"0.7":66.05433914469995,"0.8":68.38693732034999,"0.9":70.63987003484294,"0.95":72.93371492048207}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.750537","as_of":"2025-05-19T00:00:00","forecast_date":"2025-06-17T00:00:00","payload":{"point_forecast":61.68755272315515,"quantiles":{"0.05":47.61321326383379,"0.1":50.74614159969607,"0.2":54.31815792981121,"0.3":56.79662260411309,"0.4":59.041344993864286,"0.5":61.68755272315515,"0.6":63.87066930444557,"0.7":67.06228907337604,"0.8":70.10328567851738,"0.9":73.8932468131003,"0.95":78.26836777802409}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.787075","as_of":"2025-05-26T00:00:00","forecast_date":"2025-06-02T00:00:00","payload":{"point_forecast":61.98807112636308,"quantiles":{"0.05":54.9875805644785,"0.1":56.13742984496372,"0.2":57.798562672818065,"0.3":59.22627072287308,"0.4":60.68675719265987,"0.5":61.98807112636308,"0.6":63.08926252123794,"0.7":64.04058675764384,"0.8":65.56568820205314,"0.9":67.22638161333826,"0.95":68.80926042387911}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.787075","as_of":"2025-05-26T00:00:00","forecast_date":"2025-06-09T00:00:00","payload":{"point_forecast":61.38591138586695,"quantiles":{"0.05":51.67411686131192,"0.1":53.81691204716384,"0.2":56.00778479773879,"0.3":58.22171425621872,"0.4":59.74613644862434,"0.5":61.38591138586695,"0.6":62.81825024579748,"0.7":64.72036155478963,"0.8":66.87884981569646,"0.9":69.46850512099806,"0.95":72.22369385057145}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.787075","as_of":"2025-05-26T00:00:00","forecast_date":"2025-06-24T00:00:00","payload":{"point_forecast":61.091241554439904,"quantiles":{"0.05":47.65788517773074,"0.1":50.43517981916137,"0.2":54.41387945566104,"0.3":56.93811734080073,"0.4":58.87213086352233,"0.5":61.091241554439904,"0.6":63.65274869488918,"0.7":65.54129145085953,"0.8":69.09433791096254,"0.9":73.13457410794442,"0.95":75.15721309173682}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.824774","as_of":"2025-06-02T00:00:00","forecast_date":"2025-06-09T00:00:00","payload":{"point_forecast":60.66471175407206,"quantiles":{"0.05":53.94372766549223,"0.1":55.20710897801151,"0.2":57.07995784973285,"0.3":58.41517902070738,"0.4":59.51016075707526,"0.5":60.66471175407206,"0.6":61.73631640856649,"0.7":62.64242413567758,"0.8":64.05042252870979,"0.9":66.26794262045814,"0.95":67.69095446199034}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.824774","as_of":"2025-06-02T00:00:00","forecast_date":"2025-06-16T00:00:00","payload":{"point_forecast":60.57455552997307,"quantiles":{"0.05":51.643818363825005,"0.1":53.54471440749074,"0.2":55.75335535806142,"0.3":57.5220108224953,"0.4":59.069421247613334,"0.5":60.57455552997307,"0.6":62.55705559666917,"0.7":64.04664639779594,"0.8":65.77532211699136,"0.9":68.85030012875123,"0.95":70.80607121240153}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.824774","as_of":"2025-06-02T00:00:00","forecast_date":"2025-07-01T00:00:00","payload":{"point_forecast":60.57163034831626,"quantiles":{"0.05":45.996921513020254,"0.1":48.54111074627493,"0.2":51.86886309729595,"0.3":55.053275383602234,"0.4":57.55827558124615,"0.5":60.57163034831626,"0.6":63.14009760378816,"0.7":65.55235765079891,"0.8":68.14981316745202,"0.9":73.2658046340487,"0.95":77.11762569579952}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.862492","as_of":"2025-06-09T00:00:00","forecast_date":"2025-06-16T00:00:00","payload":{"point_forecast":64.6371002397618,"quantiles":{"0.05":57.84960019702711,"0.1":58.937559115293034,"0.2":60.82091169021206,"0.3":62.228833626013255,"0.4":63.42002115062383,"0.5":64.6371002397618,"0.6":65.65519871268485,"0.7":66.72160986451446,"0.8":68.46200336593066,"0.9":70.44470999651723,"0.95":72.32817036097518}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.862492","as_of":"2025-06-09T00:00:00","forecast_date":"2025-06-23T00:00:00","payload":{"point_forecast":64.6773580050924,"quantiles":{"0.05":53.75769697803745,"0.1":56.93966810127041,"0.2":59.340369550658856,"0.3":61.41101621518208,"0.4":62.86114760947972,"0.5":64.6773580050924,"0.6":66.2763967817339,"0.7":67.85889653834997,"0.8":69.63545421879881,"0.9":72.09644994539626,"0.95":74.96443034849204}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.862492","as_of":"2025-06-09T00:00:00","forecast_date":"2025-07-08T00:00:00","payload":{"point_forecast":64.94599239873651,"quantiles":{"0.05":49.840772846069825,"0.1":53.45172172077322,"0.2":56.288969106202174,"0.3":59.70740628467077,"0.4":62.609459220196584,"0.5":64.94599239873651,"0.6":67.4106985890972,"0.7":69.87328622536145,"0.8":72.83297376924972,"0.9":75.48972987467265,"0.95":78.69297227692148}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.900881","as_of":"2025-06-16T00:00:00","forecast_date":"2025-06-23T00:00:00","payload":{"point_forecast":73.26377822447805,"quantiles":{"0.05":65.99286794759952,"0.1":67.70468441831778,"0.2":69.26972400858264,"0.3":70.8997662855057,"0.4":72.28891385680454,"0.5":73.26377822447805,"0.6":74.24151608277097,"0.7":75.22023386820725,"0.8":76.50482962102392,"0.9":78.30390486538562,"0.95":79.454986636454}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.900881","as_of":"2025-06-16T00:00:00","forecast_date":"2025-06-30T00:00:00","payload":{"point_forecast":73.59863167357233,"quantiles":{"0.05":63.27447387949303,"0.1":65.1944535587463,"0.2":67.91179557801689,"0.3":70.32845571443704,"0.4":71.70679206946761,"0.5":73.59863167357233,"0.6":75.0877521823497,"0.7":76.78949727832963,"0.8":78.97559906953231,"0.9":80.69568804415388,"0.95":82.56021303747923}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.900881","as_of":"2025-06-16T00:00:00","forecast_date":"2025-07-15T00:00:00","payload":{"point_forecast":73.66161817214257,"quantiles":{"0.05":57.832615270194076,"0.1":61.603388739072564,"0.2":65.50756970955102,"0.3":68.61160412015116,"0.4":71.14285425404007,"0.5":73.66161817214257,"0.6":75.46124999420715,"0.7":77.67733295745192,"0.8":81.05287404868892,"0.9":84.09229183799847,"0.95":87.04632951758308}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.937657","as_of":"2025-06-23T00:00:00","forecast_date":"2025-06-30T00:00:00","payload":{"point_forecast":75.17300457752899,"quantiles":{"0.05":67.89972829640332,"0.1":69.76326812833946,"0.2":71.81396099748183,"0.3":73.05420082658723,"0.4":74.11573457806529,"0.5":75.17300457752899,"0.6":76.2220888385087,"0.7":77.26742575649222,"0.8":78.66880828880389,"0.9":80.37243117001077,"0.95":81.72296645185979}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.937657","as_of":"2025-06-23T00:00:00","forecast_date":"2025-07-07T00:00:00","payload":{"point_forecast":74.8691595353722,"quantiles":{"0.05":64.66517584470759,"0.1":67.01891964523436,"0.2":69.9665801351711,"0.3":71.84265571786509,"0.4":73.23632184440166,"0.5":74.8691595353722,"0.6":76.31392211121016,"0.7":77.94194484164406,"0.8":79.81735881969676,"0.9":82.36290612390373,"0.95":84.65637185876083}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.937657","as_of":"2025-06-23T00:00:00","forecast_date":"2025-07-22T00:00:00","payload":{"point_forecast":74.80104847774004,"quantiles":{"0.05":60.352680189489234,"0.1":63.4479890080179,"0.2":67.56817867996288,"0.3":70.30025583089042,"0.4":72.54081413826917,"0.5":74.80104847774004,"0.6":77.07684673822041,"0.7":79.08420758756012,"0.8":82.17196954670013,"0.9":86.24944248132503,"0.95":88.8842333722468}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.974172","as_of":"2025-06-30T00:00:00","forecast_date":"2025-07-07T00:00:00","payload":{"point_forecast":65.7547750916916,"quantiles":{"0.05":59.04807644589783,"0.1":60.397868131787085,"0.2":62.03175907319525,"0.3":63.54500045424085,"0.4":64.50700756708275,"0.5":65.7547750916916,"0.6":66.62377307497182,"0.7":67.78312321902834,"0.8":69.16389434335868,"0.9":71.0938138068088,"0.95":72.62359175847901}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.974172","as_of":"2025-06-30T00:00:00","forecast_date":"2025-07-14T00:00:00","payload":{"point_forecast":64.83245538043727,"quantiles":{"0.05":55.96754125098325,"0.1":58.14150930350155,"0.2":60.16335727647871,"0.3":62.22886911043385,"0.4":63.482073741542294,"0.5":64.83245538043727,"0.6":66.6026111676416,"0.7":67.91449901061311,"0.8":70.30640422421241,"0.9":72.80081971425358,"0.95":74.85301421207143}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:19.974172","as_of":"2025-06-30T00:00:00","forecast_date":"2025-07-29T00:00:00","payload":{"point_forecast":65.22226786468507,"quantiles":{"0.05":51.48544954467653,"0.1":54.233662115844886,"0.2":57.64974824567858,"0.3":60.17662830950945,"0.4":63.115214575525854,"0.5":65.22226786468507,"0.6":67.17025669814825,"0.7":69.50917001392179,"0.8":72.44094480736726,"0.9":75.82965906289155,"0.95":79.1856598497618}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.011378","as_of":"2025-07-07T00:00:00","forecast_date":"2025-07-14T00:00:00","payload":{"point_forecast":66.44818898666114,"quantiles":{"0.05":58.580340844702,"0.1":60.45883740922171,"0.2":62.647434379648836,"0.3":64.09862020862614,"0.4":65.54541567866428,"0.5":66.44818898666114,"0.6":67.64541139307353,"0.7":68.61889705956638,"0.8":69.62189090579739,"0.9":71.84394162022876,"0.95":73.40616016865464}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.011378","as_of":"2025-07-07T00:00:00","forecast_date":"2025-07-21T00:00:00","payload":{"point_forecast":66.93256873749502,"quantiles":{"0.05":56.91473970051225,"0.1":58.69789922941635,"0.2":61.22821081352949,"0.3":63.34727245577003,"0.4":65.36134325729888,"0.5":66.93256873749502,"0.6":68.29583842180112,"0.7":69.98993348700725,"0.8":72.30484967095067,"0.9":74.81145829371972,"0.95":77.6994664825163}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.011378","as_of":"2025-07-07T00:00:00","forecast_date":"2025-08-05T00:00:00","payload":{"point_forecast":66.76924614892272,"quantiles":{"0.05":51.55166005553985,"0.1":54.89501414391625,"0.2":58.41836899585689,"0.3":61.40398723528655,"0.4":64.09670598090597,"0.5":66.76924614892272,"0.6":68.64794182533032,"0.7":71.2097322819558,"0.8":74.21704416874068,"0.9":77.99272358096701,"0.95":83.56402642590187}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.048215","as_of":"2025-07-14T00:00:00","forecast_date":"2025-07-21T00:00:00","payload":{"point_forecast":68.63992277369164,"quantiles":{"0.05":61.78323231744696,"0.1":63.48978024354282,"0.2":65.42483879313733,"0.3":66.80870617769703,"0.4":67.66960554398393,"0.5":68.63992277369164,"0.6":69.58487388099513,"0.7":70.70511383685711,"0.8":72.43033822104795,"0.9":73.8867870683892,"0.95":74.94754290547226}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.048215","as_of":"2025-07-14T00:00:00","forecast_date":"2025-07-28T00:00:00","payload":{"point_forecast":68.7671490843907,"quantiles":{"0.05":58.10586694514443,"0.1":60.02604988439252,"0.2":62.46824435938506,"0.3":64.8892608714224,"0.4":66.96093492707948,"0.5":68.7671490843907,"0.6":70.90830181955559,"0.7":72.1684394685746,"0.8":74.0952966615533,"0.9":76.1708384915114,"0.95":77.52340120050299}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.048215","as_of":"2025-07-14T00:00:00","forecast_date":"2025-08-12T00:00:00","payload":{"point_forecast":69.02752576716813,"quantiles":{"0.05":52.84758587807434,"0.1":57.884526184743045,"0.2":61.5343137087113,"0.3":64.33025585512404,"0.4":66.48709936431565,"0.5":69.02752576716813,"0.6":71.45514604856062,"0.7":73.0803941417533,"0.8":75.47004873856868,"0.9":79.08234753378365,"0.95":81.72151457607039}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.085555","as_of":"2025-07-21T00:00:00","forecast_date":"2025-07-28T00:00:00","payload":{"point_forecast":67.2982175590702,"quantiles":{"0.05":59.997839284753084,"0.1":61.65206857475341,"0.2":63.30929617128935,"0.3":64.98317456827242,"0.4":66.13048766075224,"0.5":67.2982175590702,"0.6":68.71805762853643,"0.7":69.81662246312004,"0.8":71.49996766570183,"0.9":72.90769381735649,"0.95":74.74549597038413}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.085555","as_of":"2025-07-21T00:00:00","forecast_date":"2025-08-04T00:00:00","payload":{"point_forecast":67.25181395839695,"quantiles":{"0.05":56.179605202988206,"0.1":59.36530454123594,"0.2":62.004234406889765,"0.3":64.090442460192,"0.4":65.35790177272825,"0.5":67.25181395839695,"0.6":69.09097116491557,"0.7":70.75650159915867,"0.8":73.15829969849801,"0.9":75.29157729381012,"0.95":78.30141595321243}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.085555","as_of":"2025-07-21T00:00:00","forecast_date":"2025-08-19T00:00:00","payload":{"point_forecast":67.33095415702851,"quantiles":{"0.05":54.225424855932694,"0.1":57.08742939442974,"0.2":60.54109171329202,"0.3":62.96853240245304,"0.4":65.10954772469158,"0.5":67.33095415702851,"0.6":69.59397941743737,"0.7":72.01820220188824,"0.8":75.85597320268857,"0.9":78.67822288047985,"0.95":80.88313148845282}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.122296","as_of":"2025-07-28T00:00:00","forecast_date":"2025-08-04T00:00:00","payload":{"point_forecast":65.06396014322416,"quantiles":{"0.05":58.309149393068125,"0.1":59.66634630670148,"0.2":61.20028526386153,"0.3":62.64389053644349,"0.4":63.94983715416106,"0.5":65.06396014322416,"0.6":66.17644671590826,"0.7":67.23237301194021,"0.8":68.76931134839003,"0.9":70.95998143788583,"0.95":72.02245474163966}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.122296","as_of":"2025-07-28T00:00:00","forecast_date":"2025-08-11T00:00:00","payload":{"point_forecast":65.06803908684023,"quantiles":{"0.05":55.806386581424405,"0.1":57.73900930996799,"0.2":59.90123787767409,"0.3":61.58019660382878,"0.4":63.39999302808002,"0.5":65.06803908684023,"0.6":66.9192609635448,"0.7":68.4291418231225,"0.8":69.95107955261496,"0.9":71.76337202136929,"0.95":73.84107531153744}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.122296","as_of":"2025-07-28T00:00:00","forecast_date":"2025-08-26T00:00:00","payload":{"point_forecast":64.8263381781639,"quantiles":{"0.05":51.41541438308386,"0.1":54.22570212466906,"0.2":57.55389108707654,"0.3":60.214341067941085,"0.4":61.975212992846274,"0.5":64.8263381781639,"0.6":67.36408564500942,"0.7":70.03433229759514,"0.8":73.15878070937269,"0.9":76.3379279282605,"0.95":78.8834712767483}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.158773","as_of":"2025-08-04T00:00:00","forecast_date":"2025-08-11T00:00:00","payload":{"point_forecast":67.45220172643276,"quantiles":{"0.05":59.68496148151029,"0.1":61.766420310697065,"0.2":63.91358417351179,"0.3":65.20594168836901,"0.4":66.34071771280512,"0.5":67.45220172643276,"0.6":68.49889622183784,"0.7":69.5368663311368,"0.8":70.97399486731774,"0.9":72.6563025990657,"0.95":74.15407916876991}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.158773","as_of":"2025-08-04T00:00:00","forecast_date":"2025-08-18T00:00:00","payload":{"point_forecast":67.53247702565103,"quantiles":{"0.05":56.242094718032114,"0.1":58.93753359786791,"0.2":62.18948605330926,"0.3":64.35832511063802,"0.4":65.86910392618269,"0.5":67.53247702565103,"0.6":69.09016740611666,"0.7":70.87946368099921,"0.8":72.68389990188741,"0.9":74.76796297057551,"0.95":77.01084176479053}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.158773","as_of":"2025-08-04T00:00:00","forecast_date":"2025-09-02T00:00:00","payload":{"point_forecast":67.15678612361818,"quantiles":{"0.05":53.104183086164205,"0.1":56.327954836141785,"0.2":60.2652334473431,"0.3":62.63174991247651,"0.4":64.68870964123255,"0.5":67.15678612361818,"0.6":69.52653882902337,"0.7":72.12551401418536,"0.8":75.51050408334706,"0.9":79.23525531541539,"0.95":82.07670360321961}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.195219","as_of":"2025-08-11T00:00:00","forecast_date":"2025-08-18T00:00:00","payload":{"point_forecast":63.861044265150156,"quantiles":{"0.05":56.5892432183263,"0.1":58.40573265899781,"0.2":60.19352829317507,"0.3":61.74632684375629,"0.4":62.512325771210534,"0.5":63.861044265150156,"0.6":64.76833352101644,"0.7":66.02358859465659,"0.8":67.51023050696213,"0.9":69.46343520233735,"0.95":70.38663592884144}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.195219","as_of":"2025-08-11T00:00:00","forecast_date":"2025-08-25T00:00:00","payload":{"point_forecast":63.78276848511955,"quantiles":{"0.05":52.58315617887367,"0.1":55.55592919624658,"0.2":58.157050996683616,"0.3":60.145355381999515,"0.4":62.016894032011706,"0.5":63.78276848511955,"0.6":65.68640755414675,"0.7":67.20291159185577,"0.8":69.07009045601943,"0.9":72.11039510221394,"0.95":75.30233127814246}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.195219","as_of":"2025-08-11T00:00:00","forecast_date":"2025-09-09T00:00:00","payload":{"point_forecast":63.62631120075858,"quantiles":{"0.05":49.11446946259364,"0.1":52.53932945999558,"0.2":56.95350644593195,"0.3":59.62162513520438,"0.4":62.21875565076915,"0.5":63.62631120075858,"0.6":66.38405047402198,"0.7":68.93086295299942,"0.8":72.00757334977088,"0.9":75.38440410172653,"0.95":77.93658582176482}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.232069","as_of":"2025-08-18T00:00:00","forecast_date":"2025-08-25T00:00:00","payload":{"point_forecast":62.66288390415383,"quantiles":{"0.05":55.816827783063545,"0.1":57.6733508937379,"0.2":59.29768189427421,"0.3":60.40696772881973,"0.4":61.52873055678874,"0.5":62.66288390415383,"0.6":63.60698832329353,"0.7":64.81897018951969,"0.8":66.35918310782519,"0.9":68.12151348433477,"0.95":69.54792731078035}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.232069","as_of":"2025-08-18T00:00:00","forecast_date":"2025-09-16T00:00:00","payload":{"point_forecast":62.51267584571779,"quantiles":{"0.05":48.68435088108201,"0.1":51.27365331535361,"0.2":54.76499909769026,"0.3":58.15093828027979,"0.4":60.21985516907881,"0.5":62.51267584571779,"0.6":65.51413649921541,"0.7":67.22201197143131,"0.8":70.43180943752058,"0.9":74.05254308862315,"0.95":77.14117255762106}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.269376","as_of":"2025-08-25T00:00:00","forecast_date":"2025-09-08T00:00:00","payload":{"point_forecast":63.51610021751887,"quantiles":{"0.05":54.28889825385314,"0.1":55.93910053150722,"0.2":58.46437304554443,"0.3":60.328629121899304,"0.4":62.014472395481015,"0.5":63.51610021751887,"0.6":64.9806686658286,"0.7":66.58402710897018,"0.8":68.5947729526141,"0.9":71.87687845287256,"0.95":74.77263806963194}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.269376","as_of":"2025-08-25T00:00:00","forecast_date":"2025-09-23T00:00:00","payload":{"point_forecast":62.94400044455489,"quantiles":{"0.05":47.41738377245813,"0.1":51.22309796079071,"0.2":55.215461017693166,"0.3":58.28960884543948,"0.4":60.78999178076116,"0.5":62.94400044455489,"0.6":65.49004461226733,"0.7":67.65062207019832,"0.8":69.84482264626031,"0.9":73.99365932723872,"0.95":76.91451907599084}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.306732","as_of":"2025-09-01T00:00:00","forecast_date":"2025-09-08T00:00:00","payload":{"point_forecast":64.2233248495199,"quantiles":{"0.05":56.68735159160959,"0.1":58.67297531032016,"0.2":60.92076584752751,"0.3":62.25035832492945,"0.4":63.30042066423976,"0.5":64.2233248495199,"0.6":65.1220650393619,"0.7":65.99313504081456,"0.8":67.45280445480171,"0.9":69.18348757385975,"0.95":70.53975801879878}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.306732","as_of":"2025-09-01T00:00:00","forecast_date":"2025-09-15T00:00:00","payload":{"point_forecast":64.0163591480717,"quantiles":{"0.05":54.46964950980343,"0.1":56.234454683083456,"0.2":58.603229581087966,"0.3":60.671472332230785,"0.4":62.257734815404014,"0.5":64.0163591480717,"0.6":66.00794716819357,"0.7":67.30608594050692,"0.8":68.89375013142093,"0.9":71.36225765388608,"0.95":73.4130575212308}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.306732","as_of":"2025-09-01T00:00:00","forecast_date":"2025-09-30T00:00:00","payload":{"point_forecast":63.79359610596843,"quantiles":{"0.05":49.06514597622246,"0.1":52.21335531462145,"0.2":56.635358189330724,"0.3":59.27149721666101,"0.4":61.65980831447243,"0.5":63.79359610596843,"0.6":66.47681239771812,"0.7":69.10781371602727,"0.8":71.70063315408089,"0.9":74.97739470104295,"0.95":78.24176793295238}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.343675","as_of":"2025-09-08T00:00:00","forecast_date":"2025-09-15T00:00:00","payload":{"point_forecast":61.609078629176295,"quantiles":{"0.05":55.14416046632252,"0.1":56.41132289650029,"0.2":58.094681036398896,"0.3":59.32068700621303,"0.4":60.28725757063681,"0.5":61.609078629176295,"0.6":63.05802365496884,"0.7":64.24376711942851,"0.8":65.71320392621314,"0.9":67.49096579601958,"0.95":69.3343504700638}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.343675","as_of":"2025-09-08T00:00:00","forecast_date":"2025-09-22T00:00:00","payload":{"point_forecast":61.86140055728127,"quantiles":{"0.05":50.52950082090016,"0.1":54.032878017849654,"0.2":56.46127612000976,"0.3":58.351106240106766,"0.4":59.99236995379495,"0.5":61.86140055728127,"0.6":63.48691711149231,"0.7":64.85699213212331,"0.8":66.53611684500235,"0.9":69.33880585698294,"0.95":71.64125451009929}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.343675","as_of":"2025-09-08T00:00:00","forecast_date":"2025-10-07T00:00:00","payload":{"point_forecast":62.45719229474905,"quantiles":{"0.05":48.1055417203344,"0.1":51.853176339989076,"0.2":55.54629285028219,"0.3":57.878723902504284,"0.4":59.877268232588555,"0.5":62.45719229474905,"0.6":64.41432319575529,"0.7":66.84703932763325,"0.8":69.18089354175653,"0.9":72.10382784278048,"0.95":75.81462094480815}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.380400","as_of":"2025-09-15T00:00:00","forecast_date":"2025-09-22T00:00:00","payload":{"point_forecast":62.49880112126475,"quantiles":{"0.05":56.08930639296613,"0.1":57.34820772774647,"0.2":58.89801149313099,"0.3":60.24335853742699,"0.4":61.303428835069035,"0.5":62.49880112126475,"0.6":63.64776539472213,"0.7":64.6331988095092,"0.8":65.99515546236609,"0.9":67.70879337044109,"0.95":69.24224761880599}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.380400","as_of":"2025-09-15T00:00:00","forecast_date":"2025-09-29T00:00:00","payload":{"point_forecast":62.42301070024675,"quantiles":{"0.05":53.03827561838033,"0.1":55.23063069435691,"0.2":57.548459538527105,"0.3":59.61121840926782,"0.4":60.781181311483266,"0.5":62.42301070024675,"0.6":64.05331086709865,"0.7":65.58881479097569,"0.8":67.6942468079193,"0.9":70.0193756016162,"0.95":72.27305842550935}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.380400","as_of":"2025-09-15T00:00:00","forecast_date":"2025-10-14T00:00:00","payload":{"point_forecast":63.45316000700699,"quantiles":{"0.05":48.1570311650626,"0.1":51.63666705044304,"0.2":55.30305307147789,"0.3":58.47941678110724,"0.4":61.06730480200687,"0.5":63.45316000700699,"0.6":65.46511766878757,"0.7":67.3790271005977,"0.8":70.26151188446248,"0.9":73.56939988203615,"0.95":75.94967934446699}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.417116","as_of":"2025-09-22T00:00:00","forecast_date":"2025-09-29T00:00:00","payload":{"point_forecast":62.731058090408254,"quantiles":{"0.05":55.24903636897334,"0.1":57.227329994624085,"0.2":58.631498453911064,"0.3":60.198343245534836,"0.4":61.49390132998157,"0.5":62.731058090408254,"0.6":63.76465942682938,"0.7":64.74831234931473,"0.8":66.13500115541542,"0.9":68.25311436721489,"0.95":69.52833447255516}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.417116","as_of":"2025-09-22T00:00:00","forecast_date":"2025-10-06T00:00:00","payload":{"point_forecast":62.738725746745075,"quantiles":{"0.05":52.41381336570663,"0.1":54.55247364417292,"0.2":56.959746071897875,"0.3":58.85532502956241,"0.4":60.78351679222973,"0.5":62.738725746745075,"0.6":64.36449256543567,"0.7":65.97676307431719,"0.8":67.96061938989057,"0.9":70.87476001619044,"0.95":72.70223248502867}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.417116","as_of":"2025-09-22T00:00:00","forecast_date":"2025-10-21T00:00:00","payload":{"point_forecast":62.308119306843835,"quantiles":{"0.05":47.186099715837415,"0.1":51.39827794415509,"0.2":54.90607468349641,"0.3":57.47781624127801,"0.4":60.142802923664554,"0.5":62.308119306843835,"0.6":64.56327806980485,"0.7":67.20407415215216,"0.8":70.49191085409154,"0.9":73.62035326027731,"0.95":77.41173119258087}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.452873","as_of":"2025-09-29T00:00:00","forecast_date":"2025-10-06T00:00:00","payload":{"point_forecast":65.1721843790198,"quantiles":{"0.05":57.02734936136384,"0.1":59.69948731320884,"0.2":61.397703519133216,"0.3":62.790841806657255,"0.4":63.91093868014435,"0.5":65.1721843790198,"0.6":66.54332831495078,"0.7":67.78840332995614,"0.8":69.12101654956672,"0.9":70.94952973239458,"0.95":72.78856942945154}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.452873","as_of":"2025-09-29T00:00:00","forecast_date":"2025-10-13T00:00:00","payload":{"point_forecast":65.8972000770163,"quantiles":{"0.05":56.673806259381365,"0.1":58.66657846323779,"0.2":61.23291620231374,"0.3":63.08024614613575,"0.4":64.39909207122061,"0.5":65.8972000770163,"0.6":67.71846101712318,"0.7":69.46481070547351,"0.8":71.57371101679841,"0.9":74.112561228341,"0.95":77.48263628655683}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.452873","as_of":"2025-09-29T00:00:00","forecast_date":"2025-10-28T00:00:00","payload":{"point_forecast":65.31430729477464,"quantiles":{"0.05":48.57645513068685,"0.1":53.49539942881438,"0.2":58.107893021530536,"0.3":61.255638969351246,"0.4":63.320726888142715,"0.5":65.31430729477464,"0.6":68.03620255876211,"0.7":70.84350790905638,"0.8":73.87248225483735,"0.9":77.71676698423975,"0.95":79.33672311053542}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.488963","as_of":"2025-10-06T00:00:00","forecast_date":"2025-10-13T00:00:00","payload":{"point_forecast":61.31680490902265,"quantiles":{"0.05":54.060459469792235,"0.1":55.67926966199758,"0.2":57.18342206167782,"0.3":58.79827639375215,"0.4":59.984673389192025,"0.5":61.31680490902265,"0.6":62.296343170570324,"0.7":63.569909159683256,"0.8":64.74065584510646,"0.9":66.10016455840807,"0.95":67.97603773539726}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.488963","as_of":"2025-10-06T00:00:00","forecast_date":"2025-10-20T00:00:00","payload":{"point_forecast":60.8249150627762,"quantiles":{"0.05":51.1524744967769,"0.1":53.228642322645555,"0.2":55.43161206867745,"0.3":57.55645489765682,"0.4":59.38521730742524,"0.5":60.8249150627762,"0.6":62.496513751475284,"0.7":64.27493561054605,"0.8":66.45446195514934,"0.9":69.35408361104615,"0.95":71.68367866734988}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.488963","as_of":"2025-10-06T00:00:00","forecast_date":"2025-11-04T00:00:00","payload":{"point_forecast":61.372250612525725,"quantiles":{"0.05":47.52276048379804,"0.1":50.18258697672593,"0.2":53.83836477633907,"0.3":56.954743773958164,"0.4":59.38778444446891,"0.5":61.372250612525725,"0.6":63.22953877112251,"0.7":65.33133577068475,"0.8":68.33216525182735,"0.9":71.555642146815,"0.95":75.17716237932814}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.525409","as_of":"2025-10-13T00:00:00","forecast_date":"2025-10-20T00:00:00","payload":{"point_forecast":59.09514755247197,"quantiles":{"0.05":52.03333351991812,"0.1":52.943238407867774,"0.2":55.021044589169165,"0.3":56.57829904170278,"0.4":57.8295762675939,"0.5":59.09514755247197,"0.6":60.203872713448874,"0.7":61.11646839098547,"0.8":62.71194355500136,"0.9":64.2423001443887,"0.95":65.68016368249316}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.525409","as_of":"2025-10-13T00:00:00","forecast_date":"2025-10-27T00:00:00","payload":{"point_forecast":58.784412878141865,"quantiles":{"0.05":48.25690606401172,"0.1":51.04625662618699,"0.2":53.40785845758442,"0.3":55.27730496055346,"0.4":57.09857749115983,"0.5":58.784412878141865,"0.6":60.45554271497663,"0.7":62.15985226583446,"0.8":64.36252139196472,"0.9":66.82434068894842,"0.95":69.55260488049508}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.525409","as_of":"2025-10-13T00:00:00","forecast_date":"2025-11-11T00:00:00","payload":{"point_forecast":58.60366773291503,"quantiles":{"0.05":44.01161901748328,"0.1":48.0618032037203,"0.2":51.493082911912644,"0.3":54.49059167756522,"0.4":56.575785415008106,"0.5":58.60366773291503,"0.6":60.60203264900459,"0.7":62.66215421158794,"0.8":65.10530552882655,"0.9":68.71931627869198,"0.95":71.86379027166134}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.561460","as_of":"2025-10-20T00:00:00","forecast_date":"2025-10-27T00:00:00","payload":{"point_forecast":57.65382262476332,"quantiles":{"0.05":51.5120530260177,"0.1":52.58520519552495,"0.2":54.42253893393565,"0.3":55.64806296884075,"0.4":56.61183572523716,"0.5":57.65382262476332,"0.6":58.62517595876249,"0.7":59.68772733810354,"0.8":61.10312373043642,"0.9":63.172573390530516,"0.95":64.35649059126577}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.561460","as_of":"2025-10-20T00:00:00","forecast_date":"2025-11-03T00:00:00","payload":{"point_forecast":57.75038095500746,"quantiles":{"0.05":46.8980421711304,"0.1":49.34664993957199,"0.2":51.723802111676925,"0.3":54.05437953887037,"0.4":56.04287553660859,"0.5":57.75038095500746,"0.6":59.0994284934686,"0.7":60.947135074517405,"0.8":62.835114445341304,"0.9":64.87882943418865,"0.95":68.59080554815674}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.561460","as_of":"2025-10-20T00:00:00","forecast_date":"2025-11-18T00:00:00","payload":{"point_forecast":57.94324073625181,"quantiles":{"0.05":44.28774616328778,"0.1":47.39827891505581,"0.2":51.20233290555772,"0.3":53.69515900742394,"0.4":55.54944984346764,"0.5":57.94324073625181,"0.6":59.831749161526176,"0.7":62.104770581874284,"0.8":65.28299962094921,"0.9":67.97364880664917,"0.95":70.70949212322743}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.598379","as_of":"2025-10-27T00:00:00","forecast_date":"2025-11-03T00:00:00","payload":{"point_forecast":61.87704601450989,"quantiles":{"0.05":54.604179938582725,"0.1":55.99875027521574,"0.2":57.34197268822477,"0.3":59.16687685693856,"0.4":60.53383362116467,"0.5":61.87704601450989,"0.6":62.910101836643165,"0.7":63.966468153836395,"0.8":65.44978004151137,"0.9":66.7144429321575,"0.95":68.3292294341153}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.598379","as_of":"2025-10-27T00:00:00","forecast_date":"2025-11-10T00:00:00","payload":{"point_forecast":61.13379789126919,"quantiles":{"0.05":51.38247412465876,"0.1":53.927402841533926,"0.2":56.384829141095096,"0.3":58.12089085237822,"0.4":59.58262730387091,"0.5":61.13379789126919,"0.6":62.905707192423804,"0.7":64.76562423524469,"0.8":66.65801007035515,"0.9":69.3283826700061,"0.95":70.8537022784792}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.598379","as_of":"2025-10-27T00:00:00","forecast_date":"2025-11-25T00:00:00","payload":{"point_forecast":61.89882480546862,"quantiles":{"0.05":45.61715242149206,"0.1":50.14253220123992,"0.2":54.524135982408005,"0.3":57.324652514447074,"0.4":59.56495405313967,"0.5":61.89882480546862,"0.6":64.0075983937654,"0.7":66.28867530285704,"0.8":68.90833140445605,"0.9":72.12018240071572,"0.95":75.32975549603361}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.675272","as_of":"2025-11-03T00:00:00","forecast_date":"2025-11-10T00:00:00","payload":{"point_forecast":60.624983390087266,"quantiles":{"0.05":54.38130306272949,"0.1":55.236371511177424,"0.2":57.204765903102235,"0.3":58.52171785549745,"0.4":59.61124154999118,"0.5":60.624983390087266,"0.6":62.28670527839202,"0.7":63.28367874543714,"0.8":64.78336735614917,"0.9":66.2975607989494,"0.95":67.78789207017208}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.675272","as_of":"2025-11-03T00:00:00","forecast_date":"2025-11-17T00:00:00","payload":{"point_forecast":60.62323123602162,"quantiles":{"0.05":50.91434736191001,"0.1":53.57341569646551,"0.2":55.41655471727177,"0.3":57.47448048216972,"0.4":59.04763513162219,"0.5":60.62323123602162,"0.6":62.25613940032537,"0.7":63.754726619192546,"0.8":65.54892045807212,"0.9":68.32259009800413,"0.95":70.63124807425939}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.675272","as_of":"2025-11-03T00:00:00","forecast_date":"2025-12-02T00:00:00","payload":{"point_forecast":61.33200740672578,"quantiles":{"0.05":46.99912272104898,"0.1":49.22264266448273,"0.2":52.64773719474935,"0.3":55.965690668152796,"0.4":58.45720477162719,"0.5":61.33200740672578,"0.6":63.26787831941366,"0.7":65.27395276851927,"0.8":68.17309882597354,"0.9":72.49958995820722,"0.95":75.37697102080405}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.712912","as_of":"2025-11-10T00:00:00","forecast_date":"2025-11-17T00:00:00","payload":{"point_forecast":59.60033279705006,"quantiles":{"0.05":53.00101656199584,"0.1":54.21165981656911,"0.2":56.18976092798646,"0.3":57.39671810867577,"0.4":58.66852514233413,"0.5":59.60033279705006,"0.6":60.817149879138306,"0.7":62.21982514416743,"0.8":63.629599883309304,"0.9":65.33037245816897,"0.95":66.62237644867244}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.712912","as_of":"2025-11-10T00:00:00","forecast_date":"2025-11-24T00:00:00","payload":{"point_forecast":60.00267868738996,"quantiles":{"0.05":50.57864599505556,"0.1":52.309650702509494,"0.2":54.88421921678247,"0.3":56.7450632939695,"0.4":58.48073405407224,"0.5":60.00267868738996,"0.6":61.53604775718482,"0.7":63.14563763644716,"0.8":65.12860131952777,"0.9":67.61021413281873,"0.95":69.41578157002235}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.712912","as_of":"2025-11-10T00:00:00","forecast_date":"2025-12-09T00:00:00","payload":{"point_forecast":58.95737509645275,"quantiles":{"0.05":43.513791041284655,"0.1":47.52866482514823,"0.2":51.84707770742207,"0.3":55.040036917698274,"0.4":56.98959560755751,"0.5":58.95737509645275,"0.6":61.33280879380727,"0.7":63.74589747409177,"0.8":66.88013323161401,"0.9":70.14963885653927,"0.95":72.77593830003104}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.750136","as_of":"2025-11-17T00:00:00","forecast_date":"2025-11-24T00:00:00","payload":{"point_forecast":60.003451617531624,"quantiles":{"0.05":53.52468803702608,"0.1":54.77032936088628,"0.2":56.147951459096475,"0.3":57.856096557703,"0.4":59.12861755631,"0.5":60.003451617531624,"0.6":61.14360359341722,"0.7":62.18160747260179,"0.8":63.42966347222379,"0.9":65.7542086809182,"0.95":66.83128310654848}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.750136","as_of":"2025-11-17T00:00:00","forecast_date":"2025-12-01T00:00:00","payload":{"point_forecast":60.17224515957075,"quantiles":{"0.05":50.120668094863184,"0.1":52.548805512989226,"0.2":54.7180470622055,"0.3":56.914309861347334,"0.4":58.29768864232582,"0.5":60.17224515957075,"0.6":62.021712143046585,"0.7":63.2041428082265,"0.8":65.50117117960117,"0.9":68.79840385725475,"0.95":70.49388327821875}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.750136","as_of":"2025-11-17T00:00:00","forecast_date":"2025-12-16T00:00:00","payload":{"point_forecast":60.04241263787104,"quantiles":{"0.05":46.55608893641318,"0.1":49.93430895362998,"0.2":53.1416244469093,"0.3":55.604940287282716,"0.4":58.16450354750046,"0.5":60.04241263787104,"0.6":62.30119759922213,"0.7":64.69721765986557,"0.8":67.05480601213775,"0.9":70.40564111868126,"0.95":73.56360612073411}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.787542","as_of":"2025-11-24T00:00:00","forecast_date":"2025-12-01T00:00:00","payload":{"point_forecast":57.79484226399893,"quantiles":{"0.05":50.58194964137175,"0.1":52.00470092438123,"0.2":54.29348214960064,"0.3":55.49709903066394,"0.4":56.63150619279039,"0.5":57.79484226399893,"0.6":59.08016116150368,"0.7":60.238193599007374,"0.8":61.52973785314778,"0.9":63.510001224605716,"0.95":65.11742675511547}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.787542","as_of":"2025-11-24T00:00:00","forecast_date":"2025-12-08T00:00:00","payload":{"point_forecast":57.726000454841355,"quantiles":{"0.05":48.525017606032804,"0.1":51.03403905164545,"0.2":53.14461734087678,"0.3":55.29036831982342,"0.4":56.55866806690557,"0.5":57.726000454841355,"0.6":59.50988584759761,"0.7":61.08659939184494,"0.8":62.6514556109424,"0.9":65.59139188878461,"0.95":68.36709000525542}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.787542","as_of":"2025-11-24T00:00:00","forecast_date":"2025-12-23T00:00:00","payload":{"point_forecast":57.94865996324758,"quantiles":{"0.05":43.25849631416199,"0.1":46.35839893108661,"0.2":49.838853071594535,"0.3":53.01983726488515,"0.4":55.42924745771082,"0.5":57.94865996324758,"0.6":60.13307810455704,"0.7":62.343397822061995,"0.8":64.9388280838263,"0.9":68.88737671376369,"0.95":72.15374500242096}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.824811","as_of":"2025-12-01T00:00:00","forecast_date":"2025-12-08T00:00:00","payload":{"point_forecast":58.82098161303345,"quantiles":{"0.05":51.6757374250239,"0.1":53.32460335795571,"0.2":55.14562364152101,"0.3":56.632760979675744,"0.4":58.03949005115638,"0.5":58.82098161303345,"0.6":59.92991504175742,"0.7":60.96903012665181,"0.8":62.67173142210672,"0.9":64.02126395274813,"0.95":65.91025593638943}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.824811","as_of":"2025-12-01T00:00:00","forecast_date":"2025-12-15T00:00:00","payload":{"point_forecast":58.07586817606054,"quantiles":{"0.05":48.16055210090203,"0.1":50.689650159217294,"0.2":52.985998208610965,"0.3":54.89787893934039,"0.4":56.23282123194919,"0.5":58.07586817606054,"0.6":59.29153903236238,"0.7":61.04996144870761,"0.8":63.177730336616996,"0.9":65.32172114484489,"0.95":67.23357823951805}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.824811","as_of":"2025-12-01T00:00:00","forecast_date":"2025-12-30T00:00:00","payload":{"point_forecast":58.86094051720018,"quantiles":{"0.05":44.955082398572884,"0.1":47.65107651173558,"0.2":51.21992983840243,"0.3":54.59337254810742,"0.4":56.351069562728846,"0.5":58.86094051720018,"0.6":61.45624327006673,"0.7":63.28195857043944,"0.8":66.14142878567742,"0.9":69.41345197487215,"0.95":72.19307782795097}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.862185","as_of":"2025-12-08T00:00:00","forecast_date":"2025-12-15T00:00:00","payload":{"point_forecast":60.57009822459476,"quantiles":{"0.05":53.625754691383804,"0.1":55.03268611327565,"0.2":56.88669007957307,"0.3":57.89351347573175,"0.4":59.28157890182228,"0.5":60.57009822459476,"0.6":61.566057997321984,"0.7":62.64499229144876,"0.8":64.33229587619687,"0.9":66.2521802865861,"0.95":67.16193107306644}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.862185","as_of":"2025-12-08T00:00:00","forecast_date":"2025-12-22T00:00:00","payload":{"point_forecast":60.60487204971581,"quantiles":{"0.05":50.46948653056272,"0.1":53.038610727951045,"0.2":55.06620606205682,"0.3":57.08887592761351,"0.4":58.775293839415376,"0.5":60.60487204971581,"0.6":61.9995024264006,"0.7":63.72928685632514,"0.8":65.85277150872881,"0.9":68.16748243667713,"0.95":69.95659984953969}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.862185","as_of":"2025-12-08T00:00:00","forecast_date":"2026-01-06T00:00:00","payload":{"point_forecast":59.99477637384158,"quantiles":{"0.05":45.3748877035218,"0.1":49.22555921284082,"0.2":52.75327928497272,"0.3":55.24118332864046,"0.4":57.52984080662163,"0.5":59.99477637384158,"0.6":62.60186198736041,"0.7":64.5834408332585,"0.8":67.86985482963644,"0.9":71.51500977314991,"0.95":73.42011062422135}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.899367","as_of":"2025-12-15T00:00:00","forecast_date":"2025-12-22T00:00:00","payload":{"point_forecast":57.32299729031905,"quantiles":{"0.05":50.42497629395935,"0.1":51.546757618704625,"0.2":53.37409645771291,"0.3":54.76615438278936,"0.4":55.97639958391711,"0.5":57.32299729031905,"0.6":58.416588623254135,"0.7":59.55703195596739,"0.8":61.219264146772176,"0.9":63.145364190602464,"0.95":64.93751504400772}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.899367","as_of":"2025-12-15T00:00:00","forecast_date":"2025-12-29T00:00:00","payload":{"point_forecast":57.59957333164523,"quantiles":{"0.05":47.478556961865515,"0.1":50.03402692358805,"0.2":52.82674849381492,"0.3":54.473224754896556,"0.4":56.12049704827318,"0.5":57.59957333164523,"0.6":58.95364998550857,"0.7":61.02548610383259,"0.8":63.13274239971331,"0.9":65.74278770223097,"0.95":67.25529503265682}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.899367","as_of":"2025-12-15T00:00:00","forecast_date":"2026-01-13T00:00:00","payload":{"point_forecast":57.24199642753163,"quantiles":{"0.05":41.70618702550256,"0.1":46.632588040187805,"0.2":50.71246173143043,"0.3":53.11106143819335,"0.4":55.45235402997608,"0.5":57.24199642753163,"0.6":59.53255405176859,"0.7":62.1118403310809,"0.8":65.20543544408868,"0.9":69.70027079090309,"0.95":73.75566763185932}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.936220","as_of":"2025-12-22T00:00:00","forecast_date":"2025-12-29T00:00:00","payload":{"point_forecast":56.47459504122693,"quantiles":{"0.05":49.19412782690346,"0.1":51.044540555308416,"0.2":52.3820477536203,"0.3":53.98975720471506,"0.4":55.215563478019114,"0.5":56.47459504122693,"0.6":57.78585437661241,"0.7":59.14494193053734,"0.8":60.629862878445394,"0.9":62.72281661643346,"0.95":64.18930150747416}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.936220","as_of":"2025-12-22T00:00:00","forecast_date":"2026-01-05T00:00:00","payload":{"point_forecast":56.9768162258314,"quantiles":{"0.05":47.14482194672344,"0.1":49.657341226048125,"0.2":51.82958194336556,"0.3":53.72005841633327,"0.4":55.206933038493965,"0.5":56.9768162258314,"0.6":58.63917381933086,"0.7":60.04618025259135,"0.8":62.12100931179543,"0.9":64.10333694840546,"0.95":65.84144888020919}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:20.936220","as_of":"2025-12-22T00:00:00","forecast_date":"2026-01-20T00:00:00","payload":{"point_forecast":56.61346936718535,"quantiles":{"0.05":44.2027379493987,"0.1":46.51688619247766,"0.2":49.73614408304166,"0.3":52.48204650273595,"0.4":54.52565783982262,"0.5":56.61346936718535,"0.6":58.72123954875116,"0.7":60.88884521591259,"0.8":63.04836946774913,"0.9":67.41849762341035,"0.95":70.01784189995146}},"metadata":{}}],"scores":[2.788544245712532,2.526967394150948,2.1330261502981123,2.8117695154529234,2.959067241711675,2.778470777167786,3.7057505670723905,1.3856091218013413,2.018747997281983,3.9188793011534266,1.1605342933579996,3.4193691302416704,1.6277679374947316,3.093307445270043,1.187000431516004,1.8474978216081759,3.048146301975465,1.4943598396445554,2.5772895138583305,2.5794574402696675,2.1628685144621334,1.986074910905964,2.38599582611258,1.1289012659141806,1.941764636764677,4.488441562826934,1.5703156195902108,2.648224349655257,3.589591733430066,1.8107076132560047,4.219895318711169,3.0815757291344914,5.898428380595285,4.714806611364325,5.264942822239969,1.2416973951274648,1.6387570871306936,2.6424880969004656,1.3258758682490446,1.6948834681701719,2.496828314755124,1.7279260201982471,4.719240423114635,2.507238217324109,3.4656405414113673,1.6919888469157183,2.3649822331294215,2.1223969563679947,2.5681161030784576,3.6079170665095126,1.2885244429321103,2.9398516075249894,1.7546397044019328,8.070193812783529,1.2156871541876364,2.519461174063274,2.67845904595357,2.8593786891137456,7.481989958673911,3.429002714440574,4.667401613787003,2.47642672273396,2.8884903817462213,2.7600685000332974,5.070844729538482,4.157096508426347,7.629746655222999,4.211764263426534,5.172825600529374,1.53667396628954,1.7635416609425192,2.950468850462455,1.159051835098995,1.6558627461109054,2.5421642630362307,1.2402121490545555,1.9885698540194656,3.5623483887069805,1.2649632899179064,1.789346590413274,3.312565378646668,1.2692797143464776,1.670755811729782,2.5323032632460247,2.0692700270467714,2.6043837398341383,2.488861770082465,1.1458712435725418,1.8228583926866115,2.365614912367571,1.4853393813269686,2.5483811510382157,1.679749969534626,2.346356934165365,1.364663272635304,1.6847403729724097,2.4848093892515744,1.3954031255835644,1.6773591210825853,2.2168996703492794,1.1000124784609338,1.6274312829585211,3.096084043973489,1.1989185183868492,1.80061563155266,3.1666124523650456,2.1337654897853007,4.043187550920444,3.6585869885141937,1.3896570449419134,2.291269747769841,2.201564002742057,1.349352475347344,2.0526722955168966,2.3781649031407106,2.1812614966090407,2.3229379994051524,2.5347528085323545,1.2437374529117757,1.6901048761758017,2.886483687768067,1.2176931360567844,1.614132721265784,2.594227133533419,1.162664479518612,1.6615871403950462,2.314887732279848,1.2415520068576746,1.7351849012395317,3.1603957668099274,1.3430693611661695,1.577495095350081,2.349803379940885,1.0906773731306831,1.6391362875902291,2.346443135325585,2.1382947890919257,1.980887784014711,2.6599127941657112,1.2528020877741597,1.612247184358568,2.9092276890941013,1.443129812743821,1.6813205701071625,2.71316911953155],"metric":"crps","mean_score":2.472053187755704,"ran_at":"2026-06-02T11:12:20.944411","skipped_origins":0} diff --git a/implementations/energy_oil_forecasting/adaptive_agent/curriculum/backtest_Naive (Last Value).json b/implementations/energy_oil_forecasting/adaptive_agent/curriculum/backtest_Naive (Last Value).json index f0d805b6..5ad64376 100644 --- a/implementations/energy_oil_forecasting/adaptive_agent/curriculum/backtest_Naive (Last Value).json +++ b/implementations/energy_oil_forecasting/adaptive_agent/curriculum/backtest_Naive (Last Value).json @@ -1 +1 @@ -{"spec":{"task":{"task_id":"wti_oil_price_forecast","target_series_id":"wti_crude_oil_price","horizons":[5,10,21],"frequency":"B","description":"WTI Crude Oil continuous front-month futures Close price (yfinance symbol: CL=F), projected 5, 10, and 21 trading days ahead.","resolution_fn":"observed_value_at_resolution_timestamp"},"start":"2025-01-06T00:00:00","end":"2025-12-22T00:00:00","stride":5,"warmup":250,"description":"Weekly rolling backtest in 2025 for daily WTI crude oil price forecasting. Evaluates trajectory forecasts (5, 10, 21 business days) with CRPS/MAE and binary up-shock forecasts (climb > $5 in 5 business days) with Brier Score. Used to select the top contender models."},"predictor_id":"last_value_naive","predictions":[{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.649393","as_of":"2025-01-06T00:00:00","forecast_date":"2025-01-13T00:00:00","payload":{"point_forecast":73.95999908447266,"quantiles":{"0.05":73.95999908447266,"0.1":73.95999908447266,"0.2":73.95999908447266,"0.3":73.95999908447266,"0.4":73.95999908447266,"0.5":73.95999908447266,"0.6":73.95999908447266,"0.7":73.95999908447266,"0.8":73.95999908447266,"0.9":73.95999908447266,"0.95":73.95999908447266}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.649393","as_of":"2025-01-06T00:00:00","forecast_date":"2025-02-04T00:00:00","payload":{"point_forecast":73.95999908447266,"quantiles":{"0.05":73.95999908447266,"0.1":73.95999908447266,"0.2":73.95999908447266,"0.3":73.95999908447266,"0.4":73.95999908447266,"0.5":73.95999908447266,"0.6":73.95999908447266,"0.7":73.95999908447266,"0.8":73.95999908447266,"0.9":73.95999908447266,"0.95":73.95999908447266}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.660855","as_of":"2025-01-13T00:00:00","forecast_date":"2025-01-27T00:00:00","payload":{"point_forecast":76.56999969482422,"quantiles":{"0.05":76.56999969482422,"0.1":76.56999969482422,"0.2":76.56999969482422,"0.3":76.56999969482422,"0.4":76.56999969482422,"0.5":76.56999969482422,"0.6":76.56999969482422,"0.7":76.56999969482422,"0.8":76.56999969482422,"0.9":76.56999969482422,"0.95":76.56999969482422}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.660855","as_of":"2025-01-13T00:00:00","forecast_date":"2025-02-11T00:00:00","payload":{"point_forecast":76.56999969482422,"quantiles":{"0.05":76.56999969482422,"0.1":76.56999969482422,"0.2":76.56999969482422,"0.3":76.56999969482422,"0.4":76.56999969482422,"0.5":76.56999969482422,"0.6":76.56999969482422,"0.7":76.56999969482422,"0.8":76.56999969482422,"0.9":76.56999969482422,"0.95":76.56999969482422}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.671201","as_of":"2025-01-20T00:00:00","forecast_date":"2025-01-27T00:00:00","payload":{"point_forecast":77.87999725341797,"quantiles":{"0.05":77.87999725341797,"0.1":77.87999725341797,"0.2":77.87999725341797,"0.3":77.87999725341797,"0.4":77.87999725341797,"0.5":77.87999725341797,"0.6":77.87999725341797,"0.7":77.87999725341797,"0.8":77.87999725341797,"0.9":77.87999725341797,"0.95":77.87999725341797}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.671201","as_of":"2025-01-20T00:00:00","forecast_date":"2025-02-03T00:00:00","payload":{"point_forecast":77.87999725341797,"quantiles":{"0.05":77.87999725341797,"0.1":77.87999725341797,"0.2":77.87999725341797,"0.3":77.87999725341797,"0.4":77.87999725341797,"0.5":77.87999725341797,"0.6":77.87999725341797,"0.7":77.87999725341797,"0.8":77.87999725341797,"0.9":77.87999725341797,"0.95":77.87999725341797}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.671201","as_of":"2025-01-20T00:00:00","forecast_date":"2025-02-18T00:00:00","payload":{"point_forecast":77.87999725341797,"quantiles":{"0.05":77.87999725341797,"0.1":77.87999725341797,"0.2":77.87999725341797,"0.3":77.87999725341797,"0.4":77.87999725341797,"0.5":77.87999725341797,"0.6":77.87999725341797,"0.7":77.87999725341797,"0.8":77.87999725341797,"0.9":77.87999725341797,"0.95":77.87999725341797}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.681079","as_of":"2025-01-27T00:00:00","forecast_date":"2025-02-03T00:00:00","payload":{"point_forecast":74.66000366210938,"quantiles":{"0.05":74.66000366210938,"0.1":74.66000366210938,"0.2":74.66000366210938,"0.3":74.66000366210938,"0.4":74.66000366210938,"0.5":74.66000366210938,"0.6":74.66000366210938,"0.7":74.66000366210938,"0.8":74.66000366210938,"0.9":74.66000366210938,"0.95":74.66000366210938}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.681079","as_of":"2025-01-27T00:00:00","forecast_date":"2025-02-10T00:00:00","payload":{"point_forecast":74.66000366210938,"quantiles":{"0.05":74.66000366210938,"0.1":74.66000366210938,"0.2":74.66000366210938,"0.3":74.66000366210938,"0.4":74.66000366210938,"0.5":74.66000366210938,"0.6":74.66000366210938,"0.7":74.66000366210938,"0.8":74.66000366210938,"0.9":74.66000366210938,"0.95":74.66000366210938}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.681079","as_of":"2025-01-27T00:00:00","forecast_date":"2025-02-25T00:00:00","payload":{"point_forecast":74.66000366210938,"quantiles":{"0.05":74.66000366210938,"0.1":74.66000366210938,"0.2":74.66000366210938,"0.3":74.66000366210938,"0.4":74.66000366210938,"0.5":74.66000366210938,"0.6":74.66000366210938,"0.7":74.66000366210938,"0.8":74.66000366210938,"0.9":74.66000366210938,"0.95":74.66000366210938}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.691166","as_of":"2025-02-03T00:00:00","forecast_date":"2025-02-10T00:00:00","payload":{"point_forecast":72.52999877929688,"quantiles":{"0.05":72.52999877929688,"0.1":72.52999877929688,"0.2":72.52999877929688,"0.3":72.52999877929688,"0.4":72.52999877929688,"0.5":72.52999877929688,"0.6":72.52999877929688,"0.7":72.52999877929688,"0.8":72.52999877929688,"0.9":72.52999877929688,"0.95":72.52999877929688}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.691166","as_of":"2025-02-03T00:00:00","forecast_date":"2025-03-04T00:00:00","payload":{"point_forecast":72.52999877929688,"quantiles":{"0.05":72.52999877929688,"0.1":72.52999877929688,"0.2":72.52999877929688,"0.3":72.52999877929688,"0.4":72.52999877929688,"0.5":72.52999877929688,"0.6":72.52999877929688,"0.7":72.52999877929688,"0.8":72.52999877929688,"0.9":72.52999877929688,"0.95":72.52999877929688}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.700990","as_of":"2025-02-10T00:00:00","forecast_date":"2025-02-24T00:00:00","payload":{"point_forecast":71.0,"quantiles":{"0.05":71.0,"0.1":71.0,"0.2":71.0,"0.3":71.0,"0.4":71.0,"0.5":71.0,"0.6":71.0,"0.7":71.0,"0.8":71.0,"0.9":71.0,"0.95":71.0}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.700990","as_of":"2025-02-10T00:00:00","forecast_date":"2025-03-11T00:00:00","payload":{"point_forecast":71.0,"quantiles":{"0.05":71.0,"0.1":71.0,"0.2":71.0,"0.3":71.0,"0.4":71.0,"0.5":71.0,"0.6":71.0,"0.7":71.0,"0.8":71.0,"0.9":71.0,"0.95":71.0}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.710609","as_of":"2025-02-17T00:00:00","forecast_date":"2025-02-24T00:00:00","payload":{"point_forecast":70.73999786376953,"quantiles":{"0.05":70.73999786376953,"0.1":70.73999786376953,"0.2":70.73999786376953,"0.3":70.73999786376953,"0.4":70.73999786376953,"0.5":70.73999786376953,"0.6":70.73999786376953,"0.7":70.73999786376953,"0.8":70.73999786376953,"0.9":70.73999786376953,"0.95":70.73999786376953}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.710609","as_of":"2025-02-17T00:00:00","forecast_date":"2025-03-03T00:00:00","payload":{"point_forecast":70.73999786376953,"quantiles":{"0.05":70.73999786376953,"0.1":70.73999786376953,"0.2":70.73999786376953,"0.3":70.73999786376953,"0.4":70.73999786376953,"0.5":70.73999786376953,"0.6":70.73999786376953,"0.7":70.73999786376953,"0.8":70.73999786376953,"0.9":70.73999786376953,"0.95":70.73999786376953}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.710609","as_of":"2025-02-17T00:00:00","forecast_date":"2025-03-18T00:00:00","payload":{"point_forecast":70.73999786376953,"quantiles":{"0.05":70.73999786376953,"0.1":70.73999786376953,"0.2":70.73999786376953,"0.3":70.73999786376953,"0.4":70.73999786376953,"0.5":70.73999786376953,"0.6":70.73999786376953,"0.7":70.73999786376953,"0.8":70.73999786376953,"0.9":70.73999786376953,"0.95":70.73999786376953}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.720796","as_of":"2025-02-24T00:00:00","forecast_date":"2025-03-03T00:00:00","payload":{"point_forecast":70.4000015258789,"quantiles":{"0.05":70.4000015258789,"0.1":70.4000015258789,"0.2":70.4000015258789,"0.3":70.4000015258789,"0.4":70.4000015258789,"0.5":70.4000015258789,"0.6":70.4000015258789,"0.7":70.4000015258789,"0.8":70.4000015258789,"0.9":70.4000015258789,"0.95":70.4000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.720796","as_of":"2025-02-24T00:00:00","forecast_date":"2025-03-10T00:00:00","payload":{"point_forecast":70.4000015258789,"quantiles":{"0.05":70.4000015258789,"0.1":70.4000015258789,"0.2":70.4000015258789,"0.3":70.4000015258789,"0.4":70.4000015258789,"0.5":70.4000015258789,"0.6":70.4000015258789,"0.7":70.4000015258789,"0.8":70.4000015258789,"0.9":70.4000015258789,"0.95":70.4000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.720796","as_of":"2025-02-24T00:00:00","forecast_date":"2025-03-25T00:00:00","payload":{"point_forecast":70.4000015258789,"quantiles":{"0.05":70.4000015258789,"0.1":70.4000015258789,"0.2":70.4000015258789,"0.3":70.4000015258789,"0.4":70.4000015258789,"0.5":70.4000015258789,"0.6":70.4000015258789,"0.7":70.4000015258789,"0.8":70.4000015258789,"0.9":70.4000015258789,"0.95":70.4000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.730886","as_of":"2025-03-03T00:00:00","forecast_date":"2025-03-10T00:00:00","payload":{"point_forecast":69.76000213623047,"quantiles":{"0.05":69.76000213623047,"0.1":69.76000213623047,"0.2":69.76000213623047,"0.3":69.76000213623047,"0.4":69.76000213623047,"0.5":69.76000213623047,"0.6":69.76000213623047,"0.7":69.76000213623047,"0.8":69.76000213623047,"0.9":69.76000213623047,"0.95":69.76000213623047}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.730886","as_of":"2025-03-03T00:00:00","forecast_date":"2025-03-17T00:00:00","payload":{"point_forecast":69.76000213623047,"quantiles":{"0.05":69.76000213623047,"0.1":69.76000213623047,"0.2":69.76000213623047,"0.3":69.76000213623047,"0.4":69.76000213623047,"0.5":69.76000213623047,"0.6":69.76000213623047,"0.7":69.76000213623047,"0.8":69.76000213623047,"0.9":69.76000213623047,"0.95":69.76000213623047}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.730886","as_of":"2025-03-03T00:00:00","forecast_date":"2025-04-01T00:00:00","payload":{"point_forecast":69.76000213623047,"quantiles":{"0.05":69.76000213623047,"0.1":69.76000213623047,"0.2":69.76000213623047,"0.3":69.76000213623047,"0.4":69.76000213623047,"0.5":69.76000213623047,"0.6":69.76000213623047,"0.7":69.76000213623047,"0.8":69.76000213623047,"0.9":69.76000213623047,"0.95":69.76000213623047}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.740533","as_of":"2025-03-10T00:00:00","forecast_date":"2025-03-17T00:00:00","payload":{"point_forecast":67.04000091552734,"quantiles":{"0.05":67.04000091552734,"0.1":67.04000091552734,"0.2":67.04000091552734,"0.3":67.04000091552734,"0.4":67.04000091552734,"0.5":67.04000091552734,"0.6":67.04000091552734,"0.7":67.04000091552734,"0.8":67.04000091552734,"0.9":67.04000091552734,"0.95":67.04000091552734}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.740533","as_of":"2025-03-10T00:00:00","forecast_date":"2025-03-24T00:00:00","payload":{"point_forecast":67.04000091552734,"quantiles":{"0.05":67.04000091552734,"0.1":67.04000091552734,"0.2":67.04000091552734,"0.3":67.04000091552734,"0.4":67.04000091552734,"0.5":67.04000091552734,"0.6":67.04000091552734,"0.7":67.04000091552734,"0.8":67.04000091552734,"0.9":67.04000091552734,"0.95":67.04000091552734}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.740533","as_of":"2025-03-10T00:00:00","forecast_date":"2025-04-08T00:00:00","payload":{"point_forecast":67.04000091552734,"quantiles":{"0.05":67.04000091552734,"0.1":67.04000091552734,"0.2":67.04000091552734,"0.3":67.04000091552734,"0.4":67.04000091552734,"0.5":67.04000091552734,"0.6":67.04000091552734,"0.7":67.04000091552734,"0.8":67.04000091552734,"0.9":67.04000091552734,"0.95":67.04000091552734}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.750075","as_of":"2025-03-17T00:00:00","forecast_date":"2025-03-24T00:00:00","payload":{"point_forecast":67.18000030517578,"quantiles":{"0.05":67.18000030517578,"0.1":67.18000030517578,"0.2":67.18000030517578,"0.3":67.18000030517578,"0.4":67.18000030517578,"0.5":67.18000030517578,"0.6":67.18000030517578,"0.7":67.18000030517578,"0.8":67.18000030517578,"0.9":67.18000030517578,"0.95":67.18000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.750075","as_of":"2025-03-17T00:00:00","forecast_date":"2025-03-31T00:00:00","payload":{"point_forecast":67.18000030517578,"quantiles":{"0.05":67.18000030517578,"0.1":67.18000030517578,"0.2":67.18000030517578,"0.3":67.18000030517578,"0.4":67.18000030517578,"0.5":67.18000030517578,"0.6":67.18000030517578,"0.7":67.18000030517578,"0.8":67.18000030517578,"0.9":67.18000030517578,"0.95":67.18000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.750075","as_of":"2025-03-17T00:00:00","forecast_date":"2025-04-15T00:00:00","payload":{"point_forecast":67.18000030517578,"quantiles":{"0.05":67.18000030517578,"0.1":67.18000030517578,"0.2":67.18000030517578,"0.3":67.18000030517578,"0.4":67.18000030517578,"0.5":67.18000030517578,"0.6":67.18000030517578,"0.7":67.18000030517578,"0.8":67.18000030517578,"0.9":67.18000030517578,"0.95":67.18000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.759955","as_of":"2025-03-24T00:00:00","forecast_date":"2025-03-31T00:00:00","payload":{"point_forecast":68.27999877929688,"quantiles":{"0.05":68.27999877929688,"0.1":68.27999877929688,"0.2":68.27999877929688,"0.3":68.27999877929688,"0.4":68.27999877929688,"0.5":68.27999877929688,"0.6":68.27999877929688,"0.7":68.27999877929688,"0.8":68.27999877929688,"0.9":68.27999877929688,"0.95":68.27999877929688}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.759955","as_of":"2025-03-24T00:00:00","forecast_date":"2025-04-07T00:00:00","payload":{"point_forecast":68.27999877929688,"quantiles":{"0.05":68.27999877929688,"0.1":68.27999877929688,"0.2":68.27999877929688,"0.3":68.27999877929688,"0.4":68.27999877929688,"0.5":68.27999877929688,"0.6":68.27999877929688,"0.7":68.27999877929688,"0.8":68.27999877929688,"0.9":68.27999877929688,"0.95":68.27999877929688}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.759955","as_of":"2025-03-24T00:00:00","forecast_date":"2025-04-22T00:00:00","payload":{"point_forecast":68.27999877929688,"quantiles":{"0.05":68.27999877929688,"0.1":68.27999877929688,"0.2":68.27999877929688,"0.3":68.27999877929688,"0.4":68.27999877929688,"0.5":68.27999877929688,"0.6":68.27999877929688,"0.7":68.27999877929688,"0.8":68.27999877929688,"0.9":68.27999877929688,"0.95":68.27999877929688}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.769705","as_of":"2025-03-31T00:00:00","forecast_date":"2025-04-07T00:00:00","payload":{"point_forecast":69.36000061035156,"quantiles":{"0.05":69.36000061035156,"0.1":69.36000061035156,"0.2":69.36000061035156,"0.3":69.36000061035156,"0.4":69.36000061035156,"0.5":69.36000061035156,"0.6":69.36000061035156,"0.7":69.36000061035156,"0.8":69.36000061035156,"0.9":69.36000061035156,"0.95":69.36000061035156}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.769705","as_of":"2025-03-31T00:00:00","forecast_date":"2025-04-14T00:00:00","payload":{"point_forecast":69.36000061035156,"quantiles":{"0.05":69.36000061035156,"0.1":69.36000061035156,"0.2":69.36000061035156,"0.3":69.36000061035156,"0.4":69.36000061035156,"0.5":69.36000061035156,"0.6":69.36000061035156,"0.7":69.36000061035156,"0.8":69.36000061035156,"0.9":69.36000061035156,"0.95":69.36000061035156}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.769705","as_of":"2025-03-31T00:00:00","forecast_date":"2025-04-29T00:00:00","payload":{"point_forecast":69.36000061035156,"quantiles":{"0.05":69.36000061035156,"0.1":69.36000061035156,"0.2":69.36000061035156,"0.3":69.36000061035156,"0.4":69.36000061035156,"0.5":69.36000061035156,"0.6":69.36000061035156,"0.7":69.36000061035156,"0.8":69.36000061035156,"0.9":69.36000061035156,"0.95":69.36000061035156}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.779466","as_of":"2025-04-07T00:00:00","forecast_date":"2025-04-14T00:00:00","payload":{"point_forecast":61.9900016784668,"quantiles":{"0.05":61.9900016784668,"0.1":61.9900016784668,"0.2":61.9900016784668,"0.3":61.9900016784668,"0.4":61.9900016784668,"0.5":61.9900016784668,"0.6":61.9900016784668,"0.7":61.9900016784668,"0.8":61.9900016784668,"0.9":61.9900016784668,"0.95":61.9900016784668}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.779466","as_of":"2025-04-07T00:00:00","forecast_date":"2025-04-21T00:00:00","payload":{"point_forecast":61.9900016784668,"quantiles":{"0.05":61.9900016784668,"0.1":61.9900016784668,"0.2":61.9900016784668,"0.3":61.9900016784668,"0.4":61.9900016784668,"0.5":61.9900016784668,"0.6":61.9900016784668,"0.7":61.9900016784668,"0.8":61.9900016784668,"0.9":61.9900016784668,"0.95":61.9900016784668}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.779466","as_of":"2025-04-07T00:00:00","forecast_date":"2025-05-06T00:00:00","payload":{"point_forecast":61.9900016784668,"quantiles":{"0.05":61.9900016784668,"0.1":61.9900016784668,"0.2":61.9900016784668,"0.3":61.9900016784668,"0.4":61.9900016784668,"0.5":61.9900016784668,"0.6":61.9900016784668,"0.7":61.9900016784668,"0.8":61.9900016784668,"0.9":61.9900016784668,"0.95":61.9900016784668}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.789195","as_of":"2025-04-14T00:00:00","forecast_date":"2025-04-21T00:00:00","payload":{"point_forecast":61.5,"quantiles":{"0.05":61.5,"0.1":61.5,"0.2":61.5,"0.3":61.5,"0.4":61.5,"0.5":61.5,"0.6":61.5,"0.7":61.5,"0.8":61.5,"0.9":61.5,"0.95":61.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.789195","as_of":"2025-04-14T00:00:00","forecast_date":"2025-04-28T00:00:00","payload":{"point_forecast":61.5,"quantiles":{"0.05":61.5,"0.1":61.5,"0.2":61.5,"0.3":61.5,"0.4":61.5,"0.5":61.5,"0.6":61.5,"0.7":61.5,"0.8":61.5,"0.9":61.5,"0.95":61.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.789195","as_of":"2025-04-14T00:00:00","forecast_date":"2025-05-13T00:00:00","payload":{"point_forecast":61.5,"quantiles":{"0.05":61.5,"0.1":61.5,"0.2":61.5,"0.3":61.5,"0.4":61.5,"0.5":61.5,"0.6":61.5,"0.7":61.5,"0.8":61.5,"0.9":61.5,"0.95":61.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.799182","as_of":"2025-04-21T00:00:00","forecast_date":"2025-04-28T00:00:00","payload":{"point_forecast":64.68000030517578,"quantiles":{"0.05":64.68000030517578,"0.1":64.68000030517578,"0.2":64.68000030517578,"0.3":64.68000030517578,"0.4":64.68000030517578,"0.5":64.68000030517578,"0.6":64.68000030517578,"0.7":64.68000030517578,"0.8":64.68000030517578,"0.9":64.68000030517578,"0.95":64.68000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.799182","as_of":"2025-04-21T00:00:00","forecast_date":"2025-05-05T00:00:00","payload":{"point_forecast":64.68000030517578,"quantiles":{"0.05":64.68000030517578,"0.1":64.68000030517578,"0.2":64.68000030517578,"0.3":64.68000030517578,"0.4":64.68000030517578,"0.5":64.68000030517578,"0.6":64.68000030517578,"0.7":64.68000030517578,"0.8":64.68000030517578,"0.9":64.68000030517578,"0.95":64.68000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.799182","as_of":"2025-04-21T00:00:00","forecast_date":"2025-05-20T00:00:00","payload":{"point_forecast":64.68000030517578,"quantiles":{"0.05":64.68000030517578,"0.1":64.68000030517578,"0.2":64.68000030517578,"0.3":64.68000030517578,"0.4":64.68000030517578,"0.5":64.68000030517578,"0.6":64.68000030517578,"0.7":64.68000030517578,"0.8":64.68000030517578,"0.9":64.68000030517578,"0.95":64.68000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.808858","as_of":"2025-04-28T00:00:00","forecast_date":"2025-05-05T00:00:00","payload":{"point_forecast":63.02000045776367,"quantiles":{"0.05":63.02000045776367,"0.1":63.02000045776367,"0.2":63.02000045776367,"0.3":63.02000045776367,"0.4":63.02000045776367,"0.5":63.02000045776367,"0.6":63.02000045776367,"0.7":63.02000045776367,"0.8":63.02000045776367,"0.9":63.02000045776367,"0.95":63.02000045776367}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.808858","as_of":"2025-04-28T00:00:00","forecast_date":"2025-05-12T00:00:00","payload":{"point_forecast":63.02000045776367,"quantiles":{"0.05":63.02000045776367,"0.1":63.02000045776367,"0.2":63.02000045776367,"0.3":63.02000045776367,"0.4":63.02000045776367,"0.5":63.02000045776367,"0.6":63.02000045776367,"0.7":63.02000045776367,"0.8":63.02000045776367,"0.9":63.02000045776367,"0.95":63.02000045776367}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.808858","as_of":"2025-04-28T00:00:00","forecast_date":"2025-05-27T00:00:00","payload":{"point_forecast":63.02000045776367,"quantiles":{"0.05":63.02000045776367,"0.1":63.02000045776367,"0.2":63.02000045776367,"0.3":63.02000045776367,"0.4":63.02000045776367,"0.5":63.02000045776367,"0.6":63.02000045776367,"0.7":63.02000045776367,"0.8":63.02000045776367,"0.9":63.02000045776367,"0.95":63.02000045776367}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.818630","as_of":"2025-05-05T00:00:00","forecast_date":"2025-05-12T00:00:00","payload":{"point_forecast":58.290000915527344,"quantiles":{"0.05":58.290000915527344,"0.1":58.290000915527344,"0.2":58.290000915527344,"0.3":58.290000915527344,"0.4":58.290000915527344,"0.5":58.290000915527344,"0.6":58.290000915527344,"0.7":58.290000915527344,"0.8":58.290000915527344,"0.9":58.290000915527344,"0.95":58.290000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.818630","as_of":"2025-05-05T00:00:00","forecast_date":"2025-05-19T00:00:00","payload":{"point_forecast":58.290000915527344,"quantiles":{"0.05":58.290000915527344,"0.1":58.290000915527344,"0.2":58.290000915527344,"0.3":58.290000915527344,"0.4":58.290000915527344,"0.5":58.290000915527344,"0.6":58.290000915527344,"0.7":58.290000915527344,"0.8":58.290000915527344,"0.9":58.290000915527344,"0.95":58.290000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.818630","as_of":"2025-05-05T00:00:00","forecast_date":"2025-06-03T00:00:00","payload":{"point_forecast":58.290000915527344,"quantiles":{"0.05":58.290000915527344,"0.1":58.290000915527344,"0.2":58.290000915527344,"0.3":58.290000915527344,"0.4":58.290000915527344,"0.5":58.290000915527344,"0.6":58.290000915527344,"0.7":58.290000915527344,"0.8":58.290000915527344,"0.9":58.290000915527344,"0.95":58.290000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.828394","as_of":"2025-05-12T00:00:00","forecast_date":"2025-05-19T00:00:00","payload":{"point_forecast":61.02000045776367,"quantiles":{"0.05":61.02000045776367,"0.1":61.02000045776367,"0.2":61.02000045776367,"0.3":61.02000045776367,"0.4":61.02000045776367,"0.5":61.02000045776367,"0.6":61.02000045776367,"0.7":61.02000045776367,"0.8":61.02000045776367,"0.9":61.02000045776367,"0.95":61.02000045776367}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.828394","as_of":"2025-05-12T00:00:00","forecast_date":"2025-06-10T00:00:00","payload":{"point_forecast":61.02000045776367,"quantiles":{"0.05":61.02000045776367,"0.1":61.02000045776367,"0.2":61.02000045776367,"0.3":61.02000045776367,"0.4":61.02000045776367,"0.5":61.02000045776367,"0.6":61.02000045776367,"0.7":61.02000045776367,"0.8":61.02000045776367,"0.9":61.02000045776367,"0.95":61.02000045776367}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.838086","as_of":"2025-05-19T00:00:00","forecast_date":"2025-06-02T00:00:00","payload":{"point_forecast":62.4900016784668,"quantiles":{"0.05":62.4900016784668,"0.1":62.4900016784668,"0.2":62.4900016784668,"0.3":62.4900016784668,"0.4":62.4900016784668,"0.5":62.4900016784668,"0.6":62.4900016784668,"0.7":62.4900016784668,"0.8":62.4900016784668,"0.9":62.4900016784668,"0.95":62.4900016784668}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.838086","as_of":"2025-05-19T00:00:00","forecast_date":"2025-06-17T00:00:00","payload":{"point_forecast":62.4900016784668,"quantiles":{"0.05":62.4900016784668,"0.1":62.4900016784668,"0.2":62.4900016784668,"0.3":62.4900016784668,"0.4":62.4900016784668,"0.5":62.4900016784668,"0.6":62.4900016784668,"0.7":62.4900016784668,"0.8":62.4900016784668,"0.9":62.4900016784668,"0.95":62.4900016784668}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.848039","as_of":"2025-05-26T00:00:00","forecast_date":"2025-06-02T00:00:00","payload":{"point_forecast":61.529998779296875,"quantiles":{"0.05":61.529998779296875,"0.1":61.529998779296875,"0.2":61.529998779296875,"0.3":61.529998779296875,"0.4":61.529998779296875,"0.5":61.529998779296875,"0.6":61.529998779296875,"0.7":61.529998779296875,"0.8":61.529998779296875,"0.9":61.529998779296875,"0.95":61.529998779296875}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.848039","as_of":"2025-05-26T00:00:00","forecast_date":"2025-06-09T00:00:00","payload":{"point_forecast":61.529998779296875,"quantiles":{"0.05":61.529998779296875,"0.1":61.529998779296875,"0.2":61.529998779296875,"0.3":61.529998779296875,"0.4":61.529998779296875,"0.5":61.529998779296875,"0.6":61.529998779296875,"0.7":61.529998779296875,"0.8":61.529998779296875,"0.9":61.529998779296875,"0.95":61.529998779296875}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.848039","as_of":"2025-05-26T00:00:00","forecast_date":"2025-06-24T00:00:00","payload":{"point_forecast":61.529998779296875,"quantiles":{"0.05":61.529998779296875,"0.1":61.529998779296875,"0.2":61.529998779296875,"0.3":61.529998779296875,"0.4":61.529998779296875,"0.5":61.529998779296875,"0.6":61.529998779296875,"0.7":61.529998779296875,"0.8":61.529998779296875,"0.9":61.529998779296875,"0.95":61.529998779296875}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.857909","as_of":"2025-06-02T00:00:00","forecast_date":"2025-06-09T00:00:00","payload":{"point_forecast":60.790000915527344,"quantiles":{"0.05":60.790000915527344,"0.1":60.790000915527344,"0.2":60.790000915527344,"0.3":60.790000915527344,"0.4":60.790000915527344,"0.5":60.790000915527344,"0.6":60.790000915527344,"0.7":60.790000915527344,"0.8":60.790000915527344,"0.9":60.790000915527344,"0.95":60.790000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.857909","as_of":"2025-06-02T00:00:00","forecast_date":"2025-06-16T00:00:00","payload":{"point_forecast":60.790000915527344,"quantiles":{"0.05":60.790000915527344,"0.1":60.790000915527344,"0.2":60.790000915527344,"0.3":60.790000915527344,"0.4":60.790000915527344,"0.5":60.790000915527344,"0.6":60.790000915527344,"0.7":60.790000915527344,"0.8":60.790000915527344,"0.9":60.790000915527344,"0.95":60.790000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.857909","as_of":"2025-06-02T00:00:00","forecast_date":"2025-07-01T00:00:00","payload":{"point_forecast":60.790000915527344,"quantiles":{"0.05":60.790000915527344,"0.1":60.790000915527344,"0.2":60.790000915527344,"0.3":60.790000915527344,"0.4":60.790000915527344,"0.5":60.790000915527344,"0.6":60.790000915527344,"0.7":60.790000915527344,"0.8":60.790000915527344,"0.9":60.790000915527344,"0.95":60.790000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.867581","as_of":"2025-06-09T00:00:00","forecast_date":"2025-06-16T00:00:00","payload":{"point_forecast":64.58000183105469,"quantiles":{"0.05":64.58000183105469,"0.1":64.58000183105469,"0.2":64.58000183105469,"0.3":64.58000183105469,"0.4":64.58000183105469,"0.5":64.58000183105469,"0.6":64.58000183105469,"0.7":64.58000183105469,"0.8":64.58000183105469,"0.9":64.58000183105469,"0.95":64.58000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.867581","as_of":"2025-06-09T00:00:00","forecast_date":"2025-06-23T00:00:00","payload":{"point_forecast":64.58000183105469,"quantiles":{"0.05":64.58000183105469,"0.1":64.58000183105469,"0.2":64.58000183105469,"0.3":64.58000183105469,"0.4":64.58000183105469,"0.5":64.58000183105469,"0.6":64.58000183105469,"0.7":64.58000183105469,"0.8":64.58000183105469,"0.9":64.58000183105469,"0.95":64.58000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.867581","as_of":"2025-06-09T00:00:00","forecast_date":"2025-07-08T00:00:00","payload":{"point_forecast":64.58000183105469,"quantiles":{"0.05":64.58000183105469,"0.1":64.58000183105469,"0.2":64.58000183105469,"0.3":64.58000183105469,"0.4":64.58000183105469,"0.5":64.58000183105469,"0.6":64.58000183105469,"0.7":64.58000183105469,"0.8":64.58000183105469,"0.9":64.58000183105469,"0.95":64.58000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.877340","as_of":"2025-06-16T00:00:00","forecast_date":"2025-06-23T00:00:00","payload":{"point_forecast":72.9800033569336,"quantiles":{"0.05":72.9800033569336,"0.1":72.9800033569336,"0.2":72.9800033569336,"0.3":72.9800033569336,"0.4":72.9800033569336,"0.5":72.9800033569336,"0.6":72.9800033569336,"0.7":72.9800033569336,"0.8":72.9800033569336,"0.9":72.9800033569336,"0.95":72.9800033569336}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.877340","as_of":"2025-06-16T00:00:00","forecast_date":"2025-06-30T00:00:00","payload":{"point_forecast":72.9800033569336,"quantiles":{"0.05":72.9800033569336,"0.1":72.9800033569336,"0.2":72.9800033569336,"0.3":72.9800033569336,"0.4":72.9800033569336,"0.5":72.9800033569336,"0.6":72.9800033569336,"0.7":72.9800033569336,"0.8":72.9800033569336,"0.9":72.9800033569336,"0.95":72.9800033569336}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.877340","as_of":"2025-06-16T00:00:00","forecast_date":"2025-07-15T00:00:00","payload":{"point_forecast":72.9800033569336,"quantiles":{"0.05":72.9800033569336,"0.1":72.9800033569336,"0.2":72.9800033569336,"0.3":72.9800033569336,"0.4":72.9800033569336,"0.5":72.9800033569336,"0.6":72.9800033569336,"0.7":72.9800033569336,"0.8":72.9800033569336,"0.9":72.9800033569336,"0.95":72.9800033569336}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.887067","as_of":"2025-06-23T00:00:00","forecast_date":"2025-06-30T00:00:00","payload":{"point_forecast":74.93000030517578,"quantiles":{"0.05":74.93000030517578,"0.1":74.93000030517578,"0.2":74.93000030517578,"0.3":74.93000030517578,"0.4":74.93000030517578,"0.5":74.93000030517578,"0.6":74.93000030517578,"0.7":74.93000030517578,"0.8":74.93000030517578,"0.9":74.93000030517578,"0.95":74.93000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.887067","as_of":"2025-06-23T00:00:00","forecast_date":"2025-07-07T00:00:00","payload":{"point_forecast":74.93000030517578,"quantiles":{"0.05":74.93000030517578,"0.1":74.93000030517578,"0.2":74.93000030517578,"0.3":74.93000030517578,"0.4":74.93000030517578,"0.5":74.93000030517578,"0.6":74.93000030517578,"0.7":74.93000030517578,"0.8":74.93000030517578,"0.9":74.93000030517578,"0.95":74.93000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.887067","as_of":"2025-06-23T00:00:00","forecast_date":"2025-07-22T00:00:00","payload":{"point_forecast":74.93000030517578,"quantiles":{"0.05":74.93000030517578,"0.1":74.93000030517578,"0.2":74.93000030517578,"0.3":74.93000030517578,"0.4":74.93000030517578,"0.5":74.93000030517578,"0.6":74.93000030517578,"0.7":74.93000030517578,"0.8":74.93000030517578,"0.9":74.93000030517578,"0.95":74.93000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.896969","as_of":"2025-06-30T00:00:00","forecast_date":"2025-07-07T00:00:00","payload":{"point_forecast":65.5199966430664,"quantiles":{"0.05":65.5199966430664,"0.1":65.5199966430664,"0.2":65.5199966430664,"0.3":65.5199966430664,"0.4":65.5199966430664,"0.5":65.5199966430664,"0.6":65.5199966430664,"0.7":65.5199966430664,"0.8":65.5199966430664,"0.9":65.5199966430664,"0.95":65.5199966430664}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.896969","as_of":"2025-06-30T00:00:00","forecast_date":"2025-07-14T00:00:00","payload":{"point_forecast":65.5199966430664,"quantiles":{"0.05":65.5199966430664,"0.1":65.5199966430664,"0.2":65.5199966430664,"0.3":65.5199966430664,"0.4":65.5199966430664,"0.5":65.5199966430664,"0.6":65.5199966430664,"0.7":65.5199966430664,"0.8":65.5199966430664,"0.9":65.5199966430664,"0.95":65.5199966430664}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.896969","as_of":"2025-06-30T00:00:00","forecast_date":"2025-07-29T00:00:00","payload":{"point_forecast":65.5199966430664,"quantiles":{"0.05":65.5199966430664,"0.1":65.5199966430664,"0.2":65.5199966430664,"0.3":65.5199966430664,"0.4":65.5199966430664,"0.5":65.5199966430664,"0.6":65.5199966430664,"0.7":65.5199966430664,"0.8":65.5199966430664,"0.9":65.5199966430664,"0.95":65.5199966430664}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.906723","as_of":"2025-07-07T00:00:00","forecast_date":"2025-07-14T00:00:00","payload":{"point_forecast":66.5,"quantiles":{"0.05":66.5,"0.1":66.5,"0.2":66.5,"0.3":66.5,"0.4":66.5,"0.5":66.5,"0.6":66.5,"0.7":66.5,"0.8":66.5,"0.9":66.5,"0.95":66.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.906723","as_of":"2025-07-07T00:00:00","forecast_date":"2025-07-21T00:00:00","payload":{"point_forecast":66.5,"quantiles":{"0.05":66.5,"0.1":66.5,"0.2":66.5,"0.3":66.5,"0.4":66.5,"0.5":66.5,"0.6":66.5,"0.7":66.5,"0.8":66.5,"0.9":66.5,"0.95":66.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.906723","as_of":"2025-07-07T00:00:00","forecast_date":"2025-08-05T00:00:00","payload":{"point_forecast":66.5,"quantiles":{"0.05":66.5,"0.1":66.5,"0.2":66.5,"0.3":66.5,"0.4":66.5,"0.5":66.5,"0.6":66.5,"0.7":66.5,"0.8":66.5,"0.9":66.5,"0.95":66.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.916242","as_of":"2025-07-14T00:00:00","forecast_date":"2025-07-21T00:00:00","payload":{"point_forecast":68.44999694824219,"quantiles":{"0.05":68.44999694824219,"0.1":68.44999694824219,"0.2":68.44999694824219,"0.3":68.44999694824219,"0.4":68.44999694824219,"0.5":68.44999694824219,"0.6":68.44999694824219,"0.7":68.44999694824219,"0.8":68.44999694824219,"0.9":68.44999694824219,"0.95":68.44999694824219}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.916242","as_of":"2025-07-14T00:00:00","forecast_date":"2025-07-28T00:00:00","payload":{"point_forecast":68.44999694824219,"quantiles":{"0.05":68.44999694824219,"0.1":68.44999694824219,"0.2":68.44999694824219,"0.3":68.44999694824219,"0.4":68.44999694824219,"0.5":68.44999694824219,"0.6":68.44999694824219,"0.7":68.44999694824219,"0.8":68.44999694824219,"0.9":68.44999694824219,"0.95":68.44999694824219}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.916242","as_of":"2025-07-14T00:00:00","forecast_date":"2025-08-12T00:00:00","payload":{"point_forecast":68.44999694824219,"quantiles":{"0.05":68.44999694824219,"0.1":68.44999694824219,"0.2":68.44999694824219,"0.3":68.44999694824219,"0.4":68.44999694824219,"0.5":68.44999694824219,"0.6":68.44999694824219,"0.7":68.44999694824219,"0.8":68.44999694824219,"0.9":68.44999694824219,"0.95":68.44999694824219}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.925923","as_of":"2025-07-21T00:00:00","forecast_date":"2025-07-28T00:00:00","payload":{"point_forecast":67.33999633789062,"quantiles":{"0.05":67.33999633789062,"0.1":67.33999633789062,"0.2":67.33999633789062,"0.3":67.33999633789062,"0.4":67.33999633789062,"0.5":67.33999633789062,"0.6":67.33999633789062,"0.7":67.33999633789062,"0.8":67.33999633789062,"0.9":67.33999633789062,"0.95":67.33999633789062}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.925923","as_of":"2025-07-21T00:00:00","forecast_date":"2025-08-04T00:00:00","payload":{"point_forecast":67.33999633789062,"quantiles":{"0.05":67.33999633789062,"0.1":67.33999633789062,"0.2":67.33999633789062,"0.3":67.33999633789062,"0.4":67.33999633789062,"0.5":67.33999633789062,"0.6":67.33999633789062,"0.7":67.33999633789062,"0.8":67.33999633789062,"0.9":67.33999633789062,"0.95":67.33999633789062}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.925923","as_of":"2025-07-21T00:00:00","forecast_date":"2025-08-19T00:00:00","payload":{"point_forecast":67.33999633789062,"quantiles":{"0.05":67.33999633789062,"0.1":67.33999633789062,"0.2":67.33999633789062,"0.3":67.33999633789062,"0.4":67.33999633789062,"0.5":67.33999633789062,"0.6":67.33999633789062,"0.7":67.33999633789062,"0.8":67.33999633789062,"0.9":67.33999633789062,"0.95":67.33999633789062}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.935575","as_of":"2025-07-28T00:00:00","forecast_date":"2025-08-04T00:00:00","payload":{"point_forecast":65.16000366210938,"quantiles":{"0.05":65.16000366210938,"0.1":65.16000366210938,"0.2":65.16000366210938,"0.3":65.16000366210938,"0.4":65.16000366210938,"0.5":65.16000366210938,"0.6":65.16000366210938,"0.7":65.16000366210938,"0.8":65.16000366210938,"0.9":65.16000366210938,"0.95":65.16000366210938}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.935575","as_of":"2025-07-28T00:00:00","forecast_date":"2025-08-11T00:00:00","payload":{"point_forecast":65.16000366210938,"quantiles":{"0.05":65.16000366210938,"0.1":65.16000366210938,"0.2":65.16000366210938,"0.3":65.16000366210938,"0.4":65.16000366210938,"0.5":65.16000366210938,"0.6":65.16000366210938,"0.7":65.16000366210938,"0.8":65.16000366210938,"0.9":65.16000366210938,"0.95":65.16000366210938}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.935575","as_of":"2025-07-28T00:00:00","forecast_date":"2025-08-26T00:00:00","payload":{"point_forecast":65.16000366210938,"quantiles":{"0.05":65.16000366210938,"0.1":65.16000366210938,"0.2":65.16000366210938,"0.3":65.16000366210938,"0.4":65.16000366210938,"0.5":65.16000366210938,"0.6":65.16000366210938,"0.7":65.16000366210938,"0.8":65.16000366210938,"0.9":65.16000366210938,"0.95":65.16000366210938}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.945196","as_of":"2025-08-04T00:00:00","forecast_date":"2025-08-11T00:00:00","payload":{"point_forecast":67.33000183105469,"quantiles":{"0.05":67.33000183105469,"0.1":67.33000183105469,"0.2":67.33000183105469,"0.3":67.33000183105469,"0.4":67.33000183105469,"0.5":67.33000183105469,"0.6":67.33000183105469,"0.7":67.33000183105469,"0.8":67.33000183105469,"0.9":67.33000183105469,"0.95":67.33000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.945196","as_of":"2025-08-04T00:00:00","forecast_date":"2025-08-18T00:00:00","payload":{"point_forecast":67.33000183105469,"quantiles":{"0.05":67.33000183105469,"0.1":67.33000183105469,"0.2":67.33000183105469,"0.3":67.33000183105469,"0.4":67.33000183105469,"0.5":67.33000183105469,"0.6":67.33000183105469,"0.7":67.33000183105469,"0.8":67.33000183105469,"0.9":67.33000183105469,"0.95":67.33000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.945196","as_of":"2025-08-04T00:00:00","forecast_date":"2025-09-02T00:00:00","payload":{"point_forecast":67.33000183105469,"quantiles":{"0.05":67.33000183105469,"0.1":67.33000183105469,"0.2":67.33000183105469,"0.3":67.33000183105469,"0.4":67.33000183105469,"0.5":67.33000183105469,"0.6":67.33000183105469,"0.7":67.33000183105469,"0.8":67.33000183105469,"0.9":67.33000183105469,"0.95":67.33000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.955005","as_of":"2025-08-11T00:00:00","forecast_date":"2025-08-18T00:00:00","payload":{"point_forecast":63.880001068115234,"quantiles":{"0.05":63.880001068115234,"0.1":63.880001068115234,"0.2":63.880001068115234,"0.3":63.880001068115234,"0.4":63.880001068115234,"0.5":63.880001068115234,"0.6":63.880001068115234,"0.7":63.880001068115234,"0.8":63.880001068115234,"0.9":63.880001068115234,"0.95":63.880001068115234}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.955005","as_of":"2025-08-11T00:00:00","forecast_date":"2025-08-25T00:00:00","payload":{"point_forecast":63.880001068115234,"quantiles":{"0.05":63.880001068115234,"0.1":63.880001068115234,"0.2":63.880001068115234,"0.3":63.880001068115234,"0.4":63.880001068115234,"0.5":63.880001068115234,"0.6":63.880001068115234,"0.7":63.880001068115234,"0.8":63.880001068115234,"0.9":63.880001068115234,"0.95":63.880001068115234}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.955005","as_of":"2025-08-11T00:00:00","forecast_date":"2025-09-09T00:00:00","payload":{"point_forecast":63.880001068115234,"quantiles":{"0.05":63.880001068115234,"0.1":63.880001068115234,"0.2":63.880001068115234,"0.3":63.880001068115234,"0.4":63.880001068115234,"0.5":63.880001068115234,"0.6":63.880001068115234,"0.7":63.880001068115234,"0.8":63.880001068115234,"0.9":63.880001068115234,"0.95":63.880001068115234}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.964819","as_of":"2025-08-18T00:00:00","forecast_date":"2025-08-25T00:00:00","payload":{"point_forecast":62.79999923706055,"quantiles":{"0.05":62.79999923706055,"0.1":62.79999923706055,"0.2":62.79999923706055,"0.3":62.79999923706055,"0.4":62.79999923706055,"0.5":62.79999923706055,"0.6":62.79999923706055,"0.7":62.79999923706055,"0.8":62.79999923706055,"0.9":62.79999923706055,"0.95":62.79999923706055}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.964819","as_of":"2025-08-18T00:00:00","forecast_date":"2025-09-16T00:00:00","payload":{"point_forecast":62.79999923706055,"quantiles":{"0.05":62.79999923706055,"0.1":62.79999923706055,"0.2":62.79999923706055,"0.3":62.79999923706055,"0.4":62.79999923706055,"0.5":62.79999923706055,"0.6":62.79999923706055,"0.7":62.79999923706055,"0.8":62.79999923706055,"0.9":62.79999923706055,"0.95":62.79999923706055}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.974622","as_of":"2025-08-25T00:00:00","forecast_date":"2025-09-08T00:00:00","payload":{"point_forecast":63.65999984741211,"quantiles":{"0.05":63.65999984741211,"0.1":63.65999984741211,"0.2":63.65999984741211,"0.3":63.65999984741211,"0.4":63.65999984741211,"0.5":63.65999984741211,"0.6":63.65999984741211,"0.7":63.65999984741211,"0.8":63.65999984741211,"0.9":63.65999984741211,"0.95":63.65999984741211}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.974622","as_of":"2025-08-25T00:00:00","forecast_date":"2025-09-23T00:00:00","payload":{"point_forecast":63.65999984741211,"quantiles":{"0.05":63.65999984741211,"0.1":63.65999984741211,"0.2":63.65999984741211,"0.3":63.65999984741211,"0.4":63.65999984741211,"0.5":63.65999984741211,"0.6":63.65999984741211,"0.7":63.65999984741211,"0.8":63.65999984741211,"0.9":63.65999984741211,"0.95":63.65999984741211}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.984186","as_of":"2025-09-01T00:00:00","forecast_date":"2025-09-08T00:00:00","payload":{"point_forecast":64.01000213623047,"quantiles":{"0.05":64.01000213623047,"0.1":64.01000213623047,"0.2":64.01000213623047,"0.3":64.01000213623047,"0.4":64.01000213623047,"0.5":64.01000213623047,"0.6":64.01000213623047,"0.7":64.01000213623047,"0.8":64.01000213623047,"0.9":64.01000213623047,"0.95":64.01000213623047}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.984186","as_of":"2025-09-01T00:00:00","forecast_date":"2025-09-15T00:00:00","payload":{"point_forecast":64.01000213623047,"quantiles":{"0.05":64.01000213623047,"0.1":64.01000213623047,"0.2":64.01000213623047,"0.3":64.01000213623047,"0.4":64.01000213623047,"0.5":64.01000213623047,"0.6":64.01000213623047,"0.7":64.01000213623047,"0.8":64.01000213623047,"0.9":64.01000213623047,"0.95":64.01000213623047}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.984186","as_of":"2025-09-01T00:00:00","forecast_date":"2025-09-30T00:00:00","payload":{"point_forecast":64.01000213623047,"quantiles":{"0.05":64.01000213623047,"0.1":64.01000213623047,"0.2":64.01000213623047,"0.3":64.01000213623047,"0.4":64.01000213623047,"0.5":64.01000213623047,"0.6":64.01000213623047,"0.7":64.01000213623047,"0.8":64.01000213623047,"0.9":64.01000213623047,"0.95":64.01000213623047}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.994137","as_of":"2025-09-08T00:00:00","forecast_date":"2025-09-15T00:00:00","payload":{"point_forecast":61.869998931884766,"quantiles":{"0.05":61.869998931884766,"0.1":61.869998931884766,"0.2":61.869998931884766,"0.3":61.869998931884766,"0.4":61.869998931884766,"0.5":61.869998931884766,"0.6":61.869998931884766,"0.7":61.869998931884766,"0.8":61.869998931884766,"0.9":61.869998931884766,"0.95":61.869998931884766}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.994137","as_of":"2025-09-08T00:00:00","forecast_date":"2025-09-22T00:00:00","payload":{"point_forecast":61.869998931884766,"quantiles":{"0.05":61.869998931884766,"0.1":61.869998931884766,"0.2":61.869998931884766,"0.3":61.869998931884766,"0.4":61.869998931884766,"0.5":61.869998931884766,"0.6":61.869998931884766,"0.7":61.869998931884766,"0.8":61.869998931884766,"0.9":61.869998931884766,"0.95":61.869998931884766}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.994137","as_of":"2025-09-08T00:00:00","forecast_date":"2025-10-07T00:00:00","payload":{"point_forecast":61.869998931884766,"quantiles":{"0.05":61.869998931884766,"0.1":61.869998931884766,"0.2":61.869998931884766,"0.3":61.869998931884766,"0.4":61.869998931884766,"0.5":61.869998931884766,"0.6":61.869998931884766,"0.7":61.869998931884766,"0.8":61.869998931884766,"0.9":61.869998931884766,"0.95":61.869998931884766}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.077078","as_of":"2025-09-15T00:00:00","forecast_date":"2025-09-22T00:00:00","payload":{"point_forecast":62.689998626708984,"quantiles":{"0.05":62.689998626708984,"0.1":62.689998626708984,"0.2":62.689998626708984,"0.3":62.689998626708984,"0.4":62.689998626708984,"0.5":62.689998626708984,"0.6":62.689998626708984,"0.7":62.689998626708984,"0.8":62.689998626708984,"0.9":62.689998626708984,"0.95":62.689998626708984}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.077078","as_of":"2025-09-15T00:00:00","forecast_date":"2025-09-29T00:00:00","payload":{"point_forecast":62.689998626708984,"quantiles":{"0.05":62.689998626708984,"0.1":62.689998626708984,"0.2":62.689998626708984,"0.3":62.689998626708984,"0.4":62.689998626708984,"0.5":62.689998626708984,"0.6":62.689998626708984,"0.7":62.689998626708984,"0.8":62.689998626708984,"0.9":62.689998626708984,"0.95":62.689998626708984}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.077078","as_of":"2025-09-15T00:00:00","forecast_date":"2025-10-14T00:00:00","payload":{"point_forecast":62.689998626708984,"quantiles":{"0.05":62.689998626708984,"0.1":62.689998626708984,"0.2":62.689998626708984,"0.3":62.689998626708984,"0.4":62.689998626708984,"0.5":62.689998626708984,"0.6":62.689998626708984,"0.7":62.689998626708984,"0.8":62.689998626708984,"0.9":62.689998626708984,"0.95":62.689998626708984}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.087370","as_of":"2025-09-22T00:00:00","forecast_date":"2025-09-29T00:00:00","payload":{"point_forecast":62.68000030517578,"quantiles":{"0.05":62.68000030517578,"0.1":62.68000030517578,"0.2":62.68000030517578,"0.3":62.68000030517578,"0.4":62.68000030517578,"0.5":62.68000030517578,"0.6":62.68000030517578,"0.7":62.68000030517578,"0.8":62.68000030517578,"0.9":62.68000030517578,"0.95":62.68000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.087370","as_of":"2025-09-22T00:00:00","forecast_date":"2025-10-06T00:00:00","payload":{"point_forecast":62.68000030517578,"quantiles":{"0.05":62.68000030517578,"0.1":62.68000030517578,"0.2":62.68000030517578,"0.3":62.68000030517578,"0.4":62.68000030517578,"0.5":62.68000030517578,"0.6":62.68000030517578,"0.7":62.68000030517578,"0.8":62.68000030517578,"0.9":62.68000030517578,"0.95":62.68000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.087370","as_of":"2025-09-22T00:00:00","forecast_date":"2025-10-21T00:00:00","payload":{"point_forecast":62.68000030517578,"quantiles":{"0.05":62.68000030517578,"0.1":62.68000030517578,"0.2":62.68000030517578,"0.3":62.68000030517578,"0.4":62.68000030517578,"0.5":62.68000030517578,"0.6":62.68000030517578,"0.7":62.68000030517578,"0.8":62.68000030517578,"0.9":62.68000030517578,"0.95":62.68000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.097074","as_of":"2025-09-29T00:00:00","forecast_date":"2025-10-06T00:00:00","payload":{"point_forecast":65.72000122070312,"quantiles":{"0.05":65.72000122070312,"0.1":65.72000122070312,"0.2":65.72000122070312,"0.3":65.72000122070312,"0.4":65.72000122070312,"0.5":65.72000122070312,"0.6":65.72000122070312,"0.7":65.72000122070312,"0.8":65.72000122070312,"0.9":65.72000122070312,"0.95":65.72000122070312}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.097074","as_of":"2025-09-29T00:00:00","forecast_date":"2025-10-13T00:00:00","payload":{"point_forecast":65.72000122070312,"quantiles":{"0.05":65.72000122070312,"0.1":65.72000122070312,"0.2":65.72000122070312,"0.3":65.72000122070312,"0.4":65.72000122070312,"0.5":65.72000122070312,"0.6":65.72000122070312,"0.7":65.72000122070312,"0.8":65.72000122070312,"0.9":65.72000122070312,"0.95":65.72000122070312}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.097074","as_of":"2025-09-29T00:00:00","forecast_date":"2025-10-28T00:00:00","payload":{"point_forecast":65.72000122070312,"quantiles":{"0.05":65.72000122070312,"0.1":65.72000122070312,"0.2":65.72000122070312,"0.3":65.72000122070312,"0.4":65.72000122070312,"0.5":65.72000122070312,"0.6":65.72000122070312,"0.7":65.72000122070312,"0.8":65.72000122070312,"0.9":65.72000122070312,"0.95":65.72000122070312}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.107057","as_of":"2025-10-06T00:00:00","forecast_date":"2025-10-13T00:00:00","payload":{"point_forecast":60.880001068115234,"quantiles":{"0.05":60.880001068115234,"0.1":60.880001068115234,"0.2":60.880001068115234,"0.3":60.880001068115234,"0.4":60.880001068115234,"0.5":60.880001068115234,"0.6":60.880001068115234,"0.7":60.880001068115234,"0.8":60.880001068115234,"0.9":60.880001068115234,"0.95":60.880001068115234}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.107057","as_of":"2025-10-06T00:00:00","forecast_date":"2025-10-20T00:00:00","payload":{"point_forecast":60.880001068115234,"quantiles":{"0.05":60.880001068115234,"0.1":60.880001068115234,"0.2":60.880001068115234,"0.3":60.880001068115234,"0.4":60.880001068115234,"0.5":60.880001068115234,"0.6":60.880001068115234,"0.7":60.880001068115234,"0.8":60.880001068115234,"0.9":60.880001068115234,"0.95":60.880001068115234}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.107057","as_of":"2025-10-06T00:00:00","forecast_date":"2025-11-04T00:00:00","payload":{"point_forecast":60.880001068115234,"quantiles":{"0.05":60.880001068115234,"0.1":60.880001068115234,"0.2":60.880001068115234,"0.3":60.880001068115234,"0.4":60.880001068115234,"0.5":60.880001068115234,"0.6":60.880001068115234,"0.7":60.880001068115234,"0.8":60.880001068115234,"0.9":60.880001068115234,"0.95":60.880001068115234}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.116728","as_of":"2025-10-13T00:00:00","forecast_date":"2025-10-20T00:00:00","payload":{"point_forecast":58.900001525878906,"quantiles":{"0.05":58.900001525878906,"0.1":58.900001525878906,"0.2":58.900001525878906,"0.3":58.900001525878906,"0.4":58.900001525878906,"0.5":58.900001525878906,"0.6":58.900001525878906,"0.7":58.900001525878906,"0.8":58.900001525878906,"0.9":58.900001525878906,"0.95":58.900001525878906}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.116728","as_of":"2025-10-13T00:00:00","forecast_date":"2025-10-27T00:00:00","payload":{"point_forecast":58.900001525878906,"quantiles":{"0.05":58.900001525878906,"0.1":58.900001525878906,"0.2":58.900001525878906,"0.3":58.900001525878906,"0.4":58.900001525878906,"0.5":58.900001525878906,"0.6":58.900001525878906,"0.7":58.900001525878906,"0.8":58.900001525878906,"0.9":58.900001525878906,"0.95":58.900001525878906}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.116728","as_of":"2025-10-13T00:00:00","forecast_date":"2025-11-11T00:00:00","payload":{"point_forecast":58.900001525878906,"quantiles":{"0.05":58.900001525878906,"0.1":58.900001525878906,"0.2":58.900001525878906,"0.3":58.900001525878906,"0.4":58.900001525878906,"0.5":58.900001525878906,"0.6":58.900001525878906,"0.7":58.900001525878906,"0.8":58.900001525878906,"0.9":58.900001525878906,"0.95":58.900001525878906}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.126532","as_of":"2025-10-20T00:00:00","forecast_date":"2025-10-27T00:00:00","payload":{"point_forecast":57.540000915527344,"quantiles":{"0.05":57.540000915527344,"0.1":57.540000915527344,"0.2":57.540000915527344,"0.3":57.540000915527344,"0.4":57.540000915527344,"0.5":57.540000915527344,"0.6":57.540000915527344,"0.7":57.540000915527344,"0.8":57.540000915527344,"0.9":57.540000915527344,"0.95":57.540000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.126532","as_of":"2025-10-20T00:00:00","forecast_date":"2025-11-03T00:00:00","payload":{"point_forecast":57.540000915527344,"quantiles":{"0.05":57.540000915527344,"0.1":57.540000915527344,"0.2":57.540000915527344,"0.3":57.540000915527344,"0.4":57.540000915527344,"0.5":57.540000915527344,"0.6":57.540000915527344,"0.7":57.540000915527344,"0.8":57.540000915527344,"0.9":57.540000915527344,"0.95":57.540000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.126532","as_of":"2025-10-20T00:00:00","forecast_date":"2025-11-18T00:00:00","payload":{"point_forecast":57.540000915527344,"quantiles":{"0.05":57.540000915527344,"0.1":57.540000915527344,"0.2":57.540000915527344,"0.3":57.540000915527344,"0.4":57.540000915527344,"0.5":57.540000915527344,"0.6":57.540000915527344,"0.7":57.540000915527344,"0.8":57.540000915527344,"0.9":57.540000915527344,"0.95":57.540000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.136944","as_of":"2025-10-27T00:00:00","forecast_date":"2025-11-03T00:00:00","payload":{"point_forecast":61.5,"quantiles":{"0.05":61.5,"0.1":61.5,"0.2":61.5,"0.3":61.5,"0.4":61.5,"0.5":61.5,"0.6":61.5,"0.7":61.5,"0.8":61.5,"0.9":61.5,"0.95":61.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.136944","as_of":"2025-10-27T00:00:00","forecast_date":"2025-11-10T00:00:00","payload":{"point_forecast":61.5,"quantiles":{"0.05":61.5,"0.1":61.5,"0.2":61.5,"0.3":61.5,"0.4":61.5,"0.5":61.5,"0.6":61.5,"0.7":61.5,"0.8":61.5,"0.9":61.5,"0.95":61.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.136944","as_of":"2025-10-27T00:00:00","forecast_date":"2025-11-25T00:00:00","payload":{"point_forecast":61.5,"quantiles":{"0.05":61.5,"0.1":61.5,"0.2":61.5,"0.3":61.5,"0.4":61.5,"0.5":61.5,"0.6":61.5,"0.7":61.5,"0.8":61.5,"0.9":61.5,"0.95":61.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.146718","as_of":"2025-11-03T00:00:00","forecast_date":"2025-11-10T00:00:00","payload":{"point_forecast":60.97999954223633,"quantiles":{"0.05":60.97999954223633,"0.1":60.97999954223633,"0.2":60.97999954223633,"0.3":60.97999954223633,"0.4":60.97999954223633,"0.5":60.97999954223633,"0.6":60.97999954223633,"0.7":60.97999954223633,"0.8":60.97999954223633,"0.9":60.97999954223633,"0.95":60.97999954223633}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.146718","as_of":"2025-11-03T00:00:00","forecast_date":"2025-11-17T00:00:00","payload":{"point_forecast":60.97999954223633,"quantiles":{"0.05":60.97999954223633,"0.1":60.97999954223633,"0.2":60.97999954223633,"0.3":60.97999954223633,"0.4":60.97999954223633,"0.5":60.97999954223633,"0.6":60.97999954223633,"0.7":60.97999954223633,"0.8":60.97999954223633,"0.9":60.97999954223633,"0.95":60.97999954223633}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.146718","as_of":"2025-11-03T00:00:00","forecast_date":"2025-12-02T00:00:00","payload":{"point_forecast":60.97999954223633,"quantiles":{"0.05":60.97999954223633,"0.1":60.97999954223633,"0.2":60.97999954223633,"0.3":60.97999954223633,"0.4":60.97999954223633,"0.5":60.97999954223633,"0.6":60.97999954223633,"0.7":60.97999954223633,"0.8":60.97999954223633,"0.9":60.97999954223633,"0.95":60.97999954223633}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.156392","as_of":"2025-11-10T00:00:00","forecast_date":"2025-11-17T00:00:00","payload":{"point_forecast":59.75,"quantiles":{"0.05":59.75,"0.1":59.75,"0.2":59.75,"0.3":59.75,"0.4":59.75,"0.5":59.75,"0.6":59.75,"0.7":59.75,"0.8":59.75,"0.9":59.75,"0.95":59.75}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.156392","as_of":"2025-11-10T00:00:00","forecast_date":"2025-11-24T00:00:00","payload":{"point_forecast":59.75,"quantiles":{"0.05":59.75,"0.1":59.75,"0.2":59.75,"0.3":59.75,"0.4":59.75,"0.5":59.75,"0.6":59.75,"0.7":59.75,"0.8":59.75,"0.9":59.75,"0.95":59.75}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.156392","as_of":"2025-11-10T00:00:00","forecast_date":"2025-12-09T00:00:00","payload":{"point_forecast":59.75,"quantiles":{"0.05":59.75,"0.1":59.75,"0.2":59.75,"0.3":59.75,"0.4":59.75,"0.5":59.75,"0.6":59.75,"0.7":59.75,"0.8":59.75,"0.9":59.75,"0.95":59.75}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.165958","as_of":"2025-11-17T00:00:00","forecast_date":"2025-11-24T00:00:00","payload":{"point_forecast":60.09000015258789,"quantiles":{"0.05":60.09000015258789,"0.1":60.09000015258789,"0.2":60.09000015258789,"0.3":60.09000015258789,"0.4":60.09000015258789,"0.5":60.09000015258789,"0.6":60.09000015258789,"0.7":60.09000015258789,"0.8":60.09000015258789,"0.9":60.09000015258789,"0.95":60.09000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.165958","as_of":"2025-11-17T00:00:00","forecast_date":"2025-12-01T00:00:00","payload":{"point_forecast":60.09000015258789,"quantiles":{"0.05":60.09000015258789,"0.1":60.09000015258789,"0.2":60.09000015258789,"0.3":60.09000015258789,"0.4":60.09000015258789,"0.5":60.09000015258789,"0.6":60.09000015258789,"0.7":60.09000015258789,"0.8":60.09000015258789,"0.9":60.09000015258789,"0.95":60.09000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.165958","as_of":"2025-11-17T00:00:00","forecast_date":"2025-12-16T00:00:00","payload":{"point_forecast":60.09000015258789,"quantiles":{"0.05":60.09000015258789,"0.1":60.09000015258789,"0.2":60.09000015258789,"0.3":60.09000015258789,"0.4":60.09000015258789,"0.5":60.09000015258789,"0.6":60.09000015258789,"0.7":60.09000015258789,"0.8":60.09000015258789,"0.9":60.09000015258789,"0.95":60.09000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.175451","as_of":"2025-11-24T00:00:00","forecast_date":"2025-12-01T00:00:00","payload":{"point_forecast":58.060001373291016,"quantiles":{"0.05":58.060001373291016,"0.1":58.060001373291016,"0.2":58.060001373291016,"0.3":58.060001373291016,"0.4":58.060001373291016,"0.5":58.060001373291016,"0.6":58.060001373291016,"0.7":58.060001373291016,"0.8":58.060001373291016,"0.9":58.060001373291016,"0.95":58.060001373291016}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.175451","as_of":"2025-11-24T00:00:00","forecast_date":"2025-12-08T00:00:00","payload":{"point_forecast":58.060001373291016,"quantiles":{"0.05":58.060001373291016,"0.1":58.060001373291016,"0.2":58.060001373291016,"0.3":58.060001373291016,"0.4":58.060001373291016,"0.5":58.060001373291016,"0.6":58.060001373291016,"0.7":58.060001373291016,"0.8":58.060001373291016,"0.9":58.060001373291016,"0.95":58.060001373291016}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.175451","as_of":"2025-11-24T00:00:00","forecast_date":"2025-12-23T00:00:00","payload":{"point_forecast":58.060001373291016,"quantiles":{"0.05":58.060001373291016,"0.1":58.060001373291016,"0.2":58.060001373291016,"0.3":58.060001373291016,"0.4":58.060001373291016,"0.5":58.060001373291016,"0.6":58.060001373291016,"0.7":58.060001373291016,"0.8":58.060001373291016,"0.9":58.060001373291016,"0.95":58.060001373291016}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.184972","as_of":"2025-12-01T00:00:00","forecast_date":"2025-12-08T00:00:00","payload":{"point_forecast":58.54999923706055,"quantiles":{"0.05":58.54999923706055,"0.1":58.54999923706055,"0.2":58.54999923706055,"0.3":58.54999923706055,"0.4":58.54999923706055,"0.5":58.54999923706055,"0.6":58.54999923706055,"0.7":58.54999923706055,"0.8":58.54999923706055,"0.9":58.54999923706055,"0.95":58.54999923706055}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.184972","as_of":"2025-12-01T00:00:00","forecast_date":"2025-12-15T00:00:00","payload":{"point_forecast":58.54999923706055,"quantiles":{"0.05":58.54999923706055,"0.1":58.54999923706055,"0.2":58.54999923706055,"0.3":58.54999923706055,"0.4":58.54999923706055,"0.5":58.54999923706055,"0.6":58.54999923706055,"0.7":58.54999923706055,"0.8":58.54999923706055,"0.9":58.54999923706055,"0.95":58.54999923706055}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.184972","as_of":"2025-12-01T00:00:00","forecast_date":"2025-12-30T00:00:00","payload":{"point_forecast":58.54999923706055,"quantiles":{"0.05":58.54999923706055,"0.1":58.54999923706055,"0.2":58.54999923706055,"0.3":58.54999923706055,"0.4":58.54999923706055,"0.5":58.54999923706055,"0.6":58.54999923706055,"0.7":58.54999923706055,"0.8":58.54999923706055,"0.9":58.54999923706055,"0.95":58.54999923706055}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.194540","as_of":"2025-12-08T00:00:00","forecast_date":"2025-12-15T00:00:00","payload":{"point_forecast":60.08000183105469,"quantiles":{"0.05":60.08000183105469,"0.1":60.08000183105469,"0.2":60.08000183105469,"0.3":60.08000183105469,"0.4":60.08000183105469,"0.5":60.08000183105469,"0.6":60.08000183105469,"0.7":60.08000183105469,"0.8":60.08000183105469,"0.9":60.08000183105469,"0.95":60.08000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.194540","as_of":"2025-12-08T00:00:00","forecast_date":"2025-12-22T00:00:00","payload":{"point_forecast":60.08000183105469,"quantiles":{"0.05":60.08000183105469,"0.1":60.08000183105469,"0.2":60.08000183105469,"0.3":60.08000183105469,"0.4":60.08000183105469,"0.5":60.08000183105469,"0.6":60.08000183105469,"0.7":60.08000183105469,"0.8":60.08000183105469,"0.9":60.08000183105469,"0.95":60.08000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.194540","as_of":"2025-12-08T00:00:00","forecast_date":"2026-01-06T00:00:00","payload":{"point_forecast":60.08000183105469,"quantiles":{"0.05":60.08000183105469,"0.1":60.08000183105469,"0.2":60.08000183105469,"0.3":60.08000183105469,"0.4":60.08000183105469,"0.5":60.08000183105469,"0.6":60.08000183105469,"0.7":60.08000183105469,"0.8":60.08000183105469,"0.9":60.08000183105469,"0.95":60.08000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.204333","as_of":"2025-12-15T00:00:00","forecast_date":"2025-12-22T00:00:00","payload":{"point_forecast":57.439998626708984,"quantiles":{"0.05":57.439998626708984,"0.1":57.439998626708984,"0.2":57.439998626708984,"0.3":57.439998626708984,"0.4":57.439998626708984,"0.5":57.439998626708984,"0.6":57.439998626708984,"0.7":57.439998626708984,"0.8":57.439998626708984,"0.9":57.439998626708984,"0.95":57.439998626708984}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.204333","as_of":"2025-12-15T00:00:00","forecast_date":"2025-12-29T00:00:00","payload":{"point_forecast":57.439998626708984,"quantiles":{"0.05":57.439998626708984,"0.1":57.439998626708984,"0.2":57.439998626708984,"0.3":57.439998626708984,"0.4":57.439998626708984,"0.5":57.439998626708984,"0.6":57.439998626708984,"0.7":57.439998626708984,"0.8":57.439998626708984,"0.9":57.439998626708984,"0.95":57.439998626708984}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.204333","as_of":"2025-12-15T00:00:00","forecast_date":"2026-01-13T00:00:00","payload":{"point_forecast":57.439998626708984,"quantiles":{"0.05":57.439998626708984,"0.1":57.439998626708984,"0.2":57.439998626708984,"0.3":57.439998626708984,"0.4":57.439998626708984,"0.5":57.439998626708984,"0.6":57.439998626708984,"0.7":57.439998626708984,"0.8":57.439998626708984,"0.9":57.439998626708984,"0.95":57.439998626708984}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.213952","as_of":"2025-12-22T00:00:00","forecast_date":"2025-12-29T00:00:00","payload":{"point_forecast":56.65999984741211,"quantiles":{"0.05":56.65999984741211,"0.1":56.65999984741211,"0.2":56.65999984741211,"0.3":56.65999984741211,"0.4":56.65999984741211,"0.5":56.65999984741211,"0.6":56.65999984741211,"0.7":56.65999984741211,"0.8":56.65999984741211,"0.9":56.65999984741211,"0.95":56.65999984741211}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.213952","as_of":"2025-12-22T00:00:00","forecast_date":"2026-01-05T00:00:00","payload":{"point_forecast":56.65999984741211,"quantiles":{"0.05":56.65999984741211,"0.1":56.65999984741211,"0.2":56.65999984741211,"0.3":56.65999984741211,"0.4":56.65999984741211,"0.5":56.65999984741211,"0.6":56.65999984741211,"0.7":56.65999984741211,"0.8":56.65999984741211,"0.9":56.65999984741211,"0.95":56.65999984741211}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.213952","as_of":"2025-12-22T00:00:00","forecast_date":"2026-01-20T00:00:00","payload":{"point_forecast":56.65999984741211,"quantiles":{"0.05":56.65999984741211,"0.1":56.65999984741211,"0.2":56.65999984741211,"0.3":56.65999984741211,"0.4":56.65999984741211,"0.5":56.65999984741211,"0.6":56.65999984741211,"0.7":56.65999984741211,"0.8":56.65999984741211,"0.9":56.65999984741211,"0.95":56.65999984741211}},"metadata":{}}],"scores":[4.8600006103515625,1.2600021362304688,3.4000015258789062,3.25,4.709999084472656,4.719993591308594,6.029998779296875,1.5,2.3400039672851562,5.730003356933594,0.20999908447265625,4.269996643066406,0.3000030517578125,4.75,0.04000091552734375,2.3699951171875,3.839996337890625,2.029998779296875,4.370002746582031,1.4000015258789062,3.7300033569335938,2.1800003051757812,1.4399948120117188,0.5400009155273438,2.0699996948242188,7.459999084472656,1.9300003051757812,4.3000030517578125,5.849998474121094,3.2000045776367188,7.579998016357422,3.970001220703125,8.65999984741211,7.8300018310546875,8.94000244140625,0.4600028991699219,1.0900001525878906,2.9000015258789062,1.5800018310546875,0.5499992370605469,2.1699981689453125,2.6300010681152344,7.549999237060547,2.1199989318847656,5.8899993896484375,1.0699996948242188,2.1300010681152344,3.6599998474121094,4.399997711181641,5.119998931884766,1.6699981689453125,3.960002899169922,0.029998779296875,12.349994659423828,0.9900016784667969,3.7600021362304688,2.8400039672851562,4.5,10.979995727539062,4.659996032714844,7.189994812011719,3.9300003051757812,3.75,4.470001220703125,7.870002746582031,6.4600067138671875,9.819999694824219,7.0,8.720001220703125,2.410003662109375,1.4600067138671875,3.69000244140625,0.48000335693359375,0.6999969482421875,1.339996337890625,1.25,1.7399978637695312,5.279998779296875,0.6299972534179688,1.0499954223632812,4.989997863769531,1.1299972534179688,1.2000045776367188,1.910003662109375,3.3700027465820312,3.910003662109375,1.7400054931640625,0.4600028991699219,0.9200019836425781,1.25,2.0000038146972656,1.7199974060058594,1.4000015258789062,0.25,1.7500038146972656,0.7100028991699219,1.6400032043457031,1.4300003051757812,0.7700004577636719,0.1399993896484375,0.049999237060546875,0.7600021362304688,3.9899978637695312,0.7700004577636719,0.9900016784667969,4.8600006103515625,4.030002593994141,6.229999542236328,5.569999694824219,1.3899993896484375,3.3600006103515625,0.31999969482421875,1.3800010681152344,2.4099998474121094,2.1399993896484375,3.770000457763672,3.509998321533203,3.200000762939453,0.4500007629394531,1.3699989318847656,3.549999237060547,0.8499984741210938,1.0699996948242188,2.3400001525878906,0.15999984741210938,0.9099998474121094,1.5,1.25,0.7700004577636719,4.819999694824219,1.2599983215332031,0.8199996948242188,0.31999969482421875,0.3300018310546875,1.7299995422363281,0.5999984741210938,3.2600021362304688,2.0700035095214844,2.950000762939453,0.5699996948242188,0.6400032043457031,3.710002899169922,1.4200019836425781,1.6599998474121094,3.6800003051757812],"mean_crps":2.92993137754243,"ran_at":"2026-05-22T15:15:09.221189","skipped_origins":0} +{"spec":{"task":{"task_id":"wti_oil_price_forecast","target_series_id":"wti_crude_oil_price","horizons":[5,10,21],"frequency":"B","description":"WTI Crude Oil continuous front-month futures Close price (yfinance symbol: CL=F), projected 5, 10, and 21 trading days ahead.","payload_type":"continuous","categories":null,"resolution_fn":"observed_value_at_resolution_timestamp"},"start":"2025-01-06T00:00:00","end":"2025-12-22T00:00:00","stride":5,"origin_dates":null,"warmup":250,"description":"Weekly rolling backtest in 2025 for daily WTI crude oil price forecasting. Evaluates trajectory forecasts (5, 10, 21 business days) with CRPS/MAE and binary up-shock forecasts (climb > $5 in 5 business days) with Brier Score. Used to select the top contender models."},"predictor_id":"last_value_naive","predictions":[{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.649393","as_of":"2025-01-06T00:00:00","forecast_date":"2025-01-13T00:00:00","payload":{"point_forecast":73.95999908447266,"quantiles":{"0.05":73.95999908447266,"0.1":73.95999908447266,"0.2":73.95999908447266,"0.3":73.95999908447266,"0.4":73.95999908447266,"0.5":73.95999908447266,"0.6":73.95999908447266,"0.7":73.95999908447266,"0.8":73.95999908447266,"0.9":73.95999908447266,"0.95":73.95999908447266}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.649393","as_of":"2025-01-06T00:00:00","forecast_date":"2025-02-04T00:00:00","payload":{"point_forecast":73.95999908447266,"quantiles":{"0.05":73.95999908447266,"0.1":73.95999908447266,"0.2":73.95999908447266,"0.3":73.95999908447266,"0.4":73.95999908447266,"0.5":73.95999908447266,"0.6":73.95999908447266,"0.7":73.95999908447266,"0.8":73.95999908447266,"0.9":73.95999908447266,"0.95":73.95999908447266}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.660855","as_of":"2025-01-13T00:00:00","forecast_date":"2025-01-27T00:00:00","payload":{"point_forecast":76.56999969482422,"quantiles":{"0.05":76.56999969482422,"0.1":76.56999969482422,"0.2":76.56999969482422,"0.3":76.56999969482422,"0.4":76.56999969482422,"0.5":76.56999969482422,"0.6":76.56999969482422,"0.7":76.56999969482422,"0.8":76.56999969482422,"0.9":76.56999969482422,"0.95":76.56999969482422}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.660855","as_of":"2025-01-13T00:00:00","forecast_date":"2025-02-11T00:00:00","payload":{"point_forecast":76.56999969482422,"quantiles":{"0.05":76.56999969482422,"0.1":76.56999969482422,"0.2":76.56999969482422,"0.3":76.56999969482422,"0.4":76.56999969482422,"0.5":76.56999969482422,"0.6":76.56999969482422,"0.7":76.56999969482422,"0.8":76.56999969482422,"0.9":76.56999969482422,"0.95":76.56999969482422}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.671201","as_of":"2025-01-20T00:00:00","forecast_date":"2025-01-27T00:00:00","payload":{"point_forecast":77.87999725341797,"quantiles":{"0.05":77.87999725341797,"0.1":77.87999725341797,"0.2":77.87999725341797,"0.3":77.87999725341797,"0.4":77.87999725341797,"0.5":77.87999725341797,"0.6":77.87999725341797,"0.7":77.87999725341797,"0.8":77.87999725341797,"0.9":77.87999725341797,"0.95":77.87999725341797}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.671201","as_of":"2025-01-20T00:00:00","forecast_date":"2025-02-03T00:00:00","payload":{"point_forecast":77.87999725341797,"quantiles":{"0.05":77.87999725341797,"0.1":77.87999725341797,"0.2":77.87999725341797,"0.3":77.87999725341797,"0.4":77.87999725341797,"0.5":77.87999725341797,"0.6":77.87999725341797,"0.7":77.87999725341797,"0.8":77.87999725341797,"0.9":77.87999725341797,"0.95":77.87999725341797}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.671201","as_of":"2025-01-20T00:00:00","forecast_date":"2025-02-18T00:00:00","payload":{"point_forecast":77.87999725341797,"quantiles":{"0.05":77.87999725341797,"0.1":77.87999725341797,"0.2":77.87999725341797,"0.3":77.87999725341797,"0.4":77.87999725341797,"0.5":77.87999725341797,"0.6":77.87999725341797,"0.7":77.87999725341797,"0.8":77.87999725341797,"0.9":77.87999725341797,"0.95":77.87999725341797}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.681079","as_of":"2025-01-27T00:00:00","forecast_date":"2025-02-03T00:00:00","payload":{"point_forecast":74.66000366210938,"quantiles":{"0.05":74.66000366210938,"0.1":74.66000366210938,"0.2":74.66000366210938,"0.3":74.66000366210938,"0.4":74.66000366210938,"0.5":74.66000366210938,"0.6":74.66000366210938,"0.7":74.66000366210938,"0.8":74.66000366210938,"0.9":74.66000366210938,"0.95":74.66000366210938}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.681079","as_of":"2025-01-27T00:00:00","forecast_date":"2025-02-10T00:00:00","payload":{"point_forecast":74.66000366210938,"quantiles":{"0.05":74.66000366210938,"0.1":74.66000366210938,"0.2":74.66000366210938,"0.3":74.66000366210938,"0.4":74.66000366210938,"0.5":74.66000366210938,"0.6":74.66000366210938,"0.7":74.66000366210938,"0.8":74.66000366210938,"0.9":74.66000366210938,"0.95":74.66000366210938}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.681079","as_of":"2025-01-27T00:00:00","forecast_date":"2025-02-25T00:00:00","payload":{"point_forecast":74.66000366210938,"quantiles":{"0.05":74.66000366210938,"0.1":74.66000366210938,"0.2":74.66000366210938,"0.3":74.66000366210938,"0.4":74.66000366210938,"0.5":74.66000366210938,"0.6":74.66000366210938,"0.7":74.66000366210938,"0.8":74.66000366210938,"0.9":74.66000366210938,"0.95":74.66000366210938}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.691166","as_of":"2025-02-03T00:00:00","forecast_date":"2025-02-10T00:00:00","payload":{"point_forecast":72.52999877929688,"quantiles":{"0.05":72.52999877929688,"0.1":72.52999877929688,"0.2":72.52999877929688,"0.3":72.52999877929688,"0.4":72.52999877929688,"0.5":72.52999877929688,"0.6":72.52999877929688,"0.7":72.52999877929688,"0.8":72.52999877929688,"0.9":72.52999877929688,"0.95":72.52999877929688}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.691166","as_of":"2025-02-03T00:00:00","forecast_date":"2025-03-04T00:00:00","payload":{"point_forecast":72.52999877929688,"quantiles":{"0.05":72.52999877929688,"0.1":72.52999877929688,"0.2":72.52999877929688,"0.3":72.52999877929688,"0.4":72.52999877929688,"0.5":72.52999877929688,"0.6":72.52999877929688,"0.7":72.52999877929688,"0.8":72.52999877929688,"0.9":72.52999877929688,"0.95":72.52999877929688}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.700990","as_of":"2025-02-10T00:00:00","forecast_date":"2025-02-24T00:00:00","payload":{"point_forecast":71.0,"quantiles":{"0.05":71.0,"0.1":71.0,"0.2":71.0,"0.3":71.0,"0.4":71.0,"0.5":71.0,"0.6":71.0,"0.7":71.0,"0.8":71.0,"0.9":71.0,"0.95":71.0}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.700990","as_of":"2025-02-10T00:00:00","forecast_date":"2025-03-11T00:00:00","payload":{"point_forecast":71.0,"quantiles":{"0.05":71.0,"0.1":71.0,"0.2":71.0,"0.3":71.0,"0.4":71.0,"0.5":71.0,"0.6":71.0,"0.7":71.0,"0.8":71.0,"0.9":71.0,"0.95":71.0}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.710609","as_of":"2025-02-17T00:00:00","forecast_date":"2025-02-24T00:00:00","payload":{"point_forecast":70.73999786376953,"quantiles":{"0.05":70.73999786376953,"0.1":70.73999786376953,"0.2":70.73999786376953,"0.3":70.73999786376953,"0.4":70.73999786376953,"0.5":70.73999786376953,"0.6":70.73999786376953,"0.7":70.73999786376953,"0.8":70.73999786376953,"0.9":70.73999786376953,"0.95":70.73999786376953}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.710609","as_of":"2025-02-17T00:00:00","forecast_date":"2025-03-03T00:00:00","payload":{"point_forecast":70.73999786376953,"quantiles":{"0.05":70.73999786376953,"0.1":70.73999786376953,"0.2":70.73999786376953,"0.3":70.73999786376953,"0.4":70.73999786376953,"0.5":70.73999786376953,"0.6":70.73999786376953,"0.7":70.73999786376953,"0.8":70.73999786376953,"0.9":70.73999786376953,"0.95":70.73999786376953}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.710609","as_of":"2025-02-17T00:00:00","forecast_date":"2025-03-18T00:00:00","payload":{"point_forecast":70.73999786376953,"quantiles":{"0.05":70.73999786376953,"0.1":70.73999786376953,"0.2":70.73999786376953,"0.3":70.73999786376953,"0.4":70.73999786376953,"0.5":70.73999786376953,"0.6":70.73999786376953,"0.7":70.73999786376953,"0.8":70.73999786376953,"0.9":70.73999786376953,"0.95":70.73999786376953}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.720796","as_of":"2025-02-24T00:00:00","forecast_date":"2025-03-03T00:00:00","payload":{"point_forecast":70.4000015258789,"quantiles":{"0.05":70.4000015258789,"0.1":70.4000015258789,"0.2":70.4000015258789,"0.3":70.4000015258789,"0.4":70.4000015258789,"0.5":70.4000015258789,"0.6":70.4000015258789,"0.7":70.4000015258789,"0.8":70.4000015258789,"0.9":70.4000015258789,"0.95":70.4000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.720796","as_of":"2025-02-24T00:00:00","forecast_date":"2025-03-10T00:00:00","payload":{"point_forecast":70.4000015258789,"quantiles":{"0.05":70.4000015258789,"0.1":70.4000015258789,"0.2":70.4000015258789,"0.3":70.4000015258789,"0.4":70.4000015258789,"0.5":70.4000015258789,"0.6":70.4000015258789,"0.7":70.4000015258789,"0.8":70.4000015258789,"0.9":70.4000015258789,"0.95":70.4000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.720796","as_of":"2025-02-24T00:00:00","forecast_date":"2025-03-25T00:00:00","payload":{"point_forecast":70.4000015258789,"quantiles":{"0.05":70.4000015258789,"0.1":70.4000015258789,"0.2":70.4000015258789,"0.3":70.4000015258789,"0.4":70.4000015258789,"0.5":70.4000015258789,"0.6":70.4000015258789,"0.7":70.4000015258789,"0.8":70.4000015258789,"0.9":70.4000015258789,"0.95":70.4000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.730886","as_of":"2025-03-03T00:00:00","forecast_date":"2025-03-10T00:00:00","payload":{"point_forecast":69.76000213623047,"quantiles":{"0.05":69.76000213623047,"0.1":69.76000213623047,"0.2":69.76000213623047,"0.3":69.76000213623047,"0.4":69.76000213623047,"0.5":69.76000213623047,"0.6":69.76000213623047,"0.7":69.76000213623047,"0.8":69.76000213623047,"0.9":69.76000213623047,"0.95":69.76000213623047}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.730886","as_of":"2025-03-03T00:00:00","forecast_date":"2025-03-17T00:00:00","payload":{"point_forecast":69.76000213623047,"quantiles":{"0.05":69.76000213623047,"0.1":69.76000213623047,"0.2":69.76000213623047,"0.3":69.76000213623047,"0.4":69.76000213623047,"0.5":69.76000213623047,"0.6":69.76000213623047,"0.7":69.76000213623047,"0.8":69.76000213623047,"0.9":69.76000213623047,"0.95":69.76000213623047}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.730886","as_of":"2025-03-03T00:00:00","forecast_date":"2025-04-01T00:00:00","payload":{"point_forecast":69.76000213623047,"quantiles":{"0.05":69.76000213623047,"0.1":69.76000213623047,"0.2":69.76000213623047,"0.3":69.76000213623047,"0.4":69.76000213623047,"0.5":69.76000213623047,"0.6":69.76000213623047,"0.7":69.76000213623047,"0.8":69.76000213623047,"0.9":69.76000213623047,"0.95":69.76000213623047}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.740533","as_of":"2025-03-10T00:00:00","forecast_date":"2025-03-17T00:00:00","payload":{"point_forecast":67.04000091552734,"quantiles":{"0.05":67.04000091552734,"0.1":67.04000091552734,"0.2":67.04000091552734,"0.3":67.04000091552734,"0.4":67.04000091552734,"0.5":67.04000091552734,"0.6":67.04000091552734,"0.7":67.04000091552734,"0.8":67.04000091552734,"0.9":67.04000091552734,"0.95":67.04000091552734}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.740533","as_of":"2025-03-10T00:00:00","forecast_date":"2025-03-24T00:00:00","payload":{"point_forecast":67.04000091552734,"quantiles":{"0.05":67.04000091552734,"0.1":67.04000091552734,"0.2":67.04000091552734,"0.3":67.04000091552734,"0.4":67.04000091552734,"0.5":67.04000091552734,"0.6":67.04000091552734,"0.7":67.04000091552734,"0.8":67.04000091552734,"0.9":67.04000091552734,"0.95":67.04000091552734}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.740533","as_of":"2025-03-10T00:00:00","forecast_date":"2025-04-08T00:00:00","payload":{"point_forecast":67.04000091552734,"quantiles":{"0.05":67.04000091552734,"0.1":67.04000091552734,"0.2":67.04000091552734,"0.3":67.04000091552734,"0.4":67.04000091552734,"0.5":67.04000091552734,"0.6":67.04000091552734,"0.7":67.04000091552734,"0.8":67.04000091552734,"0.9":67.04000091552734,"0.95":67.04000091552734}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.750075","as_of":"2025-03-17T00:00:00","forecast_date":"2025-03-24T00:00:00","payload":{"point_forecast":67.18000030517578,"quantiles":{"0.05":67.18000030517578,"0.1":67.18000030517578,"0.2":67.18000030517578,"0.3":67.18000030517578,"0.4":67.18000030517578,"0.5":67.18000030517578,"0.6":67.18000030517578,"0.7":67.18000030517578,"0.8":67.18000030517578,"0.9":67.18000030517578,"0.95":67.18000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.750075","as_of":"2025-03-17T00:00:00","forecast_date":"2025-03-31T00:00:00","payload":{"point_forecast":67.18000030517578,"quantiles":{"0.05":67.18000030517578,"0.1":67.18000030517578,"0.2":67.18000030517578,"0.3":67.18000030517578,"0.4":67.18000030517578,"0.5":67.18000030517578,"0.6":67.18000030517578,"0.7":67.18000030517578,"0.8":67.18000030517578,"0.9":67.18000030517578,"0.95":67.18000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.750075","as_of":"2025-03-17T00:00:00","forecast_date":"2025-04-15T00:00:00","payload":{"point_forecast":67.18000030517578,"quantiles":{"0.05":67.18000030517578,"0.1":67.18000030517578,"0.2":67.18000030517578,"0.3":67.18000030517578,"0.4":67.18000030517578,"0.5":67.18000030517578,"0.6":67.18000030517578,"0.7":67.18000030517578,"0.8":67.18000030517578,"0.9":67.18000030517578,"0.95":67.18000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.759955","as_of":"2025-03-24T00:00:00","forecast_date":"2025-03-31T00:00:00","payload":{"point_forecast":68.27999877929688,"quantiles":{"0.05":68.27999877929688,"0.1":68.27999877929688,"0.2":68.27999877929688,"0.3":68.27999877929688,"0.4":68.27999877929688,"0.5":68.27999877929688,"0.6":68.27999877929688,"0.7":68.27999877929688,"0.8":68.27999877929688,"0.9":68.27999877929688,"0.95":68.27999877929688}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.759955","as_of":"2025-03-24T00:00:00","forecast_date":"2025-04-07T00:00:00","payload":{"point_forecast":68.27999877929688,"quantiles":{"0.05":68.27999877929688,"0.1":68.27999877929688,"0.2":68.27999877929688,"0.3":68.27999877929688,"0.4":68.27999877929688,"0.5":68.27999877929688,"0.6":68.27999877929688,"0.7":68.27999877929688,"0.8":68.27999877929688,"0.9":68.27999877929688,"0.95":68.27999877929688}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.759955","as_of":"2025-03-24T00:00:00","forecast_date":"2025-04-22T00:00:00","payload":{"point_forecast":68.27999877929688,"quantiles":{"0.05":68.27999877929688,"0.1":68.27999877929688,"0.2":68.27999877929688,"0.3":68.27999877929688,"0.4":68.27999877929688,"0.5":68.27999877929688,"0.6":68.27999877929688,"0.7":68.27999877929688,"0.8":68.27999877929688,"0.9":68.27999877929688,"0.95":68.27999877929688}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.769705","as_of":"2025-03-31T00:00:00","forecast_date":"2025-04-07T00:00:00","payload":{"point_forecast":69.36000061035156,"quantiles":{"0.05":69.36000061035156,"0.1":69.36000061035156,"0.2":69.36000061035156,"0.3":69.36000061035156,"0.4":69.36000061035156,"0.5":69.36000061035156,"0.6":69.36000061035156,"0.7":69.36000061035156,"0.8":69.36000061035156,"0.9":69.36000061035156,"0.95":69.36000061035156}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.769705","as_of":"2025-03-31T00:00:00","forecast_date":"2025-04-14T00:00:00","payload":{"point_forecast":69.36000061035156,"quantiles":{"0.05":69.36000061035156,"0.1":69.36000061035156,"0.2":69.36000061035156,"0.3":69.36000061035156,"0.4":69.36000061035156,"0.5":69.36000061035156,"0.6":69.36000061035156,"0.7":69.36000061035156,"0.8":69.36000061035156,"0.9":69.36000061035156,"0.95":69.36000061035156}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.769705","as_of":"2025-03-31T00:00:00","forecast_date":"2025-04-29T00:00:00","payload":{"point_forecast":69.36000061035156,"quantiles":{"0.05":69.36000061035156,"0.1":69.36000061035156,"0.2":69.36000061035156,"0.3":69.36000061035156,"0.4":69.36000061035156,"0.5":69.36000061035156,"0.6":69.36000061035156,"0.7":69.36000061035156,"0.8":69.36000061035156,"0.9":69.36000061035156,"0.95":69.36000061035156}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.779466","as_of":"2025-04-07T00:00:00","forecast_date":"2025-04-14T00:00:00","payload":{"point_forecast":61.9900016784668,"quantiles":{"0.05":61.9900016784668,"0.1":61.9900016784668,"0.2":61.9900016784668,"0.3":61.9900016784668,"0.4":61.9900016784668,"0.5":61.9900016784668,"0.6":61.9900016784668,"0.7":61.9900016784668,"0.8":61.9900016784668,"0.9":61.9900016784668,"0.95":61.9900016784668}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.779466","as_of":"2025-04-07T00:00:00","forecast_date":"2025-04-21T00:00:00","payload":{"point_forecast":61.9900016784668,"quantiles":{"0.05":61.9900016784668,"0.1":61.9900016784668,"0.2":61.9900016784668,"0.3":61.9900016784668,"0.4":61.9900016784668,"0.5":61.9900016784668,"0.6":61.9900016784668,"0.7":61.9900016784668,"0.8":61.9900016784668,"0.9":61.9900016784668,"0.95":61.9900016784668}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.779466","as_of":"2025-04-07T00:00:00","forecast_date":"2025-05-06T00:00:00","payload":{"point_forecast":61.9900016784668,"quantiles":{"0.05":61.9900016784668,"0.1":61.9900016784668,"0.2":61.9900016784668,"0.3":61.9900016784668,"0.4":61.9900016784668,"0.5":61.9900016784668,"0.6":61.9900016784668,"0.7":61.9900016784668,"0.8":61.9900016784668,"0.9":61.9900016784668,"0.95":61.9900016784668}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.789195","as_of":"2025-04-14T00:00:00","forecast_date":"2025-04-21T00:00:00","payload":{"point_forecast":61.5,"quantiles":{"0.05":61.5,"0.1":61.5,"0.2":61.5,"0.3":61.5,"0.4":61.5,"0.5":61.5,"0.6":61.5,"0.7":61.5,"0.8":61.5,"0.9":61.5,"0.95":61.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.789195","as_of":"2025-04-14T00:00:00","forecast_date":"2025-04-28T00:00:00","payload":{"point_forecast":61.5,"quantiles":{"0.05":61.5,"0.1":61.5,"0.2":61.5,"0.3":61.5,"0.4":61.5,"0.5":61.5,"0.6":61.5,"0.7":61.5,"0.8":61.5,"0.9":61.5,"0.95":61.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.789195","as_of":"2025-04-14T00:00:00","forecast_date":"2025-05-13T00:00:00","payload":{"point_forecast":61.5,"quantiles":{"0.05":61.5,"0.1":61.5,"0.2":61.5,"0.3":61.5,"0.4":61.5,"0.5":61.5,"0.6":61.5,"0.7":61.5,"0.8":61.5,"0.9":61.5,"0.95":61.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.799182","as_of":"2025-04-21T00:00:00","forecast_date":"2025-04-28T00:00:00","payload":{"point_forecast":64.68000030517578,"quantiles":{"0.05":64.68000030517578,"0.1":64.68000030517578,"0.2":64.68000030517578,"0.3":64.68000030517578,"0.4":64.68000030517578,"0.5":64.68000030517578,"0.6":64.68000030517578,"0.7":64.68000030517578,"0.8":64.68000030517578,"0.9":64.68000030517578,"0.95":64.68000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.799182","as_of":"2025-04-21T00:00:00","forecast_date":"2025-05-05T00:00:00","payload":{"point_forecast":64.68000030517578,"quantiles":{"0.05":64.68000030517578,"0.1":64.68000030517578,"0.2":64.68000030517578,"0.3":64.68000030517578,"0.4":64.68000030517578,"0.5":64.68000030517578,"0.6":64.68000030517578,"0.7":64.68000030517578,"0.8":64.68000030517578,"0.9":64.68000030517578,"0.95":64.68000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.799182","as_of":"2025-04-21T00:00:00","forecast_date":"2025-05-20T00:00:00","payload":{"point_forecast":64.68000030517578,"quantiles":{"0.05":64.68000030517578,"0.1":64.68000030517578,"0.2":64.68000030517578,"0.3":64.68000030517578,"0.4":64.68000030517578,"0.5":64.68000030517578,"0.6":64.68000030517578,"0.7":64.68000030517578,"0.8":64.68000030517578,"0.9":64.68000030517578,"0.95":64.68000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.808858","as_of":"2025-04-28T00:00:00","forecast_date":"2025-05-05T00:00:00","payload":{"point_forecast":63.02000045776367,"quantiles":{"0.05":63.02000045776367,"0.1":63.02000045776367,"0.2":63.02000045776367,"0.3":63.02000045776367,"0.4":63.02000045776367,"0.5":63.02000045776367,"0.6":63.02000045776367,"0.7":63.02000045776367,"0.8":63.02000045776367,"0.9":63.02000045776367,"0.95":63.02000045776367}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.808858","as_of":"2025-04-28T00:00:00","forecast_date":"2025-05-12T00:00:00","payload":{"point_forecast":63.02000045776367,"quantiles":{"0.05":63.02000045776367,"0.1":63.02000045776367,"0.2":63.02000045776367,"0.3":63.02000045776367,"0.4":63.02000045776367,"0.5":63.02000045776367,"0.6":63.02000045776367,"0.7":63.02000045776367,"0.8":63.02000045776367,"0.9":63.02000045776367,"0.95":63.02000045776367}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.808858","as_of":"2025-04-28T00:00:00","forecast_date":"2025-05-27T00:00:00","payload":{"point_forecast":63.02000045776367,"quantiles":{"0.05":63.02000045776367,"0.1":63.02000045776367,"0.2":63.02000045776367,"0.3":63.02000045776367,"0.4":63.02000045776367,"0.5":63.02000045776367,"0.6":63.02000045776367,"0.7":63.02000045776367,"0.8":63.02000045776367,"0.9":63.02000045776367,"0.95":63.02000045776367}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.818630","as_of":"2025-05-05T00:00:00","forecast_date":"2025-05-12T00:00:00","payload":{"point_forecast":58.290000915527344,"quantiles":{"0.05":58.290000915527344,"0.1":58.290000915527344,"0.2":58.290000915527344,"0.3":58.290000915527344,"0.4":58.290000915527344,"0.5":58.290000915527344,"0.6":58.290000915527344,"0.7":58.290000915527344,"0.8":58.290000915527344,"0.9":58.290000915527344,"0.95":58.290000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.818630","as_of":"2025-05-05T00:00:00","forecast_date":"2025-05-19T00:00:00","payload":{"point_forecast":58.290000915527344,"quantiles":{"0.05":58.290000915527344,"0.1":58.290000915527344,"0.2":58.290000915527344,"0.3":58.290000915527344,"0.4":58.290000915527344,"0.5":58.290000915527344,"0.6":58.290000915527344,"0.7":58.290000915527344,"0.8":58.290000915527344,"0.9":58.290000915527344,"0.95":58.290000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.818630","as_of":"2025-05-05T00:00:00","forecast_date":"2025-06-03T00:00:00","payload":{"point_forecast":58.290000915527344,"quantiles":{"0.05":58.290000915527344,"0.1":58.290000915527344,"0.2":58.290000915527344,"0.3":58.290000915527344,"0.4":58.290000915527344,"0.5":58.290000915527344,"0.6":58.290000915527344,"0.7":58.290000915527344,"0.8":58.290000915527344,"0.9":58.290000915527344,"0.95":58.290000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.828394","as_of":"2025-05-12T00:00:00","forecast_date":"2025-05-19T00:00:00","payload":{"point_forecast":61.02000045776367,"quantiles":{"0.05":61.02000045776367,"0.1":61.02000045776367,"0.2":61.02000045776367,"0.3":61.02000045776367,"0.4":61.02000045776367,"0.5":61.02000045776367,"0.6":61.02000045776367,"0.7":61.02000045776367,"0.8":61.02000045776367,"0.9":61.02000045776367,"0.95":61.02000045776367}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.828394","as_of":"2025-05-12T00:00:00","forecast_date":"2025-06-10T00:00:00","payload":{"point_forecast":61.02000045776367,"quantiles":{"0.05":61.02000045776367,"0.1":61.02000045776367,"0.2":61.02000045776367,"0.3":61.02000045776367,"0.4":61.02000045776367,"0.5":61.02000045776367,"0.6":61.02000045776367,"0.7":61.02000045776367,"0.8":61.02000045776367,"0.9":61.02000045776367,"0.95":61.02000045776367}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.838086","as_of":"2025-05-19T00:00:00","forecast_date":"2025-06-02T00:00:00","payload":{"point_forecast":62.4900016784668,"quantiles":{"0.05":62.4900016784668,"0.1":62.4900016784668,"0.2":62.4900016784668,"0.3":62.4900016784668,"0.4":62.4900016784668,"0.5":62.4900016784668,"0.6":62.4900016784668,"0.7":62.4900016784668,"0.8":62.4900016784668,"0.9":62.4900016784668,"0.95":62.4900016784668}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.838086","as_of":"2025-05-19T00:00:00","forecast_date":"2025-06-17T00:00:00","payload":{"point_forecast":62.4900016784668,"quantiles":{"0.05":62.4900016784668,"0.1":62.4900016784668,"0.2":62.4900016784668,"0.3":62.4900016784668,"0.4":62.4900016784668,"0.5":62.4900016784668,"0.6":62.4900016784668,"0.7":62.4900016784668,"0.8":62.4900016784668,"0.9":62.4900016784668,"0.95":62.4900016784668}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.848039","as_of":"2025-05-26T00:00:00","forecast_date":"2025-06-02T00:00:00","payload":{"point_forecast":61.529998779296875,"quantiles":{"0.05":61.529998779296875,"0.1":61.529998779296875,"0.2":61.529998779296875,"0.3":61.529998779296875,"0.4":61.529998779296875,"0.5":61.529998779296875,"0.6":61.529998779296875,"0.7":61.529998779296875,"0.8":61.529998779296875,"0.9":61.529998779296875,"0.95":61.529998779296875}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.848039","as_of":"2025-05-26T00:00:00","forecast_date":"2025-06-09T00:00:00","payload":{"point_forecast":61.529998779296875,"quantiles":{"0.05":61.529998779296875,"0.1":61.529998779296875,"0.2":61.529998779296875,"0.3":61.529998779296875,"0.4":61.529998779296875,"0.5":61.529998779296875,"0.6":61.529998779296875,"0.7":61.529998779296875,"0.8":61.529998779296875,"0.9":61.529998779296875,"0.95":61.529998779296875}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.848039","as_of":"2025-05-26T00:00:00","forecast_date":"2025-06-24T00:00:00","payload":{"point_forecast":61.529998779296875,"quantiles":{"0.05":61.529998779296875,"0.1":61.529998779296875,"0.2":61.529998779296875,"0.3":61.529998779296875,"0.4":61.529998779296875,"0.5":61.529998779296875,"0.6":61.529998779296875,"0.7":61.529998779296875,"0.8":61.529998779296875,"0.9":61.529998779296875,"0.95":61.529998779296875}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.857909","as_of":"2025-06-02T00:00:00","forecast_date":"2025-06-09T00:00:00","payload":{"point_forecast":60.790000915527344,"quantiles":{"0.05":60.790000915527344,"0.1":60.790000915527344,"0.2":60.790000915527344,"0.3":60.790000915527344,"0.4":60.790000915527344,"0.5":60.790000915527344,"0.6":60.790000915527344,"0.7":60.790000915527344,"0.8":60.790000915527344,"0.9":60.790000915527344,"0.95":60.790000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.857909","as_of":"2025-06-02T00:00:00","forecast_date":"2025-06-16T00:00:00","payload":{"point_forecast":60.790000915527344,"quantiles":{"0.05":60.790000915527344,"0.1":60.790000915527344,"0.2":60.790000915527344,"0.3":60.790000915527344,"0.4":60.790000915527344,"0.5":60.790000915527344,"0.6":60.790000915527344,"0.7":60.790000915527344,"0.8":60.790000915527344,"0.9":60.790000915527344,"0.95":60.790000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.857909","as_of":"2025-06-02T00:00:00","forecast_date":"2025-07-01T00:00:00","payload":{"point_forecast":60.790000915527344,"quantiles":{"0.05":60.790000915527344,"0.1":60.790000915527344,"0.2":60.790000915527344,"0.3":60.790000915527344,"0.4":60.790000915527344,"0.5":60.790000915527344,"0.6":60.790000915527344,"0.7":60.790000915527344,"0.8":60.790000915527344,"0.9":60.790000915527344,"0.95":60.790000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.867581","as_of":"2025-06-09T00:00:00","forecast_date":"2025-06-16T00:00:00","payload":{"point_forecast":64.58000183105469,"quantiles":{"0.05":64.58000183105469,"0.1":64.58000183105469,"0.2":64.58000183105469,"0.3":64.58000183105469,"0.4":64.58000183105469,"0.5":64.58000183105469,"0.6":64.58000183105469,"0.7":64.58000183105469,"0.8":64.58000183105469,"0.9":64.58000183105469,"0.95":64.58000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.867581","as_of":"2025-06-09T00:00:00","forecast_date":"2025-06-23T00:00:00","payload":{"point_forecast":64.58000183105469,"quantiles":{"0.05":64.58000183105469,"0.1":64.58000183105469,"0.2":64.58000183105469,"0.3":64.58000183105469,"0.4":64.58000183105469,"0.5":64.58000183105469,"0.6":64.58000183105469,"0.7":64.58000183105469,"0.8":64.58000183105469,"0.9":64.58000183105469,"0.95":64.58000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.867581","as_of":"2025-06-09T00:00:00","forecast_date":"2025-07-08T00:00:00","payload":{"point_forecast":64.58000183105469,"quantiles":{"0.05":64.58000183105469,"0.1":64.58000183105469,"0.2":64.58000183105469,"0.3":64.58000183105469,"0.4":64.58000183105469,"0.5":64.58000183105469,"0.6":64.58000183105469,"0.7":64.58000183105469,"0.8":64.58000183105469,"0.9":64.58000183105469,"0.95":64.58000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.877340","as_of":"2025-06-16T00:00:00","forecast_date":"2025-06-23T00:00:00","payload":{"point_forecast":72.9800033569336,"quantiles":{"0.05":72.9800033569336,"0.1":72.9800033569336,"0.2":72.9800033569336,"0.3":72.9800033569336,"0.4":72.9800033569336,"0.5":72.9800033569336,"0.6":72.9800033569336,"0.7":72.9800033569336,"0.8":72.9800033569336,"0.9":72.9800033569336,"0.95":72.9800033569336}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.877340","as_of":"2025-06-16T00:00:00","forecast_date":"2025-06-30T00:00:00","payload":{"point_forecast":72.9800033569336,"quantiles":{"0.05":72.9800033569336,"0.1":72.9800033569336,"0.2":72.9800033569336,"0.3":72.9800033569336,"0.4":72.9800033569336,"0.5":72.9800033569336,"0.6":72.9800033569336,"0.7":72.9800033569336,"0.8":72.9800033569336,"0.9":72.9800033569336,"0.95":72.9800033569336}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.877340","as_of":"2025-06-16T00:00:00","forecast_date":"2025-07-15T00:00:00","payload":{"point_forecast":72.9800033569336,"quantiles":{"0.05":72.9800033569336,"0.1":72.9800033569336,"0.2":72.9800033569336,"0.3":72.9800033569336,"0.4":72.9800033569336,"0.5":72.9800033569336,"0.6":72.9800033569336,"0.7":72.9800033569336,"0.8":72.9800033569336,"0.9":72.9800033569336,"0.95":72.9800033569336}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.887067","as_of":"2025-06-23T00:00:00","forecast_date":"2025-06-30T00:00:00","payload":{"point_forecast":74.93000030517578,"quantiles":{"0.05":74.93000030517578,"0.1":74.93000030517578,"0.2":74.93000030517578,"0.3":74.93000030517578,"0.4":74.93000030517578,"0.5":74.93000030517578,"0.6":74.93000030517578,"0.7":74.93000030517578,"0.8":74.93000030517578,"0.9":74.93000030517578,"0.95":74.93000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.887067","as_of":"2025-06-23T00:00:00","forecast_date":"2025-07-07T00:00:00","payload":{"point_forecast":74.93000030517578,"quantiles":{"0.05":74.93000030517578,"0.1":74.93000030517578,"0.2":74.93000030517578,"0.3":74.93000030517578,"0.4":74.93000030517578,"0.5":74.93000030517578,"0.6":74.93000030517578,"0.7":74.93000030517578,"0.8":74.93000030517578,"0.9":74.93000030517578,"0.95":74.93000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.887067","as_of":"2025-06-23T00:00:00","forecast_date":"2025-07-22T00:00:00","payload":{"point_forecast":74.93000030517578,"quantiles":{"0.05":74.93000030517578,"0.1":74.93000030517578,"0.2":74.93000030517578,"0.3":74.93000030517578,"0.4":74.93000030517578,"0.5":74.93000030517578,"0.6":74.93000030517578,"0.7":74.93000030517578,"0.8":74.93000030517578,"0.9":74.93000030517578,"0.95":74.93000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.896969","as_of":"2025-06-30T00:00:00","forecast_date":"2025-07-07T00:00:00","payload":{"point_forecast":65.5199966430664,"quantiles":{"0.05":65.5199966430664,"0.1":65.5199966430664,"0.2":65.5199966430664,"0.3":65.5199966430664,"0.4":65.5199966430664,"0.5":65.5199966430664,"0.6":65.5199966430664,"0.7":65.5199966430664,"0.8":65.5199966430664,"0.9":65.5199966430664,"0.95":65.5199966430664}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.896969","as_of":"2025-06-30T00:00:00","forecast_date":"2025-07-14T00:00:00","payload":{"point_forecast":65.5199966430664,"quantiles":{"0.05":65.5199966430664,"0.1":65.5199966430664,"0.2":65.5199966430664,"0.3":65.5199966430664,"0.4":65.5199966430664,"0.5":65.5199966430664,"0.6":65.5199966430664,"0.7":65.5199966430664,"0.8":65.5199966430664,"0.9":65.5199966430664,"0.95":65.5199966430664}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.896969","as_of":"2025-06-30T00:00:00","forecast_date":"2025-07-29T00:00:00","payload":{"point_forecast":65.5199966430664,"quantiles":{"0.05":65.5199966430664,"0.1":65.5199966430664,"0.2":65.5199966430664,"0.3":65.5199966430664,"0.4":65.5199966430664,"0.5":65.5199966430664,"0.6":65.5199966430664,"0.7":65.5199966430664,"0.8":65.5199966430664,"0.9":65.5199966430664,"0.95":65.5199966430664}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.906723","as_of":"2025-07-07T00:00:00","forecast_date":"2025-07-14T00:00:00","payload":{"point_forecast":66.5,"quantiles":{"0.05":66.5,"0.1":66.5,"0.2":66.5,"0.3":66.5,"0.4":66.5,"0.5":66.5,"0.6":66.5,"0.7":66.5,"0.8":66.5,"0.9":66.5,"0.95":66.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.906723","as_of":"2025-07-07T00:00:00","forecast_date":"2025-07-21T00:00:00","payload":{"point_forecast":66.5,"quantiles":{"0.05":66.5,"0.1":66.5,"0.2":66.5,"0.3":66.5,"0.4":66.5,"0.5":66.5,"0.6":66.5,"0.7":66.5,"0.8":66.5,"0.9":66.5,"0.95":66.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.906723","as_of":"2025-07-07T00:00:00","forecast_date":"2025-08-05T00:00:00","payload":{"point_forecast":66.5,"quantiles":{"0.05":66.5,"0.1":66.5,"0.2":66.5,"0.3":66.5,"0.4":66.5,"0.5":66.5,"0.6":66.5,"0.7":66.5,"0.8":66.5,"0.9":66.5,"0.95":66.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.916242","as_of":"2025-07-14T00:00:00","forecast_date":"2025-07-21T00:00:00","payload":{"point_forecast":68.44999694824219,"quantiles":{"0.05":68.44999694824219,"0.1":68.44999694824219,"0.2":68.44999694824219,"0.3":68.44999694824219,"0.4":68.44999694824219,"0.5":68.44999694824219,"0.6":68.44999694824219,"0.7":68.44999694824219,"0.8":68.44999694824219,"0.9":68.44999694824219,"0.95":68.44999694824219}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.916242","as_of":"2025-07-14T00:00:00","forecast_date":"2025-07-28T00:00:00","payload":{"point_forecast":68.44999694824219,"quantiles":{"0.05":68.44999694824219,"0.1":68.44999694824219,"0.2":68.44999694824219,"0.3":68.44999694824219,"0.4":68.44999694824219,"0.5":68.44999694824219,"0.6":68.44999694824219,"0.7":68.44999694824219,"0.8":68.44999694824219,"0.9":68.44999694824219,"0.95":68.44999694824219}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.916242","as_of":"2025-07-14T00:00:00","forecast_date":"2025-08-12T00:00:00","payload":{"point_forecast":68.44999694824219,"quantiles":{"0.05":68.44999694824219,"0.1":68.44999694824219,"0.2":68.44999694824219,"0.3":68.44999694824219,"0.4":68.44999694824219,"0.5":68.44999694824219,"0.6":68.44999694824219,"0.7":68.44999694824219,"0.8":68.44999694824219,"0.9":68.44999694824219,"0.95":68.44999694824219}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.925923","as_of":"2025-07-21T00:00:00","forecast_date":"2025-07-28T00:00:00","payload":{"point_forecast":67.33999633789062,"quantiles":{"0.05":67.33999633789062,"0.1":67.33999633789062,"0.2":67.33999633789062,"0.3":67.33999633789062,"0.4":67.33999633789062,"0.5":67.33999633789062,"0.6":67.33999633789062,"0.7":67.33999633789062,"0.8":67.33999633789062,"0.9":67.33999633789062,"0.95":67.33999633789062}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.925923","as_of":"2025-07-21T00:00:00","forecast_date":"2025-08-04T00:00:00","payload":{"point_forecast":67.33999633789062,"quantiles":{"0.05":67.33999633789062,"0.1":67.33999633789062,"0.2":67.33999633789062,"0.3":67.33999633789062,"0.4":67.33999633789062,"0.5":67.33999633789062,"0.6":67.33999633789062,"0.7":67.33999633789062,"0.8":67.33999633789062,"0.9":67.33999633789062,"0.95":67.33999633789062}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.925923","as_of":"2025-07-21T00:00:00","forecast_date":"2025-08-19T00:00:00","payload":{"point_forecast":67.33999633789062,"quantiles":{"0.05":67.33999633789062,"0.1":67.33999633789062,"0.2":67.33999633789062,"0.3":67.33999633789062,"0.4":67.33999633789062,"0.5":67.33999633789062,"0.6":67.33999633789062,"0.7":67.33999633789062,"0.8":67.33999633789062,"0.9":67.33999633789062,"0.95":67.33999633789062}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.935575","as_of":"2025-07-28T00:00:00","forecast_date":"2025-08-04T00:00:00","payload":{"point_forecast":65.16000366210938,"quantiles":{"0.05":65.16000366210938,"0.1":65.16000366210938,"0.2":65.16000366210938,"0.3":65.16000366210938,"0.4":65.16000366210938,"0.5":65.16000366210938,"0.6":65.16000366210938,"0.7":65.16000366210938,"0.8":65.16000366210938,"0.9":65.16000366210938,"0.95":65.16000366210938}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.935575","as_of":"2025-07-28T00:00:00","forecast_date":"2025-08-11T00:00:00","payload":{"point_forecast":65.16000366210938,"quantiles":{"0.05":65.16000366210938,"0.1":65.16000366210938,"0.2":65.16000366210938,"0.3":65.16000366210938,"0.4":65.16000366210938,"0.5":65.16000366210938,"0.6":65.16000366210938,"0.7":65.16000366210938,"0.8":65.16000366210938,"0.9":65.16000366210938,"0.95":65.16000366210938}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.935575","as_of":"2025-07-28T00:00:00","forecast_date":"2025-08-26T00:00:00","payload":{"point_forecast":65.16000366210938,"quantiles":{"0.05":65.16000366210938,"0.1":65.16000366210938,"0.2":65.16000366210938,"0.3":65.16000366210938,"0.4":65.16000366210938,"0.5":65.16000366210938,"0.6":65.16000366210938,"0.7":65.16000366210938,"0.8":65.16000366210938,"0.9":65.16000366210938,"0.95":65.16000366210938}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.945196","as_of":"2025-08-04T00:00:00","forecast_date":"2025-08-11T00:00:00","payload":{"point_forecast":67.33000183105469,"quantiles":{"0.05":67.33000183105469,"0.1":67.33000183105469,"0.2":67.33000183105469,"0.3":67.33000183105469,"0.4":67.33000183105469,"0.5":67.33000183105469,"0.6":67.33000183105469,"0.7":67.33000183105469,"0.8":67.33000183105469,"0.9":67.33000183105469,"0.95":67.33000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.945196","as_of":"2025-08-04T00:00:00","forecast_date":"2025-08-18T00:00:00","payload":{"point_forecast":67.33000183105469,"quantiles":{"0.05":67.33000183105469,"0.1":67.33000183105469,"0.2":67.33000183105469,"0.3":67.33000183105469,"0.4":67.33000183105469,"0.5":67.33000183105469,"0.6":67.33000183105469,"0.7":67.33000183105469,"0.8":67.33000183105469,"0.9":67.33000183105469,"0.95":67.33000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.945196","as_of":"2025-08-04T00:00:00","forecast_date":"2025-09-02T00:00:00","payload":{"point_forecast":67.33000183105469,"quantiles":{"0.05":67.33000183105469,"0.1":67.33000183105469,"0.2":67.33000183105469,"0.3":67.33000183105469,"0.4":67.33000183105469,"0.5":67.33000183105469,"0.6":67.33000183105469,"0.7":67.33000183105469,"0.8":67.33000183105469,"0.9":67.33000183105469,"0.95":67.33000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.955005","as_of":"2025-08-11T00:00:00","forecast_date":"2025-08-18T00:00:00","payload":{"point_forecast":63.880001068115234,"quantiles":{"0.05":63.880001068115234,"0.1":63.880001068115234,"0.2":63.880001068115234,"0.3":63.880001068115234,"0.4":63.880001068115234,"0.5":63.880001068115234,"0.6":63.880001068115234,"0.7":63.880001068115234,"0.8":63.880001068115234,"0.9":63.880001068115234,"0.95":63.880001068115234}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.955005","as_of":"2025-08-11T00:00:00","forecast_date":"2025-08-25T00:00:00","payload":{"point_forecast":63.880001068115234,"quantiles":{"0.05":63.880001068115234,"0.1":63.880001068115234,"0.2":63.880001068115234,"0.3":63.880001068115234,"0.4":63.880001068115234,"0.5":63.880001068115234,"0.6":63.880001068115234,"0.7":63.880001068115234,"0.8":63.880001068115234,"0.9":63.880001068115234,"0.95":63.880001068115234}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.955005","as_of":"2025-08-11T00:00:00","forecast_date":"2025-09-09T00:00:00","payload":{"point_forecast":63.880001068115234,"quantiles":{"0.05":63.880001068115234,"0.1":63.880001068115234,"0.2":63.880001068115234,"0.3":63.880001068115234,"0.4":63.880001068115234,"0.5":63.880001068115234,"0.6":63.880001068115234,"0.7":63.880001068115234,"0.8":63.880001068115234,"0.9":63.880001068115234,"0.95":63.880001068115234}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.964819","as_of":"2025-08-18T00:00:00","forecast_date":"2025-08-25T00:00:00","payload":{"point_forecast":62.79999923706055,"quantiles":{"0.05":62.79999923706055,"0.1":62.79999923706055,"0.2":62.79999923706055,"0.3":62.79999923706055,"0.4":62.79999923706055,"0.5":62.79999923706055,"0.6":62.79999923706055,"0.7":62.79999923706055,"0.8":62.79999923706055,"0.9":62.79999923706055,"0.95":62.79999923706055}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.964819","as_of":"2025-08-18T00:00:00","forecast_date":"2025-09-16T00:00:00","payload":{"point_forecast":62.79999923706055,"quantiles":{"0.05":62.79999923706055,"0.1":62.79999923706055,"0.2":62.79999923706055,"0.3":62.79999923706055,"0.4":62.79999923706055,"0.5":62.79999923706055,"0.6":62.79999923706055,"0.7":62.79999923706055,"0.8":62.79999923706055,"0.9":62.79999923706055,"0.95":62.79999923706055}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.974622","as_of":"2025-08-25T00:00:00","forecast_date":"2025-09-08T00:00:00","payload":{"point_forecast":63.65999984741211,"quantiles":{"0.05":63.65999984741211,"0.1":63.65999984741211,"0.2":63.65999984741211,"0.3":63.65999984741211,"0.4":63.65999984741211,"0.5":63.65999984741211,"0.6":63.65999984741211,"0.7":63.65999984741211,"0.8":63.65999984741211,"0.9":63.65999984741211,"0.95":63.65999984741211}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.974622","as_of":"2025-08-25T00:00:00","forecast_date":"2025-09-23T00:00:00","payload":{"point_forecast":63.65999984741211,"quantiles":{"0.05":63.65999984741211,"0.1":63.65999984741211,"0.2":63.65999984741211,"0.3":63.65999984741211,"0.4":63.65999984741211,"0.5":63.65999984741211,"0.6":63.65999984741211,"0.7":63.65999984741211,"0.8":63.65999984741211,"0.9":63.65999984741211,"0.95":63.65999984741211}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.984186","as_of":"2025-09-01T00:00:00","forecast_date":"2025-09-08T00:00:00","payload":{"point_forecast":64.01000213623047,"quantiles":{"0.05":64.01000213623047,"0.1":64.01000213623047,"0.2":64.01000213623047,"0.3":64.01000213623047,"0.4":64.01000213623047,"0.5":64.01000213623047,"0.6":64.01000213623047,"0.7":64.01000213623047,"0.8":64.01000213623047,"0.9":64.01000213623047,"0.95":64.01000213623047}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.984186","as_of":"2025-09-01T00:00:00","forecast_date":"2025-09-15T00:00:00","payload":{"point_forecast":64.01000213623047,"quantiles":{"0.05":64.01000213623047,"0.1":64.01000213623047,"0.2":64.01000213623047,"0.3":64.01000213623047,"0.4":64.01000213623047,"0.5":64.01000213623047,"0.6":64.01000213623047,"0.7":64.01000213623047,"0.8":64.01000213623047,"0.9":64.01000213623047,"0.95":64.01000213623047}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.984186","as_of":"2025-09-01T00:00:00","forecast_date":"2025-09-30T00:00:00","payload":{"point_forecast":64.01000213623047,"quantiles":{"0.05":64.01000213623047,"0.1":64.01000213623047,"0.2":64.01000213623047,"0.3":64.01000213623047,"0.4":64.01000213623047,"0.5":64.01000213623047,"0.6":64.01000213623047,"0.7":64.01000213623047,"0.8":64.01000213623047,"0.9":64.01000213623047,"0.95":64.01000213623047}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.994137","as_of":"2025-09-08T00:00:00","forecast_date":"2025-09-15T00:00:00","payload":{"point_forecast":61.869998931884766,"quantiles":{"0.05":61.869998931884766,"0.1":61.869998931884766,"0.2":61.869998931884766,"0.3":61.869998931884766,"0.4":61.869998931884766,"0.5":61.869998931884766,"0.6":61.869998931884766,"0.7":61.869998931884766,"0.8":61.869998931884766,"0.9":61.869998931884766,"0.95":61.869998931884766}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.994137","as_of":"2025-09-08T00:00:00","forecast_date":"2025-09-22T00:00:00","payload":{"point_forecast":61.869998931884766,"quantiles":{"0.05":61.869998931884766,"0.1":61.869998931884766,"0.2":61.869998931884766,"0.3":61.869998931884766,"0.4":61.869998931884766,"0.5":61.869998931884766,"0.6":61.869998931884766,"0.7":61.869998931884766,"0.8":61.869998931884766,"0.9":61.869998931884766,"0.95":61.869998931884766}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:08.994137","as_of":"2025-09-08T00:00:00","forecast_date":"2025-10-07T00:00:00","payload":{"point_forecast":61.869998931884766,"quantiles":{"0.05":61.869998931884766,"0.1":61.869998931884766,"0.2":61.869998931884766,"0.3":61.869998931884766,"0.4":61.869998931884766,"0.5":61.869998931884766,"0.6":61.869998931884766,"0.7":61.869998931884766,"0.8":61.869998931884766,"0.9":61.869998931884766,"0.95":61.869998931884766}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.077078","as_of":"2025-09-15T00:00:00","forecast_date":"2025-09-22T00:00:00","payload":{"point_forecast":62.689998626708984,"quantiles":{"0.05":62.689998626708984,"0.1":62.689998626708984,"0.2":62.689998626708984,"0.3":62.689998626708984,"0.4":62.689998626708984,"0.5":62.689998626708984,"0.6":62.689998626708984,"0.7":62.689998626708984,"0.8":62.689998626708984,"0.9":62.689998626708984,"0.95":62.689998626708984}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.077078","as_of":"2025-09-15T00:00:00","forecast_date":"2025-09-29T00:00:00","payload":{"point_forecast":62.689998626708984,"quantiles":{"0.05":62.689998626708984,"0.1":62.689998626708984,"0.2":62.689998626708984,"0.3":62.689998626708984,"0.4":62.689998626708984,"0.5":62.689998626708984,"0.6":62.689998626708984,"0.7":62.689998626708984,"0.8":62.689998626708984,"0.9":62.689998626708984,"0.95":62.689998626708984}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.077078","as_of":"2025-09-15T00:00:00","forecast_date":"2025-10-14T00:00:00","payload":{"point_forecast":62.689998626708984,"quantiles":{"0.05":62.689998626708984,"0.1":62.689998626708984,"0.2":62.689998626708984,"0.3":62.689998626708984,"0.4":62.689998626708984,"0.5":62.689998626708984,"0.6":62.689998626708984,"0.7":62.689998626708984,"0.8":62.689998626708984,"0.9":62.689998626708984,"0.95":62.689998626708984}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.087370","as_of":"2025-09-22T00:00:00","forecast_date":"2025-09-29T00:00:00","payload":{"point_forecast":62.68000030517578,"quantiles":{"0.05":62.68000030517578,"0.1":62.68000030517578,"0.2":62.68000030517578,"0.3":62.68000030517578,"0.4":62.68000030517578,"0.5":62.68000030517578,"0.6":62.68000030517578,"0.7":62.68000030517578,"0.8":62.68000030517578,"0.9":62.68000030517578,"0.95":62.68000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.087370","as_of":"2025-09-22T00:00:00","forecast_date":"2025-10-06T00:00:00","payload":{"point_forecast":62.68000030517578,"quantiles":{"0.05":62.68000030517578,"0.1":62.68000030517578,"0.2":62.68000030517578,"0.3":62.68000030517578,"0.4":62.68000030517578,"0.5":62.68000030517578,"0.6":62.68000030517578,"0.7":62.68000030517578,"0.8":62.68000030517578,"0.9":62.68000030517578,"0.95":62.68000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.087370","as_of":"2025-09-22T00:00:00","forecast_date":"2025-10-21T00:00:00","payload":{"point_forecast":62.68000030517578,"quantiles":{"0.05":62.68000030517578,"0.1":62.68000030517578,"0.2":62.68000030517578,"0.3":62.68000030517578,"0.4":62.68000030517578,"0.5":62.68000030517578,"0.6":62.68000030517578,"0.7":62.68000030517578,"0.8":62.68000030517578,"0.9":62.68000030517578,"0.95":62.68000030517578}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.097074","as_of":"2025-09-29T00:00:00","forecast_date":"2025-10-06T00:00:00","payload":{"point_forecast":65.72000122070312,"quantiles":{"0.05":65.72000122070312,"0.1":65.72000122070312,"0.2":65.72000122070312,"0.3":65.72000122070312,"0.4":65.72000122070312,"0.5":65.72000122070312,"0.6":65.72000122070312,"0.7":65.72000122070312,"0.8":65.72000122070312,"0.9":65.72000122070312,"0.95":65.72000122070312}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.097074","as_of":"2025-09-29T00:00:00","forecast_date":"2025-10-13T00:00:00","payload":{"point_forecast":65.72000122070312,"quantiles":{"0.05":65.72000122070312,"0.1":65.72000122070312,"0.2":65.72000122070312,"0.3":65.72000122070312,"0.4":65.72000122070312,"0.5":65.72000122070312,"0.6":65.72000122070312,"0.7":65.72000122070312,"0.8":65.72000122070312,"0.9":65.72000122070312,"0.95":65.72000122070312}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.097074","as_of":"2025-09-29T00:00:00","forecast_date":"2025-10-28T00:00:00","payload":{"point_forecast":65.72000122070312,"quantiles":{"0.05":65.72000122070312,"0.1":65.72000122070312,"0.2":65.72000122070312,"0.3":65.72000122070312,"0.4":65.72000122070312,"0.5":65.72000122070312,"0.6":65.72000122070312,"0.7":65.72000122070312,"0.8":65.72000122070312,"0.9":65.72000122070312,"0.95":65.72000122070312}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.107057","as_of":"2025-10-06T00:00:00","forecast_date":"2025-10-13T00:00:00","payload":{"point_forecast":60.880001068115234,"quantiles":{"0.05":60.880001068115234,"0.1":60.880001068115234,"0.2":60.880001068115234,"0.3":60.880001068115234,"0.4":60.880001068115234,"0.5":60.880001068115234,"0.6":60.880001068115234,"0.7":60.880001068115234,"0.8":60.880001068115234,"0.9":60.880001068115234,"0.95":60.880001068115234}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.107057","as_of":"2025-10-06T00:00:00","forecast_date":"2025-10-20T00:00:00","payload":{"point_forecast":60.880001068115234,"quantiles":{"0.05":60.880001068115234,"0.1":60.880001068115234,"0.2":60.880001068115234,"0.3":60.880001068115234,"0.4":60.880001068115234,"0.5":60.880001068115234,"0.6":60.880001068115234,"0.7":60.880001068115234,"0.8":60.880001068115234,"0.9":60.880001068115234,"0.95":60.880001068115234}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.107057","as_of":"2025-10-06T00:00:00","forecast_date":"2025-11-04T00:00:00","payload":{"point_forecast":60.880001068115234,"quantiles":{"0.05":60.880001068115234,"0.1":60.880001068115234,"0.2":60.880001068115234,"0.3":60.880001068115234,"0.4":60.880001068115234,"0.5":60.880001068115234,"0.6":60.880001068115234,"0.7":60.880001068115234,"0.8":60.880001068115234,"0.9":60.880001068115234,"0.95":60.880001068115234}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.116728","as_of":"2025-10-13T00:00:00","forecast_date":"2025-10-20T00:00:00","payload":{"point_forecast":58.900001525878906,"quantiles":{"0.05":58.900001525878906,"0.1":58.900001525878906,"0.2":58.900001525878906,"0.3":58.900001525878906,"0.4":58.900001525878906,"0.5":58.900001525878906,"0.6":58.900001525878906,"0.7":58.900001525878906,"0.8":58.900001525878906,"0.9":58.900001525878906,"0.95":58.900001525878906}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.116728","as_of":"2025-10-13T00:00:00","forecast_date":"2025-10-27T00:00:00","payload":{"point_forecast":58.900001525878906,"quantiles":{"0.05":58.900001525878906,"0.1":58.900001525878906,"0.2":58.900001525878906,"0.3":58.900001525878906,"0.4":58.900001525878906,"0.5":58.900001525878906,"0.6":58.900001525878906,"0.7":58.900001525878906,"0.8":58.900001525878906,"0.9":58.900001525878906,"0.95":58.900001525878906}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.116728","as_of":"2025-10-13T00:00:00","forecast_date":"2025-11-11T00:00:00","payload":{"point_forecast":58.900001525878906,"quantiles":{"0.05":58.900001525878906,"0.1":58.900001525878906,"0.2":58.900001525878906,"0.3":58.900001525878906,"0.4":58.900001525878906,"0.5":58.900001525878906,"0.6":58.900001525878906,"0.7":58.900001525878906,"0.8":58.900001525878906,"0.9":58.900001525878906,"0.95":58.900001525878906}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.126532","as_of":"2025-10-20T00:00:00","forecast_date":"2025-10-27T00:00:00","payload":{"point_forecast":57.540000915527344,"quantiles":{"0.05":57.540000915527344,"0.1":57.540000915527344,"0.2":57.540000915527344,"0.3":57.540000915527344,"0.4":57.540000915527344,"0.5":57.540000915527344,"0.6":57.540000915527344,"0.7":57.540000915527344,"0.8":57.540000915527344,"0.9":57.540000915527344,"0.95":57.540000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.126532","as_of":"2025-10-20T00:00:00","forecast_date":"2025-11-03T00:00:00","payload":{"point_forecast":57.540000915527344,"quantiles":{"0.05":57.540000915527344,"0.1":57.540000915527344,"0.2":57.540000915527344,"0.3":57.540000915527344,"0.4":57.540000915527344,"0.5":57.540000915527344,"0.6":57.540000915527344,"0.7":57.540000915527344,"0.8":57.540000915527344,"0.9":57.540000915527344,"0.95":57.540000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.126532","as_of":"2025-10-20T00:00:00","forecast_date":"2025-11-18T00:00:00","payload":{"point_forecast":57.540000915527344,"quantiles":{"0.05":57.540000915527344,"0.1":57.540000915527344,"0.2":57.540000915527344,"0.3":57.540000915527344,"0.4":57.540000915527344,"0.5":57.540000915527344,"0.6":57.540000915527344,"0.7":57.540000915527344,"0.8":57.540000915527344,"0.9":57.540000915527344,"0.95":57.540000915527344}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.136944","as_of":"2025-10-27T00:00:00","forecast_date":"2025-11-03T00:00:00","payload":{"point_forecast":61.5,"quantiles":{"0.05":61.5,"0.1":61.5,"0.2":61.5,"0.3":61.5,"0.4":61.5,"0.5":61.5,"0.6":61.5,"0.7":61.5,"0.8":61.5,"0.9":61.5,"0.95":61.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.136944","as_of":"2025-10-27T00:00:00","forecast_date":"2025-11-10T00:00:00","payload":{"point_forecast":61.5,"quantiles":{"0.05":61.5,"0.1":61.5,"0.2":61.5,"0.3":61.5,"0.4":61.5,"0.5":61.5,"0.6":61.5,"0.7":61.5,"0.8":61.5,"0.9":61.5,"0.95":61.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.136944","as_of":"2025-10-27T00:00:00","forecast_date":"2025-11-25T00:00:00","payload":{"point_forecast":61.5,"quantiles":{"0.05":61.5,"0.1":61.5,"0.2":61.5,"0.3":61.5,"0.4":61.5,"0.5":61.5,"0.6":61.5,"0.7":61.5,"0.8":61.5,"0.9":61.5,"0.95":61.5}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.146718","as_of":"2025-11-03T00:00:00","forecast_date":"2025-11-10T00:00:00","payload":{"point_forecast":60.97999954223633,"quantiles":{"0.05":60.97999954223633,"0.1":60.97999954223633,"0.2":60.97999954223633,"0.3":60.97999954223633,"0.4":60.97999954223633,"0.5":60.97999954223633,"0.6":60.97999954223633,"0.7":60.97999954223633,"0.8":60.97999954223633,"0.9":60.97999954223633,"0.95":60.97999954223633}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.146718","as_of":"2025-11-03T00:00:00","forecast_date":"2025-11-17T00:00:00","payload":{"point_forecast":60.97999954223633,"quantiles":{"0.05":60.97999954223633,"0.1":60.97999954223633,"0.2":60.97999954223633,"0.3":60.97999954223633,"0.4":60.97999954223633,"0.5":60.97999954223633,"0.6":60.97999954223633,"0.7":60.97999954223633,"0.8":60.97999954223633,"0.9":60.97999954223633,"0.95":60.97999954223633}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.146718","as_of":"2025-11-03T00:00:00","forecast_date":"2025-12-02T00:00:00","payload":{"point_forecast":60.97999954223633,"quantiles":{"0.05":60.97999954223633,"0.1":60.97999954223633,"0.2":60.97999954223633,"0.3":60.97999954223633,"0.4":60.97999954223633,"0.5":60.97999954223633,"0.6":60.97999954223633,"0.7":60.97999954223633,"0.8":60.97999954223633,"0.9":60.97999954223633,"0.95":60.97999954223633}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.156392","as_of":"2025-11-10T00:00:00","forecast_date":"2025-11-17T00:00:00","payload":{"point_forecast":59.75,"quantiles":{"0.05":59.75,"0.1":59.75,"0.2":59.75,"0.3":59.75,"0.4":59.75,"0.5":59.75,"0.6":59.75,"0.7":59.75,"0.8":59.75,"0.9":59.75,"0.95":59.75}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.156392","as_of":"2025-11-10T00:00:00","forecast_date":"2025-11-24T00:00:00","payload":{"point_forecast":59.75,"quantiles":{"0.05":59.75,"0.1":59.75,"0.2":59.75,"0.3":59.75,"0.4":59.75,"0.5":59.75,"0.6":59.75,"0.7":59.75,"0.8":59.75,"0.9":59.75,"0.95":59.75}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.156392","as_of":"2025-11-10T00:00:00","forecast_date":"2025-12-09T00:00:00","payload":{"point_forecast":59.75,"quantiles":{"0.05":59.75,"0.1":59.75,"0.2":59.75,"0.3":59.75,"0.4":59.75,"0.5":59.75,"0.6":59.75,"0.7":59.75,"0.8":59.75,"0.9":59.75,"0.95":59.75}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.165958","as_of":"2025-11-17T00:00:00","forecast_date":"2025-11-24T00:00:00","payload":{"point_forecast":60.09000015258789,"quantiles":{"0.05":60.09000015258789,"0.1":60.09000015258789,"0.2":60.09000015258789,"0.3":60.09000015258789,"0.4":60.09000015258789,"0.5":60.09000015258789,"0.6":60.09000015258789,"0.7":60.09000015258789,"0.8":60.09000015258789,"0.9":60.09000015258789,"0.95":60.09000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.165958","as_of":"2025-11-17T00:00:00","forecast_date":"2025-12-01T00:00:00","payload":{"point_forecast":60.09000015258789,"quantiles":{"0.05":60.09000015258789,"0.1":60.09000015258789,"0.2":60.09000015258789,"0.3":60.09000015258789,"0.4":60.09000015258789,"0.5":60.09000015258789,"0.6":60.09000015258789,"0.7":60.09000015258789,"0.8":60.09000015258789,"0.9":60.09000015258789,"0.95":60.09000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.165958","as_of":"2025-11-17T00:00:00","forecast_date":"2025-12-16T00:00:00","payload":{"point_forecast":60.09000015258789,"quantiles":{"0.05":60.09000015258789,"0.1":60.09000015258789,"0.2":60.09000015258789,"0.3":60.09000015258789,"0.4":60.09000015258789,"0.5":60.09000015258789,"0.6":60.09000015258789,"0.7":60.09000015258789,"0.8":60.09000015258789,"0.9":60.09000015258789,"0.95":60.09000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.175451","as_of":"2025-11-24T00:00:00","forecast_date":"2025-12-01T00:00:00","payload":{"point_forecast":58.060001373291016,"quantiles":{"0.05":58.060001373291016,"0.1":58.060001373291016,"0.2":58.060001373291016,"0.3":58.060001373291016,"0.4":58.060001373291016,"0.5":58.060001373291016,"0.6":58.060001373291016,"0.7":58.060001373291016,"0.8":58.060001373291016,"0.9":58.060001373291016,"0.95":58.060001373291016}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.175451","as_of":"2025-11-24T00:00:00","forecast_date":"2025-12-08T00:00:00","payload":{"point_forecast":58.060001373291016,"quantiles":{"0.05":58.060001373291016,"0.1":58.060001373291016,"0.2":58.060001373291016,"0.3":58.060001373291016,"0.4":58.060001373291016,"0.5":58.060001373291016,"0.6":58.060001373291016,"0.7":58.060001373291016,"0.8":58.060001373291016,"0.9":58.060001373291016,"0.95":58.060001373291016}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.175451","as_of":"2025-11-24T00:00:00","forecast_date":"2025-12-23T00:00:00","payload":{"point_forecast":58.060001373291016,"quantiles":{"0.05":58.060001373291016,"0.1":58.060001373291016,"0.2":58.060001373291016,"0.3":58.060001373291016,"0.4":58.060001373291016,"0.5":58.060001373291016,"0.6":58.060001373291016,"0.7":58.060001373291016,"0.8":58.060001373291016,"0.9":58.060001373291016,"0.95":58.060001373291016}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.184972","as_of":"2025-12-01T00:00:00","forecast_date":"2025-12-08T00:00:00","payload":{"point_forecast":58.54999923706055,"quantiles":{"0.05":58.54999923706055,"0.1":58.54999923706055,"0.2":58.54999923706055,"0.3":58.54999923706055,"0.4":58.54999923706055,"0.5":58.54999923706055,"0.6":58.54999923706055,"0.7":58.54999923706055,"0.8":58.54999923706055,"0.9":58.54999923706055,"0.95":58.54999923706055}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.184972","as_of":"2025-12-01T00:00:00","forecast_date":"2025-12-15T00:00:00","payload":{"point_forecast":58.54999923706055,"quantiles":{"0.05":58.54999923706055,"0.1":58.54999923706055,"0.2":58.54999923706055,"0.3":58.54999923706055,"0.4":58.54999923706055,"0.5":58.54999923706055,"0.6":58.54999923706055,"0.7":58.54999923706055,"0.8":58.54999923706055,"0.9":58.54999923706055,"0.95":58.54999923706055}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.184972","as_of":"2025-12-01T00:00:00","forecast_date":"2025-12-30T00:00:00","payload":{"point_forecast":58.54999923706055,"quantiles":{"0.05":58.54999923706055,"0.1":58.54999923706055,"0.2":58.54999923706055,"0.3":58.54999923706055,"0.4":58.54999923706055,"0.5":58.54999923706055,"0.6":58.54999923706055,"0.7":58.54999923706055,"0.8":58.54999923706055,"0.9":58.54999923706055,"0.95":58.54999923706055}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.194540","as_of":"2025-12-08T00:00:00","forecast_date":"2025-12-15T00:00:00","payload":{"point_forecast":60.08000183105469,"quantiles":{"0.05":60.08000183105469,"0.1":60.08000183105469,"0.2":60.08000183105469,"0.3":60.08000183105469,"0.4":60.08000183105469,"0.5":60.08000183105469,"0.6":60.08000183105469,"0.7":60.08000183105469,"0.8":60.08000183105469,"0.9":60.08000183105469,"0.95":60.08000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.194540","as_of":"2025-12-08T00:00:00","forecast_date":"2025-12-22T00:00:00","payload":{"point_forecast":60.08000183105469,"quantiles":{"0.05":60.08000183105469,"0.1":60.08000183105469,"0.2":60.08000183105469,"0.3":60.08000183105469,"0.4":60.08000183105469,"0.5":60.08000183105469,"0.6":60.08000183105469,"0.7":60.08000183105469,"0.8":60.08000183105469,"0.9":60.08000183105469,"0.95":60.08000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.194540","as_of":"2025-12-08T00:00:00","forecast_date":"2026-01-06T00:00:00","payload":{"point_forecast":60.08000183105469,"quantiles":{"0.05":60.08000183105469,"0.1":60.08000183105469,"0.2":60.08000183105469,"0.3":60.08000183105469,"0.4":60.08000183105469,"0.5":60.08000183105469,"0.6":60.08000183105469,"0.7":60.08000183105469,"0.8":60.08000183105469,"0.9":60.08000183105469,"0.95":60.08000183105469}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.204333","as_of":"2025-12-15T00:00:00","forecast_date":"2025-12-22T00:00:00","payload":{"point_forecast":57.439998626708984,"quantiles":{"0.05":57.439998626708984,"0.1":57.439998626708984,"0.2":57.439998626708984,"0.3":57.439998626708984,"0.4":57.439998626708984,"0.5":57.439998626708984,"0.6":57.439998626708984,"0.7":57.439998626708984,"0.8":57.439998626708984,"0.9":57.439998626708984,"0.95":57.439998626708984}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.204333","as_of":"2025-12-15T00:00:00","forecast_date":"2025-12-29T00:00:00","payload":{"point_forecast":57.439998626708984,"quantiles":{"0.05":57.439998626708984,"0.1":57.439998626708984,"0.2":57.439998626708984,"0.3":57.439998626708984,"0.4":57.439998626708984,"0.5":57.439998626708984,"0.6":57.439998626708984,"0.7":57.439998626708984,"0.8":57.439998626708984,"0.9":57.439998626708984,"0.95":57.439998626708984}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.204333","as_of":"2025-12-15T00:00:00","forecast_date":"2026-01-13T00:00:00","payload":{"point_forecast":57.439998626708984,"quantiles":{"0.05":57.439998626708984,"0.1":57.439998626708984,"0.2":57.439998626708984,"0.3":57.439998626708984,"0.4":57.439998626708984,"0.5":57.439998626708984,"0.6":57.439998626708984,"0.7":57.439998626708984,"0.8":57.439998626708984,"0.9":57.439998626708984,"0.95":57.439998626708984}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.213952","as_of":"2025-12-22T00:00:00","forecast_date":"2025-12-29T00:00:00","payload":{"point_forecast":56.65999984741211,"quantiles":{"0.05":56.65999984741211,"0.1":56.65999984741211,"0.2":56.65999984741211,"0.3":56.65999984741211,"0.4":56.65999984741211,"0.5":56.65999984741211,"0.6":56.65999984741211,"0.7":56.65999984741211,"0.8":56.65999984741211,"0.9":56.65999984741211,"0.95":56.65999984741211}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.213952","as_of":"2025-12-22T00:00:00","forecast_date":"2026-01-05T00:00:00","payload":{"point_forecast":56.65999984741211,"quantiles":{"0.05":56.65999984741211,"0.1":56.65999984741211,"0.2":56.65999984741211,"0.3":56.65999984741211,"0.4":56.65999984741211,"0.5":56.65999984741211,"0.6":56.65999984741211,"0.7":56.65999984741211,"0.8":56.65999984741211,"0.9":56.65999984741211,"0.95":56.65999984741211}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:15:09.213952","as_of":"2025-12-22T00:00:00","forecast_date":"2026-01-20T00:00:00","payload":{"point_forecast":56.65999984741211,"quantiles":{"0.05":56.65999984741211,"0.1":56.65999984741211,"0.2":56.65999984741211,"0.3":56.65999984741211,"0.4":56.65999984741211,"0.5":56.65999984741211,"0.6":56.65999984741211,"0.7":56.65999984741211,"0.8":56.65999984741211,"0.9":56.65999984741211,"0.95":56.65999984741211}},"metadata":{}}],"scores":[4.8600006103515625,1.2600021362304688,3.4000015258789062,3.25,4.709999084472656,4.719993591308594,6.029998779296875,1.5,2.3400039672851562,5.730003356933594,0.20999908447265625,4.269996643066406,0.3000030517578125,4.75,0.04000091552734375,2.3699951171875,3.839996337890625,2.029998779296875,4.370002746582031,1.4000015258789062,3.7300033569335938,2.1800003051757812,1.4399948120117188,0.5400009155273438,2.0699996948242188,7.459999084472656,1.9300003051757812,4.3000030517578125,5.849998474121094,3.2000045776367188,7.579998016357422,3.970001220703125,8.65999984741211,7.8300018310546875,8.94000244140625,0.4600028991699219,1.0900001525878906,2.9000015258789062,1.5800018310546875,0.5499992370605469,2.1699981689453125,2.6300010681152344,7.549999237060547,2.1199989318847656,5.8899993896484375,1.0699996948242188,2.1300010681152344,3.6599998474121094,4.399997711181641,5.119998931884766,1.6699981689453125,3.960002899169922,0.029998779296875,12.349994659423828,0.9900016784667969,3.7600021362304688,2.8400039672851562,4.5,10.979995727539062,4.659996032714844,7.189994812011719,3.9300003051757812,3.75,4.470001220703125,7.870002746582031,6.4600067138671875,9.819999694824219,7.0,8.720001220703125,2.410003662109375,1.4600067138671875,3.69000244140625,0.48000335693359375,0.6999969482421875,1.339996337890625,1.25,1.7399978637695312,5.279998779296875,0.6299972534179688,1.0499954223632812,4.989997863769531,1.1299972534179688,1.2000045776367188,1.910003662109375,3.3700027465820312,3.910003662109375,1.7400054931640625,0.4600028991699219,0.9200019836425781,1.25,2.0000038146972656,1.7199974060058594,1.4000015258789062,0.25,1.7500038146972656,0.7100028991699219,1.6400032043457031,1.4300003051757812,0.7700004577636719,0.1399993896484375,0.049999237060546875,0.7600021362304688,3.9899978637695312,0.7700004577636719,0.9900016784667969,4.8600006103515625,4.030002593994141,6.229999542236328,5.569999694824219,1.3899993896484375,3.3600006103515625,0.31999969482421875,1.3800010681152344,2.4099998474121094,2.1399993896484375,3.770000457763672,3.509998321533203,3.200000762939453,0.4500007629394531,1.3699989318847656,3.549999237060547,0.8499984741210938,1.0699996948242188,2.3400001525878906,0.15999984741210938,0.9099998474121094,1.5,1.25,0.7700004577636719,4.819999694824219,1.2599983215332031,0.8199996948242188,0.31999969482421875,0.3300018310546875,1.7299995422363281,0.5999984741210938,3.2600021362304688,2.0700035095214844,2.950000762939453,0.5699996948242188,0.6400032043457031,3.710002899169922,1.4200019836425781,1.6599998474121094,3.6800003051757812],"metric":"crps","mean_score":2.92993137754243,"ran_at":"2026-05-22T15:15:09.221189","skipped_origins":0} diff --git a/implementations/energy_oil_forecasting/adaptive_agent/curriculum/eval_AutoARIMA.json b/implementations/energy_oil_forecasting/adaptive_agent/curriculum/eval_AutoARIMA.json index eeb0bd14..5657424d 100644 --- a/implementations/energy_oil_forecasting/adaptive_agent/curriculum/eval_AutoARIMA.json +++ b/implementations/energy_oil_forecasting/adaptive_agent/curriculum/eval_AutoARIMA.json @@ -1 +1 @@ -{"spec":{"task":{"task_id":"wti_oil_price_forecast","target_series_id":"wti_crude_oil_price","horizons":[5,10,21],"frequency":"B","description":"WTI Crude Oil continuous front-month futures Close price (yfinance symbol: CL=F), projected 5, 10, and 21 trading days ahead.","resolution_fn":"observed_value_at_resolution_timestamp"},"start":"2026-02-02T00:00:00","end":"2026-03-23T00:00:00","stride":5,"warmup":250,"description":"Prospective/out-of-sample evaluation period in 2026 for daily WTI crude oil. Evaluates selected contender models on 8 weekly origins during the early 2026 geopolitical price shock to measure adaptive real-time forecasting performance."},"predictor_id":"darts_autoarima","predictions":[{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.173720","as_of":"2026-02-02T00:00:00","forecast_date":"2026-02-09T00:00:00","payload":{"point_forecast":65.05895733840352,"quantiles":{"0.05":58.331667626429876,"0.1":59.886437476399045,"0.2":61.435357111545045,"0.3":62.71503975713038,"0.4":64.07505115957794,"0.5":65.05895733840352,"0.6":66.22376743077663,"0.7":67.40298615246036,"0.8":68.89399641271976,"0.9":70.44189198133458,"0.95":71.68154492412373}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.173720","as_of":"2026-02-02T00:00:00","forecast_date":"2026-03-03T00:00:00","payload":{"point_forecast":64.80024209436806,"quantiles":{"0.05":51.59342409918608,"0.1":53.966426656668126,"0.2":56.88403703785378,"0.3":60.194484346228045,"0.4":62.44744925245736,"0.5":64.80024209436806,"0.6":67.16660054904489,"0.7":69.78963322976725,"0.8":73.41821947407814,"0.9":77.35422608142905,"0.95":81.68808724205196}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.211960","as_of":"2026-02-09T00:00:00","forecast_date":"2026-02-23T00:00:00","payload":{"point_forecast":63.50564082512121,"quantiles":{"0.05":53.59936788166228,"0.1":55.416626242439996,"0.2":57.91399503789116,"0.3":60.29354090965138,"0.4":62.12383884514761,"0.5":63.50564082512121,"0.6":65.26342534909772,"0.7":66.52877663959772,"0.8":68.73831309460901,"0.9":72.12989759444602,"0.95":73.19628467298814}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.211960","as_of":"2026-02-09T00:00:00","forecast_date":"2026-03-10T00:00:00","payload":{"point_forecast":63.07983861572147,"quantiles":{"0.05":46.72544384387255,"0.1":50.216830958107884,"0.2":55.43962068218038,"0.3":58.58682837198335,"0.4":60.932229813250224,"0.5":63.07983861572147,"0.6":65.31765541824791,"0.7":67.92906712392893,"0.8":70.5767045676356,"0.9":73.76661357138381,"0.95":77.06882027562648}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.250469","as_of":"2026-02-16T00:00:00","forecast_date":"2026-02-23T00:00:00","payload":{"point_forecast":62.54156429233835,"quantiles":{"0.05":55.14542448296778,"0.1":57.075338971424316,"0.2":58.6364040367456,"0.3":60.393408569636534,"0.4":61.30322836788293,"0.5":62.54156429233835,"0.6":63.996478838047075,"0.7":64.95785859974617,"0.8":66.20565126495745,"0.9":68.38423533274064,"0.95":69.86082248741964}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.250469","as_of":"2026-02-16T00:00:00","forecast_date":"2026-03-02T00:00:00","payload":{"point_forecast":63.05679321947221,"quantiles":{"0.05":52.31726941871963,"0.1":54.4025121736544,"0.2":57.71852172453625,"0.3":59.84284745919885,"0.4":61.37243123405216,"0.5":63.05679321947221,"0.6":64.69987777352432,"0.7":66.05632875357202,"0.8":67.90017520309742,"0.9":69.98517169829292,"0.95":72.10643468753335}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.250469","as_of":"2026-02-16T00:00:00","forecast_date":"2026-03-17T00:00:00","payload":{"point_forecast":62.44431102499685,"quantiles":{"0.05":49.76732817840741,"0.1":52.01468023562145,"0.2":55.492808676017724,"0.3":58.42065341906625,"0.4":60.40626823608792,"0.5":62.44431102499685,"0.6":64.41729190980608,"0.7":67.06352162249227,"0.8":70.53172238277284,"0.9":73.89330429466482,"0.95":77.80603754809958}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.288522","as_of":"2026-02-23T00:00:00","forecast_date":"2026-03-02T00:00:00","payload":{"point_forecast":66.1626495395562,"quantiles":{"0.05":59.54784627276378,"0.1":61.12275026199464,"0.2":62.74198165104907,"0.3":64.139246359058,"0.4":65.13279131768688,"0.5":66.1626495395562,"0.6":67.45724206337094,"0.7":68.61376814015074,"0.8":70.15804395366409,"0.9":72.21112482986176,"0.95":73.61666852726859}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.288522","as_of":"2026-02-23T00:00:00","forecast_date":"2026-03-09T00:00:00","payload":{"point_forecast":66.64977156470349,"quantiles":{"0.05":56.71998828975018,"0.1":59.03893728208529,"0.2":61.70166167216676,"0.3":63.53611029557438,"0.4":65.1912859787634,"0.5":66.64977156470349,"0.6":68.09572609485376,"0.7":70.00207294121432,"0.8":72.00527818205754,"0.9":73.91568374461826,"0.95":75.20758122746979}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.288522","as_of":"2026-02-23T00:00:00","forecast_date":"2026-03-24T00:00:00","payload":{"point_forecast":65.86972239445726,"quantiles":{"0.05":51.05577452709032,"0.1":55.41626322971208,"0.2":58.51964009677539,"0.3":61.443986201589595,"0.4":63.2804755613983,"0.5":65.86972239445726,"0.6":68.3207607055811,"0.7":71.09052281086242,"0.8":74.29416767812644,"0.9":78.46973985611963,"0.95":80.436417447538}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.325994","as_of":"2026-03-02T00:00:00","forecast_date":"2026-03-09T00:00:00","payload":{"point_forecast":66.9717152972033,"quantiles":{"0.05":59.48845588151846,"0.1":61.55983528021948,"0.2":63.431890281189396,"0.3":64.6848526597752,"0.4":65.8839974435769,"0.5":66.9717152972033,"0.6":68.22568313093159,"0.7":69.38184663697571,"0.8":70.77946949574967,"0.9":72.39918115515695,"0.95":73.8523252610346}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.325994","as_of":"2026-03-02T00:00:00","forecast_date":"2026-03-16T00:00:00","payload":{"point_forecast":66.86940487419984,"quantiles":{"0.05":57.07804494024823,"0.1":59.59153684950703,"0.2":61.90185892025129,"0.3":63.73714784114469,"0.4":65.52231204596691,"0.5":66.86940487419984,"0.6":68.52369751933853,"0.7":69.86526419027764,"0.8":71.96940344561219,"0.9":74.91545760101786,"0.95":77.31005448104692}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.325994","as_of":"2026-03-02T00:00:00","forecast_date":"2026-03-31T00:00:00","payload":{"point_forecast":66.27146849599274,"quantiles":{"0.05":51.60294030475736,"0.1":55.71550905758653,"0.2":58.93845651331855,"0.3":61.91985907150195,"0.4":64.11710775637464,"0.5":66.27146849599274,"0.6":68.43578745809886,"0.7":70.69647364929934,"0.8":73.71842001575334,"0.9":77.631475689044,"0.95":80.80549106566473}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.364046","as_of":"2026-03-09T00:00:00","forecast_date":"2026-03-16T00:00:00","payload":{"point_forecast":91.25331594121974,"quantiles":{"0.05":84.46250957748342,"0.1":85.70964637431668,"0.2":87.50267239159129,"0.3":88.88880528920633,"0.4":90.29440986661967,"0.5":91.25331594121974,"0.6":92.38183740713885,"0.7":93.43324168697565,"0.8":94.9637483009612,"0.9":96.7761516651474,"0.95":97.97017938103308}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.364046","as_of":"2026-03-09T00:00:00","forecast_date":"2026-03-23T00:00:00","payload":{"point_forecast":91.57469244031472,"quantiles":{"0.05":81.24659707717461,"0.1":83.21094727784269,"0.2":85.56671095078768,"0.3":87.72414997173725,"0.4":89.80840740910246,"0.5":91.57469244031472,"0.6":92.9231031248269,"0.7":94.40262459736799,"0.8":96.41077503634341,"0.9":98.48967120213499,"0.95":100.00719448351404}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.364046","as_of":"2026-03-09T00:00:00","forecast_date":"2026-04-07T00:00:00","payload":{"point_forecast":90.70413423919007,"quantiles":{"0.05":77.01256258031506,"0.1":79.5701891218788,"0.2":83.3754310799295,"0.3":86.47994234775318,"0.4":88.3004902622586,"0.5":90.70413423919007,"0.6":92.80503239359876,"0.7":95.11394066748825,"0.8":98.05958777915214,"0.9":101.79220495780629,"0.95":104.51974675935817}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.441891","as_of":"2026-03-16T00:00:00","forecast_date":"2026-03-23T00:00:00","payload":{"point_forecast":98.63831884096146,"quantiles":{"0.05":91.6761995164783,"0.1":93.11332488328115,"0.2":94.56447242119512,"0.3":96.05825857945214,"0.4":97.56524925930708,"0.5":98.63831884096146,"0.6":99.8557659922135,"0.7":101.06228258038055,"0.8":101.93273144654988,"0.9":103.99711350231574,"0.95":106.1111064333897}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.441891","as_of":"2026-03-16T00:00:00","forecast_date":"2026-03-30T00:00:00","payload":{"point_forecast":98.41640094851027,"quantiles":{"0.05":89.1880656607229,"0.1":91.6209033171742,"0.2":93.38130184682485,"0.3":95.20862392768932,"0.4":96.6327009410214,"0.5":98.41640094851027,"0.6":99.55134545836427,"0.7":101.13978130071644,"0.8":103.19357726140478,"0.9":106.09402521182666,"0.95":108.48951393682071}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.441891","as_of":"2026-03-16T00:00:00","forecast_date":"2026-04-14T00:00:00","payload":{"point_forecast":98.5798155746107,"quantiles":{"0.05":83.48393693448489,"0.1":86.56029259365927,"0.2":90.8335608927294,"0.3":93.78090752459619,"0.4":96.24274047831109,"0.5":98.5798155746107,"0.6":101.13336733135968,"0.7":103.56773400838944,"0.8":107.27000255536046,"0.9":110.2405795307228,"0.95":114.46504082087283}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.480770","as_of":"2026-03-23T00:00:00","forecast_date":"2026-03-30T00:00:00","payload":{"point_forecast":98.46317369648685,"quantiles":{"0.05":90.85972017276917,"0.1":92.37294061723232,"0.2":94.52297785476374,"0.3":95.96445668626522,"0.4":97.09146093053538,"0.5":98.46317369648685,"0.6":99.60039678247989,"0.7":100.65003323105601,"0.8":101.63860667294075,"0.9":103.57827895867919,"0.95":104.98334211339939}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.480770","as_of":"2026-03-23T00:00:00","forecast_date":"2026-04-06T00:00:00","payload":{"point_forecast":97.95109290378485,"quantiles":{"0.05":88.27864965466668,"0.1":89.84907776820945,"0.2":92.89086218673745,"0.3":95.10096347417584,"0.4":96.35464006018118,"0.5":97.95109290378485,"0.6":99.47518274038383,"0.7":101.14639509411482,"0.8":102.75780323630848,"0.9":105.58378455261794,"0.95":108.1190455805463}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.480770","as_of":"2026-03-23T00:00:00","forecast_date":"2026-04-21T00:00:00","payload":{"point_forecast":98.20502669620677,"quantiles":{"0.05":82.9325042424017,"0.1":87.0970838183181,"0.2":90.15697852282614,"0.3":93.28855442868695,"0.4":95.72173728432745,"0.5":98.20502669620677,"0.6":101.20464328752256,"0.7":103.70145034821397,"0.8":106.54310455880876,"0.9":110.56285759999624,"0.95":114.93794050241114}},"metadata":{}}],"scores":[1.1748101862400293,5.724351693077825,2.0630889458943735,15.558835622493593,2.207203148819722,5.280315955759682,28.41594708960237,2.9465941218237073,24.934547048377368,21.013467068905754,25.338905228833532,23.037537399088958,30.07289213572134,1.5321673756034144,2.218308627345893,17.41641124335934,7.986506847968191,2.8114276289655407,4.472941277670029,2.775233969307719,11.034065303095769,3.9496006252645035],"mean_crps":10.998416297419029,"ran_at":"2026-06-02T11:12:21.488972","skipped_origins":0} +{"spec":{"task":{"task_id":"wti_oil_price_forecast","target_series_id":"wti_crude_oil_price","horizons":[5,10,21],"frequency":"B","description":"WTI Crude Oil continuous front-month futures Close price (yfinance symbol: CL=F), projected 5, 10, and 21 trading days ahead.","payload_type":"continuous","categories":null,"resolution_fn":"observed_value_at_resolution_timestamp"},"start":"2026-02-02T00:00:00","end":"2026-03-23T00:00:00","stride":5,"origin_dates":null,"warmup":250,"description":"Prospective/out-of-sample evaluation period in 2026 for daily WTI crude oil. Evaluates selected contender models on 8 weekly origins during the early 2026 geopolitical price shock to measure adaptive real-time forecasting performance."},"predictor_id":"darts_autoarima","predictions":[{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.173720","as_of":"2026-02-02T00:00:00","forecast_date":"2026-02-09T00:00:00","payload":{"point_forecast":65.05895733840352,"quantiles":{"0.05":58.331667626429876,"0.1":59.886437476399045,"0.2":61.435357111545045,"0.3":62.71503975713038,"0.4":64.07505115957794,"0.5":65.05895733840352,"0.6":66.22376743077663,"0.7":67.40298615246036,"0.8":68.89399641271976,"0.9":70.44189198133458,"0.95":71.68154492412373}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.173720","as_of":"2026-02-02T00:00:00","forecast_date":"2026-03-03T00:00:00","payload":{"point_forecast":64.80024209436806,"quantiles":{"0.05":51.59342409918608,"0.1":53.966426656668126,"0.2":56.88403703785378,"0.3":60.194484346228045,"0.4":62.44744925245736,"0.5":64.80024209436806,"0.6":67.16660054904489,"0.7":69.78963322976725,"0.8":73.41821947407814,"0.9":77.35422608142905,"0.95":81.68808724205196}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.211960","as_of":"2026-02-09T00:00:00","forecast_date":"2026-02-23T00:00:00","payload":{"point_forecast":63.50564082512121,"quantiles":{"0.05":53.59936788166228,"0.1":55.416626242439996,"0.2":57.91399503789116,"0.3":60.29354090965138,"0.4":62.12383884514761,"0.5":63.50564082512121,"0.6":65.26342534909772,"0.7":66.52877663959772,"0.8":68.73831309460901,"0.9":72.12989759444602,"0.95":73.19628467298814}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.211960","as_of":"2026-02-09T00:00:00","forecast_date":"2026-03-10T00:00:00","payload":{"point_forecast":63.07983861572147,"quantiles":{"0.05":46.72544384387255,"0.1":50.216830958107884,"0.2":55.43962068218038,"0.3":58.58682837198335,"0.4":60.932229813250224,"0.5":63.07983861572147,"0.6":65.31765541824791,"0.7":67.92906712392893,"0.8":70.5767045676356,"0.9":73.76661357138381,"0.95":77.06882027562648}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.250469","as_of":"2026-02-16T00:00:00","forecast_date":"2026-02-23T00:00:00","payload":{"point_forecast":62.54156429233835,"quantiles":{"0.05":55.14542448296778,"0.1":57.075338971424316,"0.2":58.6364040367456,"0.3":60.393408569636534,"0.4":61.30322836788293,"0.5":62.54156429233835,"0.6":63.996478838047075,"0.7":64.95785859974617,"0.8":66.20565126495745,"0.9":68.38423533274064,"0.95":69.86082248741964}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.250469","as_of":"2026-02-16T00:00:00","forecast_date":"2026-03-02T00:00:00","payload":{"point_forecast":63.05679321947221,"quantiles":{"0.05":52.31726941871963,"0.1":54.4025121736544,"0.2":57.71852172453625,"0.3":59.84284745919885,"0.4":61.37243123405216,"0.5":63.05679321947221,"0.6":64.69987777352432,"0.7":66.05632875357202,"0.8":67.90017520309742,"0.9":69.98517169829292,"0.95":72.10643468753335}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.250469","as_of":"2026-02-16T00:00:00","forecast_date":"2026-03-17T00:00:00","payload":{"point_forecast":62.44431102499685,"quantiles":{"0.05":49.76732817840741,"0.1":52.01468023562145,"0.2":55.492808676017724,"0.3":58.42065341906625,"0.4":60.40626823608792,"0.5":62.44431102499685,"0.6":64.41729190980608,"0.7":67.06352162249227,"0.8":70.53172238277284,"0.9":73.89330429466482,"0.95":77.80603754809958}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.288522","as_of":"2026-02-23T00:00:00","forecast_date":"2026-03-02T00:00:00","payload":{"point_forecast":66.1626495395562,"quantiles":{"0.05":59.54784627276378,"0.1":61.12275026199464,"0.2":62.74198165104907,"0.3":64.139246359058,"0.4":65.13279131768688,"0.5":66.1626495395562,"0.6":67.45724206337094,"0.7":68.61376814015074,"0.8":70.15804395366409,"0.9":72.21112482986176,"0.95":73.61666852726859}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.288522","as_of":"2026-02-23T00:00:00","forecast_date":"2026-03-09T00:00:00","payload":{"point_forecast":66.64977156470349,"quantiles":{"0.05":56.71998828975018,"0.1":59.03893728208529,"0.2":61.70166167216676,"0.3":63.53611029557438,"0.4":65.1912859787634,"0.5":66.64977156470349,"0.6":68.09572609485376,"0.7":70.00207294121432,"0.8":72.00527818205754,"0.9":73.91568374461826,"0.95":75.20758122746979}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.288522","as_of":"2026-02-23T00:00:00","forecast_date":"2026-03-24T00:00:00","payload":{"point_forecast":65.86972239445726,"quantiles":{"0.05":51.05577452709032,"0.1":55.41626322971208,"0.2":58.51964009677539,"0.3":61.443986201589595,"0.4":63.2804755613983,"0.5":65.86972239445726,"0.6":68.3207607055811,"0.7":71.09052281086242,"0.8":74.29416767812644,"0.9":78.46973985611963,"0.95":80.436417447538}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.325994","as_of":"2026-03-02T00:00:00","forecast_date":"2026-03-09T00:00:00","payload":{"point_forecast":66.9717152972033,"quantiles":{"0.05":59.48845588151846,"0.1":61.55983528021948,"0.2":63.431890281189396,"0.3":64.6848526597752,"0.4":65.8839974435769,"0.5":66.9717152972033,"0.6":68.22568313093159,"0.7":69.38184663697571,"0.8":70.77946949574967,"0.9":72.39918115515695,"0.95":73.8523252610346}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.325994","as_of":"2026-03-02T00:00:00","forecast_date":"2026-03-16T00:00:00","payload":{"point_forecast":66.86940487419984,"quantiles":{"0.05":57.07804494024823,"0.1":59.59153684950703,"0.2":61.90185892025129,"0.3":63.73714784114469,"0.4":65.52231204596691,"0.5":66.86940487419984,"0.6":68.52369751933853,"0.7":69.86526419027764,"0.8":71.96940344561219,"0.9":74.91545760101786,"0.95":77.31005448104692}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.325994","as_of":"2026-03-02T00:00:00","forecast_date":"2026-03-31T00:00:00","payload":{"point_forecast":66.27146849599274,"quantiles":{"0.05":51.60294030475736,"0.1":55.71550905758653,"0.2":58.93845651331855,"0.3":61.91985907150195,"0.4":64.11710775637464,"0.5":66.27146849599274,"0.6":68.43578745809886,"0.7":70.69647364929934,"0.8":73.71842001575334,"0.9":77.631475689044,"0.95":80.80549106566473}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.364046","as_of":"2026-03-09T00:00:00","forecast_date":"2026-03-16T00:00:00","payload":{"point_forecast":91.25331594121974,"quantiles":{"0.05":84.46250957748342,"0.1":85.70964637431668,"0.2":87.50267239159129,"0.3":88.88880528920633,"0.4":90.29440986661967,"0.5":91.25331594121974,"0.6":92.38183740713885,"0.7":93.43324168697565,"0.8":94.9637483009612,"0.9":96.7761516651474,"0.95":97.97017938103308}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.364046","as_of":"2026-03-09T00:00:00","forecast_date":"2026-03-23T00:00:00","payload":{"point_forecast":91.57469244031472,"quantiles":{"0.05":81.24659707717461,"0.1":83.21094727784269,"0.2":85.56671095078768,"0.3":87.72414997173725,"0.4":89.80840740910246,"0.5":91.57469244031472,"0.6":92.9231031248269,"0.7":94.40262459736799,"0.8":96.41077503634341,"0.9":98.48967120213499,"0.95":100.00719448351404}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.364046","as_of":"2026-03-09T00:00:00","forecast_date":"2026-04-07T00:00:00","payload":{"point_forecast":90.70413423919007,"quantiles":{"0.05":77.01256258031506,"0.1":79.5701891218788,"0.2":83.3754310799295,"0.3":86.47994234775318,"0.4":88.3004902622586,"0.5":90.70413423919007,"0.6":92.80503239359876,"0.7":95.11394066748825,"0.8":98.05958777915214,"0.9":101.79220495780629,"0.95":104.51974675935817}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.441891","as_of":"2026-03-16T00:00:00","forecast_date":"2026-03-23T00:00:00","payload":{"point_forecast":98.63831884096146,"quantiles":{"0.05":91.6761995164783,"0.1":93.11332488328115,"0.2":94.56447242119512,"0.3":96.05825857945214,"0.4":97.56524925930708,"0.5":98.63831884096146,"0.6":99.8557659922135,"0.7":101.06228258038055,"0.8":101.93273144654988,"0.9":103.99711350231574,"0.95":106.1111064333897}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.441891","as_of":"2026-03-16T00:00:00","forecast_date":"2026-03-30T00:00:00","payload":{"point_forecast":98.41640094851027,"quantiles":{"0.05":89.1880656607229,"0.1":91.6209033171742,"0.2":93.38130184682485,"0.3":95.20862392768932,"0.4":96.6327009410214,"0.5":98.41640094851027,"0.6":99.55134545836427,"0.7":101.13978130071644,"0.8":103.19357726140478,"0.9":106.09402521182666,"0.95":108.48951393682071}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.441891","as_of":"2026-03-16T00:00:00","forecast_date":"2026-04-14T00:00:00","payload":{"point_forecast":98.5798155746107,"quantiles":{"0.05":83.48393693448489,"0.1":86.56029259365927,"0.2":90.8335608927294,"0.3":93.78090752459619,"0.4":96.24274047831109,"0.5":98.5798155746107,"0.6":101.13336733135968,"0.7":103.56773400838944,"0.8":107.27000255536046,"0.9":110.2405795307228,"0.95":114.46504082087283}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.480770","as_of":"2026-03-23T00:00:00","forecast_date":"2026-03-30T00:00:00","payload":{"point_forecast":98.46317369648685,"quantiles":{"0.05":90.85972017276917,"0.1":92.37294061723232,"0.2":94.52297785476374,"0.3":95.96445668626522,"0.4":97.09146093053538,"0.5":98.46317369648685,"0.6":99.60039678247989,"0.7":100.65003323105601,"0.8":101.63860667294075,"0.9":103.57827895867919,"0.95":104.98334211339939}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.480770","as_of":"2026-03-23T00:00:00","forecast_date":"2026-04-06T00:00:00","payload":{"point_forecast":97.95109290378485,"quantiles":{"0.05":88.27864965466668,"0.1":89.84907776820945,"0.2":92.89086218673745,"0.3":95.10096347417584,"0.4":96.35464006018118,"0.5":97.95109290378485,"0.6":99.47518274038383,"0.7":101.14639509411482,"0.8":102.75780323630848,"0.9":105.58378455261794,"0.95":108.1190455805463}},"metadata":{}},{"predictor_id":"darts_autoarima","task_id":"wti_oil_price_forecast","issued_at":"2026-06-02T11:12:21.480770","as_of":"2026-03-23T00:00:00","forecast_date":"2026-04-21T00:00:00","payload":{"point_forecast":98.20502669620677,"quantiles":{"0.05":82.9325042424017,"0.1":87.0970838183181,"0.2":90.15697852282614,"0.3":93.28855442868695,"0.4":95.72173728432745,"0.5":98.20502669620677,"0.6":101.20464328752256,"0.7":103.70145034821397,"0.8":106.54310455880876,"0.9":110.56285759999624,"0.95":114.93794050241114}},"metadata":{}}],"scores":[1.1748101862400293,5.724351693077825,2.0630889458943735,15.558835622493593,2.207203148819722,5.280315955759682,28.41594708960237,2.9465941218237073,24.934547048377368,21.013467068905754,25.338905228833532,23.037537399088958,30.07289213572134,1.5321673756034144,2.218308627345893,17.41641124335934,7.986506847968191,2.8114276289655407,4.472941277670029,2.775233969307719,11.034065303095769,3.9496006252645035],"metric":"crps","mean_score":10.998416297419029,"ran_at":"2026-06-02T11:12:21.488972","skipped_origins":0} diff --git a/implementations/energy_oil_forecasting/adaptive_agent/curriculum/eval_Naive (Last Value).json b/implementations/energy_oil_forecasting/adaptive_agent/curriculum/eval_Naive (Last Value).json index 680fca0e..a6c1fe3a 100644 --- a/implementations/energy_oil_forecasting/adaptive_agent/curriculum/eval_Naive (Last Value).json +++ b/implementations/energy_oil_forecasting/adaptive_agent/curriculum/eval_Naive (Last Value).json @@ -1 +1 @@ -{"spec":{"task":{"task_id":"wti_oil_price_forecast","target_series_id":"wti_crude_oil_price","horizons":[5,10,21],"frequency":"B","description":"WTI Crude Oil continuous front-month futures Close price (yfinance symbol: CL=F), projected 5, 10, and 21 trading days ahead.","resolution_fn":"observed_value_at_resolution_timestamp"},"start":"2026-02-02T00:00:00","end":"2026-03-23T00:00:00","stride":5,"warmup":250,"description":"Prospective/out-of-sample evaluation period in 2026 for daily WTI crude oil. Evaluates selected contender models on 8 weekly origins during the early 2026 geopolitical price shock to measure adaptive real-time forecasting performance."},"predictor_id":"last_value_naive","predictions":[{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.829767","as_of":"2026-02-02T00:00:00","forecast_date":"2026-02-09T00:00:00","payload":{"point_forecast":65.20999908447266,"quantiles":{"0.05":65.20999908447266,"0.1":65.20999908447266,"0.2":65.20999908447266,"0.3":65.20999908447266,"0.4":65.20999908447266,"0.5":65.20999908447266,"0.6":65.20999908447266,"0.7":65.20999908447266,"0.8":65.20999908447266,"0.9":65.20999908447266,"0.95":65.20999908447266}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.829767","as_of":"2026-02-02T00:00:00","forecast_date":"2026-03-03T00:00:00","payload":{"point_forecast":65.20999908447266,"quantiles":{"0.05":65.20999908447266,"0.1":65.20999908447266,"0.2":65.20999908447266,"0.3":65.20999908447266,"0.4":65.20999908447266,"0.5":65.20999908447266,"0.6":65.20999908447266,"0.7":65.20999908447266,"0.8":65.20999908447266,"0.9":65.20999908447266,"0.95":65.20999908447266}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.843882","as_of":"2026-02-09T00:00:00","forecast_date":"2026-02-23T00:00:00","payload":{"point_forecast":63.54999923706055,"quantiles":{"0.05":63.54999923706055,"0.1":63.54999923706055,"0.2":63.54999923706055,"0.3":63.54999923706055,"0.4":63.54999923706055,"0.5":63.54999923706055,"0.6":63.54999923706055,"0.7":63.54999923706055,"0.8":63.54999923706055,"0.9":63.54999923706055,"0.95":63.54999923706055}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.843882","as_of":"2026-02-09T00:00:00","forecast_date":"2026-03-10T00:00:00","payload":{"point_forecast":63.54999923706055,"quantiles":{"0.05":63.54999923706055,"0.1":63.54999923706055,"0.2":63.54999923706055,"0.3":63.54999923706055,"0.4":63.54999923706055,"0.5":63.54999923706055,"0.6":63.54999923706055,"0.7":63.54999923706055,"0.8":63.54999923706055,"0.9":63.54999923706055,"0.95":63.54999923706055}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.856020","as_of":"2026-02-16T00:00:00","forecast_date":"2026-02-23T00:00:00","payload":{"point_forecast":62.88999938964844,"quantiles":{"0.05":62.88999938964844,"0.1":62.88999938964844,"0.2":62.88999938964844,"0.3":62.88999938964844,"0.4":62.88999938964844,"0.5":62.88999938964844,"0.6":62.88999938964844,"0.7":62.88999938964844,"0.8":62.88999938964844,"0.9":62.88999938964844,"0.95":62.88999938964844}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.856020","as_of":"2026-02-16T00:00:00","forecast_date":"2026-03-02T00:00:00","payload":{"point_forecast":62.88999938964844,"quantiles":{"0.05":62.88999938964844,"0.1":62.88999938964844,"0.2":62.88999938964844,"0.3":62.88999938964844,"0.4":62.88999938964844,"0.5":62.88999938964844,"0.6":62.88999938964844,"0.7":62.88999938964844,"0.8":62.88999938964844,"0.9":62.88999938964844,"0.95":62.88999938964844}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.856020","as_of":"2026-02-16T00:00:00","forecast_date":"2026-03-17T00:00:00","payload":{"point_forecast":62.88999938964844,"quantiles":{"0.05":62.88999938964844,"0.1":62.88999938964844,"0.2":62.88999938964844,"0.3":62.88999938964844,"0.4":62.88999938964844,"0.5":62.88999938964844,"0.6":62.88999938964844,"0.7":62.88999938964844,"0.8":62.88999938964844,"0.9":62.88999938964844,"0.95":62.88999938964844}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.866895","as_of":"2026-02-23T00:00:00","forecast_date":"2026-03-02T00:00:00","payload":{"point_forecast":66.38999938964844,"quantiles":{"0.05":66.38999938964844,"0.1":66.38999938964844,"0.2":66.38999938964844,"0.3":66.38999938964844,"0.4":66.38999938964844,"0.5":66.38999938964844,"0.6":66.38999938964844,"0.7":66.38999938964844,"0.8":66.38999938964844,"0.9":66.38999938964844,"0.95":66.38999938964844}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.866895","as_of":"2026-02-23T00:00:00","forecast_date":"2026-03-09T00:00:00","payload":{"point_forecast":66.38999938964844,"quantiles":{"0.05":66.38999938964844,"0.1":66.38999938964844,"0.2":66.38999938964844,"0.3":66.38999938964844,"0.4":66.38999938964844,"0.5":66.38999938964844,"0.6":66.38999938964844,"0.7":66.38999938964844,"0.8":66.38999938964844,"0.9":66.38999938964844,"0.95":66.38999938964844}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.866895","as_of":"2026-02-23T00:00:00","forecast_date":"2026-03-24T00:00:00","payload":{"point_forecast":66.38999938964844,"quantiles":{"0.05":66.38999938964844,"0.1":66.38999938964844,"0.2":66.38999938964844,"0.3":66.38999938964844,"0.4":66.38999938964844,"0.5":66.38999938964844,"0.6":66.38999938964844,"0.7":66.38999938964844,"0.8":66.38999938964844,"0.9":66.38999938964844,"0.95":66.38999938964844}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.877381","as_of":"2026-03-02T00:00:00","forecast_date":"2026-03-09T00:00:00","payload":{"point_forecast":67.0199966430664,"quantiles":{"0.05":67.0199966430664,"0.1":67.0199966430664,"0.2":67.0199966430664,"0.3":67.0199966430664,"0.4":67.0199966430664,"0.5":67.0199966430664,"0.6":67.0199966430664,"0.7":67.0199966430664,"0.8":67.0199966430664,"0.9":67.0199966430664,"0.95":67.0199966430664}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.877381","as_of":"2026-03-02T00:00:00","forecast_date":"2026-03-16T00:00:00","payload":{"point_forecast":67.0199966430664,"quantiles":{"0.05":67.0199966430664,"0.1":67.0199966430664,"0.2":67.0199966430664,"0.3":67.0199966430664,"0.4":67.0199966430664,"0.5":67.0199966430664,"0.6":67.0199966430664,"0.7":67.0199966430664,"0.8":67.0199966430664,"0.9":67.0199966430664,"0.95":67.0199966430664}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.877381","as_of":"2026-03-02T00:00:00","forecast_date":"2026-03-31T00:00:00","payload":{"point_forecast":67.0199966430664,"quantiles":{"0.05":67.0199966430664,"0.1":67.0199966430664,"0.2":67.0199966430664,"0.3":67.0199966430664,"0.4":67.0199966430664,"0.5":67.0199966430664,"0.6":67.0199966430664,"0.7":67.0199966430664,"0.8":67.0199966430664,"0.9":67.0199966430664,"0.95":67.0199966430664}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.886868","as_of":"2026-03-09T00:00:00","forecast_date":"2026-03-16T00:00:00","payload":{"point_forecast":90.9000015258789,"quantiles":{"0.05":90.9000015258789,"0.1":90.9000015258789,"0.2":90.9000015258789,"0.3":90.9000015258789,"0.4":90.9000015258789,"0.5":90.9000015258789,"0.6":90.9000015258789,"0.7":90.9000015258789,"0.8":90.9000015258789,"0.9":90.9000015258789,"0.95":90.9000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.886868","as_of":"2026-03-09T00:00:00","forecast_date":"2026-03-23T00:00:00","payload":{"point_forecast":90.9000015258789,"quantiles":{"0.05":90.9000015258789,"0.1":90.9000015258789,"0.2":90.9000015258789,"0.3":90.9000015258789,"0.4":90.9000015258789,"0.5":90.9000015258789,"0.6":90.9000015258789,"0.7":90.9000015258789,"0.8":90.9000015258789,"0.9":90.9000015258789,"0.95":90.9000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.886868","as_of":"2026-03-09T00:00:00","forecast_date":"2026-04-07T00:00:00","payload":{"point_forecast":90.9000015258789,"quantiles":{"0.05":90.9000015258789,"0.1":90.9000015258789,"0.2":90.9000015258789,"0.3":90.9000015258789,"0.4":90.9000015258789,"0.5":90.9000015258789,"0.6":90.9000015258789,"0.7":90.9000015258789,"0.8":90.9000015258789,"0.9":90.9000015258789,"0.95":90.9000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.896337","as_of":"2026-03-16T00:00:00","forecast_date":"2026-03-23T00:00:00","payload":{"point_forecast":98.70999908447266,"quantiles":{"0.05":98.70999908447266,"0.1":98.70999908447266,"0.2":98.70999908447266,"0.3":98.70999908447266,"0.4":98.70999908447266,"0.5":98.70999908447266,"0.6":98.70999908447266,"0.7":98.70999908447266,"0.8":98.70999908447266,"0.9":98.70999908447266,"0.95":98.70999908447266}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.896337","as_of":"2026-03-16T00:00:00","forecast_date":"2026-03-30T00:00:00","payload":{"point_forecast":98.70999908447266,"quantiles":{"0.05":98.70999908447266,"0.1":98.70999908447266,"0.2":98.70999908447266,"0.3":98.70999908447266,"0.4":98.70999908447266,"0.5":98.70999908447266,"0.6":98.70999908447266,"0.7":98.70999908447266,"0.8":98.70999908447266,"0.9":98.70999908447266,"0.95":98.70999908447266}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.896337","as_of":"2026-03-16T00:00:00","forecast_date":"2026-04-14T00:00:00","payload":{"point_forecast":98.70999908447266,"quantiles":{"0.05":98.70999908447266,"0.1":98.70999908447266,"0.2":98.70999908447266,"0.3":98.70999908447266,"0.4":98.70999908447266,"0.5":98.70999908447266,"0.6":98.70999908447266,"0.7":98.70999908447266,"0.8":98.70999908447266,"0.9":98.70999908447266,"0.95":98.70999908447266}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.905918","as_of":"2026-03-23T00:00:00","forecast_date":"2026-03-30T00:00:00","payload":{"point_forecast":98.31999969482422,"quantiles":{"0.05":98.31999969482422,"0.1":98.31999969482422,"0.2":98.31999969482422,"0.3":98.31999969482422,"0.4":98.31999969482422,"0.5":98.31999969482422,"0.6":98.31999969482422,"0.7":98.31999969482422,"0.8":98.31999969482422,"0.9":98.31999969482422,"0.95":98.31999969482422}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.905918","as_of":"2026-03-23T00:00:00","forecast_date":"2026-04-06T00:00:00","payload":{"point_forecast":98.31999969482422,"quantiles":{"0.05":98.31999969482422,"0.1":98.31999969482422,"0.2":98.31999969482422,"0.3":98.31999969482422,"0.4":98.31999969482422,"0.5":98.31999969482422,"0.6":98.31999969482422,"0.7":98.31999969482422,"0.8":98.31999969482422,"0.9":98.31999969482422,"0.95":98.31999969482422}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.905918","as_of":"2026-03-23T00:00:00","forecast_date":"2026-04-21T00:00:00","payload":{"point_forecast":98.31999969482422,"quantiles":{"0.05":98.31999969482422,"0.1":98.31999969482422,"0.2":98.31999969482422,"0.3":98.31999969482422,"0.4":98.31999969482422,"0.5":98.31999969482422,"0.6":98.31999969482422,"0.7":98.31999969482422,"0.8":98.31999969482422,"0.9":98.31999969482422,"0.95":98.31999969482422}},"metadata":{}}],"scores":[0.8499984741210938,9.349998474121094,2.759998321533203,19.89999771118164,3.4199981689453125,8.340003967285156,33.31999969482422,4.840003967285156,28.37999725341797,25.959999084472656,27.75,26.480003356933594,34.36000061035156,2.5999984741210938,2.7700042724609375,22.04999542236328,10.580001831054688,4.1699981689453125,7.430000305175781,4.55999755859375,14.090003967285156,6.19000244140625],"mean_crps":13.643181887539951,"ran_at":"2026-05-22T15:59:38.912927","skipped_origins":0} +{"spec":{"task":{"task_id":"wti_oil_price_forecast","target_series_id":"wti_crude_oil_price","horizons":[5,10,21],"frequency":"B","description":"WTI Crude Oil continuous front-month futures Close price (yfinance symbol: CL=F), projected 5, 10, and 21 trading days ahead.","payload_type":"continuous","categories":null,"resolution_fn":"observed_value_at_resolution_timestamp"},"start":"2026-02-02T00:00:00","end":"2026-03-23T00:00:00","stride":5,"origin_dates":null,"warmup":250,"description":"Prospective/out-of-sample evaluation period in 2026 for daily WTI crude oil. Evaluates selected contender models on 8 weekly origins during the early 2026 geopolitical price shock to measure adaptive real-time forecasting performance."},"predictor_id":"last_value_naive","predictions":[{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.829767","as_of":"2026-02-02T00:00:00","forecast_date":"2026-02-09T00:00:00","payload":{"point_forecast":65.20999908447266,"quantiles":{"0.05":65.20999908447266,"0.1":65.20999908447266,"0.2":65.20999908447266,"0.3":65.20999908447266,"0.4":65.20999908447266,"0.5":65.20999908447266,"0.6":65.20999908447266,"0.7":65.20999908447266,"0.8":65.20999908447266,"0.9":65.20999908447266,"0.95":65.20999908447266}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.829767","as_of":"2026-02-02T00:00:00","forecast_date":"2026-03-03T00:00:00","payload":{"point_forecast":65.20999908447266,"quantiles":{"0.05":65.20999908447266,"0.1":65.20999908447266,"0.2":65.20999908447266,"0.3":65.20999908447266,"0.4":65.20999908447266,"0.5":65.20999908447266,"0.6":65.20999908447266,"0.7":65.20999908447266,"0.8":65.20999908447266,"0.9":65.20999908447266,"0.95":65.20999908447266}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.843882","as_of":"2026-02-09T00:00:00","forecast_date":"2026-02-23T00:00:00","payload":{"point_forecast":63.54999923706055,"quantiles":{"0.05":63.54999923706055,"0.1":63.54999923706055,"0.2":63.54999923706055,"0.3":63.54999923706055,"0.4":63.54999923706055,"0.5":63.54999923706055,"0.6":63.54999923706055,"0.7":63.54999923706055,"0.8":63.54999923706055,"0.9":63.54999923706055,"0.95":63.54999923706055}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.843882","as_of":"2026-02-09T00:00:00","forecast_date":"2026-03-10T00:00:00","payload":{"point_forecast":63.54999923706055,"quantiles":{"0.05":63.54999923706055,"0.1":63.54999923706055,"0.2":63.54999923706055,"0.3":63.54999923706055,"0.4":63.54999923706055,"0.5":63.54999923706055,"0.6":63.54999923706055,"0.7":63.54999923706055,"0.8":63.54999923706055,"0.9":63.54999923706055,"0.95":63.54999923706055}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.856020","as_of":"2026-02-16T00:00:00","forecast_date":"2026-02-23T00:00:00","payload":{"point_forecast":62.88999938964844,"quantiles":{"0.05":62.88999938964844,"0.1":62.88999938964844,"0.2":62.88999938964844,"0.3":62.88999938964844,"0.4":62.88999938964844,"0.5":62.88999938964844,"0.6":62.88999938964844,"0.7":62.88999938964844,"0.8":62.88999938964844,"0.9":62.88999938964844,"0.95":62.88999938964844}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.856020","as_of":"2026-02-16T00:00:00","forecast_date":"2026-03-02T00:00:00","payload":{"point_forecast":62.88999938964844,"quantiles":{"0.05":62.88999938964844,"0.1":62.88999938964844,"0.2":62.88999938964844,"0.3":62.88999938964844,"0.4":62.88999938964844,"0.5":62.88999938964844,"0.6":62.88999938964844,"0.7":62.88999938964844,"0.8":62.88999938964844,"0.9":62.88999938964844,"0.95":62.88999938964844}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.856020","as_of":"2026-02-16T00:00:00","forecast_date":"2026-03-17T00:00:00","payload":{"point_forecast":62.88999938964844,"quantiles":{"0.05":62.88999938964844,"0.1":62.88999938964844,"0.2":62.88999938964844,"0.3":62.88999938964844,"0.4":62.88999938964844,"0.5":62.88999938964844,"0.6":62.88999938964844,"0.7":62.88999938964844,"0.8":62.88999938964844,"0.9":62.88999938964844,"0.95":62.88999938964844}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.866895","as_of":"2026-02-23T00:00:00","forecast_date":"2026-03-02T00:00:00","payload":{"point_forecast":66.38999938964844,"quantiles":{"0.05":66.38999938964844,"0.1":66.38999938964844,"0.2":66.38999938964844,"0.3":66.38999938964844,"0.4":66.38999938964844,"0.5":66.38999938964844,"0.6":66.38999938964844,"0.7":66.38999938964844,"0.8":66.38999938964844,"0.9":66.38999938964844,"0.95":66.38999938964844}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.866895","as_of":"2026-02-23T00:00:00","forecast_date":"2026-03-09T00:00:00","payload":{"point_forecast":66.38999938964844,"quantiles":{"0.05":66.38999938964844,"0.1":66.38999938964844,"0.2":66.38999938964844,"0.3":66.38999938964844,"0.4":66.38999938964844,"0.5":66.38999938964844,"0.6":66.38999938964844,"0.7":66.38999938964844,"0.8":66.38999938964844,"0.9":66.38999938964844,"0.95":66.38999938964844}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.866895","as_of":"2026-02-23T00:00:00","forecast_date":"2026-03-24T00:00:00","payload":{"point_forecast":66.38999938964844,"quantiles":{"0.05":66.38999938964844,"0.1":66.38999938964844,"0.2":66.38999938964844,"0.3":66.38999938964844,"0.4":66.38999938964844,"0.5":66.38999938964844,"0.6":66.38999938964844,"0.7":66.38999938964844,"0.8":66.38999938964844,"0.9":66.38999938964844,"0.95":66.38999938964844}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.877381","as_of":"2026-03-02T00:00:00","forecast_date":"2026-03-09T00:00:00","payload":{"point_forecast":67.0199966430664,"quantiles":{"0.05":67.0199966430664,"0.1":67.0199966430664,"0.2":67.0199966430664,"0.3":67.0199966430664,"0.4":67.0199966430664,"0.5":67.0199966430664,"0.6":67.0199966430664,"0.7":67.0199966430664,"0.8":67.0199966430664,"0.9":67.0199966430664,"0.95":67.0199966430664}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.877381","as_of":"2026-03-02T00:00:00","forecast_date":"2026-03-16T00:00:00","payload":{"point_forecast":67.0199966430664,"quantiles":{"0.05":67.0199966430664,"0.1":67.0199966430664,"0.2":67.0199966430664,"0.3":67.0199966430664,"0.4":67.0199966430664,"0.5":67.0199966430664,"0.6":67.0199966430664,"0.7":67.0199966430664,"0.8":67.0199966430664,"0.9":67.0199966430664,"0.95":67.0199966430664}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.877381","as_of":"2026-03-02T00:00:00","forecast_date":"2026-03-31T00:00:00","payload":{"point_forecast":67.0199966430664,"quantiles":{"0.05":67.0199966430664,"0.1":67.0199966430664,"0.2":67.0199966430664,"0.3":67.0199966430664,"0.4":67.0199966430664,"0.5":67.0199966430664,"0.6":67.0199966430664,"0.7":67.0199966430664,"0.8":67.0199966430664,"0.9":67.0199966430664,"0.95":67.0199966430664}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.886868","as_of":"2026-03-09T00:00:00","forecast_date":"2026-03-16T00:00:00","payload":{"point_forecast":90.9000015258789,"quantiles":{"0.05":90.9000015258789,"0.1":90.9000015258789,"0.2":90.9000015258789,"0.3":90.9000015258789,"0.4":90.9000015258789,"0.5":90.9000015258789,"0.6":90.9000015258789,"0.7":90.9000015258789,"0.8":90.9000015258789,"0.9":90.9000015258789,"0.95":90.9000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.886868","as_of":"2026-03-09T00:00:00","forecast_date":"2026-03-23T00:00:00","payload":{"point_forecast":90.9000015258789,"quantiles":{"0.05":90.9000015258789,"0.1":90.9000015258789,"0.2":90.9000015258789,"0.3":90.9000015258789,"0.4":90.9000015258789,"0.5":90.9000015258789,"0.6":90.9000015258789,"0.7":90.9000015258789,"0.8":90.9000015258789,"0.9":90.9000015258789,"0.95":90.9000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.886868","as_of":"2026-03-09T00:00:00","forecast_date":"2026-04-07T00:00:00","payload":{"point_forecast":90.9000015258789,"quantiles":{"0.05":90.9000015258789,"0.1":90.9000015258789,"0.2":90.9000015258789,"0.3":90.9000015258789,"0.4":90.9000015258789,"0.5":90.9000015258789,"0.6":90.9000015258789,"0.7":90.9000015258789,"0.8":90.9000015258789,"0.9":90.9000015258789,"0.95":90.9000015258789}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.896337","as_of":"2026-03-16T00:00:00","forecast_date":"2026-03-23T00:00:00","payload":{"point_forecast":98.70999908447266,"quantiles":{"0.05":98.70999908447266,"0.1":98.70999908447266,"0.2":98.70999908447266,"0.3":98.70999908447266,"0.4":98.70999908447266,"0.5":98.70999908447266,"0.6":98.70999908447266,"0.7":98.70999908447266,"0.8":98.70999908447266,"0.9":98.70999908447266,"0.95":98.70999908447266}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.896337","as_of":"2026-03-16T00:00:00","forecast_date":"2026-03-30T00:00:00","payload":{"point_forecast":98.70999908447266,"quantiles":{"0.05":98.70999908447266,"0.1":98.70999908447266,"0.2":98.70999908447266,"0.3":98.70999908447266,"0.4":98.70999908447266,"0.5":98.70999908447266,"0.6":98.70999908447266,"0.7":98.70999908447266,"0.8":98.70999908447266,"0.9":98.70999908447266,"0.95":98.70999908447266}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.896337","as_of":"2026-03-16T00:00:00","forecast_date":"2026-04-14T00:00:00","payload":{"point_forecast":98.70999908447266,"quantiles":{"0.05":98.70999908447266,"0.1":98.70999908447266,"0.2":98.70999908447266,"0.3":98.70999908447266,"0.4":98.70999908447266,"0.5":98.70999908447266,"0.6":98.70999908447266,"0.7":98.70999908447266,"0.8":98.70999908447266,"0.9":98.70999908447266,"0.95":98.70999908447266}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.905918","as_of":"2026-03-23T00:00:00","forecast_date":"2026-03-30T00:00:00","payload":{"point_forecast":98.31999969482422,"quantiles":{"0.05":98.31999969482422,"0.1":98.31999969482422,"0.2":98.31999969482422,"0.3":98.31999969482422,"0.4":98.31999969482422,"0.5":98.31999969482422,"0.6":98.31999969482422,"0.7":98.31999969482422,"0.8":98.31999969482422,"0.9":98.31999969482422,"0.95":98.31999969482422}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.905918","as_of":"2026-03-23T00:00:00","forecast_date":"2026-04-06T00:00:00","payload":{"point_forecast":98.31999969482422,"quantiles":{"0.05":98.31999969482422,"0.1":98.31999969482422,"0.2":98.31999969482422,"0.3":98.31999969482422,"0.4":98.31999969482422,"0.5":98.31999969482422,"0.6":98.31999969482422,"0.7":98.31999969482422,"0.8":98.31999969482422,"0.9":98.31999969482422,"0.95":98.31999969482422}},"metadata":{}},{"predictor_id":"last_value_naive","task_id":"wti_oil_price_forecast","issued_at":"2026-05-22T15:59:38.905918","as_of":"2026-03-23T00:00:00","forecast_date":"2026-04-21T00:00:00","payload":{"point_forecast":98.31999969482422,"quantiles":{"0.05":98.31999969482422,"0.1":98.31999969482422,"0.2":98.31999969482422,"0.3":98.31999969482422,"0.4":98.31999969482422,"0.5":98.31999969482422,"0.6":98.31999969482422,"0.7":98.31999969482422,"0.8":98.31999969482422,"0.9":98.31999969482422,"0.95":98.31999969482422}},"metadata":{}}],"scores":[0.8499984741210938,9.349998474121094,2.759998321533203,19.89999771118164,3.4199981689453125,8.340003967285156,33.31999969482422,4.840003967285156,28.37999725341797,25.959999084472656,27.75,26.480003356933594,34.36000061035156,2.5999984741210938,2.7700042724609375,22.04999542236328,10.580001831054688,4.1699981689453125,7.430000305175781,4.55999755859375,14.090003967285156,6.19000244140625],"metric":"crps","mean_score":13.643181887539951,"ran_at":"2026-05-22T15:59:38.912927","skipped_origins":0} diff --git a/implementations/energy_oil_forecasting/analysis.py b/implementations/energy_oil_forecasting/analysis.py index 8f385033..ce2d5587 100644 --- a/implementations/energy_oil_forecasting/analysis.py +++ b/implementations/energy_oil_forecasting/analysis.py @@ -6,6 +6,7 @@ from __future__ import annotations +from datetime import datetime, timezone from typing import Any import numpy as np @@ -30,8 +31,19 @@ def score_backtest_results( data_service: DataService, *, mae_horizon: int = 21, + actuals_as_of: datetime | None = None, ) -> dict[str, float]: - """Aggregate CRPS, MAE at a horizon, and 80% CI coverage for backtest results.""" + """Aggregate CRPS, MAE at a horizon, and 80% CI coverage for backtest results. + + ``actuals_as_of`` is the cutoff used to look up realised target values when + scoring MAE and coverage. It defaults to *now* so that every forecast which + has already resolved is scored — using ``result.spec.end`` instead would hide + every horizon that resolves after the backtest window (which, for a short + eval window, is all of them, leaving MAE/coverage ``nan``). This is post-hoc + scoring of realised outcomes, not a forecast-time view, so a late cutoff is + correct and introduces no leakage. + """ + resolved_as_of = actuals_as_of or datetime.now(tz=timezone.utc).replace(tzinfo=None) all_scores: list[float] = [] mae_errors: list[float] = [] coverage_hits: list[float] = [] @@ -39,7 +51,7 @@ def score_backtest_results( for result in results.values(): all_scores.extend(result.scores) task = result.spec.task - actual_df = data_service.get_series(task.target_series_id, as_of=result.spec.end) + actual_df = data_service.get_series(task.target_series_id, as_of=resolved_as_of) actual_by_date = { pd.Timestamp(row["timestamp"]).normalize(): float(row["value"]) for _, row in actual_df.iterrows() } @@ -149,9 +161,292 @@ def select_top_predictors( return [str(x) for x in leaderboard.head(n)["predictor_id"].tolist()] +# ── Per-prediction diagnostics ──────────────────────────────────────────────── +# The leaderboard collapses every forecast into a single mean CRPS. To understand +# *why* a method wins or loses we need the predictions un-aggregated: one row per +# (predictor, origin, horizon) carrying the point estimate, the 80% interval, the +# realised outcome, and the CRPS the harness assigned. Everything below builds on +# this tidy frame so the notebook charts and the written narrative read from the +# same numbers. + +# Map of predictor-name fragments → family label, checked in order. Used to group +# the leaderboard into baselines / numerical-ML / LLM-agent without hard-coding a +# per-predictor table (the registry can grow without touching this). +_FAMILY_RULES: list[tuple[tuple[str, ...], str]] = [ + (("naive", "last value"), "Baseline"), + (("arima", "lightgbm", "prophet"), "Numerical ML"), + (("llmp", "agent", "news", "llm"), "LLM / Agent"), +] + + +def predictor_family(name: str) -> str: + """Classify a predictor display name into a forecasting family.""" + low = name.lower() + for fragments, label in _FAMILY_RULES: + if any(frag in low for frag in fragments): + return label + return "Other" + + +def _qval(quantiles: dict[Any, float], q: float) -> float: + """Read a quantile value tolerating both float and string dict keys.""" + for key in (q, str(q), f"{q:.2f}"): + if key in quantiles: + return float(quantiles[key]) + return float("nan") + + +def _business_horizon(as_of: pd.Timestamp, forecast_date: pd.Timestamp) -> int: + """Trading-day distance between an information cutoff and a forecast date.""" + return max(len(pd.bdate_range(as_of.normalize(), forecast_date.normalize())) - 1, 0) + + +def predictions_to_frame( + results_by_predictor: dict[str, dict[str, BacktestResult]], + data_service: DataService, + *, + actuals_as_of: datetime | None = None, +) -> pd.DataFrame: + """Explode backtest results into one tidy row per scored prediction. + + Parameters + ---------- + results_by_predictor + ``{display_name: {task_id: BacktestResult}}`` — exactly the shape the + notebook holds in ``eval_results`` / ``backtest_results``. + data_service + Used to look up realised target values for error/coverage columns. + actuals_as_of + Cutoff for realised-value lookup; defaults to *now* so every horizon that + has already resolved is scored (see :func:`score_backtest_results`). + + Returns + ------- + pd.DataFrame + Columns: ``predictor``, ``family``, ``as_of``, ``forecast_date``, + ``horizon`` (trading days), ``point``, ``q10``/``q20``/``q50``/``q80``/ + ``q90``, ``actual``, ``crps``, ``abs_error``, ``signed_error``, + ``width80`` (80% interval width), and ``inside80`` (1.0/0.0/NaN). + """ + resolved_as_of = actuals_as_of or datetime.now(tz=timezone.utc).replace(tzinfo=None) + actual_cache: dict[str, dict[pd.Timestamp, float]] = {} + + def _actuals(series_id: str) -> dict[pd.Timestamp, float]: + if series_id not in actual_cache: + df = data_service.get_series(series_id, as_of=resolved_as_of) + actual_cache[series_id] = { + pd.Timestamp(row["timestamp"]).normalize(): float(row["value"]) for _, row in df.iterrows() + } + return actual_cache[series_id] + + rows: list[dict[str, Any]] = [] + for predictor_name, task_results in results_by_predictor.items(): + for result in task_results.values(): + actual_by_date = _actuals(result.spec.task.target_series_id) + for pred, score in zip(result.predictions, result.scores, strict=False): + if not isinstance(pred.payload, ContinuousForecast): + continue + as_of = pd.Timestamp(pred.as_of) + fdate = pd.Timestamp(pred.forecast_date).normalize() + q = pred.payload.quantiles + lo80, hi80 = _qval(q, 0.2), _qval(q, 0.8) + point = float(pred.payload.point_forecast) + actual = actual_by_date.get(fdate) + rows.append( + { + "predictor": predictor_name, + "family": predictor_family(predictor_name), + "as_of": as_of, + "forecast_date": fdate, + "horizon": _business_horizon(as_of, fdate), + "point": point, + "q10": _qval(q, 0.1), + "q20": lo80, + "q50": _qval(q, 0.5), + "q80": hi80, + "q90": _qval(q, 0.9), + "actual": actual, + "crps": float(score), + "abs_error": abs(point - actual) if actual is not None else float("nan"), + "signed_error": (actual - point) if actual is not None else float("nan"), + "width80": hi80 - lo80, + "inside80": float(lo80 <= actual <= hi80) if actual is not None else float("nan"), + } + ) + return pd.DataFrame(rows) + + +def per_horizon_crps(pred_frame: pd.DataFrame) -> pd.DataFrame: + """Pivot mean CRPS to a predictor × horizon matrix with an ``All`` column. + + Rows are sorted by overall mean CRPS (best first) so the table doubles as the + leaderboard and reveals which horizon decides the ranking. + """ + if pred_frame.empty: + return pd.DataFrame() + pivot = pred_frame.pivot_table(index="predictor", columns="horizon", values="crps", aggfunc="mean") + pivot.columns = [f"h={int(h)}d" for h in pivot.columns] + pivot["All"] = pred_frame.groupby("predictor")["crps"].mean() + return pivot.sort_values("All") + + +def leaderboard_with_uncertainty(pred_frame: pd.DataFrame) -> pd.DataFrame: + """Mean CRPS per predictor with a standard error, sorted best-first. + + The ``se`` column (sample standard deviation / √n) is the lens for the + "is this lead real or noise?" question: when the gap between two predictors + is small relative to their SEs — common with only a handful of scored + origins — the ranking is not statistically meaningful. + """ + if pred_frame.empty: + return pd.DataFrame() + grp = pred_frame.groupby("predictor")["crps"] + out = pd.DataFrame( + { + "mean_crps": grp.mean(), + "se": grp.std(ddof=1) / np.sqrt(grp.count()), + "n": grp.count().astype(int), + "family": pred_frame.groupby("predictor")["family"].first(), + } + ) + return out.sort_values("mean_crps") + + +def extract_agent_rationales(results_by_predictor: dict[str, dict[str, BacktestResult]]) -> pd.DataFrame: + """Pull free-text rationale and trace links from agent/LLM prediction metadata. + + Only predictions whose ``metadata`` carries a ``rationale`` (the analyst agent + and any LLM method that returns one) produce rows. The result is the raw + material for inspecting *what the model was thinking* origin by origin. + """ + rows: list[dict[str, Any]] = [] + for predictor_name, task_results in results_by_predictor.items(): + for result in task_results.values(): + for pred in result.predictions: + meta = pred.metadata or {} + if "rationale" not in meta and "horizon_rationale" not in meta: + continue + rows.append( + { + "predictor": predictor_name, + "as_of": pd.Timestamp(pred.as_of), + "horizon": _business_horizon(pd.Timestamp(pred.as_of), pd.Timestamp(pred.forecast_date)), + "point": float(pred.payload.point_forecast) + if isinstance(pred.payload, ContinuousForecast) + else float("nan"), + "rationale": str(meta.get("rationale", "")).strip(), + "horizon_rationale": str(meta.get("horizon_rationale", "")).strip(), + "trace_url": meta.get("langfuse_trace_url", ""), + } + ) + return pd.DataFrame(rows) + + +def eval_narrative_md( + pred_frame: pd.DataFrame, + *, + smoke: bool = False, + period_label: str = "2026 evaluation", +) -> str: + """Generate the eval takeaways as Markdown computed from the results. + + Replaces hard-coded prose so the narrative always matches the run — including + after switching from smoke to the full suite. Reports the actual winner, the + gap to the runner-up relative to the noise floor, the decisive horizon, the + best family, and a calibration line, plus an explicit small-sample caveat. + """ + if pred_frame.empty: + return "_No scored predictions available to summarise._" + + board = leaderboard_with_uncertainty(pred_frame) + horizons = sorted(pred_frame["horizon"].unique()) + n_origins = pred_frame["as_of"].nunique() + n_points = len(pred_frame) + + winner = board.index[0] + win_crps, win_se = board.loc[winner, "mean_crps"], board.loc[winner, "se"] + lines: list[str] = [] + + # 1. Winner + significance vs runner-up. + if len(board) > 1: + runner = board.index[1] + gap = board.loc[runner, "mean_crps"] - win_crps + noise = float(np.nan_to_num(win_se) + np.nan_to_num(board.loc[runner, "se"])) + significant = noise > 0 and gap > noise + verdict = ( + "a gap larger than the combined standard error — a real edge over this window" + if significant + else "**well within the combined standard error**, so the ranking here is not statistically distinguishable from noise" + ) + lines.append( + f"1. **{winner}** has the best mean CRPS ({win_crps:.2f}) on the {period_label}, " + f"ahead of **{runner}** ({board.loc[runner, 'mean_crps']:.2f}) by {gap:.2f} — {verdict}." + ) + else: + lines.append(f"1. **{winner}** scored {win_crps:.2f} mean CRPS on the {period_label}.") + + # 2. Where the ranking is decided (per-horizon spread). + if len(horizons) > 1: + by_h = pred_frame.groupby("horizon")["crps"] + spread = (by_h.max() - by_h.min()).sort_values(ascending=False) + decisive_h = int(spread.index[0]) + easy_h = int(spread.index[-1]) + lines.append( + f"2. The leaderboard is **decided at h={decisive_h}d**, where CRPS ranges {by_h.min()[decisive_h]:.1f}–" + f"{by_h.max()[decisive_h]:.1f} across methods; at the short h={easy_h}d horizon the methods are nearly " + f"tied (range {by_h.min()[easy_h]:.1f}–{by_h.max()[easy_h]:.1f}). A handful of long-horizon points " + f"drives the whole ranking." + ) + + # 3. Best family — does the agentic/LLM bet pay off here? + fam = pred_frame.groupby("family")["crps"].mean().sort_values() + best_fam = fam.index[0] + fam_str = ", ".join(f"{f} {v:.2f}" for f, v in fam.items()) + lines.append(f"3. **By family** (mean CRPS): {fam_str}. Best family this window: **{best_fam}**.") + + # 4. Calibration — is the winner's 80% interval honest? + cov = pred_frame.dropna(subset=["inside80"]).groupby("predictor")["inside80"].mean() * 100 + if winner in cov.index: + n_win = int(board.loc[winner, "n"]) + lines.append( + f"4. **Calibration:** {winner}'s 80% interval covered {cov[winner]:.0f}% of outcomes " + f"(target 80%) over its {n_win} scored point(s). With this few, coverage this far from " + f"target is itself a small-sample artefact, not necessarily mis-calibration." + ) + + # 5. Sample-size caveat — the honest health warning. + caveat = ( + f"⚠️ **Smoke run:** only {n_origins} origin(s) / {n_points} scored points. Treat the ranking as a " + f"pipeline check, not evidence — rerun the full suite before drawing conclusions." + if smoke or n_origins <= 2 + else f"Based on {n_origins} origins / {n_points} scored points." + ) + lines.append(f"5. {caveat}") + return "\n".join(lines) + + +def build_price_frame(data_service: DataService, *, as_of: datetime | None = None) -> pd.DataFrame: + """Return the target price series as a ``price``-column DataFrame for plotting.""" + resolved_as_of = as_of or datetime.now(tz=timezone.utc).replace(tzinfo=None) + series = data_service.get_series("wti_crude_oil_price", as_of=resolved_as_of) + frame = pd.DataFrame( + {"price": series["value"].astype(float).to_numpy()}, + index=pd.to_datetime(series["timestamp"]), + ) + frame.index.name = "date" + return frame.sort_index() + + __all__ = [ "backtest_results_to_frame", + "build_price_frame", "compute_brier_score", + "eval_narrative_md", + "extract_agent_rationales", + "leaderboard_with_uncertainty", + "per_horizon_crps", + "predictions_to_frame", + "predictor_family", "rolling_coverage_pct", "score_backtest_results", "select_top_predictors", diff --git a/implementations/energy_oil_forecasting/data.py b/implementations/energy_oil_forecasting/data.py index 506944e6..0867fd85 100644 --- a/implementations/energy_oil_forecasting/data.py +++ b/implementations/energy_oil_forecasting/data.py @@ -5,15 +5,45 @@ :data:`WTI_SERIES_ID`. Both the reference YAML specs under ``implementations/energy_oil_forecasting/specs/`` and the notebooks here reference the same ``series_id`` via this module. + +:func:`build_wti_multivariate_service` additionally registers a **leak-safe +covariate panel** for the covariate-bearing predictors (e.g. +:class:`~aieng.forecasting.methods.numerical.darts_regression.DartsLightGBMPredictor` +with ``covariate_series_ids=...``). The panel is entirely sourced from Yahoo +Finance — no FRED API key required — and reuses the shared, point-in-time +feature builders in :mod:`aieng.forecasting.data.features`: + +- Brent (``BZ=F``), natural gas (``NG=F``), RBOB gasoline (``RB=F``) and gold + (``GC=F``) close-to-close log returns — the energy complex plus an inflation/ + risk hedge. +- Trade-weighted-style USD index (``DX-Y.NYB``) log return — oil is USD-priced. +- An **oil-futures-curve** contango proxy: ``log(USL / USO)`` level, where + ``USL`` tracks a 12-month WTI strip and ``USO`` the front month, so a positive + value is contango and a negative value backwardation — a clean term-structure + signal with no contract-roll assembly. +- VIX (``^VIX``) level — broad risk/volatility sentiment. + +Every covariate is lagged one business day and forward-filled onto a complete +business-day calendar; the :class:`DataService` cutoff then guarantees predictor +context views never include unavailable rows. """ from __future__ import annotations +import warnings from datetime import datetime, timezone from pathlib import Path +import pandas as pd from aieng.forecasting.data import DataService, SeriesMetadata from aieng.forecasting.data.adapters.yfinance import YFinanceDailyAdapter +from aieng.forecasting.data.features import ( + StaticFrameAdapter, + apply_one_business_day_feature_lag, + log_ratio_level_feature, + to_level_feature_from_daily, + to_log_return_feature, +) def naive_utc_now() -> datetime: @@ -80,9 +110,191 @@ def build_wti_service(cache_dir: Path | None = None) -> DataService: return svc +# ── Covariate panel (all Yahoo Finance) ────────────────────────────────────── +SERIES_ID_BRENT_RETURN = "brent_log_ret_1b_l1b" +SERIES_ID_NATGAS_RETURN = "natgas_log_ret_1b_l1b" +SERIES_ID_GASOLINE_RETURN = "gasoline_log_ret_1b_l1b" +SERIES_ID_GOLD_RETURN = "gold_log_ret_1b_l1b" +SERIES_ID_DOLLAR_INDEX_RETURN = "dollar_index_log_ret_1b_l1b" +SERIES_ID_OIL_CURVE_CONTANGO = "oil_curve_contango_l1b" +SERIES_ID_VIX_LEVEL = "vix_level_l1b" + +#: Default covariate panel for :func:`build_wti_multivariate_service`. Ordered +#: energy-complex first, then macro/risk. Any series that cannot be fetched is +#: skipped (with a warning) unless ``strict_covariates=True``. +DEFAULT_WTI_COVARIATE_SERIES_IDS: list[str] = [ + SERIES_ID_BRENT_RETURN, + SERIES_ID_NATGAS_RETURN, + SERIES_ID_GASOLINE_RETURN, + SERIES_ID_GOLD_RETURN, + SERIES_ID_DOLLAR_INDEX_RETURN, + SERIES_ID_OIL_CURVE_CONTANGO, + SERIES_ID_VIX_LEVEL, +] + +# Yahoo Finance tickers backing each covariate. +_BRENT_TICKER = "BZ=F" +_NATGAS_TICKER = "NG=F" +_GASOLINE_TICKER = "RB=F" +_GOLD_TICKER = "GC=F" +_DOLLAR_INDEX_TICKER = "DX-Y.NYB" +_VIX_TICKER = "^VIX" +_OIL_FRONT_ETF_TICKER = "USO" # United States Oil Fund — front-month WTI +_OIL_12M_ETF_TICKER = "USL" # United States 12 Month Oil Fund — 12-month strip + + +def _load_yahoo_close_frame( + ticker: str, + *, + cache_dir: Path, + start: str, +) -> pd.DataFrame: + """Fetch a daily adjusted-close ``(timestamp, value)`` frame from Yahoo Finance.""" + adapter = YFinanceDailyAdapter(ticker, field="Adj Close", start=start, cache_dir=cache_dir) + raw = adapter.fetch() + frame = raw[["timestamp", "value"]].copy().sort_values("timestamp").reset_index(drop=True) + frame["value"] = pd.to_numeric(frame["value"], errors="coerce") + return frame.dropna(subset=["value"]).reset_index(drop=True) + + +def build_wti_multivariate_service( + cache_dir: Path | None = None, + *, + covariate_series_ids: list[str] | None = None, + strict_covariates: bool = False, + start: str = _WTI_HISTORY_START, +) -> DataService: + """Return a :class:`DataService` with the WTI target **and** a covariate panel. + + Builds on :func:`build_wti_service` (so the ``wti_crude_oil_price`` target id + and every YAML spec keep working unchanged), then registers the leak-safe + covariate series described in the module docstring. Hand the result to the + backtest harness and point a covariate-bearing predictor at the registered + ids, e.g.:: + + svc = build_wti_multivariate_service() + covs = [c for c in DEFAULT_WTI_COVARIATE_SERIES_IDS if c in set(svc.series_ids)] + DartsLightGBMPredictor(lags=21, lags_past_covariates=21, covariate_series_ids=covs) + + Non-covariate predictors simply ignore the extra series, so a single service + can feed an entire leaderboard. + + Parameters + ---------- + cache_dir : Path or None + yfinance CSV cache directory (shared with the target). Defaults to + :data:`DEFAULT_CACHE_DIR`. + covariate_series_ids : list[str] or None + Subset of :data:`DEFAULT_WTI_COVARIATE_SERIES_IDS` to register. ``None`` + registers the full default panel. + strict_covariates : bool + If ``True``, any covariate fetch/build failure raises. If ``False`` + (default), unavailable covariates are skipped with a warning so the + service still builds offline / under partial connectivity. + start : str + Earliest date requested from Yahoo Finance for the covariates. + """ + resolved_cache_dir: Path = cache_dir if cache_dir is not None else DEFAULT_CACHE_DIR + svc = build_wti_service(cache_dir=resolved_cache_dir) + + desired = set(covariate_series_ids if covariate_series_ids is not None else DEFAULT_WTI_COVARIATE_SERIES_IDS) + + def _handle_error(series_id: str, exc: Exception) -> None: + if strict_covariates: + raise RuntimeError(f"Failed to build required covariate {series_id!r}.") from exc + warnings.warn(f"Skipping unavailable covariate {series_id!r}: {exc}", stacklevel=2) + + # ── Daily log-return covariates (energy complex + gold) ─────────────────── + _return_covariates = { + SERIES_ID_BRENT_RETURN: (_BRENT_TICKER, "Brent crude (BZ=F) close-to-close log return, lagged 1 business day"), + SERIES_ID_NATGAS_RETURN: (_NATGAS_TICKER, "Henry Hub natural gas (NG=F) log return, lagged 1 business day"), + SERIES_ID_GASOLINE_RETURN: (_GASOLINE_TICKER, "RBOB gasoline (RB=F) log return, lagged 1 business day"), + SERIES_ID_GOLD_RETURN: (_GOLD_TICKER, "Gold (GC=F) log return, lagged 1 business day"), + SERIES_ID_DOLLAR_INDEX_RETURN: ( + _DOLLAR_INDEX_TICKER, + "US Dollar Index (DX-Y.NYB) log return, lagged 1 business day", + ), + } + for series_id, (ticker, description) in _return_covariates.items(): + if series_id not in desired: + continue + try: + close = _load_yahoo_close_frame(ticker, cache_dir=resolved_cache_dir, start=start) + feature = apply_one_business_day_feature_lag(to_log_return_feature(close)) + svc.register( + series_id, + StaticFrameAdapter(feature), + SeriesMetadata( + series_id=series_id, + description=description, + source=f"Yahoo Finance ({ticker}), derived", + units="log-return", + frequency="B", + table_id=f"yahoo:{ticker}:log-return-l1b", + ), + ) + except (RuntimeError, ValueError, KeyError) as exc: + _handle_error(series_id, exc) + + # ── Oil-futures-curve contango proxy: log(USL / USO) ────────────────────── + if SERIES_ID_OIL_CURVE_CONTANGO in desired: + try: + usl = _load_yahoo_close_frame(_OIL_12M_ETF_TICKER, cache_dir=resolved_cache_dir, start=start) + uso = _load_yahoo_close_frame(_OIL_FRONT_ETF_TICKER, cache_dir=resolved_cache_dir, start=start) + curve = log_ratio_level_feature(usl, uso) + svc.register( + SERIES_ID_OIL_CURVE_CONTANGO, + StaticFrameAdapter(curve), + SeriesMetadata( + series_id=SERIES_ID_OIL_CURVE_CONTANGO, + description=( + "WTI futures-curve shape: log(USL/USO) level (>0 contango, <0 backwardation), " + "lagged 1 business day" + ), + source="Yahoo Finance (USL, USO), derived", + units="log-ratio", + frequency="B", + table_id="yahoo:USL-USO:log-ratio-l1b", + ), + ) + except (RuntimeError, ValueError, KeyError) as exc: + _handle_error(SERIES_ID_OIL_CURVE_CONTANGO, exc) + + # ── VIX level ───────────────────────────────────────────────────────────── + if SERIES_ID_VIX_LEVEL in desired: + try: + vix_close = _load_yahoo_close_frame(_VIX_TICKER, cache_dir=resolved_cache_dir, start=start) + vix_level = apply_one_business_day_feature_lag(to_level_feature_from_daily(vix_close)) + svc.register( + SERIES_ID_VIX_LEVEL, + StaticFrameAdapter(vix_level), + SeriesMetadata( + series_id=SERIES_ID_VIX_LEVEL, + description="CBOE VIX close level, lagged 1 business day", + source=f"Yahoo Finance ({_VIX_TICKER})", + units="index-level", + frequency="B", + table_id="yahoo:^VIX:close-l1b", + ), + ) + except (RuntimeError, ValueError, KeyError) as exc: + _handle_error(SERIES_ID_VIX_LEVEL, exc) + + return svc + + __all__ = [ "DEFAULT_CACHE_DIR", + "DEFAULT_WTI_COVARIATE_SERIES_IDS", + "SERIES_ID_BRENT_RETURN", + "SERIES_ID_DOLLAR_INDEX_RETURN", + "SERIES_ID_GASOLINE_RETURN", + "SERIES_ID_GOLD_RETURN", + "SERIES_ID_NATGAS_RETURN", + "SERIES_ID_OIL_CURVE_CONTANGO", + "SERIES_ID_VIX_LEVEL", "WTI_SERIES_ID", + "build_wti_multivariate_service", "build_wti_service", "naive_utc_now", ] diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..a0acf75e --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous__wti_oil_price_forecast.yaml @@ -0,0 +1,165 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2026-02-02T00:00:00' + end: '2026-02-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: Two-origin smoke evaluation for local and CI testing of the NB04 pipeline. + Uses the same tasks, horizons, warmup, and geopolitical period as energy_oil_eval + but with only 2 origins to keep cost negligible. +predictor_id: agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous +predictions: +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:49:25.917497' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-02-09T00:00:00' + payload: + point_forecast: 65.15 + quantiles: + '0.05': 62.5 + '0.1': 63.2 + '0.2': 64.0 + '0.3': 64.6 + '0.4': 64.9 + '0.5': 65.15 + '0.6': 65.4 + '0.7': 65.8 + '0.8': 66.3 + '0.9': 67.2 + '0.95': 67.8 + metadata: + rationale: 'The outlook as of February 2026 is defined by a tense balance: current + prices near $65 are supported by geopolitical risk premiums (Middle East, Ukraine), + but these are countered by structural market concerns regarding global oversupply + and muted demand. OPEC+ is maintaining production limits to stabilize prices, + which provides a floor. My forecast reflects a consolidation in the short term, + with a potential for mild downward mean-reversion over the 21-day horizon as + market participants look past transitory geopolitical news toward structural + realities.' + horizon_rationale: Over the next 5 days, prices are expected to consolidate near + the $65.21 close. Short-term support remains from geopolitical risk premiums, + though the market is balancing these against global oversupply expectations. + langfuse_trace_id: 904ac4d35927a97e4fc1c78fc98c37dd + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/904ac4d35927a97e4fc1c78fc98c37dd +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:49:25.917497' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-03-03T00:00:00' + payload: + point_forecast: 64.0 + quantiles: + '0.05': 59.0 + '0.1': 60.5 + '0.2': 61.8 + '0.3': 62.8 + '0.4': 63.5 + '0.5': 64.0 + '0.6': 64.6 + '0.7': 65.5 + '0.8': 66.8 + '0.9': 68.5 + '0.95': 69.8 + metadata: + rationale: 'The outlook as of February 2026 is defined by a tense balance: current + prices near $65 are supported by geopolitical risk premiums (Middle East, Ukraine), + but these are countered by structural market concerns regarding global oversupply + and muted demand. OPEC+ is maintaining production limits to stabilize prices, + which provides a floor. My forecast reflects a consolidation in the short term, + with a potential for mild downward mean-reversion over the 21-day horizon as + market participants look past transitory geopolitical news toward structural + realities.' + horizon_rationale: Looking 21 days out, we anticipate a gradual shift towards + fundamentals. Without significant supply-side shocks, structural oversupply + concerns are expected to exert downward pressure on prices, tempered by OPEC+'s + production management. + langfuse_trace_id: 904ac4d35927a97e4fc1c78fc98c37dd + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/904ac4d35927a97e4fc1c78fc98c37dd +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:49:34.873507' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-02-23T00:00:00' + payload: + point_forecast: 65.0 + quantiles: + '0.05': 59.5 + '0.1': 60.5 + '0.2': 62.0 + '0.3': 63.2 + '0.4': 64.2 + '0.5': 65.0 + '0.6': 65.8 + '0.7': 66.9 + '0.8': 68.1 + '0.9': 69.5 + '0.95': 70.5 + metadata: + rationale: The WTI forecast is driven primarily by the acute geopolitical risk + premium stemming from US-Iran tensions in early February 2026. Fundamental support + remains via OPEC+ production restraint and seasonal supply constraints (winter + weather). Forecasts assume no imminent resolution to the Strait of Hormuz situation, + leading to a biased upside until mid-to-late February, at which point potential + de-escalation or seasonal demand shifts begin to introduce a two-way risk profile. + horizon_rationale: Over 10 days, the market continues to price in geopolitical + uncertainty. Unless a major de-escalation occurs in the Strait of Hormuz, the + supply risk premium is expected to sustain current levels or push slightly higher + as physical market tightness persists through the end of the winter season. + langfuse_trace_id: 898cbbe15c0c32a15d096873986f59aa + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/898cbbe15c0c32a15d096873986f59aa +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:49:34.873507' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-03-10T00:00:00' + payload: + point_forecast: 64.8 + quantiles: + '0.05': 57.5 + '0.1': 59.0 + '0.2': 60.5 + '0.3': 62.2 + '0.4': 63.8 + '0.5': 64.8 + '0.6': 66.0 + '0.7': 67.5 + '0.8': 69.2 + '0.9': 71.0 + '0.95': 72.5 + metadata: + rationale: The WTI forecast is driven primarily by the acute geopolitical risk + premium stemming from US-Iran tensions in early February 2026. Fundamental support + remains via OPEC+ production restraint and seasonal supply constraints (winter + weather). Forecasts assume no imminent resolution to the Strait of Hormuz situation, + leading to a biased upside until mid-to-late February, at which point potential + de-escalation or seasonal demand shifts begin to introduce a two-way risk profile. + horizon_rationale: By 21 days, we begin to account for the possibility of either + a diplomatic resolution or a market realization of the long-term surplus risks + as winter concludes. The point forecast leans slightly lower than the 10-day + outlook to reflect typical mean reversion, but the wider distribution accounts + for the binary nature of the ongoing geopolitical risk. + langfuse_trace_id: 898cbbe15c0c32a15d096873986f59aa + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/898cbbe15c0c32a15d096873986f59aa +scores: +- 0.5582641853773893 +- 8.528592599916067 +- 1.1109910696991219 +- 15.86487298130004 +metric: crps +mean_score: 6.515680209073155 +ran_at: '2026-06-30T15:49:35.119918' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..a83cfe99 --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous__wti_oil_price_forecast.yaml @@ -0,0 +1,173 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2026-02-02T00:00:00' + end: '2026-02-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: Two-origin smoke evaluation for local and CI testing of the NB04 pipeline. + Uses the same tasks, horizons, warmup, and geopolitical period as energy_oil_eval + but with only 2 origins to keep cost negligible. +predictor_id: agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous +predictions: +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:51:00.265236' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-02-09T00:00:00' + payload: + point_forecast: 64.85 + quantiles: + '0.05': 60.5 + '0.1': 61.5 + '0.2': 62.75 + '0.3': 63.6 + '0.4': 64.25 + '0.5': 64.85 + '0.6': 65.45 + '0.7': 66.15 + '0.8': 67.1 + '0.9': 68.5 + '0.95': 69.8 + metadata: + rationale: This forecast balances a heightened geopolitical risk premium (US-Iran + tensions over nuclear negotiations and the threat to the Strait of Hormuz) with + a medium-term structural surplus. OPEC+'s decision to extend its voluntary output + freeze through Q1 2026 establishes a firm price floor, while the US Strategic + Petroleum Reserve (holding ~415 million barrels) continues to provide a buffer + against extreme supply shocks. We expect volatile, gradual mean-reversion over + the next month as the immediate geopolitical premium consolidates. + horizon_rationale: Over the next 5 business days, WTI crude is expected to consolidate + slightly below its recent peak of $65.21. The market is digesting a steep geopolitical + risk premium driven by US-Iran tensions and potential shipping disruptions in + the Persian Gulf. In the absence of immediate escalation, a minor cooling off + is likely, with prices firmly supported by OPEC+'s production freeze through + Q1 2026. + langfuse_trace_id: b254c9974099f6c21c5bb841d5650fa0 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/b254c9974099f6c21c5bb841d5650fa0 +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:51:00.265236' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-03-03T00:00:00' + payload: + point_forecast: 63.5 + quantiles: + '0.05': 57.0 + '0.1': 58.5 + '0.2': 60.2 + '0.3': 61.5 + '0.4': 62.55 + '0.5': 63.5 + '0.6': 64.6 + '0.7': 66.0 + '0.8': 67.85 + '0.9': 70.8 + '0.95': 73.5 + metadata: + rationale: This forecast balances a heightened geopolitical risk premium (US-Iran + tensions over nuclear negotiations and the threat to the Strait of Hormuz) with + a medium-term structural surplus. OPEC+'s decision to extend its voluntary output + freeze through Q1 2026 establishes a firm price floor, while the US Strategic + Petroleum Reserve (holding ~415 million barrels) continues to provide a buffer + against extreme supply shocks. We expect volatile, gradual mean-reversion over + the next month as the immediate geopolitical premium consolidates. + horizon_rationale: At the 21-business-day horizon, the distribution widens considerably + due to binary outcomes in the Middle East. If diplomatic options progress, prices + should return closer to the fundamental baseline of $58-$62, supported by the + OPEC+ floor. However, a worst-case escalation involving shipping blockades keeps + the 95th percentile elevated at $73.50, near the 52-week high of $75.14. + langfuse_trace_id: b254c9974099f6c21c5bb841d5650fa0 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/b254c9974099f6c21c5bb841d5650fa0 +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:52:01.310927' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-02-23T00:00:00' + payload: + point_forecast: 63.25 + quantiles: + '0.05': 57.8 + '0.1': 59.0 + '0.2': 60.4 + '0.3': 61.5 + '0.4': 62.4 + '0.5': 63.25 + '0.6': 64.1 + '0.7': 65.1 + '0.8': 66.4 + '0.9': 68.0 + '0.95': 69.5 + metadata: + rationale: As of February 9, 2026, WTI crude oil is trading around $63.55. Short-term + fundamentals are balanced by OPEC+ extending voluntary supply cuts through March + 2026 and elevated geopolitical risks in the Middle East, particularly around + the Strait of Hormuz. However, the medium-term outlook is dominated by projections + of global surplus and rising non-OPEC production, which is expected to press + prices lower later in 2026. This forecast models a short-term holding pattern + with a slight downward drift, featuring widened uncertainty and a positive skew + to capture the potential of geopolitical supply shocks. + horizon_rationale: At 10 business days, the forecast models a minor drift lower + as some winter premium begins to ease. Fundamentals remain tight due to active + supply discipline, but macro expectations of an oversupplied global market later + in the year exert light downward pressure. The distribution is widened to reflect + rising uncertainty, keeping a positive skew for Middle East supply risks. + langfuse_trace_id: 6866c9e74458d2bbf6e171dfcc35b2ce + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/6866c9e74458d2bbf6e171dfcc35b2ce +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:52:01.310927' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-03-10T00:00:00' + payload: + point_forecast: 62.5 + quantiles: + '0.05': 54.8 + '0.1': 56.2 + '0.2': 58.2 + '0.3': 59.8 + '0.4': 61.2 + '0.5': 62.5 + '0.6': 63.8 + '0.7': 65.2 + '0.8': 67.0 + '0.9': 69.5 + '0.95': 71.5 + metadata: + rationale: As of February 9, 2026, WTI crude oil is trading around $63.55. Short-term + fundamentals are balanced by OPEC+ extending voluntary supply cuts through March + 2026 and elevated geopolitical risks in the Middle East, particularly around + the Strait of Hormuz. However, the medium-term outlook is dominated by projections + of global surplus and rising non-OPEC production, which is expected to press + prices lower later in 2026. This forecast models a short-term holding pattern + with a slight downward drift, featuring widened uncertainty and a positive skew + to capture the potential of geopolitical supply shocks. + horizon_rationale: 'At 21 business days, the transition toward the shoulder season + and structural oversupply projections become more pronounced, pulling the median + down to $62.50. The tail risk is highly asymmetric: the 0.05 quantile extends + to $54.80 (near the 52-week low) representing a complete deflation of geopolitical + risk, whereas the 0.95 quantile expands to $71.50 representing potential shipping + escalations in the Persian Gulf.' + langfuse_trace_id: 6866c9e74458d2bbf6e171dfcc35b2ce + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/6866c9e74458d2bbf6e171dfcc35b2ce +scores: +- 0.7114875478192788 +- 7.639336401568961 +- 1.8024782291128638 +- 17.832641576341363 +metric: crps +mean_score: 6.996485938710617 +ran_at: '2026-06-30T15:52:01.949232' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/darts_autoarima__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/darts_autoarima__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..1de98229 --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/darts_autoarima__wti_oil_price_forecast.yaml @@ -0,0 +1,113 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2026-02-02T00:00:00' + end: '2026-02-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: Two-origin smoke evaluation for local and CI testing of the NB04 pipeline. + Uses the same tasks, horizons, warmup, and geopolitical period as energy_oil_eval + but with only 2 origins to keep cost negligible. +predictor_id: darts_autoarima +predictions: +- predictor_id: darts_autoarima + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:32:11.916081' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-02-09T00:00:00' + payload: + point_forecast: 65.07136800380499 + quantiles: + '0.05': 58.797174105456534 + '0.1': 60.11462365602569 + '0.2': 61.37496156012212 + '0.3': 62.963675461101865 + '0.4': 64.1902562210592 + '0.5': 65.07136800380499 + '0.6': 66.46743929627642 + '0.7': 67.66464442987579 + '0.8': 69.05594468514728 + '0.9': 70.89358875594438 + '0.95': 72.11149735315365 + metadata: {} +- predictor_id: darts_autoarima + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:32:11.916081' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-03-03T00:00:00' + payload: + point_forecast: 65.16285504097243 + quantiles: + '0.05': 51.7965290001933 + '0.1': 54.375629366857325 + '0.2': 57.52995983398566 + '0.3': 60.062824307977145 + '0.4': 62.528343394997634 + '0.5': 65.16285504097243 + '0.6': 67.45717790990545 + '0.7': 69.30762773034954 + '0.8': 71.71586971847763 + '0.9': 75.96865414217129 + '0.95': 78.9881069292733 + metadata: {} +- predictor_id: darts_autoarima + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:32:12.046040' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-02-23T00:00:00' + payload: + point_forecast: 63.43404580106082 + quantiles: + '0.05': 53.81294867290008 + '0.1': 55.26276990213642 + '0.2': 58.318051369418235 + '0.3': 59.94318556582174 + '0.4': 61.68024111677579 + '0.5': 63.43404580106082 + '0.6': 64.77132791077243 + '0.7': 66.55765340589242 + '0.8': 68.40402176143542 + '0.9': 71.50735968643339 + '0.95': 74.60516614966643 + metadata: {} +- predictor_id: darts_autoarima + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:32:12.046040' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-03-10T00:00:00' + payload: + point_forecast: 64.08987021958572 + quantiles: + '0.05': 49.49720642283701 + '0.1': 52.477046819521654 + '0.2': 57.20806089044172 + '0.3': 59.88967079962584 + '0.4': 61.9039475031646 + '0.5': 64.08987021958572 + '0.6': 65.94760378271529 + '0.7': 68.1679744374726 + '0.8': 71.35384629522409 + '0.9': 75.03566659103457 + '0.95': 78.65209655073475 + metadata: {} +scores: +- 1.2006826938755304 +- 5.865511445761681 +- 2.1451495570342067 +- 14.486806928190955 +metric: crps +mean_score: 5.924537656215593 +ran_at: '2026-06-30T15:32:12.073707' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/darts_lightgbm__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/darts_lightgbm__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..d0014252 --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/darts_lightgbm__wti_oil_price_forecast.yaml @@ -0,0 +1,117 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2026-02-02T00:00:00' + end: '2026-02-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: Two-origin smoke evaluation for local and CI testing of the NB04 pipeline. + Uses the same tasks, horizons, warmup, and geopolitical period as energy_oil_eval + but with only 2 origins to keep cost negligible. +predictor_id: darts_lightgbm +predictions: +- predictor_id: darts_lightgbm + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:33:06.214144' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-02-09T00:00:00' + payload: + point_forecast: 64.76568687823989 + quantiles: + '0.05': 60.84392403933198 + '0.1': 61.81533512634376 + '0.2': 63.352327546193806 + '0.3': 64.04129642812634 + '0.4': 64.24995086947993 + '0.5': 64.76568687823989 + '0.6': 65.89596029244404 + '0.7': 66.49182273964928 + '0.8': 66.63398437730147 + '0.9': 67.02672685849018 + '0.95': 69.56803662793878 + metadata: + covariates: [] +- predictor_id: darts_lightgbm + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:33:06.214144' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-03-03T00:00:00' + payload: + point_forecast: 63.467345588357745 + quantiles: + '0.05': 54.90113898621829 + '0.1': 57.86913732906137 + '0.2': 60.01901317853187 + '0.3': 61.39111292598963 + '0.4': 63.01347415848281 + '0.5': 63.467345588357745 + '0.6': 64.56707726643522 + '0.7': 65.63160813260566 + '0.8': 66.68654622475938 + '0.9': 67.70418263051616 + '0.95': 68.6870726932708 + metadata: + covariates: [] +- predictor_id: darts_lightgbm + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:34:00.205019' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-02-23T00:00:00' + payload: + point_forecast: 64.63120580033292 + quantiles: + '0.05': 61.05488968272766 + '0.1': 62.0766206175301 + '0.2': 63.12497240939181 + '0.3': 63.304619275429175 + '0.4': 63.72136135679804 + '0.5': 64.63120580033292 + '0.6': 65.7040310684979 + '0.7': 66.6531188956387 + '0.8': 66.94770673443338 + '0.9': 67.91875450929773 + '0.95': 70.03511979612037 + metadata: + covariates: [] +- predictor_id: darts_lightgbm + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:34:00.205019' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-03-10T00:00:00' + payload: + point_forecast: 64.19624563453763 + quantiles: + '0.05': 54.77980181036809 + '0.1': 56.11243804464155 + '0.2': 58.6064042308586 + '0.3': 61.60335902174599 + '0.4': 62.97965158184566 + '0.5': 64.19624563453763 + '0.6': 64.80503256539654 + '0.7': 65.07698985802631 + '0.8': 66.37336401839512 + '0.9': 67.91590877484616 + '0.95': 68.80346864371634 + metadata: + covariates: [] +scores: +- 0.6379908254106903 +- 9.188684458937422 +- 0.9810066139144353 +- 18.139329309889135 +metric: crps +mean_score: 7.236752802037921 +ran_at: '2026-06-30T15:34:00.261669' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/darts_lightgbm_cov__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/darts_lightgbm_cov__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..89062657 --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/darts_lightgbm_cov__wti_oil_price_forecast.yaml @@ -0,0 +1,145 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2026-02-02T00:00:00' + end: '2026-02-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: Two-origin smoke evaluation for local and CI testing of the NB04 pipeline. + Uses the same tasks, horizons, warmup, and geopolitical period as energy_oil_eval + but with only 2 origins to keep cost negligible. +predictor_id: darts_lightgbm_cov +predictions: +- predictor_id: darts_lightgbm_cov + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:40:56.157283' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-02-09T00:00:00' + payload: + point_forecast: 66.07957241720351 + quantiles: + '0.05': 60.0173194449053 + '0.1': 60.4629385612392 + '0.2': 61.31633219034492 + '0.3': 63.711685407527625 + '0.4': 65.43580203812787 + '0.5': 66.07957241720351 + '0.6': 66.26586327146859 + '0.7': 66.44651019807132 + '0.8': 67.07570900198985 + '0.9': 69.14793282754846 + '0.95': 69.34970882379892 + metadata: + covariates: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b +- predictor_id: darts_lightgbm_cov + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:40:56.157283' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-03-03T00:00:00' + payload: + point_forecast: 63.01685468367295 + quantiles: + '0.05': 57.31181334798144 + '0.1': 58.26279579622876 + '0.2': 59.715751480011974 + '0.3': 59.94504232101684 + '0.4': 62.64861855583356 + '0.5': 63.01685468367295 + '0.6': 63.226690418193215 + '0.7': 63.818243320726786 + '0.8': 64.30737353082291 + '0.9': 66.29765672721655 + '0.95': 67.13798149829157 + metadata: + covariates: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b +- predictor_id: darts_lightgbm_cov + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:47:57.721981' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-02-23T00:00:00' + payload: + point_forecast: 62.21862069611715 + quantiles: + '0.05': 57.280870278617975 + '0.1': 57.617294572242024 + '0.2': 60.28645871259008 + '0.3': 61.470190560484106 + '0.4': 62.01313480082026 + '0.5': 62.21862069611715 + '0.6': 62.77054261574582 + '0.7': 63.15290822422086 + '0.8': 64.97574552254532 + '0.9': 66.98744091048529 + '0.95': 70.73434905620884 + metadata: + covariates: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b +- predictor_id: darts_lightgbm_cov + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:47:57.721981' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-03-10T00:00:00' + payload: + point_forecast: 61.95720848434621 + quantiles: + '0.05': 57.02185994948587 + '0.1': 59.41083493311882 + '0.2': 60.668093585451444 + '0.3': 61.04752207823036 + '0.4': 61.427373763159544 + '0.5': 61.95720848434621 + '0.6': 63.0724775156559 + '0.7': 63.87083374801613 + '0.8': 65.43382593477891 + '0.9': 68.51532331060275 + '0.95': 69.73690763082953 + metadata: + covariates: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b +scores: +- 1.10232646410222 +- 10.516061298598789 +- 2.5230471917500026 +- 18.516533292177407 +metric: crps +mean_score: 8.164492061657104 +ran_at: '2026-06-30T15:47:57.790081' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/llmp_quantile_grid[gemini-3.5-flash]__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/llmp_quantile_grid[gemini-3.5-flash]__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..5ca6813d --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/llmp_quantile_grid[gemini-3.5-flash]__wti_oil_price_forecast.yaml @@ -0,0 +1,153 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2026-02-02T00:00:00' + end: '2026-02-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: Two-origin smoke evaluation for local and CI testing of the NB04 pipeline. + Uses the same tasks, horizons, warmup, and geopolitical period as energy_oil_eval + but with only 2 origins to keep cost negligible. +predictor_id: llmp_quantile_grid[gemini-3.5-flash] +predictions: +- predictor_id: llmp_quantile_grid[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:49:02.830630' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-02-09T00:00:00' + payload: + point_forecast: 64.51 + quantiles: + '0.05': 59.95 + '0.1': 61.35 + '0.2': 62.53 + '0.3': 63.33 + '0.4': 63.94 + '0.5': 64.51 + '0.6': 65.08 + '0.7': 65.73 + '0.8': 66.54 + '0.9': 67.68 + '0.95': 68.79 + metadata: + model: gemini-3.5-flash + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 100760 + output_tokens: 3353 + parse_failures: 0 + langfuse_trace_id: 99464e0d5465133ef20de678371bdaac + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/99464e0d5465133ef20de678371bdaac +- predictor_id: llmp_quantile_grid[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:49:02.830630' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-03-03T00:00:00' + payload: + point_forecast: 62.02 + quantiles: + '0.05': 53.64 + '0.1': 56.39 + '0.2': 58.53 + '0.3': 60.01 + '0.4': 61.07 + '0.5': 62.02 + '0.6': 62.99 + '0.7': 64.15 + '0.8': 65.76 + '0.9': 68.02 + '0.95': 70.33 + metadata: + model: gemini-3.5-flash + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 100760 + output_tokens: 3353 + parse_failures: 0 + langfuse_trace_id: 99464e0d5465133ef20de678371bdaac + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/99464e0d5465133ef20de678371bdaac +- predictor_id: llmp_quantile_grid[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:49:16.588321' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-02-23T00:00:00' + payload: + point_forecast: 62.1 + quantiles: + '0.05': 56.1 + '0.1': 57.5 + '0.2': 59.1 + '0.3': 60.3 + '0.4': 61.2 + '0.5': 62.1 + '0.6': 63.0 + '0.7': 64.0 + '0.8': 65.3 + '0.9': 67.3 + '0.95': 68.9 + metadata: + model: gemini-3.5-flash + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 100850 + output_tokens: 2546 + parse_failures: 0 + langfuse_trace_id: fa9ee85fb5e2fed4296acf60c0fbc591 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/fa9ee85fb5e2fed4296acf60c0fbc591 +- predictor_id: llmp_quantile_grid[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:49:16.588321' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-03-10T00:00:00' + payload: + point_forecast: 60.8 + quantiles: + '0.05': 52.6 + '0.1': 54.3 + '0.2': 56.6 + '0.3': 58.2 + '0.4': 59.6 + '0.5': 60.8 + '0.6': 61.9 + '0.7': 63.3 + '0.8': 65.1 + '0.9': 68.2 + '0.95': 70.8 + metadata: + model: gemini-3.5-flash + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 100850 + output_tokens: 2546 + parse_failures: 0 + langfuse_trace_id: fa9ee85fb5e2fed4296acf60c0fbc591 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/fa9ee85fb5e2fed4296acf60c0fbc591 +scores: +- 0.6329751511250655 +- 9.801898385040031 +- 2.541072826543131 +- 19.362393642457068 +metric: crps +mean_score: 8.084585001291323 +ran_at: '2026-06-30T15:49:16.980080' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/llmp_sampled_trajectories[gemini-3.5-flash]__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/llmp_sampled_trajectories[gemini-3.5-flash]__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..47b3ec93 --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/llmp_sampled_trajectories[gemini-3.5-flash]__wti_oil_price_forecast.yaml @@ -0,0 +1,157 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2026-02-02T00:00:00' + end: '2026-02-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: Two-origin smoke evaluation for local and CI testing of the NB04 pipeline. + Uses the same tasks, horizons, warmup, and geopolitical period as energy_oil_eval + but with only 2 origins to keep cost negligible. +predictor_id: llmp_sampled_trajectories[gemini-3.5-flash] +predictions: +- predictor_id: llmp_sampled_trajectories[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:48:01.053699' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-02-09T00:00:00' + payload: + point_forecast: 63.92 + quantiles: + '0.05': 63.92 + '0.1': 63.92 + '0.2': 63.92 + '0.3': 63.92 + '0.4': 63.92 + '0.5': 63.92 + '0.6': 63.92 + '0.7': 63.92 + '0.8': 63.92 + '0.9': 63.92 + '0.95': 63.92 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 100726 + output_tokens: 127 + parse_failures: 0 + langfuse_trace_id: e2da376c1300f3cd563a9a3de2253abb + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/e2da376c1300f3cd563a9a3de2253abb +- predictor_id: llmp_sampled_trajectories[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:48:01.053699' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-03-03T00:00:00' + payload: + point_forecast: 60.15 + quantiles: + '0.05': 60.15 + '0.1': 60.15 + '0.2': 60.15 + '0.3': 60.15 + '0.4': 60.15 + '0.5': 60.15 + '0.6': 60.15 + '0.7': 60.15 + '0.8': 60.15 + '0.9': 60.15 + '0.95': 60.15 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 100726 + output_tokens: 127 + parse_failures: 0 + langfuse_trace_id: e2da376c1300f3cd563a9a3de2253abb + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/e2da376c1300f3cd563a9a3de2253abb +- predictor_id: llmp_sampled_trajectories[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:48:03.657436' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-02-23T00:00:00' + payload: + point_forecast: 66.12 + quantiles: + '0.05': 66.12 + '0.1': 66.12 + '0.2': 66.12 + '0.3': 66.12 + '0.4': 66.12 + '0.5': 66.12 + '0.6': 66.12 + '0.7': 66.12 + '0.8': 66.12 + '0.9': 66.12 + '0.95': 66.12 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 100816 + output_tokens: 129 + parse_failures: 0 + langfuse_trace_id: 45ab7cc2e96631c13f5dd41c6693600a + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/45ab7cc2e96631c13f5dd41c6693600a +- predictor_id: llmp_sampled_trajectories[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:48:03.657436' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-03-10T00:00:00' + payload: + point_forecast: 68.1 + quantiles: + '0.05': 68.1 + '0.1': 68.1 + '0.2': 68.1 + '0.3': 68.1 + '0.4': 68.1 + '0.5': 68.1 + '0.6': 68.1 + '0.7': 68.1 + '0.8': 68.1 + '0.9': 68.1 + '0.95': 68.1 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 100816 + output_tokens: 129 + parse_failures: 0 + langfuse_trace_id: 45ab7cc2e96631c13f5dd41c6693600a + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/45ab7cc2e96631c13f5dd41c6693600a +scores: +- 0.4400006103515608 +- 14.409997558593751 +- 0.18999755859374545 +- 15.349996948242193 +metric: crps +mean_score: 7.597498168945313 +ran_at: '2026-06-30T15:48:03.907590' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview]__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview]__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..4ea5ac7d --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview]__wti_oil_price_forecast.yaml @@ -0,0 +1,193 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2026-02-02T00:00:00' + end: '2026-02-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: Two-origin smoke evaluation for local and CI testing of the NB04 pipeline. + Uses the same tasks, horizons, warmup, and geopolitical period as energy_oil_eval + but with only 2 origins to keep cost negligible. +predictor_id: llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview] +predictions: +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:48:12.088518' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-02-09T00:00:00' + payload: + point_forecast: 66.01 + quantiles: + '0.05': 66.01 + '0.1': 66.01 + '0.2': 66.01 + '0.3': 66.01 + '0.4': 66.01 + '0.5': 66.01 + '0.6': 66.01 + '0.7': 66.01 + '0.8': 66.01 + '0.9': 66.01 + '0.95': 66.01 + metadata: + model: gemini-3.1-flash-lite-preview + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 737447 + output_tokens: 179 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: 2b2758f77a1ce83ae83ecbbd1733e37b + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/2b2758f77a1ce83ae83ecbbd1733e37b +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:48:12.088518' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-03-03T00:00:00' + payload: + point_forecast: 68.42 + quantiles: + '0.05': 68.42 + '0.1': 68.42 + '0.2': 68.42 + '0.3': 68.42 + '0.4': 68.42 + '0.5': 68.42 + '0.6': 68.42 + '0.7': 68.42 + '0.8': 68.42 + '0.9': 68.42 + '0.95': 68.42 + metadata: + model: gemini-3.1-flash-lite-preview + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 737447 + output_tokens: 179 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: 2b2758f77a1ce83ae83ecbbd1733e37b + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/2b2758f77a1ce83ae83ecbbd1733e37b +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:48:25.373984' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-02-23T00:00:00' + payload: + point_forecast: 63.42 + quantiles: + '0.05': 63.42 + '0.1': 63.42 + '0.2': 63.42 + '0.3': 63.42 + '0.4': 63.42 + '0.5': 63.42 + '0.6': 63.42 + '0.7': 63.42 + '0.8': 63.42 + '0.9': 63.42 + '0.95': 63.42 + metadata: + model: gemini-3.1-flash-lite-preview + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 738137 + output_tokens: 150 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: b43c4f75bc793993673a78fb0eed16f4 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/b43c4f75bc793993673a78fb0eed16f4 +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:48:25.373984' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-03-10T00:00:00' + payload: + point_forecast: 65.05 + quantiles: + '0.05': 65.05 + '0.1': 65.05 + '0.2': 65.05 + '0.3': 65.05 + '0.4': 65.05 + '0.5': 65.05 + '0.6': 65.05 + '0.7': 65.05 + '0.8': 65.05 + '0.9': 65.05 + '0.95': 65.05 + metadata: + model: gemini-3.1-flash-lite-preview + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 738137 + output_tokens: 150 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: b43c4f75bc793993673a78fb0eed16f4 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/b43c4f75bc793993673a78fb0eed16f4 +scores: +- 1.6499993896484426 +- 6.139997558593748 +- 2.8899975585937483 +- 18.39999694824219 +metric: crps +mean_score: 7.269997863769532 +ran_at: '2026-06-30T15:48:25.757701' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/llmp_sampled_trajectories_cov[gemini-3.5-flash]__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/llmp_sampled_trajectories_cov[gemini-3.5-flash]__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..6e20789f --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_eval_smoke/llmp_sampled_trajectories_cov[gemini-3.5-flash]__wti_oil_price_forecast.yaml @@ -0,0 +1,193 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2026-02-02T00:00:00' + end: '2026-02-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: Two-origin smoke evaluation for local and CI testing of the NB04 pipeline. + Uses the same tasks, horizons, warmup, and geopolitical period as energy_oil_eval + but with only 2 origins to keep cost negligible. +predictor_id: llmp_sampled_trajectories_cov[gemini-3.5-flash] +predictions: +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:48:33.301748' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-02-09T00:00:00' + payload: + point_forecast: 61.95 + quantiles: + '0.05': 61.95 + '0.1': 61.95 + '0.2': 61.95 + '0.3': 61.95 + '0.4': 61.95 + '0.5': 61.95 + '0.6': 61.95 + '0.7': 61.95 + '0.8': 61.95 + '0.9': 61.95 + '0.95': 61.95 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 737447 + output_tokens: 150 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: 7b6ad61faaeacc51d38bca9265139aa0 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/7b6ad61faaeacc51d38bca9265139aa0 +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:48:33.301748' + as_of: '2026-02-02T00:00:00' + forecast_date: '2026-03-03T00:00:00' + payload: + point_forecast: 59.2 + quantiles: + '0.05': 59.2 + '0.1': 59.2 + '0.2': 59.2 + '0.3': 59.2 + '0.4': 59.2 + '0.5': 59.2 + '0.6': 59.2 + '0.7': 59.2 + '0.8': 59.2 + '0.9': 59.2 + '0.95': 59.2 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 737447 + output_tokens: 150 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: 7b6ad61faaeacc51d38bca9265139aa0 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/7b6ad61faaeacc51d38bca9265139aa0 +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:48:44.374880' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-02-23T00:00:00' + payload: + point_forecast: 62.2 + quantiles: + '0.05': 62.2 + '0.1': 62.2 + '0.2': 62.2 + '0.3': 62.2 + '0.4': 62.2 + '0.5': 62.2 + '0.6': 62.2 + '0.7': 62.2 + '0.8': 62.2 + '0.9': 62.2 + '0.95': 62.2 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 738137 + output_tokens: 179 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: 28d117b662157dd09926dc73753d7d19 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/28d117b662157dd09926dc73753d7d19 +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:48:44.374880' + as_of: '2026-02-09T00:00:00' + forecast_date: '2026-03-10T00:00:00' + payload: + point_forecast: 65.25 + quantiles: + '0.05': 65.25 + '0.1': 65.25 + '0.2': 65.25 + '0.3': 65.25 + '0.4': 65.25 + '0.5': 65.25 + '0.6': 65.25 + '0.7': 65.25 + '0.8': 65.25 + '0.9': 65.25 + '0.95': 65.25 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 738137 + output_tokens: 179 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: 28d117b662157dd09926dc73753d7d19 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/28d117b662157dd09926dc73753d7d19 +scores: +- 2.4100006103515597 +- 15.359997558593747 +- 4.109997558593747 +- 18.199996948242188 +metric: crps +mean_score: 10.01999816894531 +ran_at: '2026-06-30T15:48:44.754860' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..b04d9238 --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous__wti_oil_price_forecast.yaml @@ -0,0 +1,224 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2025-06-02T00:00:00' + end: '2025-06-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: "Two-origin smoke backtest for local and CI testing of the NB04 pipeline.\ + \ Uses the same tasks, horizons, and warmup as energy_oil_backtest but with only\ + \ 2 weekly origins so the full notebook can be exercised without burning tokens\ + \ on 51 \xD7 5 predictor evaluations." +predictor_id: agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous +predictions: +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:29:06.755873' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-09T00:00:00' + payload: + point_forecast: 61.2 + quantiles: + '0.05': 58.5 + '0.1': 59.2 + '0.2': 59.8 + '0.3': 60.4 + '0.4': 60.8 + '0.5': 61.2 + '0.6': 61.7 + '0.7': 62.4 + '0.8': 63.2 + '0.9': 64.1 + '0.95': 65.0 + metadata: + rationale: As of June 2, 2025, WTI crude is trading near $60.79, close to the + lower end of the 52-week range. The market is caught between fundamental supply + pressure (gradual OPEC+ output increases) and persistent geopolitical risk premiums. + My forecast reflects a baseline of moderate, slow recovery driven by potential + supply-side adjustments and seasonal demand, with significant downside tail + risk remaining if demand forecasts weaken or OPEC+ unity falters. + horizon_rationale: Over the next 5 days, price action is expected to consolidate + near the $60-$62 range. Market participants are balancing concerns over global + demand with the geopolitical risk premium that prevents a deeper drop, despite + the recent bearish sentiment. + langfuse_trace_id: e89a7773f8ac7ae2326636d35148dbc5 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/e89a7773f8ac7ae2326636d35148dbc5 +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:29:06.755873' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 61.8 + quantiles: + '0.05': 57.8 + '0.1': 58.6 + '0.2': 59.5 + '0.3': 60.5 + '0.4': 61.2 + '0.5': 61.8 + '0.6': 62.6 + '0.7': 63.5 + '0.8': 64.8 + '0.9': 66.2 + '0.95': 67.5 + metadata: + rationale: As of June 2, 2025, WTI crude is trading near $60.79, close to the + lower end of the 52-week range. The market is caught between fundamental supply + pressure (gradual OPEC+ output increases) and persistent geopolitical risk premiums. + My forecast reflects a baseline of moderate, slow recovery driven by potential + supply-side adjustments and seasonal demand, with significant downside tail + risk remaining if demand forecasts weaken or OPEC+ unity falters. + horizon_rationale: By the 10-day horizon, the market continues to react to ongoing + discussions around OPEC+'s production adjustment strategy. The probability of + sideways-to-slight-upward movement increases if tensions in the Persian Gulf + remain high or if inventory data shows tighter supplies. + langfuse_trace_id: e89a7773f8ac7ae2326636d35148dbc5 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/e89a7773f8ac7ae2326636d35148dbc5 +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:29:06.755873' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-07-01T00:00:00' + payload: + point_forecast: 62.5 + quantiles: + '0.05': 56.5 + '0.1': 57.9 + '0.2': 59.2 + '0.3': 60.6 + '0.4': 61.7 + '0.5': 62.5 + '0.6': 63.6 + '0.7': 65.2 + '0.8': 67.3 + '0.9': 69.8 + '0.95': 72.0 + metadata: + rationale: As of June 2, 2025, WTI crude is trading near $60.79, close to the + lower end of the 52-week range. The market is caught between fundamental supply + pressure (gradual OPEC+ output increases) and persistent geopolitical risk premiums. + My forecast reflects a baseline of moderate, slow recovery driven by potential + supply-side adjustments and seasonal demand, with significant downside tail + risk remaining if demand forecasts weaken or OPEC+ unity falters. + horizon_rationale: At the 21-day horizon, the price distribution widens, reflecting + higher uncertainty regarding the market's ability to absorb the incremental + OPEC+ supply. The baseline assumes a moderate recovery as markets price in expected + summer travel demand, offset by ongoing concerns about non-OPEC+ output growth. + langfuse_trace_id: e89a7773f8ac7ae2326636d35148dbc5 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/e89a7773f8ac7ae2326636d35148dbc5 +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:29:15.653318' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 65.25 + quantiles: + '0.05': 61.5 + '0.1': 62.4 + '0.2': 63.5 + '0.3': 64.1 + '0.4': 64.75 + '0.5': 65.25 + '0.6': 65.8 + '0.7': 66.5 + '0.8': 67.4 + '0.9': 68.6 + '0.95': 69.5 + metadata: + rationale: As of June 9, 2025, WTI prices are supported by persistent Middle East + geopolitical risks but face resistance from OPEC+'s move to increase production. + The forecast reflects a volatile environment with a tendency toward mean reversion + in the medium term, contingent upon supply-demand balancing and geopolitical + developments. + horizon_rationale: Short-term momentum is slightly bullish following recent gains. + Geopolitical risk premiums in the Middle East provide a floor, while OPEC+'s + production increases act as a near-term ceiling. + langfuse_trace_id: a71d308d9b3cd186c19a69d0a75002b2 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/a71d308d9b3cd186c19a69d0a75002b2 +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:29:15.653318' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-23T00:00:00' + payload: + point_forecast: 66.0 + quantiles: + '0.05': 60.5 + '0.1': 61.8 + '0.2': 63.2 + '0.3': 64.3 + '0.4': 65.2 + '0.5': 66.0 + '0.6': 66.8 + '0.7': 67.8 + '0.8': 69.0 + '0.9': 70.5 + '0.95': 71.5 + metadata: + rationale: As of June 9, 2025, WTI prices are supported by persistent Middle East + geopolitical risks but face resistance from OPEC+'s move to increase production. + The forecast reflects a volatile environment with a tendency toward mean reversion + in the medium term, contingent upon supply-demand balancing and geopolitical + developments. + horizon_rationale: Over a two-week horizon, the market continues to balance geopolitical + anxiety against the reality of increased OPEC+ supply. Prices are expected to + grind higher if tensions remain elevated, but the upside is capped by supply + increases. + langfuse_trace_id: a71d308d9b3cd186c19a69d0a75002b2 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/a71d308d9b3cd186c19a69d0a75002b2 +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.1-flash-lite-preview_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:29:15.653318' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-07-08T00:00:00' + payload: + point_forecast: 64.5 + quantiles: + '0.05': 58.0 + '0.1': 59.5 + '0.2': 61.2 + '0.3': 62.5 + '0.4': 63.7 + '0.5': 64.5 + '0.6': 65.5 + '0.7': 66.8 + '0.8': 68.5 + '0.9': 71.0 + '0.95': 73.0 + metadata: + rationale: As of June 9, 2025, WTI prices are supported by persistent Middle East + geopolitical risks but face resistance from OPEC+'s move to increase production. + The forecast reflects a volatile environment with a tendency toward mean reversion + in the medium term, contingent upon supply-demand balancing and geopolitical + developments. + horizon_rationale: Over a monthly horizon, the market will likely reassess demand + strength and the effectiveness of OPEC+ supply management. We expect mean reversion + toward the current trading range as the immediate geopolitical panic potentially + stabilizes, unless a significant escalatory event occurs. + langfuse_trace_id: a71d308d9b3cd186c19a69d0a75002b2 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/a71d308d9b3cd186c19a69d0a75002b2 +scores: +- 2.6974389320562704 +- 7.898922262901118 +- 1.8152878690357042 +- 5.017930527363928 +- 1.5359513842369907 +- 2.234298352958743 +metric: crps +mean_score: 3.5333048880921254 +ran_at: '2026-06-30T15:29:15.891964' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..20e16642 --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous__wti_oil_price_forecast.yaml @@ -0,0 +1,240 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2025-06-02T00:00:00' + end: '2025-06-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: "Two-origin smoke backtest for local and CI testing of the NB04 pipeline.\ + \ Uses the same tasks, horizons, and warmup as energy_oil_backtest but with only\ + \ 2 weekly origins so the full notebook can be exercised without burning tokens\ + \ on 51 \xD7 5 predictor evaluations." +predictor_id: agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous +predictions: +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:30:15.952219' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-09T00:00:00' + payload: + point_forecast: 60.6 + quantiles: + '0.05': 56.8 + '0.1': 57.6 + '0.2': 58.7 + '0.3': 59.4 + '0.4': 60.0 + '0.5': 60.6 + '0.6': 61.2 + '0.7': 61.8 + '0.8': 62.6 + '0.9': 63.6 + '0.95': 64.4 + metadata: + rationale: The forecasts reflect a market in consolidation after the severe price + collapse in early April 2025 caused by US tariff announcements and OPEC+ production + hikes. The OPEC+ meeting on May 31, 2025, reaffirmed their strategy to gradually + return 411,000 bpd to the market in July, reinforcing a comfortable global supply + cushion. Downside risk remains linked to macro demand destruction and tariff + escalation, while upside risk is driven by potential geopolitical flare-ups + in transit routes. + horizon_rationale: Over a 5-day horizon, WTI crude is expected to consolidate + near its current $60.79/bbl anchor. Following the May 31 OPEC+ virtual meeting, + the group confirmed a 411,000 bpd production increase for July 2025. This continuation + of voluntary cut unwinding keeps market supply comfortable and limits immediate + upside. The range-bound nature is reflected in a relatively tight forecast distribution, + with the downside protected by technical support near the 52-week low of $57.13 + and the upside limited by trade-war concerns. + langfuse_trace_id: 832ca9db8cc5fb8252a5b31815dd2487 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/832ca9db8cc5fb8252a5b31815dd2487 +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:30:15.952219' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 60.4 + quantiles: + '0.05': 54.8 + '0.1': 56.0 + '0.2': 57.6 + '0.3': 58.7 + '0.4': 59.6 + '0.5': 60.4 + '0.6': 61.2 + '0.7': 62.1 + '0.8': 63.2 + '0.9': 64.6 + '0.95': 65.8 + metadata: + rationale: The forecasts reflect a market in consolidation after the severe price + collapse in early April 2025 caused by US tariff announcements and OPEC+ production + hikes. The OPEC+ meeting on May 31, 2025, reaffirmed their strategy to gradually + return 411,000 bpd to the market in July, reinforcing a comfortable global supply + cushion. Downside risk remains linked to macro demand destruction and tariff + escalation, while upside risk is driven by potential geopolitical flare-ups + in transit routes. + horizon_rationale: At the 10-day horizon, structural oversupply concerns are expected + to weigh slightly more on prices. The combination of ongoing US tariff impacts + on trade, soft global demand signals, and steady supply growth means the market + will likely trade with a soft bias. The uncertainty bounds expand to reflect + potential updates in weekly US commercial crude inventory data and shifting + macroeconomic indicators. + langfuse_trace_id: 832ca9db8cc5fb8252a5b31815dd2487 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/832ca9db8cc5fb8252a5b31815dd2487 +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:30:15.952219' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-07-01T00:00:00' + payload: + point_forecast: 60.0 + quantiles: + '0.05': 51.8 + '0.1': 54.0 + '0.2': 56.2 + '0.3': 57.7 + '0.4': 58.9 + '0.5': 60.0 + '0.6': 61.1 + '0.7': 62.3 + '0.8': 63.9 + '0.9': 65.9 + '0.95': 67.6 + metadata: + rationale: The forecasts reflect a market in consolidation after the severe price + collapse in early April 2025 caused by US tariff announcements and OPEC+ production + hikes. The OPEC+ meeting on May 31, 2025, reaffirmed their strategy to gradually + return 411,000 bpd to the market in July, reinforcing a comfortable global supply + cushion. Downside risk remains linked to macro demand destruction and tariff + escalation, while upside risk is driven by potential geopolitical flare-ups + in transit routes. + horizon_rationale: By early July 2025 (21 business days), the confirmed OPEC+ + supply increase of 411,000 bpd will officially begin to take effect. While summer + driving season in the Northern Hemisphere should offer seasonal demand support, + macro trade headwinds and rising supply are likely to keep prices capped near + $60.00/bbl. The wider distribution accounts for geopolitical risks in shipping + lanes and potential fluctuations in the pace of the US Strategic Petroleum Reserve + (SPR) refills. + langfuse_trace_id: 832ca9db8cc5fb8252a5b31815dd2487 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/832ca9db8cc5fb8252a5b31815dd2487 +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:32:07.868060' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 75.5 + quantiles: + '0.05': 66.5 + '0.1': 68.0 + '0.2': 71.0 + '0.3': 73.0 + '0.4': 74.5 + '0.5': 75.5 + '0.6': 76.5 + '0.7': 77.5 + '0.8': 78.5 + '0.9': 80.0 + '0.95': 82.0 + metadata: + rationale: These calibrated forecasts reflect a full cycle of a short-term geopolitical + risk spike and subsequent resolution. Mid-June 2025 is marked by military escalation + in the Middle East that briefly spikes prices, followed by a steady normalization + as physical flows remain uninterrupted and OPEC+ begins unwinding voluntary + production cuts. + horizon_rationale: Over a 5-day horizon (targeting June 13, 2025), a sharp price + spike is expected due to a sudden escalation in geopolitical tensions, including + reported airstrikes on Iranian military and nuclear infrastructure. This event + injects a high-volatility risk premium, taking WTI to an intraday high of $77.62 + per barrel with a median settlement expected near $75.50. + langfuse_trace_id: c6e5d943b3c0559a2d811f1de0cc0390 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/c6e5d943b3c0559a2d811f1de0cc0390 +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:32:07.868060' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-23T00:00:00' + payload: + point_forecast: 70.0 + quantiles: + '0.05': 62.0 + '0.1': 64.0 + '0.2': 66.5 + '0.3': 68.0 + '0.4': 69.0 + '0.5': 70.0 + '0.6': 71.0 + '0.7': 72.5 + '0.8': 74.0 + '0.9': 76.0 + '0.95': 78.0 + metadata: + rationale: These calibrated forecasts reflect a full cycle of a short-term geopolitical + risk spike and subsequent resolution. Mid-June 2025 is marked by military escalation + in the Middle East that briefly spikes prices, followed by a steady normalization + as physical flows remain uninterrupted and OPEC+ begins unwinding voluntary + production cuts. + horizon_rationale: Over a 10-day horizon (targeting June 20, 2025), crude prices + are expected to partially correct downward from the mid-month peak. Markets + are anticipated to react to signs of geopolitical de-escalation and the confirmation + that critical oil transport infrastructure (e.g., the Strait of Hormuz) remained + physically unblocked, bringing the median price down to $70.00. + langfuse_trace_id: c6e5d943b3c0559a2d811f1de0cc0390 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/c6e5d943b3c0559a2d811f1de0cc0390 +- predictor_id: agent_predictor_wti_analyst_news_gemini-3.5-flash_continuous + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:32:07.868060' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-07-08T00:00:00' + payload: + point_forecast: 64.0 + quantiles: + '0.05': 56.5 + '0.1': 58.5 + '0.2': 61.0 + '0.3': 62.5 + '0.4': 63.3 + '0.5': 64.0 + '0.6': 64.8 + '0.7': 66.0 + '0.8': 67.5 + '0.9': 70.0 + '0.95': 72.0 + metadata: + rationale: These calibrated forecasts reflect a full cycle of a short-term geopolitical + risk spike and subsequent resolution. Mid-June 2025 is marked by military escalation + in the Middle East that briefly spikes prices, followed by a steady normalization + as physical flows remain uninterrupted and OPEC+ begins unwinding voluntary + production cuts. + horizon_rationale: Over a 21-day horizon (targeting early July 2025), the market + is projected to fully normalize and return to supply/demand fundamentals. With + geopolitical risk premiums heavily faded, the main market drivers will be the + planned OPEC+ production increases (+411,000 bpd in July) and seasonally softer + global demand expectations. This brings WTI back to its baseline low-$60s range, + centering on a median of $64.00. + langfuse_trace_id: c6e5d943b3c0559a2d811f1de0cc0390 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/c6e5d943b3c0559a2d811f1de0cc0390 +scores: +- 3.3635546345356078 +- 9.512145403396985 +- 3.3144608678896574 +- 2.2037205341433688 +- 1.3733052025156567 +- 2.605868933811662 +metric: crps +mean_score: 3.7288425960488225 +ran_at: '2026-06-30T15:32:08.110946' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/darts_autoarima__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/darts_autoarima__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..5d464016 --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/darts_autoarima__wti_oil_price_forecast.yaml @@ -0,0 +1,156 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2025-06-02T00:00:00' + end: '2025-06-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: "Two-origin smoke backtest for local and CI testing of the NB04 pipeline.\ + \ Uses the same tasks, horizons, and warmup as energy_oil_backtest but with only\ + \ 2 weekly origins so the full notebook can be exercised without burning tokens\ + \ on 51 \xD7 5 predictor evaluations." +predictor_id: darts_autoarima +predictions: +- predictor_id: darts_autoarima + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:12:09.495050' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-09T00:00:00' + payload: + point_forecast: 60.61356361136259 + quantiles: + '0.05': 54.05132331998276 + '0.1': 55.39618350858535 + '0.2': 56.80220508858122 + '0.3': 58.31303093089272 + '0.4': 59.715635999352365 + '0.5': 60.61356361136259 + '0.6': 61.84013083880937 + '0.7': 62.88849469166111 + '0.8': 63.947202941682214 + '0.9': 66.49965204263938 + '0.95': 67.64202765089128 + metadata: {} +- predictor_id: darts_autoarima + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:12:09.495050' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 60.62894466667676 + quantiles: + '0.05': 51.04358857292007 + '0.1': 53.77893987780516 + '0.2': 56.00601589604319 + '0.3': 57.538096692734456 + '0.4': 59.074426651644195 + '0.5': 60.62894466667676 + '0.6': 62.27082861883339 + '0.7': 64.29428186441619 + '0.8': 66.06992920081505 + '0.9': 68.07261328035358 + '0.95': 70.41468169943197 + metadata: {} +- predictor_id: darts_autoarima + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:12:09.495050' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-07-01T00:00:00' + payload: + point_forecast: 60.53901055305605 + quantiles: + '0.05': 45.68171253549838 + '0.1': 49.383779463119595 + '0.2': 52.63934512760161 + '0.3': 55.48988680505547 + '0.4': 58.12184228185315 + '0.5': 60.53901055305605 + '0.6': 63.15171068167313 + '0.7': 65.32847298406908 + '0.8': 68.96907386749231 + '0.9': 72.15714609289728 + '0.95': 74.40143796195927 + metadata: {} +- predictor_id: darts_autoarima + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:12:09.625871' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 64.85070666971166 + quantiles: + '0.05': 58.16468339052332 + '0.1': 59.632148260688425 + '0.2': 61.14028637488691 + '0.3': 62.47623306715105 + '0.4': 63.69553963861046 + '0.5': 64.85070666971166 + '0.6': 66.08160169242588 + '0.7': 66.9751355363776 + '0.8': 68.34026386313833 + '0.9': 70.31216388228658 + '0.95': 71.74922329723155 + metadata: {} +- predictor_id: darts_autoarima + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:12:09.625871' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-23T00:00:00' + payload: + point_forecast: 64.69925126554855 + quantiles: + '0.05': 55.05122882396441 + '0.1': 56.81542567067016 + '0.2': 59.409320026013894 + '0.3': 61.51140859465395 + '0.4': 63.25665743904521 + '0.5': 64.69925126554855 + '0.6': 66.48767710666965 + '0.7': 67.93952313100611 + '0.8': 69.99082772871371 + '0.9': 72.63797439709404 + '0.95': 74.32098927724198 + metadata: {} +- predictor_id: darts_autoarima + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:12:09.625871' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-07-08T00:00:00' + payload: + point_forecast: 65.5900163894848 + quantiles: + '0.05': 51.05475798019428 + '0.1': 53.97036535908705 + '0.2': 57.98917263141113 + '0.3': 60.69198187940317 + '0.4': 63.76033806565651 + '0.5': 65.5900163894848 + '0.6': 67.42662006584679 + '0.7': 69.69732634953493 + '0.8': 72.75058707003939 + '0.9': 75.57061670402373 + '0.95': 78.43485234918616 + metadata: {} +scores: +- 2.8387392021679765 +- 7.613160608573375 +- 3.306479861901634 +- 4.539823375651014 +- 2.418850183900069 +- 2.578810814722483 +metric: crps +mean_score: 3.8826440078194255 +ran_at: '2026-06-30T15:12:09.653252' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/darts_lightgbm__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/darts_lightgbm__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..7217c120 --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/darts_lightgbm__wti_oil_price_forecast.yaml @@ -0,0 +1,162 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2025-06-02T00:00:00' + end: '2025-06-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: "Two-origin smoke backtest for local and CI testing of the NB04 pipeline.\ + \ Uses the same tasks, horizons, and warmup as energy_oil_backtest but with only\ + \ 2 weekly origins so the full notebook can be exercised without burning tokens\ + \ on 51 \xD7 5 predictor evaluations." +predictor_id: darts_lightgbm +predictions: +- predictor_id: darts_lightgbm + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:13:03.306187' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-09T00:00:00' + payload: + point_forecast: 61.402151963412365 + quantiles: + '0.05': 57.502394604188666 + '0.1': 57.94060751459753 + '0.2': 59.28351690434436 + '0.3': 59.906652710787064 + '0.4': 61.25473423971011 + '0.5': 61.402151963412365 + '0.6': 61.571467205990956 + '0.7': 62.35526427411749 + '0.8': 63.104009101236485 + '0.9': 63.253714516380555 + '0.95': 63.56824443915774 + metadata: + covariates: [] +- predictor_id: darts_lightgbm + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:13:03.306187' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 59.18675740164646 + quantiles: + '0.05': 53.44980745701606 + '0.1': 53.628230434859546 + '0.2': 56.045331434256354 + '0.3': 57.94338826563275 + '0.4': 58.36416315862185 + '0.5': 59.18675740164646 + '0.6': 61.26232420341097 + '0.7': 62.54959248768767 + '0.8': 62.998908881570195 + '0.9': 64.56436825279535 + '0.95': 65.25466756163142 + metadata: + covariates: [] +- predictor_id: darts_lightgbm + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:13:03.306187' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-07-01T00:00:00' + payload: + point_forecast: 60.15202322453128 + quantiles: + '0.05': 50.00294128477512 + '0.1': 50.4898045628444 + '0.2': 52.5487369711329 + '0.3': 56.81369865949473 + '0.4': 59.61909423599028 + '0.5': 60.15202322453128 + '0.6': 61.633079030959486 + '0.7': 63.41435140366422 + '0.8': 64.58362778985165 + '0.9': 66.45873136106782 + '0.95': 67.1685997897449 + metadata: + covariates: [] +- predictor_id: darts_lightgbm + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:13:57.014742' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 63.47258529424574 + quantiles: + '0.05': 61.76220462168124 + '0.1': 62.28349999533214 + '0.2': 62.466776993939675 + '0.3': 63.048448567200396 + '0.4': 63.37639679856467 + '0.5': 63.47258529424574 + '0.6': 64.20243227690523 + '0.7': 64.92882318203057 + '0.8': 65.2846704338109 + '0.9': 66.39828317753263 + '0.95': 66.55698784031125 + metadata: + covariates: [] +- predictor_id: darts_lightgbm + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:13:57.014742' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-23T00:00:00' + payload: + point_forecast: 63.12503767872267 + quantiles: + '0.05': 57.80462877978523 + '0.1': 59.01003320651465 + '0.2': 60.20254213052469 + '0.3': 60.92811085378594 + '0.4': 61.97434293128609 + '0.5': 63.12503767872267 + '0.6': 64.5224992657582 + '0.7': 65.80070049803832 + '0.8': 67.12529493650538 + '0.9': 67.50091122269681 + '0.95': 68.3160066478531 + metadata: + covariates: [] +- predictor_id: darts_lightgbm + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:13:57.014742' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-07-08T00:00:00' + payload: + point_forecast: 65.30723846552408 + quantiles: + '0.05': 56.47296950049231 + '0.1': 61.24767459537827 + '0.2': 63.44313234426489 + '0.3': 64.49294285301316 + '0.4': 64.82578567439542 + '0.5': 65.30723846552408 + '0.6': 66.32966029684154 + '0.7': 67.91413006033106 + '0.8': 68.28852165871243 + '0.9': 70.4162119237642 + '0.95': 71.54420676209234 + metadata: + covariates: [] +scores: +- 3.1488062713591827 +- 9.958399600242146 +- 3.270012842673469 +- 6.906036075328951 +- 3.23252130517133 +- 1.5835258792827387 +metric: crps +mean_score: 4.683216995676303 +ran_at: '2026-06-30T15:13:57.071580' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/darts_lightgbm_cov__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/darts_lightgbm_cov__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..5f1c55a6 --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/darts_lightgbm_cov__wti_oil_price_forecast.yaml @@ -0,0 +1,204 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2025-06-02T00:00:00' + end: '2025-06-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: "Two-origin smoke backtest for local and CI testing of the NB04 pipeline.\ + \ Uses the same tasks, horizons, and warmup as energy_oil_backtest but with only\ + \ 2 weekly origins so the full notebook can be exercised without burning tokens\ + \ on 51 \xD7 5 predictor evaluations." +predictor_id: darts_lightgbm_cov +predictions: +- predictor_id: darts_lightgbm_cov + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:20:55.553099' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-09T00:00:00' + payload: + point_forecast: 60.34665021806403 + quantiles: + '0.05': 57.33296955356785 + '0.1': 57.66374041555769 + '0.2': 58.4798719442351 + '0.3': 59.744744944331956 + '0.4': 60.22528135909493 + '0.5': 60.34665021806403 + '0.6': 61.40748597945248 + '0.7': 62.37638808550578 + '0.8': 62.94240894562097 + '0.9': 63.76566615353837 + '0.95': 64.15194703898389 + metadata: + covariates: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b +- predictor_id: darts_lightgbm_cov + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:20:55.553099' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 61.36522590591281 + quantiles: + '0.05': 52.9911936356359 + '0.1': 53.81133876107415 + '0.2': 54.510948354287024 + '0.3': 56.72522483441637 + '0.4': 60.302581416015954 + '0.5': 61.36522590591281 + '0.6': 61.852814486476376 + '0.7': 62.52324641724077 + '0.8': 63.07913475447261 + '0.9': 63.49959890792957 + '0.95': 64.47410415671604 + metadata: + covariates: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b +- predictor_id: darts_lightgbm_cov + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:20:55.553099' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-07-01T00:00:00' + payload: + point_forecast: 58.40985315988832 + quantiles: + '0.05': 52.29870268197552 + '0.1': 52.88821465101988 + '0.2': 53.71821610801835 + '0.3': 56.34745594652476 + '0.4': 57.67496996183723 + '0.5': 58.40985315988832 + '0.6': 59.94086469556138 + '0.7': 60.25036311602911 + '0.8': 61.271955376984636 + '0.9': 65.18489804663962 + '0.95': 65.3245170280752 + metadata: + covariates: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b +- predictor_id: darts_lightgbm_cov + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:27:50.159831' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 64.27472322815481 + quantiles: + '0.05': 59.15268757744743 + '0.1': 60.37986971507966 + '0.2': 61.987356112308355 + '0.3': 62.78732786055867 + '0.4': 63.17858821881605 + '0.5': 64.27472322815481 + '0.6': 64.88162579811934 + '0.7': 65.2238968079356 + '0.8': 65.52525477728123 + '0.9': 66.89990387180804 + '0.95': 68.11962806125757 + metadata: + covariates: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b +- predictor_id: darts_lightgbm_cov + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:27:50.159831' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-23T00:00:00' + payload: + point_forecast: 63.40730694773532 + quantiles: + '0.05': 56.05365367475643 + '0.1': 59.43909230158057 + '0.2': 61.04035858209547 + '0.3': 61.25163174168656 + '0.4': 62.543988125909564 + '0.5': 63.40730694773532 + '0.6': 64.05504608887081 + '0.7': 65.87803013171053 + '0.8': 66.69550867380632 + '0.9': 67.73086394534039 + '0.95': 67.9078295214997 + metadata: + covariates: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b +- predictor_id: darts_lightgbm_cov + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:27:50.159831' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-07-08T00:00:00' + payload: + point_forecast: 63.083663193028436 + quantiles: + '0.05': 53.93000735045171 + '0.1': 54.93379927166812 + '0.2': 59.57477067579531 + '0.3': 61.200339271313204 + '0.4': 62.3806650815065 + '0.5': 63.083663193028436 + '0.6': 65.50900824957499 + '0.7': 65.77429543856373 + '0.8': 66.38919722443539 + '0.9': 68.03966934504248 + '0.95': 68.36818364475222 + metadata: + covariates: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b +scores: +- 3.2281820263602787 +- 9.980522385290126 +- 4.536711139289194 +- 6.458187524501825 +- 3.250738097067634 +- 3.0833292679713256 +metric: crps +mean_score: 5.089611740080064 +ran_at: '2026-06-30T15:27:50.218582' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/llmp_quantile_grid[gemini-3.5-flash]__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/llmp_quantile_grid[gemini-3.5-flash]__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..34b962ac --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/llmp_quantile_grid[gemini-3.5-flash]__wti_oil_price_forecast.yaml @@ -0,0 +1,216 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2025-06-02T00:00:00' + end: '2025-06-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: "Two-origin smoke backtest for local and CI testing of the NB04 pipeline.\ + \ Uses the same tasks, horizons, and warmup as energy_oil_backtest but with only\ + \ 2 weekly origins so the full notebook can be exercised without burning tokens\ + \ on 51 \xD7 5 predictor evaluations." +predictor_id: llmp_quantile_grid[gemini-3.5-flash] +predictions: +- predictor_id: llmp_quantile_grid[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:38.969303' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-09T00:00:00' + payload: + point_forecast: 61.1 + quantiles: + '0.05': 55.2 + '0.1': 56.7 + '0.2': 58.3 + '0.3': 59.4 + '0.4': 60.2 + '0.5': 61.1 + '0.6': 61.9 + '0.7': 62.8 + '0.8': 64.0 + '0.9': 65.6 + '0.95': 67.2 + metadata: + model: gemini-3.5-flash + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 97718 + output_tokens: 2083 + parse_failures: 0 + langfuse_trace_id: de81492d820e95e3ae22f8863b1c4384 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/de81492d820e95e3ae22f8863b1c4384 +- predictor_id: llmp_quantile_grid[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:38.969303' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 61.0 + quantiles: + '0.05': 53.4 + '0.1': 55.2 + '0.2': 57.2 + '0.3': 58.6 + '0.4': 59.8 + '0.5': 61.0 + '0.6': 62.1 + '0.7': 63.4 + '0.8': 65.1 + '0.9': 67.3 + '0.95': 69.4 + metadata: + model: gemini-3.5-flash + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 97718 + output_tokens: 2083 + parse_failures: 0 + langfuse_trace_id: de81492d820e95e3ae22f8863b1c4384 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/de81492d820e95e3ae22f8863b1c4384 +- predictor_id: llmp_quantile_grid[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:38.969303' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-07-01T00:00:00' + payload: + point_forecast: 60.8 + quantiles: + '0.05': 50.0 + '0.1': 52.5 + '0.2': 55.1 + '0.3': 57.2 + '0.4': 59.0 + '0.5': 60.8 + '0.6': 62.4 + '0.7': 64.2 + '0.8': 66.8 + '0.9': 70.5 + '0.95': 73.7 + metadata: + model: gemini-3.5-flash + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 97718 + output_tokens: 2083 + parse_failures: 0 + langfuse_trace_id: de81492d820e95e3ae22f8863b1c4384 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/de81492d820e95e3ae22f8863b1c4384 +- predictor_id: llmp_quantile_grid[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:54.946260' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 63.8 + quantiles: + '0.05': 59.8 + '0.1': 60.85 + '0.2': 61.95 + '0.3': 62.65 + '0.4': 63.25 + '0.5': 63.8 + '0.6': 64.35 + '0.7': 64.95 + '0.8': 65.75 + '0.9': 67.0 + '0.95': 71.8 + metadata: + model: gemini-3.5-flash + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 97808 + output_tokens: 3353 + parse_failures: 0 + langfuse_trace_id: 872f627ba0091cd3dce21436c3587bf8 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/872f627ba0091cd3dce21436c3587bf8 +- predictor_id: llmp_quantile_grid[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:54.946260' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-23T00:00:00' + payload: + point_forecast: 63.05 + quantiles: + '0.05': 58.15 + '0.1': 59.5 + '0.2': 60.75 + '0.3': 61.65 + '0.4': 62.4 + '0.5': 63.05 + '0.6': 63.75 + '0.7': 64.45 + '0.8': 65.5 + '0.9': 67.3 + '0.95': 72.85 + metadata: + model: gemini-3.5-flash + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 97808 + output_tokens: 3353 + parse_failures: 0 + langfuse_trace_id: 872f627ba0091cd3dce21436c3587bf8 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/872f627ba0091cd3dce21436c3587bf8 +- predictor_id: llmp_quantile_grid[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:54.946260' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-07-08T00:00:00' + payload: + point_forecast: 61.4 + quantiles: + '0.05': 54.6 + '0.1': 56.5 + '0.2': 58.25 + '0.3': 59.45 + '0.4': 60.45 + '0.5': 61.4 + '0.6': 62.35 + '0.7': 63.35 + '0.8': 64.95 + '0.9': 67.85 + '0.95': 75.45 + metadata: + model: gemini-3.5-flash + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 97808 + output_tokens: 3353 + parse_failures: 0 + langfuse_trace_id: 872f627ba0091cd3dce21436c3587bf8 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/872f627ba0091cd3dce21436c3587bf8 +scores: +- 2.5630584338479796 +- 7.92288920504988 +- 2.9880151417629777 +- 5.899005517880781 +- 3.6408281941059224 +- 4.422067613838133 +metric: crps +mean_score: 4.572644017747612 +ran_at: '2026-06-30T15:28:55.336770' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/llmp_sampled_trajectories[gemini-3.5-flash]__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/llmp_sampled_trajectories[gemini-3.5-flash]__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..59946f92 --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/llmp_sampled_trajectories[gemini-3.5-flash]__wti_oil_price_forecast.yaml @@ -0,0 +1,222 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2025-06-02T00:00:00' + end: '2025-06-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: "Two-origin smoke backtest for local and CI testing of the NB04 pipeline.\ + \ Uses the same tasks, horizons, and warmup as energy_oil_backtest but with only\ + \ 2 weekly origins so the full notebook can be exercised without burning tokens\ + \ on 51 \xD7 5 predictor evaluations." +predictor_id: llmp_sampled_trajectories[gemini-3.5-flash] +predictions: +- predictor_id: llmp_sampled_trajectories[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:27:53.902867' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-09T00:00:00' + payload: + point_forecast: 61.55 + quantiles: + '0.05': 61.55 + '0.1': 61.55 + '0.2': 61.55 + '0.3': 61.55 + '0.4': 61.55 + '0.5': 61.55 + '0.6': 61.55 + '0.7': 61.55 + '0.8': 61.55 + '0.9': 61.55 + '0.95': 61.55 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 97684 + output_tokens: 179 + parse_failures: 0 + langfuse_trace_id: 914e5fcb0fc2a480cb1523009eb09a12 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/914e5fcb0fc2a480cb1523009eb09a12 +- predictor_id: llmp_sampled_trajectories[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:27:53.902867' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 62.35 + quantiles: + '0.05': 62.35 + '0.1': 62.35 + '0.2': 62.35 + '0.3': 62.35 + '0.4': 62.35 + '0.5': 62.35 + '0.6': 62.35 + '0.7': 62.35 + '0.8': 62.35 + '0.9': 62.35 + '0.95': 62.35 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 97684 + output_tokens: 179 + parse_failures: 0 + langfuse_trace_id: 914e5fcb0fc2a480cb1523009eb09a12 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/914e5fcb0fc2a480cb1523009eb09a12 +- predictor_id: llmp_sampled_trajectories[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:27:53.902867' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-07-01T00:00:00' + payload: + point_forecast: 64.95 + quantiles: + '0.05': 64.95 + '0.1': 64.95 + '0.2': 64.95 + '0.3': 64.95 + '0.4': 64.95 + '0.5': 64.95 + '0.6': 64.95 + '0.7': 64.95 + '0.8': 64.95 + '0.9': 64.95 + '0.95': 64.95 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 97684 + output_tokens: 179 + parse_failures: 0 + langfuse_trace_id: 914e5fcb0fc2a480cb1523009eb09a12 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/914e5fcb0fc2a480cb1523009eb09a12 +- predictor_id: llmp_sampled_trajectories[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:27:57.234306' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 63.9 + quantiles: + '0.05': 63.9 + '0.1': 63.9 + '0.2': 63.9 + '0.3': 63.9 + '0.4': 63.9 + '0.5': 63.9 + '0.6': 63.9 + '0.7': 63.9 + '0.8': 63.9 + '0.9': 63.9 + '0.95': 63.9 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 97774 + output_tokens: 179 + parse_failures: 0 + langfuse_trace_id: a578f29772e5c5c3e858e47cadd322a9 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/a578f29772e5c5c3e858e47cadd322a9 +- predictor_id: llmp_sampled_trajectories[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:27:57.234306' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-23T00:00:00' + payload: + point_forecast: 64.9 + quantiles: + '0.05': 64.9 + '0.1': 64.9 + '0.2': 64.9 + '0.3': 64.9 + '0.4': 64.9 + '0.5': 64.9 + '0.6': 64.9 + '0.7': 64.9 + '0.8': 64.9 + '0.9': 64.9 + '0.95': 64.9 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 97774 + output_tokens: 179 + parse_failures: 0 + langfuse_trace_id: a578f29772e5c5c3e858e47cadd322a9 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/a578f29772e5c5c3e858e47cadd322a9 +- predictor_id: llmp_sampled_trajectories[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:27:57.234306' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-07-08T00:00:00' + payload: + point_forecast: 67.4 + quantiles: + '0.05': 67.4 + '0.1': 67.4 + '0.2': 67.4 + '0.3': 67.4 + '0.4': 67.4 + '0.5': 67.4 + '0.6': 67.4 + '0.7': 67.4 + '0.8': 67.4 + '0.9': 67.4 + '0.95': 67.4 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 97774 + output_tokens: 179 + parse_failures: 0 + langfuse_trace_id: a578f29772e5c5c3e858e47cadd322a9 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/a578f29772e5c5c3e858e47cadd322a9 +scores: +- 3.7400009155273466 +- 9.419996643066405 +- 0.49999694824218466 +- 7.869996643066408 +- 3.610002136230463 +- 0.9300018310546818 +metric: crps +mean_score: 4.3449991861979145 +ran_at: '2026-06-30T15:27:57.821353' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview]__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview]__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..51622a73 --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview]__wti_oil_price_forecast.yaml @@ -0,0 +1,276 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2025-06-02T00:00:00' + end: '2025-06-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: "Two-origin smoke backtest for local and CI testing of the NB04 pipeline.\ + \ Uses the same tasks, horizons, and warmup as energy_oil_backtest but with only\ + \ 2 weekly origins so the full notebook can be exercised without burning tokens\ + \ on 51 \xD7 5 predictor evaluations." +predictor_id: llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview] +predictions: +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:02.325600' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-09T00:00:00' + payload: + point_forecast: 60.61 + quantiles: + '0.05': 60.61 + '0.1': 60.61 + '0.2': 60.61 + '0.3': 60.61 + '0.4': 60.61 + '0.5': 60.61 + '0.6': 60.61 + '0.7': 60.61 + '0.8': 60.61 + '0.9': 60.61 + '0.95': 60.61 + metadata: + model: gemini-3.1-flash-lite-preview + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 714058 + output_tokens: 179 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: 93d55d1e7270706c47cf2bb0c9b97938 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/93d55d1e7270706c47cf2bb0c9b97938 +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:02.325600' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 60.25 + quantiles: + '0.05': 60.25 + '0.1': 60.25 + '0.2': 60.25 + '0.3': 60.25 + '0.4': 60.25 + '0.5': 60.25 + '0.6': 60.25 + '0.7': 60.25 + '0.8': 60.25 + '0.9': 60.25 + '0.95': 60.25 + metadata: + model: gemini-3.1-flash-lite-preview + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 714058 + output_tokens: 179 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: 93d55d1e7270706c47cf2bb0c9b97938 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/93d55d1e7270706c47cf2bb0c9b97938 +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:02.325600' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-07-01T00:00:00' + payload: + point_forecast: 62.11 + quantiles: + '0.05': 62.11 + '0.1': 62.11 + '0.2': 62.11 + '0.3': 62.11 + '0.4': 62.11 + '0.5': 62.11 + '0.6': 62.11 + '0.7': 62.11 + '0.8': 62.11 + '0.9': 62.11 + '0.95': 62.11 + metadata: + model: gemini-3.1-flash-lite-preview + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 714058 + output_tokens: 179 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: 93d55d1e7270706c47cf2bb0c9b97938 + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/93d55d1e7270706c47cf2bb0c9b97938 +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:06.889309' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 64.42 + quantiles: + '0.05': 64.42 + '0.1': 64.42 + '0.2': 64.42 + '0.3': 64.42 + '0.4': 64.42 + '0.5': 64.42 + '0.6': 64.42 + '0.7': 64.42 + '0.8': 64.42 + '0.9': 64.42 + '0.95': 64.42 + metadata: + model: gemini-3.1-flash-lite-preview + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 714748 + output_tokens: 179 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: f64df34e90c68432c70a2b039bb4da5b + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/f64df34e90c68432c70a2b039bb4da5b +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:06.889309' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-23T00:00:00' + payload: + point_forecast: 63.51 + quantiles: + '0.05': 63.51 + '0.1': 63.51 + '0.2': 63.51 + '0.3': 63.51 + '0.4': 63.51 + '0.5': 63.51 + '0.6': 63.51 + '0.7': 63.51 + '0.8': 63.51 + '0.9': 63.51 + '0.95': 63.51 + metadata: + model: gemini-3.1-flash-lite-preview + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 714748 + output_tokens: 179 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: f64df34e90c68432c70a2b039bb4da5b + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/f64df34e90c68432c70a2b039bb4da5b +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.1-flash-lite-preview] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:06.889309' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-07-08T00:00:00' + payload: + point_forecast: 60.89 + quantiles: + '0.05': 60.89 + '0.1': 60.89 + '0.2': 60.89 + '0.3': 60.89 + '0.4': 60.89 + '0.5': 60.89 + '0.6': 60.89 + '0.7': 60.89 + '0.8': 60.89 + '0.9': 60.89 + '0.95': 60.89 + metadata: + model: gemini-3.1-flash-lite-preview + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 714748 + output_tokens: 179 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: f64df34e90c68432c70a2b039bb4da5b + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/f64df34e90c68432c70a2b039bb4da5b +scores: +- 4.680000915527344 +- 11.519996643066406 +- 3.339996948242188 +- 7.3499966430664045 +- 5.000002136230471 +- 7.440001831054687 +metric: crps +mean_score: 6.554999186197917 +ran_at: '2026-06-30T15:28:07.155798' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/llmp_sampled_trajectories_cov[gemini-3.5-flash]__wti_oil_price_forecast.yaml b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/llmp_sampled_trajectories_cov[gemini-3.5-flash]__wti_oil_price_forecast.yaml new file mode 100644 index 00000000..a720c60c --- /dev/null +++ b/implementations/energy_oil_forecasting/data/predictions/energy_oil_smoke/llmp_sampled_trajectories_cov[gemini-3.5-flash]__wti_oil_price_forecast.yaml @@ -0,0 +1,276 @@ +spec: + task: + task_id: wti_oil_price_forecast + target_series_id: wti_crude_oil_price + horizons: + - 5 + - 10 + - 21 + frequency: B + description: 'WTI Crude Oil continuous front-month futures Close price (yfinance + symbol: CL=F), projected 5, 10, and 21 trading days ahead.' + payload_type: continuous + categories: null + resolution_fn: observed_value_at_resolution_timestamp + start: '2025-06-02T00:00:00' + end: '2025-06-09T00:00:00' + stride: 5 + origin_dates: null + warmup: 250 + description: "Two-origin smoke backtest for local and CI testing of the NB04 pipeline.\ + \ Uses the same tasks, horizons, and warmup as energy_oil_backtest but with only\ + \ 2 weekly origins so the full notebook can be exercised without burning tokens\ + \ on 51 \xD7 5 predictor evaluations." +predictor_id: llmp_sampled_trajectories_cov[gemini-3.5-flash] +predictions: +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:16.035734' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-09T00:00:00' + payload: + point_forecast: 61.25 + quantiles: + '0.05': 61.25 + '0.1': 61.25 + '0.2': 61.25 + '0.3': 61.25 + '0.4': 61.25 + '0.5': 61.25 + '0.6': 61.25 + '0.7': 61.25 + '0.8': 61.25 + '0.9': 61.25 + '0.95': 61.25 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 714058 + output_tokens: 129 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: ece40d628419c3bdc0ffed7eab71061c + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/ece40d628419c3bdc0ffed7eab71061c +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:16.035734' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 58.35 + quantiles: + '0.05': 58.35 + '0.1': 58.35 + '0.2': 58.35 + '0.3': 58.35 + '0.4': 58.35 + '0.5': 58.35 + '0.6': 58.35 + '0.7': 58.35 + '0.8': 58.35 + '0.9': 58.35 + '0.95': 58.35 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 714058 + output_tokens: 129 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: ece40d628419c3bdc0ffed7eab71061c + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/ece40d628419c3bdc0ffed7eab71061c +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:16.035734' + as_of: '2025-06-02T00:00:00' + forecast_date: '2025-07-01T00:00:00' + payload: + point_forecast: 58.05 + quantiles: + '0.05': 58.05 + '0.1': 58.05 + '0.2': 58.05 + '0.3': 58.05 + '0.4': 58.05 + '0.5': 58.05 + '0.6': 58.05 + '0.7': 58.05 + '0.8': 58.05 + '0.9': 58.05 + '0.95': 58.05 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 714058 + output_tokens: 129 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: ece40d628419c3bdc0ffed7eab71061c + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/ece40d628419c3bdc0ffed7eab71061c +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:27.260159' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-16T00:00:00' + payload: + point_forecast: 66.1 + quantiles: + '0.05': 66.1 + '0.1': 66.1 + '0.2': 66.1 + '0.3': 66.1 + '0.4': 66.1 + '0.5': 66.1 + '0.6': 66.1 + '0.7': 66.1 + '0.8': 66.1 + '0.9': 66.1 + '0.95': 66.1 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 714748 + output_tokens: 179 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: e27908a4045719dbbf717be686dc548d + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/e27908a4045719dbbf717be686dc548d +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:27.260159' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-06-23T00:00:00' + payload: + point_forecast: 67.05 + quantiles: + '0.05': 67.05 + '0.1': 67.05 + '0.2': 67.05 + '0.3': 67.05 + '0.4': 67.05 + '0.5': 67.05 + '0.6': 67.05 + '0.7': 67.05 + '0.8': 67.05 + '0.9': 67.05 + '0.95': 67.05 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 714748 + output_tokens: 179 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: e27908a4045719dbbf717be686dc548d + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/e27908a4045719dbbf717be686dc548d +- predictor_id: llmp_sampled_trajectories_cov[gemini-3.5-flash] + task_id: wti_oil_price_forecast + issued_at: '2026-06-30T15:28:27.260159' + as_of: '2025-06-09T00:00:00' + forecast_date: '2025-07-08T00:00:00' + payload: + point_forecast: 68.95 + quantiles: + '0.05': 68.95 + '0.1': 68.95 + '0.2': 68.95 + '0.3': 68.95 + '0.4': 68.95 + '0.5': 68.95 + '0.6': 68.95 + '0.7': 68.95 + '0.8': 68.95 + '0.9': 68.95 + '0.95': 68.95 + metadata: + model: gemini-3.5-flash + n_samples: 1 + n_report_docs: 0 + covariate_series_ids: + - brent_log_ret_1b_l1b + - natgas_log_ret_1b_l1b + - gasoline_log_ret_1b_l1b + - gold_log_ret_1b_l1b + - dollar_index_log_ret_1b_l1b + - oil_curve_contango_l1b + - vix_level_l1b + temperature: 1.0 + reasoning_effort: null + cost_usd: 0.0 + input_tokens: 714748 + output_tokens: 179 + parse_failures: 0 + variant_tag: cov + langfuse_trace_id: e27908a4045719dbbf717be686dc548d + langfuse_trace_url: https://us.cloud.langfuse.com/project/cmobssx3g00buad07gb4o1gh6/traces/e27908a4045719dbbf717be686dc548d +scores: +- 4.040000915527344 +- 13.419996643066405 +- 7.39999694824219 +- 5.669996643066412 +- 1.4600021362304716 +- 0.6199981689453153 +metric: crps +mean_score: 5.434998575846357 +ran_at: '2026-06-30T15:28:27.654077' +skipped_origins: 0 diff --git a/implementations/energy_oil_forecasting/specs/energy_oil_eval.yaml b/implementations/energy_oil_forecasting/specs/energy_oil_eval.yaml index 5dc3b1a0..129f8882 100644 --- a/implementations/energy_oil_forecasting/specs/energy_oil_eval.yaml +++ b/implementations/energy_oil_forecasting/specs/energy_oil_eval.yaml @@ -1,7 +1,11 @@ # Energy Oil Eval Spec — 2026 Prospective Competition # -# Runs on 8 weekly origins from Feb 2, 2026 to Mar 23, 2026. -# Covers the high-volatility Persian Gulf geopolitical price shock period. +# Runs on 18 weekly origins from Feb 2, 2026 to Jun 1, 2026. +# Covers the high-volatility Persian Gulf geopolitical price shock and its +# aftermath. The end date is set to the latest origin whose longest horizon +# (21 business days) still resolves against available data — keep it at +# most 21 business days behind the most recent cached WTI price (see +# scripts/fetch_wti.py) so every origin fully resolves. # Target is WTI Crude Oil price (yfinance ticker: CL=F). # Horizons: 5, 10, 21 business days. @@ -9,8 +13,9 @@ spec_id: energy_oil_eval description: >- Prospective/out-of-sample evaluation period in 2026 for daily WTI crude oil. - Evaluates selected contender models on 8 weekly origins during the early 2026 - geopolitical price shock to measure adaptive real-time forecasting performance. + Evaluates selected contender models on 18 weekly origins from the early 2026 + geopolitical price shock through its aftermath, to measure adaptive + real-time forecasting performance. tasks: - task_id: wti_oil_price_forecast @@ -22,6 +27,6 @@ tasks: projected 5, 10, and 21 trading days ahead. start: "2026-02-02" -end: "2026-03-23" +end: "2026-06-01" stride: 5 warmup: 250 diff --git a/implementations/energy_oil_forecasting/specs/energy_oil_eval_smoke.yaml b/implementations/energy_oil_forecasting/specs/energy_oil_eval_smoke.yaml index 86412a81..df48dd2f 100644 --- a/implementations/energy_oil_forecasting/specs/energy_oil_eval_smoke.yaml +++ b/implementations/energy_oil_forecasting/specs/energy_oil_eval_smoke.yaml @@ -4,7 +4,7 @@ # arena cheaply during development and end-to-end testing. # Use by setting SMOKE_TEST = True in the notebook setup cell. # -# Origin count : 2 (vs. 8 in the full eval) +# Origin count : 2 (vs. 18 in the full eval) # Warmup : 250 trading days (~1 year) of historical prices spec_id: energy_oil_eval_smoke diff --git a/implementations/energy_oil_forecasting/viz.py b/implementations/energy_oil_forecasting/viz.py index 51115f11..d70d1260 100644 --- a/implementations/energy_oil_forecasting/viz.py +++ b/implementations/energy_oil_forecasting/viz.py @@ -1215,3 +1215,273 @@ def prob_bar(val: float, width: int = 10) -> str: def conf_bar(conf: str) -> str: """Map confidence label to emoji indicator.""" return {"high": "🟢", "medium": "🟡", "low": "🔴"}.get(conf.lower(), "⚪") + + +# ── NB4 eval-diagnostic charts ──────────────────────────────────────────────── +# These read the tidy per-prediction frame from ``analysis.predictions_to_frame`` +# (one row per predictor × origin × horizon) and answer three questions the bare +# leaderboard can't: *where* the ranking is decided (heatmap), whether a lead is +# real or noise (leaderboard with error bars), and *what* the methods actually +# forecast vs reality (trajectory chart). + +# Qualitative palette for an arbitrary, growing predictor set. Stable per call: +# colours are assigned by sorted predictor name so a method keeps its colour +# across the heatmap, leaderboard, and trajectory charts within one notebook run. +_PREDICTOR_PALETTE = [ + "#1f77b4", + "#ff7f0e", + "#2ca02c", + "#d62728", + "#9467bd", + "#8c564b", + "#e377c2", + "#7f7f7f", + "#bcbd22", + "#17becf", + "#393b79", + "#b5651d", +] + + +def predictor_colors(predictors: list[str]) -> dict[str, str]: + """Assign a stable colour to each predictor name.""" + return {name: _PREDICTOR_PALETTE[i % len(_PREDICTOR_PALETTE)] for i, name in enumerate(predictors)} + + +def make_crps_heatmap(per_horizon_df: pd.DataFrame) -> go.Figure: + """Predictor × horizon mean-CRPS heatmap (lower = better, sorted best-first). + + Expects the output of ``analysis.per_horizon_crps`` — horizon columns plus a + final ``All`` column. Reveals which horizon decides the ranking: typically the + short horizons are a wash and one long horizon dominates the mean. + """ + df = per_horizon_df.copy() + # Best predictor on top: reverse so plotly's bottom-up y-axis shows it first. + df = df.iloc[::-1] + z = df.to_numpy(dtype=float) + fig = go.Figure( + go.Heatmap( + z=z, + x=list(df.columns), + y=list(df.index), + colorscale="RdYlGn_r", + colorbar={"title": "CRPS"}, + text=[[f"{v:.2f}" if np.isfinite(v) else "" for v in row] for row in z], + texttemplate="%{text}", + textfont={"size": 12}, + hovertemplate="%{y}
%{x}: %{z:.3f}", + ) + ) + fig.update_layout( + title={"text": "Mean CRPS by Predictor × Horizon (lower = better)", "font": {"size": 16}}, + xaxis={"title": "Horizon", "side": "top"}, + yaxis={"title": ""}, + template="plotly_white", + width=720, + height=40 * len(df) + 160, + margin={"t": 90, "b": 40, "l": 230, "r": 40}, + ) + # Visually separate the "All" summary column. + if "All" in per_horizon_df.columns: + fig.add_vline(x=len(per_horizon_df.columns) - 1.5, line={"color": "#333333", "width": 1.5}) + return fig + + +def make_leaderboard_interval_chart(board_df: pd.DataFrame) -> go.Figure: + """Mean CRPS ± standard error per predictor, exposing whether a lead is noise. + + Expects ``analysis.leaderboard_with_uncertainty``. When the error bars of the + top methods overlap heavily, the ranking is not statistically meaningful — the + honest read on a short eval window. + """ + df = board_df.iloc[::-1] # best at top of the bottom-up axis + fam_colors = {"Baseline": "#7f7f7f", "Numerical ML": "#1f77b4", "LLM / Agent": "#2ca02c", "Other": "#b5651d"} + colors = [fam_colors.get(f, "#b5651d") for f in df["family"]] + fig = go.Figure( + go.Scatter( + x=df["mean_crps"], + y=df.index, + mode="markers", + marker={"size": 11, "color": colors}, + error_x={"type": "data", "array": df["se"].fillna(0.0), "thickness": 1.6, "width": 6, "color": "#888888"}, + hovertemplate="%{y}
CRPS %{x:.3f} ± %{error_x.array:.3f}", + showlegend=False, + ) + ) + best = float(df["mean_crps"].min()) + fig.add_vline( + x=best, + line={"color": "#31a354", "dash": "dot", "width": 1.5}, + annotation_text=" best", + annotation_position="top", + annotation_font={"size": 11, "color": "#31a354"}, + ) + fig.update_layout( + title={"text": "Eval Leaderboard — Mean CRPS ± 1 SE (overlap ⇒ tied)", "font": {"size": 16}}, + xaxis={"title": "Mean CRPS (lower = better)", "showgrid": True, "gridcolor": "#f0f0f0"}, + yaxis={"title": ""}, + template="plotly_white", + width=760, + height=34 * len(df) + 150, + margin={"t": 70, "b": 50, "l": 230, "r": 40}, + ) + return fig + + +def make_eval_forecast_chart( + pred_frame: pd.DataFrame, + price_df: pd.DataFrame, + predictors: list[str], + *, + history_window: int = 25, +) -> go.Figure: + """Per-origin trajectory chart: each method's median + 80% band vs reality. + + One column per forecast origin. Shows the pre-origin price history, the + realised price path, and — for each selected predictor — point forecasts at + each horizon with 80% interval error bars. This is the "what are the top + methods actually doing" view: you can see who tracks the move, who lags, and + whose intervals are too tight. + """ + origins = sorted(pred_frame["as_of"].unique()) + colors = predictor_colors(predictors) + + titles = [] + for o_raw in origins: + o = pd.Timestamp(o_raw) + rows = price_df[price_df.index >= o.normalize()] + spot = f"${float(rows.iloc[0]['price']):.0f}" if not rows.empty else "" + titles.append(f"{o.strftime('%b %d, %Y')} WTI {spot}") + + fig = psp.make_subplots( + rows=1, cols=len(origins), subplot_titles=titles, shared_yaxes=True, horizontal_spacing=0.03 + ) + + for col, origin_raw in enumerate(origins, start=1): + origin = pd.Timestamp(origin_raw) + show_legend = col == 1 + sub = pred_frame[pred_frame["as_of"] == origin] + last_fdate = pd.Timestamp(sub["forecast_date"].max()) + + # Pre-origin history + realised future path. + hist = price_df[price_df.index <= origin.normalize()].iloc[-history_window:] + future = price_df[(price_df.index > origin.normalize()) & (price_df.index <= last_fdate)] + fig.add_trace( + go.Scatter( + x=hist.index.tolist(), + y=hist["price"].tolist(), + mode="lines", + line={"color": CLR_HISTORY, "width": 1.5}, + name="WTI history", + showlegend=show_legend, + legendgroup="hist", + ), + row=1, + col=col, + ) + fig.add_trace( + go.Scatter( + x=future.index.tolist(), + y=future["price"].tolist(), + mode="lines+markers", + line={"color": CLR_ACTUAL, "width": 2.5}, + marker={"size": 5}, + name="Realised price", + showlegend=show_legend, + legendgroup="actual", + ), + row=1, + col=col, + ) + + # Each predictor's median + 80% interval at every horizon. + for name in predictors: + pr = sub[sub["predictor"] == name].sort_values("forecast_date") + if pr.empty: + continue + err_hi = (pr["q80"] - pr["point"]).clip(lower=0).fillna(0.0) + err_lo = (pr["point"] - pr["q20"]).clip(lower=0).fillna(0.0) + fig.add_trace( + go.Scatter( + x=pr["forecast_date"].tolist(), + y=pr["point"].tolist(), + mode="lines+markers", + line={"color": colors[name], "width": 1.4, "dash": "dot"}, + marker={"size": 8, "symbol": "diamond"}, + error_y={ + "type": "data", + "symmetric": False, + "array": err_hi.tolist(), + "arrayminus": err_lo.tolist(), + "color": colors[name], + "thickness": 1.4, + "width": 4, + }, + name=name, + showlegend=show_legend, + legendgroup=name, + ), + row=1, + col=col, + ) + + fig.add_vline( + x=origin.timestamp() * 1000, line={"color": "#aaaaaa", "dash": "dash", "width": 1}, row=1, col=col + ) + + fig.update_layout( + title={"text": "Eval Forecasts vs Reality — Median + 80% Interval by Origin", "font": {"size": 16}}, + template="plotly_white", + width=max(420 * len(origins), 720), + height=480, + margin={"t": 80, "b": 110, "l": 60, "r": 20}, + legend={"orientation": "h", "y": -0.18, "x": 0.0, "xanchor": "left", "font": {"size": 11}}, + ) + fig.update_xaxes(showgrid=True, gridcolor="#f0f0f0", tickfont={"size": 10}) + fig.update_yaxes(showgrid=True, gridcolor="#f0f0f0", tickfont={"size": 11}) + return fig + + +def render_rationales_html(rationale_df: pd.DataFrame, *, max_chars: int = 700) -> str: + """Render agent/LLM rationales as readable HTML cards with trace links. + + Expects ``analysis.extract_agent_rationales``. One card per (predictor, + origin), showing the overall rationale, the per-horizon note, and a link to + the Langfuse trace so the full agent reasoning is one click away. + """ + if rationale_df.empty: + return "

No agent/LLM rationales found in this run's metadata.

" + + def _clip(text: str) -> str: + text = (text or "").strip() + return text if len(text) <= max_chars else text[:max_chars].rsplit(" ", 1)[0] + " …" + + # One representative card per (predictor, origin) — the rationale is shared + # across horizons, so dedupe to the first row of each group. + seen: set[tuple[str, str]] = set() + cards: list[str] = [] + for _, r in rationale_df.sort_values(["predictor", "as_of"]).iterrows(): + key = (r["predictor"], str(pd.Timestamp(r["as_of"]).date())) + if key in seen: + continue + seen.add(key) + link = ( + f"🔗 Langfuse trace" + if r.get("trace_url") + else "" + ) + horizon_note = ( + f"
Horizon note: {_clip(r['horizon_rationale'])}
" + if r.get("horizon_rationale") + else "" + ) + cards.append( + f"
" + f"
" + f"{r['predictor']}" + f"{key[1]}   point ${r['point']:.1f}   {link}
" + f"
{_clip(r['rationale'])}
" + f"{horizon_note}
" + ) + return f"
{''.join(cards)}
" diff --git a/implementations/food_price_forecasting/02_food_cpi_experiment.ipynb b/implementations/food_price_forecasting/02_food_cpi_experiment.ipynb index 01bafd80..e5576a0e 100644 --- a/implementations/food_price_forecasting/02_food_cpi_experiment.ipynb +++ b/implementations/food_price_forecasting/02_food_cpi_experiment.ipynb @@ -2028,7 +2028,7 @@ ], "metadata": { "kernelspec": { - "display_name": "aieng-template-implementation (3.12.3)", + "display_name": ".venv", "language": "python", "name": "python3" }, diff --git a/implementations/food_price_forecasting/99_starter_agent.ipynb b/implementations/food_price_forecasting/99_starter_agent.ipynb index 269b693b..d055f9ae 100644 --- a/implementations/food_price_forecasting/99_starter_agent.ipynb +++ b/implementations/food_price_forecasting/99_starter_agent.ipynb @@ -229,7 +229,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/implementations/getting_started/concierge_agent/context/artifacts/README.md.md b/implementations/getting_started/concierge_agent/context/artifacts/README.md.md index bd4d6a07..4279d40e 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/README.md.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/README.md.md @@ -29,7 +29,7 @@ Every method can be used in one of two modes, and the distinction runs through t Each is independent and self-contained — pick the one that matches the problem you care about, and read that directory's `README.md` for the full walkthrough. They are numbered in a recommended order that mirrors the bootcamp progression — conventional numerical methods → LLM Processes → agents → agentic evaluation — but any one stands on its own, so jump straight to the problem you care about. -**Start here → #0 [`getting_started/`](implementations/getting_started/)** — one CPI series, one month ahead. The smallest end-to-end loop: a `Predictor`, a `BacktestSpec` and `EvalSpec`, naive + AutoARIMA baselines, CRPS scoring. The place to learn the evaluation framework before picking a domain below. Also includes [`99_repo_concierge.ipynb`](implementations/getting_started/99_repo_concierge.ipynb) — a lite-model repo guide for “how does this codebase work?” questions. +**Start here → #0 [`getting_started/`](implementations/getting_started/)** — one CPI series, one month ahead. The smallest end-to-end loop: a `Predictor`, a `BacktestSpec` and `EvalSpec`, naive + AutoARIMA baselines, CRPS scoring. The place to learn the evaluation framework before picking a domain below. Also includes [`99_repo_concierge.ipynb`](implementations/getting_started/99_repo_concierge.ipynb) — a lite-model repo guide for “how does this codebase work?” questions (`uv run adk run implementations/getting_started/concierge_agent` from the repo root). | # | Implementation | The problem | Concepts & techniques it demonstrates | | --- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/implementations/getting_started/concierge_agent/context/artifacts/aieng-forecasting__aieng__forecasting__data____init__.py.md b/implementations/getting_started/concierge_agent/context/artifacts/aieng-forecasting__aieng__forecasting__data____init__.py.md index 47acf3f0..c4ec9f1b 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/aieng-forecasting__aieng__forecasting__data____init__.py.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/aieng-forecasting__aieng__forecasting__data____init__.py.md @@ -3,12 +3,37 @@ kind: python ```python -"""Data service: adapters, series store, and cutoff enforcement.""" +"""Data service: adapters, series store, cutoff enforcement, and feature builders.""" from aieng.forecasting.data.context import ForecastContext +from aieng.forecasting.data.features import ( + StaticFrameAdapter, + apply_one_business_day_feature_lag, + business_daily_expand_from_releases, + business_daily_ffill, + canonical_three_col, + drop_weekend_timestamp_rows, + log_ratio_level_feature, + to_level_feature_from_daily, + to_log_return_feature, +) from aieng.forecasting.data.models import SeriesMetadata, SeriesRecord from aieng.forecasting.data.service import DataService -__all__ = ["DataService", "ForecastContext", "SeriesMetadata", "SeriesRecord"] +__all__ = [ + "DataService", + "ForecastContext", + "SeriesMetadata", + "SeriesRecord", + "StaticFrameAdapter", + "apply_one_business_day_feature_lag", + "business_daily_expand_from_releases", + "business_daily_ffill", + "canonical_three_col", + "drop_weekend_timestamp_rows", + "log_ratio_level_feature", + "to_level_feature_from_daily", + "to_log_return_feature", +] ``` diff --git a/implementations/getting_started/concierge_agent/context/artifacts/aieng-forecasting__aieng__forecasting__data__features.py.md b/implementations/getting_started/concierge_agent/context/artifacts/aieng-forecasting__aieng__forecasting__data__features.py.md new file mode 100644 index 00000000..59a94b9d --- /dev/null +++ b/implementations/getting_started/concierge_agent/context/artifacts/aieng-forecasting__aieng__forecasting__data__features.py.md @@ -0,0 +1,197 @@ +# Source: aieng-forecasting/aieng/forecasting/data/features.py + +kind: python + +```python +"""Reusable, leak-safe covariate feature builders. + +These pure-pandas helpers turn raw market/macro series into the canonical +``(timestamp, value, released_at)`` format consumed by +:class:`~aieng.forecasting.data.service.DataService`, applying the +point-in-time discipline that keeps backtests honest: + +- **One-business-day feature lag** (:func:`apply_one_business_day_feature_lag`): + the feature value at session *t* only uses information through *t-1*. +- **Business-day forward-fill** (:func:`business_daily_ffill`): reindex a daily + series onto a complete Mon–Fri calendar, carrying the last observation across + holidays the covariate's market observed but the target's did not. Without + this, a covariate can end a few days short of a forecast origin and Darts + raises ``past_covariates are not long enough``. +- **Release-driven daily expansion** (:func:`business_daily_expand_from_releases`): + expand a low-frequency series (e.g. monthly macro) onto a daily calendar using + its ``released_at`` stamps, so a value only becomes visible once published. + +They are deliberately instrument-agnostic — the same builders serve the S&P 500 +and WTI crude oil experiments — so covariate-panel construction stays a single +source of truth. Every builder returns a frame with exactly ``timestamp``, +``value`` and ``released_at`` columns; the :class:`DataService` cutoff then +guarantees predictor context views never include unavailable rows. +""" + +from __future__ import annotations + +import numpy as np +import pandas as pd +from aieng.forecasting.data.adapters.base import BaseAdapter + + +class StaticFrameAdapter(BaseAdapter): + """Adapter that returns a precomputed canonical DataFrame. + + Used to register a feature frame that has already been transformed (lagged, + differenced, expanded) by the builders in this module. + """ + + def __init__(self, frame: pd.DataFrame) -> None: + self._frame = frame.copy() + + def fetch(self) -> pd.DataFrame: + """Return a copy of the precomputed frame.""" + return self._frame.copy() + + +def canonical_three_col(df: pd.DataFrame) -> pd.DataFrame: + """Coerce to a tidy, tz-naive ``(timestamp, value, released_at)`` frame.""" + out = df.copy() + out["timestamp"] = pd.to_datetime(out["timestamp"]).dt.tz_localize(None) + out["released_at"] = pd.to_datetime(out["released_at"]).dt.tz_localize(None) + out["value"] = pd.to_numeric(out["value"], errors="coerce") + out = out.dropna(subset=["timestamp", "released_at", "value"]).sort_values("timestamp") + return out[["timestamp", "value", "released_at"]].reset_index(drop=True) + + +def drop_weekend_timestamp_rows(df: pd.DataFrame) -> pd.DataFrame: + r"""Remove rows whose ``timestamp`` is Saturday or Sunday. + + Some FRED daily series (notably effective fed funds ``DFF``) include weekend + dates in early vintages. Forecast tasks and Darts regression models use + ``freq="B"`` (pandas Mon--Fri business days); ``TimeSeries.from_dataframe`` + with ``fill_missing_dates=True`` then raises if any input stamp is not on + that grid. + """ + if df.empty: + return df + x = df.copy() + ts = pd.to_datetime(x["timestamp"]) + return x.loc[ts.dt.dayofweek < 5].reset_index(drop=True) + + +def to_log_return_feature(close_df: pd.DataFrame) -> pd.DataFrame: + """Close-to-close log return of a daily price series. + + ``released_at`` is set to the next business day after the session: a daily + close is known after market close, so the model only sees it from the + following business day. + """ + out = close_df.copy() + out = out[out["value"] > 0].reset_index(drop=True) + out["value"] = np.log(out["value"] / out["value"].shift(1)) + out = out.dropna(subset=["value"]).reset_index(drop=True) + out["released_at"] = pd.to_datetime(out["timestamp"]) + pd.offsets.BDay(1) + return canonical_three_col(out[["timestamp", "value", "released_at"]]) + + +def to_level_feature_from_daily(close_df: pd.DataFrame) -> pd.DataFrame: + """Daily level with a next-business-day ``released_at`` (no transformation).""" + out = close_df.copy() + out["released_at"] = pd.to_datetime(out["timestamp"]) + pd.offsets.BDay(1) + return canonical_three_col(out[["timestamp", "value", "released_at"]]) + + +def business_daily_expand_from_releases( + sparse_df: pd.DataFrame, + *, + start: str, + end: str | None, +) -> pd.DataFrame: + """Expand a release-stamped series onto a daily business calendar. + + Each value becomes visible on its ``released_at`` date and is carried + forward until the next release. Used for low-frequency macro series whose + publication lags the reference month. + """ + x = sparse_df.copy().sort_values("released_at").reset_index(drop=True) + lo = pd.Timestamp(start) + hi = pd.Timestamp(end) if end is not None else x["released_at"].max() + pd.offsets.BDay(1) + if hi < lo: + return pd.DataFrame(columns=["timestamp", "value", "released_at"]) + daily_idx = pd.bdate_range(lo, hi) + rel = x.set_index("released_at")["value"].reindex(daily_idx).ffill() + out = rel.reset_index() + out.columns = ["timestamp", "value"] + out = out.dropna(subset=["value"]).reset_index(drop=True) + out["released_at"] = out["timestamp"] + return canonical_three_col(out) + + +def apply_one_business_day_feature_lag(df: pd.DataFrame) -> pd.DataFrame: + """Shift values so the feature at *t* only uses information through *t-1*.""" + x = df.copy().sort_values("timestamp").reset_index(drop=True) + x["value"] = x["value"].shift(1) + x = x.dropna(subset=["value"]).reset_index(drop=True) + # After lagging, the shifted value is available at row timestamp. + x["released_at"] = x["timestamp"] + return canonical_three_col(x) + + +def business_daily_ffill(df: pd.DataFrame) -> pd.DataFrame: + """Reindex a daily feature onto a complete business-day calendar, forward-filling. + + Daily market series follow different holiday calendars (e.g. the bond market + closes on Columbus Day and Veterans Day while equities trade). Without this, + such a covariate ends a few days short of a target origin and Darts raises + ``past_covariates are not long enough``, silently skipping those origins for + the covariate-using models. + + Forward-filling carries the last observed value across those gaps (and onto + every Mon–Fri business day), so the covariate is defined wherever the target + is. It is leak-safe: it only repeats already-known past information, and the + one-business-day feature lag is still applied afterwards. + """ + if df.empty: + return df + x = df.copy().sort_values("timestamp").reset_index(drop=True) + idx = pd.bdate_range(x["timestamp"].min(), x["timestamp"].max()) + filled = x.set_index("timestamp")["value"].reindex(idx).ffill() + out = filled.reset_index() + out.columns = ["timestamp", "value"] + out = out.dropna(subset=["value"]).reset_index(drop=True) + out["released_at"] = out["timestamp"] + return canonical_three_col(out) + + +def log_ratio_level_feature( + numerator_df: pd.DataFrame, + denominator_df: pd.DataFrame, +) -> pd.DataFrame: + """``log(numerator / denominator)`` as a daily level feature. + + Both inputs are daily ``(timestamp, value)`` close frames. They are inner- + joined on ``timestamp`` (only sessions both series traded), the log ratio is + taken, then forward-filled onto a complete business-day calendar and lagged + one business day. Useful for term-structure / pair spreads such as the + USL/USO oil-futures contango proxy. + """ + num = numerator_df[["timestamp", "value"]].copy() + den = denominator_df[["timestamp", "value"]].copy() + merged = pd.merge(num, den, on="timestamp", how="inner", suffixes=("_num", "_den")) + merged = merged[(merged["value_num"] > 0) & (merged["value_den"] > 0)].reset_index(drop=True) + merged["value"] = np.log(merged["value_num"] / merged["value_den"]) + merged["released_at"] = pd.to_datetime(merged["timestamp"]) + pd.offsets.BDay(1) + frame = canonical_three_col(merged[["timestamp", "value", "released_at"]]) + frame = business_daily_ffill(frame) + return apply_one_business_day_feature_lag(frame) + + +__all__ = [ + "StaticFrameAdapter", + "apply_one_business_day_feature_lag", + "business_daily_expand_from_releases", + "business_daily_ffill", + "canonical_three_col", + "drop_weekend_timestamp_rows", + "log_ratio_level_feature", + "to_level_feature_from_daily", + "to_log_return_feature", +] +``` diff --git a/implementations/getting_started/concierge_agent/context/artifacts/aieng-forecasting__aieng__forecasting__methods__agentic__predictor.py.md b/implementations/getting_started/concierge_agent/context/artifacts/aieng-forecasting__aieng__forecasting__methods__agentic__predictor.py.md index 86401bc3..6e613431 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/aieng-forecasting__aieng__forecasting__methods__agentic__predictor.py.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/aieng-forecasting__aieng__forecasting__methods__agentic__predictor.py.md @@ -240,10 +240,20 @@ class AgentPredictor(Predictor): def predictor_id(self) -> str: """Stable identifier for this predictor. - This is used to identify the predictor in the evaluation results. + This is used to identify the predictor in the evaluation results — and, + via the artefact cache, as a filename component. The model name is folded + in so the same agent run on different models yields distinct ids (and + distinct cache entries). When the proxy is active the agent's ``model`` is + a ``BaseLlm`` wrapper (e.g. ``LiteLlm``) rather than a bare string; in that + case we unwrap its nested ``.model`` (e.g. ``"openai/gemini-3.5-flash"``) + and keep the bare model name. Non-string models with no usable name are + omitted rather than leaking a noisy ``repr`` into the id. """ model = getattr(self._agent, "model", None) - model_suffix = f"_{model}" if isinstance(model, str) else "" + if not isinstance(model, str): + inner = getattr(model, "model", None) + model = inner if isinstance(inner, str) else None + model_suffix = f"_{model.rsplit('/', 1)[-1]}" if model else "" return f"agent_predictor_{self._agent.name}{model_suffix}_{self._forecast_output_modality}" def predict(self, task: ForecastingTask, context: ForecastContext) -> list[Prediction]: diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__README.md.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__README.md.md index 000ae99b..c8b6e6a4 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__README.md.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__README.md.md @@ -36,7 +36,7 @@ YAML backtest and eval specs live under each use case in `specs/`. Each director Every domain use case (all except `getting_started`) also ships a `starter_agent/` module and a `99_starter_agent.ipynb` — a fresh, hackable **starter agent** that is the consistent "build your own" entry point for that use case (toggleable news search + code execution, two lightweight tool-usage skills, an interactive cell, and one scored forecast). -`getting_started/` additionally ships a **`concierge_agent/`** module and **`99_repo_concierge.ipynb`** — a repo onboarding helper (not a forecaster) that answers questions about how the codebase works using a committed public-`main` knowledge digest. See that notebook for notebook and `adk run` usage. +`getting_started/` additionally ships a **`concierge_agent/`** module and **`99_repo_concierge.ipynb`** — a repo onboarding helper (not a forecaster) that answers questions about how the codebase works using a committed public-`main` knowledge digest. From the repository root: `uv run adk run implementations/getting_started/concierge_agent`. See [`getting_started/README.md`](getting_started/README.md) and the notebook for full usage. --- diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__boc_rate_decisions__02_boc_rate_direction_experiment.ipynb.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__boc_rate_decisions__02_boc_rate_direction_experiment.ipynb.md index f7909ba5..ec1c3093 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__boc_rate_decisions__02_boc_rate_direction_experiment.ipynb.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__boc_rate_decisions__02_boc_rate_direction_experiment.ipynb.md @@ -110,7 +110,7 @@ from IPython.display import Markdown, display # noqa: A004 warnings.filterwarnings("ignore") ROOT = Path.cwd().resolve().parents[1] -load_dotenv(ROOT / ".env") +load_dotenv(ROOT / ".env", override=False) from aieng.forecasting.evaluation import BacktestSpec, cached_backtest, describe_spec from boc_rate_decisions.analysis import ( diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__boc_rate_decisions__03_rationale_alignment.ipynb.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__boc_rate_decisions__03_rationale_alignment.ipynb.md index b7f1e490..2b037d5e 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__boc_rate_decisions__03_rationale_alignment.ipynb.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__boc_rate_decisions__03_rationale_alignment.ipynb.md @@ -53,7 +53,7 @@ from IPython.display import Markdown, display # noqa: A004 warnings.filterwarnings("ignore") ROOT = Path.cwd().resolve().parents[1] -load_dotenv(ROOT / ".env") +load_dotenv(ROOT / ".env", override=False) from aieng.forecasting.evaluation import EvalSpec, evaluate from boc_rate_decisions.data import DIRECTION_SERIES_ID, build_boc_service diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__boc_rate_decisions__99_starter_agent.ipynb.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__boc_rate_decisions__99_starter_agent.ipynb.md index 7ff97896..b314bfe2 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__boc_rate_decisions__99_starter_agent.ipynb.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__boc_rate_decisions__99_starter_agent.ipynb.md @@ -31,7 +31,7 @@ from dotenv import load_dotenv # Repo root holds the .env with PROXY_* creds the agent needs. ROOT = Path.cwd().resolve().parents[1] -load_dotenv(ROOT / ".env") +load_dotenv(ROOT / ".env", override=False) # ── Model selection ─────────────────────────────────── # Two project models: "gemini-3.1-flash-lite-preview" (lite/default) and diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__04_systematic_backtest_eval.ipynb.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__04_systematic_backtest_eval.ipynb.md index 424fc556..003940ad 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__04_systematic_backtest_eval.ipynb.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__04_systematic_backtest_eval.ipynb.md @@ -17,8 +17,12 @@ This notebook simulates a rigorous production forecasting workflow: (`energy_oil_eval.yaml`) during the geopolitical price shock — measuring adaptive real-time responsiveness and calibration. -All predictors use the same `Predictor` interface introduced in Notebooks 1–2. -Agent configs are imported from `energy_oil_forecasting.analyst_agent`. +The line-up spans three families behind one `Predictor` interface: **baselines** +(Naive, AutoARIMA), **numerical ML** (LightGBM ± a leak-safe covariate panel), +and **LLM/agent** methods (LLM-process forecasters and a news-reading analyst +agent) — the last run on *both* project models, `gemini-3.1-flash-lite-preview` +and `gemini-3.5-flash`. Every predictor is one toggle line in the registry in +Section 2. Agent configs come from `energy_oil_forecasting.analyst_agent`. ## Cell 2 (markdown) @@ -39,7 +43,11 @@ from aieng.forecasting.evaluation import ( cached_multi_backtest, describe_spec, ) -from energy_oil_forecasting.data import build_wti_service +from aieng.forecasting.models import ADVANCED_MODEL, LITE_MODEL +from energy_oil_forecasting.data import ( + DEFAULT_WTI_COVARIATE_SERIES_IDS, + build_wti_multivariate_service, +) warnings.filterwarnings("ignore") @@ -50,17 +58,27 @@ warnings.filterwarnings("ignore") # 51 backtest + 8 eval origins; smoke runs 2 + 2. SMOKE_TEST = True -# ── Model selection ─────────────────────────────────────────────────────────── -# Two project models: "gemini-3.1-flash-lite-preview" (lite/default) and -# "gemini-3.5-flash" (advanced). Change these two lines to swap models for the -# whole notebook (bare proxy names — no "gemini/" prefix). -AGENT_MODEL = "gemini-3.1-flash-lite-preview" -LLMP_MODEL = "gemini-3.1-flash-lite-preview" +# ── Models ──────────────────────────────────────────────────────────────────── +# The project standardises on two Vector-proxy models. Every LLM and agent +# predictor below is run once per model so we can compare them head-to-head. +# (bare proxy names — no "gemini/" prefix) +MODELS = [LITE_MODEL, ADVANCED_MODEL] # "gemini-3.1-flash-lite-preview", "gemini-3.5-flash" # ── Derived settings (do not edit below) ───────────────────────────────────── -N_SAMPLES = 1 if SMOKE_TEST else 3 # trajectories per LLMP call +N_SAMPLES = 1 if SMOKE_TEST else 3 # trajectories per LLMP-Sampled call + +# LightGBM hyperparameters (shared by the univariate and +covariate variants). +LAGS = 21 # one trading month of lagged target/covariate history +NUM_SAMPLES_LGBM = 100 if SMOKE_TEST else 200 # Monte-Carlo draws for quantiles +LGBM_KWARGS = {"num_threads": 1, "n_jobs": 1, "verbosity": -1} # deterministic, quiet -data_service = build_wti_service() +# Data service: WTI target + a leak-safe covariate panel (all Yahoo Finance — +# Brent, natural gas, gasoline, gold, USD index, the USL/USO futures-curve +# contango proxy, and VIX). Non-covariate predictors simply ignore the extras, +# so one service feeds the whole leaderboard. Unavailable tickers are skipped +# with a warning, so this still runs offline / under partial connectivity. +data_service = build_wti_multivariate_service() +COVARIATES = [c for c in DEFAULT_WTI_COVARIATE_SERIES_IDS if c in set(data_service.series_ids)] spec_dir = Path(energy_oil_forecasting.__file__).parent / "specs" if SMOKE_TEST: @@ -73,9 +91,8 @@ with open(spec_dir / backtest_file) as f: with open(spec_dir / eval_file) as f: eval_spec = MultiTargetBacktestSpec.model_validate(yaml.safe_load(f)) -print( - f"{'⚡ SMOKE MODE' if SMOKE_TEST else '📊 FULL MODE'} — AGENT_MODEL={AGENT_MODEL!r} LLMP_MODEL={LLMP_MODEL!r} N_SAMPLES={N_SAMPLES}" -) +print(f"{'⚡ SMOKE MODE' if SMOKE_TEST else '📊 FULL MODE'} — MODELS={MODELS} N_SAMPLES={N_SAMPLES}") +print(f"Covariates registered ({len(COVARIATES)}): {', '.join(COVARIATES) or '(none)'}") print() print("━" * 72) print("LOADED SPECIFICATIONS:") @@ -87,64 +104,125 @@ print(describe_spec(eval_spec, data_service)) ## Cell 4 (markdown) --- -## 2. Statistical Baseline +## 2. Candidate Predictors -This reference implementation uses **AutoARIMA** as its chosen statistical -method. The purpose of this notebook is to characterise AutoARIMA's -performance thoroughly — understanding where it succeeds, where it fails, and -in which regimes — so that the adaptive agent in Notebook 5 has a concrete -foundation to learn from. +This experiment puts a full slate of methods on the same `Predictor` interface and +the same rolling backtest, spanning three families: -The `Naive (Last Value)` predictor provides the floor: AutoARIMA should beat -it, and the margin tells us how much structure AutoARIMA extracts from the data. +| Family | Predictors | Role | +|---|---|---| +| **Baselines** | `Naive (Last Value)`, `AutoARIMA` | Carry-forward floor + the classical statistical anchor | +| **Numerical ML** | `LightGBM`, `LightGBM + cov` (+ optional `Prophet`) | Gradient-boosted quantile regression on lagged price (and a leak-safe covariate panel — Brent, gas, gasoline, gold, USD index, the futures-curve contango proxy, and VIX). LightGBM-with-covariates was the strongest method in the S&P 500 study. | +| **LLM / Agent** | `LLMP-Sampled`, `LLMP-Grid`, `News Agent` — each on **both** project models | LLM-process forecasters and a news-reading analyst agent, run on `gemini-3.1-flash-lite-preview` *and* `gemini-3.5-flash` | -> Other statistical and LLM-based methods are explored in separate reference -> implementations. You can uncomment the commented-out predictors below to -> compare, but they are not the focus of this experiment. - -| Predictor | Role | -|---|---| -| `LastValuePredictor` | Lower bound — carry-forward baseline | -| `DartsAutoARIMAPredictor` | **Primary statistical method** — the anchor for adaptive agent training | +The predictor cell below is a **registry**: every method is one line with an +`enabled` flag. Flip a flag to add or drop a predictor — the rest of the +notebook (backtest, scoring, eval, scorecard) iterates over whatever is active. +The two baselines are flagged `baseline=True` and are the only results written to +`adaptive_agent/curriculum/` for Notebooks 5–6, so toggling the others never +disturbs the downstream training data. ## Cell 5 (code) ```python +from dataclasses import dataclass +from typing import Callable + from aieng.forecasting.methods import ( LastValuePredictor, - QuantileGridLLMPredictor, # noqa: F401 - QuantileGridLLMPredictorConfig, # noqa: F401 - SampledTrajectoryLLMPredictor, # noqa: F401 - SampledTrajectoryLLMPredictorConfig, # noqa: F401 + QuantileGridLLMPredictor, + QuantileGridLLMPredictorConfig, + SampledTrajectoryLLMPredictor, + SampledTrajectoryLLMPredictorConfig, ) from aieng.forecasting.methods.numerical.darts_arima import DartsAutoARIMAPredictor -from energy_oil_forecasting.analyst_agent import build_wti_agent_predictor, build_wti_news_config # noqa: F401 -from energy_oil_forecasting.prophet_baseline import ProphetPredictor # noqa: F401 - - -# ── Predictors ──────────────────────────────────────────────────────────────── -# AutoARIMA is the primary method; Naive is the lower-bound baseline. -# Both are evaluated in every section — no contender selection needed. -# NOTE: AutoARIMA re-fits at every origin (slow on first run; cached after). -PREDICTORS = { - "Naive (Last Value)": LastValuePredictor(), - "AutoARIMA": DartsAutoARIMAPredictor(), - # ── Optional comparisons (not the focus of this experiment) ────────────── - # "Prophet": ProphetPredictor(), - # f"LLMP-Sampled ({LLMP_MODEL})": SampledTrajectoryLLMPredictor( - # SampledTrajectoryLLMPredictorConfig(model=LLMP_MODEL, n_samples=N_SAMPLES) - # ), - # f"LLMP-Grid ({LLMP_MODEL})": QuantileGridLLMPredictor( - # QuantileGridLLMPredictorConfig(model=LLMP_MODEL) - # ), - # f"News Agent ({AGENT_MODEL})": build_wti_agent_predictor( - # build_wti_news_config(model=AGENT_MODEL) - # ), -} +from aieng.forecasting.methods.numerical.darts_regression import DartsLightGBMPredictor +from energy_oil_forecasting.analyst_agent import build_wti_agent_predictor, build_wti_news_config +from energy_oil_forecasting.prophet_baseline import ProphetPredictor + + +@dataclass +class PredictorEntry: + """One row in the experiment. Flip ``enabled`` to switch a predictor on/off.""" + + name: str + factory: Callable[[], object] # lazy — built only when enabled + enabled: bool = True + baseline: bool = False # baselines are saved to curriculum/ for NB05–06 + + +# LLM / agent factories — each takes a model so the same recipe runs on both. +# LLMP-Sampled optionally serializes the covariate panel into the prompt +# (labeled exogenous-series blocks); the others are target-only. A distinct +# variant_tag keeps the +cov run separate in the cache and on the leaderboard. +def _llmp_sampled(model, covariates=None): + return SampledTrajectoryLLMPredictor( + SampledTrajectoryLLMPredictorConfig( + model=model, + n_samples=N_SAMPLES, + covariate_series_ids=covariates, + variant_tag="cov" if covariates else None, + ) + ) + + +def _llmp_grid(model): + return QuantileGridLLMPredictor(QuantileGridLLMPredictorConfig(model=model)) + + +def _news_agent(model): + return build_wti_agent_predictor(build_wti_news_config(model=model)) + + +# ── Experiment registry ─────────────────────────────────────────────────────── +# Toggle `enabled` on any line to include/exclude that predictor. LLM and agent +# methods are listed once per model so each can be switched on/off individually. +REGISTRY = [ + # Baselines — always saved to curriculum/ for the adaptive-agent notebooks. + PredictorEntry("Naive (Last Value)", LastValuePredictor, enabled=True, baseline=True), + PredictorEntry("AutoARIMA", DartsAutoARIMAPredictor, enabled=True, baseline=True), + # Numerical ML — LightGBM was the strongest method in the S&P 500 study. + PredictorEntry( + "LightGBM", + lambda: DartsLightGBMPredictor(lags=LAGS, num_samples=NUM_SAMPLES_LGBM, lgbm_kwargs=LGBM_KWARGS), + enabled=True, + ), + PredictorEntry( + "LightGBM + cov", + lambda: DartsLightGBMPredictor( + lags=LAGS, + lags_past_covariates=LAGS, + covariate_series_ids=COVARIATES, + num_samples=NUM_SAMPLES_LGBM, + lgbm_kwargs=LGBM_KWARGS, + ), + enabled=True, + ), + PredictorEntry("Prophet", ProphetPredictor, enabled=False), + # LLM processes and the news agent — one row per model in MODELS. + PredictorEntry(f"LLMP-Sampled ({LITE_MODEL})", lambda: _llmp_sampled(LITE_MODEL), enabled=True), + PredictorEntry(f"LLMP-Sampled ({ADVANCED_MODEL})", lambda: _llmp_sampled(ADVANCED_MODEL), enabled=True), + # LLMP-Sampled with the covariate panel serialized into the prompt — the one + # LLM method that can take covariates with no package change. Compare each of + # these against its target-only twin above to see if context helps the LLM. + PredictorEntry(f"LLMP-Sampled + cov ({LITE_MODEL})", lambda: _llmp_sampled(LITE_MODEL, COVARIATES), enabled=True), + PredictorEntry( + f"LLMP-Sampled + cov ({ADVANCED_MODEL})", lambda: _llmp_sampled(ADVANCED_MODEL, COVARIATES), enabled=True + ), + PredictorEntry(f"LLMP-Grid ({LITE_MODEL})", lambda: _llmp_grid(LITE_MODEL), enabled=True), + PredictorEntry(f"LLMP-Grid ({ADVANCED_MODEL})", lambda: _llmp_grid(ADVANCED_MODEL), enabled=True), + PredictorEntry(f"News Agent ({LITE_MODEL})", lambda: _news_agent(LITE_MODEL), enabled=True), + PredictorEntry(f"News Agent ({ADVANCED_MODEL})", lambda: _news_agent(ADVANCED_MODEL), enabled=True), +] + +# Instantiate only the enabled predictors (lazy factories skip the rest). +PREDICTORS = {e.name: e.factory() for e in REGISTRY if e.enabled} +_BASELINE_PREDICTORS = {e.name for e in REGISTRY if e.baseline} print(f"Active predictors ({len(PREDICTORS)}):") for name in PREDICTORS: - print(f" {name}") + tag = " (baseline → curriculum/)" if name in _BASELINE_PREDICTORS else "" + print(f" {name}{tag}") ``` ## Cell 6 (markdown) @@ -175,13 +253,15 @@ print("\nAll 2025 backtests complete.") --- ## 4. Performance Characterisation -We score both predictors on the 2025 backtest data: +We score every active predictor on the 2025 backtest data: - **CRPS** (Continuous Ranked Probability Score) — sharpness + calibration combined - **MAE at h=21d** — point forecast accuracy at the longest horizon -The key question is not which method to pick (we've already chosen AutoARIMA), -but *where* and *by how much* AutoARIMA beats the naive baseline — and where it -still struggles. Those gaps are exactly what the adaptive agent will learn to address. +The leaderboard ranks the families against each other — how much structure the +numerical methods (AutoARIMA, LightGBM ± covariates) extract over the naive +floor, whether the covariate panel earns its keep, and how the LLM/agent methods +compare across the two models. Where each method wins and where it struggles in +2025 is exactly the material the adaptive agent learns from in Notebook 5. ## Cell 9 (code) @@ -226,12 +306,11 @@ if not math.isnan(arima_crps): ```python # ── Save backtest results for NB05 / NB06 ──────────────────────────────────── -# Only the two baseline predictors are written to curriculum/ so that -# uncommenting the optional predictors above does not pollute the files -# that NB05 and NB06 depend on. +# Only the baseline predictors (flagged in the registry above) are written to +# curriculum/ so that toggling the other predictors on/off does not change the +# files NB05 and NB06 depend on. _CURRICULUM_DIR = Path("adaptive_agent/curriculum") _CURRICULUM_DIR.mkdir(exist_ok=True) -_BASELINE_PREDICTORS = {"Naive (Last Value)", "AutoARIMA"} for _name, _result_dict in backtest_results.items(): if _name not in _BASELINE_PREDICTORS: continue @@ -245,16 +324,16 @@ print(f"Saved {sum(n in _BASELINE_PREDICTORS for n in backtest_results)} backtes --- ## 5. 2026 Evaluation — Held-Out Test Period -We run both predictors on **8 weekly origins in early 2026** -(`energy_oil_eval.yaml`) — a period of major geopolitical volatility not -seen during the 2025 backtest. +We run every active predictor on **8 weekly origins in early 2026** +(`energy_oil_eval.yaml`) — a period of major geopolitical volatility not seen +during the 2025 backtest. This evaluation serves two purposes: -1. **Measure out-of-sample robustness** — does AutoARIMA's 2025 edge hold - under a structural regime shift? +1. **Measure out-of-sample robustness** — do the 2025 edges (statistical, + covariate, or LLM/agent) hold under a structural regime shift? 2. **Establish the stateless baseline** that the trained adaptive agents in - Notebook 6 are compared against. Both results are saved to - `adaptive_agent/curriculum/` for Notebooks 5 and 6 to load. + Notebook 6 are compared against. The baseline predictors' results are saved + to `adaptive_agent/curriculum/` for Notebooks 5 and 6 to load. ## Cell 12 (code) @@ -287,7 +366,7 @@ print(f"Saved {sum(n in _BASELINE_PREDICTORS for n in eval_results)} eval result --- ## 6. Scorecard -Out-of-sample performance of both stateless predictors on the 2026 eval period. +Out-of-sample performance of every active predictor on the 2026 eval period. These numbers are the **stateless baseline** the adaptive agent variants must beat in Notebook 6 to demonstrate that training added value. @@ -325,43 +404,53 @@ print(df_scorecard.to_string()) --- ## 7. Core Takeaways -1. **AutoARIMA beats the naive baseline** by extracting local autocorrelation - structure from the price history. In stable regimes, this translates to - noticeably better CRPS and MAE. +1. **Numerical methods beat the naive baseline** by extracting structure from the + price history — AutoARIMA via local autocorrelation, LightGBM via lagged + gradient-boosted quantiles. In stable regimes this translates to better CRPS. + +2. **Covariates can sharpen LightGBM.** The `LightGBM + cov` variant adds a + leak-safe panel (Brent, natural gas, gasoline, gold, the USD index, the + USL/USO futures-curve contango proxy, and VIX). Comparing it to plain + `LightGBM` isolates how much the cross-market context is worth — the same + lesson that made covariates decisive in the S&P 500 study. -2. **AutoARIMA fails under structural regime shifts.** It has no mechanism to - incorporate news, OPEC+ decisions, or geopolitical context. During the 2026 - price shock, it extrapolates past trends and produces systematically biased, - under-confident intervals. +3. **Tree models extrapolate poorly through regime shifts.** LightGBM forecasts + the price *level*, and gradient-boosted trees cannot predict outside the range + seen in training. When the 2026 shock pushes WTI to new levels, expect the + tree methods — like AutoARIMA — to lag and produce biased, under-confident + intervals. This is a structural limitation, not a tuning problem. -3. **These failure modes are learnable.** The backtest report surfaces exactly - which regimes and horizons are problematic — and that is precisely the - information we hand to the adaptive agent as training material in Notebook 5. +4. **LLM/agent methods bring a different prior.** The LLM-process forecasters and + the news-reading agent are run on both `gemini-3.1-flash-lite-preview` and + `gemini-3.5-flash`, so the scorecard shows both *method* and *model* effects — + and whether reading the news helps when the numerical methods are blindsided. -4. **The `Predictor` abstraction makes the comparison clean.** The same harness, - scoring functions, and eval spec work for both stateless methods and the - adaptive agent variants in Notebook 6. +5. **The `Predictor` abstraction makes the comparison clean.** The same harness, + scoring functions, covariate panel, and eval spec serve every family, and the + registry lets you switch any predictor on or off without touching the pipeline. --- ## 8. What stateless methods can't do -AutoARIMA is calibrated once and never updated. This is intentional here — -it creates a clean baseline — but it leaves a systematic gap: +Every method here is calibrated (or prompted) once and never updated between +rounds. This is intentional — it creates a clean baseline — but it leaves a +systematic gap: -- **No error feedback.** If AutoARIMA consistently produces intervals that are - too narrow in elevated-vol regimes, it will keep making the same mistake. - There is no mechanism to update calibration between rounds. +- **No error feedback.** If a method consistently produces intervals that are too + narrow in elevated-vol regimes, it keeps making the same mistake. There is no + mechanism to update calibration between rounds. -- **No market context.** AutoARIMA sees only price history. A human analyst - reviewing its output would immediately ask: *what's in the news?* +- **No strategy evolution.** Each prediction starts from the same prior (the same + fitted model, or the same prompt). Resolved outcomes disappear without + influencing future forecasts. -- **No strategy evolution.** Each prediction starts from the same prior. - Resolved outcomes disappear without influencing future forecasts. +- **Context without memory.** Even the news agent re-reads the world each origin; + it does not accumulate what worked. -→ **Notebook 5** introduces adaptive agents that study AutoARIMA's 2025 -performance, record systematic observations, and calibrate their strategies -accordingly. At inference time, each agent receives the live AutoARIMA estimate -and decides how to adjust it — applying what it learned from training. +→ **Notebook 5** introduces adaptive agents that study the 2025 backtest, +record systematic observations, and calibrate their strategies accordingly. At +inference time, each agent receives the live stateless estimate and decides how +to adjust it — applying what it learned from training. → **Notebook 6** evaluates whether any training approach actually improved out-of-sample performance on the held-out 2026 data. diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__99_starter_agent.ipynb.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__99_starter_agent.ipynb.md index bc374c34..33691c76 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__99_starter_agent.ipynb.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__99_starter_agent.ipynb.md @@ -31,7 +31,7 @@ from dotenv import load_dotenv # Repo root holds the .env with PROXY_* creds the agent needs. ROOT = Path.cwd().resolve().parents[1] -load_dotenv(ROOT / ".env") +load_dotenv(ROOT / ".env", override=False) # ── Model selection ─────────────────────────────────── # Two project models: "gemini-3.1-flash-lite-preview" (lite/default) and diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__analysis.py.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__analysis.py.md index 50901281..0d07636d 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__analysis.py.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__analysis.py.md @@ -11,6 +11,7 @@ tables and scoring metrics. Kept separate from notebooks so they can be tested. from __future__ import annotations +from datetime import datetime, timezone from typing import Any import numpy as np @@ -35,8 +36,19 @@ def score_backtest_results( data_service: DataService, *, mae_horizon: int = 21, + actuals_as_of: datetime | None = None, ) -> dict[str, float]: - """Aggregate CRPS, MAE at a horizon, and 80% CI coverage for backtest results.""" + """Aggregate CRPS, MAE at a horizon, and 80% CI coverage for backtest results. + + ``actuals_as_of`` is the cutoff used to look up realised target values when + scoring MAE and coverage. It defaults to *now* so that every forecast which + has already resolved is scored — using ``result.spec.end`` instead would hide + every horizon that resolves after the backtest window (which, for a short + eval window, is all of them, leaving MAE/coverage ``nan``). This is post-hoc + scoring of realised outcomes, not a forecast-time view, so a late cutoff is + correct and introduces no leakage. + """ + resolved_as_of = actuals_as_of or datetime.now(tz=timezone.utc).replace(tzinfo=None) all_scores: list[float] = [] mae_errors: list[float] = [] coverage_hits: list[float] = [] @@ -44,7 +56,7 @@ def score_backtest_results( for result in results.values(): all_scores.extend(result.scores) task = result.spec.task - actual_df = data_service.get_series(task.target_series_id, as_of=result.spec.end) + actual_df = data_service.get_series(task.target_series_id, as_of=resolved_as_of) actual_by_date = { pd.Timestamp(row["timestamp"]).normalize(): float(row["value"]) for _, row in actual_df.iterrows() } diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__data.py.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__data.py.md index 0a0abfa7..fda424b9 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__data.py.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__energy_oil_forecasting__data.py.md @@ -10,15 +10,45 @@ close series (Yahoo Finance ticker ``CL=F``) under the canonical :data:`WTI_SERIES_ID`. Both the reference YAML specs under ``implementations/energy_oil_forecasting/specs/`` and the notebooks here reference the same ``series_id`` via this module. + +:func:`build_wti_multivariate_service` additionally registers a **leak-safe +covariate panel** for the covariate-bearing predictors (e.g. +:class:`~aieng.forecasting.methods.numerical.darts_regression.DartsLightGBMPredictor` +with ``covariate_series_ids=...``). The panel is entirely sourced from Yahoo +Finance — no FRED API key required — and reuses the shared, point-in-time +feature builders in :mod:`aieng.forecasting.data.features`: + +- Brent (``BZ=F``), natural gas (``NG=F``), RBOB gasoline (``RB=F``) and gold + (``GC=F``) close-to-close log returns — the energy complex plus an inflation/ + risk hedge. +- Trade-weighted-style USD index (``DX-Y.NYB``) log return — oil is USD-priced. +- An **oil-futures-curve** contango proxy: ``log(USL / USO)`` level, where + ``USL`` tracks a 12-month WTI strip and ``USO`` the front month, so a positive + value is contango and a negative value backwardation — a clean term-structure + signal with no contract-roll assembly. +- VIX (``^VIX``) level — broad risk/volatility sentiment. + +Every covariate is lagged one business day and forward-filled onto a complete +business-day calendar; the :class:`DataService` cutoff then guarantees predictor +context views never include unavailable rows. """ from __future__ import annotations +import warnings from datetime import datetime, timezone from pathlib import Path +import pandas as pd from aieng.forecasting.data import DataService, SeriesMetadata from aieng.forecasting.data.adapters.yfinance import YFinanceDailyAdapter +from aieng.forecasting.data.features import ( + StaticFrameAdapter, + apply_one_business_day_feature_lag, + log_ratio_level_feature, + to_level_feature_from_daily, + to_log_return_feature, +) def naive_utc_now() -> datetime: @@ -85,9 +115,191 @@ def build_wti_service(cache_dir: Path | None = None) -> DataService: return svc +# ── Covariate panel (all Yahoo Finance) ────────────────────────────────────── +SERIES_ID_BRENT_RETURN = "brent_log_ret_1b_l1b" +SERIES_ID_NATGAS_RETURN = "natgas_log_ret_1b_l1b" +SERIES_ID_GASOLINE_RETURN = "gasoline_log_ret_1b_l1b" +SERIES_ID_GOLD_RETURN = "gold_log_ret_1b_l1b" +SERIES_ID_DOLLAR_INDEX_RETURN = "dollar_index_log_ret_1b_l1b" +SERIES_ID_OIL_CURVE_CONTANGO = "oil_curve_contango_l1b" +SERIES_ID_VIX_LEVEL = "vix_level_l1b" + +#: Default covariate panel for :func:`build_wti_multivariate_service`. Ordered +#: energy-complex first, then macro/risk. Any series that cannot be fetched is +#: skipped (with a warning) unless ``strict_covariates=True``. +DEFAULT_WTI_COVARIATE_SERIES_IDS: list[str] = [ + SERIES_ID_BRENT_RETURN, + SERIES_ID_NATGAS_RETURN, + SERIES_ID_GASOLINE_RETURN, + SERIES_ID_GOLD_RETURN, + SERIES_ID_DOLLAR_INDEX_RETURN, + SERIES_ID_OIL_CURVE_CONTANGO, + SERIES_ID_VIX_LEVEL, +] + +# Yahoo Finance tickers backing each covariate. +_BRENT_TICKER = "BZ=F" +_NATGAS_TICKER = "NG=F" +_GASOLINE_TICKER = "RB=F" +_GOLD_TICKER = "GC=F" +_DOLLAR_INDEX_TICKER = "DX-Y.NYB" +_VIX_TICKER = "^VIX" +_OIL_FRONT_ETF_TICKER = "USO" # United States Oil Fund — front-month WTI +_OIL_12M_ETF_TICKER = "USL" # United States 12 Month Oil Fund — 12-month strip + + +def _load_yahoo_close_frame( + ticker: str, + *, + cache_dir: Path, + start: str, +) -> pd.DataFrame: + """Fetch a daily adjusted-close ``(timestamp, value)`` frame from Yahoo Finance.""" + adapter = YFinanceDailyAdapter(ticker, field="Adj Close", start=start, cache_dir=cache_dir) + raw = adapter.fetch() + frame = raw[["timestamp", "value"]].copy().sort_values("timestamp").reset_index(drop=True) + frame["value"] = pd.to_numeric(frame["value"], errors="coerce") + return frame.dropna(subset=["value"]).reset_index(drop=True) + + +def build_wti_multivariate_service( + cache_dir: Path | None = None, + *, + covariate_series_ids: list[str] | None = None, + strict_covariates: bool = False, + start: str = _WTI_HISTORY_START, +) -> DataService: + """Return a :class:`DataService` with the WTI target **and** a covariate panel. + + Builds on :func:`build_wti_service` (so the ``wti_crude_oil_price`` target id + and every YAML spec keep working unchanged), then registers the leak-safe + covariate series described in the module docstring. Hand the result to the + backtest harness and point a covariate-bearing predictor at the registered + ids, e.g.:: + + svc = build_wti_multivariate_service() + covs = [c for c in DEFAULT_WTI_COVARIATE_SERIES_IDS if c in set(svc.series_ids)] + DartsLightGBMPredictor(lags=21, lags_past_covariates=21, covariate_series_ids=covs) + + Non-covariate predictors simply ignore the extra series, so a single service + can feed an entire leaderboard. + + Parameters + ---------- + cache_dir : Path or None + yfinance CSV cache directory (shared with the target). Defaults to + :data:`DEFAULT_CACHE_DIR`. + covariate_series_ids : list[str] or None + Subset of :data:`DEFAULT_WTI_COVARIATE_SERIES_IDS` to register. ``None`` + registers the full default panel. + strict_covariates : bool + If ``True``, any covariate fetch/build failure raises. If ``False`` + (default), unavailable covariates are skipped with a warning so the + service still builds offline / under partial connectivity. + start : str + Earliest date requested from Yahoo Finance for the covariates. + """ + resolved_cache_dir: Path = cache_dir if cache_dir is not None else DEFAULT_CACHE_DIR + svc = build_wti_service(cache_dir=resolved_cache_dir) + + desired = set(covariate_series_ids if covariate_series_ids is not None else DEFAULT_WTI_COVARIATE_SERIES_IDS) + + def _handle_error(series_id: str, exc: Exception) -> None: + if strict_covariates: + raise RuntimeError(f"Failed to build required covariate {series_id!r}.") from exc + warnings.warn(f"Skipping unavailable covariate {series_id!r}: {exc}", stacklevel=2) + + # ── Daily log-return covariates (energy complex + gold) ─────────────────── + _return_covariates = { + SERIES_ID_BRENT_RETURN: (_BRENT_TICKER, "Brent crude (BZ=F) close-to-close log return, lagged 1 business day"), + SERIES_ID_NATGAS_RETURN: (_NATGAS_TICKER, "Henry Hub natural gas (NG=F) log return, lagged 1 business day"), + SERIES_ID_GASOLINE_RETURN: (_GASOLINE_TICKER, "RBOB gasoline (RB=F) log return, lagged 1 business day"), + SERIES_ID_GOLD_RETURN: (_GOLD_TICKER, "Gold (GC=F) log return, lagged 1 business day"), + SERIES_ID_DOLLAR_INDEX_RETURN: ( + _DOLLAR_INDEX_TICKER, + "US Dollar Index (DX-Y.NYB) log return, lagged 1 business day", + ), + } + for series_id, (ticker, description) in _return_covariates.items(): + if series_id not in desired: + continue + try: + close = _load_yahoo_close_frame(ticker, cache_dir=resolved_cache_dir, start=start) + feature = apply_one_business_day_feature_lag(to_log_return_feature(close)) + svc.register( + series_id, + StaticFrameAdapter(feature), + SeriesMetadata( + series_id=series_id, + description=description, + source=f"Yahoo Finance ({ticker}), derived", + units="log-return", + frequency="B", + table_id=f"yahoo:{ticker}:log-return-l1b", + ), + ) + except (RuntimeError, ValueError, KeyError) as exc: + _handle_error(series_id, exc) + + # ── Oil-futures-curve contango proxy: log(USL / USO) ────────────────────── + if SERIES_ID_OIL_CURVE_CONTANGO in desired: + try: + usl = _load_yahoo_close_frame(_OIL_12M_ETF_TICKER, cache_dir=resolved_cache_dir, start=start) + uso = _load_yahoo_close_frame(_OIL_FRONT_ETF_TICKER, cache_dir=resolved_cache_dir, start=start) + curve = log_ratio_level_feature(usl, uso) + svc.register( + SERIES_ID_OIL_CURVE_CONTANGO, + StaticFrameAdapter(curve), + SeriesMetadata( + series_id=SERIES_ID_OIL_CURVE_CONTANGO, + description=( + "WTI futures-curve shape: log(USL/USO) level (>0 contango, <0 backwardation), " + "lagged 1 business day" + ), + source="Yahoo Finance (USL, USO), derived", + units="log-ratio", + frequency="B", + table_id="yahoo:USL-USO:log-ratio-l1b", + ), + ) + except (RuntimeError, ValueError, KeyError) as exc: + _handle_error(SERIES_ID_OIL_CURVE_CONTANGO, exc) + + # ── VIX level ───────────────────────────────────────────────────────────── + if SERIES_ID_VIX_LEVEL in desired: + try: + vix_close = _load_yahoo_close_frame(_VIX_TICKER, cache_dir=resolved_cache_dir, start=start) + vix_level = apply_one_business_day_feature_lag(to_level_feature_from_daily(vix_close)) + svc.register( + SERIES_ID_VIX_LEVEL, + StaticFrameAdapter(vix_level), + SeriesMetadata( + series_id=SERIES_ID_VIX_LEVEL, + description="CBOE VIX close level, lagged 1 business day", + source=f"Yahoo Finance ({_VIX_TICKER})", + units="index-level", + frequency="B", + table_id="yahoo:^VIX:close-l1b", + ), + ) + except (RuntimeError, ValueError, KeyError) as exc: + _handle_error(SERIES_ID_VIX_LEVEL, exc) + + return svc + + __all__ = [ "DEFAULT_CACHE_DIR", + "DEFAULT_WTI_COVARIATE_SERIES_IDS", + "SERIES_ID_BRENT_RETURN", + "SERIES_ID_DOLLAR_INDEX_RETURN", + "SERIES_ID_GASOLINE_RETURN", + "SERIES_ID_GOLD_RETURN", + "SERIES_ID_NATGAS_RETURN", + "SERIES_ID_OIL_CURVE_CONTANGO", + "SERIES_ID_VIX_LEVEL", "WTI_SERIES_ID", + "build_wti_multivariate_service", "build_wti_service", "naive_utc_now", ] diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__food_price_forecasting__02_food_cpi_experiment.ipynb.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__food_price_forecasting__02_food_cpi_experiment.ipynb.md index 29f36b35..5261a1b7 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__food_price_forecasting__02_food_cpi_experiment.ipynb.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__food_price_forecasting__02_food_cpi_experiment.ipynb.md @@ -74,7 +74,7 @@ from dotenv import load_dotenv warnings.filterwarnings("ignore") ROOT = Path.cwd().resolve().parents[1] -load_dotenv(ROOT / ".env") +load_dotenv(ROOT / ".env", override=False) import importlib diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__food_price_forecasting__99_starter_agent.ipynb.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__food_price_forecasting__99_starter_agent.ipynb.md index 1ed8fe54..66606e8a 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__food_price_forecasting__99_starter_agent.ipynb.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__food_price_forecasting__99_starter_agent.ipynb.md @@ -31,7 +31,7 @@ from dotenv import load_dotenv # Repo root holds the .env with PROXY_* creds the agent needs. ROOT = Path.cwd().resolve().parents[1] -load_dotenv(ROOT / ".env") +load_dotenv(ROOT / ".env", override=False) # ── Model selection ─────────────────────────────────── # Two project models: "gemini-3.1-flash-lite-preview" (lite/default) and diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__99_repo_concierge.ipynb.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__99_repo_concierge.ipynb.md index 1ad6ff3a..8cd98d35 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__99_repo_concierge.ipynb.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__99_repo_concierge.ipynb.md @@ -34,6 +34,8 @@ to call the model. import warnings from pathlib import Path +from IPython.display import Markdown, display # noqa: A004 + warnings.filterwarnings("ignore") @@ -57,7 +59,7 @@ load_dotenv(ROOT / ".env", override=False) AGENT_MODEL = "gemini-3.1-flash-lite-preview" # ── Run guard ────────────────────────────────────── -RUN_AGENT = False +RUN_AGENT = True from getting_started.concierge_agent import build_concierge_config @@ -70,19 +72,16 @@ print("RUN_AGENT =", RUN_AGENT, "| model =", AGENT_MODEL) --- ## 1. Meet the concierge -The agent uses a **catalog + artifacts** knowledge pack under `concierge_agent/context/`: +The agent uses a **catalog + artifacts** knowledge pack shipped under `concierge_agent/context/` — no build step for participants. 1. **`search_repo_catalog`** — search metadata (paths, summaries, domains); cheap, run first. 2. **`fetch_repo_artifact`** — fetch full content for a catalog path (Python modules, READMEs, notebooks with **markdown + code cells**). -The pack is built from public `main` via `scripts/build_concierge_context.py` and indexes the full `aieng/forecasting` tree plus reference implementations. The `repo-navigation` skill has reference guides (no scripts). +Maintainers regenerate the pack from public `main` with `scripts/build_concierge_context.py` when library code or notebooks change. The `repo-navigation` skill has reference guides (no scripts). ## Cell 4 (code) ```python -from getting_started.concierge_agent import build_concierge_config - - config = build_concierge_config(model=AGENT_MODEL) print("Agent:", config.name) @@ -90,8 +89,8 @@ print("Search enabled: ", config.context_retrieval.enabled) print("Code-exec enabled: ", config.code_execution.enabled) print("Skills loaded: ", [p.name for p in config.skills_dirs]) print("Extra tools: ", [getattr(t, "__name__", repr(t)) for t in config.extra_tools]) -print("\n── System instruction (edit in concierge_agent/agent.py) ──\n") -print(config.instruction[:900], "...") +display(Markdown("### System instruction\n\n*Edit in `concierge_agent/agent.py`*")) +display(Markdown(config.instruction)) ``` ## Cell 5 (markdown) @@ -114,7 +113,7 @@ if RUN_AGENT: chat_agent = build_adk_agent(config) runner = AdkTextRunner(chat_agent, config=AdkTextRunnerConfig(app_name="repo_concierge_chat")) reply = await runner.run_text_async(QUESTION) # noqa: F704, PLE1142 - print(reply) + display(Markdown(reply)) else: print("RUN_AGENT is False — set it to True in the setup cell to ask the concierge.") ``` @@ -126,7 +125,7 @@ QUESTION = "How do I customize the way context is presented to an LLMP?" if RUN_AGENT: reply = await runner.run_text_async(QUESTION) # noqa: F704, F821, PLE1142 - print(reply) + display(Markdown(reply)) else: print("RUN_AGENT is False — set it to True to run this cell.") ``` @@ -138,7 +137,7 @@ QUESTION = "What's the difference between backtest() and evaluate()?" if RUN_AGENT: reply = await runner.run_text_async(QUESTION) # noqa: F704, F821, PLE1142 - print(reply) + display(Markdown(reply)) else: print("RUN_AGENT is False — set it to True to run this cell.") ``` @@ -150,7 +149,7 @@ QUESTION = "Where should I go after getting_started if I want to build agents?" if RUN_AGENT: reply = await runner.run_text_async(QUESTION) # noqa: F704, F821, PLE1142 - print(reply) + display(Markdown(reply)) else: print("RUN_AGENT is False — set it to True to run this cell.") ``` @@ -160,21 +159,21 @@ else: --- ## 3. Terminal mode — multi-turn conversations -For extended back-and-forth, use the ADK CLI in the integrated terminal. From this -directory (`implementations/getting_started/`): +For extended back-and-forth, use the ADK CLI from the **repository root**: ```bash -cd implementations/getting_started -uv run adk run concierge_agent +uv run adk run implementations/getting_started/concierge_agent ``` That loads the same `repo_concierge` agent (`gemini-3.1-flash-lite-preview`) with -`search_repo_knowledge` and the repo-navigation skill. +`search_repo_catalog`, `fetch_repo_artifact`, and the repo-navigation skill. -**Alternative:** `uv run adk web concierge_agent` opens a browser UI (same agent). +**Alternative:** `uv run adk web implementations/getting_started/concierge_agent` +opens a browser UI (same agent). From `implementations/getting_started/`, you can +also use the shorter `uv run adk run concierge_agent`. --- **Where next?** Forecasting starter agents live in each domain implementation's -`99_starter_agent.ipynb` (food, energy, BoC, S&P 500). This concierge only explains -the repo — open one of those when you're ready to build and score a forecaster. +`99_starter_agent.ipynb` (food, energy, BoC, S&P 500). This concierge helps you +navigate the repo — open one of those when you're ready to build and score a forecaster. diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__README.md.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__README.md.md index 205b88e7..17338152 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__README.md.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__README.md.md @@ -151,14 +151,17 @@ concierge** that answers onboarding questions, points you to the right notebooks and modules, and can quote snippets from the committed public-`main` catalog. - Notebook cells are gated by `RUN_AGENT` (safe `Run All`). -- For longer conversations, use the terminal from this directory: +- For longer conversations, run the ADK CLI from the **repository root**: ```bash - cd implementations/getting_started - uv run adk run concierge_agent + uv run adk run implementations/getting_started/concierge_agent ``` - (`uv run adk web concierge_agent` opens the same agent in a browser.) + (`uv run adk web implementations/getting_started/concierge_agent` opens the same + agent in a browser.) + + From `implementations/getting_started/`, the shorter `uv run adk run concierge_agent` + works too. This is different from each domain's `99_starter_agent.ipynb` — those are hackable **forecasting** agents; the concierge only explains the repo. diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__concierge_agent____init__.py.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__concierge_agent____init__.py.md index f8f6300f..c0a63c7d 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__concierge_agent____init__.py.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__concierge_agent____init__.py.md @@ -6,7 +6,8 @@ kind: python """Repo concierge agent — onboarding helper for the agentic-forecasting codebase. Exports the :class:`AgentConfig` factory and the knowledge-search tool. Pair -with ``99_repo_concierge.ipynb`` or ``adk run concierge_agent``. +with ``99_repo_concierge.ipynb`` or ``adk run implementations/getting_started/concierge_agent`` +from the repository root. """ from getting_started.concierge_agent.agent import build_concierge_config diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__concierge_agent__agent.py.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__concierge_agent__agent.py.md index 311ecf9f..5ad1b85f 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__concierge_agent__agent.py.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__concierge_agent__agent.py.md @@ -9,7 +9,8 @@ A lightweight ADK agent powered by ``LITE_MODEL`` (``gemini-3.1-flash-lite-previ It answers questions about the repository using a committed **catalog + artifacts** snapshot of public ``main`` — not the participant's local workspace. -Pair with ``99_repo_concierge.ipynb`` or ``adk run concierge_agent``. +Pair with ``99_repo_concierge.ipynb`` or ``adk run implementations/getting_started/concierge_agent`` +from the repository root. """ from __future__ import annotations diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__concierge_agent__catalog.py.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__concierge_agent__catalog.py.md index 9584e518..e7caba3a 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__concierge_agent__catalog.py.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__getting_started__concierge_agent__catalog.py.md @@ -120,10 +120,7 @@ def search_repo_catalog( """ terms = _tokenize(query) if not terms: - return ( - "No search terms found. Try e.g. " - "'DataService register' or 'energy notebook 02 agentic'." - ) + return "No search terms found. Try e.g. 'DataService register' or 'energy notebook 02 agentic'." domain_filter = _normalize_domain(domain) kind_filter = _normalize_kind(kind) @@ -226,9 +223,7 @@ def fetch_repo_artifact( body = artifact_path.read_text(encoding="utf-8") if section: extracted = _extract_section(body, section) - body = extracted or ( - f"(Section {section!r} not found in artifact; showing beginning.)\n\n" + body[:max_chars] - ) + body = extracted or (f"(Section {section!r} not found in artifact; showing beginning.)\n\n" + body[:max_chars]) if len(body) > max_chars: body = body[:max_chars] + "\n…\n" diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__sp500_forecasting__01_sp500_multivariate_backtest.ipynb.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__sp500_forecasting__01_sp500_multivariate_backtest.ipynb.md index adb4014b..c1750204 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__sp500_forecasting__01_sp500_multivariate_backtest.ipynb.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__sp500_forecasting__01_sp500_multivariate_backtest.ipynb.md @@ -132,7 +132,7 @@ def _repo_root() -> Path: ROOT = _repo_root() -load_dotenv(ROOT / ".env") # LLMP rows call the Vector proxy — need PROXY_* set +load_dotenv(ROOT / ".env", override=False) # LLMP rows call the Vector proxy — need PROXY_* set from aieng.forecasting.evaluation import ( MultiTargetBacktestSpec, diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__sp500_forecasting__99_starter_agent.ipynb.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__sp500_forecasting__99_starter_agent.ipynb.md index 246018cf..eafbc0a9 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__sp500_forecasting__99_starter_agent.ipynb.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__sp500_forecasting__99_starter_agent.ipynb.md @@ -31,7 +31,7 @@ from dotenv import load_dotenv # Repo root holds the .env with PROXY_* creds the agent needs. ROOT = Path.cwd().resolve().parents[1] -load_dotenv(ROOT / ".env") +load_dotenv(ROOT / ".env", override=False) # ── Model selection ─────────────────────────────────── # Two project models: "gemini-3.1-flash-lite-preview" (lite/default) and diff --git a/implementations/getting_started/concierge_agent/context/artifacts/implementations__sp500_forecasting__data.py.md b/implementations/getting_started/concierge_agent/context/artifacts/implementations__sp500_forecasting__data.py.md index 057c5132..5e88ec07 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/implementations__sp500_forecasting__data.py.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/implementations__sp500_forecasting__data.py.md @@ -59,6 +59,30 @@ import pandas as pd from aieng.forecasting.data import DataService, SeriesMetadata from aieng.forecasting.data.adapters import FREDAdapter, YFinanceDailyAdapter from aieng.forecasting.data.adapters.base import BaseAdapter +from aieng.forecasting.data.features import ( + StaticFrameAdapter, +) +from aieng.forecasting.data.features import ( + apply_one_business_day_feature_lag as _apply_one_business_day_feature_lag, +) +from aieng.forecasting.data.features import ( + business_daily_expand_from_releases as _business_daily_expand_from_releases, +) +from aieng.forecasting.data.features import ( + business_daily_ffill as _business_daily_ffill, +) +from aieng.forecasting.data.features import ( + canonical_three_col as _canonical_three_col, +) +from aieng.forecasting.data.features import ( + drop_weekend_timestamp_rows as _drop_weekend_timestamp_rows, +) +from aieng.forecasting.data.features import ( + to_level_feature_from_daily as _to_level_feature_from_daily, +) +from aieng.forecasting.data.features import ( + to_log_return_feature as _to_log_return_feature, +) _load_dotenv: Callable[..., Any] | None @@ -83,7 +107,7 @@ def _load_fred_dotenv() -> None: root = _repo_root() if root is None: return - _load_dotenv(root / ".env") + _load_dotenv(root / ".env", override=False) def _as_absolute_cache(path: Path | None) -> Path | None: @@ -220,16 +244,6 @@ class YahooFinanceDailyAdapter(BaseAdapter): return out -class StaticFrameAdapter(BaseAdapter): - """Adapter that returns a precomputed canonical DataFrame.""" - - def __init__(self, frame: pd.DataFrame) -> None: - self._frame = frame.copy() - - def fetch(self) -> pd.DataFrame: - return self._frame.copy() - - def _build_cumulative_log_return_frame(price_df: pd.DataFrame, window: int) -> pd.DataFrame: """One row per session: value = log(adj_close[t] / adj_close[t-window]). @@ -362,31 +376,6 @@ DEFAULT_COVARIATE_SERIES_IDS: list[str] = [ ] -def _canonical_three_col(df: pd.DataFrame) -> pd.DataFrame: - out = df.copy() - out["timestamp"] = pd.to_datetime(out["timestamp"]).dt.tz_localize(None) - out["released_at"] = pd.to_datetime(out["released_at"]).dt.tz_localize(None) - out["value"] = pd.to_numeric(out["value"], errors="coerce") - out = out.dropna(subset=["timestamp", "released_at", "value"]).sort_values("timestamp") - return out[["timestamp", "value", "released_at"]].reset_index(drop=True) - - -def _drop_weekend_timestamp_rows(df: pd.DataFrame) -> pd.DataFrame: - r"""Remove rows whose ``timestamp`` is Saturday or Sunday. - - Some FRED daily series (notably effective fed funds ``DFF``) include - weekend dates in early vintages. Forecast tasks and Darts regression models - use ``freq="B"`` (pandas Mon--Fri business days); ``TimeSeries.from_dataframe`` - with ``fill_missing_dates=True`` then raises if any input stamp is not on - that grid. - """ - if df.empty: - return df - x = df.copy() - ts = pd.to_datetime(x["timestamp"]) - return x.loc[ts.dt.dayofweek < 5].reset_index(drop=True) - - def _load_yahoo_close_frame( ticker: str, *, @@ -409,22 +398,6 @@ def _load_yahoo_close_frame( return frame.dropna(subset=["value"]).reset_index(drop=True) -def _to_log_return_feature(close_df: pd.DataFrame) -> pd.DataFrame: - out = close_df.copy() - out = out[out["value"] > 0].reset_index(drop=True) - out["value"] = np.log(out["value"] / out["value"].shift(1)) - out = out.dropna(subset=["value"]).reset_index(drop=True) - # Daily closes are known after market close; model sees them from next business day. - out["released_at"] = pd.to_datetime(out["timestamp"]) + pd.offsets.BDay(1) - return _canonical_three_col(out[["timestamp", "value", "released_at"]]) - - -def _to_level_feature_from_daily(close_df: pd.DataFrame) -> pd.DataFrame: - out = close_df.copy() - out["released_at"] = pd.to_datetime(out["timestamp"]) + pd.offsets.BDay(1) - return _canonical_three_col(out[["timestamp", "value", "released_at"]]) - - def _fred_frame( fred_id: str, *, @@ -435,62 +408,6 @@ def _fred_frame( return _canonical_three_col(adapter.fetch()) -def _business_daily_expand_from_releases( - monthly_df: pd.DataFrame, - *, - start: str, - end: str | None, -) -> pd.DataFrame: - x = monthly_df.copy().sort_values("released_at").reset_index(drop=True) - lo = pd.Timestamp(start) - hi = pd.Timestamp(end) if end is not None else x["released_at"].max() + pd.offsets.BDay(1) - if hi < lo: - return pd.DataFrame(columns=["timestamp", "value", "released_at"]) - daily_idx = pd.bdate_range(lo, hi) - rel = x.set_index("released_at")["value"].reindex(daily_idx).ffill() - out = rel.reset_index() - out.columns = ["timestamp", "value"] - out = out.dropna(subset=["value"]).reset_index(drop=True) - out["released_at"] = out["timestamp"] - return _canonical_three_col(out) - - -def _apply_one_business_day_feature_lag(df: pd.DataFrame) -> pd.DataFrame: - """Shift values so the feature at *t* only uses information through *t-1*.""" - x = df.copy().sort_values("timestamp").reset_index(drop=True) - x["value"] = x["value"].shift(1) - x = x.dropna(subset=["value"]).reset_index(drop=True) - # After lagging, the shifted value is available at row timestamp. - x["released_at"] = x["timestamp"] - return _canonical_three_col(x) - - -def _business_daily_ffill(df: pd.DataFrame) -> pd.DataFrame: - """Reindex a daily feature onto a complete business-day calendar, forward-filling. - - FRED bond / commodity series follow a different holiday calendar than the - NYSE-traded target — e.g. Columbus Day and Veterans Day, when the bond market - is closed but equities trade. Without this, such a covariate ends a few days - short of a target origin and Darts raises ``past_covariates are not long - enough``, silently skipping those origins for the covariate-using models. - - Forward-filling carries the last observed value across those gaps (and onto - every Mon–Fri business day), so the covariate is defined wherever the target - is. It is leak-safe: it only repeats already-known past information, and the - one-business-day feature lag is still applied afterwards. - """ - if df.empty: - return df - x = df.copy().sort_values("timestamp").reset_index(drop=True) - idx = pd.bdate_range(x["timestamp"].min(), x["timestamp"].max()) - filled = x.set_index("timestamp")["value"].reindex(idx).ffill() - out = filled.reset_index() - out.columns = ["timestamp", "value"] - out = out.dropna(subset=["value"]).reset_index(drop=True) - out["released_at"] = out["timestamp"] - return _canonical_three_col(out) - - def _build_monthly_cpi_mom_feature( *, cache_dir: Path, diff --git a/implementations/getting_started/concierge_agent/context/artifacts/scripts__fetch_boc.py.md b/implementations/getting_started/concierge_agent/context/artifacts/scripts__fetch_boc.py.md index 65b456f8..ca304a89 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/scripts__fetch_boc.py.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/scripts__fetch_boc.py.md @@ -44,7 +44,7 @@ sys.path.insert(0, str(REPO_ROOT / "implementations")) from dotenv import load_dotenv -load_dotenv(REPO_ROOT / ".env") +load_dotenv(REPO_ROOT / ".env", override=False) from datetime import datetime, timezone diff --git a/implementations/getting_started/concierge_agent/context/artifacts/scripts__fetch_fred.py.md b/implementations/getting_started/concierge_agent/context/artifacts/scripts__fetch_fred.py.md index a8e3b6dc..5573a248 100644 --- a/implementations/getting_started/concierge_agent/context/artifacts/scripts__fetch_fred.py.md +++ b/implementations/getting_started/concierge_agent/context/artifacts/scripts__fetch_fred.py.md @@ -38,7 +38,7 @@ sys.path.insert(0, str(REPO_ROOT)) from dotenv import load_dotenv -load_dotenv(REPO_ROOT / ".env") +load_dotenv(REPO_ROOT / ".env", override=False) from aieng.forecasting.data import DataService, SeriesMetadata from aieng.forecasting.data.adapters import FREDAdapter diff --git a/implementations/getting_started/concierge_agent/context/catalog.yaml b/implementations/getting_started/concierge_agent/context/catalog.yaml index d033995d..9a6f8110 100644 --- a/implementations/getting_started/concierge_agent/context/catalog.yaml +++ b/implementations/getting_started/concierge_agent/context/catalog.yaml @@ -1,9 +1,9 @@ source_url: https://github.com/VectorInstitute/agentic-forecasting -git_ref: d4a22d05c7a9e86763a8d9b5e2891bcc24eda429 +git_ref: 0ac6b3098bdb529c08f2445895d82490de2404fd branch: main -built_at: '2026-06-25T15:12:49+00:00' +built_at: '2026-06-30T15:09:29+00:00' ingest_source: /home/coder/agentic-forecasting -entry_count: 195 +entry_count: 196 entries: - path: AGENTS.md kind: markdown @@ -46,7 +46,7 @@ entries: - Extending the foundation - Code quality - Documentation - chars: 14710 + chars: 14796 artifact: artifacts/README.md.md - path: aieng-forecasting/aieng/forecasting/__init__.py kind: python @@ -62,14 +62,24 @@ entries: - path: aieng-forecasting/aieng/forecasting/data/__init__.py kind: python domain: core.data - summary: 'Data service: adapters, series store, and cutoff enforcement.' + summary: 'Data service: adapters, series store, cutoff enforcement, and feature + builders.' symbols: - DataService - ForecastContext - SeriesMetadata - SeriesRecord - sections: [] - chars: 427 + - StaticFrameAdapter + - apply_one_business_day_feature_lag + - business_daily_expand_from_releases + - business_daily_ffill + - canonical_three_col + - drop_weekend_timestamp_rows + - log_ratio_level_feature + - to_level_feature_from_daily + - to_log_return_feature + sections: [] + chars: 1086 artifact: artifacts/aieng-forecasting__aieng__forecasting__data____init__.py.md - path: aieng-forecasting/aieng/forecasting/data/adapters/__init__.py kind: python @@ -142,6 +152,32 @@ entries: sections: [] chars: 2581 artifact: artifacts/aieng-forecasting__aieng__forecasting__data__cutoff.py.md +- path: aieng-forecasting/aieng/forecasting/data/features.py + kind: python + domain: core.data + summary: Reusable, leak-safe covariate feature builders. + symbols: + - StaticFrameAdapter + - canonical_three_col + - drop_weekend_timestamp_rows + - to_log_return_feature + - to_level_feature_from_daily + - business_daily_expand_from_releases + - apply_one_business_day_feature_lag + - business_daily_ffill + - log_ratio_level_feature + - StaticFrameAdapter + - apply_one_business_day_feature_lag + - business_daily_expand_from_releases + - business_daily_ffill + - canonical_three_col + - drop_weekend_timestamp_rows + - log_ratio_level_feature + - to_level_feature_from_daily + - to_log_return_feature + sections: [] + chars: 8565 + artifact: artifacts/aieng-forecasting__aieng__forecasting__data__features.py.md - path: aieng-forecasting/aieng/forecasting/data/models.py kind: python domain: core.data @@ -519,7 +555,7 @@ entries: - ForecastPromptBuilder - AgentPredictor sections: [] - chars: 13655 + chars: 14369 artifact: artifacts/aieng-forecasting__aieng__forecasting__methods__agentic__predictor.py.md - path: aieng-forecasting/aieng/forecasting/methods/baselines/__init__.py kind: python @@ -765,7 +801,7 @@ entries: - Directory layout - Relationship to `aieng-forecasting` - Adding a new use case - chars: 3644 + chars: 3778 artifact: artifacts/implementations__README.md.md - path: implementations/__init__.py kind: python @@ -792,7 +828,7 @@ entries: sections: - "BoC Rate Decisions \u2014 3-Way Direction Prediction Experiment" - Viewing other meetings - chars: 27955 + chars: 27971 artifact: artifacts/implementations__boc_rate_decisions__02_boc_rate_direction_experiment.ipynb.md - path: implementations/boc_rate_decisions/03_rationale_alignment.ipynb kind: notebook @@ -801,7 +837,7 @@ entries: symbols: [] sections: - "BoC \u2014 Rationale-alignment evaluation (LLM-as-a-judge, on the side)" - chars: 11377 + chars: 11393 artifact: artifacts/implementations__boc_rate_decisions__03_rationale_alignment.ipynb.md - path: implementations/boc_rate_decisions/99_starter_agent.ipynb kind: notebook @@ -810,7 +846,7 @@ entries: symbols: [] sections: - "Bank of Canada Rate Decisions \u2014 Your Starter Agent" - chars: 8070 + chars: 8086 artifact: artifacts/implementations__boc_rate_decisions__99_starter_agent.ipynb.md - path: implementations/boc_rate_decisions/README.md kind: markdown @@ -1245,7 +1281,7 @@ entries: sections: - "WTI Crude Oil Price Forecasting \u2014 Stateless Methods: Systematic Backtest\ \ (Notebook 4 of 7)" - chars: 13343 + chars: 18735 artifact: artifacts/implementations__energy_oil_forecasting__04_systematic_backtest_eval.ipynb.md - path: implementations/energy_oil_forecasting/05_adaptive_agent_training.ipynb kind: notebook @@ -1285,7 +1321,7 @@ entries: symbols: [] sections: - "WTI Crude Oil \u2014 Your Starter Agent" - chars: 7557 + chars: 7573 artifact: artifacts/implementations__energy_oil_forecasting__99_starter_agent.ipynb.md - path: implementations/energy_oil_forecasting/README.md kind: markdown @@ -1535,7 +1571,7 @@ entries: - select_top_predictors - trajectory_mae_table sections: [] - chars: 6287 + chars: 6984 artifact: artifacts/implementations__energy_oil_forecasting__analysis.py.md - path: implementations/energy_oil_forecasting/analyst_agent/__init__.py kind: python @@ -1651,12 +1687,22 @@ entries: symbols: - naive_utc_now - build_wti_service + - build_wti_multivariate_service - DEFAULT_CACHE_DIR + - DEFAULT_WTI_COVARIATE_SERIES_IDS + - SERIES_ID_BRENT_RETURN + - SERIES_ID_DOLLAR_INDEX_RETURN + - SERIES_ID_GASOLINE_RETURN + - SERIES_ID_GOLD_RETURN + - SERIES_ID_NATGAS_RETURN + - SERIES_ID_OIL_CURVE_CONTANGO + - SERIES_ID_VIX_LEVEL - WTI_SERIES_ID + - build_wti_multivariate_service - build_wti_service - naive_utc_now sections: [] - chars: 3494 + chars: 13040 artifact: artifacts/implementations__energy_oil_forecasting__data.py.md - path: implementations/energy_oil_forecasting/paths.py kind: python @@ -1897,7 +1943,7 @@ entries: sections: - "Canada Food CPI \u2014 CFPR Replica Experiment" - 8.2 MAPE per category - chars: 26434 + chars: 26450 artifact: artifacts/implementations__food_price_forecasting__02_food_cpi_experiment.ipynb.md - path: implementations/food_price_forecasting/99_starter_agent.ipynb kind: notebook @@ -1906,7 +1952,7 @@ entries: symbols: [] sections: - "Food Price (CPI) \u2014 Your Starter Agent" - chars: 7733 + chars: 7749 artifact: artifacts/implementations__food_price_forecasting__99_starter_agent.ipynb.md - path: implementations/food_price_forecasting/README.md kind: markdown @@ -2259,7 +2305,7 @@ entries: symbols: [] sections: - "Repo Concierge \u2014 ask questions about this codebase" - chars: 5634 + chars: 5804 artifact: artifacts/implementations__getting_started__99_repo_concierge.ipynb.md - path: implementations/getting_started/README.md kind: markdown @@ -2282,7 +2328,7 @@ entries: - Where to go next - Directory layout - Key interfaces (from `aieng-forecasting`) - chars: 9228 + chars: 9367 artifact: artifacts/implementations__getting_started__README.md.md - path: implementations/getting_started/__init__.py kind: python @@ -2303,7 +2349,7 @@ entries: - search_repo_catalog - search_repo_knowledge sections: [] - chars: 713 + chars: 770 artifact: artifacts/implementations__getting_started__concierge_agent____init__.py.md - path: implementations/getting_started/concierge_agent/agent.py kind: python @@ -2313,7 +2359,7 @@ entries: symbols: - build_concierge_config sections: [] - chars: 4534 + chars: 4591 artifact: artifacts/implementations__getting_started__concierge_agent__agent.py.md - path: implementations/getting_started/concierge_agent/catalog.py kind: python @@ -2328,7 +2374,7 @@ entries: - fetch_repo_artifact - search_repo_catalog sections: [] - chars: 7426 + chars: 7365 artifact: artifacts/implementations__getting_started__concierge_agent__catalog.py.md - path: implementations/getting_started/concierge_agent/catalog_build.py kind: python @@ -2493,7 +2539,7 @@ entries: - "\u26A0\uFE0F Cutoff-aware evaluation \u2014 why the windows are what they are" - "Leaderboard \u2014 mean CRPS by method and horizon" - "Reading the LLMP \xB1 covariates rows" - chars: 20376 + chars: 20392 artifact: artifacts/implementations__sp500_forecasting__01_sp500_multivariate_backtest.ipynb.md - path: implementations/sp500_forecasting/99_starter_agent.ipynb kind: notebook @@ -2502,7 +2548,7 @@ entries: symbols: [] sections: - "S&P 500 \u2014 Your Starter Agent" - chars: 7839 + chars: 7855 artifact: artifacts/implementations__sp500_forecasting__99_starter_agent.ipynb.md - path: implementations/sp500_forecasting/README.md kind: markdown @@ -2572,7 +2618,6 @@ entries: symbols: - sp500_logret_series_id - YahooFinanceDailyAdapter - - StaticFrameAdapter - build_sp500_log_return_service - build_sp500_multivariate_service - DEFAULT_COVARIATE_SERIES_IDS @@ -2600,7 +2645,7 @@ entries: - build_sp500_multivariate_service - sp500_logret_series_id sections: [] - chars: 35434 + chars: 31632 artifact: artifacts/implementations__sp500_forecasting__data.py.md - path: implementations/sp500_forecasting/leaderboard.py kind: python @@ -2821,7 +2866,7 @@ entries: symbols: - main sections: [] - chars: 4192 + chars: 4208 artifact: artifacts/scripts__fetch_boc.py.md - path: scripts/fetch_boc_press_releases.py kind: python @@ -2861,7 +2906,7 @@ entries: - build_data_service - main sections: [] - chars: 6004 + chars: 6020 artifact: artifacts/scripts__fetch_fred.py.md - path: scripts/fetch_sp500_market.py kind: python diff --git a/implementations/getting_started/concierge_agent/skills/repo-navigation/references/catalog-summary.yaml b/implementations/getting_started/concierge_agent/skills/repo-navigation/references/catalog-summary.yaml index ee0ac757..14913f1b 100644 --- a/implementations/getting_started/concierge_agent/skills/repo-navigation/references/catalog-summary.yaml +++ b/implementations/getting_started/concierge_agent/skills/repo-navigation/references/catalog-summary.yaml @@ -1,13 +1,13 @@ # Concierge catalog summary (regenerated by scripts/build_concierge_context.py) source_url: https://github.com/VectorInstitute/agentic-forecasting branch: main -built_at: '2026-06-25T15:12:49+00:00' -git_ref: d4a22d05c7a9e86763a8d9b5e2891bcc24eda429 -entry_count: 195 +built_at: '2026-06-30T15:09:29+00:00' +git_ref: 0ac6b3098bdb529c08f2445895d82490de2404fd +entry_count: 196 domains: docs: 4 core.root: 3 - core.data: 11 + core.data: 12 core.documents: 5 core.evaluation: 9 core.methods: 26 diff --git a/implementations/sp500_forecasting/01_sp500_multivariate_backtest.ipynb b/implementations/sp500_forecasting/01_sp500_multivariate_backtest.ipynb index ad31bbdb..27842393 100644 --- a/implementations/sp500_forecasting/01_sp500_multivariate_backtest.ipynb +++ b/implementations/sp500_forecasting/01_sp500_multivariate_backtest.ipynb @@ -1601,7 +1601,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/implementations/sp500_forecasting/99_starter_agent.ipynb b/implementations/sp500_forecasting/99_starter_agent.ipynb index 1c93daf3..444e77f8 100644 --- a/implementations/sp500_forecasting/99_starter_agent.ipynb +++ b/implementations/sp500_forecasting/99_starter_agent.ipynb @@ -231,7 +231,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/implementations/sp500_forecasting/data.py b/implementations/sp500_forecasting/data.py index fdde328e..c187ec1c 100644 --- a/implementations/sp500_forecasting/data.py +++ b/implementations/sp500_forecasting/data.py @@ -54,6 +54,30 @@ from aieng.forecasting.data import DataService, SeriesMetadata from aieng.forecasting.data.adapters import FREDAdapter, YFinanceDailyAdapter from aieng.forecasting.data.adapters.base import BaseAdapter +from aieng.forecasting.data.features import ( + StaticFrameAdapter, +) +from aieng.forecasting.data.features import ( + apply_one_business_day_feature_lag as _apply_one_business_day_feature_lag, +) +from aieng.forecasting.data.features import ( + business_daily_expand_from_releases as _business_daily_expand_from_releases, +) +from aieng.forecasting.data.features import ( + business_daily_ffill as _business_daily_ffill, +) +from aieng.forecasting.data.features import ( + canonical_three_col as _canonical_three_col, +) +from aieng.forecasting.data.features import ( + drop_weekend_timestamp_rows as _drop_weekend_timestamp_rows, +) +from aieng.forecasting.data.features import ( + to_level_feature_from_daily as _to_level_feature_from_daily, +) +from aieng.forecasting.data.features import ( + to_log_return_feature as _to_log_return_feature, +) _load_dotenv: Callable[..., Any] | None @@ -215,16 +239,6 @@ def _read_cache(cache_path: Path) -> pd.DataFrame: return out -class StaticFrameAdapter(BaseAdapter): - """Adapter that returns a precomputed canonical DataFrame.""" - - def __init__(self, frame: pd.DataFrame) -> None: - self._frame = frame.copy() - - def fetch(self) -> pd.DataFrame: - return self._frame.copy() - - def _build_cumulative_log_return_frame(price_df: pd.DataFrame, window: int) -> pd.DataFrame: """One row per session: value = log(adj_close[t] / adj_close[t-window]). @@ -357,31 +371,6 @@ def _default_cache_dir() -> Path: ] -def _canonical_three_col(df: pd.DataFrame) -> pd.DataFrame: - out = df.copy() - out["timestamp"] = pd.to_datetime(out["timestamp"]).dt.tz_localize(None) - out["released_at"] = pd.to_datetime(out["released_at"]).dt.tz_localize(None) - out["value"] = pd.to_numeric(out["value"], errors="coerce") - out = out.dropna(subset=["timestamp", "released_at", "value"]).sort_values("timestamp") - return out[["timestamp", "value", "released_at"]].reset_index(drop=True) - - -def _drop_weekend_timestamp_rows(df: pd.DataFrame) -> pd.DataFrame: - r"""Remove rows whose ``timestamp`` is Saturday or Sunday. - - Some FRED daily series (notably effective fed funds ``DFF``) include - weekend dates in early vintages. Forecast tasks and Darts regression models - use ``freq="B"`` (pandas Mon--Fri business days); ``TimeSeries.from_dataframe`` - with ``fill_missing_dates=True`` then raises if any input stamp is not on - that grid. - """ - if df.empty: - return df - x = df.copy() - ts = pd.to_datetime(x["timestamp"]) - return x.loc[ts.dt.dayofweek < 5].reset_index(drop=True) - - def _load_yahoo_close_frame( ticker: str, *, @@ -404,22 +393,6 @@ def _load_yahoo_close_frame( return frame.dropna(subset=["value"]).reset_index(drop=True) -def _to_log_return_feature(close_df: pd.DataFrame) -> pd.DataFrame: - out = close_df.copy() - out = out[out["value"] > 0].reset_index(drop=True) - out["value"] = np.log(out["value"] / out["value"].shift(1)) - out = out.dropna(subset=["value"]).reset_index(drop=True) - # Daily closes are known after market close; model sees them from next business day. - out["released_at"] = pd.to_datetime(out["timestamp"]) + pd.offsets.BDay(1) - return _canonical_three_col(out[["timestamp", "value", "released_at"]]) - - -def _to_level_feature_from_daily(close_df: pd.DataFrame) -> pd.DataFrame: - out = close_df.copy() - out["released_at"] = pd.to_datetime(out["timestamp"]) + pd.offsets.BDay(1) - return _canonical_three_col(out[["timestamp", "value", "released_at"]]) - - def _fred_frame( fred_id: str, *, @@ -430,62 +403,6 @@ def _fred_frame( return _canonical_three_col(adapter.fetch()) -def _business_daily_expand_from_releases( - monthly_df: pd.DataFrame, - *, - start: str, - end: str | None, -) -> pd.DataFrame: - x = monthly_df.copy().sort_values("released_at").reset_index(drop=True) - lo = pd.Timestamp(start) - hi = pd.Timestamp(end) if end is not None else x["released_at"].max() + pd.offsets.BDay(1) - if hi < lo: - return pd.DataFrame(columns=["timestamp", "value", "released_at"]) - daily_idx = pd.bdate_range(lo, hi) - rel = x.set_index("released_at")["value"].reindex(daily_idx).ffill() - out = rel.reset_index() - out.columns = ["timestamp", "value"] - out = out.dropna(subset=["value"]).reset_index(drop=True) - out["released_at"] = out["timestamp"] - return _canonical_three_col(out) - - -def _apply_one_business_day_feature_lag(df: pd.DataFrame) -> pd.DataFrame: - """Shift values so the feature at *t* only uses information through *t-1*.""" - x = df.copy().sort_values("timestamp").reset_index(drop=True) - x["value"] = x["value"].shift(1) - x = x.dropna(subset=["value"]).reset_index(drop=True) - # After lagging, the shifted value is available at row timestamp. - x["released_at"] = x["timestamp"] - return _canonical_three_col(x) - - -def _business_daily_ffill(df: pd.DataFrame) -> pd.DataFrame: - """Reindex a daily feature onto a complete business-day calendar, forward-filling. - - FRED bond / commodity series follow a different holiday calendar than the - NYSE-traded target — e.g. Columbus Day and Veterans Day, when the bond market - is closed but equities trade. Without this, such a covariate ends a few days - short of a target origin and Darts raises ``past_covariates are not long - enough``, silently skipping those origins for the covariate-using models. - - Forward-filling carries the last observed value across those gaps (and onto - every Mon–Fri business day), so the covariate is defined wherever the target - is. It is leak-safe: it only repeats already-known past information, and the - one-business-day feature lag is still applied afterwards. - """ - if df.empty: - return df - x = df.copy().sort_values("timestamp").reset_index(drop=True) - idx = pd.bdate_range(x["timestamp"].min(), x["timestamp"].max()) - filled = x.set_index("timestamp")["value"].reindex(idx).ffill() - out = filled.reset_index() - out.columns = ["timestamp", "value"] - out = out.dropna(subset=["value"]).reset_index(drop=True) - out["released_at"] = out["timestamp"] - return _canonical_three_col(out) - - def _build_monthly_cpi_mom_feature( *, cache_dir: Path,