← Мақалаларға оралу
July 13, 2026
5 мин оқу

Волатильностті таргеттеу және GARCH болжамдарымен сауда

#volatility
#GARCH
#volatility-targeting
#backtesting
#risk
#crypto
#algorithmic-trading

Осы серияның алғашқы үш бөлімі сізге волатильностті болжауды үйретті. Біз 1-бөлімде бір айнымалылы GARCH(1,1) құрдық, 2-бөлімде GJR мен Student-t инновациялары арқылы левередж бен қалың құйрықтарды қостық, ал 3-бөлімде DCC-GARCH көмегімен уақыт бойынша толық ковариация матрицасын модельдедік. Әр бөлімнің соңында біз бір санды шығардық: ертеңгі күтілетін волатильность. Ал одан кейін, шынымен айтқанда, тоқтадық — болжам жасау мақсаттың өзі екендей.

Бірақ бұл олай емес. Волатильность болжамы — бұл P&L емес. Ешкімге де төмен QLIKE ұпайы үшін ақы төленген емес. Болжам тек сіз басқаша қабылдаған шешімді нақ өзгертетін сәтте ғана құнды болады — қанша сатып алу керек, қашан тоқтату керек, қанша капитал бөлу керек. Егер сіздің болжамыңыз позицияны қозғамаса, оның статистикалық дәлдігі жеке хоббиден өзге ештеңе емес.

Бұл соңғы бөлім осы циклді жабуға арналған. Біз 1-3 бөлімдердегі болжамдарды алып, ең таза шешімге қолданамыз: волатильностті таргеттеу — портфельдің realized волатильносі тұрақты мақсатқа жеткендей позицияны мөлшерлеу. Содан кейін біз бұл блог кез келген жеке модельден гөрі көбірек маңызды деп санайтын нәрсені жасаймыз: адал бағалаймыз. Біз GARCH-ты қарапайым бірақ мықты негізгі әдістермен (rolling realized vol, EWMA) салыстырамыз, шынайы волатильностті ешқашан бақылай алмайтынымызға төзімді loss функцияларын қолданамыз, шығындармен және look-ahead-сыз walk-forward бэктест жүргіземіз, және vol targeting нақты не бере алатынын, не бере алмайтынын ашық айтамыз. Спойлер: ол альфа жасаудан гөрі тәуекелге түзетілген қайтарымды жақсартады және drawdown-дарды әлдеқайда сенімді басады.

Неге волатильностті таргеттеу дұрыс тест болып табылады

Волатильность болжамын қолданудың бай тәсілдері бар — опцион бағалау, VaR лимиттері, динамикалық хеджирлеу — бірақ волатильностті таргеттеу басқа парасаттардың ластануынан ең аз зардап шегіп, болжамның құндылығын оқшаулайтын жалғыз әдіс. Идея бір теңдеуге саяды.

Сигналмен анықталған бағыты бар (қазірше жай ғана "long") тәуекелді активті ұстаныңыз. Тұрақты позиция орнына, экспозицияны болжам волатильносіне кері пропорционал масштабтаңыз:

wt=σtargetσ^t(содан кейін шектеледі)w_t = \frac{\sigma_{\text{target}}}{\hat{\sigma}_{t}} \quad \text{(содан кейін шектеледі)}

мұндағы σ^t\hat{\sigma}_t — келесі кезеңнің волатильносінің болжамыңыз (тек tt-ге дейінгі деректерді пайдаланып жасалған), ал σtarget\sigma_{\text{target}} — стратегияны жүргізгіңіз келетін жылдық волатильность, айталық 15% немесе 20%. Модель тыныш нарықты болжаса, сіз 1.0-ге қарай (немесе одан асып) левередж арттырасыз; ол дауылды болжаса, кішірейесіз. Масштабталған позицияның realized волатильносі бірінші ретте:

Vol(wtrt+1)=wtσt+1=σtargetσ^tσt+1σtarget\text{Vol}(w_t r_{t+1}) = w_t \, \sigma_{t+1} = \frac{\sigma_{\text{target}}}{\hat\sigma_t}\, \sigma_{t+1} \approx \sigma_{\text{target}}

σ^tσt+1\hat\sigma_t \approx \sigma_{t+1} болған кезде әрдайым. Сонымен, бүкіл жаттығудың сапасы бір нәрсеге тіреледі: сіздің σ^t\hat\sigma_t болжамыңыз келесі кезеңнің нақты волатильносіне σt+1\sigma_{t+1} қаншалықты жақын. Жақсырақ болжам тегісірек realized-волатильность профилін және — көретініміздей — жақсырақ Sharpe коэффициентін тудырады. Дәл сол себепті бұл дұрыс тест. Болжам — сәндік элемент емес; ол бөлгіш.

Неге бұл Sharpe-ты арттырады және drawdown-дарды бақылайды

Мұнда екі эмпирикалық факт жұмыс істейді.

Волатильность қайтарымдардан әлдеқайда болжамдырақ. Ертеңгі BTC қайтарымының бағыты күндізгі жиілікте тиынды лақтыруға жақын; ал шамасы олай емес. Волатильность кластерленеді — үлкен қозғалыстар үлкен қозғалыстардан кейін келеді — бұл GARCH-тың бар болу себебі (1-бөлім осыны кодтайтын дисперсиядағы AR(1) құрылымын шығарды). Бір күн алдын болжаудағы дисперсия үшін 0.4-0.6 R2R^2 — қалыпты жағдай; қайтарымдар үшін дәл сол сан Ренессанс деңгейіндегі сигнал болар еді. Vol targeting болжамды шаманы пайдаланады және болжанбайтынға немқұрайлы қарайды.

Sharpe коэффициенттері уақыт бойынша тұрақты емес; олар волатильность секірген кезде түседі. Криптодағы жоғары волатильность режимдері — левередж кетірудің каскадтары, биржа істен шығулары, барлығы 30%-ға секіретін күндер — көбіне тәуекел бірлігіне нашар қайтарым береді, жақсы емес. Болжам волатильносі жоғары болғанда механикалық түрде экспозицияны кеміту арқылы сіз drawdown-дарға ең көп үлес қосатын және жинақталған қайтарымға ең аз үлес қосатын кезеңдерді азайтасыз. Moreira және Muir (2017) акциялар үшін волатильность-басқарылатын портфельдер — дәл осы 1/σ21/\sigma^2 масштабтауы — Sharpe коэффициенттерін көтеретінін және басқарылмаған факторға қарсы оң альфа беретінін көрсетті. Механизм сиқыр емес; ол болжамды турбулентті кезеңдерге тұрақты доллар позициясын ұстаудан бас тартудан тұрады.

Drawdown пайдасы одан да тікелей. Максималды drawdown позиция-қайтарым таралуының құйрығымен басым болады. wtrt+1w_t r_{t+1} волатильносі σtarget\sigma_{\text{target}}-қа жақын бекітілгендіктен, тұрақты номиналды стратегия волатильность жарылысы кезінде тартатын қалың сол құйрық қысылады: сіз кіргенде бұрыннан кіші болдыңыз. Vol targeting апаттарды болжамайды, бірақ нарық толқыған кезде жүйелі түрде аз экспозицияланады, ал апаттар дәл толқу кезінде болады.

Kelly және фракциялық мөлшерлеумен байланыс

