Skip to content
All library documents

Qlib Sandwich Model Workflow for CSI 300 Stock Ranking

Code Qlib

Summary

This Qlib configuration defines a supervised stock-ranking experiment using the CSI 300 universe and the Sandwich neural model. Its data handler applies robust feature normalization with outlier clipping, fills missing feature values, drops missing labels, and cross-sectionally rank-normalizes labels. The target is a forward close-to-close return over the next two reference points. The dataset is divided into training, validation, and test periods, with the model trained on the earliest segment and evaluated later.

For portfolio analysis, predicted scores feed a top-k dropout strategy that holds 50 names and replaces up to 5 positions at a time. The configuration specifies a Shanghai Composite benchmark, a 2017–2020 backtest window, close-price execution, transaction costs, and a price-limit threshold. It also configures signal and portfolio analysis records. This is an experiment specification, not a report of results: it gives no returns, risk statistics, or comparison with alternatives. The setup depends on the configured Chinese market data and Qlib components, and the stated backtest assumptions do not establish live tradability or robustness.

Key ideas

  • The workflow uses Qlib’s Alpha360 handler and the CSI 300 universe to construct a stock prediction task.
  • Features receive robust normalization and missing-value filling, while labels are rank-normalized across stocks.
  • The target measures a forward close-to-close return, and the data is split into chronological train, validation, and test segments.
  • Predictions are evaluated with a top-k dropout portfolio strategy using a benchmark, close-price execution, and specified costs.
  • The configuration describes an experiment but reports no performance results or evidence of live robustness.

Tags

Full text
# workflow_config_sandwich_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:
        - class: RobustZScoreNorm
          kwargs:
              fields_group: feature
              clip_outlier: true
        - class: Fillna
          kwargs:
              fields_group: feature
    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: Sandwich
        module_path: qlib.contrib.model.pytorch_sandwich
        kwargs:
            fea_dim: 6
            cnn_dim_1: 16
            cnn_dim_2: 16
            cnn_kernel_size: 3
            rnn_dim_1: 8
            rnn_dim_2: 8
            rnn_dups: 2
            rnn_layers: 2
            n_epochs: 200
            lr: 0.001
            early_stop: 20
            batch_size: 2000
            metric: loss
            GPU: 0
    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.