← Maqolalarga qaytish
August 20, 2026
5 daqiqa o'qish

Scoring Probabilistic Forecasts: CRPS, PIT Calibration, and DeepAR

Scoring Probabilistic Forecasts: CRPS, PIT Calibration, and DeepAR
#forecasting
#probabilistic
#quantile-regression
#DeepAR
#uncertainty

Bu blog nuqtaviy qiymat o'rniga taqsimotlarni prognoz qilish foydasini allaqachon asoslagan va interval qo'lga kiritilgach undan qanday foydalanishni ham ko'rsatgan: xavfni hisobga olgan pozitsiya hajmi uchun konformal prognoz taqsimotdan xoli intervallar hamda ulardan foydalanadigan hajmlash qoidasini chiqaradi, Temporal Fusion Transformer maqolasi esa ko'p kvantilli chiqish qatlamini beradi. Ammo bu ishlarning birortasi ishonishga arziydimi-yo'qmi, hal qiladigan masalani qamramaydi: prognoz taqsimotini qanday baholash va undagi ko'rsatilgan noaniqlik halol ekanini qanday tekshirish.

Ushbu maqola aynan shu haqida. Xususan, uchta masala:

  1. CRPS — ehtimolli prognozlar uchun to'g'ri scoring rule va TFT maqolasida allaqachon berilgan pinball loss bilan aniq bog'liqligi.
  2. PIT gistogrammasi — model qanday noto'g'ri kalibrlanganini, shunchaki noto'g'ri kalibrlangan yoki yo'qligini emas, ko'rsatadigan diagnostika.
  3. DeepAR — bu blogda hozirgacha faqat benchmark izohida uchragan, ammo hech qachon tushuntirilmagan autoregressiv tanlash model oilasi.

Avval bitta muhim nuqta. Nuqtaviy prognoz turli rejimlarda turlicha xato qiladi: past volatillikdagi trendda shartli taqsimot tor va deyarli simmetrik bo'ladi, nuqtaviy prognoz yaxshi qisqa ifodadir; rejalashtirilgan hodisa oldidan taqsimot bimodal bo'ladi va shartli o'rtacha qiymat narx tushishi eng kam ehtimol bo'lgan joyda yotadi; inqirozda chap dum ustunlik qiladi va o'rtacha qiymat pasayish xavfini keskin past baholaydi. To'liq taqsimotni tiklashning uch yo'li bor: parametrik (qabul qilingan oila parametrlarini prognoz qilish: tez, noto'g'ri spetsifikatsiya xavfi bor), kvantilga asoslangan (belgilangan panjarani prognoz qilish: farazsiz, diskret) va namunaga asoslangan (autoregressiv tanlash, dropout yoki ansambllardan Monte-Karlo yo'llari: moslashuvchan, qimmat). Aynan shu rejimlarda taqsimot shakli o'zgargani uchun moliyada oxirgi ikkisi ustun.

Kvantil prognozlari qisqacha

Kvantil prognozlari yelpig'ichi

Pinball loss va aniq kvantil panjarasi TFT kvantil chiqish qatlamida berilgan, shuning uchun formulani takrorlamayman. Muhim jihat - uning assimetriyasi: τ=0.5\tau = 0.5 da ortiqcha va kam prognoz bir xil turadi va loss MAE ga aylanadi, τ=0.95\tau = 0.95 da esa kam prognoz ortiqcha prognozdan 19×19\times ko'proq jazolanadi. τ/(1τ)\tau/(1-\tau) nisbati mexanizmning o'zi: u moslashtirilgan qiymatni kuzatuvlarning atigi 5 foizi oshib o'tadigan darajaga tortadi.

Nashr etilgan maqolada aytilmagan amaliy noziklik - kvantillarning kesishishi: har bir kvantil uchun alohida loss q^0.25>q^0.75\hat{q}_{0.25} > \hat{q}_{0.75} bo'lishiga to'sqinlik qilmaydi. Yetarli ma'lumot va umumiy backbone bilan bu kam uchraydi, biroq yupqa tanlanmalardagi ekstremal kvantillarda sodir bo'ladi va keyingi CRPS yoki qamrov hisobini sezdirmay buzadi. Arzon tuzatish - prognoz qilingan kvantil vektorini keyin saralash; printsipial yechim esa monoton chiqish parametrizatsiyasi ( qminq_{\min} va manfiy bo'lmagan o'sishlarni prognoz qilish).

