Files
book-tac/tac-qlib/workflows/tune_run1_wider_5d.yaml
T

130 lines
4.5 KiB
YAML

# -----------------------------------------------------------------------------
# Tune run 1: wider, longer-horizon, de-duplicated universe.
#
# Baseline (exp 1 / run f29f5446): IC 0.071 / ICIR 0.17, Rank IC ~0.014;
# strategy +4.9% ann (raw) vs benchmark ~+89% ann; excess return w/ cost
# -0.94 ann, IR -2.23, excess max drawdown -18.9%. topk=2 with 24 trades over
# 27 days on a universe of correlated ETFs + leveraged hedges (VXX/USO/SLV)
# produced high turnover and a portfolio that trailed AAPL badly.
#
# Changes:
# - universe: drop leveraged/noisy names (VXX, USO, SLV, BIL) and near-
# duplicate index baskets (GPIQ, QQQE, KTEC); keep 10 liquid core names.
# - label: 5-day forward return (Ref($close,-6)/Ref($close,-1)-1) to cut
# single-day noise and match the intended holding horizon.
# - topk 2 -> 5, n_drop 1: more diversification, lower turnover per name.
# - benchmark AAPL -> QQQ (a real index ETF the universe tracks).
# - model: learning_rate 0.03, 300 estimators (slower, deeper fit).
#
# Trigger:
# rd_run_workflow config_path=tac-qlib/workflows/tune_run1_wider_5d.yaml \
# experiment_name=tac-rd-tune
# -----------------------------------------------------------------------------
{%- set LAKE = TAC_LAKE_DIR %}
qlib_init:
provider_uri: "{{ LAKE }}"
region: us
expression_cache: null
dataset_cache: null
calendar_provider:
class: tac_qlib.data.providers.LakeCalendarProvider
kwargs:
lake_root: "{{ LAKE }}"
market: US
instrument_provider:
class: tac_qlib.data.providers.LakeInstrumentProvider
kwargs:
lake_root: "{{ LAKE }}"
market: US
markets: {}
feature_provider:
class: tac_qlib.data.providers.LakeFeatureProvider
kwargs:
lake_root: "{{ LAKE }}"
market: US
exp_manager:
class: MLflowExpManager
module_path: qlib.workflow.expm
kwargs:
uri: "sqlite:///mlruns.db"
default_exp_name: "tac-rd-tune"
task:
model:
class: LGBModel
module_path: qlib.contrib.model.gbdt
kwargs:
loss: mse
learning_rate: 0.03
num_leaves: 15
n_estimators: 300
colsample_bytree: 0.8
subsample: 0.8
subsample_freq: 1
reg_alpha: 0.01
reg_lambda: 0.01
seed: 2026
dataset:
class: DatasetH
module_path: qlib.data.dataset
kwargs:
handler:
class: TACHandler
module_path: tac_qlib.contrib.data.handler
kwargs:
instruments: AAPL,MSFT,TSLA,QQQ,IVV,SMH,TLT,IBIT,MCHI,AIQ
start_time: 2000-01-03
end_time: 2026-08-06
fit_start_time: 2026-03-01
fit_end_time: 2026-05-31
freq: day
lake_root: "{{ LAKE }}"
market: US
label: "Ref($close,-6)/Ref($close,-1)-1"
segments:
train: [2026-03-01, 2026-05-31]
valid: [2026-06-01, 2026-06-30]
test: [2026-07-01, 2026-08-06]
record:
- class: SignalRecord
module_path: qlib.workflow.record_temp
kwargs: {}
- class: SigAnaRecord
module_path: qlib.workflow.record_temp
kwargs:
ana_long_short: true
ann_scaler: 252
- class: PortAnaRecord
module_path: qlib.workflow.record_temp
kwargs:
config:
strategy:
class: TopkDropoutStrategy
module_path: qlib.contrib.strategy
kwargs:
signal: "<PRED>"
topk: 5
n_drop: 1
only_tradable: true
risk_degree: 0.95
backtest:
start_time: 2026-07-01
end_time: 2026-08-06
account: 1000000
benchmark: QQQ
exchange_kwargs:
codes: AAPL,MSFT,TSLA,QQQ,IVV,SMH,TLT,IBIT,MCHI,AIQ
deal_price: $close
freq: day
open_cost: 0.0005
close_cost: 0.0015
min_cost: 5.0
risk_analysis_freq: 1d