Волатильностті таргеттеу Kelly критериінің туыс бауыры. Күтілетін артық қайтарымы μ\mu және дисперсиясы σ2\sigma^2 бар бір актив үшін өсу-оптималды (толық Kelly) үлесі:

f=μσ2.f^\star = \frac{\mu}{\sigma^2}.

Sharpe коэффициенті μ/σ\mu/\sigma шамамен тұрақты деп есептесеңіз — бұл күшті болжам, бірақ "нарық тәуекел үшін тұрақты баға төлейді" деген идеяда жасырын — онда μ=Sσ\mu = S\sigma және f=S/σf^\star = S/\sigma, бұл σtarget=S(Kelly үлесі)\sigma_{\text{target}} = S \cdot (\text{Kelly үлесі}) болатын дәл волатильностті таргеттеу. Басқаша айтқанда, волатильностті таргеттеу — күтілетін қайтарым волатильносьпен масштабталады деген болжам бойынша Kelly мөлшерлеу. Толық және фракциялық Kelly-ді, және неге ешкім ақылға сыйымды түрде толық Kelly-мен сауда жасамайтынын Kelly критериі және стратегия мөлшерлеу мақаласында қарастырамыз. Одан алынған практикалық сабақ осында да қолданылады: теориялық мөлшердің бір бөлігін пайдаланыңыз, себебі бөлгіштегі (сіздің vol болжамыңыз) және әсіресе алымдағы (күтілетін қайтарым) бағалау қателігі толық мөлшерлеуді қауіпті түрде агрессивті етеді.

Есте ұстауға тұрарлық тағы екі байланыс бар. Біріншіден, vol targeting қайтарымдардың симметриялы дисперсиясы бойынша мөлшерленеді, бірақ крипто пайдалары симметриялы емес — левередж бен ликвидация іске қосылғанда 20% төмендеу күнінің құны 20% өсу күнінің айнасы емес. Біз бұл асимметрияны тікелей шығын-пайда асимметриясы мақаласында қарастырамыз, ал GJR/EGARCH болжамы (2-бөлім) теріс шоктарға көбірек реакция жасай отырып, осының бір бөлігін σ^t\hat\sigma_t-ге бұрыннан енгізеді. Екіншіден, vol болжамы — нүктелік бағалау; толығырақ тәуекел көрінісі оған интервал тіркейді. Сауда үшін конформды болжам модель нәтижелерін таралу-тәуелсіз интервалдарға айналдыруды көрсетеді, олар осы мақаланың адал бағалау тақырыбымен табиғи түрде үйлеседі.

Бәсекелестер: GARCH нені жеңуі керек

Мұнда шынайы бағалауды демонстрациядан ажырататын тәртіп бар. GARCH-ты таққа отырғызбас бұрын, оған арзан, түсінікті және таңқаларлықтай жеңу қиын қарсыластар беру керек. Егер сіздің күрделі GJR-t моделіңіз бес жолдық EWMA-дан асып түсе алмаса, сіз құнды нәрсе үйрендіңіз және өзіңізді өндірістік күрделіліктен көп сақтадыңыз.

Біз келесі кезеңнің волатильносінің төрт болжаушысын салыстырамыз.

(a) Trailing realized volatility (жылжымалы стандартты ауытқу)

Ең қарапайым болжам: ертеңгі волатильность соңғы nn күндік қайтарымдардың үлгі стандартты ауытқуына тең.

σ^tRV=1n1i=1n(rti+1rˉ)2\hat\sigma_{t}^{\text{RV}} = \sqrt{\frac{1}{n-1}\sum_{i=1}^{n}\bigl(r_{t-i+1}-\bar r\bigr)^2}

Оның бір гиперпараметрі бар (терезе nn, әдетте 20-60 күн) және моделі жоқ. Оның кемшілігі — терезедегі әрбір бақылау бірдей салмақ алады да, шыққанда кенеттен құлдырайды — "елесте" немесе "жаңғырық" эффекті, мұнда бір апат күні болжамды дәл nn күнге көтереді де, нарық шынымен тынышталды ма жоқ па екеніне қарамастан бір түнде жоғалып кетеді.

(b) EWMA / RiskMetrics (λ=0.94\lambda = 0.94)

Экспоненциалды өлшенген жылжымалы орта ескі квадраттық қайтарымдарға геометриялық түрде кемитін салмақ бере отырып, жаңғырық мәселесін шешеді:

σ^t2=λσ^t12+(1λ)rt2\hat\sigma_{t}^{2} = \lambda\,\hat\sigma_{t-1}^{2} + (1-\lambda)\,r_{t}^{2}

Бұл RiskMetrics (J.P. Morgan, 1996) бағалауышы. Күндізгі деректер үшін канондық λ=0.94\lambda = 0.94 болғанда, тиімді жад шамамен 1/(1λ)171/(1-\lambda) \approx 17 күн, бірақ құлдырау тегіс — жарынды жоқ. EWMA нақты не екеніне назар аударыңыз: бұл ω=0\omega = 0 және α+β=1\alpha + \beta = 1 болатын интегралданған GARCH(1,1), яғни орташа қайтуы жоқ және ұзақ мерзімді дисперсиясы жоқ GARCH. λ=0.94\lambda = 0.94 қабылдасаңыз, оның еркін параметрлері нөл, және ол бүкіл осы мақаладағы ең қиын жалғыз негізгі әдіс. "GARCH X-тен асып түседі" мақалаларының үлкен бөлігі байқаусызда out-of-sample EWMA-дан аса алмайды.

import numpy as np
import pandas as pd

def ewma_vol(returns: pd.Series, lam: float = 0.94, sigma0: float | None = None) -> pd.Series:
    """RiskMetrics EWMA conditional volatility (returns in decimal, e.g. 0.03).

    sigma2_t = lam * sigma2_{t-1} + (1 - lam) * r_t^2
    Returns a series aligned to `returns` where value at t uses info up to t.
    """
    r2 = np.square(returns.values)
    var = np.empty_like(r2)
    var[0] = sigma0**2 if sigma0 is not None else r2[0]
    for t in range(1, len(r2)):
        var[t] = lam * var[t - 1] + (1.0 - lam) * r2[t - 1]  # note: r_{t-1}, no look-ahead
    return pd.Series(np.sqrt(var), index=returns.index, name="ewma_vol")

Адамдарды жиі шатастыратын бір нәзіктік: tt кезеңі үшін болжам (tt бойы ұсталатын позицияны мөлшерлеу үшін пайдаланылатын) tt-ге дейін байқалған қайтарымдардан құрылуы керек. Жоғарыдағы рекурсияда var[t] r2[t-1]-ді пайдаланады, сондықтан серия шынайы бір қадам алдын болжам болып табылады. Осы индексті дұрыс алу — бэктест пен қиялдың арасындағы айырмашылық — walk-forward бөлімінде толығырақ.

(c) GARCH(1,1) және GJR-t (1-2 бөлімдер)

Біздің басты кейіпкерлеріміз. Стандартты GARCH(1,1):

σt2=ω+αϵt12+βσt12,ω>0, α,β0, α+β<1\sigma_t^2 = \omega + \alpha\, \epsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2, \qquad \omega>0,\ \alpha,\beta\ge0,\ \alpha+\beta<1

ұзақ мерзімді дисперсиясы σˉ2=ω/(1αβ)\bar\sigma^2 = \omega/(1-\alpha-\beta) және бір қадамдық болжам тікелей рекурсиядан шығады (1-бөлім). GJR-GARCH кеңейтуі теріс шоктар дисперсияны оң шоктарға қарағанда көбірек көтеретіндей левередж мүшесін қосады:

