quant-concept-drift

Quantitative Financeqlibrigorous codebase

Description

Concept Drift Adaptation in Stock Prediction on CSI300

Objective

Design and implement a stock prediction model that handles concept drift and temporal distribution shift in CSI300 stocks. Your code goes in custom_model.py. Three reference implementations (TRA, AdaRNN, LightGBM) are provided as read-only.

Evaluation

Signal quality: IC, ICIR, Rank IC. Portfolio (TopkDropout, top 50, drop 5): Annualized Return, Max Drawdown, Information Ratio. Automatic via qlib's workflow.

Evaluation uses three fixed temporal regimes on the same CSI300 universe:

  • csi300: long-horizon split ending in the 2017-2020 regime
  • csi300_shifted: shifted split with a 2016-2018 test regime
  • csi300_recent (hidden): the most recent 2019-2020 regime

This task is about temporal drift adaptation, not cross-universe transfer.

Workflow Configuration

workflow_config.yaml lines 13-26 and 32-45 are editable. This covers the model plus dataset adapter/processor configuration needed by methods like TRA. Instruments, date ranges, train/valid/test splits, and evaluation settings are fixed.

Code

custom_model.py
EditableRead-only
1# Custom stock prediction model for MLS-Bench (concept drift adaptation)
2#
3# EDITABLE section: CustomModel class with fit() and predict() methods.
4# FIXED sections: imports below.
5import numpy as np
6import pandas as pd
7import torch
8import torch.nn as nn
9import torch.nn.functional as F
10from qlib.model.base import Model
11from qlib.data.dataset import DatasetH
12from qlib.data.dataset.handler import DataHandlerLP
13
14DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
15
workflow_config.yaml
EditableRead-only
1# Qlib workflow configuration for CSI300 concept drift adaptation benchmark.
2# Used by run_workflow.py — default Alpha158/CSI300/DatasetH pipeline.
3# Alpha158: 158 engineered features per stock per day.
4
5qlib_init:
6 provider_uri: "~/.qlib/qlib_data/cn_data"
7 region: cn
8
9sys:
10 rel_path:
11 - "." # So custom_model.py is importable via module_path
12
13task:
14 model:
15 class: CustomModel

Additional context files (read-only):

  • qlib/qlib/model/base.py

Results

ModelTypeic csi300 shifted icir csi300 shifted rank ic csi300 shifted rank icir csi300 shifted annualized return csi300 shifted max drawdown csi300 shifted information ratio csi300 shifted ic csi300 recent icir csi300 recent rank ic csi300 recent rank icir csi300 recent annualized return csi300 recent max drawdown csi300 recent information ratio csi300 recent ic csi300 icir csi300 rank ic csi300 rank icir csi300 annualized return csi300 max drawdown csi300 information ratio csi300
adarnnbaseline0.0450.4390.0450.4380.138-0.0811.8150.0170.1540.0280.2530.021-0.0650.2830.0360.3190.0400.3650.050-0.1040.673
adarnnbaseline0.0570.5160.0590.5190.122-0.0811.4820.0170.1690.0280.2740.000-0.0830.0040.0390.3100.0500.3920.076-0.0871.195
adarnnbaseline0.0560.4500.0610.4830.151-0.1481.6910.0260.2070.0400.3290.084-0.0491.1180.0400.3310.0500.4130.097-0.0821.399
lgbmbaseline0.0550.4300.0640.5100.103-0.0791.2990.0250.1850.0440.3220.081-0.0511.1040.0460.3640.0570.4660.092-0.0581.347
lgbmbaseline0.0550.4300.0640.5100.103-0.0791.2990.0250.1850.0440.3220.081-0.0511.1040.0460.3640.0570.4660.092-0.0581.347
lgbmbaseline0.0550.4300.0640.5100.103-0.0791.2990.0250.1850.0440.3220.081-0.0511.1040.0460.3640.0570.4660.092-0.0581.347
lgbmbaseline0.0550.4300.0640.5100.103-0.0791.2990.0250.1850.0440.3220.081-0.0511.1040.0460.3640.0570.4660.092-0.0581.347
trabaseline0.0510.4280.0550.4590.122-0.0841.5870.0240.1920.0400.3300.033-0.0710.4800.0420.3350.0500.4230.064-0.1001.008
trabaseline0.0510.4280.0550.4590.122-0.0841.5870.0240.1920.0400.3300.033-0.0710.4800.0420.3350.0500.4230.064-0.1001.008
trabaseline0.0510.4280.0550.4590.122-0.0841.5870.0240.1920.0400.3300.033-0.0710.4800.0420.3350.0500.4230.064-0.1001.008
anthropic/claude-opus-4.6vanilla0.0540.4080.0650.5000.157-0.0881.8410.0250.1750.0460.3240.048-0.0580.6550.0430.3230.0560.4260.102-0.0551.420
google/gemini-3.1-pro-previewvanilla0.0470.3260.0630.4270.149-0.0821.7640.0160.1050.0370.238-0.016-0.094-0.2190.0410.2920.0550.3840.008-0.1190.113
gpt-5.4-provanilla0.0200.1180.0340.190-0.050-0.354-0.4570.0190.1310.0360.2650.031-0.0760.4020.0120.0750.0290.171-0.086-0.361-0.823
anthropic/claude-opus-4.6agent0.0540.4000.0660.4970.189-0.0862.2100.0240.1680.0460.3220.051-0.0520.6990.0430.3190.0550.4220.060-0.1140.843
google/gemini-3.1-pro-previewagent0.0470.3260.0630.4270.149-0.0821.7640.0160.1050.0370.238-0.016-0.094-0.2190.0410.2920.0550.3840.008-0.1190.113
gpt-5.4-proagent0.0500.3440.0670.5010.167-0.0402.1530.0200.1480.0440.313-0.030-0.121-0.4060.0290.1980.0510.368-0.011-0.134-0.149

Agent Conversations