← กลับไปยังบทความ
August 3, 2026
อ่าน 5 นาที

วิธีการรวมกลุ่ม: ผสมผสานผู้เรียนที่อ่อนแอเพื่ออัลฟ่าที่แข็งแกร่ง

วิธีการรวมกลุ่ม: ผสมผสานผู้เรียนที่อ่อนแอเพื่ออัลฟ่าที่แข็งแกร่ง
#machine-learning
#ensemble
#bagging
#stacking
#alpha

การเขียนเกี่ยวกับกลุ่มการค้าขายส่วนใหญ่แย้งว่าโมเดลจำนวนมากจะดีกว่า นั่นคือแกนที่ผิด ข้อผิดพลาดของวงดนตรีแบ่งออกเป็นสามเงื่อนไข และในการซื้อขายมีเพียงเงื่อนไขเดียวเท่านั้นที่ถือเป็นข้อจำกัดที่มีผลผูกพัน

บทความนี้เป็นเรื่องเกี่ยวกับคำศัพท์หนึ่งคำนั้น และผลที่ตามมาประมาณสองประการที่ส่วนที่เหลือของบล็อกนี้ไม่ครอบคลุม: การซ้อนกันเป็นเลเยอร์การรวมสัญญาณที่ชัดเจน และการรวมสัญญาณจำนวนมากเข้าด้วยกันจะทำให้มูลค่าการซื้อขายลดลงจริง ๆ ก่อนที่การซื้อขายจะเข้าสู่ตลาดหรือไม่

คำที่ผูกมัดจริงๆ: อคติ-ความแปรปรวน-ความแปรปรวนร่วม

สำหรับชุดการถดถอยของ NN แบบจำลอง ซึ่งเป็นความคลาดเคลื่อนกำลังสองที่คาดหวังของการทำนายโดยเฉลี่ย fˉ\bar{f} สลายตัวเป็น:

E[(fˉy)2]=bias2+1Nvariance+(11N)covarianceE\left[\left(\bar{f} - y\right)^2\right] = \overline{\text{bias}^2} + \frac{1}{N}\overline{\text{variance}} + \left(1 - \frac{1}{N}\right)\overline{\text{covariance}}

สามเทอม สามคันโยก:

  • การใส่ถุง โจมตีเงื่อนไขความแปรปรวนโดยการหาค่าเฉลี่ยจากตัวอย่างบูตสแตรป
  • การเร่ง โจมตีระยะอคติโดยการแก้ไขสิ่งตกค้างซ้ำๆ
  • การซ้อน โจมตีคำศัพท์ความแปรปรวนร่วมโดยการเรียนรู้น้ำหนักรวม แทนที่จะถือว่าเท่ากัน
  • เพิ่มขึ้น NN ลดเฉพาะส่วนร่วมของผลต่าง มันไม่ได้ทำอะไรเลยกับความแปรปรวนร่วม — (11/N)(1 - 1/N) ค่าสัมประสิทธิ์อยู่ที่ 0.99 แล้วที่ N=100N = 100.

จุดสุดท้ายนั่นคือข้อโต้แย้งทั้งหมด ในการซื้อขาย โมเดลจะได้รับการฝึกโดยใช้ตราสารเดียวกันในประวัติศาสตร์เดียวกัน โดยเทียบกับเป้าหมายที่มีการเปลี่ยนแปลงที่ใกล้เคียงกันของชุดราคาเดียวกัน ข้อผิดพลาดของพวกเขาไม่ใกล้เคียงกับความเป็นอิสระ ดังนั้นระยะความแปรปรวนร่วมจึงมีมาก และระยะความแปรปรวนก็หมดลงแล้ว ซึ่งหมายความว่าการนับแบบจำลองทำให้คุณแทบไม่ได้ทำอะไรเลย และความแตกต่างทางโครงสร้างก็ซื้อทุกอย่างให้กับคุณ

