"""Volatility-scaled short-horizon reversal alpha.""" import pandas as pd from pipeline.alpha.base import BaseAlpha from pipeline.alpha.registry import register_alpha @register_alpha class ReversalVolAlpha(BaseAlpha): """Reversal scaled by trailing volatility. The raw reversal ``-close.pct_change(lookback)`` is divided by the rolling standard deviation of daily returns over ``vol_window``, so the score favors oversold names whose move is large *relative* to their own volatility. """ name = "reversal_vol" def __init__(self, lookback: int = 5, vol_window: int = 20): self.lookback = lookback self.vol_window = vol_window def signal(self, close: pd.DataFrame) -> pd.DataFrame: reversal = -close.pct_change(self.lookback, fill_method=None) vol = close.pct_change(fill_method=None).rolling(self.vol_window).std() return reversal / vol