Skip to content
All library documents

Qlib Double Ensemble for CSI 300 Stock Ranking

Code Qlib

Summary

This Qlib configuration defines a Chinese equity research workflow using the CSI 300 universe and Alpha158 features. It trains a double ensemble of gradient-boosted models, with both sample reweighting and feature selection enabled, then evaluates signals through a top-k dropout portfolio strategy. The portfolio holds up to 50 stocks and replaces five positions as signals change.

The configuration separates training, validation, and test periods, with the portfolio backtest beginning in 2017 and using the Shanghai-listed CSI 300 index as its benchmark. It specifies closing-price execution, transaction costs, and a limit threshold. These settings make the experiment reproducible in outline, but the document contains no reported returns, comparison against alternatives, or robustness analysis. Results depend on the specified data, model settings, and backtest assumptions; the configuration alone does not establish that the strategy is profitable.

Key ideas

  • The workflow trains a double ensemble using gradient-boosted trees and Alpha158 features.
  • The model enables both sample reweighting and feature selection.
  • A top-k dropout strategy ranks CSI 300 stocks and replaces a subset of holdings over time.
  • The configuration specifies separate training, validation, and test periods and includes trading costs.
  • No performance results or robustness checks are supplied.

Tags

Full text
# workflow_config_doubleensemble_Alpha158.yaml


```yaml
qlib_init:
    provider_uri: "~/.qlib/qlib_data/cn_data"
    region: cn
market: &market csi300
benchmark: &benchmark SH000300
data_handler_config: &data_handler_config
    start_time: 2008-01-01
    end_time: 2020-08-01
    fit_start_time: 2008-01-01
    fit_end_time: 2014-12-31
    instruments: *market
port_analysis_config: &port_analysis_config
    strategy:
        class: TopkDropoutStrategy
        module_path: qlib.contrib.strategy
        kwargs:
            signal: <PRED>
            topk: 50
            n_drop: 5
    backtest:
        start_time: 2017-01-01
        end_time: 2020-08-01
        account: 100000000
        benchmark: *benchmark
        exchange_kwargs:
            limit_threshold: 0.095
            deal_price: close
            open_cost: 0.0005
            close_cost: 0.0015
            min_cost: 5
task:
    model:
        class: DEnsembleModel
        module_path: qlib.contrib.model.double_ensemble
        kwargs:
            base_model: "gbm"
            loss: mse
            num_models: 3
            enable_sr: True
            enable_fs: True
            alpha1: 1
            alpha2: 1
            bins_sr: 10
            bins_fs: 5
            decay: 0.5
            sample_ratios:
                - 0.8
                - 0.7
                - 0.6
                - 0.5
                - 0.4
            sub_weights:
                - 1
                - 1
                - 1
            epochs: 28
            colsample_bytree: 0.8879
            learning_rate: 0.2
            subsample: 0.8789
            lambda_l1: 205.6999
            lambda_l2: 580.9768
            max_depth: 8
            num_leaves: 210
            num_threads: 20
            verbosity: -1
    dataset:
        class: DatasetH
        module_path: qlib.data.dataset
        kwargs:
            handler:
                class: Alpha158
                module_path: qlib.contrib.data.handler
                kwargs: *data_handler_config
            segments:
                train: [2008-01-01, 2014-12-31]
                valid: [2015-01-01, 2016-12-31]
                test: [2017-01-01, 2020-08-01]
    record: 
        - class: SignalRecord
          module_path: qlib.workflow.record_temp
          kwargs: 
            model: <MODEL>
            dataset: <DATASET>
        - class: SigAnaRecord
          module_path: qlib.workflow.record_temp
          kwargs: 
            ana_long_short: False
            ann_scaler: 252
        - class: PortAnaRecord
          module_path: qlib.workflow.record_temp
          kwargs: 
            config: *port_analysis_config

```

Shown in full with attribution under the source's licence. Licence: MIT

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.