def ultosc(self,
            time_period1: int = 7,
            time_period2: int = 14,
            time_period3: int = 28,
            array: bool = False) -> Union[float, np.ndarray]:
     """
     Ultimate Oscillator.
     """
     result = talib.ULTOSC(self.high, self.low, self.close, time_period1,
                           time_period2, time_period3)
     if array:
         return result
     return result[-1]
Пример #2
0
    def add_tech_ind(self, price_map):
        # Visit for technical indicator documentation: http://mrjbq7.github.io/ta-lib/funcs.html

        new_price_map = {}

        for symbol in price_map:
            symbol_data = price_map[symbol]
            symbol_data['osc'] = ta.ULTOSC(symbol_data['high'],
                                           symbol_data['low'],
                                           symbol_data['open'], 7, 14, 21)
            new_price_map[symbol] = symbol_data

        return new_price_map
Пример #3
0
    def test_uo(self):
        result = pandas_ta.uo(self.high, self.low, self.close)
        self.assertIsInstance(result, Series)
        self.assertEqual(result.name, 'UO_7_14_28')

        try:
            expected = tal.ULTOSC(self.high, self.low, self.close)
            pdt.assert_series_equal(result, expected, check_names=False)
        except AssertionError as ae:
            try:
                corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION)
                self.assertGreater(corr, CORRELATION_THRESHOLD)
            except Exception as ex:
                error_analysis(result, CORRELATION, ex)
def populateindicators(dataframe):
    bardata = dataframe.assign(mfi=ta.MFI(dataframe['high'],
                                          dataframe['low'],
                                          dataframe['close'],
                                          np.asarray(dataframe['volume'],
                                                     dtype='float'),
                                          timeperiod=14),
                               ultosc=ta.ULTOSC(dataframe['high'],
                                                dataframe['low'],
                                                dataframe['close']),
                               minusdi=tab.MINUS_DI(dataframe, timeperiod=14),
                               plusdi=tab.PLUS_DI(dataframe, timeperiod=14),
                               rsi=tab.RSI(dataframe,
                                           timeperiod=14,
                                           price='close'),
                               adx=tab.ADX(dataframe))
    return bardata
Пример #5
0
def ultosc(
    client,
    symbol,
    range="6m",
    highcol="high",
    lowcol="low",
    closecol="close",
    period1=7,
    period2=14,
    period3=28,
):
    """This will return a dataframe of
    Ultimate Oscillator
    for the given symbol across the given range

    Args:
        client (pyEX.Client): Client
        symbol (string): Ticker
        range (string): range to use, for pyEX.chart
        highcol (string): column to use to calculate
        lowcol (string): column to use to calculate
        closecol (string): column to use to calculate
        period1 (int): period to calculate across
        period2 (int): period to calculate across
        period3 (int): period to calculate across

    Returns:
        DataFrame: result
    """
    df = client.chartDF(symbol, range)
    x = t.ULTOSC(
        df[highcol].values.astype(float),
        df[lowcol].values.astype(float),
        df[closecol].values.astype(float),
        timeperiod1=period1,
        timeperiod2=period2,
        timeperiod3=period3,
    )
    return pd.DataFrame(
        {
            highcol: df[highcol].values,
            lowcol: df[lowcol].values,
            closecol: df[closecol].values,
            "ultosc": x,
        }
    )
Пример #6
0
def generate_tech_data_default(stock,
                               open_name,
                               close_name,
                               high_name,
                               low_name,
                               volume_name='vol'):
    open_price = stock[open_name].values
    close_price = stock[close_name].values
    low_price = stock[low_name].values
    high_price = stock[high_name].values
    volume = stock[volume_name].values
    data = stock.copy()
    data['MOM'] = talib.MOM(close_price)
    data['HT_DCPERIOD'] = talib.HT_DCPERIOD(close_price)
    data['HT_DCPHASE'] = talib.HT_DCPHASE(close_price)
    data['sine'], data['leadsine'] = talib.HT_SINE(close_price)
    data['inphase'], data['quadrature'] = talib.HT_PHASOR(close_price)
    data['ADXR'] = talib.ADXR(high_price, low_price, close_price)
    data['APO'] = talib.APO(close_price)
    data['AROON_UP'], _ = talib.AROON(high_price, low_price)
    data['CCI'] = talib.CCI(high_price, low_price, close_price)
    data['PLUS_DI'] = talib.PLUS_DI(high_price, low_price, close_price)
    data['PPO'] = talib.PPO(close_price)
    data['macd'], data['macd_sig'], data['macd_hist'] = talib.MACD(close_price)
    data['CMO'] = talib.CMO(close_price)
    data['ROCP'] = talib.ROCP(close_price)
    data['fastk'], data['fastd'] = talib.STOCHF(high_price, low_price,
                                                close_price)
    data['TRIX'] = talib.TRIX(close_price)
    data['ULTOSC'] = talib.ULTOSC(high_price, low_price, close_price)
    data['WILLR'] = talib.WILLR(high_price, low_price, close_price)
    data['NATR'] = talib.NATR(high_price, low_price, close_price)
    data['MFI'] = talib.MFI(high_price, low_price, close_price, volume)
    data['RSI'] = talib.RSI(close_price)
    data['AD'] = talib.AD(high_price, low_price, close_price, volume)
    data['OBV'] = talib.OBV(close_price, volume)
    data['EMA'] = talib.EMA(close_price)
    data['SAREXT'] = talib.SAREXT(high_price, low_price)
    data['TEMA'] = talib.EMA(close_price)
    #data = data.drop([open_name, close_name, high_name, low_name, volume_name, 'amount', 'count'], axis=1)
    data = drop_columns(data, [
        open_name, close_name, high_name, low_name, volume_name, 'amount',
        'count'
    ])
    data = data.dropna().astype(np.float32)
    return data