Prognozlash frameworkini qabul qilmasdan kvantil chiqishlarini olish kerak bo'lganda foydali bo'lgan minimal, noldan yozilgan amalga oshirish:

import torch
import torch.nn as nn

class QuantileRegressionNet(nn.Module):
    """Multi-quantile forecasting network for financial returns."""

    def __init__(self, input_dim: int, hidden_dim: int = 128,
                 quantiles: list[float] = [0.01, 0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 0.99]):
        super().__init__()
        self.quantiles = quantiles
        self.backbone = nn.Sequential(
            nn.Linear(input_dim, hidden_dim), nn.ReLU(), nn.Dropout(0.2),
            nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Dropout(0.2),
        )
        self.heads = nn.ModuleList([nn.Linear(hidden_dim, 1) for _ in quantiles])

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        h = self.backbone(x)
        out = torch.cat([head(h) for head in self.heads], dim=-1)
        return torch.sort(out, dim=-1).values


def pinball_loss(predictions: torch.Tensor, targets: torch.Tensor,
                 quantiles: list[float]) -> torch.Tensor:
    """predictions: (batch, n_quantiles); targets: (batch, 1)."""
    errors = targets - predictions
    tau = torch.tensor(quantiles, device=predictions.device).unsqueeze(0)
    return torch.max(tau * errors, (tau - 1) * errors).mean()

Interval kengligi pozitsiya hajmiga o'tadi. Bu bog'lanishni, chekka nisbatli savdo qilmaslik filtrini ham qo'shib, xavfni hisobga olgan pozitsiya hajmi uchun konformal prognoz maqolasida to'liq chiqaramiz; 1/σ1/\sigma ning volatillikni targetlashga ekvivalentligi GARCH prognozlari bilan volatillikni targetlash da chiqarilgan.

DeepAR: autoregressiv ehtimolli prognozlash

Autoregressiv ehtimollik oqimi

DeepAR (Salinas et al., 2020) namunaga asoslangan yo'lni tanlaydi. Kvantillarni to'g'ridan-to'g'ri prognoz qilish o'rniga, u har bir qadamda likelihoodni parametrizatsiya qilish uchun autoregressiv RNNdan foydalanadi, so'ngra shu likelihoodni oldinga aylantirib, to'liq prognoz taqsimotlarini tanlaydi.

Arxitektura. Har bir tt qadamda tarmoq seriya bo'yicha masshtablangan oldingi kuzatuv zt1z_{t-1} ni, kovariatlar xt\mathbf{x}_t ni va ixtiyoriy statik xususiyatlarni qabul qiladi. LSTM holatni olib boradi:

ht=LSTM(ht1,[zt1,xt])\mathbf{h}_t = \text{LSTM}(\mathbf{h}_{t-1}, [z_{t-1}, \mathbf{x}_t])

Zich head ht\mathbf{h}_t ni likelihood parametrlariga θt=MLP(ht)\theta_t = \text{MLP}(\mathbf{h}_t) o'tkazadi: Gauss taqsimoti uchun (μt,σt)(\mu_t, \sigma_t), Student-t uchun (μt,σt,νt)(\mu_t, \sigma_t, \nu_t). O'qitish barcha seriyalar bo'yicha itlogp(zi,tθi,t)\sum_i \sum_t \log p(z_{i,t} \mid \theta_{i,t}) ni maksimal qiladi. Inferensda p(θt)p(\cdot \mid \theta_t) dan namuna olasiz, namunani keyingi kirish sifatida qaytarasiz va SS marta takrorlab, SS ta yo'l olasiz.

Savdo uchun ikki oqibat muhim. Likelihood - modellashtirish tanlovi, shuning uchun semiz dumni umid qilish emas, tanlash kerak: qalin dumlar uchun Student-t yoki hodisaning bimodal xatti-harakati uchun kwkN(zt;μk(ht),σk2(ht))\sum_k w_k \mathcal{N}(z_t; \mu_k(\mathbf{h}_t), \sigma_k^2(\mathbf{h}_t)) Gauss aralashmasi. Ko'p qadamli prognozlar izchil: har bir tanlangan yo'l serial korrelyatsiyani saqlaydigan maqbul trayektoriyadir, bu esa bir qadamdan uzun har qanday gorizont uchun kerak. (Uchinchi odatiy afzallik - ko'p seriyalar bo'yicha bitta global model NN ta aktiv modelidan ustun bo'lishi - TFT maqolasida berilgan ma'lumot samaradorligi argumentining o'zi; u yerda ham seriya bo'yicha masshtablash va statik kovariatlar statik enkoderlar rolini bajaradi.)

