Xavf-xatarni Hisobga Oluvchi Pozitsiya Hajmini Belgilash uchun Konformal Bashorat
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

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:
bu yerda istalgan nuqta bashoratchisi (chiziqli regressiya, random forest, neyron tarmoq — farqi yo'q), esa ma'lumot nuqtasi.
Asosiy tushuncha: agar ma'lumot nuqtalari almashinuvchan bo'lsa, u holda ning orasidagi darajasi ustida bir tekis taqsimlangan bo'ladi. Bu sof kombinatorik fakt — u yoki 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 (Papadopoulos va boshq., 2002; Lei va boshq., 2018) eng amaliy variantdir. Algoritm oddiy:
1-qadam. Ma'lumotlarni o'quv to'plami va kalibratsiya to'plami ga bo'ling.
2-qadam. da istalgan modelini moslashtiring.
3-qadam. Kalibratsiya to'plamida nonconformity ballarini hisoblang:
4-qadam. Xohlagan qamrovsizlik darajasi uchun ni ning empirik kvantili sifatida oling. Aniqrog'i, bu -chi eng kichik qoldiq (va bo'lganda, ya'ni juda kichik uchun, ).
5-qadam. Yangi nuqtasi uchun bashorat intervali:
Qamrov Kafolati
Kalibratsiya ma'lumotlari va yangi test nuqtasining almashinuvchanligi ostida:
Bu chekli tanlanma kafolati — asimptotik taxminiy hisob emas. U istalgan modeli, ma'lumotlarning istalgan taqsimoti va istalgan tanlanma hajmi uchun amal qiladi. Agar yomon bashoratchi bo'lsa, intervallar shunchaki kengroq bo'ladi. Qamrov kafolati baribir amal qiladi.
Ballarda teng qiymatlar bo'lmaganda yuqori chegara ham mavjud: , 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-), 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. ning har bir nomzod qiymati uchun:
- Ma'lumotlar to'plamini bilan kengaytiring.
- Modelni kengaytirilgan to'plamda qayta moslashtiring.
- Barcha nonconformity ballarini hisoblang.
- Agar uchun ball juda ekstremal bo'lmasa, ni bashorat to'plamiga kiriting.
Bashorat to'plami:
bu yerda — 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 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.
ni nuqtasidan tashqari barcha ma'lumotlarda o'qitilgan model deb belgilaymiz. LOO nonconformity ballini yagona mutlaq qoldiq bilan aniqlaymiz:
Jackknife+ bashorat intervali keyin test nuqtasidagi LOO bashoratlaridan quriladi, ushbu qoldiqlar bilan kengaytiriladi:
Bu yerda — to'plamining -chi eng kichik qiymati, esa -chi eng kichik qiymati. Quyi chegara har bir LOO bashoratidan qoldiqni ayiradi; yuqori chegara esa qo'shadi. Ushbu assimetriya butun mohiyat — ikkala chegarani ga qisqartirish quyi chegarani bashoratdan yuqoriga qo'yadi, bu esa noto'g'ri.
Jackknife+ kamida qamrov kafolatini beradi (split conformal'ning dan biroz zaifroq), lekin barcha ma'lumotlarni ham o'qitish, ham kalibratsiya uchun ishlatadi. Amalda qamrov odatda 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 — ta modelni qayta moslashtirish.
Moliyaviy Vaqt Qatorlari Muammosi: Almashinuvchan Emaslik

Standart conformal kafolat almashinuvchanlikni talab qiladi: 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)

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 ni saqlaydi va undan conformal kvantilni qayta hisoblaydi. Har bir vaqt qadamida:
- Conformal chegarani joriy qoldiqlar to'plamining (kalibratsiya ballari, va shu vaqtgacha amalga oshgan har qanday ballar) empirik -kvantili sifatida hisoblang: .
- xususiyatlarini kuzating, intervalini hosil qiling.
- Haqiqiy qiymatini kuzating va xato ko'rsatkichini hisoblang: .
- Darajani yangilang (kenglikni emas):
bu yerda — qadam hajmi, esa maqsad qamrovsizligi. Agar interval xato qilsa (), qisqaradi, bu keyingi kvantilni yuqoriga suradi va intervalni kengaytiradi; agar qamragan bo'lsa, o'sadi va intervallar torayadi. Muhimi, bu yerdagi ehtimollik birliklarida — u darajani ichida suradi, xom daromad birliklaridagi chegarani emas — shuning uchun bir xil qoldiqlar 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:
ga cheklangani sababli, surat ning doimiy songa ko'paytmasi bilan chegaralangan, shuning uchun o'ng tomon va empirik qamrovsizlik chastotasi 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 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 qadam hajmini dinamik sozlash bilan takomillashtirdi. ni qat'iylashtirish o'rniga, ular nomzodlar to'plamini saqlaydi va ularni ekspert-agregatsiya qoidasi orqali birlashtiradi, so'nggi qamrovi maqsadga eng yaqin bo'lgan ni afzal ko'radi.
Bu amaliy muammoni hal qiladi: katta rejim o'zgarishlariga tezda moslashadi, lekin beqaror interval kengliklarini hosil qiladi; kichik 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

Endi konformal bashoratni aniq pozitsiya hajmini belgilash bilan bog'laymiz. Asosiy o'zgaruvchi — simmetrik mutlaq qoldiq holatiga nisbatan bashorat intervalining yarim kengligi. Simmetrik intervali bilan, to'liq kenglik . Formulalar va kodni izchil saqlash uchun biz hamma narsani to'liq kenglik ga nisbatan o'lchaymiz.
Teskari-Kenglik Bo'yicha O'lchamlash
Eng oddiy yondashuv: hajmni interval kengligiga teskari proportsional qilib belgilash.
bu yerda — 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 () 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:
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,
u holda 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 ni belgilang va faqat bo'lganda savdo qiling. E'tibor bering, " interval endi nolni qamrab olmaydigan darajada katta" degan geometrik ma'no aynan ga teng (chunki interval bo'lganda noldan tozalanadi). ni ning haqiqiy shkalasida backtesting orqali tanlang; kunlik daromad qoldiqlari uchun odatda dan ancha past bo'ladi, shuning uchun juda kichik deyarli barcha savdolarni qabul qilishi, katta esa hech birini qabul qilmasligi mumkin. Uni o'z ma'lumotlaringizga moslashtiring.
"Konformal Kelly" Haqida
Konformal intervallarni Kelly ulushi ga biriktirish jozibali. Ammo allaqachon g'alaba ehtimoli va to'lov nisbati dan olingan to'liq, chegaralangan ulushdir; uni kabi chegaralanmagan nisbatga ko'paytirishning qaror nazariyasi jihatidan hech qanday asosi yo'q — u 1 dan oshib ketishi yoki dan mustaqil ravishda belgisini o'zgartirishi mumkin, va 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 va 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 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 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 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.quantilesukut 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 dan oshganda (kichik , yuqori maqsad qamrovi), to'g'ri chegara (interval = butun to'g'ri chiziq), eng katta qoldiqqa qisqartirish emas. Qisqartirish 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 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): va 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 haqiqiy yuqori-minus-quyi kenglikdir — hamma joyda ni maxraj sifatida ishlatishda davom eting.)
- Normallashtirilgan ballar: , bu yerda 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 kalibratsiya to'plami hajmi uchun amal qiladi, ammo oshgani sari interval kengligi kamayadi. Juda kichik uchun talab qilingan tartib statistikasi mavjud bo'lmasligi mumkin, bunday holda halol chegara (axborotsiz, ammo haqiqiy interval) — eng katta qoldiqqa qisqartirish kafolatni sezilmasdan bekor qiladi. Amaliy savdo uchun:
- kalibratsiya nuqtasi ancha tor intervallarni beradi.
- Barqaror kvantil bahosi uchun afzal.
- ACI bilan, kalibratsiya to'plami faqat ishga tushirish uchun; onlayn daraja yangilanishlari qolganini bajaradi.
Qayta O'qitish Chastotasi
Asosiy modeli eskirishi mumkin. Ikkita yondashuv:
- Davriy ravishda qayta o'qitish (masalan, oyda bir marta) va conformal kvantilni qayta kalibrlash.
- 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:
Bu faqat kutilayotgan sof edge conformal kenglik bilan masshtablangan chegaradan oshganda savdo qilishingizni ta'minlaydi — hamma joyda bo'lgani kabi bir xil 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+: 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:
-
Chekka, shartli emas, qamrov. Kafolat chekka ma'noda — ham , ham dagi tasodifiylik bo'yicha o'rtacha. Muayyan shartlash qiymati uchun mahalliy qamrov dan yuqori yoki past bo'lishi mumkin. Konformallashtirilgan kvantil regressiyasi buni qisman hal qiladi.
-
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.
-
Interval kengligi ehtimollik zichligi emas. Conformal interval sizga qayerda 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 va ni chiqarish qo'shimcha, aniq faraz talab qiladi.
-
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+ ( 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 va 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.
Authors
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.