Skip to content
All library documents

Qlib GATs Configuration for CSI 300 Return Prediction and Portfolio Backtesting

Code Qlib

Summary

This configuration describes a Qlib experiment using a graph attention model, GATs, with an LSTM base model to predict near-term returns for CSI 300 constituents. It sets Chinese market data, defines a close-to-close forward return label, normalizes features and cross-sectionally ranks labels, and splits observations into training, validation, and test periods. The model settings include dropout, a learning rate, an epoch limit, and early stopping.

For portfolio evaluation, the configuration uses a top-k dropout strategy that holds 50 names and replaces up to five, with closing prices, transaction costs, a minimum cost, and a benchmark. It also specifies signal, long-short analysis, and portfolio analysis records. This is an experiment recipe, not a report of findings: it contains no metrics, comparison to alternatives, or evidence that the predictions generalize. Results will depend on the underlying data, Qlib implementation details, and whether the configured costs and trade assumptions reflect actual execution.

Key ideas

  • The setup trains a GATs model with an LSTM base on CSI 300 data to predict a forward close return.
  • Feature normalization, missing-value filling, and cross-sectional label ranking are specified in the data handler.
  • Training, validation, and test periods are separated, with portfolio backtesting on the test interval.
  • The portfolio uses a top-k dropout strategy with transaction costs and a CSI 300 benchmark.
  • The configuration supplies no predictive or portfolio performance results.

Tags

Full text
# workflow_config_gats_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: GATs
        module_path: qlib.contrib.model.pytorch_gats
        kwargs:
            d_feat: 6
            hidden_size: 64
            num_layers: 2
            dropout: 0.7
            n_epochs: 200
            lr: 1e-4
            early_stop: 20
            metric: loss
            loss: mse
            base_model: LSTM
            model_path: "benchmarks/LSTM/model_lstm_csi300.pkl"
            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.