σt2=ω+(α+γ1[ϵt1<0])ϵt12+βσt12\sigma_t^2 = \omega + (\alpha + \gamma\, \mathbb{1}[\epsilon_{t-1}<0])\,\epsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2

және крипто-нің қалың құйрықтарын өңдеу үшін Student-t инновацияларымен жұптасқанда, бұл 2-бөлімдегі GJR-t. GARCH-тың EWMA-дан асып түсу мүмкіндігінің себебі — орташа қайту: шок болғаннан кейін, GARCH болжамды α+β\alpha+\beta реттейтін жылдамдықпен σˉ2\bar\sigma^2-ге қарай тартады, ал EWMA (интегралданған болғандықтан) ешқашан қайтпайды. Волатильность секіріп, содан кейін қалыптасқанда — жалпы жағдай — GARCH-тың болжамы тезірек және дәлірек құлдырайды. Волатильность нағыз тұрақты болғанда, екеуі бір-бірінен айырылмайды дерлік.

(d) HAR-RV realized дисперсиясы бойынша (интрадей деректеріңіз болса)

Интрадей барлар болса — 24/7 крипто нарықтарында бұл әдетте бар — сіз күндізгі квадраттық қайтарымдарға қарағанда әлдеқайда аз шулы волатильность прокси құра аласыз: realized дисперсия, күн ішіндегі квадраттық интрадей қайтарымдардың қосындысы.

RVt=i=1Mrt,i2(мысалы, M=288 бес минуттық бар)RV_t = \sum_{i=1}^{M} r_{t,i}^2 \qquad (\text{мысалы, } M = 288 \text{ бес минуттық бар})

Corsi (2009) гетерогенді авторегрессивті моделі ертеңгі realized дисперсияны өткен RVRV-дің күндізгі, апталық және айлық орташаларынан болжайды — үш регрессормен ұзақ жад тұрақтылығын қамтудың дөрекі, бірақ таңғаларлықтай тиімді тәсілі:

RVt+1=β0+βdRVt+βwRVt(5)+βmRVt(22)+ut+1RV_{t+1} = \beta_0 + \beta_d\, RV_t + \beta_w\, \overline{RV}_t^{(5)} + \beta_m\, \overline{RV}_t^{(22)} + u_{t+1}

мұндағы RVt(5)\overline{RV}_t^{(5)} және RVt(22)\overline{RV}_t^{(22)} — күндізгі RVRV-дің жылжымалы 5 күндік және 22 күндік орташалары. Бұл қарапайым OLS регрессиясы, ол жоғары сапалы интрадей проксиді пайдаланады, және ол жиі төрт болжаушының ең жақсысы болып табылады — көбіне GARCH-тан асып түседі, себебі RVRV r2r^2-ге қарағанда тазарақ мақсат.

import numpy as np
import pandas as pd

def realized_variance(intraday_returns: pd.Series, day_index) -> pd.Series:
    """Daily realized variance = sum of squared intraday (log) returns per day.
    `intraday_returns` indexed by timestamp; `day_index` maps to calendar day.
    """
    return intraday_returns.pow(2).groupby(day_index).sum()

def har_features(rv: pd.Series) -> pd.DataFrame:
    """Build HAR regressors from a daily realized-variance series."""
    df = pd.DataFrame({"rv": rv})
    df["rv_d"] = df["rv"].shift(1)                          # yesterday
    df["rv_w"] = df["rv"].shift(1).rolling(5).mean()        # trailing week
    df["rv_m"] = df["rv"].shift(1).rolling(22).mean()       # trailing month
    df["target"] = df["rv"]                                 # predict today's RV
    return df.dropna()

def fit_har(rv: pd.Series):
    """Fit HAR-RV by OLS. Returns (coef_dict, predict_fn)."""
    df = har_features(rv)
    X = np.column_stack([np.ones(len(df)), df["rv_d"], df["rv_w"], df["rv_m"]])
    y = df["target"].values
    beta, *_ = np.linalg.lstsq(X, y, rcond=None)
    names = ["const", "rv_d", "rv_w", "rv_m"]

    def predict(rv_d, rv_w, rv_m):
        return float(beta @ np.array([1.0, rv_d, rv_w, rv_m]))

    return dict(zip(names, beta)), predict

Log-HAR туралы ескерту: RVRV оң жаққа қиғаш және қатаң түрде оң болғандықтан, көптеген практиктер logRVt+1\log RV_{t+1}-ді log HAR белгілеріне регрессиялайды, бұл сәйкестікті жақсартады және оң болжамдарды кепілдендіреді. Кері экспоненциалдағанда жарты-дисперсия Jensen түзетуін қосу керек, RV^=exp(y^+12σ^u2)\widehat{RV} = \exp(\hat{y} + \tfrac{1}{2}\hat\sigma_u^2), әйтпесе сіз жүйелі түрде төмен болжайсыз.

Төрт болжаушымен — RV, EWMA, GARCH/GJR-t, HAR — сұрақ мынаған келеді: олардың барлығы болжауға тырысатын нәрсені ешқашан көре алмасақ, қайсысы ең жақсы екенін қалай шешеміз?

Волатильность болжамын адал бағалау

Бұл мақаланың негізгі оқыту тұсы, сондықтан мұнда баяулаңыз.

Сіз σ^t2\hat\sigma_t^2 болжамдарын нақты шартты дисперсиямен σt2\sigma_t^2 салыстырғыңыз келеді. Бірақ σt2\sigma_t^2жасырын шама — ол деректерді генерациялау процесінің параметрі, ешқашан тікелей байқалмайды. Сізде күніне бір ғана realized қайтарым бар. Сондықтан әрбір волатильность бағалауы шын мәнінде сіздің болжамыңызды шындықтың шулы проксиімен салыстыру болып табылады. Екі стандартты прокси:

  • Квадраттық қайтарымдар rt2r_t^2. Нөлдік орта модель бойынша σt2\sigma_t^2 үшін ығысусыз (E[rt2Ft1]=σt2\mathbb{E}[r_t^2 \mid \mathcal{F}_{t-1}] = \sigma_t^2), бірақ өте шулы: бір күндізгі қайтарым стандартты ауытқудың бір бақылаулы бағалауы. rt2r_t^2 проксиі нақты vol жоғары болса да 0 болуы мүмкін (тегіс күн), немесе сәтті құйрық күнінде орасан зор болуы мүмкін.
  • Realized дисперсия RVtRV_t интрадей деректерінен. Әлдеқайда аз шулы — интрадей іріктеу бір қайтарымның идиосинкратикалық шуын орташалайды — бұл дәл HAR-RV неге жұмыс істейтінінің себебі және интрадей деректеріңіз болса RVRV-ді проксиіңіз ретінде пайдалану керек екенінің себебі.

Барлығын дерлік ұстап алатын нәзіктік: прокси шулы болғандықтан, loss функциясының таңдауы бейтарап емес. Екі болжамды дұрыс емес loss-пен реттеңіз, шулы прокси реттеуді төңкеріп, нашар болжамды жақсырақ деп айта алады. Patton (2011) шулы проксидегі күтілетін loss бойынша болжамдарды реттеу нақты (байқалмайтын) дисперсия бойынша алатын реттеумен бірдей реттеуді беретін мағынада қандай loss функциялары "мықты" екенін дәл шығарды. Тек нақты бір отбасы сай келеді. Практикада екі мүше маңызды.