GluonTS bilan DeepAR

import pandas as pd
from gluonts.dataset.pandas import PandasDataset
from gluonts.torch.model.deepar import DeepAREstimator
from gluonts.torch.distributions import StudentTOutput
from gluonts.evaluation import make_evaluation_predictions, Evaluator


def prepare_crypto_dataset(returns_df: pd.DataFrame, freq: str = "h"):
    """Wide return frame (index=datetime, columns=assets) -> GluonTS dataset.

    from_long_dataframe wants LONG format: one row per (timestamp, item_id)
    with the target in a column. Passing a DataFrame of dicts does not work.
    """
    long_df = (
        returns_df.stack()
        .rename("target")
        .rename_axis(index=["timestamp", "item_id"])
        .reset_index()
        .dropna(subset=["target"])
    )
    return PandasDataset.from_long_dataframe(
        long_df, target="target", item_id="item_id",
        timestamp="timestamp", freq=freq,
    )


estimator = DeepAREstimator(
    prediction_length=24,    # 24 hours ahead
    context_length=168,      # one week of hourly data
    freq="h",
    num_layers=2,
    hidden_size=64,
    dropout_rate=0.1,
    lr=1e-3,
    batch_size=64,
    trainer_kwargs={"max_epochs": 50},
    distr_output=StudentTOutput(),
)

predictor = estimator.train(training_data=train_dataset)

forecast_it, ts_it = make_evaluation_predictions(
    dataset=test_dataset, predictor=predictor, num_samples=500,
)
forecasts, actuals = list(forecast_it), list(ts_it)

evaluator = Evaluator(quantiles=[0.05, 0.25, 0.5, 0.75, 0.95])
agg_metrics, item_metrics = evaluator(actuals, forecasts)
print(f"mean_wQuantileLoss: {agg_metrics['mean_wQuantileLoss']:.4f}")

num_samples Monte-Karlo yo'llari sonini boshqaradi. Jonli foydalanishda odatda 100-200 yetarli; oflayn baholashda 500-1000 ishlating, chunki juda kam namunadan baholangan CRPS pastga og'adi.

Prognoz taqsimotini olishning boshqa yo'llari

O'z bo'limiga muhtoj bo'lmagan, ammo bilishga arziydigan uchta muqobil yo'l bor. MC Dropout (Gal va Ghahramani, 2016) inferensda dropoutni faol qoldirib, SS ta forward pass bo'yicha o'rtacha va dispersiyani oladi; bu yashirilgan variatsion inferensning taxminiy ko'rinishi va allaqachon o'qitilgan modelga noaniqlikni ulashning eng tez yo'li. Deep ensemble (Lakshminarayanan et al., 2017) turli seedlar bilan MM nusxani o'qitadi va prognoz taqsimotini aralashma deb qaraydi - benchmarklarda barqaror kuchli, ammo narxi M×M\times, shu sababli kechikishga sezgir gorizontlarda mos emas, 4 soatlik yoki kunlik gorizontlarda esa mos bo'lishi mumkin. Normalizing flow (Rasul et al., 2021) oddiy bazaviy zichlikdan ixtiyoriy targetga qaytariluvchi xaritani o'rganadi va parametrik oilani tanlamasdan multimodallik hamda assimetriyani ushlaydi. Uchalasi ham namuna beradi, shuning uchun keyingi bo'limdagi hamma narsa ularga o'zgarmasdan tatbiq etiladi.

CRPS: prognoz taqsimoti uchun to'g'ri metrika

Taqsimotni baholash geometriyasi

MSE va MAE nuqtaviy prognozlarni baholaydi. Ular taqsimot yaxshi bo'lganini ayta olmaydi, chunki taqsimotning faqat bitta qisqa ifodasiga qaraydi. Standart o'rinbosar - Continuous Ranked Probability Score, va u ushbu maqoladagi eng foydali yagona vositadir.

