Coverage for source/indicators/stochastic_oscillator_indicator.py: 100%

15 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-05-30 15:13 +0000

1# indicators/stochastic_oscillator_indicator.py 

2 

3from .indicator_base import * 

4 

5class StochasticOscillatorIndicatorHandler(IndicatorHandlerBase): 

6 """ 

7 Implements stochastic oscillator indicator. It describes how expensive or cheap 

8 current price is over the given period. Result of calculation is percentage  

9 assuming values over 80% for expensive and under 20% for cheap price. 

10 """ 

11 

12 def __init__(self, window_size: int = 14, d_period: int = 3) -> None: 

13 """ 

14 Class constructor. 

15 

16 Parameters: 

17 window_size (int): Length of window that indicator should be applied over. 

18 d_period (int): Length of smoothing window that should be applied over indicator data. 

19 """ 

20 

21 self.window_size = window_size 

22 self.d_period = d_period 

23 

24 def calculate(self, data: pd.DataFrame) -> pd.DataFrame: 

25 """ 

26 Calculates stochastic oscillator indicator values for given data. 

27 

28 Parameters: 

29 data (pd.DataFrame): Data frame with input data. 

30 

31 Returns: 

32 (pd.DataFrame): Output data with calculated stochastic oscillator values. 

33 """ 

34 

35 high_series = data['high'] 

36 low_series = data['low'] 

37 close_series = data['close'] 

38 

39 highest_high = high_series.rolling(window = self.window_size, min_periods = 1).max() 

40 lowest_low = low_series.rolling(window = self.window_size, min_periods = 1).min() 

41 

42 stochastic_data_df = pd.DataFrame(index = data.index) 

43 stochastic_data_df['K%'] = 100 * ((close_series - lowest_low) / (highest_high - lowest_low)) 

44 stochastic_data_df['D%'] = stochastic_data_df['K%'].rolling(window = self.d_period, min_periods = 1).mean() 

45 

46 return stochastic_data_df