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))
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
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