XGBoost for Return Direction: Class Imbalance and Decision Thresholds
Keyingi soatning daromadi +0,5% dan oshishini bashorat qilish uchun klassifikatorni o'rgating va siz muvozanatli ikkilik muammo yaratmadingiz. Sokin kripto-rejimlar davrida barlarning 70--80% chegaradan pastga tushadi, shuning uchun model hech qachon bitta pozitivni bashorat qilmasdan 75% aniqlikka erisha oladi. Bu erda aniqlik foydasiz. Hech kim ataylab tanlamagan standart 0,5 qaror chegarasi ham shunday - bu qiymat predict() foydalanish sodir bo'ladi.
Uchta standart javob mavjud: yo'qotishni qayta tortish scale_pos_weight, yo'qotishni fokal yo'qotish bilan almashtiring yoki yo'qotishni yolg'iz qoldiring va haqiqatdan keyin qaror chegarasini siljiting. Ular odatda bir-birini almashtiruvchi sifatida taqdim etiladi. Ular emas. Ular turli xil aniqlik / eslab qolish almashinuvlarini va eng muhimi, har xil post-xarajat PnL-ni ishlab chiqaradi, chunki savdo eslab qolishdan ko'ra ko'proq aniqlik haqida qayg'uradi - o'tkazib yuborilgan savdo hech qanday xarajat qilmaydi, yomoni esa tarqalish va to'lovlarni talab qiladi.
Ushbu maqola uchtasini bir xil tozalangan oldinga siljish bo'yicha soatlik BTC va ETH ma'lumotlarini o'lchaydi, so'ngra undan kelib chiqadigan ikkita narsani o'z ichiga oladi: nima uchun min_child_weight bu satrlar sonidan ko'ra Hessian ostonasidir (shuning uchun siz yo'qotishni qayta o'lchaganingizda "to'g'ri" qiymat o'zgaradi) va XGBoost, LightGBM va CatBoost aslida farq qiladigan joyda.
| Yondashuv | Aniqlik | Eslash | Savdolar | Post-xarajat PnL | Deflated Sharpe |
|---|---|---|---|---|---|
| Asosiy (tuzatish yo'q, thr=0,5) | — | — | — | — | — |
scale_pos_weight = n_neg/n_pos |
— | — | — | — | — |
| Fokal yo'qotish (g=2, a=0,25) | — | — | — | — | — |
| Eshikni optimallashtirish (min. aniqlik 0,55) | — | — | — | — | — |
Har bir qator uchun bir xil burmalar, bir xil xususiyatlar, bir xil narx modeli. Sharpe sinovdan o'tgan konfiguratsiyalar soni uchun deflated Sharpe va bir nechta test; xarajatlar slippage va xarajat modellari.
Qaytishni bashorat qilishda sinf nomutanosibligini boshqarish

1-yondashuv: tarozi_post_og'irlik
Eng oddiy usul. Oʻrnatish scale_pos_weight = n_negative / n_positive:
n_pos = y_train.sum()
n_neg = len(y_train) - n_pos
scale_pos_weight = n_neg / n_pos # e.g., 3.0 if 75% negative
model = xgb.XGBClassifier(
scale_pos_weight=scale_pos_weight,
...
)
Bu ijobiy toifadagi namunalar uchun gradientni o'lchaydi va modelga ijobiy misolni noto'g'ri tasniflash ekanligini aytadi. salbiyni noto'g'ri tasniflashdan ko'ra yomonroq marta.
Yon ta'sirini o'tkazib yuborish oson: u ham Hessianlarni o'lchaydi. beri min_child_weight bargdagi hessianlarning yig'indisi bo'yicha chegara hisoblanadi (pastga qarang), yo'qotishni qayta tortish daraxtning qanchalik agressiv bo'linishini jimgina o'zgartiradi. A min_child_weight sozlangan scale_pos_weight=1 endi bir xil narsani anglatmaydi scale_pos_weight=3. Ikkalasini ketma-ket emas, balki birga sozlang.
Ikkinchi yon ta'sir: chiqish ehtimoli endi sozlanmagan. predict_proba haqiqiy ehtimollikda monoton narsani qaytaradi, lekin unga teng emas, bu esa bu raqamlarga asoslangan har qanday quyi oqim o'lchamini noto'g'ri qiladi.
2-yondashuv: Fokal yo'qotish
Fokusni yo'qotish sinfdan qat'i nazar, oson misollarni qisqartiradi va mashg'ulotlarni qattiq, noaniq namunalarga qaratadi. Bu qaytishni bashorat qilish uchun jozibali ramka bo'lib, bu erda +0,5% bar va +0,4% bar o'rtasidagi chegara asosan shovqin bo'ladi - garchi teglar shovqinli bo'lsa, "noaniq holatlarga e'tibor qaratish" va "o'rganib bo'lmaydigan holatlarga e'tibor berish" bir xil ko'rsatma bo'ladi, bu taxmin qilish o'rniga o'lchash uchun sababdir.
qayerda haqiqiy sinf uchun bashorat qilingan ehtimollik, sinf og'irliklarini muvozanatlashtiradi va (odatda 1--3) oson misollar qanchalik og'irligi pastligini nazorat qiladi.
def focal_loss_objective(y_true, y_pred, gamma=2.0, alpha=0.25):
"""
Custom focal loss for XGBoost. Returns gradient and hessian.
"""
p = 1.0 / (1.0 + np.exp(-y_pred)) # sigmoid
g1 = alpha * y_true * (1 - p)**gamma * (gamma * p * np.log(p + 1e-9) + p - 1)
g2 = (1 - alpha) * (1 - y_true) * p**gamma * (
-gamma * (1 - p) * np.log(1 - p + 1e-9) - p
)
grad = -(g1 + g2)
hess = np.maximum(grad * (1 - grad), 1e-6)
return grad, hess
model = xgb.XGBClassifier(objective=focal_loss_objective, ...)
Barglarning vazni formulasi tushish bosqichi boʻlishi uchun maxsus maqsadlar uchun gradient va ijobiy Hessian kerak. Fokal yo'qotishning aniq ikkinchi hosilasi hamma joyda ijobiy emas, shuning uchun amalga oshirish surrogatga erishadi - lekin o'lchov omili bo'yicha surrogat qadam o'lchamlarini o'zgartiradi va Hessian summasi orqali u nimani o'zgartiradi min_child_weight olxo'ri. Faqat taqqoslash jadvali bu amalda biron bir xarajat yoki yo'qligini ko'rsatadi.
3-yondashuv: polni optimallashtirish
Yo'qotishni yolg'iz qoldiring, kalibrlangan modelni o'rgating va tasdiqlash to'plamida qaror chegarasini o'tkazing:
from sklearn.metrics import precision_recall_curve
def optimize_threshold(y_true, y_proba, min_precision=0.55):
"""
Find the threshold maximizing F1 subject to a minimum precision.
"""
precisions, recalls, thresholds = precision_recall_curve(y_true, y_proba)
f1_scores = 2 * (precisions * recalls) / (precisions + recalls + 1e-9)
valid = precisions[:-1] >= min_precision
if not valid.any():
return 0.5 # fallback
best_idx = np.argmax(f1_scores[:-1] * valid)
return thresholds[best_idx]
Savdo uchun muhim narsa aniq qavatdir. Faqatgina F1ni maksimal darajaga ko'tarish savdolarni eslab qolish uchun aniqlikni ta'minlaydi, bu PnL nuqtai nazaridan har bir spredni to'laydigan ko'proq marjinal savdolarni anglatadi. Aniqlikni cheklash va eslab qolishni maksimal darajada oshirish uning ostida "kamroq savdo qiling, lekin qilganingizda to'g'ri bo'ling" degan ma'noni anglatadi.
Ikkita qoida bu halollikni saqlaydi: oʻquv oynasidan keyin xronologik boʻyicha oʻrnatilgan tekshirish maʼlumotlari chegarasini moslashtiring va uni har bir katlamada qayta oʻrnating. Butun namuna bo‘yicha bir marta tanlangan chegara oldinga qarashning tarafkashlik taksonomiyasi. Har bir qavatni qayta o'rnatish ham bepul diagnostika imkonini beradi - agar optimal chegara burmalar bo'ylab sakrab chiqsa, kalibrlash beqaror va chegara mos keladigan shovqin.
Nima uchun bolaning eng kam_og'irligi qator hisobi emas, Hessian summasi

Gradientni kuchaytirish qo'shimchalar ansamblini yaratadi. Qadamda daraxt qo'shadi XGBoost ikkinchi darajali Teylor kengayishi bilan yaqinlashadigan tartibga solingan maqsadni minimallashtirish:
bilan , , va
qayerda barglar soni, barglarning og'irligi, har bir barg uchun jarima va L2 atamasi. Optimal barg vaznini hal qilish .
Hessian summasi denominatorda o'tiradi va bu nuqta. min_child_weight bargdagi satrlar sonini emas, balki bu summani chegaralar. Jurnalni yo'qotish uchun, , bu eng katta va bashoratlar aniqlikka yaqinlashganda nolga tushadi. Shunday qilib, ishonchli tasniflangan barlar bilan to'la barg kichik Hessian summasiga ega va kesiladi, bir hovuch chinakam noaniq barlarni ushlab turgan barg esa omon qolishi mumkin.
Shovqinli moliyaviy yorliqlar uchun bu siz xohlagan xatti-harakatdir va u amaliy natijalarni tushuntiradi:
- Ko'tarish
min_child_weighto'rik barglari bir nechta noaniq kuzatuvlarga tayanadi - aniq shovqin bo'lishi mumkin bo'lganlar. Bu o'tkirroq asbobmin_child_samples-stildagi qatorlarni hisoblash. - Yo'qotishni o'zgartiradigan har qanday narsa Hessianlarni o'zgartiradi.
scale_pos_weight, maxsus maqsadlar va namuna og'irliklarining barchasi samarali o'zgaradimin_child_weightsiz kiritgan raqam o'zgarmagan bo'lsa ham. - O'sish sur'atlari va bashoratlar keskinlashgani sayin, Hessiliklar butun dunyo bo'ylab qisqaradi, shuning uchun barqaror
min_child_weightkeyingi davrlarda agressivroq o'rik. Bu o'rnatilgan tavlanish effektidir va shuning uchun ko'proq daraxtlar bilan pastroq o'rganish stavkalari kamroq, kattaroq qadamlardan farq qiladi.
LightGBM min_child_samples qatorlar soni, ya'ni shunga o'xshash nomga ega bo'lgan haqiqiy boshqa parametr. Uning Hessian analogi min_sum_hessian_in_leaf. Ikki kutubxona o'rtasida nomlarni moslashtirish orqali konfiguratsiyani o'tkazish modelni tasodifan o'zgartirishning keng tarqalgan usuli hisoblanadi.
XGBoost va LightGBM va CatBoost: muhandislik farqlari

Uchalasi ham gradient kuchaytirilgan qarorlar daraxtlarini amalga oshiradi. Farqlar daraxt qurilishida va ular aslida mashg'ulot vaqtida va namunadan tashqari ballda namoyon bo'ladi.
XGBoost o'sadi darajali (kenglik-birinchi): ma'lum bir chuqurlikdagi barcha barglar chuqurroq borishdan oldin bo'linadi. Bu muvozanatli daraxtlar ishlab chiqaradi, qiladi max_depth mazmunli murakkablik nazorati, va sozlash uchun ko'proq taxmin qilinadi. Bundan tashqari, kamayishi uchun ozgina yo'qotish qolgan barglarni ajratish ishlarini behuda sarflaydi.
LightGBM bargdek o'sadi: qaysi barg eng katta yo'qotishni kamaytirsa, u barg qayerda o'tirmasin, o'sha bargni ajratadi. Kamroq bo'linishlar bir xil ta'lim yo'qotadi, lekin daraxtlar chuqur va muvozanatsiz bo'lib qoladi, shuning uchun max_depth to'g'ri boshqaruv tugmasi bo'lishni to'xtatadi - num_leaves hisoblanadi. Yana ikkita hiyla uning tezligini oshiradi:
- GOSS (Gradient asosidagi bir tomonlama namuna olish) barcha katta gradientli misollarni saqlaydi va kichik gradientli namunalarni tasodifiy subnampalaydi, gradient bahosini xolis saqlash uchun omon qolganlarning og‘irligini oshiradi. Moliyaviy ma'lumotlarga ko'ra, katta gradientli misollar hozirda model noto'g'ri bo'lgan chiziqlardir - bu yorliq shovqini ham yashaydi, shuning uchun GOSS shovqin eng yomon bo'lgan joyda namuna olishga jamlaydi. Taxmin qilishdan ko'ra oddiy quyi namunaga qarshi tekshirishga arziydi.
- EFB (Exclusive Feature Bundling) bir-birini eksklyuziv siyrak xususiyatlarni bitta bo'sh joy funksiyasiga jamlaydi. Bir martalik kodlashda samarali; zich uzluksiz xususiyatlar bo'yicha deyarli foydasiz, bu texnik xususiyatlar matritsasining ko'p qismidir.
CatBoost simmetrik (e'tiborsiz) daraxtlarni o'stiradi: ma'lum bir chuqurlikdagi har bir tugun bir xil bo'linish holatidan foydalanadi. Bu kuchli tartibga soluvchi va juda tez xulosa chiqaradi - daraxt indeksli qidiruvga aylanadi - har bir daraxt uchun ekspressivlik narxi. Uning ikkita farqlash mexanizmi:
- Buyurtmali kuchaytirish. Standart kuchaytirish, namuna bo'yicha o'qitilgan modeldan foydalangan holda namuna uchun qoldiqlarni hisoblab chiqadi, bu qoldiqni - "bashorat o'zgarishini" yo'naltiradi. CatBoost har bir namuna uchun qoldiqlarni faqat undan oldingi namunalarga tasodifiy almashtirishda o'rnatilgan model yordamida baholaydi. Struktura vaqt seriyali fikrlash uchun tabiiy mos keladi va ma'lumotlar cheklangan bo'lsa, eng muhimi.
- Tartiblangan maqsadli statistika toifali kodlash uchun, u faqat oldingi namunalardagi maqsadli statistikani hisoblab chiqadi va oddiy oʻrtacha kodlash sabab boʻladigan maqsadli sizib chiqishning oldini oladi. Bu xususiyatlar to'plami almashinuv, aktivlar darajasi yoki rejim belgilariga ega bo'lsa, CatBoost-dan foydalanishning halol sababidir.
| Mulk | XGBoost | LightGBM | CatBoost |
|---|---|---|---|
| Daraxt o'sishi | Daraja bo'yicha | Barglar bo'yicha | Simmetrik (e'tiborsiz) |
| Murakkablik tugmasi | max_depth |
num_leaves |
depth |
| Barg o'lchamidagi himoya | min_child_weight (Gessian) |
min_child_samples (qatorlar) |
min_data_in_leaf (qatorlar) |
| Kategorik xususiyatlar | Qo'lda kodlash | Asosiy yordam | Mahalliy, buyurtma qilingan TS |
| Tartibga solish | L1/L2 + gamma | L1/L2 + barglar soni | L2 + tasodifiy kuch |
| Maxsus yo'qotish | Moslashuvchan | Moslashuvchan | Bir oz cheklangan |
| Poyezd vaqti, bu ma'lumotlar to'plami | — | — | |
| OOS jurnali yo'qolishi, bir xil burmalar | — | — |
Sifatli qatorlar kutubxona faktlaridir. Oxirgi ikkita qator "qaysi birini ishlatishim kerak" degan savolga javob beradigan yagona qator bo'lib, ular sizning shaxsiy ma'lumotlaringizdan kelib chiqishi kerak - yaxshi sozlangan ilovalar o'rtasidagi farqlar odatda ma'lumotlar to'plamining shakli hal qiladigan darajada kichikdir.
Kutubxonalarni almashtirish asosan nomni o'zgartirishdir. Parametrlari uch marta emas, balki bir-biridan farq qiluvchi bitta trening funksiyasi:
import xgboost as xgb
def train_xgb_model(X_train, y_train, X_val, y_val, class_weight_ratio=1.0):
"""Train XGBoost classifier for return direction prediction."""
model = xgb.XGBClassifier(
n_estimators=2000,
max_depth=5,
learning_rate=0.01,
subsample=0.7,
colsample_bytree=0.7,
min_child_weight=10, # Hessian sum, not row count
gamma=1.0,
reg_alpha=0.1,
reg_lambda=1.0,
scale_pos_weight=class_weight_ratio,
objective='binary:logistic',
eval_metric='logloss',
tree_method='hist',
random_state=42,
early_stopping_rounds=50,
)
model.fit(X_train, y_train, eval_set=[(X_val, y_val)], verbose=False)
return model
| Kontseptsiya | XGBoost | LightGBM | CatBoost |
|---|---|---|---|
| Daraxtlar soni | n_estimators |
n_estimators |
iterations |
| L2 penalti | reg_lambda |
reg_lambda |
l2_leaf_reg |
| Ustunlarni tanlash | colsample_bytree |
colsample_bytree |
rsm |
| Sinf nomutanosibligi | scale_pos_weight |
scale_pos_weight |
auto_class_weights='Balanced' |
| Erta to'xtash | early_stopping_rounds |
lgb.early_stopping() qayta qo'ng'iroq |
early_stopping_rounds |
Alfa-parchalanish detektori sifatida burmalar bo'ylab SHAP ahamiyati

Blog allaqachon gradientni kuchaytiruvchi modeldagi SHAPni qamrab olgan — TreeExplainer, xulosa syujetlari va ularni qanday o'qish kerak. SHAP bo'ylama dan foydalanish nazarda tutilmagan: har bir oldinga o'tish uchun bitta tushuntiruvchi, vaqt davomida har bir xususiyatning o'rtacha mutlaq atributini kuzatib boradi.
def shap_over_time(models, test_sets, feature_names) -> pd.DataFrame:
"""
Track SHAP-based feature importance across walk-forward folds.
Rows are folds, columns are features.
"""
importance_over_time = []
for fold_idx, (model, X_test) in enumerate(zip(models, test_sets)):
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
mean_abs_shap = np.abs(shap_values).mean(axis=0)
importance_over_time.append(
pd.Series(mean_abs_shap, index=feature_names, name=fold_idx)
)
return pd.DataFrame(importance_over_time)
Chiqish katlama × xususiyat matritsasi bo'lib, unda uchta ajralib turadigan shakl mavjud:
- Monoton pasayish — funksiyaning chekkasi pasayib bormoqda. Olib tashlash yoki bozor tuzilmasida nima o'zgarganligini tekshirish uchun nomzod.
- Yuqori tafovut, tendentsiya yo‘q — xususiyat shovqin bo‘lib, u ba’zi rejimlarda modelga yopishadi. Bu plato tahlili xususiyatlar uchun qo'llaniladigan parametrlar uchun miqdorni belgilaydi.
- Rejim o'zgarishi bo'yicha qadam o'zgarishi — muhimlik ma'lum bir qatlamda pasayadi va pastda qoladi. Odatda alfa yemirilishidan ko'ra birja, listing yoki to'lov-tuzilish hodisasiga qarab kuzatilishi mumkin.
Tuzoq shundan iboratki, modelning umumiy ishonchi o‘zgarganda mutlaq SHAPni qatlamlar bo‘yicha taqqoslab bo‘lmaydi: hamma joyda 0,5 ga yaqinroq bashorat qiladigan model bir vaqtning o‘zida har bir xususiyat uchun kichikroq atributlarni ishlab chiqaradi. Taqqoslashdan oldin har bir qavatning ahamiyatini 1 ga yig'ish uchun normallashtiring, shuning uchun siz ishonch o'zgarishlarini emas, balki nisbiy muhim o'zgarishlarni o'qiyapsiz.
Nima uchun daraxtlar, qisqacha

Grinsztajn, Oyallon va Varoquaux (NeurIPS 2022) daraxtlar ansambllarini 45 ta jadval ma'lumotlar to'plamida chuqur o'rganishga qarshi sinovdan o'tkazdi va daraxtlarga yordam beradigan uchta tarkibiy xususiyatni ajratib oldi - uchtasi ham moliyaviy ma'lumotlarni tavsiflaydi:
- Tartibsiz maqsadli funksiyalar. Qaytishlar silliq emas; ularda uzilishlar, rejim o'zgarishlari va chegara effektlari mavjud. Eksa tekislangan bo'linishlar ularni silliq yuzaga yaqinlashtirmasdan ushlaydi.
- Ma'lumot bermaydigan xususiyatlar. Alfa quvur liniyasi yuzlab nomzodlarni keltirib chiqaradi va ularning aksariyati shovqin. Daraxtlar har bir bo'linishda tanlanadi; neyron tarmoqlar barcha kirishlar bo'ylab imkoniyatlarni tarqatadi, parametrlarni shovqinga sarflaydi.
- Non-aylanma o'zgarmasligi. O'zgaruvchanlik bilan hajmni almashtirib bo'lmaydi. Neyron tarmoqlar sukut bo'yicha aylanishda o'zgarmas bo'lib, xususiyatlarning chiziqli birikmalarini asl nusxalarga ekvivalent deb hisoblaydi - bu aniq semantik ma'noga ega xususiyatlar uchun noto'g'ri.
Ushbu kelishuvning amaliy tomoni uchun - ma'lumotlar hajmi, kechikish, xususiyat-muhandislik sa'y-harakatlari, izohlash mumkinligi, rejimga moslashish - blogda allaqachon mashinani o'rganish bilan modellashtirishning tarqalishi bo'yicha to'liq qarorlar jadvali mavjud.
Xususiyat muhandisligi

import pandas as pd
import numpy as np
def build_features(df: pd.DataFrame) -> pd.DataFrame:
"""
Build trading features from OHLCV data.
Expects columns: open, high, low, close, volume, timestamp
"""
feat = pd.DataFrame(index=df.index)
feat['return_1'] = df['close'].pct_change(1)
feat['return_5'] = df['close'].pct_change(5)
feat['return_15'] = df['close'].pct_change(15)
feat['return_60'] = df['close'].pct_change(60)
log_ret = np.log(df['close'] / df['close'].shift(1))
feat['volatility_20'] = log_ret.rolling(20).std()
feat['volatility_60'] = log_ret.rolling(60).std()
feat['vol_ratio'] = feat['volatility_20'] / feat['volatility_60']
feat['parkinson_vol'] = np.sqrt(
(1 / (4 * np.log(2)))
* (np.log(df['high'] / df['low']) ** 2).rolling(20).mean()
)
feat['volume_sma_ratio'] = df['volume'] / df['volume'].rolling(20).mean()
feat['volume_std_20'] = df['volume'].rolling(20).std()
feat['obv'] = (np.sign(df['close'].diff()) * df['volume']).cumsum()
feat['obv_slope'] = feat['obv'].diff(5) / feat['obv'].shift(5)
feat['high_low_range'] = (df['high'] - df['low']) / df['close']
feat['close_position'] = (df['close'] - df['low']) / (df['high'] - df['low'])
feat['gap'] = df['open'] / df['close'].shift(1) - 1
delta = df['close'].diff()
gain = delta.clip(lower=0).rolling(14).mean()
loss = (-delta.clip(upper=0)).rolling(14).mean()
feat['rsi_14'] = 100 - 100 / (1 + gain / loss)
ema_12 = df['close'].ewm(span=12).mean()
ema_26 = df['close'].ewm(span=26).mean()
feat['macd'] = (ema_12 - ema_26) / df['close']
feat['macd_signal'] = feat['macd'].ewm(span=9).mean()
feat['macd_hist'] = feat['macd'] - feat['macd_signal']
for window in [10, 20, 50]:
sma = df['close'].rolling(window).mean()
feat[f'distance_sma_{window}'] = (df['close'] - sma) / sma
std = df['close'].rolling(window).std()
feat[f'bb_position_{window}'] = (df['close'] - sma) / (2 * std)
return feat
Yuqoridagi har bir xususiyat konstruksiya boʻyicha sabab boʻladi – faqat aylanish va kengaytirish operatsiyalari, toʻliq namunaviy statistika yoʻq. Bu ataylab qilingan: butun seriyali z-skoring bu turdagi quvur liniyasida eng ko'p uchraydigan yagona qochqindir va uning Sharpga ta'siri oldinga qarashli ob'ektiv taksonomiya bilan o'lchanadi.
Moliyaviy ma'lumotlar bo'yicha XGBoost uchun giperparametr diapazonlari

Maqsad namunadagi maksimal ishlash emas, balki namunadan tashqari maksimal barqarorlikdir. Birinchi tartibga solish, ikkinchidan murakkablik:
| Parametr | Oddiy diapazon | Maqsad |
|---|---|---|
max_depth |
3--7 | O'zaro ta'sir qilish tartibini cheklaydi. Chuqurroq daraxtlar yuqori darajadagi shovqinlarni modellashtiradi, lekin tezroq moslashadi. 4 da boshlang. |
min_child_weight |
5--100 | Bargdagi minimal Hessian summasi. Har safar o'zgartirganingizda qayta sozlang scale_pos_weight yoki maqsad. |
learning_rate |
0,005--0,05 | Siqilish. Pastroq qiymatlar ko'proq daraxtlarni talab qiladi, lekin yaxshiroq umumlashtiradi. |
subsample |
0,5--0,8 | Daraxt uchun qatordan namuna olish. Tasodifiylikni qo'shadi, ortiqcha moslamani kamaytiradi. |
colsample_bytree |
0,5--0,8 | Har bir daraxt uchun ustundan namuna olish. Ko'p o'zaro bog'liq xususiyatlar bilan tanqidiy. |
gamma |
0,5--5,0 | Bo'linish uchun minimal yo'qotishlarni kamaytirish. Azizillo ostonasi vazifasini bajaradi. |
reg_alpha (L1) |
0,01--1,0 | Barglarning og'irligi bo'yicha L1. Kamchilikni rag'batlantiradi. |
reg_lambda (L2) |
0,1--10,0 | Barglarning og'irligi bo'yicha L2. Katta barglar qiymatlarini oldini oladi. |
Qidiruv jarayonining oʻzi — TPE, oʻrganish qatʼiyligi va nima uchun Bayes qidiruvi koordinata tushishini yengishini bilish uchun qarang: Optuna va koordinata tushishi. Qaysi sinovdan foydalansangiz, keyin Sharpe deflyatsiyasiga o'tkazilishi kerak.
Ushbu maqola ataylab boshqa xabarlarga qoldiradi

Gradientni kuchaytiruvchi model atrofidagi iskala allaqachon o'lchovlar bilan qoplangan:
- Tasdiqlash boʻlindi. Oldinga qarab optimallashtirish langar va aylanuvchi oynalar va buzilish tezligi uchun;
purged_walk_forwardmashina o'rganish bilan modellashtirishni yoyish haqiqiy tozalash/embargo bo'shlig'iga ega bo'lgan splitter uchun. Tozalashsiz jo'natmang - bir-biriga o'xshash old oyna nishonlari burma chegaralari bo'ylab oqadi. - Haddan tashqari moslashtirilgan boshqaruv. Poezd/sinov oralig‘i va o‘zaro katlamalar barqarorligi, plato tahlilida va orqa sinovdan ortiqcha moslashish ehtimoli.
- PnL uchun bashorat. Vektorlashtirilgan
signal * shifted-returntekis bps xarajatlari bilan backtest Sharpe bir nechta omadli savdolardan ishlab chiqaradi - qarang ob'ektiv funktsiya dizayni va Faol vaqt uchun PnL. Qidiruvdan keyingi har qanday Sharpe-ni sinov muddati uchun o'chiring: deflated Sharpe va halol salbiy chekka haqiqiy bo'lmaganda qanday ko'rinishi uchun. - Tranzaksiya xarajatlari. Slippage xarajati modellari va maker-taker to'lovlari. 53% aniqlik yo'nalishi modeli siz tanlagan xarajat modelida yashaydi yoki o'ladi.
Natijalar emas, balki gipoteza sifatida yana uchta tuzoq keltiriladi: faqat ro'yxatga olingan aktivlar bo'yicha mashg'ulotlardan omon qolishga moyillik; beta-qoldiq daromadlari yaxshiroq bo'lishi mumkin bo'lgan xom ashyoni qaytarish maqsadlarining statsionar emasligi; va qayta tayyorlash kadensi, bunda SHAP-over-folds diagnostikasi tabiiy drift monitoridir.
Xulosa

Qaytish yo'nalishi tasnifi hech kim tanlamagan qaror chegarasi bilan nomutanosib muammo bo'lib, uchta standart tuzatish bir-birini almashtirib bo'lmaydi. scale_pos_weight bir qatordir, lekin ehtimolliklarni kalibrlaydi va jimgina harakat qiladi min_child_weight. Fokal yo'qotish Hessianga muhtoj bo'lib, ko'pchilik ilovalar taxminan. Bo‘sag‘ani optimallashtirish modelni yolg‘iz qoldiradi va savdoga tegishli cheklovni – aniqlikni – tegishli joyga qo‘yadi, lekin agar chegara mashg‘ulotdan so‘ng keladigan ma’lumotlar bo‘yicha har bir marta qayta o‘rnatilsa.
Qaysi biri g'alaba qozonadi - bu sizning ma'lumotlaringiz, chegarangiz va xarajat modelingiz haqidagi empirik savol. Yuqoridagi jadval bitta ma'lumotlar to'plami uchun javobdir; uni o'zingizda ishlatish taxmin qilishga sarflangan sozlash vaqtidan kamroq xarajat qiladi.
Qo'shimcha o'qish:
- Grinsztajn va boshqalar, "Nima uchun daraxtga asoslangan modellar odatdagi jadval ma'lumotlari bo'yicha chuqur o'rganishdan ustun turadi?" (NeurIPS 2022)
- Vang va boshq., "Imbalance-XGBoost: ikkilik yorliqli nomutanosiblik tasnifi uchun vaznli va fokusli yo'qotishlardan foydalanish"
- Chen va Guestrin, "XGBoost: kengaytiriladigan daraxtni ko'paytirish tizimi" (KDD 2016)
- Ke va boshqalar, "LightGBM: Yuqori samarali gradientni kuchaytiruvchi qaror daraxti" (NeurIPS 2017)
- Prokhorenkova va boshqalar, "CatBoost: kategorik xususiyatlar bilan xolis boosting" (NeurIPS 2018)
- XGBoost hujjatlari: Parametrlarni sozlash bo'yicha eslatmalar
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.