← Maqolalarga qaytish
June 12, 2026
5 daqiqa o'qish

Xavf-xatarni Hisobga Oluvchi Pozitsiya Hajmini Belgilash uchun Konformal Bashorat

Xavf-xatarni Hisobga Oluvchi Pozitsiya Hajmini Belgilash uchun Konformal Bashorat
#uncertainty
#conformal-prediction
#risk
#position-sizing
#statistics
#algorithmic-trading
🧠
Part 4 of 4 · Collection
Deep Learning for Markets

Har qanday pozitsiya hajmini belgilash formulasi noaniqlik bahosini talab qiladi. Kelly mezoni g'alaba ehtimoli va to'lov nisbatini talab qiladi (qarang: Strategiyalar uchun Kelly mezoni). O'rtacha-dispersiya optimallashtirish kovariatsiya matritsasini talab qiladi. VaR daromad taqsimotini talab qiladi. Bularning barchasi ma'lumot yaratuvchi jarayon haqida farazlarni talab qiladi — moliyaviy bozorlar odatda buzadigan farazlarni.

Konformal bashorat boshqacha narsani taklif qiladi: hech qanday parametrik taqsimot farazisiz, chekli tanlanma qamrov kafolatiga ega bashorat intervallari. Agar siz 90% qamrov so'rasangiz, kamida 90% qamrov olasiz — daromadlar Gauss, qalin dumli, egik yoki geteroskedastik bo'lishidan qat'i nazar. Yagona talab — almashinuvchanlik (exchangeability), yoki ko'ramizki, undan zaifroq shartlar.

Ushbu maqolada nazariya, asosiy variantlar va Python'da pozitsiya hajmini belgilash uchun amaliy amalga oshirish yoritilgan.

Asosiy G'oya: Nonconformity Ballari

Kvantil chegarasi belgilangan nonconformity (qoldiq) ballarining taqsimoti — konformal kalibratsiyaning yadrosi

Konformal bashorat yangi kuzatuvning o'tmish ma'lumotlarga nisbatan qanchalik "g'alati" ekanligini o'lchash orqali ishlaydi. Bu g'alatilik nonconformity balli bilan miqdorlashtiriladi — bu ma'lumot nuqtasi qolgan ma'lumotlarda ko'rilgan namunaga qanchalik yomon mos kelishini o'lchaydigan har qanday funktsiya.

Regressiya uchun (daromad kabi uzluksiz qiymatni bashorat qilish), eng oddiy nonconformity balli mutlaq qoldiqdir:

Ri=Yiμ^(Xi)R_i = |Y_i - \hat{\mu}(X_i)|

