Skip to content
All library documents

Training a Neural Alpha360 Model for CSI 300 Stock Selection

Code Qlib

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.