รูปแบบการกล่าวอ้างที่เป็นรูปธรรมและปลอมแปลงได้: การเพิ่มทรีที่มีการไล่ระดับสีครั้งที่ 101 ควรย้ายเมตริกทั้งมวลน้อยกว่าการเพิ่มโมเดลที่มีโครงสร้างต่างกันหนึ่งโมเดล — LSTM ซึ่งเป็นโมเดลเชิงเส้นบนโดเมนฟีเจอร์ที่ไม่เชื่อมต่อกัน สิ่งใดก็ตามที่มีอคติเชิงอุปนัยที่แตกต่างกัน ต้นไม้ชายขอบเกือบจะขนานกับต้นไม้ที่มีอยู่ในหนังสือแล้ว ไม่ใช่โมเดลที่มีโครงสร้างแตกต่างกัน

ความสัมพันธ์ ไม่ใช่การนับโมเดล จะกำหนดความกว้างที่มีประสิทธิภาพของทั้งมวล — การได้มา ปัจจัยความสัมพันธ์ที่เข้ารหัสลับที่วัดตามประเภทสินทรัพย์ และการจำลองกับข้อมูลคู่จริงอยู่ใน Signal Correlation: จำนวนคู่ที่ต้องตรวจสอบ

อย่าลดความหลากหลายของวงดนตรีให้เหลือเพียงตัวเลขเดียว The Deflated Sharpe Ratio คำนวณห้าประสิทธิภาพ-NN ตัวประมาณค่า (ความสัมพันธ์โดยเฉลี่ย, อัตราส่วนการมีส่วนร่วม, PCA-95%, Kaiser, Cheverud-Nyholt) บนตาราง 640 เซลล์จริง แสดงให้เห็นช่วง NeffN_{\text{eff}} จาก 1.6 ถึง 370 และให้เหตุผลว่าวงดนตรี — ไม่ใช่การประมาณจุดเดียว — คือสิ่งที่ส่งมอบได้ รายงานวงดนตรี.

การซ้อนเป็นเลเยอร์การรวมสัญญาณ

การบรรจุถุงและการเพิ่มกำลังได้รับการคุ้มครองอย่างดีในที่อื่น การสร้างแบบจำลองการแพร่กระจายด้วยการเรียนรู้ของเครื่อง จัดส่งการตั้งค่าการเร่งการไล่ระดับสี การเลือกการสูญเสียสำหรับเป้าหมายที่บิดเบี้ยว การค้นพบความสำคัญของ SHAP อนุกรมวิธานของคุณลักษณะ และการแยกแบบเดินไปข้างหน้าแบบล้างข้อมูลด้วยการทับซ้อนของหน้าต่างไปข้างหน้าที่กระตุ้นให้เกิดช่องว่าง เริ่มตรงนั้น ส่วนนี้จะถือว่ามัน

สิ่งที่ไม่ครอบคลุมคือระดับที่สูงกว่า: ผู้เรียนเมตาที่ใช้การทำนายโมเดลพื้นฐานเป็นคุณสมบัติอินพุตและเรียนรู้วิธีรวมเข้าด้วยกัน

  • ระดับ 0 (ผู้เรียนพื้นฐาน): โมเดลที่หลากหลายที่สร้างการคาดการณ์จากคุณสมบัติดิบ
  • ระดับ 1 (ผู้เรียนเมตา): แบบจำลองที่เรียนรู้ว่าผู้เรียนควรไว้วางใจฐานใด และเมื่อใด

กลไกที่ทำให้สิ่งนี้ปลอดภัยนั้นเป็นคุณสมบัติเมตาที่ไม่อยู่ในรูปแบบเดิม ผู้เรียนเมตาต้องไม่เคยเห็นการทำนายโมเดลพื้นฐานที่ทำขึ้นจากข้อมูลที่โมเดลพื้นฐานได้รับการฝึกฝน — การคาดการณ์เหล่านั้นมีอคติในแง่ดีในลักษณะที่ไม่รอดจากการซื้อขายจริง และผู้เรียนเมตาจะชั่งน้ำหนักตามนั้น

import numpy as np
import pandas as pd
from sklearn.base import clone
from sklearn.model_selection import TimeSeriesSplit


