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
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-30 15:13 +0000
1# indicators/stochastic_oscillator_indicator.py
3from .indicator_base import *
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 """
12 def __init__(self, window_size: int = 14, d_period: int = 3) -> None:
13 """
14 Class constructor.
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 """
21 self.window_size = window_size
22 self.d_period = d_period
24 def calculate(self, data: pd.DataFrame) -> pd.DataFrame:
25 """
26 Calculates stochastic oscillator indicator values for given data.
28 Parameters:
29 data (pd.DataFrame): Data frame with input data.
31 Returns:
32 (pd.DataFrame): Output data with calculated stochastic oscillator values.
33 """
35 high_series = data['high']
36 low_series = data['low']
37 close_series = data['close']
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()
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()
46 return stochastic_data_df