TopkDropoutStrategy ignores get_risk_degree() for position sizing
I maintainer di solito rispondono entro 3 giorni
@zhaow-de ci sta già lavorando.
Dal 21/6/2026.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 78/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Tranquilla
- Stack tecnologico
- python
- Ambito
- fintech-quant
Direzione di ricerca
Leggi qlib/contrib/strategy/signal_strategy.py, in particolare TopkDropoutStrategy.generate_trade_decision intorno alla riga 266 e la documentazione di get_risk_degree() vicino alla riga 69. Confronta il relativo percorso di sizing con WeightStrategyBase intorno alla riga 365, quindi verifica che un getter sovrascritto influenzi il sizing degli acquisti, mentre il comportamento esistente della strategia rimane invariato.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
🐛 Bug Description
get_risk_degree() is documented as the dynamic market-timing hook ("Dynamically risk_degree will result in Market timing.", qlib/contrib/strategy/signal_strategy.py:69). But TopkDropoutStrategy.generate_trade_decision sizes new buys with the raw attribute self.risk_degree, not the getter:
# qlib/contrib/strategy/signal_strategy.py:266
value = cash * self.risk_degree / len(buy) if len(buy) > 0 else 0
It is the only use of risk_degree in TopkDropoutStrategy, and it bypasses get_risk_degree(). So a subclass that overrides get_risk_degree() to return a time-varying multiplier (the documented way to implement market timing) has zero effect on a TopkDropout book — the override is never called. (By contrast, WeightStrategyBase at line 365 and its subclass EnhancedIndexingStrategy at line 482 do call self.get_risk_degree(...), so the inconsistency is within the same module.)
To Reproduce
- Subclass
TopkDropoutStrategyand overrideget_risk_degree()to return, say,0.0on some dates (a regime gate to cash) andself.risk_degreeotherwise. - Backtest it vs. the un-subclassed
TopkDropoutStrategyon the same signal. - The two produce identical trades/returns — the overridden
get_risk_degree()is never consulted for buy sizing.
Expected Behavior
TopkDropoutStrategy should size buys with self.get_risk_degree(trade_step) (as WeightStrategyBase does), so that overriding get_risk_degree() actually enables market timing as documented:
value = cash * self.get_risk_degree(trade_step) / len(buy) if len(buy) > 0 else 0
Environment
- Qlib version: 0.9.7 (
qlib/contrib/strategy/signal_strategy.py(TopkDropoutStrategy.generate_trade_decision, line ~266) - Python version: 3.12
Additional context
Discovered while building a BTC-trend regime overlay (RegimeGatedTopkStrategy(TopkDropoutStrategy)) that gates gross exposure via get_risk_degree(). The overlay had no effect on backtests until we worked around it by pushing the gated value onto self.risk_degree per step before delegating to super().generate_trade_decision(). A two-line fix in TopkDropoutStrategy (use the getter) would remove the need for the workaround.
- Lingua principale
- Python
- Stelle
- 49.5k
- Fork
- 7.8k
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Ha un modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di microsoft/qlib
-
StructuredCovEstimator crashes for one factor and uses inconsistent residual varianceForse già presa @Divyansh151005 l’ha presa 1 giorno fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
microsoft/qlib#2377 · 1 commento ·
I maintainer di solito rispondono entro 3 giorni
-
collect_info.py does not start: pkg_resources is gone from setuptools 82Forse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
microsoft/qlib#2354 · 1 commento ·
I maintainer di solito rispondono entro 3 giorni
-
IdxMax and IdxMin return the position of NaN instead of the extreme valueForse già presa @bozarnr l’ha presa 25 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
microsoft/qlib#2352 · 4 commenti ·
I maintainer di solito rispondono entro 3 giorni
-
Bug: Rsquare(N=0) expanding path leaks inf/garbage on near-constant windows (rolling path is guarded)Forse già presa @DogInfantry l’ha presa 101 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
microsoft/qlib#2297 · 4 commenti ·
I maintainer di solito rispondono entro 3 giorni
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 78/100
microsoft/qlib#2198 · 1 commento ·
I maintainer di solito rispondono entro 3 giorni
Tutte le issue di microsoft/qlib
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 77/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 67/100
webrecorder/warcio#209 ·
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
Jeffy123-zhu/logspecter#20 ·
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
I maintainer di solito rispondono entro 1 giorno