"""20일 모멘텀.""" import pandas as pd from .base import ScoreNode, percentile_rank class Momentum20(ScoreNode): name = "momentum" label = "20일 모멘텀" default_params = {"window_days": 20} param_schema = { "type": "object", "properties": { "window_days": {"type": "integer", "minimum": 5, "maximum": 120, "default": 20} }, } def compute(self, ctx, params: dict) -> pd.Series: window = int(params.get("window_days", 20)) prices = ctx.prices if prices.empty: return pd.Series(dtype=float) ordered = prices.sort_values("date") last = ordered.groupby("ticker").tail(window + 1) def _ret(s): if len(s) < window + 1: return float("nan") return s.iloc[-1] / s.iloc[0] - 1 raw = last.groupby("ticker")["close"].apply(_ret) return percentile_rank(raw).fillna(50.0)