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

16 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-07-24 19:45 +0000

1# indicators/stochastic_oscillator_indicator.py 

2 

3# global imports 

4import pandas as pd 

5 

6# local imports 

7from source.indicators import IndicatorHandlerBase 

8 

9class StochasticOscillatorIndicatorHandler(IndicatorHandlerBase): 

10 """ 

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

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

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

14 """ 

15 

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

17 """ 

18 Class constructor. 

19 

20 Parameters: 

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

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

23 """ 

24 

25 self.window_size = window_size 

26 self.d_period = d_period 

27 

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

29 """ 

30 Calculates stochastic oscillator indicator values for given data. 

31 

32 Parameters: 

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

34 

35 Returns: 

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

37 """ 

38 

39 high_series = data['high'] 

40 low_series = data['low'] 

41 close_series = data['close'] 

42 

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

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

45 

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

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

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

49 

50 return stochastic_data_df