class TradingStackingEnsemble:
    """
    Two-level stacking ensemble for return prediction.

    Level 0: base learners, each on its own feature domain
    Level 1: meta-learner trained on out-of-fold base predictions
    """

    def __init__(self, base_models: list, meta_model, n_splits: int = 5):
        self.base_models = base_models  # list of (name, model, feature_cols)
        self.meta_model = meta_model
        self.n_splits = n_splits
        self.fitted_base_models_ = {}

    def _generate_meta_features(
        self,
        X: pd.DataFrame,
        y: pd.Series
    ) -> pd.DataFrame:
        """Out-of-fold predictions from each base model."""
        tscv = TimeSeriesSplit(n_splits=self.n_splits)
        meta_features = pd.DataFrame(index=X.index)

        for name, model, feature_cols in self.base_models:
            oof_preds = pd.Series(np.nan, index=X.index)

            for train_idx, val_idx in tscv.split(X):
                X_train = X.iloc[train_idx][feature_cols]
                y_train = y.iloc[train_idx]
                X_val = X.iloc[val_idx][feature_cols]

                fold_model = clone(model)
                fold_model.fit(X_train, y_train)

                if hasattr(fold_model, 'predict_proba'):
                    oof_preds.iloc[val_idx] = fold_model.predict_proba(X_val)[:, 1]
                else:
                    oof_preds.iloc[val_idx] = fold_model.predict(X_val)

            meta_features[name] = oof_preds

        return meta_features.dropna()

    def fit(self, X: pd.DataFrame, y: pd.Series):
        meta_features = self._generate_meta_features(X, y)
        y_meta = y.loc[meta_features.index]

        self.meta_model.fit(meta_features, y_meta)

        for name, model, feature_cols in self.base_models:
            model.fit(X[feature_cols], y)
            self.fitted_base_models_[name] = model

        return self

    def predict(self, X: pd.DataFrame) -> np.ndarray:
        meta_features = pd.DataFrame()

        for name, model, feature_cols in self.base_models:
            fitted = self.fitted_base_models_[name]
            if hasattr(fitted, 'predict_proba'):
                meta_features[name] = fitted.predict_proba(X[feature_cols])[:, 1]
            else:
                meta_features[name] = fitted.predict(X[feature_cols])

        return self.meta_model.predict(meta_features)

การแบ่งแยกวินัยในที่นี้ไม่ใช่ทางเลือกและไม่ใช่เรื่องแปลกใหม่ ใช้แนวทางเดินไปข้างหน้าที่ถูกกวาดล้างและห้ามขนส่ง และทำความเข้าใจว่าการรั่วไหลแต่ละประเภทมีมูลค่าเท่าใดใน Sharpe ที่สูงเกินจริง ก่อนที่จะเชื่อถือตัวเลขเหล่านี้ ทั้งสองได้รับการวัดผลแล้ว: อนุกรมวิธานอคติแบบ look-ahead จะวัดปริมาณการดำเนินการ ตัวบ่งชี้ และการรั่วไหลของการทำให้เป็นมาตรฐานในโปรแกรมจำลองที่มีการควบคุม และ การเพิ่มประสิทธิภาพแบบ walk-forward ครอบคลุมหน้าต่างแบบทอดสมอและแบบกลิ้ง, CPCV, การล้างข้อมูล และการวินิจฉัยการย่อยสลายของ WFER

การตัดสินใจออกแบบสามประการมีความเฉพาะเจาะจงกับการวางซ้อนและคุ้มค่าที่จะระบุ

ความเรียบง่ายของผู้เรียนเมตา ใช้โมเดลเชิงเส้น — ริดจ์ ลาสโซ การถดถอยโลจิสติก ผู้เรียนพื้นฐานจัดการกับความไม่เชิงเส้น เมตาเลิร์นเนอร์จะจัดการชุดค่าผสมเท่านั้น เมตาเลิร์นเนอร์ที่ซับซ้อนที่อยู่ด้านบนของผู้เรียนฐานที่ซับซ้อนคือการโอเวอร์ฟิตลำดับที่สอง และการทำให้เป็นมาตรฐานของ L1 ที่เลเยอร์การรวมกันมีผลข้างเคียงที่เป็นประโยชน์ของการทำให้โมเดลพื้นฐานเป็นศูนย์ซึ่งมีส่วนทำให้เกิดเสียงรบกวนเท่านั้น

