Qlib GATs Alpha158 Configuration for CSI 300 Forecasting
Summary
This Qlib configuration sets up a time-series forecasting and portfolio backtest workflow for the CSI 300 universe, using the Shanghai-Shenzhen 300 index as its benchmark. The dataset uses Alpha158 features, applies robust feature normalization and missing-value filling, filters selected columns, and ranks labels cross-sectionally. The prediction target is a short-horizon close-to-close return. Training and validation use earlier date segments, while a later segment is reserved for testing.
The model is GATs with an LSTM base model and specified network, dropout, learning, and early-stopping settings. For portfolio analysis, a TopkDropout strategy holds a ranked set of names and limits turnover by dropping only some holdings at each rebalance. The backtest specifies capital, transaction costs, minimum fees, a benchmark, and a price-limit threshold. This is an experiment configuration rather than a report of findings: it provides no resulting metrics, and conclusions would depend on the data, target construction, feature processing, and execution assumptions.
Key ideas
- The workflow applies Qlib Alpha158 features to a CSI 300 stock universe and uses the Shanghai-Shenzhen 300 index as benchmark.
- Feature processing includes column filtering, robust normalization, and missing-value filling.
- The configured GATs model uses an LSTM base and predicts a short-horizon return target.
- A TopkDropout strategy combines ranked holdings with limited portfolio turnover.
- The configuration specifies backtest costs and price limits but reports no performance results.
Tags
Full text
# workflow_config_gats_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: GATs
module_path: qlib.contrib.model.pytorch_gats_ts
kwargs:
d_feat: 20
hidden_size: 64
num_layers: 2
dropout: 0.7
n_epochs: 200
lr: 1e-4
early_stop: 10
metric: loss
loss: mse
base_model: LSTM
model_path: "benchmarks/LSTM/csi300_lstm_ts.pkl"
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.