Skip to content
All library documents

Qlib LSTM Workflow for CSI 300 Stock Ranking

Code Qlib

Summary

This configuration defines a Qlib workflow that trains an LSTM on Alpha360 features to rank CSI 300 stocks. It normalizes feature data with robust z-scores, fills missing feature values, drops missing labels, and cross-sectionally ranks labels. The prediction target is based on the change between two future closing prices. Training, validation, and test periods are separated, with the backtest applied to the test segment.

Portfolio evaluation uses a top-k dropout strategy: it holds a ranked selection and replaces only some holdings as rankings change. The setup specifies a benchmark, account size, transaction costs, a trading limit threshold, and closing prices for execution. It also records signal analysis and portfolio analysis. This is an experiment specification rather than evidence of a successful strategy: it supplies no reported returns, comparison, or robustness tests. Results would depend on the underlying Chinese market data, implementation assumptions, and whether the configuration avoids look-ahead or other backtest biases.

Key ideas

  • The workflow trains an LSTM model using Alpha360 features to predict a short-horizon stock return.
  • Feature normalization, missing-value handling, and cross-sectional label ranking are part of the data pipeline.
  • The sample divides observations into training, validation, and out-of-sample test periods.
  • A top-k dropout portfolio strategy limits how many holdings change as model rankings update.
  • Transaction costs, a benchmark, and execution assumptions are included, but no performance results are provided.

Tags

Full text
# workflow_config_lstm_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: LSTM
        module_path: qlib.contrib.model.pytorch_lstm
        kwargs:
            d_feat: 6
            hidden_size: 64
            num_layers: 2
            dropout: 0.0
            n_epochs: 200
            lr: 1e-3
            early_stop: 20
            batch_size: 800
            metric: loss
            loss: mse
            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.