From c6b016f4ccd76f6b4ecb096ac68f5032375dc957 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Fri, 1 May 2026 17:42:42 +0200 Subject: [PATCH] perf: vectorize smma() using SMA-seeded ewm (no Python loop) --- quickadapter/user_data/strategies/Utils.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/quickadapter/user_data/strategies/Utils.py b/quickadapter/user_data/strategies/Utils.py index d0b5963..4931f66 100644 --- a/quickadapter/user_data/strategies/Utils.py +++ b/quickadapter/user_data/strategies/Utils.py @@ -1531,14 +1531,12 @@ def smma(series: pd.Series, period: int, zero_lag=False, offset=0) -> pd.Series: if zero_lag: series = calculate_zero_lag(series, period=period) - values = series.to_numpy() - - smma_values = np.full(n, np.nan) - smma_values[period - 1] = np.nanmean(values[:period]) - for i in range(period, n): - smma_values[i] = (smma_values[i - 1] * (period - 1) + values[i]) / period - - smma = pd.Series(smma_values, index=series.index) + alpha = 1.0 / period + prepared = series.copy() + sma_seed = prepared.iloc[:period].mean() + prepared.iloc[: period - 1] = np.nan + prepared.iloc[period - 1] = sma_seed + smma = prepared.ewm(alpha=alpha, adjust=False).mean() if offset != 0: smma = smma.shift(offset) -- 2.53.0