MSE vs QLIKE

Дисперсиядағы орташа квадраттық қате:

LMSE(σ2,h)=(σ2h)2L_{\text{MSE}}(\sigma^2, h) = (\sigma^2 - h)^2

мұндағы h=σ^2h = \hat\sigma^2 — болжам, ал σ2\sigma^2 r2r^2 немесе RVRV арқылы проксиленген. MSE Patton мағынасында мықты (оның реттеуі проксиге тәуелсіз), бірақ ол симметриялы және масштабқа тәуелді: ол бірдей абсолютті шамадағы жоғары-болжау мен төмен-болжауды бірдей жазалайды, және жоғары волатильность кезеңдеріндегі қателерге қалыпты кезеңдердегі қателерге қарағанда әлдеқайда көп салмақ береді. Тыныш 95% күнде дәл болатын, бірақ дағдарыс күндерінде дисперсия болжамдарын бүлдіретін модель MSE бойынша нашар көрінеді, тіпті оның дағдарыс кезіндегі мінез-құлқы сіз шынымен қалайтын нәрсе болса да.

QLIKE (квазиправдоподобие) loss-ы негізгі құрал:

LQLIKE(σ2,h)=σ2hlogσ2h1L_{\text{QLIKE}}(\sigma^2, h) = \frac{\sigma^2}{h} - \log\frac{\sigma^2}{h} - 1

Бұл дисперсиядағы Гаусс правдоподобиесінен туындайтын loss, ол Patton мағынасында да мықты, және оны волатильность үшін таңдаулы етеді екі қасиеті бар. Біріншіден, ол дұрыс бағытта асимметриялы: ол дисперсияны төмен болжауды жоғары болжаудан гөрі көбірек жазалайды. Тәуекел менеджері немесе vol-таргетер үшін бұл дұрыс асимметрия: vol-ды төмен болжау сіз маңызды сәтте тым үлкен мөлшер алдыңыз дегенді білдіреді, бұл қымбат қате. Екіншіден, ол (шамамен) масштабқа тәуелсіз: ол σ2/h\sigma^2/h қатынасына тәуелді болғандықтан, 10% болжам қатесі тыныш күнде болсын, дағдарыс күнінде болсын шамамен бірдей құн тұрады, сондықтан бағалау MSE сияқты бірнеше жоғары-дисперсиялы бақылаулармен ұрланбайды. Проксидің гетероскедастикалығына деген осы төзімділік дәл сіз қалайтын нәрсе, себебі бүкіл мәні волатильность қатты өзгеретінінде.

LQLIKE0L_{\text{QLIKE}} \ge 0, тек h=σ2h = \sigma^2 болғанда теңдік. MSE сияқты, төмен болғаны жақсы.

import numpy as np

def qlike(proxy: np.ndarray, forecast_var: np.ndarray) -> np.ndarray:
    """Per-observation QLIKE loss. `proxy` is r^2 or RV (a variance proxy),
    `forecast_var` is h = sigma_hat^2. Both strictly positive, same units.
    """
    ratio = proxy / forecast_var
    return ratio - np.log(ratio) - 1.0

def mse_var(proxy: np.ndarray, forecast_var: np.ndarray) -> np.ndarray:
    """Per-observation MSE on the variance scale."""
    return np.square(proxy - forecast_var)

Екі операциялық ескерту. Проксиі мен болжамды бірдей бірліктерде сақтаңыз (екеуі де күндізгі дисперсиялар немесе екеуі де жылдандырылған), әйтпесе қатынас мағынасыз. Және forecast_var-дың ешқашан нөлге тимеуін қамтамасыз етіңіз — оны шағын шектке кесіп тастаңыз, себебі log0\log 0 бүкіл орташаны улайды.

Mincer-Zarnowitz регрессиясы

Бір loss саны қандай болжам жақсырақ екенін айтады; ол болжам қалай қателесетінін айтпайды. Mincer-Zarnowitz (1969) регрессиясы солай жасайды. Прокси болжамға регрессиялаңыз:

rt2  =  a+bσ^t2+ut.r_t^2 \;=\; a + b\,\hat\sigma_t^2 + u_t.

Оптималды, ығысусыз болжам кезінде a=0a = 0 және b=1b = 1: орташа алғанда realized дисперсия болжамға тең. Ауытқулар патологияны диагностикалайды:

  • a>0a > 0 болатын b<1b < 1: болжам тым волатильді болатын классикалық белгі — ол шамадан тыс реакция жасайды, толығымен іске аспайтын экстремумдарды болжайды. Дөрекі квадраттық-қайтарым-негізделген модельдер үшін өте жиі.
  • b>1b > 1: болжам аз реакция жасайды, шынайы дисперсиямен тым аз масштабталады.
  • Төмен регрессия R2R^2: тіпті a,ba,b орташа алғанда жақсы көрінсе де, болжам дисперсияны күннен-күнге нашар қадағалайды. Прокси өте шулы болғандықтан, MZ R2R^2r2r^2-ге қарсы жиі тек 0.05-0.20 болатынына алаңдамаңыз; RVRV-ге қарсы ол әлдеқайда жоғары болады. r2r^2-ге қарсы R2R^2 болжам қаншалықты жақсы болса да, тек прокси шуы себебінен 1-ден әлдеқайда төмен шектелген.

H0:(a,b)=(0,1)H_0: (a,b) = (0,1) бірлескен FF-тесті формальды калибрлеу тексерісін береді. Практикада, MZ-ды болжамды түсіну үшін диагностика ретінде, ал QLIKE-ты болжамдарды реттеу үшін пайдаланыңыз.

Diebold-Mariano: айырмашылық шынайы ма?

Айталық, GARCH-тың орташа QLIKE-ы 0.183, ал EWMA-ныкі 0.191. GARCH "жеңеді". Бірақ 0.008 шынайы басымдылық па, әлде іріктеу шуы ма? Diebold-Mariano (1995) тесті дәл осыған жауап береді. Кезең бойынша loss айырмасын анықтаңыз:

dt=L(proxyt,htA)L(proxyt,htB)d_t = L(\text{proxy}_t, h^A_t) - L(\text{proxy}_t, h^B_t)

екі болжам AA және BB үшін (мұнда LL = QLIKE). Нөлдік гипотеза — бірдей болжамдық дәлдік, H0:E[dt]=0H_0: \mathbb{E}[d_t] = 0. Статистика — оның ұзақ мерзімді (HAC) стандартты қатесіне стандартталған орташа айырма, себебі dtd_t сериялы корреляцияланған:

DM=dˉLRV^(dt)/T  d  N(0,1)\text{DM} = \frac{\bar d}{\sqrt{\widehat{\mathrm{LRV}}(d_t)/T}} \;\xrightarrow{d}\; \mathcal{N}(0,1)

мұндағы LRV^\widehat{\mathrm{LRV}} — Newey-West типті ұзақ мерзімді дисперсия бағалауы. ±1.96\pm 1.96-дан асатын DM статистикасы 5%-да бірдей дәлдікті теріске шығарады. Маңыздысы, DM — тіркелген модельдер туралы емес, болжамдар туралы тест, және ол dtd_t-дегі сериялы тәуелділікті есептейді, оны dtd_t-ге дөрекі tt-тест елемес еді.

import numpy as np
from scipy import stats