Пример #7
0
def getCustomData(df):
    open = df['Open']
    high = df['High']
    low = df['Low']
    close = df['Close']
    volume = df['Volume']
    df['TRENDMODE'] = ta.HT_TRENDMODE(close)
    df['RSI'] = ta.RSI(close,timeperiod=14)
    df['RSI2'] = ta.RSI(close,timeperiod=7)
    df['RSI3'] = ta.RSI(close,timeperiod=28)
    df['ADX1'] = ta.ADX(high,low,close,timeperiod=7)
    df['ADX2'] = ta.ADX(high,low,close,timeperiod=28)
    df['ADX'] = ta.ADX(high,low,close,timeperiod=14)
    df['SLOWK'], df['SLOWD'] = ta.STOCH(high, low, close, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
    df['FASTK'], df['FASTD'] = ta.STOCHF(high, low, close, fastk_period=5, fastd_period=3, fastd_matype=0)
    df['ULTOSC'] = ta.ULTOSC(high, low, close, timeperiod1=7, timeperiod2=14, timeperiod3=28)
    df['WILLR'] = ta.WILLR(high, low, close, timeperiod=14) 
Пример #8
0
def calc_indicators(df):
    po = df.open.values
    ph = df.high.values
    pl = df.low.values
    pc = df.close.values

    po = np.array(po, dtype=float)
    ph = np.array(ph, dtype=float)
    pl = np.array(pl, dtype=float)
    pc = np.array(pc, dtype=float)

    ma = []
    ema = []
    for i in [5, 10, 20, 60, 120]:
        ma.append(talib.MA(pc, i)[-1])
        ema.append(talib.EMA(pc, i)[-1])

    macd = talib.MACD(pc)[2][-1]
    rsi = talib.RSI(pc, 14)[-1]
    stoch = talib.STOCH(ph, pl, pc, 9, 6)[0][-1]
    adx = talib.ADX(ph, pl, pc, 14)[-1]
    cci = talib.CCI(ph, pl, pc, 14)[-1]
    # willr = talib.WILLR(ph, pl, pc, 14)[-1]
    stochrsi = talib.STOCHRSI(pc, 14)[0][-1]
    uo = talib.ULTOSC(ph, pl, pc)[-1]
    roc = pc[-1] / pc[-2] - 1
    sar = talib.SAR(ph, pl)[-1]

    plusDI = talib.PLUS_DI(ph, pl, pc, 14)[-1]
    minusDI = talib.MINUS_DI(ph, pl, pc, 14)[-1]
    adx *= (lambda x: 1 if x > 0 else -1 if x < 0 else 0)(plusDI - minusDI)

    # print(ma, ema, macd, rsi, stoch, adx, cci, stochrsi, uo, roc, sar)
    indicators = {'ma': ma,
                  'ema': ema,
                  'macd': macd,
                  'rsi': rsi,
                  'stoch': stoch,
                  'adx': adx,
                  'cci': cci,
                  'stochrsi': stochrsi,
                  'uo': uo,
                  'roc': roc,
                  'sar': sar}
    return indicators
Пример #9
0
    def updateIndicator(self, data, candles_visible):
        # ULTOSC(high, low, close, timeperiod1=7, timeperiod2=14, timeperiod3=28)
        ult_osc = talib.ULTOSC(data[2],
                               data[3],
                               data[4],
                               timeperiod1=7,
                               timeperiod2=14,
                               timeperiod3=28)
        try:
            firstNotNan = np.where(np.isnan(ult_osc))[0][-1] + 1
        except:
            firstNotNan = 0
        ult_osc[:firstNotNan] = ult_osc[firstNotNan]
        ult_osc = ult_osc[-candles_visible:]

        self.line.clear()
        for i in range(candles_visible):
            self.line.append(i + 0.5, ult_osc[i])

        # detach and remove old axes
        for ax in self.line.attachedAxes():
            self.line.detachAxis(ax)
        for ax in self.axes():
            self.removeAxis(ax)

        # set x axes
        ax = QtChart.QValueAxis()
        ax.setRange(0, candles_visible)
        ax.hide()

        # set y axes
        ay = QtChart.QValueAxis()
        ay.setRange(0, 100)
        ay.setGridLinePen(QtGui.QPen(QtGui.QColor(80, 80, 80), 0.5))
        ay.setLinePen(QtGui.QPen(QtGui.QColor(0, 0, 0), 0.5))
        ay.applyNiceNumbers()
        ay.setTickCount(3)

        # add and attach new axes
        self.addAxis(ax, QtCore.Qt.AlignBottom)
        self.addAxis(ay, QtCore.Qt.AlignRight)
        self.line.attachAxis(ax)
        self.line.attachAxis(ay)
Пример #10
0
def generate_tech_data(stock, open_name, close_name, high_name, low_name):
    open_price = stock[open_name].values
    close_price = stock[close_name].values
    low_price = stock[low_name].values
    high_price = stock[high_name].values
    data = pd.DataFrame(stock)
    data['MOM'] = talib.MOM(close_price)
    data['SMA'] = talib.SMA(close_price)
    data['HT_DCPERIOD'] = talib.HT_DCPERIOD(close_price)
    data['HT_DCPHASE'] = talib.HT_DCPHASE(close_price)
    data['sine'], data['leadsine'] = talib.HT_SINE(close_price)
    data['inphase'], data['quadrature'] = talib.HT_PHASOR(close_price)
    data['HT_TRENDMODE'] = talib.HT_TRENDMODE(close_price)
    data['SAREXT'] = talib.SAREXT(high_price, low_price)
    data['ADX'] = talib.ADX(high_price, low_price, close_price)
    data['ADXR'] = talib.ADX(high_price, low_price, close_price)
    data['APO'] = talib.APO(close_price)
    data['AROON_UP'], data['AROON_DOWN'] = talib.AROON(high_price, low_price)
    data['AROONOSC'] = talib.AROONOSC(high_price, low_price)
    data['BOP'] = talib.BOP(open_price, high_price, low_price, close_price)
    data['CCI'] = talib.CCI(high_price, low_price, close_price)
    data['PLUS_DI'] = talib.PLUS_DI(high_price, low_price, close_price)
    data['PLUS_DM'] = talib.PLUS_DM(high_price, low_price)
    data['PPO'] = talib.PPO(close_price)
    data['macd'], data['macd_sig'], data['macd_hist'] = talib.MACD(close_price)
    data['RSI'] = talib.RSI(close_price)
    data['CMO'] = talib.CMO(close_price)
    data['ROC'] = talib.ROC(close_price)
    data['ROCP'] = talib.ROCP(close_price)
    data['ROCR'] = talib.ROCR(close_price)
    data['slowk'], data['slowd'] = talib.STOCH(high_price, low_price,
                                               close_price)
    data['fastk'], data['fastd'] = talib.STOCHF(high_price, low_price,
                                                close_price)
    data['TRIX'] = talib.TRIX(close_price)
    data['ULTOSC'] = talib.ULTOSC(high_price, low_price, close_price)
    data['WILLR'] = talib.WILLR(high_price, low_price, close_price)
    data['NATR'] = talib.NATR(high_price, low_price, close_price)
    data['TRANGE'] = talib.TRANGE(high_price, low_price, close_price)
    data = data.drop([open_name, close_name, high_name, low_name], axis=1)
    data = data.dropna()
    return data
Пример #11
0
 def _get_indicators(security, open_name, close_name, high_name, low_name,
                     volume_name):
     open_price = security[open_name].values
     close_price = security[close_name].values
     low_price = security[low_name].values
     high_price = security[high_name].values
     volume = security[volume_name].values if volume_name else None
     security['MOM'] = talib.MOM(close_price)
     security['HT_DCPERIOD'] = talib.HT_DCPERIOD(close_price)
     security['HT_DCPHASE'] = talib.HT_DCPHASE(close_price)
     security['SINE'], security['LEADSINE'] = talib.HT_SINE(close_price)
     security['INPHASE'], security['QUADRATURE'] = talib.HT_PHASOR(
         close_price)
     security['ADXR'] = talib.ADXR(high_price, low_price, close_price)
     security['APO'] = talib.APO(close_price)
     security['AROON_UP'], _ = talib.AROON(high_price, low_price)
     security['CCI'] = talib.CCI(high_price, low_price, close_price)
     security['PLUS_DI'] = talib.PLUS_DI(high_price, low_price, close_price)
     security['PPO'] = talib.PPO(close_price)
     security['MACD'], security['MACD_SIG'], security[
         'MACD_HIST'] = talib.MACD(close_price)
     security['CMO'] = talib.CMO(close_price)
     security['ROCP'] = talib.ROCP(close_price)
     security['FASTK'], security['FASTD'] = talib.STOCHF(
         high_price, low_price, close_price)
     security['TRIX'] = talib.TRIX(close_price)
     security['ULTOSC'] = talib.ULTOSC(high_price, low_price, close_price)
     security['WILLR'] = talib.WILLR(high_price, low_price, close_price)
     security['NATR'] = talib.NATR(high_price, low_price, close_price)
     security['RSI'] = talib.RSI(close_price)
     security['EMA'] = talib.EMA(close_price)
     security['SAREXT'] = talib.SAREXT(high_price, low_price)
     security['RR'] = security[close_name] / security[close_name].shift(
         1).fillna(1)
     security['LOG_RR'] = np.log(security['RR'])
     if volume_name:
         security['MFI'] = talib.MFI(high_price, low_price, close_price,
                                     volume)
         security[volume_name] = np.log(security[volume_name])
     security.drop([open_name, close_name, high_name, low_name], axis=1)
     security = security.dropna().astype(np.float32)
     return security
Пример #12
0
def ultosc(candles: np.ndarray, timeperiod1=7, timeperiod2=14, timeperiod3=28, sequential=False) -> Union[float, np.ndarray]:
    """
    ULTOSC - Ultimate Oscillator

    :param candles: np.ndarray
    :param timeperiod1: int - default=7
    :param timeperiod2: int - default=14
    :param timeperiod3: int - default=28
    :param sequential: bool - default=False

    :return: float | np.ndarray
    """
    if not sequential and len(candles) > 240:
        candles = candles[-240:]

    res = talib.ULTOSC(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod1=timeperiod1, timeperiod2=timeperiod2, timeperiod3=timeperiod3)

    if sequential:
        return res
    else:
        return None if np.isnan(res[-1]) else res[-1]
Пример #13
0
def extract_features(data):
    high = data['High']
    low = data['Low']
    close = data['Close']
    volume = data['Volume']
    open_ = data['Open']

    data['ADX'] = ta.ADX(high, low, close, timeperiod=19)
    data['CCI'] = ta.CCI(high, low, close, timeperiod=19)
    data['CMO'] = ta.CMO(close, timeperiod=14)
    data['MACD'], X, Y = ta.MACD(close,
                                 fastperiod=10,
                                 slowperiod=30,
                                 signalperiod=9)
    data['MFI'] = ta.MFI(high, low, close, volume, timeperiod=19)
    data['MOM'] = ta.MOM(close, timeperiod=9)
    data['ROCR'] = ta.ROCR(close, timeperiod=12)
    data['RSI'] = ta.RSI(close, timeperiod=19)
    data['STOCHSLOWK'], data['STOCHSLOWD'] = ta.STOCH(high,
                                                      low,
                                                      close,
                                                      fastk_period=5,
                                                      slowk_period=3,
                                                      slowk_matype=0,
                                                      slowd_period=3,
                                                      slowd_matype=0)
    data['TRIX'] = ta.TRIX(close, timeperiod=30)
    data['WILLR'] = ta.WILLR(high, low, close, timeperiod=14)
    data['OBV'] = ta.OBV(close, volume)
    data['TSF'] = ta.TSF(close, timeperiod=14)
    data['NATR'] = ta.NATR(high, low, close)  #, timeperiod=14)
    data['ULTOSC'] = ta.ULTOSC(high, low, close)
    data['AROONOSC'] = ta.AROONOSC(high, low, timeperiod=14)
    data['BOP'] = ta.BOP(open_, high, low, close)
    data['LINEARREG'] = ta.LINEARREG(close)
    data['AP0'] = ta.APO(close, fastperiod=9, slowperiod=23, matype=1)
    data['TEMA'] = ta.TRIMA(close, 29)

    return data
Пример #14
0
def generate_tech_data(stock, open_name, close_name, high_name, low_name, max_time_window=10):
    open_price = stock[open_name].values
    close_price = stock[close_name].values
    low_price = stock[low_name].values
    high_price = stock[high_name].values
    data = pd.DataFrame(stock)
    data['MOM'] = talib.MOM(close_price, timeperiod=max_time_window)
    # data['_SMA'] = talib.SMA(close_price)
    data['HT_DCPERIOD'] = talib.HT_DCPERIOD(close_price)
    data['HT_DCPHASE'] = talib.HT_DCPHASE(close_price)
    data['sine'], data['leadsine'] = talib.HT_SINE(close_price)
    data['inphase'], data['quadrature'] = talib.HT_PHASOR(close_price)
    # data['_HT_TRENDMODE'] = talib.HT_TRENDMODE(close_price)
    # data['_SAREXT'] = talib.SAREXT(high_price, low_price)
    # data['_ADX'] = talib.ADX(high_price, low_price, close_price)
    data['ADXR'] = talib.ADXR(high_price, low_price, close_price, timeperiod=max_time_window)
    data['APO'] = talib.APO(close_price, fastperiod=max_time_window // 2, slowperiod=max_time_window)
    data['AROON_UP'], _ = talib.AROON(high_price, low_price, timeperiod=max_time_window)
    # data['_BOP'] = talib.BOP(open_price, high_price, low_price, close_price)
    data['CCI'] = talib.CCI(high_price, low_price, close_price, timeperiod=max_time_window)
    data['PLUS_DI'] = talib.PLUS_DI(high_price, low_price, close_price, timeperiod=max_time_window)
    # data['_PLUS_DM'] = talib.PLUS_DM(high_price, low_price)
    data['PPO'] = talib.PPO(close_price, fastperiod=max_time_window // 2, slowperiod=max_time_window)
    data['macd'], data['macd_sig'], data['macd_hist'] = talib.MACD(close_price, fastperiod=max_time_window // 2, slowperiod=max_time_window, signalperiod=max_time_window // 2)
    data['CMO'] = talib.CMO(close_price, timeperiod=max_time_window)
    #     data['ROC'] = talib.ROC(close_price)
    data['ROCP'] = talib.ROCP(close_price, timeperiod=max_time_window)
    #     data['ROCR'] = talib.ROCR(close_price)
    #     data['slowk'], data['slowd'] = talib.STOCH(high_price, low_price, close_price)
    data['fastk'], data['fastd'] = talib.STOCHF(high_price, low_price, close_price)
    data['TRIX'] = talib.TRIX(close_price, timeperiod=max_time_window)
    data['ULTOSC'] = talib.ULTOSC(high_price, low_price, close_price, timeperiod1=max_time_window // 2, timeperiod2=max_time_window, timeperiod3=max_time_window * 2)
    data['WILLR'] = talib.WILLR(high_price, low_price, close_price, timeperiod=max_time_window)
    data['NATR'] = talib.NATR(high_price, low_price, close_price, timeperiod=max_time_window)
    # data['_TRANGE'] = talib.TRANGE(high_price, low_price, close_price)
    data = data.drop([open_name, close_name, high_name, low_name], axis=1)
    #     data.columns=data.columns.map(lambda x:x[1:])
    data = data.dropna().astype(np.float32)
    return data
Пример #15
0
def create_Indicators(data):
    dfs = data

    df = dfs.copy()

    df['ADX'] = talib.ADX(df.high, df.low, df.close, timeperiod=14)
    df['ADXR'] = talib.ADXR(df.high, df.low, df.close, timeperiod=14)
    df['APO'] = talib.APO(df.close, fastperiod=12, slowperiod=26, matype=0)
    df['AROONOSC'] = talib.AROONOSC(df.high, df.low, timeperiod=14)
    df['BOP'] = talib.BOP(
        df.open, df.high, df.low,
        df.close)  #  (Close price – Open price) / (High price – Low price)
    df["CCI"] = talib.CCI(df.high, df.low, df.close, timeperiod=14)
    df["CMO"] = talib.CMO(df.close, timeperiod=14)
    df["DX"] = talib.DX(df.high, df.low, df.close, timeperiod=14)
    #df["MFI"] = talib.MFI(df.high, df.low, df.close, df.volume, timeperiod=14).pct_change()
    df["MINUS_DI"] = talib.MINUS_DI(df.high, df.low, df.close, timeperiod=14)
    df["MINUS_DM"] = talib.MINUS_DM(df.high, df.low, timeperiod=14)
    df["MOM"] = talib.MOM(df.close, timeperiod=10)
    df["PLUS_DI"] = talib.PLUS_DI(df.high, df.low, df.close, timeperiod=14)
    df["PLUS_DM"] = talib.PLUS_DM(df.high, df.low, timeperiod=14)
    #X_corr["PPO"] = PPO(df.close, fastperiod=12, sdf.lowperiod=26, matype=0)
    df["ROC"] = talib.ROC(df.close, timeperiod=10)
    df["ROCP"] = talib.ROCP(df.close, timeperiod=10)
    df["ROCR"] = talib.ROCR(df.close, timeperiod=10)
    df["ROCR100"] = talib.ROCR100(df.close, timeperiod=10)
    df["RSI"] = talib.RSI(df.close, timeperiod=14)
    #sdf.lowk, sdf.lowd = STOCH(df.high, df.low, df.close, fastk_period=5, sdf.lowk_period=3, sdf.lowk_matype=0, sdf.lowd_period=3, sdf.lowd_matype=0)
    df["TRIX"] = talib.TRIX(df.close, timeperiod=30)
    df["ULTOSC"] = talib.ULTOSC(df.high,
                                df.low,
                                df.close,
                                timeperiod1=7,
                                timeperiod2=14,
                                timeperiod3=28)
    df["WILLR"] = talib.WILLR(df.high, df.low, df.close, timeperiod=14)

    return df
Пример #16
0
def TKE(dataframe, *, length=14, emaperiod=5):
    """
    Source: https://www.tradingview.com/script/Pcbvo0zG/
    Author: Dr Yasar ERDINC

    The calculation is simple:
    TKE=(RSI+STOCHASTIC+ULTIMATE OSCILLATOR+MFI+WIILIAMS %R+MOMENTUM+CCI)/7
    Buy signal: when TKE crosses above 20 value
    Oversold region: under 20 value
    Overbought region: over 80 value

    Another usage of TKE is with its EMA ,
    the default value is defined as 5 bars of EMA of the TKE line,
    Go long: when TKE crosses above EMALine
    Go short: when TKE crosses below EMALine

    Usage:
        `dataframe['TKE'], dataframe['TKEema'] = TKE1(dataframe)`
    """
    import talib.abstract as ta

    df = dataframe.copy()
    # TKE=(RSI+STOCHASTIC+ULTIMATE OSCILLATOR+MFI+WIILIAMS %R+MOMENTUM+CCI)/7
    df["rsi"] = ta.RSI(df, timeperiod=length)
    df["stoch"] = (100 *
                   (df["close"] - df["low"].rolling(window=length).min()) /
                   (df["high"].rolling(window=length).max() -
                    df["low"].rolling(window=length).min()))

    df["ultosc"] = ta.ULTOSC(df, timeperiod1=7, timeperiod2=14, timeperiod3=28)
    df["mfi"] = ta.MFI(df, timeperiod=length)
    df["willr"] = ta.WILLR(df, timeperiod=length)
    df["mom"] = ta.ROCR100(df, timeperiod=length)
    df["cci"] = ta.CCI(df, timeperiod=length)
    df["TKE"] = df[["rsi", "stoch", "ultosc", "mfi", "willr", "mom",
                    "cci"]].mean(axis="columns")
    df["TKEema"] = ta.EMA(df["TKE"], timeperiod=emaperiod)
    return df["TKE"], df["TKEema"]
Пример #17
0
def add_ULTOSC(self,
               timeperiod=14,
               timeperiod2=14,
               timeperiod3=28,
               type='line',
               color='secondary',
               **kwargs):
    """Ultimate Oscillator."""

    if not (self.has_high and self.has_low and self.has_close):
        raise Exception()

    utils.kwargs_check(kwargs, VALID_TA_KWARGS)
    if 'kind' in kwargs:
        type = kwargs['kind']

    name = 'ULTOSC({})'.format(str(timeperiod), str(timeperiod2),
                               str(timeperiod3))
    self.sec[name] = dict(type=type, color=color)
    self.ind[name] = talib.ULTOSC(self.df[self.hi].values,
                                  self.df[self.lo].values,
                                  self.df[self.cl].values, timeperiod,
                                  timeperiod2, timeperiod3)
def Feature_Extraction_Momentum(df):
    df = SOK(df)
    df = SOD(df)
    df = SOJ(df)
    df = MACD(df)
    df = MACD_Signal(df)
    df = MACD_Hist(df)
    df['RSI'] = tas.RSI(df['close'].values)
    df['ROC'] = tas.ROC(df['close'].values)
    df['WillR'] = tas.WILLR(df['high'].values, df['low'].values,
                            df['close'].values)
    df['CCI'] = tas.CCI(df['high'].values, df['low'].values,
                        df['close'].values)
    df['TSI'] = tsi(df['close'], window_slow=25, window_fast=13)
    df['ADX'] = tas.ADX(df['high'].values, df['low'].values,
                        df['close'].values)
    df['MFI'] = tas.MFI(df['high'], df['low'], df['close'], df['volume'])
    df['MOM'] = tas.MOM(df['close'])
    df['TRIX'] = tas.TRIX(df['close'])
    df['ULTOSC'] = tas.ULTOSC(df['high'], df['low'], df['close'])

    df = df.fillna(0)
    return df
    def UltOsc(self, df, t1=7, t2=14, t3=28):
        """ Ultimate Oscillator
            Uses weighted sums of three oscillators, designed to capture
            momentum across three different timeframes, each of which uses
            a different time period

            Args:
                high, low, close: HLC of instrument
                t1, t2, t3: various time periods in the calculation,
                            default: 7,14,28
                feature_dict: Dictionary of added features
            Return:
                UO signal
                feature_dict
        """
        t1t = 'UltOsc_t1' + str(t1)
        t2t = '_t2' + str(t2)
        t3t = '_t3' + str(t3)
        col_name = t1t + t2t + t3t
        current_feature['Latest'] = col_name
        feature_dict[col_name] = 'Keep'
        df[col_name] = ta.ULTOSC(df.High, df.Low, df.Close, t1, t2, t3)
        return df
Пример #20
0
    def preprocess_data(self):
        """calculate returns and percentiles, then removes missing values"""

        self.data['returns'] = self.data.Close.pct_change()
        self.data['ret_2'] = self.data.Close.pct_change(2)
        self.data['ret_5'] = self.data.Close.pct_change(5)
        self.data['ret_10'] = self.data.Close.pct_change(10)
        self.data['ret_21'] = self.data.Close.pct_change(21)
        self.data['rsi'] = talib.STOCHRSI(self.data.Close)[1]
        self.data['macd'] = talib.MACD(self.data.Close)[1]
        self.data['atr'] = talib.ATR(self.data.High, self.data.Low,
                                     self.data.Close)

        slowk, slowd = talib.STOCH(self.data.High, self.data.Low,
                                   self.data.Close)
        self.data['stoch'] = slowd - slowk
        self.data['atr'] = talib.ATR(self.data.High, self.data.Low,
                                     self.data.Close)
        self.data['ultosc'] = talib.ULTOSC(self.data.High, self.data.Low,
                                           self.data.Close)
        self.data = (self.data.replace(
            (np.inf, -np.inf), np.nan).drop([
                'High', 'Low', 'Close', 'Volume', 'Symbol', 'Volume ETH',
                'Volume BTC', 'Unix Timestamp'
            ],
                                            axis=1).dropna())

        r = self.data.returns.copy()
        if self.normalize:
            self.data = pd.DataFrame(scale(self.data),
                                     columns=self.data.columns,
                                     index=self.data.index)
        features = self.data.columns.drop('returns')
        self.data['returns'] = r  # don't scale returns
        self.data = self.data.loc[:, ['returns'] + list(features)]
        log.info(self.data.info())
Пример #21
0
    def extract_by_type(feature_type,
                        open_prices=None,
                        close_prices=None,
                        high_prices=None,
                        low_prices=None):

        if feature_type == 'ROCP':
            rocp1 = talib.ROCP(close_prices, timeperiod=1)
            rocp2 = talib.ROCP(close_prices, timeperiod=2)
            feature.append(rocp1)
            feature.append(rocp2)
        if feature_type == 'OROCP':
            orocp = talib.ROCP(open_prices, timeperiod=1)
            feature.append(orocp)
        if feature_type == 'HROCP':
            hrocp = talib.ROCP(high_prices, timeperiod=1)
            feature.append(hrocp)
        if feature_type == 'LROCP':
            lrocp = talib.ROCP(low_prices, timeperiod=1)
            feature.append(lrocp)
        if feature_type == 'MACD':
            macd, signal, hist = talib.MACD(close_prices,
                                            fastperiod=12,
                                            slowperiod=26,
                                            signalperiod=9)
            norm_macd = numpy.nan_to_num(macd) / math.sqrt(
                numpy.var(numpy.nan_to_num(macd)))
            norm_signal = numpy.nan_to_num(signal) / math.sqrt(
                numpy.var(numpy.nan_to_num(signal)))
            norm_hist = numpy.nan_to_num(hist) / math.sqrt(
                numpy.var(numpy.nan_to_num(hist)))
            macdrocp = talib.ROCP(norm_macd + numpy.max(norm_macd) -
                                  numpy.min(norm_macd),
                                  timeperiod=1)
            signalrocp = talib.ROCP(norm_signal + numpy.max(norm_signal) -
                                    numpy.min(norm_signal),
                                    timeperiod=1)
            histrocp = talib.ROCP(norm_hist + numpy.max(norm_hist) -
                                  numpy.min(norm_hist),
                                  timeperiod=1)
            # feature.append(macd / 100.0)
            # feature.append(signal / 100.0)
            # feature.append(hist / 100.0)
            feature.append(norm_macd)
            feature.append(norm_signal)
            feature.append(norm_hist)

            feature.append(macdrocp)
            feature.append(signalrocp)
            feature.append(histrocp)
        if feature_type == 'RSI':
            rsi6 = talib.RSI(close_prices, timeperiod=6)
            rsi12 = talib.RSI(close_prices, timeperiod=12)
            rsi24 = talib.RSI(close_prices, timeperiod=24)
            rsi6rocp = talib.ROCP(rsi6 + 100., timeperiod=1)
            rsi12rocp = talib.ROCP(rsi12 + 100., timeperiod=1)
            rsi24rocp = talib.ROCP(rsi24 + 100., timeperiod=1)
            feature.append(rsi6 / 100.0 - 0.5)
            feature.append(rsi12 / 100.0 - 0.5)
            feature.append(rsi24 / 100.0 - 0.5)
            # feature.append(numpy.maximum(rsi6 / 100.0 - 0.8, 0))
            # feature.append(numpy.maximum(rsi12 / 100.0 - 0.8, 0))
            # feature.append(numpy.maximum(rsi24 / 100.0 - 0.8, 0))
            # feature.append(numpy.minimum(rsi6 / 100.0 - 0.2, 0))
            # feature.append(numpy.minimum(rsi6 / 100.0 - 0.2, 0))
            # feature.append(numpy.minimum(rsi6 / 100.0 - 0.2, 0))
            # feature.append(numpy.maximum(numpy.minimum(rsi6 / 100.0 - 0.5, 0.3), -0.3))
            # feature.append(numpy.maximum(numpy.minimum(rsi6 / 100.0 - 0.5, 0.3), -0.3))
            # feature.append(numpy.maximum(numpy.minimum(rsi6 / 100.0 - 0.5, 0.3), -0.3))
            feature.append(rsi6rocp)
            feature.append(rsi12rocp)
            feature.append(rsi24rocp)
        if feature_type == 'UO':
            ult_osc = talib.ULTOSC(high_prices,
                                   low_prices,
                                   close_prices,
                                   timeperiod1=7,
                                   timeperiod2=14,
                                   timeperiod3=28)
            feature.append(ult_osc / 100.0 - 0.5)
        if feature_type == 'BOLL':
            upperband, middleband, lowerband = talib.BBANDS(close_prices,
                                                            timeperiod=5,
                                                            nbdevup=2,
                                                            nbdevdn=2,
                                                            matype=0)
            feature.append((upperband - close_prices) / close_prices)
            feature.append((middleband - close_prices) / close_prices)
            feature.append((lowerband - close_prices) / close_prices)
        if feature_type == 'MA':
            ma5 = talib.MA(close_prices, timeperiod=5)
            ma10 = talib.MA(close_prices, timeperiod=10)
            ma20 = talib.MA(close_prices, timeperiod=20)
            ma25 = talib.MA(close_prices, timeperiod=25)
            ma30 = talib.MA(close_prices, timeperiod=30)
            ma40 = talib.MA(close_prices, timeperiod=40)
            ma50 = talib.MA(close_prices, timeperiod=50)
            ma60 = talib.MA(close_prices, timeperiod=60)
            #ma360 = talib.MA(close_prices, timeperiod=70)
            #ma720 = talib.MA(close_prices, timeperiod=720)
            ma5rocp = talib.ROCP(ma5, timeperiod=1)
            ma10rocp = talib.ROCP(ma10, timeperiod=1)
            ma20rocp = talib.ROCP(ma20, timeperiod=1)
            ma25rocp = talib.ROCP(ma25, timeperiod=1)
            ma30rocp = talib.ROCP(ma30, timeperiod=1)
            ma40rocp = talib.ROCP(ma40, timeperiod=1)
            ma50rocp = talib.ROCP(ma50, timeperiod=1)
            ma60rocp = talib.ROCP(ma60, timeperiod=1)
            #ma360rocp = talib.ROCP(ma360, timeperiod=1)
            #ma720rocp = talib.ROCP(ma720, timeperiod=1)
            feature.append(ma5rocp)
            feature.append(ma10rocp)
            feature.append(ma20rocp)
            feature.append(ma25rocp)
            feature.append(ma30rocp)
            feature.append(ma40rocp)
            feature.append(ma50rocp)
            feature.append(ma60rocp)
            #feature.append(ma360rocp)
            #feature.append(ma720rocp)
            feature.append((ma5 - close_prices) / close_prices)
            feature.append((ma10 - close_prices) / close_prices)
            feature.append((ma20 - close_prices) / close_prices)
            feature.append((ma25 - close_prices) / close_prices)
            feature.append((ma30 - close_prices) / close_prices)
            feature.append((ma40 - close_prices) / close_prices)
            feature.append((ma50 - close_prices) / close_prices)
            feature.append((ma60 - close_prices) / close_prices)
            #feature.append((ma360 - close_prices) / close_prices)
            #feature.append((ma720 - close_prices) / close_prices)
        if feature_type == 'STOCH':
            slow_stoch_k, slow_stoch_d = talib.STOCH(high_prices,
                                                     low_prices,
                                                     close_prices,
                                                     fastk_period=5,
                                                     slowk_period=3,
                                                     slowk_matype=0,
                                                     slowd_period=3,
                                                     slowd_matype=0)
            fast_stoch_k, fast_stoch_d = talib.STOCHF(high_prices,
                                                      low_prices,
                                                      close_prices,
                                                      fastk_period=5,
                                                      fastd_period=3,
                                                      fastd_matype=0)
            fast_rsi_k, fast_rsi_d = talib.STOCHRSI(close_prices,
                                                    timeperiod=14,
                                                    fastk_period=5,
                                                    fastd_period=3,
                                                    fastd_matype=0)
            feature.append(slow_stoch_k / 100.0 - 0.5)
            feature.append(slow_stoch_d / 100.0 - 0.5)
            feature.append(fast_stoch_k / 100.0 - 0.5)
            feature.append(fast_stoch_d / 100.0 - 0.5)
            feature.append(fast_rsi_k / 100.0 - 0.5)
            feature.append(fast_rsi_d / 100.0 - 0.5)
        if feature_type == 'AO':
            median_price = (high_prices + low_prices) / 2
            ao = talib.SMA(median_price, 5) - talib.SMA(median_price, 34)
            feature.append(ao)
        if feature_type == 'ROC':
            roc5 = talib.ROC(close_prices, timeperiod=5)
            roc10 = talib.ROC(close_prices, timeperiod=10)
            roc20 = talib.ROC(close_prices, timeperiod=20)
            roc25 = talib.ROC(close_prices, timeperiod=25)
            feature.append(roc5)
            feature.append(roc10)
            feature.append(roc20)
            feature.append(roc25)
        if feature_type == 'WILLR':
            willr = talib.WILLR(high_prices,
                                low_prices,
                                close_prices,
                                timeperiod=14)
            feature.append(willr / 100.0 - 0.5)

        return feature
Пример #22
0
def generate_tech_data(stock,
                       open_name,
                       close_name,
                       high_name,
                       low_name,
                       max_time_window=10):
    open_price = stock[open_name].values
    close_price = stock[close_name].values
    low_price = stock[low_name].values
    high_price = stock[high_name].values
    data = stock.copy()
    data['MOM'] = talib.MOM(close_price, timeperiod=max_time_window)
    data['HT_DCPERIOD'] = talib.HT_DCPERIOD(close_price)
    data['HT_DCPHASE'] = talib.HT_DCPHASE(close_price)
    data['sine'], data['leadsine'] = talib.HT_SINE(close_price)
    data['inphase'], data['quadrature'] = talib.HT_PHASOR(close_price)
    data['ADXR'] = talib.ADXR(high_price,
                              low_price,
                              close_price,
                              timeperiod=max_time_window)
    data['APO'] = talib.APO(close_price,
                            fastperiod=max_time_window // 2,
                            slowperiod=max_time_window)
    data['AROON_UP'], _ = talib.AROON(high_price,
                                      low_price,
                                      timeperiod=max_time_window)
    data['CCI'] = talib.CCI(high_price,
                            low_price,
                            close_price,
                            timeperiod=max_time_window)
    data['PLUS_DI'] = talib.PLUS_DI(high_price,
                                    low_price,
                                    close_price,
                                    timeperiod=max_time_window)
    data['PPO'] = talib.PPO(close_price,
                            fastperiod=max_time_window // 2,
                            slowperiod=max_time_window)
    data['macd'], data['macd_sig'], data['macd_hist'] = talib.MACD(
        close_price,
        fastperiod=max_time_window // 2,
        slowperiod=max_time_window,
        signalperiod=max_time_window // 2)
    data['CMO'] = talib.CMO(close_price, timeperiod=max_time_window)
    data['ROCP'] = talib.ROCP(close_price, timeperiod=max_time_window)
    data['fastk'], data['fastd'] = talib.STOCHF(high_price, low_price,
                                                close_price)
    data['TRIX'] = talib.TRIX(close_price, timeperiod=max_time_window)
    data['ULTOSC'] = talib.ULTOSC(high_price,
                                  low_price,
                                  close_price,
                                  timeperiod1=max_time_window // 2,
                                  timeperiod2=max_time_window,
                                  timeperiod3=max_time_window * 2)
    data['WILLR'] = talib.WILLR(high_price,
                                low_price,
                                close_price,
                                timeperiod=max_time_window)
    data['NATR'] = talib.NATR(high_price,
                              low_price,
                              close_price,
                              timeperiod=max_time_window)
    data = data.drop([open_name, close_name, high_name, low_name], axis=1)
    data = data.dropna().astype(np.float32)
    return data
Пример #23
0
def get_factors(index,
                Open,
                Close,
                High,
                Low,
                Volume,
                rolling=26,
                drop=False,
                normalization=True):
    tmp = pd.DataFrame()
    tmp['tradeTime'] = index

    # 累积/派发线(Accumulation / Distribution Line,该指标将每日的成交量通过价格加权累计,
    # 用以计算成交量的动量。属于趋势型因子
    tmp['AD'] = talib.AD(High, Low, Close, Volume)

    # 佳庆指标(Chaikin Oscillator),该指标基于AD曲线的指数移动均线而计算得到。属于趋势型因子
    tmp['ADOSC'] = talib.ADOSC(High,
                               Low,
                               Close,
                               Volume,
                               fastperiod=3,
                               slowperiod=10)

    # 平均动向指数,DMI因子的构成部分。属于趋势型因子
    tmp['ADX'] = talib.ADX(High, Low, Close, timeperiod=14)

    # 相对平均动向指数,DMI因子的构成部分。属于趋势型因子
    tmp['ADXR'] = talib.ADXR(High, Low, Close, timeperiod=14)

    # 绝对价格振荡指数
    tmp['APO'] = talib.APO(Close, fastperiod=12, slowperiod=26)

    # Aroon通过计算自价格达到近期最高值和最低值以来所经过的期间数,帮助投资者预测证券价格从趋势到区域区域或反转的变化,
    # Aroon指标分为Aroon、AroonUp和AroonDown3个具体指标。属于趋势型因子
    tmp['AROONDown'], tmp['AROONUp'] = talib.AROON(High, Low, timeperiod=14)
    tmp['AROONOSC'] = talib.AROONOSC(High, Low, timeperiod=14)

    # 均幅指标(Average TRUE Ranger),取一定时间周期内的股价波动幅度的移动平均值,
    # 是显示市场变化率的指标,主要用于研判买卖时机。属于超买超卖型因子。
    tmp['ATR14'] = talib.ATR(High, Low, Close, timeperiod=14)
    tmp['ATR6'] = talib.ATR(High, Low, Close, timeperiod=6)

    # 布林带
    tmp['Boll_Up'], tmp['Boll_Mid'], tmp['Boll_Down'] = talib.BBANDS(
        Close, timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)

    # 均势指标
    tmp['BOP'] = talib.BOP(Open, High, Low, Close)

    # 5日顺势指标(Commodity Channel Index),专门测量股价是否已超出常态分布范围。属于超买超卖型因子。
    tmp['CCI5'] = talib.CCI(High, Low, Close, timeperiod=5)
    tmp['CCI10'] = talib.CCI(High, Low, Close, timeperiod=10)
    tmp['CCI20'] = talib.CCI(High, Low, Close, timeperiod=20)
    tmp['CCI88'] = talib.CCI(High, Low, Close, timeperiod=88)

    # 钱德动量摆动指标(Chande Momentum Osciliator),与其他动量指标摆动指标如相对强弱指标(RSI)和随机指标(KDJ)不同,
    # 钱德动量指标在计算公式的分子中采用上涨日和下跌日的数据。属于超买超卖型因子
    tmp['CMO_Close'] = talib.CMO(Close, timeperiod=14)
    tmp['CMO_Open'] = talib.CMO(Close, timeperiod=14)

    # DEMA双指数移动平均线
    tmp['DEMA6'] = talib.DEMA(Close, timeperiod=6)
    tmp['DEMA12'] = talib.DEMA(Close, timeperiod=12)
    tmp['DEMA26'] = talib.DEMA(Close, timeperiod=26)

    # DX 动向指数
    tmp['DX'] = talib.DX(High, Low, Close, timeperiod=14)

    # EMA 指数移动平均线
    tmp['EMA6'] = talib.EMA(Close, timeperiod=6)
    tmp['EMA12'] = talib.EMA(Close, timeperiod=12)
    tmp['EMA26'] = talib.EMA(Close, timeperiod=26)

    # KAMA 适应性移动平均线
    tmp['KAMA'] = talib.KAMA(Close, timeperiod=30)

    # MACD
    tmp['MACD_DIF'], tmp['MACD_DEA'], tmp['MACD_bar'] = talib.MACD(
        Close, fastperiod=12, slowperiod=24, signalperiod=9)

    # 中位数价格 不知道是什么意思
    tmp['MEDPRICE'] = talib.MEDPRICE(High, Low)

    # 负向指标 负向运动
    tmp['MiNUS_DI'] = talib.MINUS_DI(High, Low, Close, timeperiod=14)
    tmp['MiNUS_DM'] = talib.MINUS_DM(High, Low, timeperiod=14)

    # 动量指标(Momentom Index),动量指数以分析股价波动的速度为目的,研究股价在波动过程中各种加速,
    # 减速,惯性作用以及股价由静到动或由动转静的现象。属于趋势型因子
    tmp['MOM'] = talib.MOM(Close, timeperiod=10)

    # 归一化平均值范围
    tmp['NATR'] = talib.NATR(High, Low, Close, timeperiod=14)

    # OBV 	能量潮指标(On Balance Volume,OBV),以股市的成交量变化来衡量股市的推动力,
    # 从而研判股价的走势。属于成交量型因子
    tmp['OBV'] = talib.OBV(Close, Volume)

    # PLUS_DI 更向指示器
    tmp['PLUS_DI'] = talib.PLUS_DI(High, Low, Close, timeperiod=14)
    tmp['PLUS_DM'] = talib.PLUS_DM(High, Low, timeperiod=14)

    # PPO 价格振荡百分比
    tmp['PPO'] = talib.PPO(Close, fastperiod=6, slowperiod=26, matype=0)

    # ROC 6日变动速率(Price Rate of Change),以当日的收盘价和N天前的收盘价比较,
    # 通过计算股价某一段时间内收盘价变动的比例,应用价格的移动比较来测量价位动量。属于超买超卖型因子。
    tmp['ROC6'] = talib.ROC(Close, timeperiod=6)
    tmp['ROC20'] = talib.ROC(Close, timeperiod=20)
    # 12日量变动速率指标(Volume Rate of Change),以今天的成交量和N天前的成交量比较,
    # 通过计算某一段时间内成交量变动的幅度,应用成交量的移动比较来测量成交量运动趋向,
    # 达到事先探测成交量供需的强弱,进而分析成交量的发展趋势及其将来是否有转势的意愿,
    # 属于成交量的反趋向指标。属于成交量型因子
    tmp['VROC6'] = talib.ROC(Volume, timeperiod=6)
    tmp['VROC20'] = talib.ROC(Volume, timeperiod=20)

    # ROC 6日变动速率(Price Rate of Change),以当日的收盘价和N天前的收盘价比较,
    # 通过计算股价某一段时间内收盘价变动的比例,应用价格的移动比较来测量价位动量。属于超买超卖型因子。
    tmp['ROCP6'] = talib.ROCP(Close, timeperiod=6)
    tmp['ROCP20'] = talib.ROCP(Close, timeperiod=20)
    # 12日量变动速率指标(Volume Rate of Change),以今天的成交量和N天前的成交量比较,
    # 通过计算某一段时间内成交量变动的幅度,应用成交量的移动比较来测量成交量运动趋向,
    # 达到事先探测成交量供需的强弱,进而分析成交量的发展趋势及其将来是否有转势的意愿,
    # 属于成交量的反趋向指标。属于成交量型因子
    tmp['VROCP6'] = talib.ROCP(Volume, timeperiod=6)
    tmp['VROCP20'] = talib.ROCP(Volume, timeperiod=20)

    # RSI
    tmp['RSI'] = talib.RSI(Close, timeperiod=14)

    # SAR 抛物线转向
    tmp['SAR'] = talib.SAR(High, Low, acceleration=0.02, maximum=0.2)

    # TEMA
    tmp['TEMA6'] = talib.TEMA(Close, timeperiod=6)
    tmp['TEMA12'] = talib.TEMA(Close, timeperiod=12)
    tmp['TEMA26'] = talib.TEMA(Close, timeperiod=26)

    # TRANGE 真实范围
    tmp['TRANGE'] = talib.TRANGE(High, Low, Close)

    # TYPPRICE 典型价格
    tmp['TYPPRICE'] = talib.TYPPRICE(High, Low, Close)

    # TSF 时间序列预测
    tmp['TSF'] = talib.TSF(Close, timeperiod=14)

    # ULTOSC 极限振子
    tmp['ULTOSC'] = talib.ULTOSC(High,
                                 Low,
                                 Close,
                                 timeperiod1=7,
                                 timeperiod2=14,
                                 timeperiod3=28)

    # 威廉指标
    tmp['WILLR'] = talib.WILLR(High, Low, Close, timeperiod=14)

    # 标准化
    if normalization:
        factors_list = tmp.columns.tolist()[1:]

        if rolling >= 26:
            for i in factors_list:
                tmp[i] = (tmp[i] - tmp[i].rolling(window=rolling, center=False).mean()) \
                         / tmp[i].rolling(window=rolling, center=False).std()
        elif rolling < 26 & rolling > 0:
            print('Recommended rolling range greater than 26')
        elif rolling <= 0:
            for i in factors_list:
                tmp[i] = (tmp[i] - tmp[i].mean()) / tmp[i].std()

    if drop:
        tmp.dropna(inplace=True)

    tmp.set_index('tradeTime', inplace=True)

    return tmp
Пример #24
0
def main():
    ohlcv = api_ohlcv('20191017')
    open, high, low, close, volume, timestamp = [], [], [], [], [], []

    for i in ohlcv:
        open.append(int(i[0]))
        high.append(int(i[1]))
        low.append(int(i[2]))
        close.append(int(i[3]))
        volume.append(float(i[4]))
        time_str = str(i[5])
        timestamp.append(
            datetime.fromtimestamp(int(
                time_str[:10])).strftime('%Y/%m/%d %H:%M:%M'))

    date_time_index = pd.to_datetime(
        timestamp)  # convert to DateTimeIndex type
    df = pd.DataFrame(
        {
            'open': open,
            'high': high,
            'low': low,
            'close': close,
            'volume': volume
        },
        index=date_time_index)
    # df.index += pd.offsets.Hour(9) # adjustment for JST if required
    print(df.shape)
    print(df.columns)

    # pct_change
    f = lambda x: 1 if x > 0.0001 else -1 if x < -0.0001 else 0 if -0.0001 <= x <= 0.0001 else np.nan
    y = df.rename(columns={
        'close': 'y'
    }).loc[:, 'y'].pct_change(1).shift(-1).fillna(0)
    X = df.copy()
    y_ = pd.DataFrame(y.map(f), columns=['y'])
    y = df.rename(columns={'close': 'y'}).loc[:, 'y'].pct_change(1).fillna(0)
    df_ = pd.concat([X, y_], axis=1)

    # check the shape
    print(
        '----------------------------------------------------------------------------------------'
    )
    print('X shape: (%i,%i)' % X.shape)
    print('y shape: (%i,%i)' % y_.shape)
    print(
        '----------------------------------------------------------------------------------------'
    )
    print(y_.groupby('y').size())
    print('y=1 up, y=0 stay, y=-1 down')
    print(
        '----------------------------------------------------------------------------------------'
    )

    # feature calculation
    open = pd.Series(df['open'])
    high = pd.Series(df['high'])
    low = pd.Series(df['low'])
    close = pd.Series(df['close'])
    volume = pd.Series(df['volume'])

    # pct_change for new column
    X['diff'] = y

    # Exponential Moving Average
    ema = talib.EMA(close, timeperiod=3)
    ema = ema.fillna(ema.mean())

    # Momentum
    momentum = talib.MOM(close, timeperiod=5)
    momentum = momentum.fillna(momentum.mean())

    # RSI
    rsi = talib.RSI(close, timeperiod=14)
    rsi = rsi.fillna(rsi.mean())

    # ADX
    adx = talib.ADX(high, low, close, timeperiod=14)
    adx = adx.fillna(adx.mean())

    # ADX change
    adx_change = adx.pct_change(1).shift(-1)
    adx_change = adx_change.fillna(adx_change.mean())

    # AD
    ad = talib.AD(high, low, close, volume)
    ad = ad.fillna(ad.mean())

    X_ = pd.concat([X, ema, momentum, rsi, adx_change, ad],
                   axis=1).drop(['open', 'high', 'low', 'close'], axis=1)
    X_.columns = ['volume', 'diff', 'ema', 'momentum', 'rsi', 'adx', 'ad']
    X_.join(y_).head(10)

    # default parameter models
    X_train, X_test, y_train, y_test = train_test_split(X_,
                                                        y_,
                                                        test_size=0.33,
                                                        random_state=42)
    print('X_train shape: {}'.format(X_train.shape))
    print('X_test shape: {}'.format(X_test.shape))
    print('y_train shape: {}'.format(y_train.shape))
    print('y_test shape: {}'.format(y_test.shape))

    pipe_knn = Pipeline([('scl', StandardScaler()),
                         ('est', KNeighborsClassifier(n_neighbors=3))])
    pipe_logistic = Pipeline([('scl', StandardScaler()),
                              ('est',
                               LogisticRegression(solver='lbfgs',
                                                  multi_class='multinomial',
                                                  random_state=39))])
    pipe_rf = Pipeline([('scl', StandardScaler()),
                        ('est', RandomForestClassifier(random_state=39))])
    pipe_gb = Pipeline([('scl', StandardScaler()),
                        ('est', GradientBoostingClassifier(random_state=39))])

    pipe_names = ['KNN', 'Logistic', 'RandomForest', 'GradientBoosting']
    pipe_lines = [pipe_knn, pipe_logistic, pipe_rf, pipe_gb]

    for (i, pipe) in enumerate(pipe_lines):
        pipe.fit(X_train, y_train.values.ravel())
        print(pipe)
        print('%s: %.3f' %
              (pipe_names[i] + ' Train Accuracy',
               accuracy_score(y_train.values.ravel(), pipe.predict(X_train))))
        print('%s: %.3f' %
              (pipe_names[i] + ' Test Accuracy',
               accuracy_score(y_test.values.ravel(), pipe.predict(X_test))))
        print('%s: %.3f' % (pipe_names[i] + ' Train F1 Score',
                            f1_score(y_train.values.ravel(),
                                     pipe.predict(X_train),
                                     average='micro')))
        print('%s: %.3f' % (pipe_names[i] + ' Test F1 Score',
                            f1_score(y_test.values.ravel(),
                                     pipe.predict(X_test),
                                     average='micro')))

    for (i, pipe) in enumerate(pipe_lines):
        predict = pipe.predict(X_test)
        cm = confusion_matrix(y_test.values.ravel(),
                              predict,
                              labels=[-1, 0, 1])
        print('{} Confusion Matrix'.format(pipe_names[i]))
        print(cm)

    ## Overlap Studies Functions
    # DEMA - Double Exponential Moving Average
    dema = talib.DEMA(close, timeperiod=3)
    dema = dema.fillna(dema.mean())
    print('DEMA - Double Exponential Moving Average shape: {}'.format(
        dema.shape))

    # EMA - Exponential Moving Average
    ema = talib.EMA(close, timeperiod=3)
    ema = ema.fillna(ema.mean())
    print('EMA - Exponential Moving Average shape: {}'.format(ema.shape))

    # HT_TRENDLINE - Hilbert Transform - Instantaneous Trendline
    hilbert = talib.HT_TRENDLINE(close)
    hilbert = hilbert.fillna(hilbert.mean())
    print(
        'HT_TRENDLINE - Hilbert Transform - Instantaneous Trendline shape: {}'.
        format(hilbert.shape))

    # KAMA - Kaufman Adaptive Moving Average
    kama = talib.KAMA(close, timeperiod=3)
    kama = kama.fillna(kama.mean())
    print('KAMA - Kaufman Adaptive Moving Average shape: {}'.format(
        kama.shape))

    # MA - Moving average
    ma = talib.MA(close, timeperiod=3, matype=0)
    ma = ma.fillna(ma.mean())
    print('MA - Moving average shape: {}'.format(kama.shape))

    # MIDPOINT - MidPoint over period
    midpoint = talib.MIDPOINT(close, timeperiod=7)
    midpoint = midpoint.fillna(midpoint.mean())
    print('MIDPOINT - MidPoint over period shape: {}'.format(midpoint.shape))

    # MIDPRICE - Midpoint Price over period
    midprice = talib.MIDPRICE(high, low, timeperiod=7)
    midprice = midprice.fillna(midprice.mean())
    print('MIDPRICE - Midpoint Price over period shape: {}'.format(
        midprice.shape))

    # SAR - Parabolic SAR
    sar = talib.SAR(high, low, acceleration=0, maximum=0)
    sar = sar.fillna(sar.mean())
    print('SAR - Parabolic SAR shape: {}'.format(sar.shape))

    # SAREXT - Parabolic SAR - Extended
    sarext = talib.SAREXT(high,
                          low,
                          startvalue=0,
                          offsetonreverse=0,
                          accelerationinitlong=0,
                          accelerationlong=0,
                          accelerationmaxlong=0,
                          accelerationinitshort=0,
                          accelerationshort=0,
                          accelerationmaxshort=0)
    sarext = sarext.fillna(sarext.mean())
    print('SAREXT - Parabolic SAR - Extended shape: {}'.format(sarext.shape))

    # SMA - Simple Moving Average
    sma = talib.SMA(close, timeperiod=3)
    sma = sma.fillna(sma.mean())
    print('SMA - Simple Moving Average shape: {}'.format(sma.shape))

    # T3 - Triple Exponential Moving Average (T3)
    t3 = talib.T3(close, timeperiod=5, vfactor=0)
    t3 = t3.fillna(t3.mean())
    print('T3 - Triple Exponential Moving Average shape: {}'.format(t3.shape))

    # TEMA - Triple Exponential Moving Average
    tema = talib.TEMA(close, timeperiod=3)
    tema = tema.fillna(tema.mean())
    print('TEMA - Triple Exponential Moving Average shape: {}'.format(
        tema.shape))

    # TRIMA - Triangular Moving Average
    trima = talib.TRIMA(close, timeperiod=3)
    trima = trima.fillna(trima.mean())
    print('TRIMA - Triangular Moving Average shape: {}'.format(trima.shape))

    # WMA - Weighted Moving Average
    wma = talib.WMA(close, timeperiod=3)
    wma = wma.fillna(wma.mean())
    print('WMA - Weighted Moving Average shape: {}'.format(wma.shape))

    ## Momentum Indicator Functions
    # ADX - Average Directional Movement Index
    adx = talib.ADX(high, low, close, timeperiod=14)
    adx = adx.fillna(adx.mean())
    print('ADX - Average Directional Movement Index shape: {}'.format(
        adx.shape))

    # ADXR - Average Directional Movement Index Rating
    adxr = talib.ADXR(high, low, close, timeperiod=7)
    adxr = adxr.fillna(adxr.mean())
    print('ADXR - Average Directional Movement Index Rating shape: {}'.format(
        adxr.shape))

    # APO - Absolute Price Oscillator
    apo = talib.APO(close, fastperiod=12, slowperiod=26, matype=0)
    apo = apo.fillna(apo.mean())
    print('APO - Absolute Price Oscillator shape: {}'.format(apo.shape))

    # AROONOSC - Aroon Oscillator
    aroon = talib.AROONOSC(high, low, timeperiod=14)
    aroon = aroon.fillna(aroon.mean())
    print('AROONOSC - Aroon Oscillator shape: {}'.format(apo.shape))

    # BOP - Balance Of Power
    bop = talib.BOP(open, high, low, close)
    bop = bop.fillna(bop.mean())
    print('BOP - Balance Of Power shape: {}'.format(apo.shape))

    # CCI - Commodity Channel Index
    cci = talib.CCI(high, low, close, timeperiod=7)
    cci = cci.fillna(cci.mean())
    print('CCI - Commodity Channel Index shape: {}'.format(cci.shape))

    # CMO - Chande Momentum Oscillator
    cmo = talib.CMO(close, timeperiod=7)
    cmo = cmo.fillna(cmo.mean())
    print('CMO - Chande Momentum Oscillator shape: {}'.format(cmo.shape))

    # DX - Directional Movement Index
    dx = talib.DX(high, low, close, timeperiod=7)
    dx = dx.fillna(dx.mean())
    print('DX - Directional Movement Index shape: {}'.format(dx.shape))

    # MFI - Money Flow Index
    mfi = talib.MFI(high, low, close, volume, timeperiod=7)
    mfi = mfi.fillna(mfi.mean())
    print('MFI - Money Flow Index shape: {}'.format(mfi.shape))

    # MINUS_DI - Minus Directional Indicator
    minusdi = talib.MINUS_DI(high, low, close, timeperiod=14)
    minusdi = minusdi.fillna(minusdi.mean())
    print('MINUS_DI - Minus Directional Indicator shape: {}'.format(
        minusdi.shape))

    # MINUS_DM - Minus Directional Movement
    minusdm = talib.MINUS_DM(high, low, timeperiod=14)
    minusdm = minusdm.fillna(minusdm.mean())
    print('MINUS_DM - Minus Directional Movement shape: {}'.format(
        minusdm.shape))

    # MOM - Momentum
    mom = talib.MOM(close, timeperiod=5)
    mom = mom.fillna(mom.mean())
    print('MOM - Momentum shape: {}'.format(mom.shape))

    # PLUS_DI - Plus Directional Indicator
    plusdi = talib.PLUS_DI(high, low, close, timeperiod=14)
    plusdi = plusdi.fillna(plusdi.mean())
    print('PLUS_DI - Plus Directional Indicator shape: {}'.format(
        plusdi.shape))

    # PLUS_DM - Plus Directional Movement
    plusdm = talib.PLUS_DM(high, low, timeperiod=14)
    plusdm = plusdm.fillna(plusdm.mean())
    print('PLUS_DM - Plus Directional Movement shape: {}'.format(plusdi.shape))

    # PPO - Percentage Price Oscillator
    ppo = talib.PPO(close, fastperiod=12, slowperiod=26, matype=0)
    ppo = ppo.fillna(ppo.mean())
    print('PPO - Percentage Price Oscillator shape: {}'.format(ppo.shape))

    # ROC - Rate of change:((price/prevPrice)-1)*100
    roc = talib.ROC(close, timeperiod=10)
    roc = roc.fillna(roc.mean())
    print('ROC - Rate of change : ((price/prevPrice)-1)*100 shape: {}'.format(
        roc.shape))

    # RSI - Relative Strength Index
    rsi = talib.RSI(close, timeperiod=14)
    rsi = rsi.fillna(rsi.mean())
    print('RSI - Relative Strength Index shape: {}'.format(rsi.shape))

    # TRIX - 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
    trix = talib.TRIX(close, timeperiod=30)
    trix = trix.fillna(trix.mean())
    print('TRIX - 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA shape: {}'.
          format(trix.shape))

    # ULTOSC - Ultimate Oscillator
    ultosc = talib.ULTOSC(high,
                          low,
                          close,
                          timeperiod1=7,
                          timeperiod2=14,
                          timeperiod3=28)
    ultosc = ultosc.fillna(ultosc.mean())
    print('ULTOSC - Ultimate Oscillator shape: {}'.format(ultosc.shape))

    # WILLR - Williams'%R
    willr = talib.WILLR(high, low, close, timeperiod=7)
    willr = willr.fillna(willr.mean())
    print("WILLR - Williams'%R shape: {}".format(willr.shape))

    ## Volume Indicator Functions
    # AD - Chaikin A/D Line
    ad = talib.AD(high, low, close, volume)
    ad = ad.fillna(ad.mean())
    print('AD - Chaikin A/D Line shape: {}'.format(ad.shape))

    # ADOSC - Chaikin A/D Oscillator
    adosc = talib.ADOSC(high, low, close, volume, fastperiod=3, slowperiod=10)
    adosc = adosc.fillna(adosc.mean())
    print('ADOSC - Chaikin A/D Oscillator shape: {}'.format(adosc.shape))

    # OBV - On Balance Volume
    obv = talib.OBV(close, volume)
    obv = obv.fillna(obv.mean())
    print('OBV - On Balance Volume shape: {}'.format(obv.shape))

    ## Volatility Indicator Functions
    # ATR - Average True Range
    atr = talib.ATR(high, low, close, timeperiod=7)
    atr = atr.fillna(atr.mean())
    print('ATR - Average True Range shape: {}'.format(atr.shape))

    # NATR - Normalized Average True Range
    natr = talib.NATR(high, low, close, timeperiod=7)
    natr = natr.fillna(natr.mean())
    print('NATR - Normalized Average True Range shape: {}'.format(natr.shape))

    # TRANGE - True Range
    trange = talib.TRANGE(high, low, close)
    trange = trange.fillna(trange.mean())
    print('TRANGE - True Range shape: {}'.format(natr.shape))

    ## Price Transform Functions
    # AVGPRICE - Average Price
    avg = talib.AVGPRICE(open, high, low, close)
    avg = avg.fillna(avg.mean())
    print('AVGPRICE - Average Price shape: {}'.format(natr.shape))

    # MEDPRICE - Median Price
    medprice = talib.MEDPRICE(high, low)
    medprice = medprice.fillna(medprice.mean())
    print('MEDPRICE - Median Price shape: {}'.format(medprice.shape))

    # TYPPRICE - Typical Price
    typ = talib.TYPPRICE(high, low, close)
    typ = typ.fillna(typ.mean())
    print('TYPPRICE - Typical Price shape: {}'.format(typ.shape))

    # WCLPRICE - Weighted Close Price
    wcl = talib.WCLPRICE(high, low, close)
    wcl = wcl.fillna(wcl.mean())
    print('WCLPRICE - Weighted Close Price shape: {}'.format(wcl.shape))

    ## Cycle Indicator Functions
    # HT_DCPERIOD - Hilbert Transform - Dominant Cycle Period
    dcperiod = talib.HT_DCPERIOD(close)
    dcperiod = dcperiod.fillna(dcperiod.mean())
    print('HT_DCPERIOD - Hilbert Transform - Dominant Cycle Period shape: {}'.
          format(dcperiod.shape))

    # HT_DCPHASE - Hilbert Transform - Dominant Cycle Phase
    dcphase = talib.HT_DCPHASE(close)
    dcphase = dcphase.fillna(dcphase.mean())
    print('HT_DCPHASE - Hilbert Transform - Dominant Cycle Phase shape: {}'.
          format(dcperiod.shape))

    ## Statistic Functions
    # BETA - Beta
    beta = talib.BETA(high, low, timeperiod=3)
    beta = beta.fillna(beta.mean())
    print('BETA - Beta shape: {}'.format(beta.shape))

    # CORREL - Pearson's Correlation Coefficient(r)
    correl = talib.CORREL(high, low, timeperiod=30)
    correl = correl.fillna(correl.mean())
    print("CORREL - Pearson's Correlation Coefficient(r) shape: {}".format(
        beta.shape))

    # LINEARREG - Linear Regression
    linreg = talib.LINEARREG(close, timeperiod=7)
    linreg = linreg.fillna(linreg.mean())
    print("LINEARREG - Linear Regression shape: {}".format(linreg.shape))

    # STDDEV - Standard Deviation
    stddev = talib.STDDEV(close, timeperiod=5, nbdev=1)
    stddev = stddev.fillna(stddev.mean())
    print("STDDEV - Standard Deviation shape: {}".format(stddev.shape))

    # TSF - Time Series Forecast
    tsf = talib.TSF(close, timeperiod=7)
    tsf = tsf.fillna(tsf.mean())
    print("TSF - Time Series Forecast shape: {}".format(tsf.shape))

    # VAR - Variance
    var = talib.VAR(close, timeperiod=5, nbdev=1)
    var = var.fillna(var.mean())
    print("VAR - Variance shape: {}".format(var.shape))

    ## Feature DataFrame
    X_full = pd.concat([
        X, dema, ema, hilbert, kama, ma, midpoint, midprice, sar, sarext, sma,
        t3, tema, trima, wma, adx, adxr, apo, aroon, bop, cci, cmo, mfi,
        minusdi, minusdm, mom, plusdi, plusdm, ppo, roc, rsi, trix, ultosc,
        willr, ad, adosc, obv, atr, natr, trange, avg, medprice, typ, wcl,
        dcperiod, dcphase, beta, correl, linreg, stddev, tsf, var
    ],
                       axis=1).drop(['open', 'high', 'low', 'close'], axis=1)
    X_full.columns = [
        'volume', 'diff', 'dema', 'ema', 'hilbert', 'kama', 'ma', 'midpoint',
        'midprice', 'sar', 'sarext', 'sma', 't3', 'tema', 'trima', 'wma',
        'adx', 'adxr', 'apo', 'aroon', 'bop', 'cci', 'cmo', 'mfi', 'minusdi',
        'minusdm', 'mom', 'plusdi', 'plusdm', 'ppo', 'roc', 'rsi', 'trix',
        'ultosc', 'willr', 'ad', 'adosc', 'obv', 'atr', 'natr', 'trange',
        'avg', 'medprice', 'typ', 'wcl', 'dcperiod', 'dcphase', 'beta',
        'correl', 'linreg', 'stddev', 'tsf', 'var'
    ]
    X_full.join(y_).head(10)

    # full feature models
    X_train_full, X_test_full, y_train_full, y_test_full = train_test_split(
        X_full, y_, test_size=0.33, random_state=42)
    print('X_train shape: {}'.format(X_train_full.shape))
    print('X_test shape: {}'.format(X_test_full.shape))
    print('y_train shape: {}'.format(y_train_full.shape))
    print('y_test shape: {}'.format(y_test_full.shape))

    pipe_knn_full = Pipeline([('scl', StandardScaler()),
                              ('est', KNeighborsClassifier(n_neighbors=3))])
    pipe_logistic_full = Pipeline([
        ('scl', StandardScaler()),
        ('est',
         LogisticRegression(solver='lbfgs',
                            multi_class='multinomial',
                            random_state=39))
    ])
    pipe_rf_full = Pipeline([('scl', StandardScaler()),
                             ('est', RandomForestClassifier(random_state=39))])
    pipe_gb_full = Pipeline([('scl', StandardScaler()),
                             ('est',
                              GradientBoostingClassifier(random_state=39))])

    pipe_names = ['KNN', 'Logistic', 'RandomForest', 'GradientBoosting']
    pipe_lines_full = [
        pipe_knn_full, pipe_logistic_full, pipe_rf_full, pipe_gb_full
    ]

    for (i, pipe) in enumerate(pipe_lines_full):
        pipe.fit(X_train_full, y_train_full.values.ravel())
        print(pipe)
        print('%s: %.3f' % (pipe_names[i] + ' Train Accuracy',
                            accuracy_score(y_train_full.values.ravel(),
                                           pipe.predict(X_train_full))))
        print('%s: %.3f' % (pipe_names[i] + ' Test Accuracy',
                            accuracy_score(y_test_full.values.ravel(),
                                           pipe.predict(X_test_full))))
        print('%s: %.3f' % (pipe_names[i] + ' Train F1 Score',
                            f1_score(y_train_full.values.ravel(),
                                     pipe.predict(X_train_full),
                                     average='micro')))
        print('%s: %.3f' % (pipe_names[i] + ' Test F1 Score',
                            f1_score(y_test_full.values.ravel(),
                                     pipe.predict(X_test_full),
                                     average='micro')))

    # Univariate Statistics
    select = SelectPercentile(percentile=25)
    select.fit(X_train_full, y_train_full.values.ravel())
    X_train_selected = select.transform(X_train_full)
    X_test_selected = select.transform(X_test_full)
    # GradientBoost Classifier
    print(
        '--------------------------Without Univariate Statistics-------------------------------------'
    )
    pipe_gb = Pipeline([('scl', StandardScaler()),
                        ('est', GradientBoostingClassifier(random_state=39))])
    pipe_gb.fit(X_train_full, y_train_full.values.ravel())
    print('Train Accuracy: {:.3f}'.format(
        accuracy_score(y_train_full.values.ravel(),
                       pipe_gb.predict(X_train_full))))
    print('Test Accuracy: {:.3f}'.format(
        accuracy_score(y_test_full.values.ravel(),
                       pipe_gb.predict(X_test_full))))
    print('Train F1 Score: {:.3f}'.format(
        f1_score(y_train_full.values.ravel(),
                 pipe_gb.predict(X_train_full),
                 average='micro')))
    print('Test F1 Score: {:.3f}'.format(
        f1_score(y_test_full.values.ravel(),
                 pipe_gb.predict(X_test_full),
                 average='micro')))
    # GradientBoost Cllassifier with Univariate Statistics
    print(
        '---------------------------With Univariate Statistics--------------------------------------'
    )
    pipe_gb_percentile = Pipeline([
        ('scl', StandardScaler()),
        ('est', GradientBoostingClassifier(random_state=39))
    ])
    pipe_gb_percentile.fit(X_train_selected, y_train_full.values.ravel())
    print('Train Accuracy: {:.3f}'.format(
        accuracy_score(y_train_full.values.ravel(),
                       pipe_gb_percentile.predict(X_train_selected))))
    print('Test Accuracy: {:.3f}'.format(
        accuracy_score(y_test_full.values.ravel(),
                       pipe_gb_percentile.predict(X_test_selected))))
    print('Train F1 Score: {:.3f}'.format(
        f1_score(y_train_full.values.ravel(),
                 pipe_gb_percentile.predict(X_train_selected),
                 average='micro')))
    print('Test F1 Score: {:.3f}'.format(
        f1_score(y_test_full.values.ravel(),
                 pipe_gb_percentile.predict(X_test_selected),
                 average='micro')))

    # Model-based Selection
    select = SelectFromModel(RandomForestClassifier(n_estimators=100,
                                                    random_state=42),
                             threshold="1.25*mean")
    select.fit(X_train_full, y_train_full.values.ravel())
    X_train_model = select.transform(X_train_full)
    X_test_model = select.transform(X_test_full)
    # GradientBoost Classifier
    print(
        '--------------------------Without Model-based Selection--------------------------------------'
    )
    pipe_gb = Pipeline([('scl', StandardScaler()),
                        ('est', GradientBoostingClassifier(random_state=39))])
    pipe_gb.fit(X_train_full, y_train_full.values.ravel())
    print('Train Accuracy: {:.3f}'.format(
        accuracy_score(y_train_full.values.ravel(),
                       pipe_gb.predict(X_train_full))))
    print('Test Accuracy: {:.3f}'.format(
        accuracy_score(y_test_full.values.ravel(),
                       pipe_gb.predict(X_test_full))))
    print('Train F1 Score: {:.3f}'.format(
        f1_score(y_train_full.values.ravel(),
                 pipe_gb.predict(X_train_full),
                 average='micro')))
    print('Test F1 Score: {:.3f}'.format(
        f1_score(y_test_full.values.ravel(),
                 pipe_gb.predict(X_test_full),
                 average='micro')))
    # GradientBoost Classifier with Model-based Selection
    print(
        '----------------------------With Model-based Selection--------------------------------------'
    )
    pipe_gb_model = Pipeline([('scl', StandardScaler()),
                              ('est',
                               GradientBoostingClassifier(random_state=39))])
    pipe_gb_model.fit(X_train_model, y_train_full.values.ravel())
    print('Train Accuracy: {:.3f}'.format(
        accuracy_score(y_train_full.values.ravel(),
                       pipe_gb_model.predict(X_train_model))))
    print('Test Accuracy: {:.3f}'.format(
        accuracy_score(y_test_full.values.ravel(),
                       pipe_gb_model.predict(X_test_model))))
    print('Train F1 Score: {:.3f}'.format(
        f1_score(y_train_full.values.ravel(),
                 pipe_gb_model.predict(X_train_model),
                 average='micro')))
    print('Test F1 Score: {:.3f}'.format(
        f1_score(y_test_full.values.ravel(),
                 pipe_gb_model.predict(X_test_model),
                 average='micro')))

    # Recursive Feature Elimination
    select = RFE(RandomForestClassifier(n_estimators=100, random_state=42),
                 n_features_to_select=15)
    select.fit(X_train_full, y_train_full.values.ravel())
    X_train_rfe = select.transform(X_train_full)
    X_test_rfe = select.transform(X_test_full)
    # GradientBoost Classifier
    print(
        '--------------------------Without Recursive Feature Elimination-------------------------------------'
    )
    pipe_gb = Pipeline([('scl', StandardScaler()),
                        ('est', GradientBoostingClassifier(random_state=39))])
    pipe_gb.fit(X_train_full, y_train_full.values.ravel())
    print('Train Accuracy: {:.3f}'.format(
        accuracy_score(y_train_full.values.ravel(),
                       pipe_gb.predict(X_train_full))))
    print('Test Accuracy: {:.3f}'.format(
        accuracy_score(y_test_full.values.ravel(),
                       pipe_gb.predict(X_test_full))))
    print('Train F1 Score: {:.3f}'.format(
        f1_score(y_train_full.values.ravel(),
                 pipe_gb.predict(X_train_full),
                 average='micro')))
    print('Test F1 Score: {:.3f}'.format(
        f1_score(y_test_full.values.ravel(),
                 pipe_gb.predict(X_test_full),
                 average='micro')))
    # GradientBoost Classifier with Recursive Feature Elimination
    print(
        '----------------------------With Recursive Feature Elimination--------------------------------------'
    )
    pipe_gb_rfe = Pipeline([('scl', StandardScaler()),
                            ('est',
                             GradientBoostingClassifier(random_state=39))])
    pipe_gb_rfe.fit(X_train_rfe, y_train_full.values.ravel())
    print('Train Accuracy: {:.3f}'.format(
        accuracy_score(y_train_full.values.ravel(),
                       pipe_gb_rfe.predict(X_train_rfe))))
    print('Test Accuracy: {:.3f}'.format(
        accuracy_score(y_test_full.values.ravel(),
                       pipe_gb_rfe.predict(X_test_rfe))))
    print('Train F1 Score: {:.3f}'.format(
        f1_score(y_train_full.values.ravel(),
                 pipe_gb_rfe.predict(X_train_rfe),
                 average='micro')))
    print('Test F1 Score: {:.3f}'.format(
        f1_score(y_test_full.values.ravel(),
                 pipe_gb_rfe.predict(X_test_rfe),
                 average='micro')))

    cv = cross_val_score(pipe_gb,
                         X_,
                         y_.values.ravel(),
                         cv=StratifiedKFold(n_splits=10,
                                            shuffle=True,
                                            random_state=39))
    print('Cross validation with StratifiedKFold scores: {}'.format(cv))
    print('Cross Validation with StatifiedKFold mean: {}'.format(cv.mean()))

    # GridSearch
    n_features = len(df.columns)
    param_grid = {
        'learning_rate': [0.01, 0.1, 1, 10],
        'n_estimators': [1, 10, 100, 200, 300],
        'max_depth': [1, 2, 3, 4, 5]
    }
    stratifiedcv = StratifiedKFold(n_splits=10, shuffle=True, random_state=39)
    X_train, X_test, y_train, y_test = train_test_split(X_,
                                                        y_,
                                                        test_size=0.33,
                                                        random_state=42)

    grid_search = GridSearchCV(GradientBoostingClassifier(),
                               param_grid,
                               cv=stratifiedcv)
    grid_search.fit(X_train, y_train.values.ravel())
    print('GridSearch Train Accuracy: {:.3f}'.format(
        accuracy_score(y_train.values.ravel(), grid_search.predict(X_train))))
    print('GridSearch Test Accuracy: {:.3f}'.format(
        accuracy_score(y_test.values.ravel(), grid_search.predict(X_test))))
    print('GridSearch Train F1 Score: {:.3f}'.format(
        f1_score(y_train.values.ravel(),
                 grid_search.predict(X_train),
                 average='micro')))
    print('GridSearch Test F1 Score: {:.3f}'.format(
        f1_score(y_test.values.ravel(),
                 grid_search.predict(X_test),
                 average='micro')))

    # GridSearch results
    print("Best params:\n{}".format(grid_search.best_params_))
    print("Best cross-validation score: {:.2f}".format(
        grid_search.best_score_))
    results = pd.DataFrame(grid_search.cv_results_)
    corr_params = results.drop(results.columns[[
        0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20
    ]],
                               axis=1)
    corr_params.head()

    # GridSearch in nested
    cv_gb = cross_val_score(grid_search,
                            X_,
                            y_.values.ravel(),
                            cv=StratifiedKFold(n_splits=3,
                                               shuffle=True,
                                               random_state=39))
    print('Grid Search with nested cross validation scores: {}'.format(cv_gb))
    print('Grid Search with nested cross validation mean: {}'.format(
        cv_gb.mean()))
Пример #25
0
    def calculate(self, para):

        self.t = self.inputdata[:, 0]
        self.op = self.inputdata[:, 1]
        self.high = self.inputdata[:, 2]
        self.low = self.inputdata[:, 3]
        self.close = self.inputdata[:, 4]
        #adjusted close
        self.close1 = self.inputdata[:, 5]
        self.volume = self.inputdata[:, 6]
        #Overlap study

        #Overlap Studies
        #Overlap Studies
        if para is 'BBANDS':  #Bollinger Bands
            upperband, middleband, lowerband = ta.BBANDS(self.close,
                                                         timeperiod=self.tp,
                                                         nbdevup=2,
                                                         nbdevdn=2,
                                                         matype=0)
            self.output = [upperband, middleband, lowerband]

        elif para is 'DEMA':  #Double Exponential Moving Average
            self.output = ta.DEMA(self.close, timeperiod=self.tp)

        elif para is 'EMA':  #Exponential Moving Average
            self.output = ta.EMA(self.close, timeperiod=self.tp)

        elif para is 'HT_TRENDLINE':  #Hilbert Transform - Instantaneous Trendline
            self.output = ta.HT_TRENDLINE(self.close)

        elif para is 'KAMA':  #Kaufman Adaptive Moving Average
            self.output = ta.KAMA(self.close, timeperiod=self.tp)

        elif para is 'MA':  #Moving average
            self.output = ta.MA(self.close, timeperiod=self.tp, matype=0)

        elif para is 'MAMA':  #MESA Adaptive Moving Average
            mama, fama = ta.MAMA(self.close, fastlimit=0, slowlimit=0)

        elif para is 'MAVP':  #Moving average with variable period
            self.output = ta.MAVP(self.close,
                                  periods=10,
                                  minperiod=self.tp,
                                  maxperiod=self.tp1,
                                  matype=0)

        elif para is 'MIDPOINT':  #MidPoint over period
            self.output = ta.MIDPOINT(self.close, timeperiod=self.tp)

        elif para is 'MIDPRICE':  #Midpoint Price over period
            self.output = ta.MIDPRICE(self.high, self.low, timeperiod=self.tp)

        elif para is 'SAR':  #Parabolic SAR
            self.output = ta.SAR(self.high,
                                 self.low,
                                 acceleration=0,
                                 maximum=0)

        elif para is 'SAREXT':  #Parabolic SAR - Extended
            self.output = ta.SAREXT(self.high,
                                    self.low,
                                    startvalue=0,
                                    offsetonreverse=0,
                                    accelerationinitlong=0,
                                    accelerationlong=0,
                                    accelerationmaxlong=0,
                                    accelerationinitshort=0,
                                    accelerationshort=0,
                                    accelerationmaxshort=0)

        elif para is 'SMA':  #Simple Moving Average
            self.output = ta.SMA(self.close, timeperiod=self.tp)

        elif para is 'T3':  #Triple Exponential Moving Average (T3)
            self.output = ta.T3(self.close, timeperiod=self.tp, vfactor=0)

        elif para is 'TEMA':  #Triple Exponential Moving Average
            self.output = ta.TEMA(self.close, timeperiod=self.tp)

        elif para is 'TRIMA':  #Triangular Moving Average
            self.output = ta.TRIMA(self.close, timeperiod=self.tp)

        elif para is 'WMA':  #Weighted Moving Average
            self.output = ta.WMA(self.close, timeperiod=self.tp)

        #Momentum Indicators
        elif para is 'ADX':  #Average Directional Movement Index
            self.output = ta.ADX(self.high,
                                 self.low,
                                 self.close,
                                 timeperiod=self.tp)

        elif para is 'ADXR':  #Average Directional Movement Index Rating
            self.output = ta.ADXR(self.high,
                                  self.low,
                                  self.close,
                                  timeperiod=self.tp)

        elif para is 'APO':  #Absolute Price Oscillator
            self.output = ta.APO(self.close,
                                 fastperiod=12,
                                 slowperiod=26,
                                 matype=0)

        elif para is 'AROON':  #Aroon
            aroondown, aroonup = ta.AROON(self.high,
                                          self.low,
                                          timeperiod=self.tp)
            self.output = [aroondown, aroonup]

        elif para is 'AROONOSC':  #Aroon Oscillator
            self.output = ta.AROONOSC(self.high, self.low, timeperiod=self.tp)

        elif para is 'BOP':  #Balance Of Power
            self.output = ta.BOP(self.op, self.high, self.low, self.close)

        elif para is 'CCI':  #Commodity Channel Index
            self.output = ta.CCI(self.high,
                                 self.low,
                                 self.close,
                                 timeperiod=self.tp)

        elif para is 'CMO':  #Chande Momentum Oscillator
            self.output = ta.CMO(self.close, timeperiod=self.tp)

        elif para is 'DX':  #Directional Movement Index
            self.output = ta.DX(self.high,
                                self.low,
                                self.close,
                                timeperiod=self.tp)

        elif para is 'MACD':  #Moving Average Convergence/Divergence
            macd, macdsignal, macdhist = ta.MACD(self.close,
                                                 fastperiod=12,
                                                 slowperiod=26,
                                                 signalperiod=9)
            self.output = [macd, macdsignal, macdhist]
        elif para is 'MACDEXT':  #MACD with controllable MA type
            macd, macdsignal, macdhist = ta.MACDEXT(self.close,
                                                    fastperiod=12,
                                                    fastmatype=0,
                                                    slowperiod=26,
                                                    slowmatype=0,
                                                    signalperiod=9,
                                                    signalmatype=0)
            self.output = [macd, macdsignal, macdhist]
        elif para is 'MACDFIX':  #Moving Average Convergence/Divergence Fix 12/26
            macd, macdsignal, macdhist = ta.MACDFIX(self.close, signalperiod=9)
            self.output = [macd, macdsignal, macdhist]
        elif para is 'MFI':  #Money Flow Index
            self.output = ta.MFI(self.high,
                                 self.low,
                                 self.close,
                                 self.volume,
                                 timeperiod=self.tp)

        elif para is 'MINUS_DI':  #Minus Directional Indicator
            self.output = ta.MINUS_DI(self.high,
                                      self.low,
                                      self.close,
                                      timeperiod=self.tp)

        elif para is 'MINUS_DM':  #Minus Directional Movement
            self.output = ta.MINUS_DM(self.high, self.low, timeperiod=self.tp)

        elif para is 'MOM':  #Momentum
            self.output = ta.MOM(self.close, timeperiod=10)

        elif para is 'PLUS_DI':  #Plus Directional Indicator
            self.output = ta.PLUS_DI(self.high,
                                     self.low,
                                     self.close,
                                     timeperiod=self.tp)

        elif para is 'PLUS_DM':  #Plus Directional Movement
            self.output = ta.PLUS_DM(self.high, self.low, timeperiod=self.tp)

        elif para is 'PPO':  #Percentage Price Oscillator
            self.output = ta.PPO(self.close,
                                 fastperiod=12,
                                 slowperiod=26,
                                 matype=0)

        elif para is 'ROC':  #Rate of change : ((price/prevPrice)-1)*100
            self.output = ta.ROC(self.close, timeperiod=10)

        elif para is 'ROCP':  #Rate of change Percentage: (price-prevPrice)/prevPrice
            self.output = ta.ROCP(self.close, timeperiod=10)

        elif para is 'ROCR':  #Rate of change ratio: (price/prevPrice)
            self.output = ta.ROCR(self.close, timeperiod=10)

        elif para is 'ROCR100':  #Rate of change ratio 100 scale: (price/prevPrice)*100
            self.output = ta.ROCR100(self.close, timeperiod=10)

        elif para is 'RSI':  #Relative Strength Index
            self.output = ta.RSI(self.close, timeperiod=self.tp)

        elif para is 'STOCH':  #Stochastic
            slowk, slowd = ta.STOCH(self.high,
                                    self.low,
                                    self.close,
                                    fastk_period=5,
                                    slowk_period=3,
                                    slowk_matype=0,
                                    slowd_period=3,
                                    slowd_matype=0)
            self.output = [slowk, slowd]

        elif para is 'STOCHF':  #Stochastic Fast
            fastk, fastd = ta.STOCHF(self.high,
                                     self.low,
                                     self.close,
                                     fastk_period=5,
                                     fastd_period=3,
                                     fastd_matype=0)
            self.output = [fastk, fastd]

        elif para is 'STOCHRSI':  #Stochastic Relative Strength Index
            fastk, fastd = ta.STOCHRSI(self.close,
                                       timeperiod=self.tp,
                                       fastk_period=5,
                                       fastd_period=3,
                                       fastd_matype=0)
            self.output = [fastk, fastd]

        elif para is 'TRIX':  #1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
            self.output = ta.TRIX(self.close, timeperiod=self.tp)

        elif para is 'ULTOSC':  #Ultimate Oscillator
            self.output = ta.ULTOSC(self.high,
                                    self.low,
                                    self.close,
                                    timeperiod1=self.tp,
                                    timeperiod2=self.tp1,
                                    timeperiod3=self.tp2)

        elif para is 'WILLR':  #Williams' %R
            self.output = ta.WILLR(self.high,
                                   self.low,
                                   self.close,
                                   timeperiod=self.tp)

        # Volume Indicators    : #
        elif para is 'AD':  #Chaikin A/D Line
            self.output = ta.AD(self.high, self.low, self.close, self.volume)

        elif para is 'ADOSC':  #Chaikin A/D Oscillator
            self.output = ta.ADOSC(self.high,
                                   self.low,
                                   self.close,
                                   self.volume,
                                   fastperiod=3,
                                   slowperiod=10)

        elif para is 'OBV':  #On Balance Volume
            self.output = ta.OBV(self.close, self.volume)

    # Volatility Indicators: #
        elif para is 'ATR':  #Average True Range
            self.output = ta.ATR(self.high,
                                 self.low,
                                 self.close,
                                 timeperiod=self.tp)

        elif para is 'NATR':  #Normalized Average True Range
            self.output = ta.NATR(self.high,
                                  self.low,
                                  self.close,
                                  timeperiod=self.tp)

        elif para is 'TRANGE':  #True Range
            self.output = ta.TRANGE(self.high, self.low, self.close)

        #Price Transform      : #
        elif para is 'AVGPRICE':  #Average Price
            self.output = ta.AVGPRICE(self.op, self.high, self.low, self.close)

        elif para is 'MEDPRICE':  #Median Price
            self.output = ta.MEDPRICE(self.high, self.low)

        elif para is 'TYPPRICE':  #Typical Price
            self.output = ta.TYPPRICE(self.high, self.low, self.close)

        elif para is 'WCLPRICE':  #Weighted Close Price
            self.output = ta.WCLPRICE(self.high, self.low, self.close)

        #Cycle Indicators     : #
        elif para is 'HT_DCPERIOD':  #Hilbert Transform - Dominant Cycle Period
            self.output = ta.HT_DCPERIOD(self.close)

        elif para is 'HT_DCPHASE':  #Hilbert Transform - Dominant Cycle Phase
            self.output = ta.HT_DCPHASE(self.close)

        elif para is 'HT_PHASOR':  #Hilbert Transform - Phasor Components
            inphase, quadrature = ta.HT_PHASOR(self.close)
            self.output = [inphase, quadrature]

        elif para is 'HT_SINE':  #Hilbert Transform - SineWave #2
            sine, leadsine = ta.HT_SINE(self.close)
            self.output = [sine, leadsine]

        elif para is 'HT_TRENDMODE':  #Hilbert Transform - Trend vs Cycle Mode
            self.integer = ta.HT_TRENDMODE(self.close)

        #Pattern Recognition  : #
        elif para is 'CDL2CROWS':  #Two Crows
            self.integer = ta.CDL2CROWS(self.op, self.high, self.low,
                                        self.close)

        elif para is 'CDL3BLACKCROWS':  #Three Black Crows
            self.integer = ta.CDL3BLACKCROWS(self.op, self.high, self.low,
                                             self.close)

        elif para is 'CDL3INSIDE':  #Three Inside Up/Down
            self.integer = ta.CDL3INSIDE(self.op, self.high, self.low,
                                         self.close)

        elif para is 'CDL3LINESTRIKE':  #Three-Line Strike
            self.integer = ta.CDL3LINESTRIKE(self.op, self.high, self.low,
                                             self.close)

        elif para is 'CDL3OUTSIDE':  #Three Outside Up/Down
            self.integer = ta.CDL3OUTSIDE(self.op, self.high, self.low,
                                          self.close)

        elif para is 'CDL3STARSINSOUTH':  #Three Stars In The South
            self.integer = ta.CDL3STARSINSOUTH(self.op, self.high, self.low,
                                               self.close)

        elif para is 'CDL3WHITESOLDIERS':  #Three Advancing White Soldiers
            self.integer = ta.CDL3WHITESOLDIERS(self.op, self.high, self.low,
                                                self.close)

        elif para is 'CDLABANDONEDBABY':  #Abandoned Baby
            self.integer = ta.CDLABANDONEDBABY(self.op,
                                               self.high,
                                               self.low,
                                               self.close,
                                               penetration=0)

        elif para is 'CDLBELTHOLD':  #Belt-hold
            self.integer = ta.CDLBELTHOLD(self.op, self.high, self.low,
                                          self.close)

        elif para is 'CDLBREAKAWAY':  #Breakaway
            self.integer = ta.CDLBREAKAWAY(self.op, self.high, self.low,
                                           self.close)

        elif para is 'CDLCLOSINGMARUBOZU':  #Closing Marubozu
            self.integer = ta.CDLCLOSINGMARUBOZU(self.op, self.high, self.low,
                                                 self.close)

        elif para is 'CDLCONCEALBABYSWALL':  #Concealing Baby Swallow
            self.integer = ta.CDLCONCEALBABYSWALL(self.op, self.high, self.low,
                                                  self.close)

        elif para is 'CDLCOUNTERATTACK':  #Counterattack
            self.integer = ta.CDLCOUNTERATTACK(self.op, self.high, self.low,
                                               self.close)

        elif para is 'CDLDARKCLOUDCOVER':  #Dark Cloud Cover
            self.integer = ta.CDLDARKCLOUDCOVER(self.op,
                                                self.high,
                                                self.low,
                                                self.close,
                                                penetration=0)

        elif para is 'CDLDOJI':  #Doji
            self.integer = ta.CDLDOJI(self.op, self.high, self.low, self.close)

        elif para is 'CDLDOJISTAR':  #Doji Star
            self.integer = ta.CDLDOJISTAR(self.op, self.high, self.low,
                                          self.close)

        elif para is 'CDLDRAGONFLYDOJI':  #Dragonfly Doji
            self.integer = ta.CDLDRAGONFLYDOJI(self.op, self.high, self.low,
                                               self.close)

        elif para is 'CDLENGULFING':  #Engulfing Pattern
            self.integer = ta.CDLENGULFING(self.op, self.high, self.low,
                                           self.close)

        elif para is 'CDLEVENINGDOJISTAR':  #Evening Doji Star
            self.integer = ta.CDLEVENINGDOJISTAR(self.op,
                                                 self.high,
                                                 self.low,
                                                 self.close,
                                                 penetration=0)

        elif para is 'CDLEVENINGSTAR':  #Evening Star
            self.integer = ta.CDLEVENINGSTAR(self.op,
                                             self.high,
                                             self.low,
                                             self.close,
                                             penetration=0)

        elif para is 'CDLGAPSIDESIDEWHITE':  #Up/Down-gap side-by-side white lines
            self.integer = ta.CDLGAPSIDESIDEWHITE(self.op, self.high, self.low,
                                                  self.close)

        elif para is 'CDLGRAVESTONEDOJI':  #Gravestone Doji
            self.integer = ta.CDLGRAVESTONEDOJI(self.op, self.high, self.low,
                                                self.close)

        elif para is 'CDLHAMMER':  #Hammer
            self.integer = ta.CDLHAMMER(self.op, self.high, self.low,
                                        self.close)

        elif para is 'CDLHANGINGMAN':  #Hanging Man
            self.integer = ta.CDLHANGINGMAN(self.op, self.high, self.low,
                                            self.close)

        elif para is 'CDLHARAMI':  #Harami Pattern
            self.integer = ta.CDLHARAMI(self.op, self.high, self.low,
                                        self.close)

        elif para is 'CDLHARAMICROSS':  #Harami Cross Pattern
            self.integer = ta.CDLHARAMICROSS(self.op, self.high, self.low,
                                             self.close)

        elif para is 'CDLHIGHWAVE':  #High-Wave Candle
            self.integer = ta.CDLHIGHWAVE(self.op, self.high, self.low,
                                          self.close)

        elif para is 'CDLHIKKAKE':  #Hikkake Pattern
            self.integer = ta.CDLHIKKAKE(self.op, self.high, self.low,
                                         self.close)

        elif para is 'CDLHIKKAKEMOD':  #Modified Hikkake Pattern
            self.integer = ta.CDLHIKKAKEMOD(self.op, self.high, self.low,
                                            self.close)

        elif para is 'CDLHOMINGPIGEON':  #Homing Pigeon
            self.integer = ta.CDLHOMINGPIGEON(self.op, self.high, self.low,
                                              self.close)

        elif para is 'CDLIDENTICAL3CROWS':  #Identical Three Crows
            self.integer = ta.CDLIDENTICAL3CROWS(self.op, self.high, self.low,
                                                 self.close)

        elif para is 'CDLINNECK':  #In-Neck Pattern
            self.integer = ta.CDLINNECK(self.op, self.high, self.low,
                                        self.close)

        elif para is 'CDLINVERTEDHAMMER':  #Inverted Hammer
            self.integer = ta.CDLINVERTEDHAMMER(self.op, self.high, self.low,
                                                self.close)

        elif para is 'CDLKICKING':  #Kicking
            self.integer = ta.CDLKICKING(self.op, self.high, self.low,
                                         self.close)

        elif para is 'CDLKICKINGBYLENGTH':  #Kicking - bull/bear determined by the longer marubozu
            self.integer = ta.CDLKICKINGBYLENGTH(self.op, self.high, self.low,
                                                 self.close)

        elif para is 'CDLLADDERBOTTOM':  #Ladder Bottom
            self.integer = ta.CDLLADDERBOTTOM(self.op, self.high, self.low,
                                              self.close)

        elif para is 'CDLLONGLEGGEDDOJI':  #Long Legged Doji
            self.integer = ta.CDLLONGLEGGEDDOJI(self.op, self.high, self.low,
                                                self.close)

        elif para is 'CDLLONGLINE':  #Long Line Candle
            self.integer = ta.CDLLONGLINE(self.op, self.high, self.low,
                                          self.close)

        elif para is 'CDLMARUBOZU':  #Marubozu
            self.integer = ta.CDLMARUBOZU(self.op, self.high, self.low,
                                          self.close)

        elif para is 'CDLMATCHINGLOW':  #Matching Low
            self.integer = ta.CDLMATCHINGLOW(self.op, self.high, self.low,
                                             self.close)

        elif para is 'CDLMATHOLD':  #Mat Hold
            self.integer = ta.CDLMATHOLD(self.op,
                                         self.high,
                                         self.low,
                                         self.close,
                                         penetration=0)

        elif para is 'CDLMORNINGDOJISTAR':  #Morning Doji Star
            self.integer = ta.CDLMORNINGDOJISTAR(self.op,
                                                 self.high,
                                                 self.low,
                                                 self.close,
                                                 penetration=0)

        elif para is 'CDLMORNINGSTAR':  #Morning Star
            self.integer = ta.CDLMORNINGSTAR(self.op,
                                             self.high,
                                             self.low,
                                             self.close,
                                             penetration=0)

        elif para is 'CDLONNECK':  #On-Neck Pattern
            self.integer = ta.CDLONNECK(self.op, self.high, self.low,
                                        self.close)

        elif para is 'CDLPIERCING':  #Piercing Pattern
            self.integer = ta.CDLPIERCING(self.op, self.high, self.low,
                                          self.close)

        elif para is 'CDLRICKSHAWMAN':  #Rickshaw Man
            self.integer = ta.CDLRICKSHAWMAN(self.op, self.high, self.low,
                                             self.close)

        elif para is 'CDLRISEFALL3METHODS':  #Rising/Falling Three Methods
            self.integer = ta.CDLRISEFALL3METHODS(self.op, self.high, self.low,
                                                  self.close)

        elif para is 'CDLSEPARATINGLINES':  #Separating Lines
            self.integer = ta.CDLSEPARATINGLINES(self.op, self.high, self.low,
                                                 self.close)

        elif para is 'CDLSHOOTINGSTAR':  #Shooting Star
            self.integer = ta.CDLSHOOTINGSTAR(self.op, self.high, self.low,
                                              self.close)

        elif para is 'CDLSHORTLINE':  #Short Line Candle
            self.integer = ta.CDLSHORTLINE(self.op, self.high, self.low,
                                           self.close)

        elif para is 'CDLSPINNINGTOP':  #Spinning Top
            self.integer = ta.CDLSPINNINGTOP(self.op, self.high, self.low,
                                             self.close)

        elif para is 'CDLSTALLEDPATTERN':  #Stalled Pattern
            self.integer = ta.CDLSTALLEDPATTERN(self.op, self.high, self.low,
                                                self.close)

        elif para is 'CDLSTICKSANDWICH':  #Stick Sandwich
            self.integer = ta.CDLSTICKSANDWICH(self.op, self.high, self.low,
                                               self.close)

        elif para is 'CDLTAKURI':  #Takuri (Dragonfly Doji with very long lower shadow)
            self.integer = ta.CDLTAKURI(self.op, self.high, self.low,
                                        self.close)

        elif para is 'CDLTASUKIGAP':  #Tasuki Gap
            self.integer = ta.CDLTASUKIGAP(self.op, self.high, self.low,
                                           self.close)

        elif para is 'CDLTHRUSTING':  #Thrusting Pattern
            self.integer = ta.CDLTHRUSTING(self.op, self.high, self.low,
                                           self.close)

        elif para is 'CDLTRISTAR':  #Tristar Pattern
            self.integer = ta.CDLTRISTAR(self.op, self.high, self.low,
                                         self.close)

        elif para is 'CDLUNIQUE3RIVER':  #Unique 3 River
            self.integer = ta.CDLUNIQUE3RIVER(self.op, self.high, self.low,
                                              self.close)

        elif para is 'CDLUPSIDEGAP2CROWS':  #Upside Gap Two Crows
            self.integer = ta.CDLUPSIDEGAP2CROWS(self.op, self.high, self.low,
                                                 self.close)

        elif para is 'CDLXSIDEGAP3METHODS':  #Upside/Downside Gap Three Methods
            self.integer = ta.CDLXSIDEGAP3METHODS(self.op, self.high, self.low,
                                                  self.close)

        #Statistic Functions  : #
        elif para is 'BETA':  #Beta
            self.output = ta.BETA(self.high, self.low, timeperiod=5)

        elif para is 'CORREL':  #Pearson's Correlation Coefficient (r)
            self.output = ta.CORREL(self.high, self.low, timeperiod=self.tp)

        elif para is 'LINEARREG':  #Linear Regression
            self.output = ta.LINEARREG(self.close, timeperiod=self.tp)

        elif para is 'LINEARREG_ANGLE':  #Linear Regression Angle
            self.output = ta.LINEARREG_ANGLE(self.close, timeperiod=self.tp)

        elif para is 'LINEARREG_INTERCEPT':  #Linear Regression Intercept
            self.output = ta.LINEARREG_INTERCEPT(self.close,
                                                 timeperiod=self.tp)

        elif para is 'LINEARREG_SLOPE':  #Linear Regression Slope
            self.output = ta.LINEARREG_SLOPE(self.close, timeperiod=self.tp)

        elif para is 'STDDEV':  #Standard Deviation
            self.output = ta.STDDEV(self.close, timeperiod=5, nbdev=1)

        elif para is 'TSF':  #Time Series Forecast
            self.output = ta.TSF(self.close, timeperiod=self.tp)

        elif para is 'VAR':  #Variance
            self.output = ta.VAR(self.close, timeperiod=5, nbdev=1)

        else:
            print('You issued command:' + para)
Пример #26
0
def TALIB_ULTOSC(close, timeperiod1=7, timeperiod2=14, timeperiod3=28):
    '''00393,4,1'''
    return talib.ULTOSC(close, timeperiod1, timeperiod2, timeperiod3)
Пример #27
0
 def process_data(self):
     self.main_df = self.df.copy()
     self.main_df["return_log"] = self.main_df["mid"].pct_change(1)
     self.main_df["Close"] = talib.DEMA(
         np.array(self.main_df["Close"]), timeperiod=3)
     self.main_df["High"] = talib.DEMA(
         np.array(self.main_df["High"]), timeperiod=3)
     self.main_df["Low"] = talib.DEMA(
         np.array(self.main_df["Low"]), timeperiod=3)
     self.main_df["Open"] = talib.DEMA(
         np.array(self.main_df["Open"]), timeperiod=3)
     self.main_df["dema"] = talib.DEMA(
         np.array(self.main_df["Close"]), timeperiod=30)
     self.main_df["kama"] = talib.KAMA(np.array(
         self.main_df["Close"]), timeperiod=30)  # Kaufman Adaptive Moving Average
     self.main_df["trima"] = talib.TRIMA(
         np.array(self.main_df["Close"]), timeperiod=30)  # Triple exponential
     self.main_df["WMA"] = talib.WMA(
         np.array(self.main_df["Close"]), timeperiod=30)  # Weighted moving average
     self.main_df["adx"] = talib.ADX(np.array(self.main_df["High"]), np.array(
         self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod=14)
     self.main_df["adxr"] = talib.ADXR(np.array(self.main_df["High"]), np.array(
         self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod=14)
     self.main_df["apo"] = talib.APO(
         np.array(self.main_df["Close"]), fastperiod=12, slowperiod=26)
     self.main_df["aroondown"], self.main_df["aroonup"] = talib.AROON(
         np.array(self.main_df["High"]), np.array(self.main_df["Low"]), timeperiod=14)
     self.main_df["aroonosc"] = talib.AROONOSC(
         np.array(self.main_df["High"]), np.array(self.main_df["Low"]), timeperiod=14)
     self.main_df["bop"] = talib.BOP(np.array(self.main_df["Open"]), np.array(
         self.main_df["High"]), np.array(self.main_df["Low"]), np.array(self.main_df["Close"]))
     self.main_df["cmo"] = talib.CMO(
         np.array(self.main_df["Close"]), timeperiod=14)
     self.main_df["dx"] = talib.DX(np.array(self.main_df["High"]), np.array(
         self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod=14)
     self.main_df["mfi"] = talib.MFI(np.array(self.main_df["High"]), np.array(self.main_df["Low"]), np.array(
         self.main_df["Close"]), np.array(self.main_df["Volume"]), timeperiod=14)
     self.main_df["minus_di"] = talib.MINUS_DI(np.array(self.main_df["High"]), np.array(
         self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod=14)
     self.main_df["minus_dm"] = talib.MINUS_DM(
         np.array(self.main_df["High"]), np.array(self.main_df["Low"]), timeperiod=14)
     self.main_df["plus_di"] = talib.PLUS_DI(np.array(self.main_df["High"]), np.array(
         self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod=14)
     self.main_df["plus_dm"] = talib.PLUS_DM(
         np.array(self.main_df["High"]), np.array(self.main_df["Low"]), timeperiod=14)
     self.main_df["ppo"] = talib.PPO(
         np.array(self.main_df["Close"]), fastperiod=10, slowperiod=20)
     self.main_df["rsi_14"] = talib.RSI(
         np.array(self.main_df["Close"]), timeperiod=14)
     self.main_df["slowk"], self.main_df["slowd"] = talib.STOCH(np.array(self.main_df["High"]), np.array(self.main_df["Low"]), np.array(
         self.main_df["Close"]), fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
     self.main_df["macd"], self.main_df["macdsignal"], self.main_df["macdhist"] = talib.MACD(
         np.array(self.main_df["Close"]), fastperiod=12, slowperiod=26, signalperiod=9)
     self.main_df["cci"] = talib.CCI(np.array(self.main_df["High"]), np.array(
         self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod=14)
     self.main_df["mom20"] = talib.MOM(
         np.array(self.main_df["Close"]), timeperiod=20)
     self.main_df["mom10"] = talib.MOM(
         np.array(self.main_df["Close"]), timeperiod=10)
     self.main_df["ma20"] = talib.SMA(
         np.array(self.main_df["Close"]), timeperiod=20)
     self.main_df["ma10"] = talib.SMA(
         np.array(self.main_df["Close"]), timeperiod=10)
     self.main_df["roc"] = talib.ROC(
         np.array(self.main_df["Close"]), timeperiod=10)
     self.main_df["ult"] = talib.ULTOSC(np.array(self.main_df["High"]), np.array(
         self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod1=7, timeperiod2=14, timeperiod3=28)
     self.main_df["will"] = talib.WILLR(np.array(self.main_df["High"]), np.array(
         self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod=14)
     self.main_df["return_1df"] = self.main_df["return_log"].shift(
         -1)
     self.main_df = self.main_df.dropna().iloc[140:, :]
     return self.main_df
Пример #28
0
def calc_features(df):
    open = df['op']
    high = df['hi']
    low = df['lo']
    close = df['cl']
    volume = df['volume']

    orig_columns = df.columns

    hilo = (df['hi'] + df['lo']) / 2
    df['BBANDS_upperband'], df['BBANDS_middleband'], df[
        'BBANDS_lowerband'] = talib.BBANDS(close,
                                           timeperiod=5,
                                           nbdevup=2,
                                           nbdevdn=2,
                                           matype=0)
    df['BBANDS_upperband'] -= hilo
    df['BBANDS_middleband'] -= hilo
    df['BBANDS_lowerband'] -= hilo
    df['DEMA'] = talib.DEMA(close, timeperiod=30) - hilo
    df['EMA'] = talib.EMA(close, timeperiod=30) - hilo
    df['HT_TRENDLINE'] = talib.HT_TRENDLINE(close) - hilo
    df['KAMA'] = talib.KAMA(close, timeperiod=30) - hilo
    df['MA'] = talib.MA(close, timeperiod=30, matype=0) - hilo
    df['MIDPOINT'] = talib.MIDPOINT(close, timeperiod=14) - hilo
    df['SMA'] = talib.SMA(close, timeperiod=30) - hilo
    df['T3'] = talib.T3(close, timeperiod=5, vfactor=0) - hilo
    df['TEMA'] = talib.TEMA(close, timeperiod=30) - hilo
    df['TRIMA'] = talib.TRIMA(close, timeperiod=30) - hilo
    df['WMA'] = talib.WMA(close, timeperiod=30) - hilo

    df['ADX'] = talib.ADX(high, low, close, timeperiod=14)
    df['ADXR'] = talib.ADXR(high, low, close, timeperiod=14)
    df['APO'] = talib.APO(close, fastperiod=12, slowperiod=26, matype=0)
    df['AROON_aroondown'], df['AROON_aroonup'] = talib.AROON(high,
                                                             low,
                                                             timeperiod=14)
    df['AROONOSC'] = talib.AROONOSC(high, low, timeperiod=14)
    df['BOP'] = talib.BOP(open, high, low, close)
    df['CCI'] = talib.CCI(high, low, close, timeperiod=14)
    df['DX'] = talib.DX(high, low, close, timeperiod=14)
    df['MACD_macd'], df['MACD_macdsignal'], df['MACD_macdhist'] = talib.MACD(
        close, fastperiod=12, slowperiod=26, signalperiod=9)
    # skip MACDEXT MACDFIX たぶん同じなので
    df['MFI'] = talib.MFI(high, low, close, volume, timeperiod=14)
    df['MINUS_DI'] = talib.MINUS_DI(high, low, close, timeperiod=14)
    df['MINUS_DM'] = talib.MINUS_DM(high, low, timeperiod=14)
    df['MOM'] = talib.MOM(close, timeperiod=10)
    df['PLUS_DI'] = talib.PLUS_DI(high, low, close, timeperiod=14)
    df['PLUS_DM'] = talib.PLUS_DM(high, low, timeperiod=14)
    df['RSI'] = talib.RSI(close, timeperiod=14)
    df['STOCH_slowk'], df['STOCH_slowd'] = talib.STOCH(high,
                                                       low,
                                                       close,
                                                       fastk_period=5,
                                                       slowk_period=3,
                                                       slowk_matype=0,
                                                       slowd_period=3,
                                                       slowd_matype=0)
    df['STOCHF_fastk'], df['STOCHF_fastd'] = talib.STOCHF(high,
                                                          low,
                                                          close,
                                                          fastk_period=5,
                                                          fastd_period=3,
                                                          fastd_matype=0)
    df['STOCHRSI_fastk'], df['STOCHRSI_fastd'] = talib.STOCHRSI(close,
                                                                timeperiod=14,
                                                                fastk_period=5,
                                                                fastd_period=3,
                                                                fastd_matype=0)
    df['TRIX'] = talib.TRIX(close, timeperiod=30)
    df['ULTOSC'] = talib.ULTOSC(high,
                                low,
                                close,
                                timeperiod1=7,
                                timeperiod2=14,
                                timeperiod3=28)
    df['WILLR'] = talib.WILLR(high, low, close, timeperiod=14)

    df['AD'] = talib.AD(high, low, close, volume)
    df['ADOSC'] = talib.ADOSC(high,
                              low,
                              close,
                              volume,
                              fastperiod=3,
                              slowperiod=10)
    df['OBV'] = talib.OBV(close, volume)

    df['ATR'] = talib.ATR(high, low, close, timeperiod=14)
    df['NATR'] = talib.NATR(high, low, close, timeperiod=14)
    df['TRANGE'] = talib.TRANGE(high, low, close)

    df['HT_DCPERIOD'] = talib.HT_DCPERIOD(close)
    df['HT_DCPHASE'] = talib.HT_DCPHASE(close)
    df['HT_PHASOR_inphase'], df['HT_PHASOR_quadrature'] = talib.HT_PHASOR(
        close)
    df['HT_SINE_sine'], df['HT_SINE_leadsine'] = talib.HT_SINE(close)
    df['HT_TRENDMODE'] = talib.HT_TRENDMODE(close)

    df['BETA'] = talib.BETA(high, low, timeperiod=5)
    df['CORREL'] = talib.CORREL(high, low, timeperiod=30)
    df['LINEARREG'] = talib.LINEARREG(close, timeperiod=14) - close
    df['LINEARREG_ANGLE'] = talib.LINEARREG_ANGLE(close, timeperiod=14)
    df['LINEARREG_INTERCEPT'] = talib.LINEARREG_INTERCEPT(
        close, timeperiod=14) - close
    df['LINEARREG_SLOPE'] = talib.LINEARREG_SLOPE(close, timeperiod=14)
    df['STDDEV'] = talib.STDDEV(close, timeperiod=5, nbdev=1)

    return df
Пример #29
0
def get_datasets(asset, currency, granularity, datapoints):
    """Fetch the API and precess the desired pair

    Arguments:
        asset {str} -- First pair
        currency {str} -- Second pair
        granularity {str ['day', 'hour']} -- Granularity
        datapoints {int [100 - 2000]} -- [description]

    Returns:
        pandas.Dataframe -- The OHLCV and indicators dataframe
    """
    df_train_path = 'datasets/bot_train_{}_{}_{}.csv'.format(
        asset + currency, datapoints, granularity)
    df_rollout_path = 'datasets/bot_rollout_{}_{}_{}.csv'.format(
        asset + currency, datapoints, granularity)
    emojis = [
        ':moneybag:', ':yen:', ':dollar:', ':pound:', ':euro:',
        ':credit_card:', ':money_with_wings:', ':gem:'
    ]

    if not os.path.exists(df_rollout_path):
        headers = {
            'User-Agent':
            'Mozilla/5.0',
            'authorization':
            'Apikey 3d7d3e9e6006669ac00584978342451c95c3c78421268ff7aeef69995f9a09ce'
        }

        # OHLC
        # url = 'https://min-api.cryptocompare.com/data/histo{}?fsym={}&tsym={}&e=Binance&limit={}'.format(granularity, asset, currency, datapoints)
        url = 'https://min-api.cryptocompare.com/data/histo{}?fsym={}&tsym={}&limit={}'.format(
            granularity, asset, currency, datapoints)
        # print(emoji.emojize(':dizzy: :large_blue_diamond: :gem: :bar_chart: :crystal_ball: :chart_with_downwards_trend: :chart_with_upwards_trend: :large_orange_diamond: loading...', use_aliases=True))
        print(
            colored(
                emoji.emojize('> ' + random.choice(emojis) + ' downloading ' +
                              asset + '/' + currency,
                              use_aliases=True), 'green'))
        # print(colored('> downloading ' + asset + '/' + currency, 'green'))
        response = requests.get(url, headers=headers)
        json_response = response.json()
        status = json_response['Response']
        if status == "Error":
            print(colored('=== {} ==='.format(json_response['Message']),
                          'red'))
            raise AssertionError()
        result = json_response['Data']
        df = pd.DataFrame(result)
        print(df.tail())
        df['Date'] = pd.to_datetime(df['time'], utc=True, unit='s')
        df.drop('time', axis=1, inplace=True)

        # indicators
        # https://github.com/mrjbq7/ta-lib/blob/master/docs/func.md
        open_price, high, low, close = np.array(df['open']), np.array(
            df['high']), np.array(df['low']), np.array(df['close'])
        volume = np.array(df['volumefrom'])
        # cycle indicators
        df.loc[:, 'HT_DCPERIOD'] = talib.HT_DCPERIOD(close)
        df.loc[:, 'HT_DCPHASE'] = talib.HT_DCPHASE(close)
        df.loc[:,
               'HT_PHASOR_inphase'], df.loc[:,
                                            'HT_PHASOR_quadrature'] = talib.HT_PHASOR(
                                                close)
        df.loc[:, 'HT_SINE_sine'], df.loc[:,
                                          'HT_SINE_leadsine'] = talib.HT_SINE(
                                              close)
        df.loc[:, 'HT_TRENDMODE'] = talib.HT_TRENDMODE(close)
        # momemtum indicators
        df.loc[:, 'ADX'] = talib.ADX(high, low, close, timeperiod=12)
        df.loc[:, 'ADXR'] = talib.ADXR(high, low, close, timeperiod=13)
        df.loc[:, 'APO'] = talib.APO(close,
                                     fastperiod=5,
                                     slowperiod=10,
                                     matype=0)
        df.loc[:,
               'AROON_down'], df.loc[:,
                                     'AROON_up'] = talib.AROON(high,
                                                               low,
                                                               timeperiod=15)
        df.loc[:, 'AROONOSC'] = talib.AROONOSC(high, low, timeperiod=13)
        df.loc[:, 'BOP'] = talib.BOP(open_price, high, low, close)
        df.loc[:, 'CCI'] = talib.CCI(high, low, close, timeperiod=13)
        df.loc[:, 'CMO'] = talib.CMO(close, timeperiod=14)
        df.loc[:, 'DX'] = talib.DX(high, low, close, timeperiod=10)
        df['MACD'], df['MACD_signal'], df['MACD_hist'] = talib.MACD(
            close, fastperiod=5, slowperiod=10, signalperiod=20)
        df.loc[:, 'MFI'] = talib.MFI(high, low, close, volume, timeperiod=12)
        df.loc[:, 'MINUS_DI'] = talib.MINUS_DI(high, low, close, timeperiod=10)
        df.loc[:, 'MINUS_DM'] = talib.MINUS_DM(high, low, timeperiod=14)
        df.loc[:, 'MOM'] = talib.MOM(close, timeperiod=20)
        df.loc[:, 'PPO'] = talib.PPO(close,
                                     fastperiod=17,
                                     slowperiod=35,
                                     matype=2)
        df.loc[:, 'ROC'] = talib.ROC(close, timeperiod=12)
        df.loc[:, 'RSI'] = talib.RSI(close, timeperiod=25)
        df.loc[:, 'STOCH_k'], df.loc[:,
                                     'STOCH_d'] = talib.STOCH(high,
                                                              low,
                                                              close,
                                                              fastk_period=35,
                                                              slowk_period=12,
                                                              slowk_matype=0,
                                                              slowd_period=7,
                                                              slowd_matype=0)
        df.loc[:,
               'STOCHF_k'], df.loc[:,
                                   'STOCHF_d'] = talib.STOCHF(high,
                                                              low,
                                                              close,
                                                              fastk_period=28,
                                                              fastd_period=14,
                                                              fastd_matype=0)
        df.loc[:, 'STOCHRSI_K'], df.loc[:, 'STOCHRSI_D'] = talib.STOCHRSI(
            close,
            timeperiod=35,
            fastk_period=12,
            fastd_period=10,
            fastd_matype=1)
        df.loc[:, 'TRIX'] = talib.TRIX(close, timeperiod=30)
        df.loc[:, 'ULTOSC'] = talib.ULTOSC(high,
                                           low,
                                           close,
                                           timeperiod1=14,
                                           timeperiod2=28,
                                           timeperiod3=35)
        df.loc[:, 'WILLR'] = talib.WILLR(high, low, close, timeperiod=35)
        # overlap studies
        df.loc[:,
               'BBANDS_upper'], df.loc[:,
                                       'BBANDS_middle'], df.loc[:,
                                                                'BBANDS_lower'] = talib.BBANDS(
                                                                    close,
                                                                    timeperiod=
                                                                    12,
                                                                    nbdevup=2,
                                                                    nbdevdn=2,
                                                                    matype=0)
        df.loc[:, 'DEMA'] = talib.DEMA(close, timeperiod=30)
        df.loc[:, 'EMA'] = talib.EMA(close, timeperiod=7)
        df.loc[:, 'HT_TRENDLINE'] = talib.HT_TRENDLINE(close)
        df.loc[:, 'KAMA'] = talib.KAMA(close, timeperiod=5)
        df.loc[:, 'MA'] = talib.MA(close, timeperiod=5, matype=0)
        df.loc[:, 'MIDPOINT'] = talib.MIDPOINT(close, timeperiod=20)
        df.loc[:, 'WMA'] = talib.WMA(close, timeperiod=15)
        df.loc[:, 'SMA'] = talib.SMA(close)
        # pattern recoginition
        df.loc[:, 'CDL2CROWS'] = talib.CDL2CROWS(open_price, high, low, close)
        df.loc[:, 'CDL3BLACKCROWS'] = talib.CDL3BLACKCROWS(
            open_price, high, low, close)
        df.loc[:, 'CDL3INSIDE'] = talib.CDL3INSIDE(open_price, high, low,
                                                   close)
        df.loc[:, 'CDL3LINESTRIKE'] = talib.CDL3LINESTRIKE(
            open_price, high, low, close)
        # price transform
        df.loc[:, 'WCLPRICE'] = talib.WCLPRICE(high, low, close)
        # statistic funcitons
        df.loc[:, 'BETA'] = talib.BETA(high, low, timeperiod=20)
        df.loc[:, 'CORREL'] = talib.CORREL(high, low, timeperiod=20)
        df.loc[:, 'STDDEV'] = talib.STDDEV(close, timeperiod=20, nbdev=1)
        df.loc[:, 'TSF'] = talib.TSF(close, timeperiod=20)
        df.loc[:, 'VAR'] = talib.VAR(close, timeperiod=20, nbdev=1)
        # volatility indicators
        df.loc[:, 'ATR'] = talib.ATR(high, low, close, timeperiod=7)
        df.loc[:, 'NATR'] = talib.NATR(high, low, close, timeperiod=20)
        df.loc[:, 'TRANGE'] = talib.TRANGE(high, low, close)
        # volume indicators
        df.loc[:, 'AD'] = talib.AD(high, low, close, volume)
        df.loc[:, 'ADOSC'] = talib.ADOSC(high,
                                         low,
                                         close,
                                         volume,
                                         fastperiod=10,
                                         slowperiod=20)
        df.loc[:, 'OBV'] = talib.OBV(close, volume)

        # df.fillna(df.mean(), inplace=True)
        df.dropna(inplace=True)
        df.set_index('Date', inplace=True)
        print(colored('> caching' + asset + '/' + currency + ':)', 'cyan'))
        train_size = round(
            len(df) *
            DF_TRAIN_SIZE)  # 75% to train -> test with different value
        df_train = df[:train_size]
        df_rollout = df[train_size:]
        df_train.to_csv(df_train_path)
        df_rollout.to_csv(df_rollout_path)
        df_train = pd.read_csv(
            df_train_path)  # re-read to avoid indexing issue w/ Ray
        df_rollout = pd.read_csv(df_rollout_path)
    else:

        print(
            colored(
                emoji.emojize('> ' + random.choice(emojis) + ' feching ' +
                              asset + '/' + currency + ' from cache',
                              use_aliases=True), 'magenta'))

        # print(colored('> feching ' + asset + '/' + currency + ' from cache :)', 'magenta'))
        df_train = pd.read_csv(df_train_path)
        df_rollout = pd.read_csv(df_rollout_path)
        # df_train.set_index('Date', inplace=True)
        # df_rollout.set_index('Date', inplace=True)

    return df_train, df_rollout
                                               fastd_matype=0)

        #STOCHRSI - Stochastic Relative Strength Index
        stochrsi_fastk, stochrsi_fastd = ta.STOCHRSI(close,
                                                     timeperiod=14,
                                                     fastk_period=5,
                                                     fastd_period=3,
                                                     fastd_matype=0)

        #TRIX - 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
        trix = ta.TRIX(close, timeperiod=30)

        #ULTOSC - Ultimate Oscillator
        ultosc = ta.ULTOSC(high,
                           low,
                           close,
                           timeperiod1=7,
                           timeperiod2=14,
                           timeperiod3=28)

        #WILLR - Williams' %R
        willr = ta.WILLR(high, low, close, timeperiod=14)

        df_save = pd.DataFrame(
            data={
                'Date': np.array(df['date']),
                'adx': adx,
                'adxr': adxr,
                'apo': apo,
                'aroondown': aroondown,
                'aroonup': aroonup,
                'aroonosc': aroonosc,