GRU Alpha158 Workflow for CSI 300 Stock Ranking
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.