コード例 #1
0
    def create_trade_sign(self, stock_price: pd.DataFrame) -> pd.DataFrame:
        stock_price = stock_price.sort_values("date")
        kd = StochasticOscillator(
            high=stock_price["max"],
            low=stock_price["min"],
            close=stock_price["close"],
            n=self.kdays,
        )
        rsv_ = kd.stoch().fillna(50)
        _k = np.zeros(stock_price.shape[0])
        _d = np.zeros(stock_price.shape[0])
        for i, r in enumerate(rsv_):
            if i == 0:
                _k[i] = 50
                _d[i] = 50
            else:
                _k[i] = _k[i - 1] * 2 / 3 + r / 3
                _d[i] = _d[i - 1] * 2 / 3 + _k[i] / 3

        stock_price["K"] = _k
        stock_price["D"] = _d
        stock_price.index = range(len(stock_price))
        stock_price["signal"] = 0
        stock_price.loc[stock_price["K"] <= self.kd_lower, "signal"] = 1
        stock_price.loc[stock_price["K"] >= self.kd_upper, "signal"] = -1
        return stock_price
コード例 #2
0
 def create_trade_sign(self, stock_price: pd.DataFrame) -> pd.DataFrame:
     stock_price = stock_price.sort_values("date")
     kd = StochasticOscillator(
         high=stock_price["max"],
         low=stock_price["min"],
         close=stock_price["close"],
         n=self.k_days,
     )
     rsv_ = kd.stoch().fillna(50)
     _k = np.zeros(stock_price.shape[0])
     _d = np.zeros(stock_price.shape[0])
     for i, r in enumerate(rsv_):
         if i == 0:
             _k[i] = 50
             _d[i] = 50
         else:
             _k[i] = _k[i - 1] * 2 / 3 + r / 3
             _d[i] = _d[i - 1] * 2 / 3 + _k[i] / 3
     stock_price["K"] = _k
     stock_price["D"] = _d
     stock_price.index = range(len(stock_price))
     stock_price["diff"] = stock_price["K"] - stock_price["D"]
     stock_price.loc[(stock_price.index < self.k_days), "diff"] = np.nan
     stock_price["diff_sign"] = stock_price["diff"].map(
         lambda x: 1 if x >= 0 else (-1 if x < 0 else 0))
     stock_price["diff_sign_yesterday"] = (
         stock_price["diff_sign"].shift(1).fillna(0).astype(int))
     stock_price["signal"] = 0
     stock_price.loc[((stock_price["diff_sign"] > 0)
                      & (stock_price["diff_sign_yesterday"] < 0)),
                     "signal", ] = 1
     stock_price.loc[((stock_price["diff_sign"] < 0)
                      & (stock_price["diff_sign_yesterday"] > 0)),
                     "signal", ] = -1
     return stock_price
コード例 #3
0
    def init(self, base_data):
        base_data = base_data.sort_values("date")

        kd = StochasticOscillator(
            high=base_data["max"],
            low=base_data["min"],
            close=base_data["close"],
            n=self.kdays,
        )
        rsv_ = kd.stoch().fillna(50)

        _k = np.zeros(base_data.shape[0])
        _d = np.zeros(base_data.shape[0])
        for i, r in enumerate(rsv_):
            if i == 0:
                _k[i] = 50
                _d[i] = 50
            else:
                _k[i] = _k[i - 1] * 2 / 3 + r / 3
                _d[i] = _d[i - 1] * 2 / 3 + _k[i] / 3

        base_data["K"] = _k
        base_data["D"] = _d

        base_data.index = range(len(base_data))

        base_data["signal"] = 0
        base_data.loc[base_data["K"] <= self.kd_lower, "signal"] = 1
        base_data.loc[base_data["K"] >= self.kd_upper, "signal"] = -1
        return base_data