ความน่าจะเป็นผลลัพธ์เหนือป้ายกำกับแบบตายตัว predict_proba มีข้อมูลความเชื่อมั่นที่ป้ายกำกับชั้นเรียนละทิ้ง และช่วยให้ผู้เรียนเมตาสามารถคาดเดาฐานได้อย่างมั่นใจมากขึ้น

การแบ่งพาร์ติชันโดเมนฟีเจอร์ นี่คือคันโยกความหลากหลายที่มีเลเวอเรจสูงสุด และตามมาโดยตรงจากอาร์กิวเมนต์ความแปรปรวนร่วม: โมเดลที่เห็นฟีเจอร์เดียวกันจะทำให้เกิดข้อผิดพลาดที่สัมพันธ์กันโดยไม่คำนึงถึงอัลกอริทึม

FEATURE_GROUPS = {
    'momentum': ['ret_5d', 'ret_10d', 'ret_21d', 'ret_63d'],
    'volatility': ['vol_21d', 'vol_ratio', 'vol_skew', 'garch_vol'],
    'volume': ['volume_ratio', 'obv_slope', 'vwap_dist', 'adv_ratio'],
    'mean_reversion': ['dist_from_ma21', 'dist_from_ma63', 'rsi_14', 'bb_pct'],
    'microstructure': ['bid_ask_spread', 'kyle_lambda', 'amihud_illiq'],
    'fundamental': ['ep_ratio', 'bp_ratio', 'roe', 'accruals'],
}

base_models = []
for domain, features in FEATURE_GROUPS.items():
    model = GradientBoostingClassifier(
        n_estimators=200, max_depth=3,
        learning_rate=0.05, subsample=0.7
    )
    base_models.append((domain, model, features))

โมเดลพื้นฐานแต่ละแบบจะกลายเป็นผู้เชี่ยวชาญในโดเมน โดยโมเดลโมเมนตัมจะเรียนรู้รูปแบบโมเมนตัมโดยปราศจากการรบกวนจากเสียงรบกวน และผู้เรียนเมตาจะเรียนรู้ว่าผู้เชี่ยวชาญคนใดที่จะไว้วางใจภายใต้เงื่อนไขใด ๆ

คำเตือนสองประการในข้อสุดท้ายนั้น ประการแรก การถ่วงน้ำหนักแบบมีเงื่อนไขของระบอบการปกครองคือปัญหาที่ได้รับการแก้ไขและเผยแพร่แล้ว — การตรวจจับระบอบการปกครองด้วย HMM ได้มาซึ่งระบอบการปกครองอย่างเหมาะสมผ่านทาง Forward/Viterbi/Baum-Welch และป้อนให้เป็นคุณลักษณะของวงดนตรีดาวน์สตรีม และ กลยุทธ์การรวมแบบไดนามิก ครอบคลุม การกลับตัวเฉลี่ยถ่วงน้ำหนักตามระบอบการปกครองเทียบกับโมเมนตัมพร้อมผลลัพธ์ที่รายงาน อย่าแทนที่พร็อกซีสัญญาณโมเมนตัมเฉพาะกิจสำหรับอย่างใดอย่างหนึ่ง ประการที่สอง การเลือกประสิทธิภาพในตัวตัวอย่างทำให้ผู้ชนะไม่รอด กลไกทั่วไปและการป้องกัน CSCV วัดใน ความน่าจะเป็นของ backtest overfitting การซ้อนเป็นตัวอย่างที่แคบกว่าของปัญหานั้น

