KRNN Alpha360 Configuration for CSI 300 Stock Ranking
Summary
This configuration describes a Qlib workflow for training a KRNN model on China’s CSI 300 universe with Alpha360 features. It sets a historical data range, uses robust feature normalization and cross-sectional label ranking, and defines a two-day forward close-to-close return as the prediction target. The training, validation, and test segments are separated chronologically, with training ending before the validation and test periods.
For portfolio evaluation, model signals feed a top-50 strategy that replaces up to five holdings at a time. The backtest specifies the CSI 300 benchmark, closing-price execution, transaction costs, a minimum fee, and a price-limit threshold. The file also configures signal analysis and portfolio analysis records. It provides an experimental setup rather than reported findings: there are no performance results, robustness checks, or discussion of survivorship bias, data quality, or whether the chosen costs and execution assumptions reflect actual trading conditions.
Key ideas
- The workflow trains a KRNN on Alpha360 features for CSI 300 constituents.
- Feature values are robustly normalized, while labels are ranked cross-sectionally.
- The prediction target is a forward return based on closing prices two sessions apart.
- Training, validation, and test data are assigned to consecutive historical periods.
- Backtesting uses a top-50 portfolio strategy with limited turnover and explicit trading costs.
Tags
Full text
# workflow_config_krnn_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: KRNN
module_path: qlib.contrib.model.pytorch_krnn
kwargs:
fea_dim: 6
cnn_dim: 8
cnn_kernel_size: 3
rnn_dim: 8
rnn_dups: 2
rnn_layers: 2
n_epochs: 200
lr: 0.001
early_stop: 20
batch_size: 2000
metric: loss
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.