def diebold_mariano(loss_a: np.ndarray, loss_b: np.ndarray, h: int = 1):
    """Diebold-Mariano test of equal predictive accuracy.
    loss_a, loss_b: per-period losses (e.g. QLIKE) for forecasts A and B.
    h: forecast horizon; Newey-West lag = h - 1 (>=0), plus a small-sample buffer.
    Returns (DM_stat, p_value). Negative DM => A has lower loss (A better).
    """
    d = np.asarray(loss_a) - np.asarray(loss_b)
    T = len(d)
    d_bar = d.mean()

    lag = max(h - 1, 0)
    gamma0 = np.mean((d - d_bar) ** 2)
    lrv = gamma0
    for k in range(1, lag + 1):
        w = 1.0 - k / (lag + 1)
        cov = np.mean((d[k:] - d_bar) * (d[:-k] - d_bar))
        lrv += 2.0 * w * cov

    dm = d_bar / np.sqrt(lrv / T)

    adj = np.sqrt((T + 1 - 2 * h + h * (h - 1) / T) / T)
    dm *= adj
    p = 2.0 * (1.0 - stats.t.cdf(abs(dm), df=T - 1))
    return float(dm), float(p)

Сол түсіндірмедегі иллюстративті нәтиже — адал әрі жиі кездесетін нәтиже, және дәл осы бөлімнің бар болу себебі: GARCH көбіне EWMA-дан сәл төмен орташа loss жариялайды, бірақ дәл сол жиілікпен бұл басымдылық DM маңыздылық шегін өте алмайды. Егер сіз тек орташа QLIKE-ты хабарласаңыз, DM тесті болмаса теріске шығаратын басымдылықтарға өзіңізді сендіресіз. DM статистикасын хабарлаңыз. Бұл — стратегия қайтарымдарына мықты басымдылықсыз адал бағалау мақаласында қолданатын бірдей тәртіп — эталоннан асатын нүктелік бағалау шу еместігіне көз жеткізбейінше басымдылық емес.

Бэктест: Walk-Forward Vol-Targeted стратегиясы

Енді екі жартысын біріктіреміз — болжаушы мен мөлшерлеу ережесін — стратегияға, және оны нағыз мағынасы бар жалғыз тәсілмен бағалаймыз: walk-forward, out-of-sample, шығындармен.

Стратегия әдейі қарапайым, себебі қарапайымдылық нәтижені шебер сигналға емес, vol болжамына жатқызуға мүмкіндік береді. Тек-long, vol-targeted BTC. Әр күні ертеңгі волатильностьты болжаңыз, позицияны wt=min(σtarget/σ^t, wmax)w_t = \min(\sigma_{\text{target}}/\hat\sigma_t,\ w_{\max})-ге орнатыңыз, түнде ұстаңыз және қайталаңыз. Тренд фильтрі теріс болғанда позицияны сөндіретін long/flat нұсқасы бар; бір активтің дисперсиясы орнына 3-бөлімдегі DCC ковариациясы бойынша мөлшерленетін шағын-портфель нұсқасы бар. Біз тек-long жағдайды толық сипаттап, кеңейтулерді атап өтеміз.

Walk-forward механикасы және look-ahead-жоқ келісім

Осы бэктесттің ең маңызды қасиеті — t+1t+1 күнінде позицияны мөлшерлеу үшін пайдаланылатын әрбір шама тек tt күнінің жабылуында қолжетімді деректерді пайдаланып есептелетіні. GARCH параметрлері tt-мен аяқталатын жылжымалы терезеде қайта бағаланады; болжам сол фиттен алынған бір қадам алдын σ^t+1\hat\sigma_{t+1}; позиция сол болжамнан орнатылады; ал табылатын қайтарым wt+1rt+1w_{t+1} r_{t+1}, мұндағы rt+1r_{t+1} — модель ешқашан көрмеген келесі күннің қайтарымы. GARCH-ты толық үлгіде қайта фиттеу, содан кейін өткенді "болжау" — адамдардың кездейсоқ керемет бэктест ойдан шығаратын ең кең тараған тәсілі. Біз бұл look-ahead тұзағын және жалпы әдістемені walk-forward оптимизациясы мақаласында қарастырамыз.

import numpy as np
import pandas as pd
from arch import arch_model

def walk_forward_voltarget(
    returns: pd.Series,          # daily log returns in decimal (e.g. 0.021)
    proxy_var: pd.Series,        # variance proxy aligned to returns (RV or r^2)
    target_vol_annual: float = 0.20,
    window: int = 750,           # rolling estimation window (days)
    refit_every: int = 5,        # refit GARCH weekly, forecast daily (cost saver)
    w_max: float = 3.0,          # leverage cap
    cost_bps: float = 5.0,       # per-unit-turnover cost in basis points
    ann: int = 365,              # crypto trades 365 days/yr
):
    """Long-only vol-targeted BTC, GARCH(1,1)-t forecasts, strictly walk-forward.
    Returns a DataFrame with position, forecast vol, net returns, and turnover.
    """
    idx = returns.index
    target_daily = target_vol_annual / np.sqrt(ann)

    fcast_vol = pd.Series(index=idx, dtype=float, name="fcast_vol")
    last_res = None

    for i in range(window, len(returns) - 1):
        if (i - window) % refit_every == 0 or last_res is None:
            train = returns.iloc[i - window:i + 1] * 100.0   # scale for the optimizer
            am = arch_model(train, mean="Constant", vol="GARCH",
                            p=1, o=1, q=1, dist="t")           # GJR-t, Part 2
            last_res = am.fit(disp="off")

        f = last_res.forecast(horizon=1, reindex=False)
        var_next = f.variance.values[-1, 0] / (100.0 ** 2)    # unscale
        fcast_vol.iloc[i + 1] = np.sqrt(var_next)

    raw_w = (target_daily / fcast_vol).clip(upper=w_max)
    position = raw_w.shift(0)                                  # w_{i+1} known at close i
    gross_ret = position * returns                            # earned on day i+1

    turnover = position.diff().abs().fillna(0.0)
    cost = turnover * (cost_bps / 1e4)
    net_ret = (gross_ret - cost).dropna()

    out = pd.DataFrame({
        "position": position,
        "fcast_vol": fcast_vol,
        "gross_ret": gross_ret,
        "turnover": turnover,
        "net_ret": net_ret,
    }).dropna()
    return out

def performance_stats(net_ret: pd.Series, ann: int = 365) -> dict:
    """Sharpe, realized vol, max drawdown, CAGR, annual turnover."""
    mu = net_ret.mean() * ann
    sigma = net_ret.std() * np.sqrt(ann)
    sharpe = mu / sigma if sigma > 0 else np.nan
    equity = (1.0 + net_ret).cumprod()
    peak = equity.cummax()
    max_dd = (equity / peak - 1.0).min()
    cagr = equity.iloc[-1] ** (ann / len(net_ret)) - 1.0
    return {
        "sharpe": round(sharpe, 2),
        "realized_vol": round(sigma, 3),
        "max_drawdown": round(max_dd, 3),
        "cagr": round(cagr, 3),
    }

