GARCH(1,1): Kripto o'zgaruvchanligini bashorat qilish
BTC kunlik daromadlari grafigini oching va tasodifiy sayr haqidagi darsliklar sizni hech qachon tayyorlamagan bir narsani sezasiz: tinchlik va tartibsizlik klasterlar bo'lib keladi. 6% pasaygan kun kamdan-kam yolg'iz bo'ladi. U 4-8% tebranishlar bilan bir haftaning ichida joylashadi, keyin bozor nafas oladi va navbatdagi bo'rondan oldin uyquchan 1% seansli bir oy davomida siljiydi. Daromadlarning o'zi deyarli bashorat qilib bo'lmaydigandek ko'rinadi — ertaga o'sadimi yoki tushadimi, buni ishonchli aytolmaysiz — lekin ularning kattaligi chuqur bashoratlanadigan. Bugungi notinchlik ertangi haqida ko'p narsani aytadi.
Treyder murojaat qiladigan deyarli har bir risk vositasi bu haqiqat emas deb sokin taxmin qiladi. Black-Scholes optsionni yagona doimiy bilan baholaydi. Statik Value-at-Risk raqami bitta o'zgaruvchanlik bahosini normal kvantilga ko'paytiradi. Qat'iy 3% stop-loss o'lik yon harakatli seshanbani va FOMC nashri yoki yirik birjaning de-peg atrofidagi soatlarni bir xil riskni ko'targandek muomala qiladi. Bularning har biri aynan bir xil tarzda buziladi: u vaqt bo'yicha o'zgaruvchan miqdorni doimiyga qisqartiradi, keyin esa doimiy o'zgarib chiqqanda hayron qoladi.
Ushbu maqola kripto uchun o'zgaruvchanlikni modellashtirish bo'yicha to'rt qismli seriyaning 1-qismi. U poydevorni quradi: GARCH(1,1) modeli, u nima uchun kripto daromadlariga shunchalik yaxshi mos keladi, uni arch kutubxonasi bilan maksimal ehtimollik orqali qanday halol baholash va shartli-dispersiya bashoratini darhol foydali ikkita narsaga — bozor bilan birga nafas oladigan pozitsiya hajmi va stop kengligiga qanday aylantirish. 2-qism asimmetriya va og'ir dumlarni qo'shadi, 3-qism ko'p o'lchovli bo'ladi, 4-qism esa to'liq o'zgaruvchanlikka yo'naltirilgan backtestni yig'adi. Bu yerda ilovani ataylab sodda tutamiz; halol, walk-forward bilan tekshirilgan strategiya 4-qismning mavzusi.
Kripto daromadlarining stilizatsiyalangan faktlari
Biror narsani modellashtirishdan oldin, nimani takrorlashga urinayotganimizni aniq belgilash foydali. Empirik moliyaviy daromadlar — aktsiyalar, FX va ayniqsa kripto — o'nlab yillar davomida hujjatlashtirilgan kuchli statistik muntazamliklarning kichik to'plamini baham ko'radi. Ular odatda stilizatsiyalangan faktlar deb ataladi va ulardan uchtasi keyingi hamma narsani boshqaradi.
1. O'zgaruvchanlik klasterlanishi. Katta harakatlar odatda katta harakatlardan (istalgan belgidagi) keyin, kichik harakatlar esa kichik harakatlardan keyin keladi. Mandelbrot buni 1963 yilda paxta narxlarida sezgan. Rasmiy jihatdan, daromadlari deyarli ketma-ket korrelyatsiyalanmagan bo'lsa-da, kvadratlangan daromadlar (amalga oshgan dispersiya uchun proksi) kuchli, sekin so'nadigan musbat avtokorrelyatsiyani ko'rsatadi.
2. Semiz dumlar (leptokurtoz). Daromadlarning shartsiz taqsimoti chekkalarida Gauss taqsimotidan ancha ko'proq massaga ega. Normal taqsimotning kurtozi 3 bo'lgan joyda, BTC kunlik log-daromadlari muntazam ravishda 8-10 dan yuqori turadi, yuqori chastotali kripto daromadlari esa yomonroq bo'lishi mumkin. Normal model taxminan bir million yilda bir marta sodir bo'lishi kerak deyilgan olti-sigma kunlari, o'n yilda bir necha marta paydo bo'ladi.
3. Daromadlarda chiziqli avtokorrelyatsiya yo'q, kvadratlangan daromadlarda kuchli avtokorrelyatsiya. Bu haqiqiy o'zgaruvchanlik jarayonini oddiy trenddan ajratadigan barmoq izi. Agar siz ni uning o'z lag'lariga regressiya qilsangiz, foydalanish mumkin bo'lgan hech narsa olmaysiz. Agar siz ni uning lag'lariga regressiya qilsangiz, aniq, davomli signalni topasiz. Bu aynan dispersiya modeli qamrab olishi kerak bo'lgan tuzilma — va aynan doimiy- modeli tashlab yuboradigan narsa.
Uchchalasini ham bir necha qatorda ko'zdan kechirishimiz mumkin. Bu yerda hech narsa maxsus ma'lumot manbasini talab qilmaydi; produkshnda ccxt dan foydalaning, lekin takrorlanadigan snippet uchun yfinance yetarli.
import numpy as np
import pandas as pd
import yfinance as yf
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.stats.diagnostic import acorr_ljungbox
from scipy import stats
px = yf.download("BTC-USD", start="2021-01-01", end="2025-12-31")["Close"]
ret = np.log(px / px.shift(1)).dropna() # log returns
ret = ret.rename("btc")
print(f"Observations: {len(ret)}")
print(f"Ann. volatility: {ret.std() * np.sqrt(365):.2%}")
print(f"Skewness: {stats.skew(ret):.2f}")
print(f"Excess kurtosis: {stats.kurtosis(ret):.2f}") # 0 == Gaussian
lb_ret = acorr_ljungbox(ret, lags=[10], return_df=True)
lb_ret2 = acorr_ljungbox(ret ** 2, lags=[10], return_df=True)
print("\nLjung-Box p-value, returns (lag 10):", float(lb_ret["lb_pvalue"].iloc[0]))
print("Ljung-Box p-value, squared (lag 10):", float(lb_ret2["lb_pvalue"].iloc[0]))
Odatiy o'qish (illyustrativ — sizning oynangiz farq qiladi): ortiqcha kurtoz 3 dan ancha yuqori, xom daromadlardagi Ljung-Box p-qiymati "avtokorrelyatsiya yo'q" ni rad eta olmaydi, kvadratlangan daromadlardagi p-qiymati esa amalda nolga teng. O'sha oxirgi qarama-qarshilik butun o'yin. Kunlik gorizontda daromadlar belgisida savdo qiladigan hech narsa yo'q, lekin ularning dispersiyasida juda ko'p tuzilma bor va o'sha tuzilma bashoratlanadi.
Kriptoning 24/7 tabiati haqida eslatma. Aktsiyalardan farqli o'laroq, tunlik uzilish va dam olish kunlarining yopilishi yo'q, shuning uchun "kun" toza 24 soatlik bar bo'ladi va yillikka aylantirish koeffitsienti emas, balki . O'zgaruvchanlik klasterlanishi kun ichidagi masshtablarda ham saqlanib qoladi, bu esa siz GARCH ni soatlik barlarda ishlatsangiz muhim — moliyalashtirish stavkasi o'zgarishlari va likvidatsiya kaskadlari kunlik model silliqlashtiradigan keskin, klasterlangan dispersiya portlashlarini kiritadi.
ARCH dan GARCH ga
Muammo endi keskin qo'yildi: doimiy bo'lmagan, balki yaqin o'tmishga bog'liq bo'lgan dispersiyani modellashtiring. Buni to'g'ri bajargan birinchi model Engle'ning ARCH (Autoregressive Conditional Heteroskedasticity, 1982) modeli bo'lib, u 2003 yilda unga Nobel mukofotini olib berdi.
Daromadni shartli o'rtacha ortiga zarba qo'shilishi sifatida yozing:
Bu yerda — shartli dispersiya — vaqtigacha ma'lum bo'lgan hamma narsa berilgan holda ning dispersiyasi — va standartlashtirilgan innovatsiya (eng oddiy holatda standart normal). "Shartli" so'zi butun ishni bajaradi: shartsiz ravishda dispersiya doimiy bo'lishi mumkin, lekin kechagi kunga bog'liq holda u harakatlanadi.
Engle'ning ARCH() modeli bugungi dispersiyani oxirgi ta kvadratlangan zarbaning tortilgan yig'indisiga aylantiradi:
dispersiyani musbat saqlash uchun va bilan. Bu klasterlanishni bevosita qamrab oladi: katta zarba ni yuqoriga suradi, bu esa boshqa katta zarba imkoniyatini oshiradi, bu esa dispersiyani ko'tarilgan holatda ushlab turadi. Muammo empirik so'nishda. Haqiqiy bozorlardagi o'zgaruvchanlik davomiyligi ko'plab lag'larga cho'ziladi, shuning uchun uni moslashtirish uchun ARCH modeliga katta kerak — ko'pincha 8, 10 yoki undan ko'p — va bu overfittingga moyil bo'lgan uzun, beqaror vektorini baholashni anglatadi.
Bollerslev'ning 1986 yildagi tushunchasi barcha o'sha davomiylikni bitta parametr bilan yutadigan atamani qo'shish edi. GARCH(1,1) — Generalized ARCH — rekursiyasi:
Uch parametr, uch aniq talqin:
- — bazaviy daraja yoki pol. Dispersiyaning uzoq muddatli darajasini mahkamlaydigan doimiy. Dispersiya hech qachon qo'llab-quvvatlaydigan darajadan pastga tushmaydi.
- — yangilikka reaktsiya. Dispersiya kechagi ajablanish ga qanchalik shiddat bilan javob beradi. Katta shartli dispersiya sakrovchan va zarbaga sezgir ekanligini anglatadi.
- — davomiylik yoki xotira. Kechagi dispersiyaning qanchasi bugunga o'tadi. Katta o'zgaruvchanlik silliq va sekin so'nishini anglatadi — tinchlik tinch qoladi, bo'ronlar bo'ronli qoladi.
Nafislik rekursiyada. ning o'zi atamasini o'z ichiga olganligi sababli, orqaga qarab kengaytirish GARCH(1,1) o'tmishdagi kvadratlangan zarbalarga geometrik tarzda so'nadigan og'irliklari bilan ARCH() ekanligini ko'rsatadi:
Shunday qilib, yagona sizga o'tmishdagi zarbalarning cheksiz, eksponensial tarzda tortilgan xotirasini beradi. Aynan shu sababli oddiy GARCH(1,1) — uch parametr — muntazam ravishda o'nta parametrli ARCH modellaridan ustun keladi va nima uchun u amaliy o'zgaruvchanlikni modellashtirishning asosiy vositasiga aylandi. Aslida, u RiskMetrics EWMA dispersiya baholovchisining yaqin qarindoshi bo'lib, u , , esa 0.94 da qat'iy belgilangan maxsus holat. GARCH uni , va haqiqiy o'rtachaga qaytish darajasini ma'lumotlar tanlashiga ruxsat berish orqali umumlashtiradi.
Xususiyatlar: Statsionarlik, uzoq muddatli dispersiya va yarim yemirilish davri
GARCH(1,1) rekursiyasining bir necha xususiyatlarini keltirib chiqarish o'rinli, chunki ular sizga modelni ko'r-ko'rona moslashtirishdan ko'ra, u haqida fikr yuritishga imkon beradigan narsalar.
Shartsiz (uzoq muddatli) dispersiya. Jarayon kovariatsion-statsionar deb faraz qiling, shunda shartsiz dispersiya mavjud va vaqt bo'yicha doimiy. Rekursiyaning ikkala tomonining matematik kutilmasini oling. bo'lganligi sababli:
Bu o'zgaruvchanlik o'rtachaga qaytadigan daraja. U faqat bo'lganda mavjud — va faqat musbat.
Statsionarlik sharti. O'sha bir tengsizlik,
GARCH(1,1) uchun kovariatsion-statsionarlik sharti. miqdori dispersiya jarayonining davomiyligi: bu dispersiya zarbasi ga qanday so'nishini boshqaradigan AR(1) koeffitsienti. Agar bo'lsa, shartsiz dispersiya cheksiz (yoki aniqlanmagan) bo'ladi va zarbalar hech qachon to'liq o'lmaydi.
Biz o'rtachaga qaytishni aniq ko'rishimiz mumkin. Dispersiya og'ishini deb aniqlang. Rekursiya ustidagi biroz algebra ( ni almashtirish) kutilma bo'yicha beradi:
Joriy dispersiya va uning uzoq muddatli darajasi orasidagi bo'shliq har qadamda koeffitsientiga kamayadi. Bu aynan biz keyinroq foydalanadigan ko'p qadamli bashorat.
O'zgaruvchanlikning yarim yemirilish davri. Dispersiya zarbasining normaga yarim yo'l so'nishi qancha vaqt oladi? ni qo'ying va yeching:
uchun yarim yemirilish davri taxminan 13.5 kun; uchun taxminan 34 kun; uchun taxminan 69 kun. Bu yagona raqam ko'pincha xom parametrlarga qaraganda intuitivroq — u sizga o'zgaruvchanlik qanchalik yopishqoq ekanligini barlaringiz birliklarida aytadi.
Kriptodagi IGARCH ga yaqin muammo. Mana kriptoga xos nozik jihat. GARCH(1,1) ni BTC yoki ETH daromadlariga moslashtirganingizda, deyarli har doim 1 ga juda yaqin ekanligini topasiz — 0.98, 0.99, ba'zan 0.995 qiymatlar odatiy. Bu IGARCH (Integrated GARCH) ga yaqin rejim. Uning haqiqiy oqibatlari bor:
- Yarim yemirilish davri ulkanlashadi (haftalar-oylar), shuning uchun model o'zgaruvchanlikni juda davomli va deyarli o'rtachaga qaytmaydigan deb muomala qiladi.
- bahosi o'ta sezgir bo'lib qoladi: ning 0.99 dan 0.995 gacha kichik o'zgarishi nazarda tutilgan uzoq muddatli dispersiyani ikki barobar oshiradi. Bu rejimda uzoq muddatli o'zgaruvchanlikning nuqta bahosiga ishonch oralig'isiz hech qachon ishonmang.
- Ko'p qadamli bashoratlar shunchalik sekin o'rtachaga qaytadiki, bir necha haftadan kam amaliy gorizontlar uchun GARCH deyarli dispersiyadagi tasodifiy sayr kabi (bu EWMA taxmin qiladigan narsa) o'zini tutadi.
Integratsiyaga yaqinlik haqiqiymi yoki tuzilmaviy uzilishlarning artefaktimi (o'zgaruvchanlik darajasining doimiy siljishi model tomonidan bitta uzun davomli epizod sifatida o'qilishi) — bu haqiqiy bahs. Bu bir marta butun tarixga moslashtirish o'rniga aylanuvchi oynalarda qayta moslashtirishning yana bir sababi bo'lib, biz bu nuqtaga tuzoqlarda qaytamiz. Rejim tuzilmasi ayniqsa aniq almashinuvchi model bilan yaxshiroq boshqariladi — yashirin Markov modellari bilan rejimni aniqlash ga qarang, u GARCH ga o'rinbosar emas, balki uni to'ldiruvchi.
Maksimal ehtimollik bilan baholash
GARCH parametrlari maksimal ehtimollik bilan baholanadi. Mantiq to'g'ridan-to'g'ri: berilgan holda, rekursiya shartli dispersiyalarning to'liq yo'lini hosil qiladi va innovatsiyalar uchun faraz qilingan taqsimot ostida kuzatilgan daromadlar qanchalik ehtimolli ekanligini yozib olishimiz mumkin. Keyin biz ni o'sha ehtimollikni maksimallashtirish uchun tanlaymiz.
Gauss innovatsiyalarini deb faraz qiling, shunda . Bitta kuzatuvning shartli zichligi
Model shartli tarzda yozilganligi sababli, birgalikdagi ehtimollik bir qadam oldinga zichliklar ko'paytmasiga bo'linadi va log-ehtimollik oddiy yig'indi:
Sezish kerak bo'lgan ikkita tuzilmaviy fakt. Birinchidan, ham jarima ( — model yuqori dispersiyani da'vo qilgani uchun jazolanadi), ham standartlashtirilgan qoldiqda ( — model ajablangani uchun jazolanadi) paydo bo'ladi. Optimum ikkalasini muvozanatlashtiradi, bu esa dispersiyaning kuzatishini ta'minlaydi. Ikkinchidan, rekursiyaga urug' kerak; odatiy tanlov daromadlarning namuna dispersiyasi va bir necha ming kuzatuv bilan urug' deyarli ahamiyatga ega emas.
Maksimallashtiruvchi uchun yopiq shakl yo'q, shuning uchun biz sonli optimallashtiramiz (arch analitik yoki sonli gradientli kvazi-Nyuton usulini ishlatadi). Ehtimollik yuzasi GARCH(1,1) uchun odatda yaxshi tutadi, lekin amalda ikkita narsa tishlaydi: musbatlik cheklovlari () va bo'lganda chegaraga yaqin xatti-harakat, u yerda optimizatorning sekin sudralishi mumkin. Ikkalasi ham yaxshi kutubxona tomonidan siz uchun boshqariladi — va siz undan foydalanishingiz kerak. GARCH MLE ni qo'lda yozish yaxshi o'quv mashqi, lekin yomon produkshn tanlovi.
arch kutubxonasi
Kevin Sheppard'ning arch paketi Python'da standart vosita. Butun moslash to'rt qatordan iborat.
from arch import arch_model
r = ret * 100.0
model = arch_model(r, mean="Constant", vol="Garch", p=1, q=1, dist="normal")
res = model.fit(disp="off")
print(res.summary())
Argument nomlari haqida bir og'iz so'z, chunki ular tez-tez chalkashlik manbai. arch da p — lagli dispersiyalar soni ( atamalari, GARCH tartibi) va q — lagli kvadratlangan qoldiqlar soni ( atamalari, ARCH tartibi). Shunday qilib, p=1, q=1 biz keltirib chiqargan GARCH(1,1). (Bollerslev'ning asl belgilashi uni ARCH tartibi uchun bilan GARCH() deb yozadi — ikki konventsiya transponirlangan. Xotirangizga emas, kutubxonaning o'z hujjatlariga ishoning.)
Xulosani o'qib, koeffitsientlar jadvali taxminan bunday ko'rinadi (BTC kunlik daromadlari uchun illyustrativ qiymatlar, haqiqiy tajriba emas):
Volatility Model
==========================================================
coef std err t P>|t|
----------------------------------------------------------
omega 0.4821 0.201 2.40 0.016
alpha[1] 0.0912 0.021 4.34 0.000
beta[1] 0.8994 0.024 37.5 0.000
==========================================================
Uni qanday o'qish kerak:
alpha[1] + beta[1]= 0.0912 + 0.8994 = 0.9906. Davomiylik 1 dan bir oz past — IGARCH ga yaqin rejim, aynan ogohlantirilganidek. Yarim yemirilish davri kun.omega= 0.4821, shuning uchun uzoq muddatli dispersiya foiz-kvadrat birliklarida, ya'ni uzoq muddatli kunlik o'zgaruvchanlik , yoki taxminan yillik. Bu ishonarli BTC raqami.- Ham
alpha, hambetakuchli ahamiyatli.alphaningbetaga nisbatan kichik bo'lishi odatiy: kripto dispersiyasi asosan davomiylik (xotira) bo'lib, yangi zarbalarga o'rtacha, lekin haqiqiy reaktsiya bilan.
×100 masshtablash tuzog'i
Bu arch dan bema'nilik olishning eng keng tarqalgan yo'li, shuning uchun u o'z kichik bo'limini oqlaydi. Optimizator ko'rgan raqamlar dan gacha bo'lganda eng yaxshi ishlaydi. Kunlik log-daromadlar , shuning uchun ularning kvadratlari va taxminan atrofida bo'lishi kerak — sonli gradientlar aniqligini yo'qotadigan va moslash sokin ravishda yaqinlasha olmaydigan yoki keraksiz standart xatolarni qaytaradigan diapazonda.
Yechim — 100 ga masshtablangan daromadlarga (ya'ni foizda) moslash, yuqoridagidek. Agar unutsangiz, arch hatto DataScaleWarning chiqaradi. Keyin modeldan o'qigan hamma narsa foiz yoki foiz-kvadrat birliklarida bo'ladi va siz uni izchil masshtabsizlantirishingiz kerak:
sigma_pct = np.sqrt(res.forecast(horizon=1).variance.iloc[-1, 0])
sigma_decimal = sigma_pct / 100.0
print(f"1-day-ahead conditional vol: {sigma_decimal:.2%}")
Masshtablangan va masshtablanmagan miqdorlarni aralashtirish — masalan, o'nlik kutilgan pozitsiya hajmi formulasiga foiz o'zgaruvchanligini berish — aynan 100x xatolarni keltirib chiqaradi, ularni sezish oson emas, chunki kod muammosiz ishlaydi. Konventsiya tanlang (men moslash tashqarisida hamma narsani o'nlik saqlayman va faqat arch chegarasida masshtablayman) va uni hech qachon buzmang.
Shartli dispersiyani bashorat qilish
Moslashtirilgan model faqat bashorat qilsagina foydali. GARCH istalgan gorizontda toza, analitik bashoratlar beradi.
Bir qadam oldinga. vaqtida (namunaning oxiri) biz va ni bilamiz, shuning uchun keyingi dispersiya deterministik:
Kutilma kerak emas — o'ngdagi hamma narsa kuzatilgan.
Ko'p qadam oldinga. uchun biz oraliq zarbalarni hali bilmaymiz, shuning uchun shartli kutilmalarni olamiz. (chunki ) dan foydalanib, rekursiya bashorat qilingan dispersiyada oddiy AR(1) ga qisqaradi:
Buni bir qadamli bashoratdan takrorlash yopiq shaklni beradi, bu esa biz avval keltirib chiqargan o'rtachaga qaytish natijasining aniq yozilgani:
Buni diqqat bilan o'qing, chunki bu har bir GARCH bashoratining geometriyasi. Dispersiyaning muddat tuzilmasi bugungi shartli dispersiya dan boshlanadi va uzoq muddatli daraja ga geometrik tarzda so'nadi. Agar bugun o'rtachadan tinchroq bo'lsa, bashorat egri chizig'i ga ko'tariladi; agar bugun inqiroz bo'lsa, u unga tushadi. O'sha so'nish tezligi butunlay tomonidan belgilanadi — va bo'lgan IGARCH ga yaqin kripto rejimida so'nish shunchalik sekinki, bir necha haftadan kam gorizontlar uchun bashorat bugungi darajadan deyarli qimirlamaydi. Buni ichlashtirishga arziydi: qisqa ushlab turish davrlari uchun kripto GARCH bashorati asosan "ertaga bugungiga o'xshaydi, faqat juda sekin qaytadi".
Ushlab turish gorizontiga jamlash. Treyderlar kamdan-kam bitta kelajak kunining dispersiyasi haqida qayg'uradilar. Agar siz pozitsiyani kun ushlab tursangiz va daromadlar shartli ravishda korrelyatsiyalanmagan bo'lsa (boshdan olingan stilizatsiyalangan fakt), jami -kunlik daromadning dispersiyasi bir kunlik bashorat dispersiyalari yig'indisi:
Bu siz aslida qarshi hajm belgilaydigan raqam — ushlab turish davringizdagi P&L o'zgaruvchanligi. E'tibor bering, bu qat'iy ravishda dispersiya doimiy bo'lsagina to'g'ri bo'lgan sodda masshtablash emas. Bugungi dispersiya dan yuqori bo'lsa, o'rtachaga qaytadigan bashorat haqiqiy -kunlik o'zgaruvchanlikni kvadrat-ildiz qoidasidan pastroq qiladi; bugun tinch bo'lsa, u yuqoriroq. Buni to'g'ri qilish muddat tuzilmasini hurmat qiladigan stop va uni hurmat qilmaydigan stop orasidagi farq.
Kodda:
H = 10
fc = res.forecast(horizon=H, reindex=False)
var_path_pct2 = fc.variance.iloc[-1].values # [E_T sigma^2_{T+1}, ..., T+H]
var_path = var_path_pct2 / (100.0 ** 2) # back to decimal variance
daily_vol = np.sqrt(var_path)
print("Forecast daily vol path:", np.round(daily_vol * 100, 2), "%")
H_day_var = var_path.sum()
H_day_vol = np.sqrt(H_day_var)
print(f"{H}-day holding-period vol: {H_day_vol:.2%}")
naive = np.sqrt(var_path[0] * H)
print(f"Naive sqrt(H) * sigma_1: {naive:.2%}")
Uzoqroq gorizontlar uchun GARCH simulyatsiya bashoratlarini ham qo'llab-quvvatlaydi (method="simulation"), ular innovatsiya taqsimotini oldinga tarqatadi va sizga faqat uning dispersiyasini emas, balki to'liq bashorat zichligini beradi — bu innovatsiyalar Gauss bo'lmaganda foydali, 2-qismda Student-t va qiya taqsimotlarga o'tganimizda shunday bo'ladi. Yuqoridagi dispersiyada-chiziqli miqdorlar uchun analitik yo'l aniq va bepul.
Diagnostika: Model haqiqatan ham ishladimi?
Modelni moslashtirish uni tekshirish bilan bir xil emas. GARCH ning butun mohiyati shartli geteroskedastiklikni — o'zgaruvchanlik klasterlanishini — yutish, shunda qoladigan narsa (deyarli) i.i.d. bo'lishi. Shuning uchun to'g'ri tekshiruv standartlashtirilgan qoldiqlarga
qarash va so'rash: klasterlanish ketdimi? Agar model dispersiya dinamikasini qamrab olgan bo'lsa, birlik dispersiyaga ega bo'lishi va, muhimi, ularning kvadratlari qolgan avtokorrelyatsiyani ko'rsatmasligi kerak. Biz uch test o'tkazamiz.
1. Standartlashtirilgan qoldiqlarda Ljung-Box. darajasida chiziqli avtokorrelyatsiya qolmaganligini tekshiradi (bu aslida dispersiya modelini emas, o'rtacha modelni sinaydi). Rad etmasligi kerak.
2. Kvadratlangan standartlashtirilgan qoldiqlarda Ljung-Box. Bu muhimi. Agar hali ham ahamiyatli avtokorrelyatsiyaga ega bo'lsa, dispersiya modeli klasterlanishni olib tashlay olmadi — GARCH(1,1) qamrab olmagan tuzilma bor va sizga yuqoriroq tartib, asimmetrik variant yoki boshqa innovatsiya taqsimoti kerak bo'lishi mumkin. Rad etmasligi kerak.
3. ARCH-LM testi (Engle'ning Lagranj-multiplikatori testi). ni uning o'z lag'lariga regressiya qiling va birgalikdagi ahamiyatlilikni sinang. Bu aslida 2-testning rasmiy versiyasi va bevosita "qolgan ARCH effekti bormi?" deb so'raydi. Ahamiyatsiz natija shartli geteroskedastiklik modellashtirib olib tashlanganini tasdiqlaydi.
from statsmodels.stats.diagnostic import acorr_ljungbox
from arch.unitroot.cointegration import engle_granger # (unrelated; shown for import clarity)
z = res.std_resid.dropna() # standardized residuals
z2 = z ** 2
lb_z = acorr_ljungbox(z, lags=[10, 20], return_df=True)
lb_z2 = acorr_ljungbox(z2, lags=[10, 20], return_df=True)
print("Ljung-Box on standardized residuals:\n", lb_z, "\n")
print("Ljung-Box on SQUARED standardized residuals:\n", lb_z2, "\n")
lm = res.arch_lm_test(lags=10, standardized=True)
print(lm)
print(f"\nStd-resid excess kurtosis: {stats.kurtosis(z):.2f}")
Yaxshi natija qanday ko'rinadi: dagi Ljung-Box p-qiymatlari nolga yaqindan (xom kvadratlangan daromadlarda) 0.05 dan bemalol yuqoriga sakraydi va ARCH-LM testi rad eta olmaydi. Bu sizning modelingiz ikkinchi moment ustida o'z ishini bajarganligining dalili.
Nomukammal natija qanday ko'rinadi — va oddiy Gauss GARCH(1,1) bilan kriptoda nimani kutish kerak — bu klasterlanish testlari o'tadi, lekin standartlashtirilgan-qoldiq kurtozi hali ham ko'tarilgan (aytaylik, 0 emas, 4-6). GARCH klasterlanishni olib tashlaydi, lekin bitta semiz-dumli shartsiz taqsimot qoladi, chunki Gauss innovatsiyalari dumlarni takrorlay olmaydi. Bu qoldiq semiz-dumlilik bu yerda tuzatiladigan xato emas; u 2-qism, asimmetrik GARCH va kriptodagi leverage effekti uchun motivatsiya, u yerda Student-t va qiya-t innovatsiyalari hamda GJR/EGARCH asimmetriya atamasi aynan shuni hal qiladi.
Ilova: O'zgaruvchanlikka masshtablangan hajmlash va stoplar
Endi bizda ertangi (va keyingi kunning) o'zgaruvchanligining bashorati bor. Biz u bilan nima qilamiz? Ikki eng oddiy, eng yuqori qiymatli foydalanish — pozitsiya hajmlash va stop joylashtirish. Ikkalasini ham bu yerda ataylab asosiy tutamiz — barcha amaliy mexanizmi bilan to'liq o'zgaruvchanlikka yo'naltirilgan strategiya 4-qism.
O'zgaruvchanlikka yo'naltirilgan pozitsiya hajmlash
G'oya — notsionali doimiy bo'lgan pozitsiyani emas, balki risk hissasi vaqt bo'yicha taxminan doimiy bo'lgan pozitsiyani ushlab turish. Agar siz doim bir xil dollarli hajm joylashtirsangiz, sizning riskingiz yuqori-o'zgaruvchanlik rejimlarida shishadi va tinch rejimlarda qisqaradi — siz xohlagan narsaning aksi. O'zgaruvchanlikka yo'naltirish buni teskari qiladi: P&L ning qat'iy maqsadli o'zgaruvchanligiga intiling va bashorat hajmni diktatsiya qilsin.
Maqsadli yillik o'zgaruvchanlik (aytaylik, 20%) va bashorat qilingan yillik o'zgaruvchanlik uchun pozitsiya og'irligi
Bashorat o'zgaruvchanligi yuqori bo'lganda, siz pastga masshtablaysiz; u past bo'lganda, siz yuqoriga masshtablaysiz. Bu butun mexanizm. bashorat bo'lgani sababli — dagi daromad amalga oshishidan oldin da ma'lum — vaqtni belgilashda intizomli bo'lsangiz, oldinga qarash yo'q (bu haqda tuzoqlarda ko'proq).
def vol_target_weight(sigma_forecast_annual, sigma_target_annual=0.20,
w_max=3.0):
"""Volatility-scaled position weight. Inputs/outputs in decimals.
w_max caps leverage so a tiny forecast vol can't demand insane size."""
w = sigma_target_annual / sigma_forecast_annual
return float(np.clip(w, 0.0, w_max))
sigma_1d = np.sqrt(res.forecast(horizon=1).variance.iloc[-1, 0]) / 100.0
sigma_ann = sigma_1d * np.sqrt(365)
w = vol_target_weight(sigma_ann, sigma_target_annual=0.20)
print(f"Forecast annual vol: {sigma_ann:.1%} -> position weight: {w:.2f}x")
Bu to'g'ri kapital-taqsimlash qoidalarining birinchi qarindoshi. O'zgaruvchanlikka yo'naltirish "risk o'zgaruvchanlik bilan qanchalik masshtablanishi kerak" ga javob beradi, Kelly mezoni esa "risk ustunlik bilan qanchalik masshtablanishi kerak" ga javob beradi — va ikkalasi to'liq hajmlash stekida birga ko'payadi: hajm ustunlik / dispersiya. E'tibor bering, Kelly'ning dispersiya atamasi aynan siz hozirgina hisoblagan GARCH bashorati, aynan shu sababli jonli o'zgaruvchanlik modeli Kelly hajmlashini statik tarixiy bahodan sezilarli darajada o'tkirlashtiradi. Agar sizning ustunlik bahoyingizning o'zi miqdorlangan noaniqlikni ko'tarsa, konformal bashorat hajmni mos ravishda kengaytirish yoki qisqartirish uchun taqsimotdan mustaqil usul beradi va u o'zgaruvchanlikka yo'naltirish bilan toza birlashadi.
w_max cheklovi ixtiyoriy emas. IGARCH ga yaqin rejimda tinch davr bashorat o'zgaruvchanligini ancha pastga surishi mumkin va qog'ozda yaxshi, lekin tinchlik buzilganda halokatli bo'lgan leverage'ni talab qiladi — bu, o'zgaruvchanlik klasterlanishiga ko'ra, oxir-oqibat, ko'pincha keskin sodir bo'ladi. Leverage'ni cheklash sizning bashoratingiz kafolat emas, shartli o'rtacha ekanligini va noto'g'ri bo'lish oqibati asimmetrik ekanligini qo'pol-lekin-samarali tan olish. O'sha asimmetriya — portlab ketgan hisob simmetrik yutuq bilan tiklanmaydi — aynan sizni faqat-dispersiya qoidasi taklif qilganidan tizimli ravishda ehtiyotkorroq qilishi kerak bo'lgan zarar-foyda asimmetriyasi.
O'zgaruvchanlikka masshtablangan stoplar
Qat'iy-foizli stop qat'iy pozitsiya hajmi bilan bir xil kasallikka ega: 3% stop tinch bozorda o'ta sezgir tirgak va shiddatli bozorda yaxlitlash xatosi. U yuqori-o'zgaruvchanlik rejimlarida oddiy shovqin bilan yaxshi pozitsiyalardan chiqarib yuboradi va o'tishlar davomida juda ko'p narsani qaytaradi. Yechim — stop masofasini bashorat o'zgaruvchanligi birliklarida belgilash.
bu yerda — sizning kutilgan ushlab turish gorizontingiz bo'yicha bashorat o'zgaruvchanligi (bashorat bo'limidagi jamlangan miqdor) va — ko'paytma — odatda 1.5 dan 3 gacha — stop normal tebranishdan tashqarida, lekin haqiqiy noqulay harakat ichida turishi uchun tanlanadi.
def vol_scaled_stop(entry_price, side, sigma_H, k=2.0):
"""
entry_price : fill price
side : +1 long, -1 short
sigma_H : forecast volatility over the holding horizon (decimal)
k : stop width in vol units
Returns the stop price.
"""
stop_frac = k * sigma_H
return entry_price * (1.0 - side * stop_frac)
var_path = res.forecast(horizon=10, reindex=False).variance.iloc[-1].values / (100.0 ** 2)
sigma_H = np.sqrt(var_path.sum())
entry = float(px.iloc[-1])
stop = vol_scaled_stop(entry, side=+1, sigma_H=sigma_H, k=2.0)
print(f"Entry {entry:,.0f} | 10-day vol {sigma_H:.2%} | 2-sigma stop {stop:,.0f}")
tekis tarixiy raqam o'rniga o'rtachaga qaytadigan muddat-tuzilma bashoratidan foydalanganligi sababli, stop notinch rejimlarga kirishda avtomatik ravishda kengayadi va o'zgaruvchanlik pasayganda torayadi — muddat tuzilmasi moslashishni siz uchun bajaradi. Bu ham hajmni, ham stopni ta'minlaydigan bir xil bashorat, bu esa xususiyat: yuqori-o'zgaruvchanlik rejimida siz bir vaqtning o'zida kamroq ushlaysiz va pozitsiyaga ko'proq joy berasiz, ikki effekt esa sezilarli darajada pastroq dum riskiga qo'shiladi. Hajmlash va stoplar bitta o'zgaruvchanlik ko'rinishining ikki proeksiyasi, ikki mustaqil tugma emas.
Biz 1-qismda ilovani shu qadar olib boramiz. Haqiqiy strategiya doimiy qayta muvozanatlashdan kelib chiqadigan tranzaktsiya xarajatlarini, bashorat qachon hisoblanishi va savdo qachon joylashtirilishi vaqtini, aylanma nazoratini va — eng muhimi — halol namunadan tashqari baholashni boshqarishi kerak. Bularning barchasi 4-qism: o'zgaruvchanlikka yo'naltirilgan GARCH strategiyasi, u yerda biz butun narsani quramiz va walk-forward sinovdan o'tkazamiz.
Tuzoqlar
GARCH ni moslash oson va o'zingizni aldashingiz oson. Nosozlik rejimlari izchil.
Daromad masshtablashi. Yuqorida yoritilgan, lekin bu birinchi raqamli xato, shuning uchun uni takrorlashga arziydi: arch ni daromadlar × 100 ga moslang va har bir chiqishni masshtabsizlantiring (dispersiyani ga, o'zgaruvchanlikni ga). Bu yerdagi sokin 100x xatosi har bir keyingi hajmlash va stop hisobini zaharlaydi.
Moslashda oldinga qarash. Nozik qotil. Agar siz modelni butun tarixga moslasangiz va keyin o'sha bir tarix bo'yicha "bashoratlar" ni hisoblasangiz, har bir bashorat yashirin ravishda kelajakni ko'rgan — parametrlar bashorat sanasidan keyingi ma'lumotlardan foydalanib baholangan. Namuna ichidagi moslash ajoyib ko'rinadi va jonli natija unga umuman o'xshamaydi. Har bir backtest qilingan bashorat faqat o'sha paytda mavjud bo'lgan ma'lumotlarga moslashtirilgan modeldan kelishi kerak: kengayuvchi yoki aylanuvchi oynada qayta moslang, bir qadam bashorat qiling, oldinga aylantiring. Bu muhokama qilib bo'lmaydigan va u butunlay walk-forward optimallashtirish mavzusi. Namuna ichidagi GARCH va to'g'ri walk-forward'i orasidagi bo'shliq demo va jonli bozorlar bilan aloqada omon qoladigan tizim orasidagi bo'shliq — shuningdek backtest-jonli parallellik ga qarang.
Bashorat vaqtini belgilash. Bog'liq, lekin farqli. kun uchun bashorat kunning yopilishida (yoki barlaringiz qachon yopilsa) mavjud bo'lgan ma'lumotdan hisoblanishi kerak va pozitsiya siz aslida ololadigan narxda bajarilishi kerak. kunning yopilishidan foydalanib bashoratni hisoblash va keyin kunning ochilishida "savdo qilish" har bir natijani sokin ravishda shishiradigan oldinga qarash.
Yuqori tartiblarni overfitting. GARCH(1,1) deyarli har doim yetarli. Namuna ichidagi log-ehtimollikni bir oz oshirgani uchun GARCH(2,2) yoki GARCH(3,1) ni moslash vasvasasi odatda shovqin-moslash; qo'shimcha parametrlar kamdan-kam namunadan tashqari bashoratlarni yaxshilaydi va ko'pincha optimizatorni chegaraga yaqin beqaror qiladi. Kam parametrli modelni afzal ko'ring va agar tartiblarni solishtirishingiz kerak bo'lsa, ularni namuna ichidagi AIC bo'yicha emas, balki walk-forward bo'linmasida namunadan tashqari bashorat yo'qotishi bo'yicha solishtiring. Qoldiq diagnostikasi hali ham muammoni ko'rsatganda, yechim odatda yuqoriroq tartib emas, balki yaxshiroq innovatsiya taqsimoti yoki asimmetriya atamasi (2-qism).
Tuzilmaviy uzilishlar davomiylik sifatida o'qildi. Ta'kidlanganidek, o'zgaruvchanlik darajasining doimiy siljishi (yangi bozor rejimi, bozor mikrostrukturasidagi o'zgarish) GARCH tomonidan soxta yuqori davomiylik sifatida yutilishi mumkin, ni 1 ga suradi. Agar uzoq muddatli o'zgaruvchanlik bahoyingiz oynalar bo'ylab beqaror ko'rinsa, IGARCH ga yaqin nuqta bahosiga ishonish o'rniga uzilishga shubha qiling. Aylanuvchi qayta moslashlar va, o'rinli bo'lganda, aniq rejim modeli bundan himoya qiladi.
O'zgaruvchanlik bashoratlarini daromad bashoratlari sifatida muomala qilish. GARCH harakatlarning yo'nalishini emas, kattaligini bashorat qiladi. U sizga ertangi tebranish qanchalik katta bo'lishi mumkinligini aytadi, qaysi tomon ekanligini emas. Aynan shuning uchun uning tabiiy uyi signal generatsiyasi emas, balki risk boshqaruvi — hajmlash, stoplar, VaR. Yaxshi dispersiya bashoratini ustunlik bilan chalkashtirmang.
Bu keyin qayerga boradi
GARCH(1,1) — poydevor va u ataylab to'liq emas. Seriya uni uch yo'nalishda quradi:
- Asimmetriya va og'ir dumlar — haqiqiy kripto o'zgaruvchanligi yuqori harakatlarga qaraganda pastga harakatlarga ko'proq javob beradi (leverage effekti) va Gauss innovatsiyalari dumlarni takrorlay olmaydi. GJR-GARCH, EGARCH va Student-t / qiya-t innovatsiyalari 2-qism.
- Ko'p o'lchovli o'zgaruvchanlik — kripto aktivlar orasidagi korrelyatsiyalarning o'zi vaqt bo'yicha o'zgaruvchan va qulashlarda keskin oshadi. Butun kovariatsiya matritsasini dinamik modellashtirish 3-qism: DCC-GARCH, u kovariatsiya dinamik bo'lgach, bevosita Markowitz o'rtacha-dispersiya va CVaR ga asoslangan taqsimlash ga ulanadi.
- To'liq strategiya — hajmlash, stoplar, xarajatlar, aylanma va halol walk-forward baholash 4-qism da birlashadi.
Va GARCH marginallari birgalikdagi riskni ta'minlaydigan joyda: bu yerdagi bir o'lchovli shartli-dispersiya modeli aynan portfel VaR/CVaR uchun GARCH-EVT-copula quvurining birinchi bosqichi. Aktivga-mos GARCH moslashidan standartlashtirilgan qoldiqlarga ega bo'lgach, siz ularni o'zgartirasiz va copula bilan birga yopishtirasiz — marginallar GARCH, bog'liqlik esa copula. O'sha qurilma, jumladan dum bog'liqligi va EVT dum ishlovi, birgalikdagi kripto risk uchun copula modellari da chuqur yoritilgan; bu maqola uning ostida turgan bir o'lchovli dvigatel.
Xulosa
- Kripto daromadlari o'zgaruvchanlik klasterlanishi, semiz dumlar va daromad avtokorrelyatsiyasi yo'q, lekin kuchli kvadratlangan-daromad avtokorrelyatsiyasini namoyish etadi. Doimiy o'zgaruvchanlikni taxmin qiladigan har qanday vosita — yagona bilan Black-Scholes, statik VaR, qat'iy-foizli stoplar — bu faktlarga qarshi noto'g'ri belgilangan.
- GARCH(1,1), , vaqt bo'yicha o'zgaruvchan shartli dispersiyani uch parametr bilan modellaydi: bazaviy , zarba reaktsiyasi va davomiylik . Bu geometrik tarzda so'nadigan xotirali ARCH(), aynan shuning uchun u yuqori-tartibli ARCH dan ustun keladi.
- Statsionarlik ni talab qiladi; uzoq muddatli dispersiya , davomiylik va o'zgaruvchanlikning yarim yemirilish davri . Kripto IGARCH ga yaqin rejimda () turadi: juda davomli, o'rtachaga sekin qaytadigan va mo'rt uzoq-muddatli-dispersiya bahosi bilan.
- Maksimal ehtimollik bilan baholang. Gauss log-ehtimolligi bir qadamli zichliklar yig'indisi; uni
arch_model(r*100, vol="Garch", p=1, q=1)bilan moslang. ×100 masshtablashni eslang va har bir chiqishni izchil masshtabsizlantiring. - Bashoratlar uzoq muddatli dispersiyaga tezlikda geometrik tarzda o'rtachaga qaytadi. Kunlik dispersiya bashoratlarini ushlab turish-gorizonti o'zgaruvchanligini olish uchun jamlang — sodda qoidasi emas.
- Tekshiring kvadratlangan standartlashtirilgan qoldiqlarda Ljung-Box va ARCH-LM testi bilan. Bularni o'tish klasterlanish modellashtirib olib tashlanganini tasdiqlaydi; qoladigan qoldiq semiz dumlar 2-qismni asoslaydi.
- Uni qo'llang o'zgaruvchanlikka yo'naltirilgan hajmlash (, cheklangan) va o'zgaruvchanlikka masshtablangan stoplarga (). Bitta bashorat ikkalasini boshqaradi, shuning uchun yuqori-o'zgaruvchanlik rejimlari bir vaqtning o'zida kichikroq hajm va kengroq stoplar oladi.
- Muhim tuzoqlar: daromad masshtablashi, moslashda oldinga qarash (faqat o'tmish ma'lumotlarga moslang, doim walk-forward), bashorat vaqtini belgilash, ortiqcha-tartiblash va dispersiya bashoratini yo'nalish bashorati bilan hech qachon aralashtirmaslik.
Manbalar:
- Engle, R. F. (1982). Autoregressive Conditional Heteroscedasticity with Estimates of the Variance of United Kingdom Inflation. Econometrica, 50(4), 987-1007. DOI
- Bollerslev, T. (1986). Generalized Autoregressive Conditional Heteroskedasticity. Journal of Econometrics, 31(3), 307-327. DOI
- Mandelbrot, B. (1963). The Variation of Certain Speculative Prices. The Journal of Business, 36(4), 394-419. DOI
- Nelson, D. B. (1991). Conditional Heteroskedasticity in Asset Returns: A New Approach. Econometrica, 59(2), 347-370. DOI
- Katsiampa, P. (2017). Volatility estimation for Bitcoin: A comparison of GARCH models. Economics Letters, 158, 3-6. DOI
- Chu, J., Chan, S., Nadarajah, S., & Osterrieder, J. (2017). GARCH Modelling of Cryptocurrencies. Journal of Risk and Financial Management, 10(4), 17. DOI
- Sheppard, K. (2023). arch: Autoregressive Conditional Heteroskedasticity (ARCH) and other tools for financial econometrics in Python. GitHub.
MarketMaker.cc Team
Miqdoriy tadqiqotlar va strategiya