コード例 #4
0
 def calc(self, dataframe):
     stoch = StochasticOscillator(close=dataframe.close,
                                  low=dataframe.low,
                                  high=dataframe.high,
                                  n=self.params.get("period"),
                                  d_n=self.params.get("d_period"))
     dataframe["{}_k".format(self.col_name())] = stoch.stoch()
     return dataframe
コード例 #5
0
 def create_trade_sign(self, stock_price: pd.DataFrame) -> pd.DataFrame:
     stock_price = stock_price.sort_values("date")
     kd = StochasticOscillator(
         high=stock_price["max"],
         low=stock_price["min"],
         close=stock_price["close"],
         n=self.kdays,
         d_n=self.ddays,
     )
     stock_price["K"] = kd.stoch()
     stock_price["D"] = kd.stoch_signal()
     stock_price.index = range(len(stock_price))
     stock_price["signal"] = 0
     stock_price.loc[stock_price["K"] <= self.kd_lower, "signal"] = 1
     stock_price.loc[stock_price["K"] >= self.kd_upper, "signal"] = -1
     return stock_price
コード例 #6
0
 def analyze(self):
     stochastic_df = StochasticOscillator(self.df.high,
                                          self.df.low,
                                          self.df.close,
                                          n=5)
     self.df["stoch_k"] = stochastic_df.stoch()
     self.df["stoch_d"] = stochastic_df.stoch_signal()
     self.df["high_close"] = ((self.df.high - self.df.close) /
                              (self.df.high + self.df.close / 2) * 100)
     self.df["buy_signal"] = (
         ((self.df['stoch_k'] > self.df['stoch_d']) &
          (self.df['stoch_k'].shift(1) < self.df['stoch_d'].shift(1))) &
         (self.df['stoch_d'] < 26))
     self.df["stoch_buy_signal_early"] = (
         (self.df['stoch_k'] < self.df['stoch_d']) &
         ((self.df["stoch_d"]) - self.df["stoch_k"] < 3) &
         (self.df['stoch_d'] < 26))
コード例 #7
0
ファイル: NaiveKd.py プロジェクト: singer0503/FinMind
    def init(self, base_data):
        base_data = base_data.sort_values("date")

        kd = StochasticOscillator(
            high=base_data["max"],
            low=base_data["min"],
            close=base_data["close"],
            n=self.kdays,
            d_n=self.ddays,
        )
        base_data["K"] = kd.stoch()
        base_data["D"] = kd.stoch_signal()

        base_data.index = range(len(base_data))

        base_data["signal"] = 0
        base_data.loc[base_data["K"] <= self.kd_lower, "signal"] = 1
        base_data.loc[base_data["K"] >= self.kd_upper, "signal"] = -1
        return base_data
コード例 #8
0
ファイル: KdCrossOver.py プロジェクト: singer0503/FinMind
    def init(self, base_data):
        base_data = base_data.sort_values("date")

        kd = StochasticOscillator(
            high=base_data["max"],
            low=base_data["min"],
            close=base_data["close"],
            n=self.kdays,
        )
        rsv_ = kd.stoch().fillna(50)

        _k = np.zeros(base_data.shape[0])
        _d = np.zeros(base_data.shape[0])
        for i, r in enumerate(rsv_):
            if i == 0:
                _k[i] = 50
                _d[i] = 50
            else:
                _k[i] = _k[i - 1] * 2 / 3 + r / 3
                _d[i] = _d[i - 1] * 2 / 3 + _k[i] / 3

        base_data["K"] = _k
        base_data["D"] = _d

        base_data.index = range(len(base_data))

        base_data["diff"] = base_data["K"] - base_data["D"]
        base_data.loc[(base_data.index < self.kdays), "diff"] = np.nan

        base_data["bool_diff"] = base_data["diff"].map(
            lambda x: 1 if x >= 0 else (-1 if x < 0 else 0))
        base_data["bool_diff_shift1"] = (
            base_data["bool_diff"].shift(1).fillna(0).astype(int))

        base_data["signal"] = 0
        base_data.loc[((base_data["bool_diff"] > 0)
                       & (base_data["bool_diff_shift1"] < 0)), "signal", ] = 1
        base_data.loc[((base_data["bool_diff"] < 0)
                       & (base_data["bool_diff_shift1"] > 0)), "signal", ] = -1
        return base_data