Көрінгеннен маңыздырақ бірнеше іске асыру ескертулері:

  • Оптимизатор үшін масштабтау. arch фиттері қайтарымдар пайызда болғанда сандық жағынан анағұрлым жайлы жұмыс істейді, сондықтан * 100 және дисперсияны қайта масштабтағанда сәйкес / 100**2. Қайта масштабтауды ұмытсаңыз, мақсатты vol-іңіз 10,000 есе қате болады.
  • Қайта фиттеу жиілігі. GARCH параметрлерін әр күні қайта бағалау қымбат әрі шамалы ештеңе қоспайды — параметрлер аптадан-аптаға тұрақты. Апта сайын қайта фиттеу (refit_every=5), ал күн сайын болжау (рекурсия σt2\sigma_t^2-ты қайта фиттеусіз де жаңа қайтарымдардан жаңартады) — стандартты компромисс. Бұл бірлескен тәуекел үшін copula модельдері мақаласындағы кэштеу кеңесіне ұқсас.
  • wmaxw_{\max} шегі косметикалық емес. Болжам vol өлі-тыныш режимде құлдырағанда, σtarget/σ^t\sigma_{\text{target}}/\hat\sigma_t 5x, 10x левереджге дейін жарылуы мүмкін. Шексіз vol targeting сізге волатильность режимі өзгерместен бұрын — болжам ең қате болатын дәл сол сәтте — апатты левередж қуана-қуана береді. Оны шектеңіз (мұнда 3x) және шек дәл ең тыныш, кейін ретроспективада ең қауіпті кезеңдерде байланатынын түсініңіз.
  • Шығындар турновермен масштабталады, ал vol targeting турновер машинасы. Болжамдағы әрбір теңселу позицияны қайта мөлшерлейді. Толқымалы болжамы бар төмен-vol активте сіз кітапты күн сайын шайқауыңыз мүмкін. cost_bps мүшесі — жинақтау мәліметі емес; жоғары-турновер vol-target үшін ол жалпы Sharpe жақсартудың айтарлықтай бөлігін жей алады.

Нәтиже қалай көрінеді (иллюстративті)

Мұны BTC күндізгі деректерінде көп жылдық терезеде іске қосу, төрт болжаушыны мөлшерлеу бөлгіші ретінде салыстыра отырып, әдетте келесі пішіндегі кестені шығарады. Төмендегі сандар иллюстративті — тәжірибешілер хабарлайтын типтік үлгіні көрсету үшін таңдалған, шынайы бэктесттің нәтижесі емес — бірақ реттелу мен шамалар практикада кездесетінге ұқсас.

Мөлшерлеу болжамы Sharpe Realized vol Мақсатты vol Max drawdown Жылдық турновер
Тұрақты номинал (таргеттеусіз) 0.71 0.68 -0.78 0.1x
Rolling RV (60к) 0.94 0.24 0.20 -0.41 12x
EWMA (λ=0.94\lambda=0.94) 1.02 0.21 0.20 -0.35 19x
GARCH(1,1)-t 1.05 0.21 0.20 -0.33 22x
HAR-RV (интрадей прокси) 1.09 0.20 0.20 -0.31 20x

Құруға тұратын екі нұсқа

Тек-long жағдай болжамды оқшаулайды, бірақ айқын көрсетуге жеткілікті кең тараған екі кеңейту бар.

Тренд қақпасы бар Long/flat. Vol targeting позицияны мөлшерлейді, бірақ бағыттық көзқарасты алмайды — ол әрдайым long. Арзан, адал жақсарту — баяу тренд фильтрі теріс болғанда позицияны қақпалау, сонда сіз vol-targeted long-ты тек өрлеу трендтерінде ұстайсыз, ал басқа уақытта тегіс отырасыз. Бұл мөлшерлеу логикасын бірдей сақтайды және оның үстіне дөрекі режим фильтрін қабаттайды; ол кірулерді уақыттауды емес, тек анық құлдырау трендтерінде ұстауды болдырмауды көздейді.

def apply_trend_gate(position: pd.Series, price: pd.Series, fast: int = 20, slow: int = 100):
    """Zero out the (already vol-targeted) position when the fast SMA is below
    the slow SMA. Both SMAs use only past prices, so no look-ahead is introduced.
    """
    fast_ma = price.rolling(fast).mean().shift(1)   # shift: known at prior close
    slow_ma = price.rolling(slow).mean().shift(1)
    gate = (fast_ma > slow_ma).astype(float)        # 1.0 in uptrend, 0.0 otherwise
    return position * gate.reindex(position.index).fillna(0.0)

Тренд қақпасы төмен жақтағы турноверді кемітеді (аю нарығында құлдырап жатқан позицияны шайқауды тоқтатасыз), бірақ өз режим тәуекелін қосады — ол шайқалмалы бүйірлік нарықтарда шайқалады және бұрылыстарда кешігеді. Оның пайдасы бар ма — бұл эмпирикалық сұрақ, оны мөлшерлеу ережесінің өзі сияқты бірдей walk-forward, DM-тестелген қатаңдықпен жауап беруіңіз керек; тренд фильтрі in-sample-де тамаша көрінетін және out-of-sample-де буланатын дәл осындай қосымша.

DCC ковариациясы бойынша портфель vol targeting. Бірнеше активтен тұратын кітап үшін скаляр болжам σ^t\hat\sigma_t портфель волатильносіне wΣtw\sqrt{w^\top \Sigma_t w} айналады, мұндағы Σt\Sigma_t3-бөлімдегі DCC-GARCH-тан алынған уақыт бойынша өзгеретін ковариация матрицасы. Сіз базалық салмақтарды w0w_0 таңдайсыз (тең салмақ, нарықтық капиталдандыру немесе орта-дисперсия еңкейтуі), Σt\Sigma_t бойынша портфельдің болжам vol-ын есептейсіз, және портфель мақсатына жету үшін бүкіл салмақ векторын масштабтайсыз.

def portfolio_voltarget_weights(base_w, cov_forecast, target_vol_daily, w_gross_max=3.0):
    """Scale a base weight vector so forecast portfolio vol hits the target.
    base_w:        (n,) base allocation (need not sum to 1).
    cov_forecast:  (n, n) one-step-ahead covariance from DCC-GARCH (daily units).
    """
    base_w = np.asarray(base_w, dtype=float)
    port_var = float(base_w @ cov_forecast @ base_w)
    port_vol = np.sqrt(max(port_var, 1e-12))
    scale = min(target_vol_daily / port_vol, w_gross_max / np.abs(base_w).sum())
    return scale * base_w

Бұл портфель құру әдебиетіне табиғи көпір: базалық салмақтар w0w_0 Markowitz орта-дисперсиясынан немесе HRP/CVaR сияқты тәуекел-негізделген әдістен келе алады, ал vol targeting сонда жиынтық тәуекелді тұрақтыға масштабтайтын overlay ретінде үстіне отырады. DCC матрицасы маңызды, себебі корреляциялар апаттарда секіреді (3-бөлім) — тыныш нарықтарда әртараптандырылған көрінетін портфельде статикалық ковариация білдіретіннен әлдеқайда жоғары болжам vol болуы мүмкін дәл маңызды кезде, ал overlay жалпы экспозицияны соған жауап ретінде кемітеді.

Әрдайым сызуыңыз керек диагностикалар