CRPS prognoz qilingan CDF bilan sodir bo'lgan qiymatga butun massa qo'yadigan degeneratsiyalangan CDF orasidagi integrallangan kvadrat masofadir:

CRPS(F,y)=(F(z)1[yz])2dz\text{CRPS}(F, y) = \int_{-\infty}^{\infty} \left(F(z) - \mathbb{1}[y \leq z]\right)^2 dz

Uch xususiyat unga o'z o'rnini beradi:

  • Bu to'g'ri scoring rule (Gneiting va Raftery, 2007): kutilgan qiymatda faqat prognoz taqsimoti haqiqiy taqsimotga teng bo'lganda minimallashtiriladi. Ataylab haddan tashqari ishonchli bo'lish ham, sun'iy keng taqsimot bilan ehtiyotkorlik qilish ham ballni yaxshilamaydi. Medianadagi MSEda bunday xususiyat yo'q, shuning uchun CRPS ixtiyoriy emas.
  • MAEni umumlashtiradi. Degeneratsiyalangan nuqtaviy prognoz uchun u absolyut xatoga qisqaradi, shuning uchun CRPS target birliklarida bo'ladi - soatlik log-returnlarni prognoz qilishda CRPS 0.004 ni 40 bps o'rtacha absolyut xato bilan bevosita solishtirish mumkin; u aqlga sig'dirish qiyin bo'lgan o'lchovsiz son emas.
  • Kalibrlash sharti bilan aniqlikni mukofotlaydi. Bir xil kalibrlangan ikki prognoz orasida tori yaxshiroq ball oladi. Shu sababli faqat CRPS yetarli emas: yomon ball ikki shartdan qaysi biri buzilganini aytmaydi, keyingi bo'lim esa aynan shunga bag'ishlangan.

Kvantil loss bilan bog'lanish

Bu blogning qolgan qismida yetishmayotgan bog'lanish shu. To'liq CDF o'rniga T\mathcal{T} kvantil panjarasi berilsa, CRPS pinball loss orqali yaqinlashtiriladi:

CRPS2TτTLτ(y,q^τ)\text{CRPS} \approx \frac{2}{|\mathcal{T}|} \sum_{\tau \in \mathcal{T}} \mathcal{L}_\tau(y, \hat{q}_\tau)

Buni so'zma-so'z o'qing: TFT maqolasida hisobot qilingan "quantile loss" va bu yerda muhokama qilingan CRPS 2 koeffitsientigacha bir xil kattalik, panjara zichlashgani sari yaqinlashuv kuchayadi. Ular raqobatchi metrikalar emas va ikkalasini ham hisobot qilishga sabab yo'q.

Bitta birlik ogohlantirishi bor. GluonTSdagi mean_wQuantileLoss shu o'rtacha pinball lossning absolute target qiymatlari yig'indisi bilan normallashtirilgan ko'rinishi bo'lib, uni o'lchovsiz qiladi va turli masshtabdagi aktivlar orasida solishtirish imkonini beradi. Haqiqiy CRPS normallashtirilmaydi va return birliklarida qoladi. mean_wQuantileLoss ni "CRPS" deb nomlangan yorliq ostida chiqarmang - ushbu maqolaning avvalgi drafti aynan shunday qilgan va bu bir masshtabda bo'lmagan ikki sonni solishtirishning oson yo'li.

Namunalardan CRPS

Monte-Karlo namunalari {y(s)}s=1S\{y^{(s)}\}_{s=1}^{S} (DeepAR, ensemble, flow) bo'lsa, energy formasidan foydalaning:

CRPS(F,y)=1Ss=1Sy(s)y12S2s=1Ss=1Sy(s)y(s)\text{CRPS}(F, y) = \frac{1}{S} \sum_{s=1}^{S} |y^{(s)} - y| - \frac{1}{2S^2} \sum_{s=1}^{S} \sum_{s'=1}^{S} |y^{(s)} - y^{(s')}|

