diff --git a/talipp/indicators/WMA.py b/talipp/indicators/WMA.py index 81025d9e..3a63de49 100644 --- a/talipp/indicators/WMA.py +++ b/talipp/indicators/WMA.py @@ -1,3 +1,4 @@ +import numpy as np from typing import List, Any from talipp.indicator_util import has_valid_values @@ -38,9 +39,11 @@ def _calculate_new_value(self) -> Any: if not has_valid_values(self.input_values, self.period): return None - s = 0.0 - for i in range(self.period, 0, -1): - index = len(self.input_values) - self.period + i - 1 # decreases from end of array with increasing i - s += self.input_values[index] * i + # Convert input_values to a NumPy array for vectorized operations + input_values_np = np.array(self.input_values[-self.period:]) - return s / self.denom_sum + # Calculate weighted moving average using NumPy vectorized operations + weights = np.arange(1, self.period + 1) + wma = np.sum(input_values_np * weights) / self.denom_sum + + return wma