Тек қорытынды кестеге сенбеңіз. Кез келген vol-target үшін үш нәрсені сызып, кез келген Sharpe санына сенбес бұрын оларды көзбен қарап шығыңыз. Біріншіден, стратегияның жылжымалы realized vol-ын мақсат сызығына қарсы — ол мақсатты құшақтауы керек; одан жоғары жүйелі дрейф болжамыңыз төмен ығысқанын білдіреді (қымбат бағыт). Екіншіден, позиция/левередж сериясы — шектің байланғанын және drawdown-дардан бұрын левередж секірулерін іздеңіз, бұл режим өзгерісіне ұсталып қалған болжамның белгісі. Үшіншіден, болжам-проксиге қарсы шашырауы (Mincer-Zarnowitz суреті) — көлбеу 1-ден алшақ бұлт болжам QLIKE орташасы жасыра алатын тәсілмен масштабы дұрыс еместігін айтады. Бұл үш сурет кез келген жалғыз статистикадан гөрі көбірек қате мен өзін-өзі алдауды ұстайды.

Бұл кестені әрбір бэктест кестесін оқығандай оқыңыз: не мықты, не шекаралы екенін қараңыз. Мықты фактілер бірден көзге түседі. Әрбір vol-targeted нұсқа Sharpe-та, ал одан да айқынырақ drawdown пен realized-vol тұрақтылығында тұрақты номиналды жеңеді — тұрақты-номиналды стратегия 68% жылдық vol-мен 78% drawdown-мен жұмыс істейді, бұл жай ғана инвестицияға жарамсыз. Ал әрбір таргеттеу әдісі 20% мақсатқа жақын realized vol береді, бұл механизмнің жұмыс істеуінің бүкіл уәдесі. Шекаралы фактілер — болжаушылар арасындағы айырмашылықтар: HAR GARCH-тан асады, GARCH EWMA-дан асады, EWMA rolling RV-ден асады, бірақ алшақтықтар шағын — Sharpe ұпайының оннан бір бөлігі — және болжамдарда Diebold-Mariano-мен немесе қайтарымдарда bootstrap-пен тестелгенде, жиі маңыздылықты өте алмайды. Күрделі мен қарапайым болжаушы арасындағы осы шағын, нәзік, режимге тәуелді алшақтық — осы бүкіл серияның адал басты тақырыбы.

Бұл нені бере алатыны туралы адалдық

Бұл блогта өзіңізді алдамай бэктест жасау туралы бүкіл коллекция бар, сондықтан оны үнсіз үміттенудің орнына өз нәтижемізге қолданайық.

Волатильностті таргеттеу тәуекелге түзетілген қайтарым мен drawdown-дарды жақсартады. Ол ештеңеден альфа жасамайды. Кестеге тағы қараңыз. Таргеттеуден Sharpe жақсаруы шынайы және оған тұрарлық — бірақ оны декомпозициялаңыз, оның көп бөлігі жоғары-vol режимдерге тұрақты позицияны ұстамаудан келеді, бұл механикалық түрде ең нашар drawdown-дарды болдырмайды және жинақтау жолын тұрақтандырады. Стратегия әлі де long BTC; нарық оған бермеген көзқарасы жоқ. BTC сіздің үлгіңізде теріс Sharpe-ке ие болса, vol targeting сізге онша нашар емес теріс Sharpe береді, оң емес. Ол қайтарым таралуын қайта пішіндейді — жіңішке құйрықтар, тұрақтырақ vol, жақсырақ геометриялық жинақтау — бірақ шикі бағыттық басымдылық негізгі long не болса, сол болып қала береді. Әдемі equity қисынына сендіріп, тәуекел менеджментін тапқанда альфа тапты деп ойламаңыз. Moreira-Muir акция факторларында vol менеджментінен шынайы альфа тапты, бірақ ол нәтиже фактордың уақыт бойынша өзгеретін тәуекел-қайтарым қатынасы туралы, және ол автоматты түрде басқа үлгідегі бір крипто активке ауыспайды.

GARCH-тың EWMA-дан асатын болжам-сапа басымдылығы жиі шағын және режимге тәуелді. Бұл 1-3 бөлімдердің қолайсыз нәтижесі. Сіз барған сайын күрделі модельдер құрдыңыз — левередж мүшелері, Student-t құйрықтары, динамикалық корреляциялар — және олардың әрқайсысының vol-targeting P&L-ге, дөрекі EWMA-ға қарағанда шекті үлесі жиі шу диапазонында. GARCH-тың басымдылығы (шоктардан кейінгі орташа қайту) негізінен нақты режимдерде көрінеді: содан кейін қалыптасатын өткір секірулер. Ұзаққа созылатын трендтерде немесе тұрақты жоғары-vol режимдерде ол EWMA-дан шамалы ғана ерекшеленеді. Бұл GARCH-ты пайдасыз етпейді — орташа қайту құрылымы, түсіндірілетін параметрлер, алдағы жолдарды симуляциялау және болжамға қарсы опциондарды бағалау мүмкіндігі — бәрінің EWMA-да жоқ құндылығы бар — бірақ сіздің жалғыз пайдалануыңыз мөлшерлеу болса, күрделілік құнын төлемес бұрын DM тестін жүргізіңіз, және режимді анықтау мақаласы сізге басқа бұрыштан бірдей нәрсені айтып тұрғанын біліңіз: жеңетін модель режимге тәуелді.

Бэктест Sharpe тірі Sharpe-тың жоғарғы шегі, ал vol targeting алшақтықты кеңейтеді. Стратегия турновер-ауыр және левередж-масштабталған болғандықтан, ол дөрекі бэктест өткізіп жіберетін үйкелістерге ерекше сезімтал: сіздің толтырулар мөлшерлеуге пайдаланған тұйықталудан нашарырақ, левереджделген perp позицияларындағы финансирлеу шығындары үздіксіз жиналады, және левередж шегі жай w * return елемейтін маржа мен ликвидация механикасымен өзара әрекеттеседі. Осының әрқайсысы тірі нәтижені бэктесттен нашарлатады. Біз бұл алшақтықты бэктест-тірі паритеті мақаласында жүйелі түрде қарастырамыз; нақты vol targeting үшін оған консервативті шығындарды, шынайы (төмен) левередж шегін пайдаланып, және сигналды есептеген тұйықталудың орнына келесі бардың ашылуында орындау арқылы бюджет жасаңыз.

Волатильность тәуекел премиясы туралы бір ескерту. Жоғарыдағының барлығы realized волатильностьты болжайды. Параллель, сатылатын нысан бар: опциондарға бағаланған implied волатильность, ол орта есеппен кейінгі realized vol-дан жоғары тұрады — волатильность тәуекел премиясы, vol секірісінің тәуекелін көтергені үшін өтемақы. Бұл алшақтықтың өзі қайтарым көзі (дисперсияны сату оны жинайды, оны сатып алу құйрық тәуекелін хеджирлейді), және бұл vol targeting-ден шынымен басқа ойын: бұл волатильностьтың болжамын пайдалану емес, волатильностьтың бағасына бет. Біз мұны мұнда қарастырмаймыз, бірақ механизм Black-Scholes опцион бағалауы бағалау моделінен басталады, ал жақсы realized-vol болжамы (1-2 бөлімдер) implied vol қымбат па әлде арзан ба екенін бағалау үшін дәл қажет кіріс. GARCH болжамыңызды опциондар нарығының implied vol-мен салыстыру — осы серияда құрғаныңыздың бәрінің ең адал қолданыстарының бірі.

Практикалық ойлар