Birinchi had aniqlikni mukofotlaydi, ikkinchisi haddan tashqari tarqalishni jazolaydi. Ikkinchi had sodda yozilganda O(S2)O(S^2) bo'ladi va minglab prognozlarni baholaganda bo'g'in joyiga aylanadi. Avval saralash buni qisqartiradi: o'sish tartibidagi statistika y(1)y(S)y_{(1)} \le \dots \le y_{(S)} uchun qo'sh yig'indi 2k(2kS1)y(k)2\sum_k (2k - S - 1)\, y_{(k)} ga teng, shuning uchun butun hisoblash saralash ustunlik qiladigan O(SlogS)O(S \log S) bo'ladi.

import numpy as np

def crps_empirical(samples: np.ndarray, observation: float) -> float:
    """CRPS from Monte Carlo samples, O(n log n) via order statistics."""
    n = len(samples)
    mae = np.mean(np.abs(samples - observation))
    x = np.sort(samples)
    k = np.arange(1, n + 1)
    dispersion = np.sum((2 * k - n - 1) * x) / n**2
    return mae - dispersion


def crps_quantile(quantile_predictions: np.ndarray,
                  quantile_levels: np.ndarray,
                  observation: float) -> float:
    """CRPS approximation from a quantile grid (2x mean pinball loss)."""
    errors = observation - quantile_predictions
    pinball = np.where(errors >= 0,
                       quantile_levels * errors,
                       (quantile_levels - 1) * errors)
    return 2.0 * np.mean(pinball)

Ikkala forma bir xil prognoz taqsimotida yaqin mos kelishi kerak; mos kelmasa, kvantillarning kesishishidan yoki namunalar juda kamligidan shubhalaning. Productionda properscoring.crps_ensemble(observation, samples) yaxshi tekshirilgan tayyor yechimdir.

Kalibrlash: ko'rsatilgan noaniqlik halolmi?

Prognoz kalibrlash konturlari

Yaxshi CRPS intervallar da'vo qilgan ma'noni anglatishiga kafolat bermaydi. Nominal 90% interval natijalarning 70 foizinigina qamrab oladigan model haddan tashqari ishonchli; interval kengligini o'qiydigan hajmlash qoidasida u sizni aynan kerak bo'lmagan paytda leverageni oshirishga majbur qiladi. TFT maqolasi bu ogohlantirishni aytadi va yechim sifatida konformal prognozni tavsiya qiladi; quyida xatoni qanday aniqlash va tashxislash ko'rsatilgan.

PIT gistogrammasi

Har bir yty_t kuzatuv uchun uning shu qadamdagi prognoz CDFidagi kvantilini hisoblang:

ut=F^t(yt)u_t = \hat{F}_t(y_t)

Model kalibrlangan bo'lsa, {ut}\{u_t\} [0,1][0,1] da tekis taqsimlanadi. Diagnostikaning kuchi shundaki, og'ishning shakli xato turini nomlaydi:

  • U-shakl: haddan tashqari ishonchli - dumlarga juda ko'p massa tushadi, taqsimot juda tor.
  • Bo'rtma shakl: yetarlicha ishonchli emas - kuzatuvlar markaz atrofida to'planadi, taqsimot juda keng.
  • Chapga qiyshiq: model muntazam ravishda ortiqcha prognoz qiladi.
  • O'ngga qiyshiq: model muntazam ravishda kam prognoz qiladi.

Birgalikdagi xavf uchun kopula modellari bilan chalkashtirmaslik uchun eslatma: u yerda probability integral transform marginal transform, ya'ni GARCH-EVT marginallarini pseudo-uniform kuzatuvlarga aylantirib, ularga kopula moslashtiriladigan oldindan ishlov bosqichidir. Bu yerda transform sampledan tashqari prognozlarga qo'llanadi va uniformlik ishlab chiqariladigan kirish emas, tekshirilayotgan natijadir. Matematika bir xil, xulosa chiqarish yo'nalishi esa teskari.

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import kstest

def pit_calibration_check(forecasts, actuals, n_bins=20):
    """PIT histogram + KS test against uniform.

    forecasts: list of SampleForecast objects (GluonTS)
    """
    pit_values = []
    for forecast, actual in zip(forecasts, actuals):
        samples = forecast.samples          # (n_samples, prediction_length)
        h = forecast.prediction_length
        for t in range(h):
            obs = actual.values[-h + t]
            pit_values.append(np.mean(samples[:, t] <= obs))

    pit_values = np.array(pit_values)
    ks_stat, p_value = kstest(pit_values, "uniform")

    fig, ax = plt.subplots(figsize=(8, 4))
    ax.hist(pit_values, bins=n_bins, density=True, alpha=0.7, edgecolor="black")
    ax.axhline(y=1.0, color="red", linestyle="--", label="Perfect calibration")
    ax.set_xlabel("PIT value")
    ax.set_ylabel("Density")
    ax.set_title(f"PIT Histogram (KS={ks_stat:.3f}, p={p_value:.3f})")
    ax.legend()
    plt.tight_layout()
    return pit_values, ks_stat, p_value

