📝

Draft article

This draft is visible to admins and superusers only. Sign in with an authorized account.

← Maqolalarga qaytish
August 25, 2026
5 daqiqa o'qish

XGBoost for Return Direction: Class Imbalance and Decision Thresholds

XGBoost for Return Direction: Class Imbalance and Decision Thresholds
#machine-learning
#xgboost
#gradient-boosting
#quant
#prediction

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

Muvozanatli qaytishni bashorat qilish signali maydoni

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. kk 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.

FL(pt)=αt(1pt)γlog(pt)\text{FL}(p_t) = -\alpha_t (1 - p_t)^{\gamma} \log(p_t)

qayerda ptp_t haqiqiy sinf uchun bashorat qilingan ehtimollik, αt\alpha_t sinf og'irliklarini muvozanatlashtiradi va γ\gamma (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

Egrilik qo‘llab-quvvatlanadigan daraxt bo‘linishi

Gradientni kuchaytirish qo'shimchalar ansamblini yaratadi. Qadamda tt daraxt qo'shadi ftf_t XGBoost ikkinchi darajali Teylor kengayishi bilan yaqinlashadigan tartibga solingan maqsadni minimallashtirish:

L(t)i=1n[gift(xi)+12hift2(xi)]+Ω(ft)\mathcal{L}^{(t)} \approx \sum_{i=1}^{n} \Bigl[ g_i f_t(\mathbf{x}_i) + \frac{1}{2} h_i f_t^2(\mathbf{x}_i) \Bigr] + \Omega(f_t)

bilan gi=l/y^i(t1)g_i = \partial l / \partial \hat{y}_i^{(t-1)}, hi=2l/(y^i(t1))2h_i = \partial^2 l / \partial (\hat{y}_i^{(t-1)})^2, va

Ω(f)=γT+12λj=1Twj2\Omega(f) = \gamma T + \frac{1}{2}\lambda \sum_{j=1}^{T} w_j^2

qayerda TT barglar soni, wjw_j barglarning og'irligi, γ\gamma har bir barg uchun jarima va λ\lambda L2 atamasi. Optimal barg vaznini hal qilish wj=ijgi/(ijhi+λ)w_j^* = -\sum_{i \in j} g_i / (\sum_{i \in j} h_i + \lambda).

Hessian summasi denominatorda o'tiradi va bu nuqta. min_child_weight bargdagi satrlar sonini emas, balki bu summani chegaralar. Jurnalni yo'qotish uchun, hi=pi(1pi)h_i = p_i(1 - p_i), bu eng katta p=0.5p = 0.5 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_weight o'rik barglari bir nechta noaniq kuzatuvlarga tayanadi - aniq shovqin bo'lishi mumkin bo'lganlar. Bu o'tkirroq asbob min_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'zgaradi min_child_weight siz 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_weight keyingi 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

Gradientni kuchaytiruvchi uchta arxitektura

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

Funksiya atributi burmalar boʻylab pasaymoqda

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:

  1. Monoton pasayish — funksiyaning chekkasi pasayib bormoqda. Olib tashlash yoki bozor tuzilmasida nima o'zgarganligini tekshirish uchun nomzod.
  2. 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.
  3. 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

Nochiziqli bozor landshaftidagi qaror daraxti

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:

  1. Tartibsiz maqsadli funksiyalar. Qaytishlar silliq emas; ularda uzilishlar, rejim o'zgarishlari va chegara effektlari mavjud. Eksa tekislangan bo'linishlar ularni silliq yuzaga yaqinlashtirmasdan ushlaydi.
  2. 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.
  3. 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

Bozor signallari funksiyalarga aylanadi

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

Giperparametr kuchaytirilgan sirt atrofida orbitalar

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

Chegara darvozalarini tekshirish

Gradientni kuchaytiruvchi model atrofidagi iskala allaqachon o'lchovlar bilan qoplangan:

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

Oldin qilingan qarorlar manzarasi

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:

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.