Жұмыс істейтін vol-target-ты нәзіктен ажырататын нәрселердің жиынтығы.

  • Дұрыс горизонтта бағалаңыз. Бір күн ұсталатын позицияны мөлшерлесеңіз, бір күндік vol-ды болжаңыз. Апта сайын қайта теңгерсеңіз, апталық vol-ды болжаңыз (және таргеттеңіз), немесе күндізгі GARCH болжамын горизонт бойынша жинақтаңыз — көпқадамдық GARCH болжамы σˉ2\bar\sigma^2-ге қарай орташа қайтады, оны дөрекі "hкүндізгі\sqrt{h}\cdot\text{күндізгі}" масштабтауы елемейді. 1-бөлім көпқадамдық GARCH болжамын қамтиды.
  • 24/7 нарықтардағы жылдандыру. Крипто аптасонына, демалыссыз, жыл бойы 365 күн саудаланады, сондықтан күндізгі vol-ды акциялардағы 252\sqrt{252} емес, 365\sqrt{365}-пен жылдандырыңыз. Мұны қате алу мақсатыңызды ~20%-ға үнсіз қате масштабтайды.
  • Бөлгіш ковариация матрицасы болуы мүмкін. Көп-активті кітап үшін, скаляр σ^t\hat\sigma_t-ды 3-бөлімдегі DCC-GARCH-тан алынған портфель vol wΣtw\sqrt{w^\top \Sigma_t w}-мен алмастырыңыз, және бүкіл салмақ векторын портфель мақсатты vol-ына жету үшін масштабтаңыз. Бұл vol targeting-ты орта-дисперсия мөлшерлеуімен (Markowitz крипто үшін) және тәуекел-негізделген бөлумен (HRP және CVaR pipeline-дері) байланыстырады — vol targeting портфель тәуекел бюджетіне масштабтаудың бір-активті ерекше жағдайы.
  • Vol targeting нәзік түрде процикликалық. Барлығы бірдей 1/σ1/\sigma ережесін жүргізгенде, vol секірісі синхрондалған левередж кетіруге мәжбүрлейді, бұл бағаларды төмендетеді, бұл realized vol-ды көтереді, бұл көбірек левередж кетіруге мәжбүрлейді. Бұл кері байланыс (2018 жылғы "volmageddon" және түрлі крипто левередж кетіру каскадтарында жақсы құжатталған) ережесі көптеген ойыншылар оны пайдаланғанда нашарырақ жұмыс істейтінін білдіреді. Бұл одан бас тартудың себебі емес, бірақ левередж шегін қою және vol секірісі кезінде толтырулардың тыныш-нарық толтыруларына ұқсас болады деп есептемеудің себебі.
  • Болжамды шектеп, кесіп тастаңыз. Нөлге жақын болжам vol шексіз левередж тудырады. Әрдайым σ^t\hat\sigma_t-ды парасатты минимумда шектеп, позицияны шектеңіз, және әрбір шек қаншалықты жиі байланатынын логтаңыз — егер шек көп уақыт байланса, мақсатыңыз актив үшін тым агрессивті.

Қорытынды

  • Волатильность болжамы шешімді өзгертпейінше құны жоқ. Волатильностті таргеттеу — экспозицияны wt=σtarget/σ^tw_t = \sigma_{\text{target}}/\hat\sigma_t (шектелген) ретінде мөлшерлеу — болжам құндылығының ең таза тесті, себебі болжам сапасы тегісірек realized-vol профиліне және жоғарырақ Sharpe-қа тікелей түседі.
  • Vol targeting тәуекелге түзетілген қайтарымды көтереді, және әсіресе, drawdown-дарды бақылайды, себебі волатильность болжамды (ол кластерленеді), ал бағыт болжамсыз, және ережеде автоматты түрде салмағы азайтылатын жоғары-vol режимдерде Sharpe коэффициенттері төмендейді. Бұл — күтілетін қайтарым волатильностьпен масштабталады деген болжам бойынша Kelly мөлшерлеу.
  • GARCH-ты мықты негізгі әдістермен адал салыстырыңыз: rolling realized vol, EWMA/RiskMetrics (λ=0.94\lambda=0.94, еркін параметрлері нөл IGARCH), және интрадей realized-дисперсия проксиіндегі HAR-RV. EWMA мен HAR-ды жеңу қиын.
  • Шынайы волатильностьты байқай алмайсыз, сондықтан проксиге қарсы (немесе r2r^2, немесе әлдеқайда жақсырақ, RVRV) прокси шуына мықты loss функцияларын пайдаланып бағалаңыз. MSE орнына QLIKE-ты таңдаңыз: ол төмен-болжауды көбірек жазалайды (қымбат қате) және масштабқа тәуелсіз, сондықтан ол бірнеше жоғары-vol күндермен ұрланбайды. Ығысуды диагностикалау үшін Mincer-Zarnowitz-ты, ал бір болжамның басымдылығы шынайы ма әлде шу ма екенін шешу үшін Diebold-Mariano тестін пайдаланыңыз.
  • Walk-forward, шығынды ескеретін бэктестте, vol targeting Sharpe пен drawdown-да тұрақты номиналды сенімді жеңеді, ал төрт болжаушы бір-біріне жақын шоғырланады — GARCH-тың EWMA-дан асатын басымдылығы шағын, режимге тәуелді, және жиі статистикалық маңызды емес. Тек орташа loss-ты емес, DM тестін хабарлаңыз.
  • Адал болыңыз: vol targeting тәуекел менеджменті, альфа емес. Ол сізде бұрыннан бар кез келген бағыттық парасаттың қайтарым таралуын қайта пішіндейді; ол ештеңеден басымдылық жасамайды. Және ол турновер-ауыр әрі левередж-масштабталған, сондықтан тірі нәтижелер бэктесттен әдеттегіден көбірек артта қалады.

Әдебиеттер:

  • Patton, A. J. (2011). Volatility forecast comparison using imperfect volatility proxies. Journal of Econometrics, 160(1), 246-256. DOI
  • Corsi, F. (2009). A simple approximate long-memory model of realized volatility. Journal of Financial Econometrics, 7(2), 174-196. DOI
  • Diebold, F. X., & Mariano, R. S. (1995). Comparing predictive accuracy. Journal of Business & Economic Statistics, 13(3), 253-263. DOI
  • Mincer, J., & Zarnowitz, V. (1969). The evaluation of economic forecasts. In Economic Forecasts and Expectations, NBER.
  • Moreira, A., & Muir, T. (2017). Volatility-managed portfolios. Journal of Finance, 72(4), 1611-1644. DOI
  • J.P. Morgan / Reuters (1996). RiskMetrics Technical Document, 4th ed.
  • Bollerslev, T. (1986). Generalized autoregressive conditional heteroskedasticity. Journal of Econometrics, 31(3), 307-327. DOI
  • Glosten, L. R., Jagannathan, R., & Runkle, D. E. (1993). On the relation between the expected value and the volatility of the nominal excess return on stocks. Journal of Finance, 48(5), 1779-1801. DOI
  • Harvey, D., Leybourne, S., & Newbold, P. (1997). Testing the equality of prediction mean squared errors. International Journal of Forecasting, 13(2), 281-291. DOI
blog.disclaimer

MarketMaker.cc Team

Сандық зерттеулер және стратегия

Telegram-да талқылау
Newsletter

Нарықтан бір қадам алда болыңыз

AI сауда талдаулары, нарық аналитикасы және платформа жаңалықтары үшін біздің ақпараттық бюллетеньге жазылыңыз.

Біз сіздің жекелігіңізді құрметтейміз. Кез келген уақытта жазылымнан шығуға болады.