Coverage for source/indicators/stochastic_oscillator_indicator.py: 31%
16 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-07-23 22:15 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-07-23 22:15 +0000
1# indicators/stochastic_oscillator_indicator.py
3# global imports
4import pandas as pd
6# local imports
7from source.indicators import IndicatorHandlerBase
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 """
16 def __init__(self, window_size: int = 14, d_period: int = 3) -> None:
17 """
18 Class constructor.
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 """
25 self.window_size = window_size
26 self.d_period = d_period
28 def calculate(self, data: pd.DataFrame) -> pd.DataFrame:
29 """
30 Calculates stochastic oscillator indicator values for given data.
32 Parameters:
33 data (pd.DataFrame): Data frame with input data.
35 Returns:
36 (pd.DataFrame): Output data with calculated stochastic oscillator values.
37 """
39 high_series = data['high']
40 low_series = data['low']
41 close_series = data['close']
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()
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()
50 return stochastic_data_df