Skip to content
All library documents

GRU Alpha158 Workflow for CSI 300 Stock Ranking

Code Qlib

Summary

This configuration describes a Qlib workflow that trains a gated recurrent unit (GRU) model on Alpha158 features to rank CSI 300 stocks. It uses 20-step time-series samples, robust feature normalization, missing-value filling, and cross-sectional label ranking. The label is based on the change between two future daily closes. Training, validation, and test periods are separated, and the configuration records signal analysis and portfolio backtest results.

The portfolio strategy holds up to 50 names and replaces up to five holdings as signals change. The backtest specifies a CSI 300 benchmark, close-price dealing, transaction costs, and a price-limit threshold. The document provides setup choices rather than reported performance, so it does not establish that the model is profitable or robust. Its stated market, sample periods, feature selection, and cost assumptions limit how broadly results could apply; the configuration also does not describe additional out-of-sample validation or sensitivity analysis.

Key ideas

  • The workflow trains a GRU on 20-step sequences of selected Alpha158 features for CSI 300 stocks.
  • Feature values are robustly normalized and filled when missing, while labels receive cross-sectional rank normalization.
  • The model predicts a short-horizon close-to-close return defined using future closing prices.
  • The portfolio strategy targets 50 holdings and allows five positions to be dropped as rankings change.
  • The configuration defines transaction costs and a benchmark, but provides no backtest outcomes.

Tags

Full text
# workflow_config_gru_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
    infer_processors:
        - class: FilterCol
          kwargs:
              fields_group: feature
              col_list: ["RESI5", "WVMA5", "RSQR5", "KLEN", "RSQR10", "CORR5", "CORD5", "CORR10", 
                            "ROC60", "RESI10", "VSTD5", "RSQR60", "CORR60", "WVMA60", "STD5", 
                            "RSQR20", "CORD60", "CORD10", "CORR20", "KLOW"
                        ]
        - 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: GRU
        module_path: qlib.contrib.model.pytorch_gru_ts
        kwargs:
            d_feat: 20
            hidden_size: 64
            num_layers: 2
            dropout: 0.0
            n_epochs: 200
            lr: 2e-4
            early_stop: 10
            batch_size: 800
            metric: loss
            loss: mse
            n_jobs: 20
            GPU: 0
    dataset:
        class: TSDatasetH
        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]
            step_len: 20
    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.