def get_data_from_yahoo(market_type="nyse", reload=False, rewrite=True):

    if reload:
        tickers = save_all_tickers()
    else:
        with open(market_type + "tickers.pickle", "rb") as f:
            tickers = pickle.load(f)
    if not os.path.exists("stock_" + market_type):
        os.makedirs("stock_" + market_type)

    start = dt.datetime(2019, 1, 1)
    end = dt.datetime.now()

    for ticker in tickers:
        print(ticker)
        ticker = ticker.strip("\n")
        if "." in ticker and "HK" not in ticker:
            ticker = ticker.replace(".", "-")
        #print(ticker)
        # just in case your connection breaks, we'd like to save our progress!
        if not os.path.exists("stock_" + market_type +
                              "/{}.csv".format(ticker)) or rewrite:
            try:
                #df = web.DataReader(ticker, 'yahoo', start, end)
                #iex-tops econdb
                #df.reset_index(inplace=True)
                #df.set_index("Date", inplace=True)

                #df = df.drop("Symbol", axis=1)
                df = yf.download(ticker, start=start, end=end)
                # Initialize ATR Indicator
                indicator_atr = AverageTrueRange(high=df["High"],
                                                 low=df["Low"],
                                                 close=df["Close"])

                # Add ATR
                df['ATR'] = indicator_atr.average_true_range()

                # Initialize ATR Indicator
                indicator_atr_2 = AverageTrueRange(high=df["ATR"],
                                                   low=df["ATR"],
                                                   close=df["ATR"])

                # Add ATR
                df['ATR_2'] = indicator_atr_2.average_true_range()

                df.to_csv("stock_" + market_type + "/{}.csv".format(ticker))

            except:
                continue

        else:
            print('Already have {}'.format(ticker))
Exemple #2
0
    def _get_all_ST(self) -> pd.DataFrame:
        """

        ST Indicator, trading predictions, ST high/low
        """
        m = self.close.size
        dir_, trend = [1] * m, [0] * m
        long, short = [np.NaN] * m, [np.NaN] * m
        ATR = AverageTrueRange(high=self.high,
                               low=self.low,
                               close=self.close,
                               window=self.length)

        hl2_ = (self.high + self.low) / 2
        matr = ATR.average_true_range() * self.multiplier
        upperband = hl2_ + matr
        lowerband = hl2_ - matr

        for i in range(1, m):
            if self.close.iloc[i] > upperband.iloc[i - 1]:
                dir_[i] = BUY
            elif self.close.iloc[i] < lowerband.iloc[i - 1]:
                dir_[i] = SELL
            else:
                dir_[i] = dir_[i - 1]
                if dir_[i] == BUY and lowerband.iloc[i] < lowerband.iloc[i -
                                                                         1]:
                    lowerband.iloc[i] = lowerband.iloc[i - 1]
                if dir_[i] == SELL and upperband.iloc[i] > upperband.iloc[i -
                                                                          1]:
                    upperband.iloc[i] = upperband.iloc[i - 1]

            if dir_[i] > 0:
                trend[i] = long[i] = lowerband.iloc[i]
            else:
                trend[i] = short[i] = upperband.iloc[i]

        # Prepare DataFrame to return
        df = pd.DataFrame(
            {
                f"ST": trend,
                f"ST_strategy": dir_,
                f"ST_lower": long,
                f"ST_upper": short,
            },
            index=self.close.index)

        return df
Exemple #3
0
def supertrend(df:pd.DataFrame, period=10, multiplier=3)->pd.DataFrame:
    #basic upper band = (high + low)/2 + (multipler * atr)
    #basic lower band = (high + low)/2 - (multipler * atr)
    atr = AverageTrueRange(high=df['high'], low=df['low'], close=df['close'], window=14)

    df['atr'] = atr.average_true_range()
    df['st_upperband'] = ((df['high']+df['low'])/2 + (multiplier*df['atr']))
    df['st_lowerband'] = ((df['high']+df['low'])/2 - (multiplier*df['atr']))
    df['in_uptrend'] = True

    for current in range(1, len(df.index)):
        previous = current-1

        if df['close'][current] > df['st_upperband'][previous]:
            df['in_uptrend'][current]  = True
        elif df['close'][current] < df['st_lowerband'][previous]:
            df['in_uptrend'][current]  = False
        else:
            df['in_uptrend'][current] = df['in_uptrend'][previous]
            if df['in_uptrend'][current] and df['st_lowerband'][current] < df['st_lowerband'][previous]:
                df['st_lowerband'][current] = df['st_lowerband'][previous]
            if not df['in_uptrend'][current] and df['st_upperband'][current] > df['st_upperband'][previous]:
                df['st_upperband'][current] = df['st_upperband'][previous]
    return df