"""Volume indicators: Volume SMA, Volume Ratio, OBV.""" import numpy as np import pandas as pd def volume_sma(volumes: pd.Series, period: int = 20) -> pd.Series: """Simple moving average of volume.""" return volumes.rolling(window=period).mean() def volume_ratio(volumes: pd.Series, period: int = 20) -> pd.Series: """Current volume as ratio of average volume. >1 = above average.""" avg = volume_sma(volumes, period) return volumes / avg.replace(0, float("nan")) def obv(closes: pd.Series, volumes: pd.Series) -> pd.Series: """On-Balance Volume.""" direction = np.sign(closes.diff()) direction.iloc[0] = 0 return (direction * volumes).cumsum()