Skip to content
All library documents

Qlib TCN Workflow for CSI 300 Alpha158 Stock Selection

Code Qlib

Summary

This configuration defines a Qlib workflow for predicting short-horizon CSI 300 stock returns with a temporal convolutional network (TCN). It uses Alpha158 features, filters a specified set of feature columns, applies robust cross-sectional normalization, and fills missing feature values. The label is based on the change from the next close to the close two trading days ahead. Training, validation, and test periods are separated, with the test segment covering 2017 through mid-2020.

The workflow records signal analysis and a portfolio backtest. Its portfolio strategy holds the top 50 ranked stocks and replaces a limited number of holdings at a time; the configuration also specifies a benchmark, trading costs, a price-limit assumption, and closing-price execution. These details make the experiment more reproducible, but the document contains no model scores, returns, or comparison with a baseline. Results would depend on the data, framework implementation, assumptions, and possible issues such as survivorship or point-in-time data handling.

Key ideas

  • The workflow trains a TCN on Alpha158 features for CSI 300 stocks.
  • The label measures a short forward close-to-close return, with distinct training, validation, and test segments.
  • The backtest uses a top-ranked stock portfolio with gradual holding replacement and specified trading assumptions.
  • The configuration describes an experiment but provides no evidence of predictive or portfolio performance.

Tags

Full text
# workflow_config_tcn_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: TCN
        module_path: qlib.contrib.model.pytorch_tcn_ts
        kwargs:
            d_feat: 20
            num_layers: 5
            n_chans: 32
            kernel_size: 7
            dropout: 0.5
            n_epochs: 200
            lr: 1e-4
            early_stop: 20
            batch_size: 2000
            metric: loss
            loss: mse
            optimizer: adam
            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.