Qlib GATs Configuration for CSI 300 Return Prediction and Portfolio Backtesting
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.