KS testi bo'yicha ikki ogohlantirish bor. U PIT qiymatlari mustaqil deb faraz qiladi, holbuki ustma-ust tushadigan ko'p gorizontli prognozlar kuchli avtokorrelyatsiyalangan; p-value ni taxminiy signal, gistogramma shaklini esa haqiqiy dalil deb qarang. Shuningdek, kuzatuvlar ko'p bo'lsa test amaliy jihatdan ahamiyatsiz darajada kichik noto'g'ri kalibrlash uchun ham uniformlikni rad etadi; qarorni effekt hajmi boshqarishi kerak.

Qamrovni tekshirish

Qo'polroq, ammo bevosita amaliy diagnostika: α\alpha% intervallar natijalarning α\alpha% ini qamrab oladimi?

import numpy as np
import pandas as pd

def coverage_table(forecasts, actuals, levels=(0.50, 0.80, 0.90, 0.95)):
    """Empirical coverage at multiple nominal levels."""
    results = {}
    for level in levels:
        lower_q = (1 - level) / 2
        upper_q = 1 - lower_q
        covered = total = 0
        for forecast, actual in zip(forecasts, actuals):
            samples = forecast.samples
            h = forecast.prediction_length
            for t in range(h):
                obs = actual.values[-h + t]
                lo = np.quantile(samples[:, t], lower_q)
                hi = np.quantile(samples[:, t], upper_q)
                covered += int(lo <= obs <= hi)
                total += 1
        empirical = covered / total
        results[f"{int(level*100)}% interval"] = {
            "nominal": level, "empirical": empirical,
            "gap": empirical - level,
        }
    return pd.DataFrame(results).T

Qoida sifatida: odatdagi tanlanma hajmlarida 2 foiz punktdan kichik tafovutlar shovqin, 3-5 punktdan katta tafovutlar esa pozitsiya hajmida ko'rinadigan haqiqiy kalibrlash muammosidir. Buni birlashtirib emas, har bir gorizont bo'yicha ishga tushiring - gorizont uzaygani sari qamrov deyarli doim yomonlashadi, birlashtirish esa buni yashiradi.

Kalibrlash ishlamasa

Kafolat darajasi oshib boradigan uchta standart tuzatish bor. Temperature scaling prognoz qilingan scale parametrini hold-out ma'lumotda o'rganilgan TT ga bo'ladi - bitta parametr, juda arzon; u bir tekis ortiqcha yoki kam ishonchni tuzatadi, ammo shaklga bog'liq xatoni emas. Izotonik qayta kalibrlash prognoz qilingan kvantil darajalarini kuzatilgan chastotalarga monoton xaritalaydi; u shakl buzilishini ushlaydi, lekin yetarlicha katta kalibrlash to'plamini talab qiladi. Konformal prognoz istalgan modelni o'rab, cheklangan tanlanma uchun qamrov kafolatlarini beradi; to'liq split-conformal algoritmi, aniq order-statistic ranki hamda bir qatorli qisqa bayonot yashiradigan interpolyatsiya va clamp tuzoqlari savdo uchun konformal prognoz maqolasida berilgan.

Amaliy mulohazalar

Ehtimolli prognozlash quvuri

Statsionarlik emasligi. Volatillik rejimlari o'zgarganda kalibrlash siljiydi, shuning uchun o'zgarmas kalibrlash to'plami eskiradi. Aynan shu vaziyat uchun mo'ljallangan mexanizm - Adaptive Conformal Inference: u online noto'g'ri qamrov darajasini yangilaydi va hatto adversarial ketma-ketliklarda ham uzoq muddatli qamrov kafolatini saqlaydi - savdo uchun konformal prognoz maqolasining ACI bo'limiga qarang.

