Как сгладить значение стохастического осциллятора с (14,1,3) до (14,3,3) в Numpy/Pandas?

#python #pandas #numpy #time-series #stock

Вопрос:

У меня есть значение, при котором оно дает точные результаты, как указано для любых акций на веб-сайте TradingView. Этот результат для стохастического осциллятора со значениями (14,1,3). Я хочу знать, хочу ли я сгладить значение до (14,3,3), что нужно будет сделать?

Это блог, в котором используется та же идея, о которой я говорю, и ниже приведен мой код:

 df.sort_index(ascending=False,inplace=True) #My stock is Newest First order

k_period = 14
d_period = 3

LOW,HIGH,CLOSE = "LOW", "HIGH", "CLOSE" # Column names

# Adds a "n_high" column with max value of previous 14 periods
df['n_high'] = df[HIGH].rolling(k_period).max()

# Adds an "n_low" column with min value of previous 14 periods
df['n_low'] = df[LOW].rolling(k_period).min()

# Uses the min/max values to calculate the %k (as a percentage)
df['%K'] = (df[CLOSE] - df['n_low']) * 100 / (df['n_high'] - df['n_low'])

# Uses the %k to calculates a SMA over the past 3 values of %k
df['%D'] = df['%K'].rolling(d_period).mean()
 

Ответ №1:

Нашел решение. Это было глупое приспособление. Вам также нужна .rolling_average() Синяя линия. Вот скорректированный код.

 def Stochastic(data, k_period:int = 14, d_period:int = 3, smooth_k = 3, names:tuple = ('OPEN','CLOSE','LOW','HIGH'),return_df:bool=False):
        '''
        Implementation of the Stochastic Oscillator. Returns the Fast and Slow lines values or the whole DataFrame
        args:
            data: Pandas Dataframe of the stock
            k_period: Period for the %K /Fast / Blue line
            d_period: Period for the %D / Slow /Red / Signal Line
            smooth_k: Smoothening the Fast line value. With increase/ decrease in number, it becomes the Fast or Slow Stochastic
            names: Names of the columns which contains the corresponding values
            return_df: Whether to return the DataFrame or the Values
        out:
            Returns either the Array containing (fast_line,slow_line) values or the entire DataFrame
        '''
        OPEN, CLOSE, LOW, HIGH = names
        df = data.copy()
        if df.iloc[0,0] > df.iloc[1,0]: # if the first Date entry [0,0] is > previous data entry [1,0] then it is in descending order, then reverse it for calculation
            df.sort_index(ascending=False, inplace = True)

        # Adds a "n_high" column with max value of previous 14 periods
        df['n_high'] = df[HIGH].rolling(k_period).max()

        # Adds an "n_low" column with min value of previous 14 periods
        df['n_low'] = df[LOW].rolling(k_period).min()

        # Uses the min/max values to calculate the %k (as a percentage)
        df['Blue Line'] = (df[CLOSE] - df['n_low']) * 100 / (df['n_high'] - df['n_low']) # %K or so called Fast Line

        if smooth_k > 1: # Smoothen the fast, blue line
            df['Blue Line'] = df['Blue Line'].rolling(smooth_k).mean()
        
        # Uses the %k to calculates a SMA over the past 3 values of %k
        df['Red Line'] = df['Blue Line'].rolling(d_period).mean() # %D of so called Slow Line

        df.drop(['n_high','n_low'],inplace=True,axis=1)
        
        df.sort_index(ascending = True, inplace = True)

        if return_df:
            return df

        return df.iloc[0,-2:] # Fast