bu yerda μ^\hat{\mu} istalgan nuqta bashoratchisi (chiziqli regressiya, random forest, neyron tarmoq — farqi yo'q), (Xi,Yi)(X_i, Y_i) esa ma'lumot nuqtasi.

Asosiy tushuncha: agar (X1,Y1),,(Xn,Yn),(Xn+1,Yn+1)(X_1, Y_1), \ldots, (X_n, Y_n), (X_{n+1}, Y_{n+1}) ma'lumot nuqtalari almashinuvchan bo'lsa, u holda Rn+1R_{n+1} ning R1,,Rn,Rn+1R_1, \ldots, R_n, R_{n+1} orasidagi darajasi {1,,n+1}\{1, \ldots, n+1\} ustida bir tekis taqsimlangan bo'ladi. Bu sof kombinatorik fakt — u XX yoki YY ning taqsimoti haqida hech qanday faraz talab qilmaydi.

Ushbu daraja bir tekisligidan biz chekli tanlanma qamroviga ega bashorat intervallarini qurishimiz mumkin.

Split Konformal Bashorat

Split konformal bashorat: ma'lumotlar o'quv va kalibratsiya qismlariga bo'lingan, kalibratsiya qoldiqlari bashorat intervallarini hosil qiladi

Split konformal bashorat (Papadopoulos va boshq., 2002; Lei va boshq., 2018) eng amaliy variantdir. Algoritm oddiy:

1-qadam. Ma'lumotlarni o'quv to'plami Dtrain\mathcal{D}_{\text{train}} va kalibratsiya to'plami Dcal={(X1,Y1),,(Xn,Yn)}\mathcal{D}_{\text{cal}} = \{(X_1, Y_1), \ldots, (X_n, Y_n)\} ga bo'ling.

2-qadam. Dtrain\mathcal{D}_{\text{train}} da istalgan μ^\hat{\mu} modelini moslashtiring.

3-qadam. Kalibratsiya to'plamida nonconformity ballarini hisoblang:

Ri=Yiμ^(Xi),i=1,,nR_i = |Y_i - \hat{\mu}(X_i)|, \quad i = 1, \ldots, n

4-qadam. Xohlagan qamrovsizlik darajasi α(0,1)\alpha \in (0, 1) uchun q^\hat{q} ni R1,,RnR_1, \ldots, R_n ning (1α)(n+1)n\frac{\lceil (1 - \alpha)(n + 1) \rceil}{n} empirik kvantili sifatida oling. Aniqrog'i, bu (1α)(n+1)\lceil (1 - \alpha)(n + 1) \rceil-chi eng kichik qoldiq (va (1α)(n+1)>n\lceil (1 - \alpha)(n + 1) \rceil > n bo'lganda, ya'ni juda kichik nn uchun, q^=+\hat{q} = +\infty).

5-qadam. Yangi Xn+1X_{n+1} nuqtasi uchun bashorat intervali:

C(Xn+1)=[μ^(Xn+1)q^,  μ^(Xn+1)+q^]C(X_{n+1}) = \left[\hat{\mu}(X_{n+1}) - \hat{q}, \; \hat{\mu}(X_{n+1}) + \hat{q}\right]

Qamrov Kafolati

Kalibratsiya ma'lumotlari va yangi test nuqtasining almashinuvchanligi ostida:

P(Yn+1C(Xn+1))1α\mathbb{P}\left(Y_{n+1} \in C(X_{n+1})\right) \geq 1 - \alpha

Bu chekli tanlanma kafolati — asimptotik taxminiy hisob emas. U istalgan μ^\hat{\mu} modeli, ma'lumotlarning istalgan taqsimoti va istalgan nn tanlanma hajmi uchun amal qiladi. Agar μ^\hat{\mu} yomon bashoratchi bo'lsa, intervallar shunchaki kengroq bo'ladi. Qamrov kafolati baribir amal qiladi.

Ballarda teng qiymatlar bo'lmaganda yuqori chegara ham mavjud: P(Yn+1C(Xn+1))1α+1n+1\mathbb{P}(Y_{n+1} \in C(X_{n+1})) \leq 1 - \alpha + \frac{1}{n+1}, shuning uchun qamrov behuda konservativ emas.

Nima Uchun Bu Savdo uchun Muhim

Masalan, chiziqli regressiyadan olingan an'anaviy bashorat intervallari Gauss xatolarini faraz qiladi. Ma'lumotlarning asosiy qismida kalibrlangan Gauss intervali, haqiqiy qoldiqlar qalin dumli bo'lganda (masalan, bir necha erkinlik darajasiga ega Student-tt), dumlarni juda noto'g'ri baholashi mumkin: markaziy massa Gaussdan yupqaroq, shuning uchun dispersiyaga mos Gauss intervali markaz yaqinida ortiqcha qamraydi, lekin dumlarda yetarli qamramaydi, dumga mos interval esa aksincha ish tutadi. Gap yagona sehrli sonda emas — gap shundaki, parametrik intervalning haqiqiy qamrovi siz tekshirmagan taqsimot farazasiga bog'liq.

Konformal bashorat intervallari buni chetlab o'tadi. Ular model noaniq bo'lganda avtomatik ravishda kengayadi va haqiqiy xato taqsimotidan qat'i nazar chekka qamrovni saqlaydi. Treyder uchun bu quyidagini anglatadi:

  • Agar siz pozitsiyalarni interval kengligiga teskari proportsional o'lchamlasangiz, model noaniq bo'lganda avtomatik ravishda ta'sirni kamaytirasiz.
  • Qamrov kafolati sizning xavf baholaringiz halol ekanligini anglatadi — agar siz "amalga oshgan daromadlarning 90% shu interval ichida bo'ladi" desangiz, bu bayonot statistik jihatdan haqiqiy (chekka ma'noda, almashinuvchanlik ostida).

To'liq Konformal va Jackknife+

Split conformal oddiy, ammo ma'lumotlarni behuda sarflaydi: kalibratsiya to'plamini o'qitish uchun ishlatib bo'lmaydi. Ikkita muqobil yechim buni hal qiladi.

To'liq Konformal Bashorat

To'liq konformal bashorat (Vovk va boshq., 2005) barcha ma'lumotlarni ham o'qitish, ham kalibratsiya uchun ishlatadi. Yn+1Y_{n+1} ning har bir nomzod qiymati yy uchun:

  1. Ma'lumotlar to'plamini (Xn+1,y)(X_{n+1}, y) bilan kengaytiring.
  2. Modelni kengaytirilgan to'plamda qayta moslashtiring.
  3. Barcha nonconformity ballarini hisoblang.
  4. Agar (Xn+1,y)(X_{n+1}, y) uchun ball juda ekstremal bo'lmasa, yy ni bashorat to'plamiga kiriting.

Bashorat to'plami:

C(Xn+1)={y:{i:RiyRn+1y}n+1>α}C(X_{n+1}) = \left\{y : \frac{|\{i : R_i^y \geq R_{n+1}^y\}|}{n+1} > \alpha \right\}

bu yerda RiyR_i^y — kengaytirilgan to'plam bilan hisoblangan nonconformity ballari.

To'liq conformal eng tor intervallarni beradi, lekin ko'pchilik modellar uchun hisoblash jihatidan amalga oshirib bo'lmaydigan darajada qimmat — siz to'r bo'yicha har bir nomzod yy uchun modelni qayta moslashtirishingiz kerak. Daromad bashorati uchun bu bir bashorat uchun minglab qayta moslashtirishlarni anglatishi mumkin.

Jackknife+ (Barber va boshq., 2021)

Jackknife+ muvozanat topadi. U leave-one-out (LOO) qoldiqlaridan foydalanadi, lekin LOO qismlari bo'yicha moslashtirilgan modeldagi o'zgaruvchanlikni hisobga oladi.

μ^i\hat{\mu}_{-i} ni ii nuqtasidan tashqari barcha ma'lumotlarda o'qitilgan model deb belgilaymiz. LOO nonconformity ballini yagona mutlaq qoldiq bilan aniqlaymiz:

Ri=Yiμ^i(Xi)R_i = |Y_i - \hat{\mu}_{-i}(X_i)|

Jackknife+ bashorat intervali keyin test nuqtasidagi LOO bashoratlaridan quriladi, ushbu qoldiqlar bilan kengaytiriladi:

C(Xn+1)=[qα ⁣{μ^i(Xn+1)Ri},    q1α+ ⁣{μ^i(Xn+1)+Ri}]C(X_{n+1}) = \left[\, q_{\alpha}^{-}\!\left\{\hat{\mu}_{-i}(X_{n+1}) - R_i\right\}, \;\; q_{1-\alpha}^{+}\!\left\{\hat{\mu}_{-i}(X_{n+1}) + R_i\right\} \right]

Bu yerda q1α+{vi}q_{1-\alpha}^{+}\{v_i\}{vi}i=1n\{v_i\}_{i=1}^n to'plamining (1α)(n+1)\lceil (1-\alpha)(n+1)\rceil-chi eng kichik qiymati, qα{vi}q_{\alpha}^{-}\{v_i\} esa α(n+1)\lfloor \alpha(n+1)\rfloor-chi eng kichik qiymati. Quyi chegara har bir LOO bashoratidan qoldiqni ayiradi; yuqori chegara esa qo'shadi. Ushbu assimetriya butun mohiyat — ikkala chegarani μ^i+Ri\hat{\mu}_{-i} + R_i ga qisqartirish quyi chegarani bashoratdan yuqoriga qo'yadi, bu esa noto'g'ri.

Jackknife+ kamida 12α1 - 2\alpha qamrov kafolatini beradi (split conformal'ning 1α1-\alpha dan biroz zaifroq), lekin barcha ma'lumotlarni ham o'qitish, ham kalibratsiya uchun ishlatadi. Amalda qamrov odatda 1α1-\alpha ga yaqin bo'ladi.

Cheklangan ma'lumotlarda o'qitilgan savdo modellari uchun (masalan, faqat bir necha yuzta kuzatuvga ega rejimga xos modellar), jackknife+ ko'pincha eng yaxshi tanlovdir — u kalibratsiya uchun kamyob ma'lumotlarni qurbon qilmaydi. Narxi — nn ta modelni qayta moslashtirish.

Moliyaviy Vaqt Qatorlari Muammosi: Almashinuvchan Emaslik

Moliyaviy vaqt qatorlaridagi almashinuvchan emaslik: rejim o'zgarishi bilan statsionar bo'lmagan qator, taqsimot siljigan sari qamrov yorilishi

Standart conformal kafolat almashinuvchanlikni talab qiladi: (Z1,,Zn+1)(Z_1, \ldots, Z_{n+1}) ning qo'shma taqsimoti almashtirishlar ostida o'zgarmasdir. i.i.d. ma'lumotlar uchun bu trivial ravishda amal qiladi.

Moliyaviy vaqt qatorlari almashinuvchan emas. Daromadlar quyidagilarni namoyish etadi:

  • Volatillik klasterlanishi: Yuqori volatillik davrlaridan keyin yana yuqori volatillik davrlari keladi (GARCH effektlari).
  • Momentum va o'rtachaga qaytish: Daromadlar yoki kvadrat daromadlardagi avtokorrelyatsiya.
  • Rejim o'zgarishlari: Taqsimot vaqt o'tishi bilan siljiydi (buqa va ayiq bozorlari).

Agar siz split conformal'ni vaqt qatoriga sodda tarzda, tasodifiy kalibratsiya bo'linishi bilan qo'llasangiz, vaqtinchalik tuzilmani buzasiz. Tinch 2017-yildagi kalibratsiya ballari beqaror 2020-yilning noaniqligini aks ettirmaydi. Sizning qamrov kafolatingiz buziladi.

Adaptiv Konformal Xulosalash (ACI)

Adaptiv konformal xulosalash: amalga oshgan qamrovni maqsad tomon kuzatuvchi teskari aloqa tsikli orqali kengayib va torayib turadigan bashorat intervali

Gibbs va Candes (2021, NeurIPS) taqsimot siljishi va almashinuvchan bo'lmagan ma'lumotlar bilan ishlash uchun **Adaptiv Konformal Xulosalash (ACI)**ni taqdim etdi. G'oya nafis: qat'iy qamrov darajasidan foydalanish o'rniga, so'nggi intervallar haqiqiy natijani qamragan yoki qamramaganiga qarab maqsad qamrovsizlik darajasini onlayn moslashtiring va har bir qadamda ball taqsimotidan kvantilni qayta chiqaring.

ACI Algoritmi

ACI interval kengligini to'g'ridan-to'g'ri o'zgartirmaydi. U adaptiv qamrovsizlik parametri αt\alpha_t ni saqlaydi va undan conformal kvantilni qayta hisoblaydi. Har bir tt vaqt qadamida:

  1. Conformal chegarani joriy qoldiqlar to'plamining (kalibratsiya ballari, va shu vaqtgacha amalga oshgan har qanday ballar) empirik (1αt)(1 - \alpha_t)-kvantili sifatida hisoblang: q^t=Quantile^1αt({Rj})\hat{q}_t = \widehat{\text{Quantile}}_{1-\alpha_t}(\{R_j\}).
  2. XtX_t xususiyatlarini kuzating, Ct(Xt)=[μ^(Xt)q^t,  μ^(Xt)+q^t]C_t(X_t) = [\hat{\mu}(X_t) - \hat{q}_t, \; \hat{\mu}(X_t) + \hat{q}_t] intervalini hosil qiling.
  3. Haqiqiy YtY_t qiymatini kuzating va xato ko'rsatkichini hisoblang: errt=1{YtCt(Xt)}\text{err}_t = \mathbf{1}\{Y_t \notin C_t(X_t)\}.
  4. Darajani yangilang (kenglikni emas):

αt+1=clip ⁣(αt+γ(αerrt),  0,  1)\alpha_{t+1} = \text{clip}\!\left(\alpha_t + \gamma\,(\alpha - \text{err}_t),\; 0,\; 1\right)

bu yerda γ>0\gamma > 0 — qadam hajmi, α\alpha esa maqsad qamrovsizligi. Agar interval xato qilsa (errt=1\text{err}_t = 1), αt\alpha_t qisqaradi, bu keyingi kvantilni yuqoriga suradi va intervalni kengaytiradi; agar qamragan bo'lsa, αt\alpha_t o'sadi va intervallar torayadi. Muhimi, bu yerdagi γ\gamma ehtimollik birliklarida — u darajani [0,1][0,1] ichida suradi, xom daromad birliklaridagi chegarani emas — shuning uchun bir xil γ\gamma qoldiqlar 10310^{-3} tartibida bo'lsa ham, bo'lmasa ham oqilona ishlaydi.

ACI uchun Qamrov Kafolati

ACI taqsimot modeliga bog'liq bo'lmagan uzoq muddatli qamrov kafolatini beradi:

1Tt=1TerrtααT+1α1γT\left|\frac{1}{T}\sum_{t=1}^{T} \text{err}_t - \alpha\right| \leq \frac{|\alpha_{T+1} - \alpha_1|}{\gamma T}

αt\alpha_t [0,1][0,1] ga cheklangani sababli, surat 1/γ1/\gamma ning doimiy songa ko'paytmasi bilan chegaralangan, shuning uchun o'ng tomon O(1/T)O(1/T) va empirik qamrovsizlik chastotasi α\alpha ga yaqinlashadi. Aniq ta'rif: ACI, moslashtirilgan darajalar chegaralangan holda qolar ekan (buni clip ta'minlaydi), ixtiyoriy (jumladan raqib) ketma-ketliklar uchun uzoq muddatli empirik qamrovsizlik chastotasi α\alpha ga yaqinlashishini kafolatlaydi. Bu qamrov chastotasi haqidagi kafolat, interval informativligi haqida emas: chinakam raqib ketma-ketlik ostida intervallar qamrov maqsadiga erishgan holda ham axborotsiz darajada keng bo'lib ketishi mumkin.

Dinamik Sozlanadigan ACI (DtACI)

Gibbs va Candes (2024, JMLR) ACI'ni γ\gamma qadam hajmini dinamik sozlash bilan takomillashtirdi. γ\gamma ni qat'iylashtirish o'rniga, ular Γ={γ1,,γK}\Gamma = \{\gamma_1, \ldots, \gamma_K\} nomzodlar to'plamini saqlaydi va ularni ekspert-agregatsiya qoidasi orqali birlashtiradi, so'nggi qamrovi maqsadga eng yaqin bo'lgan γ\gamma ni afzal ko'radi.

Bu amaliy muammoni hal qiladi: katta γ\gamma rejim o'zgarishlariga tezda moslashadi, lekin beqaror interval kengliklarini hosil qiladi; kichik γ\gamma barqaror, ammo moslashishda sekin. DtACI bularni avtomatik ravishda muvozanatlaydi.

Nima Uchun Bu Savdo uchun Muhim

Daromad bashorati modelidan foydalanadigan market-making strategiyasini ko'rib chiqaylik. Tinch bozorlarda conformal intervallar tor bo'ladi — model ishonchli, va siz kattaroq pozitsiyalar olishingiz mumkin. Volatillik keskin oshganda (daromadlar mavsumi, FOMC e'lonlari, geosiyosiy zarbalar), ACI darajasi moslashadi va intervallar bir necha vaqt qadamida kengayadi. Sizning pozitsiya hajmingiz javob tariqasida qisqaradi, hech qanday aniq volatillik modeli yoki rejimni aniqlash mantiqisiz.

Bu noaniqlikni miqdorlashtirish keyinchalik o'ylab topilgan narsa emas, birinchi darajali signal sifatida.

Konformal Intervallar bilan Pozitsiya Hajmini Belgilash

Kalibrlangan noaniqlik intervalini pozitsiya hajmiga moslashtirish: tor interval katta pozitsiyani, keng interval kichik pozitsiyani boshqaradi

Endi konformal bashoratni aniq pozitsiya hajmini belgilash bilan bog'laymiz. Asosiy o'zgaruvchi — simmetrik mutlaq qoldiq holatiga nisbatan bashorat intervalining yarim kengligi. Simmetrik [μ^(Xt)q^t,  μ^(Xt)+q^t][\hat{\mu}(X_t) - \hat{q}_t, \; \hat{\mu}(X_t) + \hat{q}_t] intervali bilan, to'liq kenglik wt=2q^tw_t = 2\hat{q}_t. Formulalar va kodni izchil saqlash uchun biz hamma narsani to'liq kenglik wtw_t ga nisbatan o'lchaymiz.

Teskari-Kenglik Bo'yicha O'lchamlash

Eng oddiy yondashuv: hajmni interval kengligiga teskari proportsional qilib belgilash.

position_sizet=kwt\text{position\_size}_t = \frac{k}{w_t}

bu yerda kk — sizning xavf byudjetingizga moslashtirilgan masshtablash konstantasi. Model ishonchli bo'lganda (tor interval), siz kattaroq pozitsiya olasiz. Noaniq bo'lganda (keng interval), kichikroq olasiz.

Bu volatillikka moslashtirish (size1/σ\text{size} \propto 1/\sigma) ga o'xshaydi, lekin muhim farq bilan: conformal interval kengligi taqsimotdan mustaqil noaniqlik o'lchovi, parametrik volatillik bahosi emas. U faqat daromad dispersiyasini emas, balki qamrov kafolati ostidagi bashoratli noaniqlikni qamrab oladi.

Edge-Nisbat Bo'yicha O'lchamlash va Savdo Qilmaslik Filtri

Sof teskari-kenglik o'lchamlash signalning o'zining kuchini e'tiborsiz qoldiradi. Tabiiy takomillashtirish edge nisbati bo'yicha masshtablaydi — interval kengligiga nisbatan nuqta bashorati:

et=μ^(Xt)wte_t = \frac{|\hat{\mu}(X_t)|}{w_t}

Bu signal-shovqin nisbatining conformal analogidir: kutilayotgan daromad taqsimotdan mustaqil noaniqlik o'lchoviga bo'linadi. Biz uni ham hajmni belgilash, ham savdo qilmaslik filtri uchun ishlatamiz.

Filtr asoslangan. Agar interval nolni qamrab olsa,

lowert<0<uppert,\text{lower}_t < 0 < \text{upper}_t,

u holda (1α)(1-\alpha) bashorat intervali ham musbat, ham manfiy daromadlarni o'z ichiga oladi — amalga oshgan daromad ehtimol tarzda sizning bashoratingizga qarama-qarshi belgiga ega bo'lishi mumkin. Minimal edge chegarasi θ\theta ni belgilang va faqat et>θe_t > \theta bo'lganda savdo qiling. E'tibor bering, "ete_t interval endi nolni qamrab olmaydigan darajada katta" degan geometrik ma'no aynan et>1/2e_t > 1/2 ga teng (chunki interval μ^>q^t=wt/2|\hat{\mu}| > \hat{q}_t = w_t/2 bo'lganda noldan tozalanadi). θ\theta ni et=μ^/wte_t = |\hat{\mu}|/w_t ning haqiqiy shkalasida backtesting orqali tanlang; kunlik daromad qoldiqlari uchun ete_t odatda 1/21/2 dan ancha past bo'ladi, shuning uchun juda kichik θ\theta deyarli barcha savdolarni qabul qilishi, katta θ\theta esa hech birini qabul qilmasligi mumkin. Uni o'z ma'lumotlaringizga moslashtiring.

"Konformal Kelly" Haqida

Konformal intervallarni Kelly ulushi f=pb(1p)bf^* = \frac{pb - (1-p)}{b} ga biriktirish jozibali. Ammo ff^* allaqachon g'alaba ehtimoli pp va to'lov nisbati bb dan olingan to'liq, chegaralangan ulushdir; uni μ^/q^\hat{\mu}/\hat{q} kabi chegaralanmagan nisbatga ko'paytirishning qaror nazariyasi jihatidan hech qanday asosi yo'q — u 1 dan oshib ketishi yoki ff^* dan mustaqil ravishda belgisini o'zgartirishi mumkin, va ff^* allaqachon kodlagan edge'ni ikki marta hisoblaydi. Shuning uchun biz "konformal Kelly" ko'paytiruvchisini taqdim etmaymiz.

Agar Kelly'ni interval orqali boshqarmoqchi bo'lsangiz, undan haqiqatan ham pp va bb ni chiqarishingiz kerak, bu esa interval ichidagi taqsimot haqida aniq faraz talab qiladi (conformal intervallar ataylab bu haqda hech narsa demaydi — Cheklovlar bo'limiga qarang). Masalan, interval ichida faraz qilingan shakl ostida siz pP(daromad>0)p \approx \mathbb{P}(\text{daromad} > 0) ni va interval geometriyasidan to'lov nisbatini taxminan hisoblashingiz mumkin — lekin bu farazni baland ovozda belgilang, chunki u aynan conformal bashorat qochmoqchi bo'lgan parametrik majburiyatni qayta kiritadi.

Halol, farazlarga kam bog'liq muqobil variant — edge nisbati et=μ^/wte_t = |\hat{\mu}|/w_t dan fraksional-Kelly qisqartirish sifatida foydalanish: kutilayotgan daromad intervalga nisbatan katta bo'lganda hajmni oshirish, kichik bo'lganda kamaytirish, va buni qattiq yuqori chegara ustiga qo'llash — aniq ravishda evristika sifatida, "Kelly ulushi" sifatida emas.

Python Amalga Oshirilishi

Mana amaliy amalga oshirish. Biz ham split/prefit yo'lini, ham vaqtinchalik (EnbPI) yo'lini ko'rsatamiz, chunki ushbu maqolaning butun mohiyati moliyaviy ma'lumotlar almashinuvchan emasligidadir.

Sozlash va Ma'lumotlarni Tayyorlash

import numpy as np
import pandas as pd
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import KFold

from mapie.regression import MapieRegressor, MapieTimeSeriesRegressor
from mapie.subsample import BlockBootstrap


def prepare_features(prices: pd.Series, lookback: int = 20) -> pd.DataFrame:
    """Create features from a price series."""
    df = pd.DataFrame()
    returns = prices.pct_change()

    for lag in range(1, lookback + 1):
        df[f"ret_lag_{lag}"] = returns.shift(lag)

    for window in [5, 10, 20]:
        df[f"ret_mean_{window}"] = returns.rolling(window).mean().shift(1)
        df[f"ret_std_{window}"] = returns.rolling(window).std().shift(1)
        df[f"ret_skew_{window}"] = returns.rolling(window).skew().shift(1)

    df["target"] = returns.shift(-1)

    return df.dropna()

MAPIE bilan Split Conformal (Prefit)

Split/prefit conformal uchun cv="prefit" method="base" ni talab qiladi (sodda split-conformal baholovchisi). method="plus" varianti CV+/jackknife+ baholovchisi bo'lib, cv="prefit" bilan mos kelmaydi — buning o'rniga cross-validation ob'ekti kerak. Biz bu yerda to'g'ri kombinatsiyani ishlatamiz va hajmni belgilashni to'liq kenglikka standartlashtiramiz.

def split_conformal_sizing(
    prices: pd.Series,
    alpha: float = 0.1,
    k: float = 1e-3,          # scaling constant, in width units
    max_position: float = 1.0,
    min_edge: float = 0.05,   # threshold on |pred| / width
) -> pd.DataFrame:
    """
    Position sizing using split (prefit) conformal prediction intervals.

    Sizing rule (consistent with the prose):
        edge_t = |pred_t| / width_t
        size_t = clip(k / width_t, 0, max_position)   # inverse-width
        size_t = 0 if edge_t < min_edge               # no-trade filter
    """
    df = prepare_features(prices)
    X = df.drop(columns=["target"])
    y = df["target"]

    n_train = int(len(X) * 0.6)
    n_cal = int(len(X) * 0.2)

    X_train, y_train = X.iloc[:n_train], y.iloc[:n_train]
    X_cal, y_cal = X.iloc[n_train:n_train + n_cal], y.iloc[n_train:n_train + n_cal]
    X_test, y_test = X.iloc[n_train + n_cal:], y.iloc[n_train + n_cal:]

    base_model = GradientBoostingRegressor(
        n_estimators=200, max_depth=3, learning_rate=0.05, random_state=42,
    )
    base_model.fit(X_train, y_train)

    mapie = MapieRegressor(estimator=base_model, cv="prefit", method="base")
    mapie.fit(X_cal, y_cal)

    y_pred, y_intervals = mapie.predict(X_test, alpha=alpha)
    lower = y_intervals[:, 0, 0]
    upper = y_intervals[:, 1, 0]
    width = upper - lower

    raw_size = k / np.where(width > 0, width, np.inf)
    position_size = np.clip(raw_size, 0.0, max_position)

    edge_ratio = np.abs(y_pred) / np.where(width > 0, width, np.inf)
    position_size = np.where(edge_ratio < min_edge, 0.0, position_size)

    position_size = position_size * np.sign(y_pred)

    return pd.DataFrame({
        "prediction": y_pred,
        "lower": lower,
        "upper": upper,
        "width": width,
        "edge_ratio": edge_ratio,
        "position_size": position_size,
        "actual": y_test.values,
    }, index=X_test.index)

EnbPI bilan Vaqt Qatori Conformal

Daromadlar almashinuvchan bo'lmagani sababli, yuqoridagi tasodifiy/prefit bo'linish faqat asos hisoblanadi. MAPIE'ning method="enbpi" (Xu & Xie, 2021) bilan MapieTimeSeriesRegressori vaqtinchalik bog'liqlik uchun mo'ljallangan block bootstrap va qoldiqlarni yangilashdan foydalanadi. Bu maqolaning o'z argumentiga mos keluvchi asbobdir.

def enbpi_sizing(
    prices: pd.Series,
    alpha: float = 0.1,
    k: float = 1e-3,
    max_position: float = 1.0,
    min_edge: float = 0.05,
) -> pd.DataFrame:
    """Position sizing with EnbPI (block-bootstrap, time-series conformal)."""
    df = prepare_features(prices)
    X = df.drop(columns=["target"])
    y = df["target"]

    n_train = int(len(X) * 0.7)
    X_train, y_train = X.iloc[:n_train], y.iloc[:n_train]
    X_test, y_test = X.iloc[n_train:], y.iloc[n_train:]

    base_model = GradientBoostingRegressor(
        n_estimators=200, max_depth=3, learning_rate=0.05, random_state=42,
    )

    cv = BlockBootstrap(n_resamplings=30, length=20, overlapping=False, random_state=42)
    mapie_ts = MapieTimeSeriesRegressor(base_model, method="enbpi", cv=cv, agg_function="mean")
    mapie_ts.fit(X_train, y_train)

    y_pred, y_intervals = mapie_ts.predict(X_test, alpha=alpha, ensemble=True)
    lower = y_intervals[:, 0, 0]
    upper = y_intervals[:, 1, 0]
    width = upper - lower

    raw_size = k / np.where(width > 0, width, np.inf)
    position_size = np.clip(raw_size, 0.0, max_position)
    edge_ratio = np.abs(y_pred) / np.where(width > 0, width, np.inf)
    position_size = np.where(edge_ratio < min_edge, 0.0, position_size)
    position_size = position_size * np.sign(y_pred)

    return pd.DataFrame({
        "prediction": y_pred, "lower": lower, "upper": upper,
        "width": width, "edge_ratio": edge_ratio,
        "position_size": position_size, "actual": y_test.values,
    }, index=X_test.index)

Adaptiv Konformal Xulosalash (Onlayn)

Jonli savdo uchun biz haqiqiy ACI'ni noldan amalga oshiramiz: qamrovsizlik darajasi αt\alpha_t ni saqlaymiz, uni additiv ravishda yangilaymiz va har bir qadamda qoldiqlar to'plamidan kvantilni qayta chiqaramiz. Ikkita chekli tanlanma tafsiloti muhim:

  • Interpolyatsiya qilingan kvantil emas, tartib statistikasidan foydalaning. np.quantile sukut bo'yicha interpolyatsiya qiladi, bu talab qilingan darajadan biroz pastga tushib, yetarli qamramaslikka olib kelishi mumkin; method="higher" (ekvivalenti "inverted_cdf") ni bering.
  • Talab qilingan daraja nn dan oshganda (kichik nn, yuqori maqsad qamrovi), to'g'ri chegara ++\infty (interval = butun to'g'ri chiziq), eng katta qoldiqqa qisqartirish emas. Qisqartirish 1αt\ge 1-\alpha_t kafolatini sezilmasdan buzadi.
class AdaptiveConformalSizer:
    """
    Online position sizing with Adaptive Conformal Inference (Gibbs & Candes,
    2021). Updates the miscoverage LEVEL alpha_t and re-derives the quantile
    from the residual set each step -- gamma is in probability units.
    """

    def __init__(self, base_model, alpha=0.1, gamma=0.02,
                 max_position=1.0, min_edge=0.05, k=1e-3):
        self.base_model = base_model
        self.alpha_target = alpha     # target miscoverage
        self.alpha_t = alpha          # adaptive miscoverage level
        self.gamma = gamma            # step size, in [0, 1] units
        self.max_position = max_position
        self.min_edge = min_edge
        self.k = k
        self.residuals = []
        self.q_hat = np.inf
        self.coverage_history = []

    @staticmethod
    def _conformal_quantile(residuals, alpha_t):
        """(1 - alpha_t) conformal quantile via the order statistic."""
        n = len(residuals)
        if n == 0:
            return np.inf
        rank = int(np.ceil((1.0 - alpha_t) * (n + 1)))
        if rank > n:                  # required order statistic does not exist
            return np.inf             # -> interval is the whole line
        level = rank / n
        return float(np.quantile(residuals, min(level, 1.0), method="higher"))

    def calibrate(self, X_cal, y_cal):
        preds = self.base_model.predict(X_cal)
        self.residuals = list(np.abs(np.asarray(y_cal) - preds))
        self.q_hat = self._conformal_quantile(self.residuals, self.alpha_t)

    def predict_and_size(self, X_t) -> dict:
        mu_hat = self.base_model.predict(np.asarray(X_t).reshape(1, -1))[0]
        lower, upper = mu_hat - self.q_hat, mu_hat + self.q_hat
        width = upper - lower                      # = 2 * q_hat

        edge_ratio = abs(mu_hat) / width if np.isfinite(width) and width > 0 else 0.0

        if edge_ratio < self.min_edge:
            size = 0.0
        else:
            size = min(self.k / width, self.max_position) if width > 0 else 0.0

        return {
            "prediction": mu_hat, "lower": lower, "upper": upper,
            "width": width, "edge_ratio": edge_ratio,
            "position_size": size * np.sign(mu_hat),
            "alpha_t": self.alpha_t, "q_hat": self.q_hat,
        }

    def update(self, X_t, y_t: float):
        """ACI update: adapt the LEVEL, then re-derive the quantile."""
        mu_hat = self.base_model.predict(np.asarray(X_t).reshape(1, -1))[0]
        residual = abs(y_t - mu_hat)

        covered = int(residual <= self.q_hat)
        err_t = 1 - covered

        self.alpha_t = float(np.clip(
            self.alpha_t + self.gamma * (self.alpha_target - err_t), 0.0, 1.0
        ))

        self.residuals.append(residual)
        self.q_hat = self._conformal_quantile(self.residuals, self.alpha_t)

        self.coverage_history.append(covered)

    @property
    def running_coverage(self) -> float:
        if not self.coverage_history:
            return float("nan")
        return float(np.mean(self.coverage_history))

Hammasini Birlashtirish: Backtest Tsikli

def backtest_aci_sizing(prices: pd.Series, alpha=0.1, gamma=0.02) -> pd.DataFrame:
    """Backtest position sizing with Adaptive Conformal Inference."""
    df = prepare_features(prices)
    X = df.drop(columns=["target"]).values
    y = df["target"].values
    index = df.index

    n_train = int(len(X) * 0.5)
    n_cal = int(len(X) * 0.2)

    X_train, y_train = X[:n_train], y[:n_train]
    X_cal, y_cal = X[n_train:n_train + n_cal], y[n_train:n_train + n_cal]
    X_test, y_test = X[n_train + n_cal:], y[n_train + n_cal:]
    test_index = index[n_train + n_cal:]

    model = GradientBoostingRegressor(
        n_estimators=200, max_depth=3, learning_rate=0.05, random_state=42,
    )
    model.fit(X_train, y_train)

    sizer = AdaptiveConformalSizer(base_model=model, alpha=alpha, gamma=gamma)
    sizer.calibrate(X_cal, y_cal)

    records = []
    for i in range(len(X_test)):
        result = sizer.predict_and_size(X_test[i])
        result["actual"] = y_test[i]
        result["pnl"] = result["position_size"] * y_test[i]
        records.append(result)
        sizer.update(X_test[i], y_test[i])   # online residual + level update

    results = pd.DataFrame(records, index=test_index)
    results["cumulative_pnl"] = results["pnl"].cumsum()
    results["running_coverage"] = (
        ((results["lower"] <= results["actual"]) &
         (results["actual"] <= results["upper"])).expanding().mean()
    )
    return results

Natijalarni Baholash

def evaluate(results: pd.DataFrame, alpha: float = 0.1):
    """Print evaluation metrics for conformal position sizing."""
    covered = ((results["actual"] >= results["lower"]) &
               (results["actual"] <= results["upper"]))

    print(f"Target coverage:      {1 - alpha:.1%}")
    print(f"Empirical coverage:   {covered.mean():.1%}")
    print(f"Mean interval width:  {results['width'].mean():.6f}")
    print(f"Median position size: {results['position_size'].abs().median():.4f}")
    print(f"Fraction no-trade:    {(results['position_size'] == 0).mean():.1%}")
    print(f"Total PnL (bps):      {results['pnl'].sum() * 10000:.1f}")
    sd = results['pnl'].std()
    sharpe = results['pnl'].mean() / sd * np.sqrt(252) if sd > 0 else float('nan')
    print(f"Sharpe (annualized):  {sharpe:.2f}")

Amaliy Mulohazalar

Nonconformity Ballini Tanlash

Mutlaq qoldiq Yμ^(X)|Y - \hat{\mu}(X)| standart hisoblanadi, lekin u bashorat intervali nuqta bashoratining atrofida simmetrik bo'lishi kerakligini faraz qiladi. Moliyaviy daromadlar uchun assimetrik intervallar ko'pincha ko'proq mantiqiy bo'ladi:

  • Konformallashtirilgan Kvantil Regressiyasi (CQR): α/2\alpha/2 va 1α/21 - \alpha/2 darajalarida kvantil regressorlarini moslashtiring, so'ng conformallashtiring (Romano va boshq., 2019). Intervallar shaklini mahalliy taqsimotga moslashtiradi — pasayishlar davrida pastki tomonda kengroq, ko'tarilishlar davrida yuqori tomonda kengroq. (CQR bilan interval endi simmetrik emas, shuning uchun wtw_t haqiqiy yuqori-minus-quyi kenglikdir — hamma joyda wtw_t ni maxraj sifatida ishlatishda davom eting.)
  • Normallashtirilgan ballar: Ri=Yiμ^(Xi)/σ^(Xi)R_i = |Y_i - \hat{\mu}(X_i)| / \hat{\sigma}(X_i), bu yerda σ^\hat{\sigma} mahalliy volatillik bahosi. Bu shartli ravishda adaptiv intervallarni hosil qiladi — past volatillik rejimlarida torroq, yuqori volatillik rejimlarida kengroq — chekka qamrovni saqlab qolgan holda.

Kalibratsiya To'plami Hajmi

Split conformal'ning qamrov kafolati istalgan nn kalibratsiya to'plami hajmi uchun amal qiladi, ammo nn oshgani sari interval kengligi kamayadi. Juda kichik nn uchun talab qilingan tartib statistikasi mavjud bo'lmasligi mumkin, bunday holda halol chegara ++\infty (axborotsiz, ammo haqiqiy interval) — eng katta qoldiqqa qisqartirish kafolatni sezilmasdan bekor qiladi. Amaliy savdo uchun:

  • n100n \geq 100 kalibratsiya nuqtasi ancha tor intervallarni beradi.
  • Barqaror kvantil bahosi uchun n500n \geq 500 afzal.
  • ACI bilan, kalibratsiya to'plami faqat ishga tushirish uchun; onlayn daraja yangilanishlari qolganini bajaradi.

Qayta O'qitish Chastotasi

Asosiy μ^\hat{\mu} modeli eskirishi mumkin. Ikkita yondashuv:

  1. Davriy ravishda qayta o'qitish (masalan, oyda bir marta) va conformal kvantilni qayta kalibrlash.
  2. ACI'dan foydalanish va adaptiv darajaga model eskirishini qoplashiga ruxsat berish — model qoldiqlari o'sgani sari intervallar avtomatik ravishda kengayadi.

2-variant soddaroq va kutilmaganda samarali. Conformal qatlam xavfsizlik to'ri sifatida ishlaydi: hatto model yomonlashsa ham, uzoq muddatli ACI qamrov chastotasi baribir maqsadga yaqinlashadi.

Bitim Xarajatlari

Conformal intervallar bitim xarajatlari bilan foydali tarzda o'zaro ta'sir qiladi. Intervallar keng bo'lganda (yuqori noaniqlik), pozitsiyalar kichik, shuning uchun aylanma past. Intervallar torayganda (model ishonchli), pozitsiyalar o'sadi — lekin model to'g'ri bo'lish ehtimoli yuqoriroq, shuning uchun aylanma to'lashga arziydi.

Siz bitim xarajatlarini savdo qilmaslik filtriga to'g'ridan-to'g'ri ham kiritishingiz mumkin:

trade only if μ^(Xt)cost>θwt\text{trade only if } |\hat{\mu}(X_t)| - \text{cost} > \theta \cdot w_t

Bu faqat kutilayotgan sof edge conformal kenglik bilan masshtablangan chegaradan oshganda savdo qilishingizni ta'minlaydi — hamma joyda bo'lgani kabi bir xil wtw_t maxrajidan foydalanib.

An'anaviy Usullar bilan Solishtirish

Xususiyat Gauss IB Bootstrap IB Conformal PI
Taqsimot farazi Normal xatolar i.i.d. + asimptotik Yo'q (almashinuvchanlik)
Chekli tanlanma kafolati Yo'q Yo'q Ha
Har qanday model bilan ishlaydi Yo'q Ha Ha
Geteroskedastiklikka moslashadi Yo'q Qisman CQR / normallashtirilgan ballar bilan
Taqsimot siljishini boshqaradi Yo'q Yo'q ACI / EnbPI varianti
Hisoblash xarajati Past O'rta Split: past; jackknife+: O(n)O(n) qayta moslashtirish; to'liq: amalga oshirib bo'lmaydi

Bootstrap faqat o'z kafolatida "asimptotik"; u baribir i.i.d./almashinuvchan ma'lumot va silliqlikni faraz qiladi, shuning uchun uning taqsimot-farazi katakchasi "farazsiz" emas. Va yagona "conformal" ustuni variantlar orasidagi juda farqli xarajatlarni yashiradi, buni endi xarajat qatori aniq ko'rsatib beradi.

Cheklovlar

Konformal bashorat sehr emas. Savdo uchun asosiy cheklovlar:

  1. Chekka, shartli emas, qamrov. Kafolat P(Yn+1C(Xn+1))1α\mathbb{P}(Y_{n+1} \in C(X_{n+1})) \geq 1 - \alpha chekka ma'noda — ham XX, ham YY dagi tasodifiylik bo'yicha o'rtacha. Muayyan shartlash qiymati X=xX = x uchun mahalliy qamrov 1α1 - \alpha dan yuqori yoki past bo'lishi mumkin. Konformallashtirilgan kvantil regressiyasi buni qisman hal qiladi.

  2. Almashinuvchanlik haqiqiy talab. Split conformal uchun kalibratsiya ma'lumotlari va test nuqtasi almashinuvchan bo'lishi kerak. Moliyaviy ma'lumotlar bunday emas. ACI va EnbPI buni uzoq muddatli kafolatga bo'shashtiradi, lekin qisqa muddatli qamrov chetga chiqishi mumkin.

  3. Interval kengligi ehtimollik zichligi emas. Conformal interval sizga YY qayerda 1α1-\alpha ehtimol bilan tushishini aytadi, lekin interval ichidagi taqsimot haqida hech narsa demaydi. U to'liq bashorat taqsimotining o'rnini bosmaydi — aynan shuning uchun undan Kelly pp va bb ni chiqarish qo'shimcha, aniq faraz talab qiladi.

  4. Axlat kirsa, kengroq chiqadi. Yomon asosiy model keng intervallarni hosil qiladi. Konformal bashorat qamrovni kafolatlaydi, lekin foydalilikni emas. Agar sizning modelingiz bashorat qilish kuchiga ega bo'lmasa, intervallar shunchalik keng bo'ladiki, pozitsiya hajmini belgilovchi hech qachon savdo qilmaydi.

Xulosa

Konformal bashorat pozitsiya hajmini belgilashga tabiiy ravishda mos keluvchi, noaniqlikni miqdorlashtirish uchun qat'iy, taqsimotdan mustaqil asos beradi:

  • Chekli tanlanma qamrovi bilan statik, oflayn kalibratsiya uchun split conformal.
  • Kalibratsiya ma'lumotlari kamyob bo'lganda va barcha kuzatuvlardan foydalanmoqchi bo'lganingizda jackknife+ (nn ta qayta moslashtirish narxi bilan).
  • Statsionar bo'lmagan bozorlarda onlayn savdo uchun adaptiv konformal xulosalash / EnbPI.
  • Teskari interval kengligi va edge-nisbat savdo qilmaslik filtri orqali pozitsiya hajmini belgilash — va, agar Kelly'ga o'tsangiz, faqat pp va bb ni halol chiqargandan keyin, asossiz ko'paytiruvchi orqali emas.

Parametrik muqobillar ustidan asosiy afzallik: sizga hech qachon parametrik taqsimot farazini belgilash yoki tekshirish kerak emas. Intervallar qurilishi bo'yicha halol (chekka ma'noda, almashinuvchanlik ostida). Tizimli treyder uchun bu model xavfining bir manbasi kamayishini anglatadi — va model xavfi hayotiy ahamiyatga ega bo'lgan biznesda, bu muhim.


Manbalar:

  • Papadopoulos, H., Proedrou, K., Vovk, V., Gammerman, A. (2002). Inductive confidence machines for regression. ECML.
  • Vovk, V., Gammerman, A., Shafer, G. (2005). Algorithmic Learning in a Random World. Springer.
  • Lei, J., G'Sell, M., Rinaldo, A., Tibshirani, R.J., Wasserman, L. (2018). Distribution-free predictive inference for regression. JASA.
  • Xu, C., Xie, Y. (2021). Conformal prediction interval for dynamic time-series (EnbPI). ICML.
  • Barber, R.F., Candes, E.J., Ramdas, A., Tibshirani, R.J. (2021). Predictive inference with the jackknife+. Annals of Statistics.
  • Gibbs, I., Candes, E.J. (2021). Adaptive conformal inference under distribution shift. NeurIPS.
  • Gibbs, I., Candes, E.J. (2024). Conformal inference for online prediction with arbitrary distribution shifts. JMLR.
  • Romano, Y., Patterson, E., Candes, E.J. (2019). Conformalized quantile regression. NeurIPS.
  • Cordier, T. et al. (2022). MAPIE: an open-source library for distribution-free uncertainty quantification. arXiv:2207.12274.
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.