Training a Neural Alpha360 Model for CSI 300 Stock Selection
Summary
This configuration describes a Qlib workflow for training a PyTorch feedforward neural network on China’s CSI 300 universe. It uses Alpha360 features, robust feature normalization, missing-value filling, and cross-sectional rank normalization of labels. The target is based on the relative change between future closing prices. Training, validation, and test periods are separated, with the fitting interval confined to the training years.
The model is evaluated through signal analysis and a long-only top-k dropout portfolio strategy. The backtest specifies a CSI 300 benchmark, account value, closing-price execution, transaction costs, and a price-limit threshold. These settings make the example useful for understanding how model training and portfolio simulation are wired together. The document provides configuration parameters, not performance results; it does not establish that the strategy is profitable or address issues such as survivorship bias, data quality, or sensitivity to parameter choices.
Key ideas
- The workflow trains a neural network using Alpha360 features for CSI 300 stocks.
- Feature normalization and missing-value handling are specified in the data handler.
- The data is divided into training, validation, and test periods.
- Portfolio analysis uses a top-k strategy that can retain holdings while dropping selected positions.
- The configuration defines costs and execution assumptions but supplies no backtest results.
Tags
Full text
# workflow_config_mlp_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: DNNModelPytorch
module_path: qlib.contrib.model.pytorch_nn
kwargs:
loss: mse
lr: 0.002
optimizer: adam
max_steps: 8000
batch_size: 4096
GPU: 0
pt_model_kwargs:
input_dim: 360
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.