Qlib LSTM Workflow for CSI 300 Stock Ranking
Summary
This configuration defines a Qlib workflow that trains an LSTM on Alpha360 features to rank CSI 300 stocks. It normalizes feature data with robust z-scores, fills missing feature values, drops missing labels, and cross-sectionally ranks labels. The prediction target is based on the change between two future closing prices. Training, validation, and test periods are separated, with the backtest applied to the test segment.
Portfolio evaluation uses a top-k dropout strategy: it holds a ranked selection and replaces only some holdings as rankings change. The setup specifies a benchmark, account size, transaction costs, a trading limit threshold, and closing prices for execution. It also records signal analysis and portfolio analysis. This is an experiment specification rather than evidence of a successful strategy: it supplies no reported returns, comparison, or robustness tests. Results would depend on the underlying Chinese market data, implementation assumptions, and whether the configuration avoids look-ahead or other backtest biases.
Key ideas
- The workflow trains an LSTM model using Alpha360 features to predict a short-horizon stock return.
- Feature normalization, missing-value handling, and cross-sectional label ranking are part of the data pipeline.
- The sample divides observations into training, validation, and out-of-sample test periods.
- A top-k dropout portfolio strategy limits how many holdings change as model rankings update.
- Transaction costs, a benchmark, and execution assumptions are included, but no performance results are provided.
Tags
Full text
# workflow_config_lstm_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: LSTM
module_path: qlib.contrib.model.pytorch_lstm
kwargs:
d_feat: 6
hidden_size: 64
num_layers: 2
dropout: 0.0
n_epochs: 200
lr: 1e-3
early_stop: 20
batch_size: 800
metric: loss
loss: mse
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.