]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
perf: vectorize smma() using SMA-seeded ewm (no Python loop)
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 1 May 2026 15:42:42 +0000 (17:42 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 1 May 2026 15:42:42 +0000 (17:42 +0200)
quickadapter/user_data/strategies/Utils.py

index d0b59635a20566fa7c16f45579524b5e66e525c4..4931f66243a3a8a50f2661585678db096cab249c 100644 (file)
@@ -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)