สำหรับการถ่วงน้ำหนัก ส่งคืนสตรีม แทนการคาดการณ์แบบจำลอง อย่าหาค่าความแปรปรวนเฉลี่ยอีกครั้ง 12 อัลกอริธึมการเพิ่มประสิทธิภาพพอร์ตโฟลิโอเมื่อเปรียบเทียบ แข่ง HRP, HERC, GHRP, MHRP, Black-Litterman, NCO, MVO, ความเท่าเทียมกันของความเสี่ยงและน้ำหนักที่เท่ากันพร้อมผลลัพธ์ที่วัดได้และโค้ดโอเพ่นซอร์ส ทฤษฎีพอร์ตโฟลิโอของ Markowitz สำหรับการเข้ารหัสลับ มีการนำ SLSQP ไปใช้ด้วยความแปรปรวนเฉลี่ย และผลลัพธ์ 1/N-is-hard-to-beat ได้รับการทดสอบแล้วกับ HRP และ CVaR ใน ไปป์ไลน์พอร์ตโฟลิโอ HRP/CVaR

Turnover Netting: การทดสอบการเรียกร้องที่คุ้มค่า

นี่คือส่วนหนึ่งของอาร์กิวเมนต์ alpha-library ที่คลัสเตอร์ต้นทุนการดำเนินการของบล็อกนี้ไม่ครอบคลุมในปัจจุบัน

เมื่อ Alpha #4,721 พูดว่า "ซื้อ MSFT" และ Alpha #8,392 พูดว่า "ขาย MSFT" ในการปรับสมดุลเดียวกัน การซื้อขายเหล่านั้นจะข้ามกันภายใน เฉพาะตำแหน่งสุทธิเท่านั้นที่เข้าถึงตลาด คำกล่าวอ้างก็คือเมื่อมีสัญญาณเพียงพอ การยกเลิกมูลค่าการซื้อขายรวมที่ตั้งใจไว้ส่วนใหญ่ก่อนที่จะเกิดสเปรด ค่าธรรมเนียม หรือผลกระทบต่อตลาด ซึ่งหมายความว่าวงดนตรีมีราคาถูกกว่าการดำเนินงานมากกว่าผลรวมของส่วนประกอบ ไม่ใช่แค่มีเสถียรภาพมากขึ้นเท่านั้น

นี่เป็นกลไกที่แตกต่างจากสิ่งที่ cascade Strategy orchestration จัดการอยู่แล้ว Cascade แก้ไขข้อขัดแย้งที่ระดับ ช่อง: คู่เดียวกัน ทิศทางตรงกันข้ามเป็นสิ่งต้องห้ามและตัดสินด้วยคะแนน การขับไล่คู่ข้ามดำเนินการผ่านคิวลำดับความสำคัญ และบทความนี้พิสูจน์ให้เห็นอย่างชัดเจนว่า PnL ต่อกลยุทธ์ไม่สามารถสรุปได้ง่ายๆ เนื่องจากการทับซ้อนกันของเวลาและข้อจำกัดด้านเงินทุน การหักกลบเป็นเรื่องเกี่ยวกับ เลขคณิตตำแหน่งรวมต่อสุทธิ เพื่อลดปริมาณการซื้อขาย

การปลอมแปลงยังมีราคาถูก: คำนวณยอดรวมเทียบกับมูลค่าการซื้อขายสุทธิจากการเติมจริงเมื่อสัญญาณส่วนประกอบถูกรวมเข้าด้วยกัน จากนั้นให้กำหนดราคาทั้งสองผ่านกลไกต้นทุนที่มีอยู่ — ค่าธรรมเนียมและส่วนลดของผู้ทำ, การขาดแคลนการดำเนินการและ TCA และ ต้นทุนการเลื่อนหลุดของหน้า รุ่น