コード例 #9
0
def add_momentum_indicators(data: pd.DataFrame) -> pd.DataFrame:
    """Adds the momentum indicators.

    Parameters
    ----------
    data : pd.DataFrame
        A dataframe with daily stock values. Must include: open, high,
        low, close and volume. It should also be sorted in a descending
        manner.

    Returns
    -------
    pd.DataFrame
        The input dataframe with the indicators added.
    """
    rsi = RSIIndicator(data['close'])
    stoch_osc = StochasticOscillator(data['high'], data['low'], data['close'])

    data.loc[:, 'rsi'] = rsi.rsi()
    data.loc[:, 'stoch_osc'] = stoch_osc.stoch()
    data.loc[:, 'stoch_osc_signal'] = stoch_osc.stoch_signal()

    return data
コード例 #10
0
ファイル: momentum.py プロジェクト: venkiiee/ta
class TestStochasticOscillator(unittest.TestCase):
    """
    https://school.stockcharts.com/doku.php?id=technical_indicators:stochastic_oscillator_fast_slow_and_full
    """

    _filename = 'ta/tests/data/cs-soo.csv'

    def setUp(self):
        self._df = pd.read_csv(self._filename, sep=',')
        self._indicator = StochasticOscillator(
            high=self._df['High'], low=self._df['Low'], close=self._df['Close'], n=14, d_n=3, fillna=False)

    def tearDown(self):
        del(self._df)

    def test_so(self):
        target = 'SO'
        result = self._indicator.stoch()
        pd.testing.assert_series_equal(self._df[target].tail(), result.tail(), check_names=False)

    def test_so_signal(self):
        target = 'SO_SIG'
        result = self._indicator.stoch_signal()
        pd.testing.assert_series_equal(self._df[target].tail(), result.tail(), check_names=False)
コード例 #11
0
 def STOCHASTIC(self, df):
     df_STOCH = df.copy()
     stoch = StochasticOscillator(df['High'], df['Low'], df['Close'])
     df['%K'] = stoch.stoch()
     df['%D'] = stoch.stoch_signal()
     return df
