fix: preserve NaNs in cross-sectional ranks
This commit is contained in:
@@ -46,9 +46,13 @@ class MomentumQualityStrategy(Strategy):
|
||||
inv_dd = rolling_max_dd(data, self.quality_window)
|
||||
|
||||
# --- Cross-sectional ranking ---
|
||||
mom_rank = momentum.rank(axis=1, pct=True, na_option="bottom")
|
||||
con_rank = consistency.rank(axis=1, pct=True, na_option="bottom")
|
||||
dd_rank = inv_dd.rank(axis=1, pct=True, na_option="bottom")
|
||||
# na_option="keep" so NaN stocks stay NaN in the composite. With
|
||||
# "bottom" + default ascending=True, NaN entries receive pct=1.0 and
|
||||
# the additive composite ends up maximal for NaN rows, silently
|
||||
# selecting pre-IPO / delisted names as "top".
|
||||
mom_rank = momentum.rank(axis=1, pct=True, na_option="keep")
|
||||
con_rank = consistency.rank(axis=1, pct=True, na_option="keep")
|
||||
dd_rank = inv_dd.rank(axis=1, pct=True, na_option="keep")
|
||||
|
||||
# Composite: momentum 50%, consistency 25%, drawdown 25%
|
||||
scores = 0.50 * mom_rank + 0.25 * con_rank + 0.25 * dd_rank
|
||||
|
||||
Reference in New Issue
Block a user