diff options
| author | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2026-04-01 18:37:11 +0900 |
|---|---|---|
| committer | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2026-04-01 18:37:11 +0900 |
| commit | 8b0cf4e574390738ee33f7ff334dd5f5109b7819 (patch) | |
| tree | 371f4d99581e5aad26658a2ff5f7792efcb9f6ab /services/strategy-engine/strategies/indicators/volume.py | |
| parent | b23aef3a9947d4d3d8e87b595ecf547159df7289 (diff) | |
feat(strategy): add technical indicators library (ATR, ADX, RSI, MACD, Bollinger, Stochastic, OBV)
Diffstat (limited to 'services/strategy-engine/strategies/indicators/volume.py')
| -rw-r--r-- | services/strategy-engine/strategies/indicators/volume.py | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/services/strategy-engine/strategies/indicators/volume.py b/services/strategy-engine/strategies/indicators/volume.py new file mode 100644 index 0000000..323d427 --- /dev/null +++ b/services/strategy-engine/strategies/indicators/volume.py @@ -0,0 +1,21 @@ +"""Volume indicators: Volume SMA, Volume Ratio, OBV.""" +import pandas as pd +import numpy as np + + +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() |