コード例 #12
0
    iloc is primarily integer position based (from 0 to length-1 of the axis), but may also be used with a boolean array.
    '''
    period = 30
    df['SMA_Close'] = talib.SMA(df["Close"], timeperiod=period)
    print('Time #1 batch TI: ' + str(time.time() - start_time) + ' seconds')
    start_time = time.time()
    # Stochastic Oscillator (SO)
    period = 14
    sma_period = 3
    StochasticOscillator = ta.momentum.StochasticOscillator(high=df["High"],
                                                            low=df["Low"],
                                                            close=df["Close"],
                                                            n=period,
                                                            d_n=sma_period,
                                                            fillna=False)
    df['SO'] = StochasticOscillator.stoch()

    # Momentum (M)
    period = 3
    df['Momentum'] = talib.MOM(df["Close"], timeperiod=period)

    # Price Rate Of Change (ROC)
    '''
    Description:
    is a pure momentum oscillator that measures the percent change in price from one period to the next
    The ROC calculation compares the current price with the price “n” periods ago
    '''
    period = 12
    RateOfChange = ta.momentum.ROCIndicator(close=df["Close"],
                                            n=period,
                                            fillna=False)
コード例 #13
0
def add_momentum_ta(
    df: pd.DataFrame,
    high: str,
    low: str,
    close: str,
    volume: str,
    fillna: bool = False,
    colprefix: str = "",
    vectorized: bool = False,
) -> pd.DataFrame:
    """Add trend technical analysis features to dataframe.

    Args:
        df (pandas.core.frame.DataFrame): Dataframe base.
        high (str): Name of 'high' column.
        low (str): Name of 'low' column.
        close (str): Name of 'close' column.
        volume (str): Name of 'volume' column.
        fillna(bool): if True, fill nan values.
        colprefix(str): Prefix column names inserted
        vectorized(bool): if True, use only vectorized functions indicators

    Returns:
        pandas.core.frame.DataFrame: Dataframe with new features.
    """

    # Relative Strength Index (RSI)
    df[f"{colprefix}momentum_rsi"] = RSIIndicator(close=df[close],
                                                  window=14,
                                                  fillna=fillna).rsi()

    # Stoch RSI (StochRSI)
    indicator_srsi = StochRSIIndicator(close=df[close],
                                       window=14,
                                       smooth1=3,
                                       smooth2=3,
                                       fillna=fillna)
    df[f"{colprefix}momentum_stoch_rsi"] = indicator_srsi.stochrsi()
    df[f"{colprefix}momentum_stoch_rsi_k"] = indicator_srsi.stochrsi_k()
    df[f"{colprefix}momentum_stoch_rsi_d"] = indicator_srsi.stochrsi_d()

    # TSI Indicator
    df[f"{colprefix}momentum_tsi"] = TSIIndicator(close=df[close],
                                                  window_slow=25,
                                                  window_fast=13,
                                                  fillna=fillna).tsi()

    # Ultimate Oscillator
    df[f"{colprefix}momentum_uo"] = UltimateOscillator(
        high=df[high],
        low=df[low],
        close=df[close],
        window1=7,
        window2=14,
        window3=28,
        weight1=4.0,
        weight2=2.0,
        weight3=1.0,
        fillna=fillna,
    ).ultimate_oscillator()

    # Stoch Indicator
    indicator_so = StochasticOscillator(
        high=df[high],
        low=df[low],
        close=df[close],
        window=14,
        smooth_window=3,
        fillna=fillna,
    )
    df[f"{colprefix}momentum_stoch"] = indicator_so.stoch()
    df[f"{colprefix}momentum_stoch_signal"] = indicator_so.stoch_signal()

    # Williams R Indicator
    df[f"{colprefix}momentum_wr"] = WilliamsRIndicator(
        high=df[high], low=df[low], close=df[close], lbp=14,
        fillna=fillna).williams_r()

    # Awesome Oscillator
    df[f"{colprefix}momentum_ao"] = AwesomeOscillatorIndicator(
        high=df[high], low=df[low], window1=5, window2=34,
        fillna=fillna).awesome_oscillator()

    # Rate Of Change
    df[f"{colprefix}momentum_roc"] = ROCIndicator(close=df[close],
                                                  window=12,
                                                  fillna=fillna).roc()

    # Percentage Price Oscillator
    indicator_ppo = PercentagePriceOscillator(close=df[close],
                                              window_slow=26,
                                              window_fast=12,
                                              window_sign=9,
                                              fillna=fillna)
    df[f"{colprefix}momentum_ppo"] = indicator_ppo.ppo()
    df[f"{colprefix}momentum_ppo_signal"] = indicator_ppo.ppo_signal()
    df[f"{colprefix}momentum_ppo_hist"] = indicator_ppo.ppo_hist()

    # Percentage Volume Oscillator
    indicator_pvo = PercentageVolumeOscillator(volume=df[volume],
                                               window_slow=26,
                                               window_fast=12,
                                               window_sign=9,
                                               fillna=fillna)
    df[f"{colprefix}momentum_pvo"] = indicator_pvo.pvo()
    df[f"{colprefix}momentum_pvo_signal"] = indicator_pvo.pvo_signal()
    df[f"{colprefix}momentum_pvo_hist"] = indicator_pvo.pvo_hist()

    if not vectorized:
        # KAMA
        df[f"{colprefix}momentum_kama"] = KAMAIndicator(close=df[close],
                                                        window=10,
                                                        pow1=2,
                                                        pow2=30,
                                                        fillna=fillna).kama()

    return df
コード例 #14
0
    def applyIndicator(self, full_company_price):
        self.data = full_company_price

        high = self.data['high']
        low = self.data['low']
        close = self.data['close']
        volume = self.data['volume']

        EMA12 = EMAIndicator(close, 12, fillna=False)
        EMA30 = EMAIndicator(close, 20, fillna=False)
        EMA60 = EMAIndicator(close, 60, fillna=False)
        MACD1226 = MACD(close, 26, 12, 9, fillna=False)
        MACD2452 = MACD(close, 52, 24, 18, fillna=False)
        ROC12 = ROCIndicator(close, 12, fillna=False)
        ROC30 = ROCIndicator(close, 30, fillna=False)
        ROC60 = ROCIndicator(close, 60, fillna=False)
        RSI14 = RSIIndicator(close, 14, fillna=False)
        RSI28 = RSIIndicator(close, 28, fillna=False)
        RSI60 = RSIIndicator(close, 60, fillna=False)
        AROON25 = AroonIndicator(close, 25, fillna=False)
        AROON50 = AroonIndicator(close, 50, fillna=False)
        AROON80 = AroonIndicator(close, 80, fillna=False)
        MFI14 = MFIIndicator(high, low, close, volume, 14, fillna=False)
        MFI28 = MFIIndicator(high, low, close, volume, 28, fillna=False)
        MFI80 = MFIIndicator(high, low, close, volume, 80, fillna=False)
        CCI20 = CCIIndicator(high, low, close, 20, 0.015, fillna=False)
        CCI40 = CCIIndicator(high, low, close, 40, 0.015, fillna=False)
        CCI100 = CCIIndicator(high, low, close, 100, 0.015, fillna=False)
        WILLR14 = WilliamsRIndicator(high, low, close, 14, fillna=False)
        WILLR28 = WilliamsRIndicator(high, low, close, 28, fillna=False)
        WILLR60 = WilliamsRIndicator(high, low, close, 60, fillna=False)
        BBANDS20 = BollingerBands(close, 20, 2, fillna=False)
        KC20 = KeltnerChannel(high, low, close, 20, 10, fillna=False)
        STOCH14 = StochasticOscillator(high, low, close, 14, 3, fillna=False)
        STOCH28 = StochasticOscillator(high, low, close, 28, 6, fillna=False)
        STOCH60 = StochasticOscillator(high, low, close, 60, 12, fillna=False)
        CMI20 = ChaikinMoneyFlowIndicator(high,
                                          low,
                                          close,
                                          volume,
                                          20,
                                          fillna=False)
        CMI40 = ChaikinMoneyFlowIndicator(high,
                                          low,
                                          close,
                                          volume,
                                          40,
                                          fillna=False)
        CMI100 = ChaikinMoneyFlowIndicator(high,
                                           low,
                                           close,
                                           volume,
                                           100,
                                           fillna=False)

        self.data['ema12'] = (close - EMA12.ema_indicator()) / close
        self.data['ema30'] = (close - EMA30.ema_indicator()) / close
        self.data['ema60'] = (close - EMA60.ema_indicator()) / close
        self.data['macd1226'] = MACD1226.macd() - MACD1226.macd_signal()
        self.data['macd2452'] = MACD2452.macd() - MACD2452.macd_signal()
        self.data['roc12'] = ROC12.roc()
        self.data['roc30'] = ROC30.roc()
        self.data['roc60'] = ROC60.roc()
        self.data['rsi14'] = RSI14.rsi()
        self.data['rsi28'] = RSI28.rsi()
        self.data['rsi60'] = RSI60.rsi()
        self.data['aroon25'] = AROON25.aroon_indicator()
        self.data['aroon50'] = AROON50.aroon_indicator()
        self.data['aroon80'] = AROON80.aroon_indicator()
        self.data['mfi14'] = MFI14.money_flow_index()
        self.data['mfi28'] = MFI28.money_flow_index()
        self.data['mfi80'] = MFI80.money_flow_index()
        self.data['cci20'] = CCI20.cci()
        self.data['cci40'] = CCI40.cci()
        self.data['cci100'] = CCI100.cci()
        self.data['willr14'] = WILLR14.wr()
        self.data['willr28'] = WILLR28.wr()
        self.data['willr60'] = WILLR60.wr()
        self.data['bband20up'] = (BBANDS20.bollinger_hband() - close) / close
        self.data['bband20down'] = (close - BBANDS20.bollinger_lband()) / close
        self.data['stoch14'] = STOCH14.stoch()
        self.data['stoch28'] = STOCH28.stoch()
        self.data['stoch60'] = STOCH60.stoch()
        self.data['cmi20'] = CMI20.chaikin_money_flow()
        self.data['cmi40'] = CMI40.chaikin_money_flow()
        self.data['cmi100'] = CMI100.chaikin_money_flow()
        self.data['kc20up'] = (KC20.keltner_channel_hband() - close) / close
        self.data['kc20down'] = (close - KC20.keltner_channel_lband()) / close
        return self.data
コード例 #15
0
def add_momentum_ta(df: pd.DataFrame,
                    high: str,
                    low: str,
                    close: str,
                    volume: str,
                    fillna: bool = False,
                    colprefix: str = "") -> pd.DataFrame:
    """Add trend technical analysis features to dataframe.

    Args:
        df (pandas.core.frame.DataFrame): Dataframe base.
        high (str): Name of 'high' column.
        low (str): Name of 'low' column.
        close (str): Name of 'close' column.
        fillna(bool): if True, fill nan values.
        colprefix(str): Prefix column names inserted

    Returns:
        pandas.core.frame.DataFrame: Dataframe with new features.
    """

    # Relative Strength Index (RSI)
    df[f'{colprefix}momentum_rsi'] = RSIIndicator(close=df[close],
                                                  n=14,
                                                  fillna=fillna).rsi()

    # TSI Indicator
    df[f'{colprefix}momentum_tsi'] = TSIIndicator(close=df[close],
                                                  r=25,
                                                  s=13,
                                                  fillna=fillna).tsi()

    # Ultimate Oscillator
    df[f'{colprefix}momentum_uo'] = UltimateOscillator(high=df[high],
                                                       low=df[low],
                                                       close=df[close],
                                                       s=7,
                                                       m=14,
                                                       len=28,
                                                       ws=4.0,
                                                       wm=2.0,
                                                       wl=1.0,
                                                       fillna=fillna).uo()

    # Stoch Indicator
    indicator = StochasticOscillator(high=df[high],
                                     low=df[low],
                                     close=df[close],
                                     n=14,
                                     d_n=3,
                                     fillna=fillna)
    df[f'{colprefix}momentum_stoch'] = indicator.stoch()
    df[f'{colprefix}momentum_stoch_signal'] = indicator.stoch_signal()

    # Williams R Indicator
    df[f'{colprefix}momentum_wr'] = WilliamsRIndicator(high=df[high],
                                                       low=df[low],
                                                       close=df[close],
                                                       lbp=14,
                                                       fillna=fillna).wr()

    # Awesome Oscillator
    df[f'{colprefix}momentum_ao'] = AwesomeOscillatorIndicator(
        high=df[high], low=df[low], s=5, len=34, fillna=fillna).ao()

    # KAMA
    df[f'{colprefix}momentum_kama'] = KAMAIndicator(close=df[close],
                                                    n=10,
                                                    pow1=2,
                                                    pow2=30,
                                                    fillna=fillna).kama()

    # Rate Of Change
    df[f'{colprefix}momentum_roc'] = ROCIndicator(close=df[close],
                                                  n=12,
                                                  fillna=fillna).roc()
    return df