หมายเหตุเกี่ยวกับขนาด เนื่องจากเฟรมอัลฟ่าไลบรารีเชิญชวน รายงานของ WorldQuant ได้สร้างไลบรารีอัลฟ่าขนาดใหญ่มากและ 101 Formulaic Alphas บันทึกรูปร่างของสัญญาณแต่ละรายการ แต่การขุดอัลฟ่าในระดับอุตสาหกรรมก็เป็นเครื่องทดสอบหลายตัวที่ใหญ่ที่สุดเท่าที่จะจินตนาการได้ และจุดยืนของบล็อกนี้ก็ได้รับการแก้ไขแล้ว: การค้นหาขนาด KK จะต้องแฟบลงเมื่อเทียบกับความโชคดีที่คาดไว้ของการค้นหาขนาดนั้น The Deflated Sharpe Ratio แสดงตาราง 640 เซลล์ที่ทำลายการทดสอบนัยสำคัญที่ไร้เดียงสาไปแล้ว และ The Honest Negative แสดงการค้นหา ~37,000 การทดลอง ทำให้เกิดผู้ชนะ +16.35% จากตัวอย่างที่ยุบเป็น DSR 0.00. ขนาดไลบรารีไม่ใช่ข้อพิสูจน์ถึงความได้เปรียบ มันคือตัวส่วนที่คุณต้องจ่าย

นำมารวมกัน

Raw Data
  |
  v
Feature Engineering
  |
  v
Feature Subsets (partitioned by domain -> decorrelated errors)
  |
  +---> Base Model 1: RF on momentum features
  +---> Base Model 2: GBM on volatility features
  +---> Base Model 3: LSTM on price sequences
  +---> Base Model 4: Lasso on fundamental features
  +---> Base Model 5: XGBoost on microstructure features
  |
  v
Out-of-Fold Predictions (purged walk-forward)
  |
  v
Meta-Learner (Ridge)
  |
  v
Combined Signal -> Net Position -> Execution
  |
  v
DSR >= 0.95 and PBO <= 0.2 gate, or it does not ship

กล่องสุดท้ายไม่ใช่ของตกแต่ง ซ้อนๆ กัน KK รุ่นพื้นฐานเป็นขั้นตอนการเลือกขนาด KKและบทความทั้งมวลที่ไม่ยุบไม่สามารถป้องกันได้

ของทานเล่น

  1. ความแตกต่างของโครงสร้างมากกว่าการนับแบบจำลอง เงื่อนไขความแปรปรวนร่วมไม่ลดลงด้วย NN. การเพิ่มต้นไม้ที่มีความสัมพันธ์กันลำดับที่หกไม่ใช่การกระจายความเสี่ยง การเพิ่มคลาสโมเดลอื่นหรือโดเมนฟีเจอร์ที่ไม่เป็นสมาชิกร่วมคือ
  2. รายงานผล-NN วงดนตรี ไม่ใช่ประเด็น ตัวประมาณค่าห้าตัว ห้าคำตอบ บางครั้งห่างกันสองขนาด
  3. รักษา meta-learner ให้เป็นเส้นตรง ความซับซ้อนที่เลเยอร์การรวมกันมักจะเกินพอดีเสมอ และ L1 ก็เลือกแบบจำลองอัตโนมัติที่มีประโยชน์
  4. ไม่อยู่ในครึ่งหน้าหรือไม่มีอะไรเลย ผู้เรียนเมตาที่ได้รับการฝึกอบรมเกี่ยวกับการคาดการณ์ฐานในตัวอย่างจะเรียนรู้น้ำหนักที่ไม่ถูกต้องด้วยความมั่นใจสูง
  5. ยุบวงดนตรี การซ้อนคือการค้นหา ให้ราคาเหมือนอันหนึ่ง

อ่านเพิ่มเติม:

ข้อจำกัดความรับผิดชอบ: ข้อมูลที่ให้ไว้ในบทความนี้มีไว้เพื่อการศึกษาและให้ข้อมูลเท่านั้น และไม่ถือเป็นคำแนะนำทางการเงิน การลงทุน หรือการเทรด การเทรดสกุลเงินดิจิทัลมีความเสี่ยงสูงที่จะขาดทุน

ผู้เขียน

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

ก้าวนำหน้าตลาด

สมัครรับจดหมายข่าวของเราเพื่อรับข้อมูลเชิงลึกการเทรดด้วย AI เฉพาะ การวิเคราะห์ตลาด และการอัปเดตแพลตฟอร์ม

เราเคารพความเป็นส่วนตัวของคุณ ยกเลิกการสมัครได้ทุกเมื่อ