summaryrefslogtreecommitdiff
path: root/services/strategy-engine/strategies/indicators/volume.py
blob: d7c6471b086d0dc7bd65833e73bf96320e906ac9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
"""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()