Hisoblash narxi. 500 ta sample path bilan DeepAR bitta forward passdan taxminan 500×500\times qimmat. Intraday ishda kvantil regressiyasini (barcha kvantillarni bir o'tishda) yoki parametrik headni (μ,σ\mu, \sigma ni bir marta prognoz qilish) afzal ko'ring; autoregressiv samplingni 4 soatlik va kunlik gorizontlarga qoldiring.

Rejim o'zgarishlari. Prognozchini rejim detektori bilan juftlang va har bir rejim uchun kalibrlash parametrlarini alohida saqlang - HMM bilan rejimlarni aniqlash amaliy implementatsiya va backtestni beradi.

Ko'p o'lchovli prognozlar. Har bir aktivning marginal taqsimotlari portfel xavfi uchun yetarli emas; muhim narsa - birgalikdagi dum, birgalikdagi xavf uchun kopula modellari mustaqillik farazlari uni qanchalik past baholashini o'lchaydi.

Keyingi foydalanuvchilar. VaR va expected shortfall samplega asoslangan prognozdan kvantil va shartli dum o'rtachasi sifatida bevosita chiqadi - ta'riflar va Monte-Karlo retsepti birgalikdagi xavf uchun kopula modellari da bor. Kelly hajmlashi esa bepul kelmaydigan yagona narsa: prognoz intervaldan Kelly ulushini chiqarish shu interval ichidagi taqsimot haqida qo'shimcha faraz talab qiladi, konformal maqola esa ff^* ga interval nisbatini shunchaki ulashga ochiq qarshi chiqadi. Ulush aslida nimani talab qilishini strategiyalar uchun Kelly mezoni dan ko'ring.

Xulosa

Kalibrlangan prognoz taqsimoti

Ehtimolli prognoz uchun baholash steki qisqa va muhokamasiz: CRPS - ball uchun, chunki u to'g'ri va target birliklarida; PIT gistogrammasi - diagnostika uchun, chunki u shunchaki signal bermasdan xato turini nomlaydi; har bir gorizont bo'yicha qamrov - qaror uchun, chunki aynan shu son pozitsiya hajmiga o'tadi. "Quantile loss" deb berilgan har qanday narsa CRPSning 2 koeffitsientigacha teng, demak bu yerda ikkita emas, bitta metrika bor.

Noqulay tomoni shundaki, bularning barchasi model siz umid qilganingizdan yomonroq ekanini aniqlash mexanizmidir. Maqsad ham shu. Bilmagan paytda intervalini halol kengaytiradigan model ishonch bilan tor qoladigan modeldan qat'iy foydaliroq, ularni ajratishning yagona yo'li esa to'g'ri baholashdir.


Adabiyotlar

  • Salinas, D., Flunkert, V., Gasthaus, J., & Januschowski, T. (2020). "DeepAR: Probabilistic forecasting with autoregressive recurrent networks." International Journal of Forecasting, 36(3), 1181-1191.
  • Koenker, R. & Bassett, G. (1978). "Regression Quantiles." Econometrica, 46(1), 33-50.
  • Gneiting, T. & Raftery, A. E. (2007). "Strictly Proper Scoring Rules, Prediction, and Estimation." Journal of the American Statistical Association, 102(477), 359-378.
  • Gneiting, T., Balabdaoui, F., & Raftery, A. E. (2007). "Probabilistic forecasts, calibration and sharpness." Journal of the Royal Statistical Society: Series B, 69(2), 243-268.
  • Gal, Y. & Ghahramani, Z. (2016). "Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning." ICML.
  • Lakshminarayanan, B., Pritzel, A., & Blundell, C. (2017). "Simple and Scalable Predictive Uncertainty Estimation using Deep Ensembles." NeurIPS.
  • Rasul, K., Sheikh, A.-S., Schuster, I., Bergmann, U., & Vollgraf, R. (2021). "Multivariate Probabilistic Time Series Forecasting via Conditioned Normalizing Flows." ICLR.
  • GluonTS: Probabilistic Time Series Modeling in Python. https://ts.gluon.ai
blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Bozordan bir qadam oldinda bo'ling

Sun'iy intellekt savdo tahlillari, bozor tahlili va platforma yangiliklari uchun bizning xabarnomaga obuna bo'ling.

Biz sizning maxfiyligingizni hurmat qilamiz. Istalgan vaqtda obunadan chiqishingiz mumkin.