Qlib Localformer Setup for CSI 300 Signal Backtesting
Summary
This configuration describes a Qlib workflow for training a Localformer model on China A-share data and evaluating its predictions as a portfolio signal. It uses the CSI 300 universe and benchmark, an Alpha360 data handler, robust feature normalization, missing-value filling, and cross-sectional label ranking. The target is based on the relationship between future closing prices.
The dataset is divided into training, validation, and test periods, with portfolio analysis on the test period. The example applies a top-k dropout strategy that holds selected stocks and replaces some positions as rankings change. Its backtest settings specify account size, closing-price execution, transaction costs, and a price-limit threshold. The configuration provides a reproducible workflow outline, but no model results or performance evidence. Its conclusions would depend on data quality, implementation details, and assumptions such as execution at the close; the file alone does not establish that the strategy is profitable or robust.
Key ideas
- The workflow trains a Localformer model on Alpha360 features for the CSI 300 universe.
- Features are robustly normalized and missing feature values are filled.
- The label uses future closing prices, while training, validation, and test data occupy separate periods.
- Portfolio analysis uses a top-k dropout strategy with modeled transaction costs and price limits.
- The configuration supplies no results to assess predictive quality or real-world execution.
Tags
Full text
# workflow_config_localformer_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: LocalformerModel
module_path: qlib.contrib.model.pytorch_localformer
kwargs:
d_feat: 6
seed: 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.