Skip to content
All library documents

Qlib Double-Ensemble Workflow for CSI 300 Stock Ranking

Code Qlib

Summary

This Qlib configuration describes a machine-learning workflow for ranking CSI 300 stocks. It uses the Alpha360 data handler and a double-ensemble model built from gradient-boosted trees. The configured label is a forward close-price return, while the learning pipeline drops missing labels and cross-sectionally rank-normalizes them. Data is divided into training, validation, and test periods, with the portfolio backtest beginning in the test period.

For portfolio construction, the workflow holds the top 50 signals and allows five holdings to be dropped as rankings change. It specifies the CSI 300 index as benchmark, closing-price execution, transaction costs, and a price-limit threshold. Signal analysis and portfolio analysis records are configured, but the document contains no resulting metrics or conclusions. This is an experiment specification rather than evidence of profitability; results would depend on data quality, assumptions about execution and costs, and the model’s out-of-sample behavior.

Key ideas

  • The workflow uses Qlib’s Alpha360 handler and a double-ensemble gradient-boosted model.
  • Its target is a forward close-price return, with labels rank-normalized across stocks.
  • The dataset is divided into training, validation, and test segments.
  • A top-ranked portfolio uses a dropout rule to adjust holdings as signals change.
  • The configuration specifies benchmark, execution, and transaction-cost assumptions but reports no performance results.

Tags

Full text
# workflow_config_doubleensemble_Alpha360.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
    infer_processors: []
    learn_processors:
        - class: DropnaLabel
        - class: CSRankNorm
          kwargs:
              fields_group: label
    label: ["Ref($close, -2) / Ref($close, -1) - 1"]
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: 136
            colsample_bytree: 0.8879
            learning_rate: 0.0421
            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: Alpha360
                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.