def get_quote(symbol): share = Share(symbol) if not share.get_price(): return {} change_f = float(share.get_change()) change_str = '+%.02f' % change_f if change_f >= 0 else '%.02f' % change_f change_percent_f = change_f / float(share.get_open()) * 100 change_percent = '+%.02f' % change_percent_f if change_percent_f >= 0 else '%.02f' % change_percent_f return { 'price': share.get_price(), 'change': change_str, 'change_percent': change_percent, 'open_price': share.get_open(), 'market_cap': share.get_market_cap(), 'year_low': share.get_year_low(), 'year_high': share.get_year_high(), 'day_low': share.get_days_low(), 'day_high': share.get_days_high(), 'volume': share.get_volume(), 'pe_ratio': share.get_price_earnings_ratio() or '-' }
def createInfos(): if db.infos.count() == 0: print("Creating Infos!!") with open('static/sp100.json', 'rb') as f: ls = json.load(f) for i in ls: timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") symbol = Share(i['name']) item = { 'name': i['name'], 'price': symbol.get_price(), 'time': timestamp, 'prev_close': symbol.get_prev_close(), 'open': symbol.get_open(), 'volume': symbol.get_volume(), 'pe': symbol.get_price_earnings_ratio(), 'eps': symbol.get_earnings_share(), 'price_sales': symbol.get_price_sales(), 'ebitda': symbol.get_ebitda(), 'hotness': ms.hotness_function(i['name']), 'BS': ms.bs_function(i['name'])} db.infos.insert_one({ "name": i['name'], "sector": i['sector'], "data": [item] }) print('Collection Infos Created.') return Response('Collection Infos Created.')
def updateInfos(): print("Updating Infos!") with open('static/sp100.json', 'rb') as f: ls = json.load(f) for i in ls: timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") print (i['name']) symbol = Share(i['name']) item = { 'name': i['name'], 'price': symbol.get_price(), 'time': timestamp, 'prev_close': symbol.get_prev_close(), 'open': symbol.get_open(), 'volume': symbol.get_volume(), 'pe': symbol.get_price_earnings_ratio(), 'eps': symbol.get_earnings_share(), 'price_sales': symbol.get_price_sales(), 'ebitda': symbol.get_ebitda(), 'hotness': ms.hotness_function(i['name']), 'BS': ms.bs_function(i['name'])} db.infos.update( {"name": i['name']}, { "$push": {"data": item} } ) print('Collection Infos Updated.') return Response('Collection Infos Updated.')
def fundamentalStats(stock): try: stokOutput = Share(stock) openPrice = stokOutput.get_open() closePrice = stokOutput.get_prev_close() dailyDelta = stokOutput.get_change() earningsShare = stokOutput.get_earnings_share() fiddyDay = stokOutput.get_50day_moving_avg() priceBook = stokOutput.get_price_book() peeEee = stokOutput.get_price_earnings_ratio() pegRatio = stokOutput.get_price_earnings_growth_ratio() if (float(priceBook) < 1.5 and float(peeEee) < 50 and float(pegRatio) < 2 and float(peeEee) > 0): csvList = [stock, "open price:", openPrice, "previous close:", closePrice, "daily deltas:", dailyDelta, "earnings per share:", earningsShare, "50 day moving avg:", fiddyDay, "price/book:", priceBook, "price/earnings:", peeEee, "peg:", pegRatio, "\n"] print (stock, "will be imported to Excel.") stockPicks = open("picks.csv", "a", newline='') writeCSV = csv.writer(stockPicks, dialect='excel') for stock in csvList: writeCSV.writerow([stock]) else: print (stock, "does not meet criteria.") except: print(stock, "is missing a defined key statistic.")
def report_current_from_yahoo(symbol): yahoo = Share(symbol) price_cur = yahoo.get_price() eps = yahoo.get_earnings_share() pe = yahoo.get_price_earnings_ratio() print 'yahoo: price=%s eps=%s, pe=%s'%(price_cur, eps, pe)
def get_stock_info(stock_symbol): _stock_info = dict() stock = Share(stock_symbol) _stock_info['price'] = stock.get_price() _stock_info['market_cap'] = stock.get_market_cap() if _stock_info['market_cap'] is not None: _stock_info['market_cap'] = _stock_info['market_cap'].replace("B", "") _stock_info['price_earnings'] = stock.get_price_earnings_ratio() return _stock_info
def loadKeyStatistics (cls, companyID = 'A'): ''' dataset df= pd.DataFrame(columns=['marketCapital','bookValue','ebitda','dividentShare','DividentYield','earningShare', 'BookPrice','SalesPrice','earningsGrowth','earningsRatio', 'symbol', 'date']) ''' yahoo = Share(companyID) yahoo.refresh() try: a = re.search('[a-zA-Z]+', yahoo.get_market_cap()) b = re.search('[a-zA-Z]+', yahoo.get_ebitda()) if a.group(0) is not None: p = re.split('[a-zA-Z]+', yahoo.get_market_cap()) if a.group(0) in 'B': marketCap = float(p[0]) * 10 ** 9 elif a.group(0) in 'M': marketCap = float(p[0]) * 10 ** 6 else: marketCap = -1 print ('Market cap: ' + yahoo.get_market_cap()) else: marketCap = yahoo.get_market_cap() if b.group(0) is not None: p = re.split('[a-zA-Z]+', yahoo.get_ebitda()) if b.group(0) in 'B': ebitda = float(p[0]) * 10 ** 9 elif b.group(0) in 'M': ebitda = float(p[0]) * 10 ** 6 else: ebitda = -1 print ('Ebitda: ' +yahoo.get_ebitda()) else: ebitda = yahoo.get_ebitda() except (TypeError, AttributeError): print ('Missing :' + companyID) e = sys.exc_info()[0] print( "<p>Error: %s</p>" % e ) ebitda = -1.0 marketCap = -1.0 try: company = LoadYahooFinance(symbol = companyID, marketCap = marketCap, bookValue = float(yahoo.get_book_value()), ebitda = ebitda, dividentShare = float(yahoo.get_dividend_share()), dividentYield = float(yahoo.get_dividend_yield()), earningShare = float(yahoo.get_earnings_share()), bookPrice = float(yahoo.get_price_book()), salesPrice = float(yahoo.get_price_sales()), earningsGrowth = float(yahoo.get_price_earnings_growth_ratio()), earningRatio = float(yahoo.get_price_earnings_ratio())) return company except TypeError: print ('Missing :' + companyID) e = sys.exc_info()[0] print( "<p>Error: %s</p>" % e )
def get_quote(symbol): share = Share(symbol) return { 'open': share.get_open(), 'price': share.get_price(), 'change': share.get_change(), 'market_cap': share.get_market_cap(), 'pe': share.get_price_earnings_ratio() or '-' }
def stock_summary(request, symbol=None): if symbol == None: symbol = request.POST['symbol'] current_stock = Stock() stock = Share(symbol) current_stock.symbol = symbol.upper() current_stock.price = stock.get_price() current_stock.change = stock.get_change() current_stock.volume = stock.get_volume() current_stock.prev_close = stock.get_prev_close() current_stock.stock_open = stock.get_open() current_stock.avg_daily_volume = stock.get_avg_daily_volume() current_stock.stock_exchange = stock.get_stock_exchange() current_stock.market_cap = stock.get_market_cap() current_stock.book_value = stock.get_book_value() current_stock.ebitda = stock.get_ebitda() current_stock.dividend_share = stock.get_dividend_share() current_stock.dividend_yield = stock.get_dividend_yield() current_stock.earnings_share = stock.get_earnings_share() current_stock.days_high = stock.get_days_high() current_stock.days_low = stock.get_days_low() current_stock.year_high = stock.get_year_high() current_stock.year_low = stock.get_year_low() current_stock.fifty_day_moving_avg = stock.get_50day_moving_avg() current_stock.two_hundred_day_moving_avg = stock.get_200day_moving_avg() current_stock.price_earnings_ratio = stock.get_price_earnings_ratio() current_stock.price_earnings_growth_ratio = stock.get_price_earnings_growth_ratio() current_stock.price_sales = stock.get_price_sales() current_stock.price_book = stock.get_price_book() current_stock.short_ratio = stock.get_short_ratio() date_metrics = [] url = 'http://chartapi.finance.yahoo.com/instrument/1.0/'+symbol+'/chartdata;type=quote;range=1y/csv' page = urllib2.urlopen(url).read() pagebreaks = page.split('\n') for line in pagebreaks: items = line.split(',') if 'Company-Name:' in line: current_stock.company_name = line[13:len(line)] current_stock.save() if 'values' not in items: if len(items)==6: hd = HistoricalData( stock_id = Stock.objects.get(id=int(current_stock.id)).id, date = items[0][4:6]+'/'+items[0][6:9]+'/'+items[0][0:4], close = items[1][0:(len(items[1])-2)], high = items[2][0:(len(items[2])-2)], price_open = items[3][0:(len(items[3])-2)], low = items[4][0:(len(items[4])-2)], volume = items[5][0:-6]+","+items[5][-6:-3]+","+items[5][-3:len(items[5])]) hd.save() date_metrics.append(hd) del date_metrics[0] return render(request, "stock_summary.html", {'current_stock': current_stock, 'date_metrics': date_metrics})
def portfolio_stocks(stocks): tickers = [] index = 0 for stock in stocks: names = [ 'Company Name', 'Ticker', 'Price', 'Market Cap', 'P/E Ratio', 'Earnings Yield', 'Div Yield', '50 Day MA', '200 Day MA', 'Price Target' ] ticker = Share(stock) comp_name = ticker.get_name() #company name tick = stock #ticker price = ticker.get_price() #price market_cap = ticker.get_market_cap() #market_cap pe = ticker.get_price_earnings_ratio() #gets pe as a string pe_two = float(pe) if pe else 0 #returns a float of the p/e if there is a result, otherwise returns 0 final_pe = pe_two if float(pe_two) > 0 else 0 #returns pe_two if > 0 else returns 0 EPS = ticker.get_EPS_estimate_current_year() # gets eps as a string final_eps = EPS if EPS else 0 #returns eps if there is a result, else returns 0 earn_yield = float(final_eps)/float(price) #returns float of earnings yield pos_ey = earn_yield if earn_yield > 0 else 0 #turns negitive numbers to 0 print(tick, 'earn yield', pos_ey) ey = round(pos_ey*100, 2) #returns in % format div = ticker.get_dividend_yield() #returns div in string final_div = 0 if div == None else float(div) #if no result returns 0 else returns float of div fifty = ticker.get_50day_moving_avg() #returns as string short_fifty = round(float(fifty), 2) #returns div with 2 decimal places two_hundred = ticker.get_200day_moving_avg() #returns as string short_two = round(float(two_hundred), 2) #returns float with 2 decimal places target = ticker.get_one_yr_target_price() #returns as string short_target = round(float(target), 2) values = [comp_name, tick, price, market_cap, final_pe, ey, final_div, short_fifty, short_two, short_target] final_values = list(zip(names, values)) index += 1 tickers.append(final_values) return tickers
def getAllStockData(ticker): '''Get a few random tickers.''' stock = Share(ticker) stock.refresh() data = { 'name': stock.get_name(), 'price': stock.get_price(), 'change': stock.get_change(), 'volume': stock.get_volume(), 'prev_close': stock.get_prev_close(), 'open': stock.get_open(), 'avg_daily_volume': stock.get_avg_daily_volume(), 'stock_exchange': stock.get_stock_exchange, 'market_cap': stock.get_market_cap(), 'book_value': stock.get_book_value(), 'ebitda': stock.get_ebitda(), 'dividend_share': stock.get_dividend_share(), 'dividend_yield': stock.get_dividend_yield(), 'earnings_share': stock.get_earnings_share(), 'days_high': stock.get_days_high(), 'days_low': stock.get_days_low(), 'year_high': stock.get_year_high(), 'year_low': stock.get_year_low(), '50day_moving_avg': stock.get_50day_moving_avg(), '200day_moving_avg': stock.get_200day_moving_avg(), 'price_earnings_ratio': stock.get_price_earnings_ratio(), 'price_earnings_growth_ratio': stock.get_price_earnings_growth_ratio(), 'get_price_sales': stock.get_price_sales(), 'get_price_book': stock.get_price_book(), 'get_short_ratio': stock.get_short_ratio(), 'trade_datetime': stock.get_trade_datetime(), 'percent_change_from_year_high': stock.get_percent_change_from_year_high(), 'percent_change_from_year_low': stock.get_percent_change_from_year_low(), 'change_from_year_low': stock.get_change_from_year_low(), 'change_from_year_high': stock.get_change_from_year_high(), 'percent_change_from_200_day_moving_average': stock.get_percent_change_from_200_day_moving_average(), 'change_from_200_day_moving_average': stock.get_change_from_200_day_moving_average(), 'percent_change_from_50_day_moving_average': stock.get_percent_change_from_50_day_moving_average(), 'change_from_50_day_moving_average': stock.get_change_from_50_day_moving_average(), 'EPS_estimate_next_quarter': stock.get_EPS_estimate_next_quarter(), 'EPS_estimate_next_year': stock.get_EPS_estimate_next_year(), 'ex_dividend_date': stock.get_ex_dividend_date(), 'EPS_estimate_current_year': stock.get_EPS_estimate_current_year(), 'price_EPS_estimate_next_year': stock.get_price_EPS_estimate_next_year(), 'price_EPS_estimate_current_year': stock.get_price_EPS_estimate_current_year(), 'one_yr_target_price': stock.get_one_yr_target_price(), 'change_percent_change': stock.get_change_percent_change(), 'divended_pay_date': stock.get_dividend_pay_date(), 'currency': stock.get_currency(), 'last_trade_with_time': stock.get_last_trade_with_time(), 'days_range': stock.get_days_range(), 'years_range': stock.get_year_range() } return data
def pe_ratio(self): for i in range(len(self.list_of_tick)): try: ticker = self.list_of_tick[i][0] info_stock = Share(ticker) pe_val = float(info_stock.get_price_earnings_ratio()) if isinstance(pe_val, float) == True: self.db_validate(pe_val, ticker, "PE") except yahoo_errors: pass
def test_filter_stocks(self): start, end = get_time_period() tickers = self.get_fifty_random_tickers() tested = 0 for ticker in tickers: if tested >= 10: break try: s = Share(ticker) data = s.get_historical(end, start) except: continue tested += 1 if len(data) < MIN_DATA_LEN or data[0]['Date'] == last_trading_day: continue if not data: self.assertTrue(filter_stocks(s, data)) elif data[0]['Close'] < 1: self.assertTrue(filter_stocks(s, data)) elif not s.get_market_cap(): self.assertTrue(filter_stocks(s, data)) elif _parse_market_cap_string(s.get_market_cap()) < float( getenv('MARKET_CAP_MIN', FILTER_DEFAULTS['MARKET_CAP_MIN'])): self.assertTrue(filter_stocks(s, data)) elif not s.get_price_earnings_ratio(): self.assertTrue(filter_stocks(s, data)) elif float(s.get_price_earnings_ratio()) >= float(getenv('PE_MAX', FILTER_DEFAULTS['PE_MAX'])) or \ float(s.get_price_earnings_ratio()) <= float(getenv('PE_MIN', FILTER_DEFAULTS['PE_MIN'])): self.assertTrue(filter_stocks(s, data)) elif not s.get_avg_daily_volume() or float( s.get_avg_daily_volume()) >= float( getenv('VOLUME_MIN', FILTER_DEFAULTS['VOLUME_MIN'])): self.assertTrue(filter_stocks(s, data)) elif (float(s.get_year_high()) * .99) <= float(data[0]['High']): self.assertTrue(filter_stocks(s, data)) else: self.assertFalse(filter_stocks(s, data))
def rec(p): yahoo = Share(p) a = yahoo.get_prev_close() b = yahoo.get_year_high() c = yahoo.get_year_low() d = yahoo.get_open() e = yahoo.get_ebitda() f = yahoo.get_market_cap() g = yahoo.get_avg_daily_volume() h = yahoo.get_dividend_yield() i = yahoo.get_earnings_share() j = yahoo.get_days_low() k = yahoo.get_days_high() l = yahoo.get_50day_moving_avg() m = yahoo.get_200day_moving_avg() n = yahoo.get_price_earnings_ratio() o = yahoo.get_price_earnings_growth_ratio() print p print "Previous Close: ", a print "Year High", b print "Year Low", c print "Open:", d print "EBIDTA", e print "Market Cap", f print "Average Daily Volume", g print "Dividend Yield", h print "Earnings per share", i print "Days Range:", j, "-", k print "50 Days Moving Average", l print "200 Days Moving Average", m print "Price Earnings Ratio", n print "Price Earnings Growth Ratio", o import MySQLdb db = MySQLdb.connect(host="127.0.0.1", user="******", passwd="1111", db="stocks", local_infile=1) cur = db.cursor() cur.execute( """ INSERT INTO stockapp_info (symbol, prev_close, year_high, year_low, open_price , ebidta, market_cap, avg_daily_vol , dividend_yield, eps , days_low ,days_high, moving_avg_50, moving_avg_200, price_earnings_ratio, price_earnings_growth_ratio) VALUES (%s, %s, %s, %s, %s, %s, %s,%s,%s,%s,%s,%s,%s,%s,%s,%s) """, (p, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)) db.commit() cur.close()
def get_value_investing_symbols(): from db import Symbol stocks = [] #Loop each stock and generate an array with (stock_name, price-earnings ratio) tuples for s in Symbol.query.filter(Symbol.symbol_type == 'STOCK'): stock = Share(s.symbol) pe_ratio = stock.get_price_earnings_ratio() if pe_ratio is not None: stocks.append((s, float(pe_ratio))) #sort the array by price–earnings ratio(lowest first) stocks = sorted(stocks, key=operator.itemgetter(1)) #return the recommended symbols return [stocks[0][0], stocks[1][0], stocks[2][0]]
def get_quality_investing_symbols(): from db import Symbol quality_stocks = [] # Only get specific quality stocks for s in db.session.query(Symbol).filter(Symbol.quality == True): stock = Share(s.symbol) pe_ratio = stock.get_price_earnings_ratio() if pe_ratio is not None: quality_stocks.append((s, float(pe_ratio))) #Sort by highest price earnings ratio quality_stocks.sort(key=operator.itemgetter(1), reverse=True) #Return top 3 return [quality_stocks[0][0], quality_stocks[1][0], quality_stocks[2][0]]
def get_ethical_investing_symbols(): from db import Symbol ethical_stocks = [] # Only get specific ethical stocks for s in db.session.query(Symbol).filter(Symbol.ethical == True): stock = Share(s.symbol) pe_ratio = stock.get_price_earnings_ratio() if pe_ratio is not None: ethical_stocks.append((s, float(pe_ratio))) # Sort by highest price earnings ratio sorted(ethical_stocks, key=operator.itemgetter(1), reverse=True) # Return top 3 return [ethical_stocks[0][0], ethical_stocks[1][0], ethical_stocks[2][0]]
def get_company_info(ticker): try: s = Share(ticker) data = { 'Market_cap': s.get_market_cap(), 'Average_volume': s.get_avg_daily_volume(), 'EPS': s.get_earnings_share(), 'Short_ratio': s.get_short_ratio(), 'PE': s.get_price_earnings_ratio(), 'PEG': s.get_price_earnings_growth_ratio(), } return DataFetcher._extract_company_info(data) except YQLQueryError: logger.error("Company info not found for {}".format(ticker)) except Exception as e: logger.error("Unexpected error occured: {}".format(e)) return {}
def get_share_price(stock_symbol): try: stock_symbol = stock_symbol.lower() stock = Share(stock_symbol) opening_price = stock.get_open() cur_price = stock.get_price() pe_ratio = stock.get_price_earnings_ratio() market_cap = stock.get_market_cap() result = [ stock_symbol, str(cur_price), str(opening_price), str(pe_ratio), str(market_cap) ] except: result = "1" return result
def rec(p): yahoo = Share(p) a=yahoo.get_prev_close() b=yahoo.get_year_high() c=yahoo.get_year_low() d=yahoo.get_open() e=yahoo.get_ebitda() f=yahoo.get_market_cap() g=yahoo.get_avg_daily_volume() h=yahoo.get_dividend_yield() i=yahoo.get_earnings_share() j=yahoo.get_days_low() k=yahoo.get_days_high() l=yahoo.get_50day_moving_avg() m=yahoo.get_200day_moving_avg() n=yahoo.get_price_earnings_ratio() o=yahoo.get_price_earnings_growth_ratio() print p print "Previous Close: ",a print "Year High",b print "Year Low",c print "Open:",d print "EBIDTA",e print "Market Cap",f print "Average Daily Volume",g print "Dividend Yield",h print "Earnings per share",i print "Days Range:", j ,"-",k print "50 Days Moving Average",l print "200 Days Moving Average",m print"Price Earnings Ratio", n print"Price Earnings Growth Ratio",o import MySQLdb db = MySQLdb.connect(host="127.0.0.1", user="******",passwd="1111", db="stocks",local_infile = 1) cur=db.cursor() cur.execute (""" INSERT INTO stockapp_info (symbol, prev_close, year_high, year_low, open_price , ebidta, market_cap, avg_daily_vol , dividend_yield, eps , days_low ,days_high, moving_avg_50, moving_avg_200, price_earnings_ratio, price_earnings_growth_ratio) VALUES (%s, %s, %s, %s, %s, %s, %s,%s,%s,%s,%s,%s,%s,%s,%s,%s) """, (p,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)) db.commit() cur.close()
def yahooKeyStats(stock): try: share = Share(stock) per = float(share.get_price_earnings_ratio()) pbr= float (share.get_price_book()) peg = float (share.get_price_earnings_growth_ratio()) #xFirst criteria, price earnings ratio must be lower than 15 if per<15: print stock,'meets requirements' print 'Price Earnings Ratio:',stock,per print 'price to book ratio:',stock,pbr print 'price earnings growth ratio:',stock,peg datafm= {"stock":stock,"per":per,'pbr':pbr,'peg':peg} print(datafm) return datafm else: raise Exception("does not meet the criteria") except Exception,e: print stock, "does not meet the criteria"
def fetch_stock_price(self, stock_unit_key): # Step 1: Make HTTP Call to fetch the Stock Details # Step 2: Once received, create it into its corresponding model # Step 2.1 : Between the models, exchange packet as a native dictionary, rather as a JSON object # Get the share price share_item = Share(stock_unit_key) if share_item.get_open() is None: return share_item_dict = share_item.data_set st_model = StockModel() st_model.stock_unit = stock_unit_key st_model.stock_title = share_item_dict['Name'] # Share Price + Unit of Currency st_model.stock_price = share_item.get_price( ) + " " + share_item_dict['Currency'] deviation_price = share_item.get_change() st_model.stock_deviation = deviation_price + " (" + share_item_dict[ 'ChangeinPercent'] + ") " # Ex: '-1.83 (-1.59%)' if deviation_price[0] == '-': st_model.stock_deviation_status = 'Decline' else: st_model.stock_deviation_status = 'Incline' st_model.stock_equity = share_item.get_stock_exchange() st_model.stock_last_update_time = 'At close: ' + share_item_dict[ 'LastTradeDateTimeUTC'] st_model.stock_52wkrange = share_item.get_year_low( ) + " - " + share_item.get_year_high() st_model.stock_open = share_item.get_open() st_model.stock_market_cap = share_item.get_market_cap() st_model.stock_prev_close = share_item.get_prev_close() st_model.stock_peratio_tte = share_item.get_price_earnings_ratio() st_model_to_publish = self.payload_to_publish_dict.get_stock_payload_to_publish( st_model) self.push_stock_to_delivery_queue(st_model_to_publish, stock_unit_key)
def get_symbol_yahoo_stats_yql(symbols, exclude_name=False): """ Get the symbols' basic statistics from Yahoo Finance. Input: symbols - a list of symbol strings, e.g. ['AAPL'] Output: stats in Pandas DataFrame. This function is ported from pandas_datareader/yahoo/components.py """ sym_list = str2list(symbols) if sym_list == None: return DataFrame() # Yahoo Finance tags, refer to http://www.financialwisdomforum.org/gummy-stuff/Yahoo-data.htm tags = ['Symbol'] if not exclude_name: tags += ['Name'] tags += ['Exchange', 'MarketCap', 'Volume', 'AverageDailyVolume', 'BookValue', 'P/E', 'PEG', 'Price/Sales', 'Price/Book', 'EBITDA', 'EPS', 'EPSEstimateNextQuarter', 'EPSEstimateCurrentYear', 'EPSEstimateNextYear', 'OneyrTargetPrice', 'PriceEPSEstimateCurrentYear', 'PriceEPSEstimateNextYear', 'ShortRatio', 'Dividend/Share', 'DividendYield', 'DividendPayDate', 'ExDividendDate'] lines = [] for sym in sym_list: stock = Share(sym) line = [sym] if not exclude_name: line += [stock.get_name()] line += [stock.get_stock_exchange(), str2num(stock.get_market_cap(), m2b=True), str2num(stock.get_volume()), str2num(stock.get_avg_daily_volume()), str2num(stock.get_book_value()), str2num(stock.get_price_earnings_ratio()), str2num(stock.get_price_earnings_growth_ratio()), str2num(stock.get_price_sales()), str2num(stock.get_price_book()), str2num(stock.get_ebitda()), str2num(stock.get_earnings_share()), str2num(stock.get_EPS_estimate_next_quarter()), str2num(stock.get_EPS_estimate_current_year()), str2num(stock.get_EPS_estimate_next_year()), str2num(stock.get_one_yr_target_price()), str2num(stock.get_price_EPS_estimate_current_year()), str2num(stock.get_price_EPS_estimate_next_year()), str2num(stock.get_short_ratio()), str2num(stock.get_dividend_share()), str2num(stock.get_dividend_yield()), stock.get_dividend_pay_date(), stock.get_ex_dividend_date()] lines.append(line) stats = DataFrame(lines, columns=tags) stats = stats.drop_duplicates() stats = stats.set_index('Symbol') return stats
def selectStock(stocks): ''' select the stock with today's trading volume at least 6 fold higher than average historical trading volume ''' start_time = time() resultStock = {} count = 0 num = 0 for symb in stocks.keys(): try: stock = Share(symb) vol = int(stock.get_volume()) daily_avg_vol = int(stock.get_avg_daily_volume()) price = float(stock.get_price()) prevPrice = float(stock.get_prev_close()) avg_50day = float(stock.get_50day_moving_avg()) avg_200day = float(stock.get_200day_moving_avg()) except (TypeError, AttributeError): continue num += 1 volRatio = vol / daily_avg_vol print num, stocks[symb][0], volRatio if volRatio > 6 and price > prevPrice and price > avg_50day: count += 1 stocks[symb].extend([ vol, daily_avg_vol, volRatio, price, prevPrice, avg_50day, avg_200day, stock.get_price_earnings_ratio(), stock.get_price_book(), stock.get_short_ratio(), stock.get_dividend_yield() ]) resultStock = { symb: stocks[symb] for symb in stocks.keys() if len(stocks[symb]) > 1 } print '{} stock(s) has marvelous volume'.format(count) print 'total time of running: {} seconds'.format(time() - start_time) return resultStock
def getStat(stockTicker): StatDict = dict() ticker = Share(stockTicker) mktCap = ticker.get_market_cap() if (mktCap != None and mktCap != 0): StatDict["Market cap"] = mktCap ebitda = ticker.get_ebitda() if (ebitda != None and ebitda != 0): StatDict["EBITDA"] = ebitda peR = ticker.get_price_earnings_ratio() if (peR != None and peR != 0): StatDict["Price Earning Ratio"] = peR EPS = ticker.get_earnings_share() if (EPS != None and EPS != 0): StatDict["EPS"] = EPS divYield = ticker.get_dividend_yield() if (divYield != None and divYield != 0): StatDict["Dividend Yield"] = divYield return StatDict
def stock_info(ticker): obj = session['objective'] stock_list = session['stock_list'] time = session['time'] stock = Share(ticker) name = stock.get_name() price = stock.get_price() pe = stock.get_price_earnings_ratio() final_pe = 0 if not pe else pe EPS = float(stock.get_EPS_estimate_current_year()) earn_yield = 0 if float(EPS) <= 0 else float(price) / EPS final_yield = '%.2f' % earn_yield div = stock.get_dividend_yield() final_div = 0 if div == None else div target = stock.get_one_yr_target_price() fifty = stock.get_50day_moving_avg() two_hundred = stock.get_200day_moving_avg() info = Stock(name, price, pe, final_yield, final_div, target, fifty, two_hundred) beta = Beta(ticker) return render_template("stock-info.html", name=info.name, num_beta=beta.calculate_beta(), beta=beta.compare_beta(), pe_num=final_pe, pe=info.compare_pe(), ey_num=final_yield, ey=info.compare_earn_yield(), div_num=final_div, div=info.compare_div(), fifty=fifty, two=two_hundred, ma_compare=info.compare_ma(), target_num=target, target=info.compare_target(), obj=obj, time=time, stock=stock_list)
def main(): # this adds commas to all numbers greater than one thousand locale.setlocale(locale.LC_ALL, 'en_US') # if statement that checks for args. error/help message will appear if no args if (len(sys.argv) == 1): print "\nPlease supply one or more tickers. Example: python stephan_s_stock_quote.py GOOG\n" else: for counter in range(1, len(sys.argv)): # this is where we fetch our stocks from y = Share(sys.argv[counter]) # this is the output along with a message regarding the CSV file print "\nSymbol: " + str(sys.argv[counter]) print "Company Name: " + str(y.get_name()) print "Market Capitalization: $" + str(y.get_market_cap()) print "Earnings Per Share: $" + str( locale.format( "%d", float(y.get_earnings_share()), grouping=True)) print "P/E Ratio: " + str(y.get_price_earnings_ratio()) print "Average Volume: " + str( locale.format( "%d", float(y.get_avg_daily_volume()), grouping=True)) print "Today's Volume: " + str( locale.format("%d", float(y.get_volume()), grouping=True)) print "Today's Closing Price: $" + str(y.get_price()) print "Percent Change: " + str(y.get_percent_change()) + "\n" print "A CSV file of your selected stock tickers has been downloaded to your computer under the name 'stocks.csv'. " + "\n" print "The CSV file will be downloaded to the same folder that this program was stored in." + "\n"
class Symbol(object): def __init__(self, symbol, s_date=None, e_date=None): self.log=Logging() self.name=symbol self.created=datetime.datetime.utcnow() self.log.info("created {}".format(self.name)) try: self.share=Share(symbol) except: self.log.error("platform is offline or not connecting") if s_date and e_date: self.begin=s_date self.end=e_date try: self.share=Share(symbol) self.data=self.share.get_historical(self.begin, self.end) self.log.refresh("{} data collected".format(self.name)) except: self.log.error("platform is offline or not connecting") def refresh_data(self, s_date=None, e_date=None): if s_date and e_date: try: share=Share(self.name) self.begin=s_date self.end=e_date share.get_historical(s_date, e_date) self.log.refresh("{} data collected".format(self.name)) except: self.log.error("platform is offline or not connecting") def market_cap(self): try: self.market_cap = self.share.get_market_cap() self.log.info("{} market cap refreshed".format(self.name)) except: self.log.error("platform is offline or not connecting") def earnings_per_share(self): try: self.eps = self.share.get_earnings_share() self.log.info("{} eps refreshed".format(self.name)) except: self.log.error("platform is offline or not connecting") def moving_average_50(self): try: self.moving_average_50 = self.share.get_50day_moving_average() self.log.info("{} 50 day moving ave refreshed".format(self.name)) except: self.log.error("platform is offline or not connecting") #implement TODO def nday_moving_average(self, n): try: self.moving_average_n = None self.log.info("{} {} day moving ave refreshed".format(self.name, n)) except: self.log.error("platform is offline or not connecting") def price_earnings_ratio(self): try: self.price_to_earnings = self.share.get_price_earnings_ratio() self.log.info("{} price to earnings refreshed".format(self.name)) except: self.log.error("platform is offline or not connecting") def book_value(self): try: self.book = self.share.get_price_book() self.log.info("{} book value refreshed".format(self.name)) except: self.log.error("platform is offline or not connecting") def year_high(self): try: self.year_high = self.share.get_change_from_year_high() self.log.info("{} year high change refreshed".format(self.name)) except: self.log.error("platform is offline or not connecting") def year_low(self): try: self.year_low = self.share.get_change_from_year_low() self.log.info("{} year low change refreshed".format(self.name)) except: self.log.error("platform is offline or not connecting") def target_price(self): try: self.year_target = self.share.get_change_from_year_high() self.log.info("{} year target change refreshed".format(self.name)) except: self.log.error("platform is offline or not connecting") def year_range(self): try: self.year_range = self.share.get_change_from_year_high() self.log.info("{} year range change refreshed".format(self.name)) except: self.log.error("platform is offline or not connecting")
def stock_quote_get(): print(request.args.get('symbol')) symbol = str(request.args.get('symbol')) # get all the relevant data from the Yahoo Finance API stock = Share(symbol) stock_name = stock.get_name() stock_symbol = stock.symbol stock_price = stock.get_price() stock_change = stock.get_change() stock_change_pct = stock.get_percent_change() prev_close = stock.get_prev_close() open = stock.get_open() day_range = stock.get_days_range() year_range = stock.get_year_range() volume = stock.get_volume() avg_volume = stock.get_avg_daily_volume() market_cap = stock.get_market_cap() pe_ratio = stock.get_price_earnings_ratio() eps = stock.get_earnings_share() dividend = stock.get_dividend_share() dividend_yld = stock.get_dividend_yield() dividend_ex_date = stock.get_ex_dividend_date() yr_target = stock.get_one_yr_target_price() historical = stock.get_historical('2017-01-01', date.isoformat(date.today())) # put the data into the DynamoDB database table = dynamodb.Table('Stocks') response = table.put_item( Item={ 'symbol': symbol, 'date': date.isoformat(date.today()), 'prev_close': prev_close, 'open': open, 'day_range': day_range, 'year_range': year_range, 'volume': volume, 'avg_volume': avg_volume, 'market_cap': market_cap, 'pe_ratio': pe_ratio, 'eps': eps, 'dividend': dividend, 'dividend_yld': dividend_yld, 'dividend_ex_date': dividend_ex_date, 'yr_target': yr_target, }) close_history = [] for point in historical: close_date = point['Date'] close_date = int( time.mktime(datetime.strptime(close_date, "%Y-%m-%d").timetuple())) close_price = point['Adj_Close'] close_price = float(close_price) close_history.append([close_date, close_price]) return render_template("stock/stock_detail.html", stock_name=stock_name, stock_symbol=stock_symbol, stock_price=stock_price, stock_change=stock_change, stock_change_pct=stock_change_pct, prev_close=prev_close, open=open, day_range=day_range, year_range=year_range, volume=volume, avg_volume=avg_volume, market_cap=market_cap, pe_ratio=pe_ratio, eps=eps, dividend=dividend, dividend_yld=dividend_yld, dividend_ex_date=dividend_ex_date, yr_target=yr_target, close_history=close_history)
print "The CSV file will be downloaded to the same folder that this program was stored in." + "\n" # code that creates the CSV file with open('stocks.csv', 'w') as fp: outputFile = csv.writer(fp) data1 = [[ 'Symbol', 'Company Name', 'Market Capitalization', 'Earnings Per Share', 'P/E Ratio', 'Average Volume', 'Today\'s Volume', 'Today\'s Closing Price', 'Percent Change' ]] outputFile.writerows(data1) for counter in range(1, len(sys.argv)): y = Share(sys.argv[counter]) data2 = [[ str(sys.argv[counter]), str(y.get_name()), str(y.get_market_cap()), str(y.get_earnings_share()), str(y.get_price_earnings_ratio()), str(y.get_avg_daily_volume()), str(y.get_volume()), str(y.get_price()), str(y.get_percent_change()) ]] outputFile.writerows(data2) if __name__ == '__main__': main()
Find "under valued" companies import time from yahoo_finance import Share Russell3000 = ['FLWS', 'SRCE', 'FOXA', 'FOX', 'TWOU', 'DDD', 'MMM', 'EGHT', 'AVHI', 'ATEN', 'AAC', 'AAON', 'AIR', 'AAN', 'ABAX', 'ABT', 'ABBV', 'ANF', 'ABMD', 'ABM', 'AXAS', 'ACIA', 'ACTG', 'ACHC', 'ACAD', 'AKR', 'AXDX', 'XLRN', 'ACN', 'ANCX', 'ACCO', 'ARAY', 'ACRX', 'ACET', 'ACHN', 'ACIW', 'ACRS', 'ACNB', 'ACOR', 'ATVI', 'ACTA', 'ATU', 'AYI', 'ACXM', 'ADMS', 'AE', 'ADUS', 'ADPT', 'ADBE', 'ADTN', 'ADRO', 'AAP', 'WMS', 'AEIS', 'AMD', 'ADXS', 'ADVM', 'ABCO', 'ACM', 'AEGN', 'AEPI', 'AERI', 'HIVE', 'AJRD', 'AVAV', 'AES', 'AET', 'AMG', 'AFL', 'MITT', 'AGCO', 'AGEN', 'AGRX', 'A', 'AGYS', 'AGIO', 'GAS', 'ADC', 'AGFS', 'AIMT', 'AL', 'AIRM', 'APD', 'ATSG', 'AYR', 'AKS', 'AKAM', 'AKBA', 'AKRX', 'ALG', 'ALRM', 'ALK', 'AIN', 'AMRI', 'ALB', 'AA', 'ALDR', 'ALR', 'ALEX', 'ALX', 'ARE', 'ALXN', 'ALCO', 'ALGN', 'ALJJ', 'ALKS', 'Y', 'ATI', 'ABTX', 'ALGT', 'ALLE', 'AGN', 'ALE', 'ADS', 'AOI', 'LNT', 'AMOT', 'AWH', 'ALSN', 'MDRX', 'ALL', 'ALLY', 'AFAM', 'ALNY', 'ALJ', 'AOSL', 'GOOGL', 'GOOG', 'ASPS', 'RESI', 'AIMC', 'MO', 'AMAG', 'AMZN', 'AMBC', 'AMBA', 'AMBR', 'AMC', 'AMCX', 'DOX', 'AMED', 'APEI', 'UHAL', 'AEE', 'AAL', 'AAT', 'AXL', 'ACC', 'MTGE', 'AGNC', 'AEO', 'AEP', 'AEL', 'AXP', 'AFG', 'AMH', 'AMIC', 'AIG', 'ANAT', 'AMNB', 'ARII', 'ARA', 'ASEI', 'AMSWA', 'AWR', 'AMSC', 'AMT', 'AVD', 'AMWD', 'AWK', 'CRMT', 'AMP', 'ABCB', 'AMSF', 'ABC', 'ATLO', 'AME', 'AMGN', 'FOLD', 'AMKR', 'AHS', 'AP', 'AMPH', 'APH', 'AMPE', 'BETR', 'AMSG', 'AFSI', 'APC', 'ADI', 'ALOG', 'AVXL', 'AMRC', 'ANGI', 'ANGO', 'ANIP', 'ANIK', 'AXE', 'NLY', 'ANSS', 'AR', 'ANTM', 'ANTH', 'ANH', 'AON', 'APA', 'AIV', 'APIC', 'APOG', 'ARI', 'APOL', 'AMTG', 'APPF', 'APLE', 'AAPL', 'AGTC', 'AIT', 'AMAT', 'AMCC', 'AAOI', 'ATR', 'WTR', 'AQMS', 'ARMK', 'PETX', 'ARC', 'ARCB', 'ACGL', 'ADM', 'AROC', 'ACAT', 'ARDX', 'ASC', 'ARNA', 'ACRE', 'AGX', 'AGII', 'ARGS', 'ARIA', 'AI', 'ANDE', 'AFI', 'AWI', 'ARRY', 'ARRS', 'ARW', 'AROW', 'ARWR', 'ARTNA', 'APAM', 'ANET', 'ABG', 'ASNA', 'ASCMA', 'AHP', 'AHT', 'ASH', 'AHL', 'AZPN', 'ASB', 'AC', 'AIZ', 'AGO', 'ASTE', 'AST', 'AF', 'ATRO', 'T', 'ATRA', 'ATHN', 'ATHX', 'ACBI', 'AT', 'ABY', 'AAWW', 'AFH', 'TEAM', 'ATO', 'ATNI', 'ATRC', 'ATRI', 'ATW', 'ABTL', 'ADSK', 'ADP', 'AN', 'AZO', 'AVB', 'AHH', 'ARR', 'AVY', 'AVXS', 'AVG', 'AVID', 'AVGR', 'CAR', 'AVA', 'AVT', 'AVP', 'AVX', 'AXTA', 'ACLS', 'AXLL', 'AXS', 'AXGN', 'AXON', 'AXSM', 'AZZ', 'BGS', 'RILY', 'BW', 'BMI', 'BHI', 'BCPC', 'BWINB', 'BLL', 'BANC', 'BANF', 'BLX', 'TBBK', 'BXS', 'BKMU', 'BAC', 'BOH', 'BMRC', 'BK', 'OZRK', 'BFIN', 'RATE', 'BKU', 'BWFG', 'BANR', 'BHB', 'BNED', 'BKS', 'B', 'AGR', 'AVNU', 'BAX', 'BV', 'BBT', 'BBCN', 'BBX', 'BEAV', 'BECN', 'BSF', 'BZH', 'BDX', 'BBBY', 'BELFB', 'BDC', 'BLCM', 'BEL', 'BMS', 'BHE', 'BNCL', 'BNFT', 'WRB', 'BRK.B', 'BHLB', 'BERY', 'BBY', 'BGCP', 'BGFV', 'BIG', 'BH', 'BBG', 'BPTH', 'BCRX', 'BIIB', 'BMRN', 'BIO', 'BIOS', 'BSTC', 'TECH', 'BEAT', 'BTX', 'BJRI', 'BBOX', 'BKH', 'BKFS', 'BLKB', 'HAWK', 'BLK', 'CUDA', 'BBSI', 'BSET', 'BLBD', 'BUFF', 'BCRH', 'BHBK', 'NILE', 'BLUE', 'BPMC', 'BRG', 'BMCH', 'BNCN', 'BOBE', 'BA', 'BOFI', 'WIFI', 'BCC', 'BOJA', 'BOKF', 'BOOT', 'BAH', 'BWA', 'SAM', 'BPFH', 'BXP', 'BSX', 'EPAY', 'BOX', 'BYD', 'BRC', 'BDN', 'BDGE', 'BPI', 'BGG', 'BFAM', 'BCOV', 'EAT', 'BCO', 'BMY', 'BRS', 'BRX', 'AVGO', 'BR', 'BSFT', 'BRCD', 'BKD', 'BRKL', 'HRB', 'BLMN', 'BCOR', 'BRKR', 'BC', 'BMTC', 'BLMT', 'BKE', 'BWLD', 'BBW', 'BLDR', 'BG', 'BURL', 'BWXT', 'CFFI', 'CHRW', 'BNK', 'CA', 'CAB', 'CABO', 'CBT', 'CCMP', 'COG', 'CACI', 'CDNS', 'CACQ', 'CZR', 'CSTE', 'CAI', 'CALM', 'CLMS', 'CAMP', 'CAA', 'CVGW', 'CAL', 'CCC', 'CFNB', 'CRC', 'CWT', 'CALX', 'ELY', 'CALD', 'CPE', 'CPN', 'ABCD', 'CBM', 'CAC', 'CPT', 'BRKS', 'BRO', 'BF.A', 'BF.B', 'CCBG', 'COF', 'CSU', 'CFFN', 'CMO', 'CARA', 'CRR', 'CARB', 'CFNL', 'CAH', 'CSII', 'CATM', 'CCP', 'CRCM', 'CECO', 'CTRE', 'CSL', 'KMX', 'CKEC', 'CCL', 'CARO', 'CRS', 'CSV', 'CRZO', 'TAST', 'CRI', 'CACB', 'CSCD', 'CWST', 'CASY', 'CSH', 'CASS', 'CSLT', 'CTLT', 'CTT', 'CAT', 'CATY', 'CATO', 'CVCO', 'CAVM', 'CBZ', 'CBL', 'CBOE', 'CBG', 'CPB', 'CMN', 'CPLA', 'CBF', 'CDR', 'CGI', 'CE', 'CPXX', 'CELG', 'CLDX', 'CBMG', 'CEMP', 'CNC', 'CNP', 'CSFL', 'CETV', 'CENT', 'CPF', 'CVCY', 'CENX', 'CNBKA', 'CNTY', 'CCS', 'CTL', 'CPHD', 'CERN', 'CERS', 'CEVA', 'CF', 'ECOM', 'CRL', 'GTLS', 'CHTR', 'CHFN', 'CCF', 'CLDT', 'CAKE', 'CHEF', 'CHGG', 'CHE', 'CHFC', 'CCXI', 'CHMT', 'CHMG', 'LNG', 'CHK', 'CHSP', 'CPK', 'CBS', 'CDK', 'CDW', 'CEB', 'CECE', 'CIM', 'CMRX', 'CMG', 'CHH', 'CDXC', 'CB', 'CHD', 'CHDN', 'CHUY', 'CDTX', 'CIEN', 'CI', 'XEC', 'CMPR', 'CBB', 'CINF', 'CNK', 'CTAS', 'CIR', 'CRUS', 'CSCO', 'CIT', 'CTRN', 'C', 'CZNC', 'CFG', 'CIA', 'CTXS', 'CHCO', 'CIO', 'CIVI', 'CLC', 'CLNE', 'CLH', 'CCO', 'CLFD', 'CLW', 'CLF', 'CSBK', 'CLX', 'CLVS', 'MYCC', 'CME', 'CVX', 'CBI', 'CHS', 'PLCE', 'COBZ', 'COKE', 'KO', 'CDXS', 'CVLY', 'CDE', 'CCOI', 'CGNX', 'CTSH', 'CNS', 'COHR', 'CHRS', 'COHU', 'CFX', 'CL', 'CLCT', 'COLL', 'CLNY', 'SFR', 'COLB', 'CPGX', 'CXP', 'COLM', 'CMCO', 'CMCSA', 'CMA', 'FIX', 'CSAL', 'CBSH', 'CMC', 'COMM', 'CBU', 'CYH', 'CHCT', 'CTBI', 'COB', 'CVLT', 'CMP', 'CPSI', 'CSC', 'CIX', 'SCOR', 'CMTL', 'CAG', 'CMS', 'CNA', 'CCNE', 'CNO', 'COH', 'CIE', 'CNOB', 'CONN', 'COP', 'CNX', 'CNSL', 'ED', 'CTO', 'CWCO', 'STZ', 'MCF', 'CBPX', 'CLR', 'CTRL', 'CVG', 'COO', 'CPS', 'CTB', 'CPA', 'CPRT', 'CORT', 'CORE', 'CLGX', 'CORR', 'COR', 'CVRS', 'CSOD', 'GLW', 'OFC', 'CXW', 'CRVL', 'CRVS', 'CMRE', 'CSGP', 'COST', 'COTV', 'COTY', 'ICBK', 'CUZ', 'CVA', 'CVTI', 'COWN', 'PMTS', 'CNCE', 'CXO', 'CFMS', 'CNMD', 'CTWS', 'CACC', 'CREE', 'CROX', 'CCRN', 'CCI', 'CCK', 'CRY', 'CSGS', 'CSRA', 'CSS', 'CST', 'CSWI', 'CSX', 'CTS', 'CUNB', 'CUBE', 'CUB', 'CFR', 'CFI', 'CMI', 'CRIS', 'CW', 'CUBI', 'CUTR', 'CVBF', 'CVT', 'CVI', 'CVS', 'CYNO', 'CY', 'CONE', 'CYS', 'CYTK', 'CTMX', 'CYTR', 'DHI', 'DJCO', 'DAKT', 'DAN', 'DHR', 'DRI', 'DAR', 'DTLK', 'BCR', 'CRAI', 'CBRL', 'BREW', 'CR', 'CRD.B', 'CRAY', 'DECK', 'DE', 'DFRG', 'TACO', 'DK', 'DLPH', 'DAL', 'DLA', 'DGAS', 'DEL', 'DLX', 'DWRE', 'DNR', 'DENN', 'XRAY', 'DEPO', 'DERM', 'DXLG', 'DVN', 'DV', 'DXCM', 'DHX', 'DHT', 'DHIL', 'DO', 'DRII', 'FANG', 'DRH', 'DKS', 'DBD', 'DGII', 'DMRC', 'DLR', 'DGI', 'DDS', 'DCOM', 'DMTX', 'DIN', 'DIOD', 'DPLO', 'DFS', 'PLAY', 'DVA', 'DWSN', 'DCT', 'DDR', 'DF', 'DPZ', 'UFS', 'DCI', 'DGICA', 'RRD', 'LPG', 'DORM', 'PLOW', 'DEI', 'DOV', 'DOW', 'DPS', 'DWA', 'DW', 'DRQ', 'DSPG', 'DST', 'DSW', 'DTE', 'DTSI', 'DD', 'DCO', 'DUK', 'DRE', 'DLTH', 'DNB', 'DNKN', 'DFT', 'DRRX', 'DXPE', 'DY', 'BOOM', 'DVAX', 'DYN', 'DX', 'ETFC', 'EGBN', 'EXP', 'EGRX', 'ELNK', 'ESTE', 'EWBC', 'DISCA', 'DISCK', 'DISH', 'DIS', 'DLB', 'DG', 'DLTR', 'D', 'EBIX', 'ECHO', 'SATS', 'ECR', 'ECL', 'EDGE', 'EPC', 'EIX', 'EDIT', 'EDR', 'EW', 'EGLT', 'EHTH', 'EIGR', 'EE', 'LOCO', 'ERI', 'ELRC', 'ESIO', 'EA', 'EFII', 'RDEN', 'ELLI', 'PERY', 'EMC', 'EMCI', 'EME', 'EMKR', 'EBS', 'EMR', 'EDE', 'NYNY', 'ESRT', 'EIG', 'ENTA', 'ECPG', 'WIRE', 'ENDP', 'ECYT', 'ELGX', 'DEA', 'EGP', 'EMN', 'KODK', 'ETN', 'EV', 'EBAY', 'EBF', 'ENVA', 'NPO', 'ESV', 'ENSG', 'ESGR', 'ENTG', 'ENTL', 'ETM', 'ETR', 'EBTC', 'EFSC', 'EVC', 'ENV', 'EVHC', 'ENZ', 'EOG', 'EPE', 'EPAM', 'EPIQ', 'EPZM', 'PLUS', 'EPR', 'EQT', 'EFX', 'EQIX', 'EQBK', 'EQC', 'ELS', 'EQY', 'EQR', 'ERA', 'ERIE', 'ERN', 'EROS', 'ESCA', 'ESE', 'ESPR', 'ESSA', 'ESND', 'ESNT', 'EIGI', 'ENH', 'EGN', 'ENR', 'WATT', 'ERII', 'ENOC', 'ENS', 'EGL', 'RE', 'ES', 'EVTC', 'EVDY', 'EVH', 'EPM', 'EXA', 'EXAS', 'EXAC', 'EXAM', 'EXAR', 'XCO', 'EXEL', 'EXC', 'EXLS', 'XONE', 'EXPE', 'EXPD', 'EXPO', 'EXPR', 'ESRX', 'STAY', 'EXTN', 'EXR', 'EXTR', 'XOM', 'EZPW', 'FFIV', 'FN', 'FB', 'FDS', 'FICO', 'FCS', 'FMSA', 'FRP', 'FARM', 'FFKT', 'FMNB', 'FPI', 'ESS', 'EL', 'ESL', 'ETH', 'ETSY', 'EEFT', 'EVER', 'EVR', 'FNHC', 'FDX', 'FEIC', 'FCH', 'FOE', 'GSM', 'FGEN', 'FGL', 'FIS', 'LION', 'FRGI', 'FSAM', 'FITB', 'FNGN', 'FISI', 'FNSR', 'FINL', 'FEYE', 'FAF', 'FNLC', 'FBNC', 'FBP', 'BUSE', 'FBIZ', 'FCFS', 'FCNCA', 'FCBC', 'FCF', 'FCFP', 'FBNK', 'FDC', 'FDEF', 'FFBC', 'THFF', 'FFIN', 'FFNW', 'FFWM', 'FHN', 'FR', 'INBK', 'FARO', 'FAST', 'FFG', 'FBRC', 'FCB', 'AGM', 'FDML', 'FRT', 'FSS', 'FII', 'FRC', 'FSLR', 'FE', 'FMER', 'FISV', 'FIT', 'FIVE', 'FPRX', 'FIVN', 'FBC', 'FLT', 'FLTX', 'FLKS', 'FLXN', 'FLXS', 'FLIR', 'FTK', 'FLO', 'FLS', 'FLDM', 'FLR', 'FFIC', 'FMC', 'FTI', 'FNB', 'FNF', 'FNFV', 'FOGO', 'FL', 'F', 'FCE.A', 'FOR', 'FORM', 'FORR', 'FTNT', 'FBIO', 'FBHS', 'FET', 'FIBK', 'FLIC', 'FRME', 'FMBH', 'FMBI', 'FNBC', 'FNFG', 'FNWB', 'FPO', 'BEN', 'FSP', 'FRED', 'FCX', 'RAIL', 'FDP', 'FRPT', 'FTR', 'FRO', 'FRPH', 'FTD', 'FCN', 'FCEL', 'FULT', 'FF', 'GK', 'GAIA', 'GCAP', 'GALE', 'AJG', 'GBL', 'GME', 'GLPI', 'GCI', 'GPS', 'GRMN', 'IT', 'GLOG', 'GMT', 'GCP', 'GENC', 'GNRT', 'GNRC', 'BGC', 'GNCMA', 'GD', 'GE', 'GGP', 'GIS', 'FWRD', 'FOSL', 'FMI', 'FCPT', 'FXCB', 'FOXF', 'FRAN', 'FC', 'FELE', 'FSB', 'FI', 'THRM', 'GPC', 'GNW', 'GEO', 'GEOS', 'GABC', 'GERN', 'GTY', 'ROCK', 'GIMO', 'GIG', 'GILD', 'GBCI', 'GOOD', 'GLT', 'GKOS', 'GBT', 'BRSS', 'ENT', 'GBLI', 'GNL', 'GPN', 'GSOL', 'GWRS', 'GSAT', 'GLOB', 'GMED', 'GLUU', 'GLYC', 'GMS', 'GNC', 'GDDY', 'GOGO', 'GLNG', 'GORO', 'GDEN', 'GS', 'GM', 'GCO', 'GWR', 'GEN', 'GNE', 'GNMK', 'GHDX', 'G', 'GNTX', 'GIII', 'GVA', 'GPK', 'GTN', 'AJX', 'GLDD', 'GXP', 'GSBC', 'GWB', 'GB', 'GNBC', 'GRBK', 'GDOT', 'GPRE', 'GBX', 'GCBC', 'GHL', 'GLRE', 'GEF', 'GRIF', 'GFF', 'GPI', 'GRPN', 'GRUB', 'GTT', 'GBNK', 'GES', 'GUID', 'GWRE', 'GPOR', 'HEES', 'HABT', 'HCKT', 'HAE', 'HAIN', 'HAL', 'HALL', 'HALO', 'HYH', 'GT', 'GPRO', 'GRC', 'GOV', 'GPX', 'GRA', 'GGG', 'GHM', 'GHC', 'GWW', 'GPT', 'LOPE', 'HLIT', 'HRS', 'HSC', 'HIG', 'HAS', 'HTS', 'HVT', 'HE', 'HA', 'HCOM', 'HWKN', 'HAYN', 'FUL', 'HCHC', 'HCA', 'HCI', 'HCP', 'HDS', 'HW', 'HR', 'HCSG', 'HTA', 'HQY', 'HLS', 'HSTM', 'HWAY', 'HTLD', 'HTLF', 'HTWR', 'HL', 'HEI.A', 'HEI', 'HSII', 'HELE', 'HLX', 'HP', 'HMPR', 'HBHC', 'HNH', 'HBI', 'HAFC', 'HASI', 'THG', 'HDNG', 'HOG', 'HAR', 'HTZ', 'HSKA', 'HES', 'HPE', 'HXL', 'HF', 'HIBB', 'ONE', 'HIW', 'HIL', 'HI', 'HRC', 'HTH', 'HLT', 'HIFS', 'HMSY', 'HNI', 'HFC', 'HOLX', 'HBCP', 'HOMB', 'HD', 'HMST', 'HTBI', 'HON', 'HOFT', 'HMN', 'HBNC', 'HZN', 'HZNP', 'HRL', 'HOS', 'HDP', 'HPT', 'HST', 'HMHC', 'HLI', 'HOV', 'HMTV', 'HNNA', 'JKHY', 'HLF', 'HTBK', 'HCCI', 'HFWA', 'HRTG', 'HEOP', 'MLHR', 'HRTX', 'HT', 'HSY', 'HUN', 'HURC', 'HURN', 'H', 'HY', 'IAC', 'IBKC', 'ICFI', 'ICON', 'ICUI', 'IDA', 'IDRA', 'IEX', 'IDXX', 'IDI', 'IDT', 'IESC', 'RXDX', 'IHS', 'IIVI', 'ITW', 'ILMN', 'IMAX', 'IMMR', 'IMDZ', 'IMGN', 'IMMU', 'IMH', 'IPXL', 'IMPV', 'IMPR', 'IMS', 'INCR', 'SAAS', 'INCY', 'HHC', 'HPQ', 'HRG', 'HSNI', 'HUBG', 'HUBB', 'HUBS', 'HPP', 'HUM', 'HBAN', 'HII', 'IMKTA', 'IM', 'INGR', 'INWK', 'IPHS', 'IOSP', 'INVA', 'INGN', 'ITEK', 'INOV', 'INO', 'IPHI', 'NSIT', 'INSM', 'NSP', 'IBP', 'IIIN', 'INST', 'PODD', 'INSY', 'IART', 'IDTI', 'INTC', 'IQNT', 'NTLA', 'I', 'IPAR', 'IBKR', 'ININ', 'ICPT', 'ICE', 'IDCC', 'TILE', 'IBOC', 'IGT', 'IP', 'ISCA', 'ICD', 'IHC', 'IRT', 'IBCP', 'INDB', 'IBTX', 'INFN', 'INFI', 'IPCC', 'BLOX', 'III', 'HIFR', 'IR', 'NGVT', 'ISRG', 'IVC', 'INVN', 'SNAK', 'IVZ', 'IVR', 'ITG', 'ISBC', 'IRET', 'ITIC', 'NVTA', 'NVIV', 'IONS', 'IPGP', 'IRMD', 'IRIX', 'IRDM', 'IRBT', 'IRM', 'IRWD', 'ISLE', 'ISRL', 'STAR', 'ITC', 'ITRI', 'ITT', 'XXIA', 'IXYS', 'JJSF', 'JAX', 'JCOM', 'JBL', 'JACK', 'JEC', 'IPG', 'XENT', 'ISIL', 'IILG', 'IBM', 'INTL', 'IFF', 'ITCI', 'IL', 'SNOW', 'XON', 'INTU', 'JNPR', 'JUNO', 'LRN', 'KTWO', 'KAI', 'KALU', 'KAMN', 'KSU', 'KS', 'KAR', 'KPTI', 'KATE', 'KBH', 'KBR', 'KCG', 'KRNY', 'K', 'KELYA', 'KMPR', 'KMT', 'KW', 'KERX', 'KEY', 'KEYS', 'KEYW', 'KFRC', 'KRC', 'KE', 'KBAL', 'KMB', 'KIM', 'KMI', 'KND', 'KEX', 'KIRK', 'KITE', 'JAKK', 'JMBA', 'JRVR', 'JNS', 'JBHT', 'JBLU', 'JIVE', 'JBT', 'JNJ', 'JCI', 'JOUT', 'JONE', 'JLL', 'JOY', 'JPM', 'KRA', 'KTOS', 'KKD', 'KR', 'KRO', 'KVHI', 'LB', 'LLL', 'LJPC', 'LQ', 'LZB', 'LH', 'LADR', 'LTS', 'LSBG', 'LBAI', 'LKFN', 'LRCX', 'LAMR', 'LANC', 'LDR', 'LNDC', 'LE', 'LSTR', 'LCI', 'LPI', 'LVS', 'LHO', 'LSCC', 'LAWS', 'LAYN', 'LAZ', 'LCNB', 'KRG', 'KLAC', 'KLXI', 'KMG', 'KNX', 'KNL', 'KN', 'KSS', 'KONA', 'KOPN', 'KOP', 'KFY', 'KOS', 'LXK', 'LGIH', 'LHCG', 'LBY', 'BATRA', 'BATRK', 'LBRDA', 'LBRDK', 'QVCA', 'LMCA', 'LMCK', 'LPT', 'LSXMA', 'LSXMK', 'TAX', 'LTRPA', 'LVNTA', 'LOCK', 'LPNT', 'LCUT', 'LFVN', 'LWAY', 'LGND', 'LLY', 'LLNW', 'LMNR', 'LECO', 'LNC', 'LIND', 'LNN', 'LLTC', 'LNKD', 'LBIO', 'LIOX', 'LGF', 'LDRH', 'LEA', 'LTXB', 'LM', 'LEG', 'LDOS', 'LMAT', 'LC', 'TREE', 'LEN', 'LEN.B', 'LII', 'LUK', 'LVLT', 'LXRX', 'LXP', 'LOXO', 'LPLA', 'LXU', 'LYTS', 'LTC', 'LUB', 'LULU', 'LL', 'LITE', 'LMNX', 'LMOS', 'LDL', 'LYB', 'MTB', 'MHO', 'MCBC', 'MAC', 'CLI', 'MTSI', 'MIC', 'MGNX', 'M', 'SHOO', 'MSG', 'MGLN', 'MHLD', 'MSFG', 'MJCO', 'MBUU', 'MNK', 'MANH', 'MTW', 'LPCN', 'LQDT', 'LAD', 'LFUS', 'LYV', 'LOB', 'LPSN', 'LKQ', 'LMT', 'L', 'LOGM', 'LORL', 'LPX', 'LOW', 'VAC', 'MMC', 'MRTN', 'MLM', 'MRVL', 'MAS', 'MASI', 'DOOR', 'MTZ', 'MA', 'MTDR', 'MTCH', 'MTRN', 'MTRX', 'MATX', 'MAT', 'MATW', 'MFRM', 'MXIM', 'MMS', 'MXL', 'MXWL', 'MBFI', 'MBI', 'MBTF', 'MCFT', 'MKC', 'MDR', 'MCD', 'MGRC', 'MCK', 'MDCA', 'MDC', 'MDU', 'MFS', 'MN', 'MNKD', 'MAN', 'MANT', 'MRO', 'MPC', 'MCHX', 'MMI', 'MCS', 'MPX', 'HZO', 'MKL', 'MKTX', 'MKTO', 'MRLN', 'MAR', 'MBWM', 'MBVT', 'MRK', 'MCY', 'MRCY', 'MDP', 'EBSB', 'VIVO', 'MMSI', 'MTH', 'MTOR', 'MACK', 'MLAB', 'CASH', 'MPG', 'MEI', 'MET', 'MTD', 'MFA', 'MGEE', 'MTG', 'MGM', 'MGPI', 'KORS', 'MIK', 'MCHP', 'MU', 'MSCC', 'MSFT', 'MSTR', 'MAA', 'MJN', 'MDGN', 'MEG', 'MPW', 'MDCO', 'MNOV', 'MDSO', 'MED', 'MDVN', 'MDLY', 'MD', 'MDT', 'MEET', 'MRD', 'MENT', 'MOD', 'MC', 'MHK', 'MOH', 'TAP', 'MNTA', 'MCRI', 'MDLZ', 'MGI', 'MNR', 'MORE', 'MPWR', 'TYPE', 'MNRO', 'MON', 'MNST', 'MWW', 'MCO', 'MOG.A', 'MS', 'MORN', 'MOS', 'MPAA', 'MSI', 'MOV', 'MRC', 'MSA', 'MSM', 'MSCI', 'MSGN', 'MTSC', 'MLI', 'MWA', 'MBRG', 'MIDD', 'MSEX', 'MSBI', 'MOFG', 'MCRN', 'MLR', 'MDXG', 'MB', 'MTX', 'NERV', 'MRTX', 'MG', 'MITK', 'MKSI', 'MINI', 'MOBL', 'MODN', 'NDAQ', 'NTRA', 'NATH', 'NBHC', 'NKSH', 'FIZZ', 'NCMI', 'NCOM', 'NFG', 'NGHC', 'NHI', 'NHC', 'NATI', 'NATL', 'NOV', 'NPK', 'NRCIA', 'NNN', 'NSA', 'NWLI', 'NSM', 'NGS', 'NGVC', 'NHTC', 'NATR', 'BABY', 'NLS', 'NAVI', 'NCI', 'NAVG', 'LABL', 'MPSX', 'MFLX', 'MUR', 'MUSA', 'MFSF', 'MYE', 'MYL', 'MYOK', 'MYRG', 'MYGN', 'NBR', 'NC', 'NANO', 'NSTG', 'NK', 'NBIX', 'NSR', 'NVRO', 'NWHM', 'NJR', 'NEWM', 'NEWR', 'NRZ', 'SNR', 'NYCB', 'NYMT', 'NYRT', 'NYT', 'NWL', 'NFX', 'NLNK', 'NEU', 'NEM', 'NR', 'NWSA', 'NWS', 'NEWS', 'NXRT', 'NXST', 'NEE', 'EGOV', 'NCBS', 'NLSN', 'NIHD', 'NKE', 'NMBL', 'NI', 'NNA', 'NAV', 'NBTB', 'NCS', 'NCIT', 'NCR', 'NP', 'NEFF', 'NKTR', 'NNI', 'NEOG', 'NEO', 'NPTN', 'NEOS', 'NTAP', 'NFLX', 'NTGR', 'NTCT', 'N', 'NSAM', 'NRE', 'NRF', 'NWBI', 'NWN', 'NWE', 'NCLH', 'NOVT', 'NVAX', 'NVCR', 'DNOW', 'NRG', 'NYLD.A', 'NYLD', 'NUS', 'NUAN', 'NUE', 'NMRX', 'NUTR', 'NTRI', 'NUVA', 'NVEE', 'NVEC', 'NVDA', 'NVR', 'NXTM', 'ORLY', 'OAS', 'OXY', 'NL', 'NMIH', 'NNBR', 'HLTH', 'NE', 'NBL', 'NDLS', 'NAT', 'NDSN', 'JWN', 'NSC', 'NTK', 'NOG', 'NTRS', 'NFBK', 'NRIM', 'NOC', 'OHI', 'OME', 'OMER', 'OMCL', 'OMC', 'OMN', 'ASGN', 'ONDK', 'ON', 'OMED', 'OGS', 'OLP', 'OB', 'OMF', 'OKE', 'OPHT', 'OPK', 'OPY', 'OPB', 'ORCL', 'OSUR', 'ORBC', 'OA', 'ORC', 'TIS', 'ONVO', 'ORN', 'ORIT', 'ORA', 'ORRF', 'OFIX', 'OII', 'OCFC', 'OCLR', 'OCUL', 'OCN', 'ODP', 'OFG', 'OGE', 'ODC', 'OIS', 'ODFL', 'OLBK', 'ONB', 'ORI', 'OSBC', 'OLN', 'OLLI', 'ZEUS', 'OMAM', 'OFLX', 'PCAR', 'PACB', 'PCBK', 'PEIX', 'PMBC', 'PPBI', 'PCRX', 'PKG', 'PACW', 'PANW', 'P', 'PNRA', 'PHX', 'PZZA', 'PARR', 'PGRE', 'PRTK', 'PRXL', 'PCYG', 'PKE', 'PRK', 'PKOH', 'PSTB', 'PKD', 'PH', 'PKY', 'PE', 'PRTY', 'OSK', 'OSIS', 'OSIR', 'OTIC', 'OTTR', 'OUTR', 'OUT', 'OVAS', 'OSG', 'OSTK', 'OMI', 'OC', 'OI', 'ORM', 'OXFD', 'OXM', 'PTSI', 'PCCC', 'PFSI', 'PMT', 'PAG', 'PNR', 'PEN', 'PEBO', 'PFIS', 'PBCT', 'PUB', 'PEP', 'PRFT', 'PFGC', 'PSG', 'PKI', 'PRGO', 'PETS', 'PFNX', 'PFE', 'PFSW', 'PCG', 'PGTI', 'PIP', 'PMC', 'PHH', 'PHIIK', 'PAHC', 'PM', 'PSX', 'PLAB', 'DOC', 'PATK', 'PN', 'PEGI', 'PDCO', 'PTEN', 'PAYX', 'PAYC', 'PCTY', 'PYPL', 'PBF', 'PDCE', 'PDFS', 'PDLI', 'PDVW', 'PGC', 'PEB', 'PEGA', 'PENN', 'JCP', 'PWOD', 'PEI', 'PLUG', 'PGEM', 'PNC', 'PNM', 'PII', 'PLCM', 'POL', 'POOL', 'PLKI', 'BPOP', 'POR', 'PTLA', 'POST', 'PPS', 'PBPB', 'PCH', 'POWL', 'POWI', 'PSIX', 'PPG', 'PPL', 'PRAA', 'PRAH', 'PX', 'APTS', 'PFBC', 'PLPC', 'PICO', 'PNY', 'PDM', 'PIR', 'PPC', 'PNK', 'PNFP', 'PF', 'PNW', 'PES', 'PXD', 'PJC', 'PBI', 'PJT', 'PLNT', 'PLPM', 'PLT', 'PAH', 'PLXS', 'PRLB', 'PRSC', 'PVBC', 'PFS', 'PROV', 'PRU', 'PSB', 'PTC', 'PTCT', 'PSA', 'PEG', 'PHM', 'PBYI', 'PSTG', 'PVH', 'PZN', 'QTWO', 'QADA', 'QCRH', 'QEP', 'QGEN', 'QLIK', 'QLGC', 'QRVO', 'QTS', 'QUAD', 'KWR', 'QCOM', 'QSII', 'PFBI', 'PINC', 'PGND', 'PBH', 'TROW', 'PSMT', 'PRI', 'PRMW', 'PRIM', 'PFG', 'PVTB', 'PRA', 'PG', 'PGNX', 'PRGS', 'PGR', 'PLD', 'PFPT', 'PRO', 'PB', 'PTI', 'PRTA', 'RPT', 'RRC', 'RPD', 'RPTP', 'RAVN', 'RJF', 'RYAM', 'RYN', 'RTN', 'ROLL', 'RMAX', 'RDI', 'RELY', 'RNWK', 'RLGY', 'RP', 'O', 'RETA', 'RHT', 'RLH', 'RRGB', 'RRR', 'RWT', 'RBC', 'RGC', 'REG', 'QLYS', 'NX', 'PWR', 'DGX', 'STR', 'QDEL', 'QNST', 'Q', 'QHC', 'QUOT', 'RAX', 'RDN', 'RLGT', 'ROIAK', 'RSYS', 'RDUS', 'RDNT', 'RAS', 'RL', 'RMBS', 'ROIC', 'RPAI', 'SALE', 'RTRX', 'RVNC', 'REV', 'REX', 'REXR', 'RXN', 'RAI', 'RICE', 'RIGL', 'NAME', 'RNET', 'REI', 'RNG', 'RAD', 'RLI', 'RLJ', 'RMR', 'RRTS', 'RHI', 'ROK', 'COL', 'RMTI', 'RSTI', 'ROG', 'ROL', 'REGN', 'RGNX', 'RM', 'RF', 'RGS', 'RGLS', 'RGA', 'REIS', 'RS', 'RLYP', 'RNR', 'RNST', 'REGI', 'RCII', 'RGEN', 'RBCAA', 'FRBK', 'RSG', 'RMD', 'REXI', 'RSO', 'RECN', 'RH', 'RHP', 'STBA', 'SPGI', 'SBRA', 'SABR', 'SFE', 'SAFT', 'SGA', 'SAGE', 'SGNT', 'SAIA', 'SALM', 'CRM', 'SBH', 'SN', 'SAFM', 'SASR', 'JBSS', 'SGMO', 'SANM', 'SC', 'SPNS', 'SRPT', 'BFS', 'SBAC', 'ROP', 'RST', 'ROST', 'RSE', 'ROVI', 'RDC', 'RCL', 'RGLD', 'RES', 'RPM', 'RPXC', 'RSPP', 'RTIX', 'RUBI', 'RT', 'RTEC', 'RUSHA', 'RUTH', 'R', 'RYI', 'SHOS', 'SGEN', 'SEAS', 'EYES', 'SCWX', 'SEIC', 'SCSS', 'SIR', 'SEM', 'SIGI', 'SEMG', 'SRE', 'SMTC', 'SENEA', 'SNH', 'SENS', 'SXT', 'SQBG', 'MCRB', 'SRG', 'SCI', 'SERV', 'NOW', 'SREV', 'SFBS', 'SHAK', 'SHEN', 'SHW', 'SCG', 'SCSC', 'HSIC', 'SLB', 'SCHN', 'SCHL', 'SHLM', 'SCHW', 'SWM', 'SCLN', 'SAIC', 'SGMS', 'SQI', 'SALT', 'STNG', 'SMG', 'SSP', 'SNI', 'SEB', 'SBCF', 'CKH', 'SDRL', 'SEE', 'SHLD', 'SBGI', 'SIRI', 'SITE', 'SIX', 'SJW', 'SKX', 'SKYW', 'SWKS', 'SLG', 'SLM', 'SM', 'SFS', 'SWHC', 'AOS', 'SJM', 'SNA', 'LNCE', 'SCTY', 'SAH', 'SONC', 'SON', 'SONS', 'SRNE', 'BID', 'SFL', 'SCVL', 'SHBI', 'SHOR', 'SFLY', 'SSTK', 'SIFI', 'BSRR', 'SIGM', 'SBNY', 'SIG', 'SLGN', 'SILC', 'SGI', 'SLAB', 'SBY', 'SSNI', 'SAMG', 'SFNC', 'SPG', 'SSD', 'SPR', 'SAVE', 'SRC', 'SPLK', 'SPOK', 'SPWH', 'S', 'SFM', 'SPSC', 'SPXC', 'FLOW', 'SQ', 'SSNC', 'JOE', 'STJ', 'STAA', 'STAG', 'SSI', 'STMP', 'SMP', 'SXI', 'SWK', 'SPLS', 'SBUX', 'HOT', 'STWD', 'STRZA', 'SJI', 'SSB', 'SO', 'SCCO', 'SFST', 'SMBC', 'SONA', 'SBSI', 'LUV', 'OKSB', 'SWX', 'SWN', 'SSS', 'SP', 'SPKE', 'ONCE', 'SPAR', 'SPTN', 'SPA', 'SE', 'SPNC', 'SPB', 'SPPI', 'TRK', 'SR', 'STRA', 'SYK', 'RGR', 'SCMP', 'SCNB', 'SMMF', 'INN', 'SUM', 'SNBC', 'SUI', 'SNHY', 'SXC', 'SPWR', 'RUN', 'SHO', 'STI', 'SMCI', 'SPN', 'SUP', 'SGC', 'SUPN', 'SVU', 'STS', 'STFC', 'STBZ', 'SNC', 'STT', 'STLD', 'SCS', 'SMRT', 'STML', 'SCL', 'SRCL', 'STL', 'STC', 'SF', 'SWC', 'SYBT', 'SGBK', 'SRI', 'STOR', 'STRP', 'SSYS', 'STRT', 'STRS', 'TLRD', 'TTWO', 'TAL', 'TLN', 'TLMR', 'TNDM', 'SKT', 'TNGO', 'TRGP', 'TGT', 'TASR', 'TCO', 'TMHC', 'TCB', 'AMTD', 'TMH', 'TISI', 'TECD', 'TTGT', 'TE', 'TK', 'TNK', 'TGNA', 'TRC', 'TDOC', 'TDY', 'SGRY', 'SCAI', 'SRDX', 'SIVB', 'SWFT', 'SYKE', 'SYMC', 'SSRG', 'SYNA', 'SNCR', 'SYF', 'SNDX', 'SGYP', 'SYRG', 'SNX', 'SNPS', 'SNV', 'SYNT', 'SYN', 'SYUT', 'SYY', 'SYX', 'TTOO', 'DATA', 'TAHO', 'TTI', 'TTPH', 'TCBI', 'TXN', 'TXRH', 'TGH', 'TXT', 'TFSL', 'TGTX', 'CC', 'TCS', 'KHC', 'PCLN', 'WEN', 'TXMD', 'TBPH', 'TMO', 'THR', 'TPRE', 'TRI', 'THO', 'TDW', 'TIER', 'TFX', 'TNAV', 'TDS', 'TTEC', 'TLGT', 'TPX', 'THC', 'TNC', 'TEN', 'TDC', 'TER', 'TEX', 'GLBL', 'TERP', 'TVIA', 'TRNO', 'TBNK', 'TSRO', 'TESO', 'TSLA', 'TSO', 'TSRA', 'TTEK', 'TDG', 'TRXC', 'RIG', 'TRU', 'TRV', 'TVPT', 'TRR', 'TREC', 'TG', 'THS', 'TRVN', 'TREX', 'TPH', 'TRCO', 'TCBK', 'TRS', 'TRMB', 'TNET', 'TRN', 'TPHS', 'TSE', 'TRIP', 'GTS', 'TSC', 'TBK', 'TIF', 'TTS', 'TLYS', 'TIME', 'TWX', 'TKR', 'TMST', 'TIPT', 'TWI', 'TITN', 'TTNP', 'TIVO', 'TJX', 'TMUS', 'TBRA', 'TKAI', 'TOL', 'TMP', 'TR', 'BLD', 'TMK', 'TTC', 'TSS', 'TOWR', 'TOWN', 'TSQ', 'TSCO', 'SLCA', 'UBNT', 'UCP', 'UDR', 'UFPT', 'UGI', 'ULTA', 'ULTI', 'UCTT', 'RARE', 'UTEK', 'UMBF', 'UMH', 'UMPQ', 'UA', 'UA.C', 'UFI', 'UNF', 'UBSH', 'UNB', 'UNP', 'TGI', 'TRNC', 'TROX', 'TROV', 'TBI', 'TRUE', 'TRUP', 'TRST', 'TRMK', 'TTMI', 'TUBE', 'TUES', 'TUMI', 'TUP', 'TPB', 'TPC', 'TWTR', 'TWO', 'TYC', 'TYL', 'TSN', 'USCR', 'USG', 'USPH', 'UHS', 'UVE', 'ULH', 'UVSP', 'UNM', 'UE', 'URBN', 'UBA', 'USB', 'ECOL', 'USFD', 'USAT', 'USAK', 'USNA', 'USMD', 'UTMD', 'VFC', 'MTN', 'VLO', 'VHI', 'VR', 'VLY', 'VMI', 'VAL', 'UFAB', 'UIS', 'UNT', 'UBSI', 'UCFC', 'UCBI', 'UAL', 'UBNK', 'UFCS', 'UIHC', 'UNFI', 'UNTD', 'UPS', 'URI', 'USM', 'USLM', 'X', 'UTX', 'UTHR', 'UNH', 'UTL', 'UNVR', 'UAM', 'UVV', 'OLED', 'UEIC', 'UFPI', 'UHT', 'VRTX', 'VIA', 'VIAB', 'VVI', 'VSAT', 'VIAV', 'VICR', 'VRAY', 'VLGEA', 'VNCE', 'VA', 'VHC', 'VIRT', 'VRTS', 'VRTU', 'V', 'VSH', 'VPG', 'VSTO', 'VC', 'VALU', 'VNDA', 'VNTV', 'VAR', 'VRNS', 'VDSI', 'VASC', 'WOOF', 'VGR', 'VVC', 'VEC', 'VECO', 'VEEV', 'VTR', 'VRA', 'VCYT', 'VER', 'PAY', 'VRNT', 'VRSN', 'VRSK', 'VBTX', 'VRTV', 'VZ', 'VSAR', 'WM', 'WAT', 'WSBF', 'WSO', 'WTS', 'WVE', 'W', 'WCIC', 'WDFC', 'WFT', 'WEB', 'WBMD', 'WBS', 'WEC', 'WTW', 'WRI', 'WMK', 'WCG', 'WFC', 'HCN', 'WERN', 'WSBC', 'WAIR', 'VTAE', 'VTL', 'VSI', 'VSLR', 'VMW', 'VCRA', 'VG', 'VNO', 'VOYA', 'VYGR', 'VSEC', 'VTVT', 'VMC', 'VWR', 'WPC', 'WTI', 'WNC', 'WBC', 'WAB', 'WDR', 'WAGE', 'WMT', 'WBA', 'WD', 'WAC', 'WAFD', 'WRE', 'WASH', 'WFBI', 'WFM', 'JW.A', 'WG', 'WLH', 'CWEI', 'WMB', 'WSM', 'WLFC', 'WIBC', 'WIN', 'WING', 'WINA', 'WGO', 'WINS', 'WTFC', 'WETF', 'WMIH', 'WWW', 'WWD', 'WCC', 'WTBA', 'WSTC', 'WMAR', 'WST', 'WABC', 'WR', 'WAL', 'WMC', 'WDC', 'WNR', 'WU', 'WFD', 'WLK', 'WLB', 'WRK', 'WHG', 'WEX', 'WEYS', 'WY', 'WGL', 'WHR', 'WTM', 'WSR', 'WWAV', 'WLL', 'YORW', 'YCB', 'YRCW', 'YUM', 'ZFGN', 'ZAGG', 'ZAYO', 'ZBRA', 'ZLTQ', 'ZEN', 'ZG', 'Z', 'ZBH', 'ZION', 'ZIOP', 'ZIXI', 'ZOES', 'ZTS', 'ZGNX', 'ZUMZ', 'ZNGA', 'WDAY', 'WKHS', 'WK', 'WRLD', 'INT', 'WWE', 'WOR', 'WPG', 'WPX', 'WMGI', 'WSFS', 'WYN', 'WYNN', 'XTLY', 'XBIT', 'XEL', 'XCRA', 'XNCR', 'XHR', 'XNPT', 'XRX', 'XLNX', 'XL', 'XOXO', 'XPO', 'MESG', 'XYL', 'YDKN', 'YHOO', 'YELP'] ofInterest = [] try: for eachStock in Russell3000: ticker = Share(eachStock) name = ticker.get_name() pbr = ticker.get_price_book() PEG5 = ticker.get_price_earnings_growth_ratio() PE12 = ticker.get_price_earnings_ratio() #print eachStock,'P/B: ',type(pbr) if pbr == None: pass elif float(pbr) < 2: if 0 < float(PEG5) < 2: if PE12 == None: PE12 = '' elif float(PE12) < 15: ofInterest.append(eachStock) print 'Name: ',name print 'Ticker: ',eachStock print 'P/B: ',pbr
from yahoo_finance import Share #yahoo = Share('YHOO') #yahoo = Share('SPXC') yahoo = Share('TFM') #yahoo = Share('INDU') #INDEXSP #yahoo = Share('NDX') print yahoo print yahoo.get_open() #'36.60' print yahoo.get_price() print yahoo.get_price_earnings_ratio() print 'get_dividend_share: ',yahoo.get_dividend_share() print 'get_dividend_yield: ',yahoo.get_dividend_yield() print 'get_earnings_share: ',yahoo.get_earnings_share() print 'get_price_earnings_ratio: ',yahoo.get_price_earnings_ratio() print 'get_price_earnings_growth_ratio: ',yahoo.get_price_earnings_growth_ratio() print 'get_year_high: ',yahoo.get_year_high() print 'get_year_low: ',yahoo.get_year_low() print 'get_days_high: ',yahoo.get_days_high() print 'get_days_low: ',yahoo.get_days_low() print 'get_ebitda: ',yahoo.get_ebitda() print 'get_book_value: ',yahoo.get_book_value() #'36.84' #print yahoo.get_trade_datetime() #'2014-02-05 20:50:00 UTC+0000' #get_avg_daily_volume()
continue stock = Share(ticker) stock.refresh() change = (float(stock.get_price()) - float( stock.get_prev_close())) / float(stock.get_prev_close()) change = round(change * 100.0, 2) if change > 0.0: change = '+' + str(change) else: change = str(change) line = ticker.ljust(7) line += stock.get_price().ljust(9)+ change.ljust(8)+ stock.get_volume().ljust(11) + \ str(round(float(stock.get_volume())/float(stock.get_avg_daily_volume())*100.0)).ljust(8) +\ stock.get_open().ljust(10)+ \ stock.get_days_low().ljust(10)+ \ stock.get_days_high().ljust(10)+ \ stock.get_year_low().ljust(10)+ \ stock.get_year_high().ljust(10) line = line + str(stock.get_market_cap()).ljust(11) + \ str(stock.get_price_earnings_ratio()).ljust(8)+\ stock.get_50day_moving_avg().ljust(10) +\ stock.get_200day_moving_avg().ljust(10) print(line) except Exception as e: print("Exception error:", str(e)) traceback.print_exc() i += 1 #you get get a spy.txt and then filter everything by yourself
def on_message(self, message): print_logger.debug("Received message: %s" % (message)) if "ValidateTicker" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed ticker validation request") self.write_message("ValidationFailed:Malformed") return ticker = message[1] if validate_ticker(ticker): self.write_message("ValidationSucceeded:%s" % ticker) print_logger.debug("Ticker was valid") else: self.write_message("ValidationFailed:%s" % ticker) print_logger.debug("Ticker was bad") return elif "GetCompanyName" in message: print_logger.debug("You got here") message = message.split(":") company_ticker = message[1] company_name = get_company_title(company_ticker) self.write_message("CompanyName:%s" % company_name) elif "GetStockData" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] # Get ticker information share_data = Share(ticker) price = share_data.get_price() percent_change = share_data.get_change() previous_close = share_data.get_prev_close() open_price = share_data.get_open() volume = share_data.get_volume() pe_ratio = share_data.get_price_earnings_ratio() peg_ratio = share_data.get_price_earnings_growth_ratio() market_cap = share_data.get_market_cap() book_value = share_data.get_price_book() average_volume = share_data.get_avg_daily_volume() dividend_share = share_data.get_dividend_share() dividend_yield = share_data.get_dividend_yield() earnings_per_share = share_data.get_earnings_share() ebitda = share_data.get_ebitda() fifty_day_ma = share_data.get_50day_moving_avg() days_high = share_data.get_days_high() days_low = share_data.get_days_low() year_high = share_data.get_year_high() year_low = share_data.get_year_low() two_hundred_day_ma = share_data.get_200day_moving_avg() # Build a string to send to the server containing the stock data share_string = "price:" + str(price) + "|"\ + "percentChange:" + str(percent_change) + "|"\ + "previousClose:" + str(previous_close) + "|"\ + "openPrice:" + str(open_price) + "|"\ + "volume:" + str(volume) + "|"\ + "peRatio:" + str(pe_ratio) + "|"\ + "pegRatio:" + str(peg_ratio) + "|"\ + "marketCap:" + str(market_cap) + "|"\ + "bookValue:" + str(book_value) + "|"\ + "averageVolume:" + str(average_volume) + "|"\ + "dividendShare:" + str(dividend_share) + "|"\ + "dividendYield:" + str(dividend_yield) + "|"\ + "earningsPerShare:" + str(earnings_per_share) + "|"\ + "ebitda:" + str(ebitda) + "|"\ + "50DayMa:" + str(fifty_day_ma) + "|"\ + "daysHigh:" + str(days_high) + "|"\ + "daysLow:" + str(days_low) + "|"\ + "yearHigh:" + str(year_high) + "|"\ + "yearLow:" + str(year_low) + "|"\ + "200DayMa:" + str(two_hundred_day_ma) + "|" self.write_message("StockData;%s" % (share_string)) print_logger.debug("Sending Message: StockData;%s" % (share_string)) elif "GetCompanyDesc" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] description = update_description_oneoff(ticker) self.write_message("CompanyDescription:%s" % str(description)) elif "GetCompanyDividend" in message and "Record" not in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] # Grab the dividend data from dividata.com dividend_url = "https://dividata.com/stock/%s/dividend" % ticker # This should potentially be a dividend_data = requests.get(dividend_url) dividend_soup = BeautifulSoup(dividend_data.text, 'html5lib') if len(dividend_soup.find_all("table")) > 0: dividend_soup = dividend_soup.find_all("table")[0] else: dividend_soup = "<h3>No dividend history found.</h3>" # Send this div up to the server self.write_message("DividendHistoryData:" + str(dividend_soup)) elif "GetCompanyDividendRecord" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] # Get the dividend record html for the table and send it up #dividend_record = strip_dividends(ticker, req_proxy) #print_logger.debug("Writing message: " + str(dividend_record)) #self.write_message("DividendRecord:" + str(dividend_record)) elif "GetBollinger" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] # Switch into the tmp directory old_dir = os.getcwd() os.chdir(TEMP_DIR) # Update the historical data for the ticker symbol YAHOO_FINANCE_HISTORICAL_OBJECT.read_ticker_historical(ticker) bands = BollingerBandStrategy(data_storage_dir="%s/historical_stock_data" % TEMP_DIR\ , ticker_file="%s/stock_list.txt" % TEMP_DIR, filtered_ticker_file=\ "%s/filtered_stock_list.txt" % TEMP_DIR) # Save the graph so that we can show it on the website bands.save_stock_chart(ticker, "%s" % TEMP_DIR) # Also let the server know that we found an answer result = bands.test_ticker(ticker) if result is not None: print_logger.debug("BB:GoodCandidate") self.write_message("BB:GoodCandidate") else: print_logger.debug("BB:BadCandidate") self.write_message("BB:BadCandidate") elif "CheckRobinhoodLogin" in message: print "HELLO WORLD!!! HELLO WORLD!!! HELLO WORLD!!!%s" % ROBINHOOD_INSTANCE if ROBINHOOD_INSTANCE.is_logged_in() is True: self.write_message("RobinhoodLoggedIn:%s" % ROBINHOOD_INSTANCE.username) else: self.write_message("RobinhoodNotLoggedIn") elif "GetPosition" in message: ticker = message.replace("GetPosition:", "") account_positions = ROBINHOOD_INSTANCE.get_position_history(active=True) user_owns_stock = False position_string = "" for position in account_positions: # Get data about the position, including current price. position_data = requests.get(position["instrument"]) position_data = json.loads(position_data._content) position.update(position_data) if position["symbol"] != ticker: continue quote_data = requests.get(position["quote"]); quote_data = json.loads(quote_data._content) position.update(quote_data) position_string = json.dumps(position) user_owns_stock = True if user_owns_stock is True: self.write_message("Position:%s" % position_string) else: self.write_message("Position:None")
def view_stock(request, ticker): if request.user.__class__.__name__ is "CustomUser": c_user = get_object_or_404(CustomUser, pk=request.user.pk) account = Account.objects.get(user=c_user) else: account = False stock = get_object_or_404(Stock, ticker=ticker) companyName = stock.ticker companyName = companyName.upper() stock = Stock.objects.get(ticker=companyName) namer = "'" + companyName + "'" ystock = Share(companyName) the_price = ystock.get_price() regex = 'Business Summary</span></th><th align="right"> </th></tr></table><p>(.+?)</p>' pattern = re.compile(regex) root_url = urllib.urlopen("http://finance.yahoo.com/q/pr?s=" + companyName + "+Profile") htmltext = root_url.read() decoded_str = str(re.findall(pattern, htmltext)).decode("utf8") encoded_str = decoded_str.encode("ascii", "ignore") stock.description = encoded_str stock.description = stock.description[:-2] stock.description = stock.description[2:] stock.book_value = ystockquote.get_book_value(companyName) stock.change = ystockquote.get_change(companyName) # stock.dividend_per_share = ystockquote.get_dividend_per_share(companyName) # stock.dividend_yield = ystockquote.get_dividend_yield(companyName) stock.ebitda = ystockquote.get_ebitda(companyName) stock.fifty_two_week_high = ystockquote.get_52_week_high(companyName) stock.fifty_two_week_low = ystockquote.get_52_week_low(companyName) stock.market_cap = ystockquote.get_market_cap(companyName) stock.short_ratio = ystockquote.get_short_ratio(companyName) stock.stock_exchange = ystockquote.get_stock_exchange(companyName) stock.volume = ystockquote.get_volume(companyName) stock.price = ystock.get_price() # yahoo_finance stock.average_daily_volume = ystock.get_avg_daily_volume() stock.earnings_per_share = ystock.get_price_earnings_ratio() stock.fifty_day_moving_avg = ystock.get_50day_moving_avg() stock.two_hundred_day_moving_avg = ystock.get_200day_moving_avg() stock.price_book_ratio = ystock.get_price_book() stock.last_sale = ystock.get_price() stock.price_earnings_growth_ratio = ystock.get_price_earnings_growth_ratio() stock.price_earnings_ratio = ystock.get_price_earnings_ratio() stock.price_sales_ratio = ystock.get_price_sales() stock.save() vl = [] acl = [] hl = [] ll = [] cl = [] ol = [] days_list = [] d = 0 seven_days_ago = datetime.datetime.now() + datetime.timedelta(-30) today = datetime.datetime.now() days = ystockquote.get_historical_prices("GOOGL", seven_days_ago.strftime("%Y-%m-%d"), today.strftime("%Y-%m-%d")) for day in days.keys(): d += 1 date_label = datetime.datetime.now() + datetime.timedelta(-d) days_list.append(date_label.strftime("%b-%d")) day_info = days.get(day) vol = int(day_info.get("Volume")) vl.append(vol) adjcl = float(day_info.get("Adj Close")) acl.append(adjcl) highs = float(day_info.get("High")) hl.append(highs) lows = float(day_info.get("Low")) ll.append(lows) closes = float(day_info.get("Close")) cl.append(closes) opens = float(day_info.get("Open")) ol.append(opens) volume = vl lows = ll opens = ol highs = hl averages = acl closes = cl days_l = days_list[::-1] context = RequestContext( request, dict( account=account, request=request, stock=stock, volume=volume, lows=lows, highs=highs, opens=opens, closes=closes, averages=averages, days_l=days_l, ), ) return render_to_response("scrapyr_app/stock.html", context=context)
if len(ticker) == 0: continue stock = Share(ticker) stock.refresh() change = (float(stock.get_price()) - float(stock.get_prev_close()))/float(stock.get_prev_close()) change = round(change *100.0, 2) if change > 0.0: change= '+' + str(change) else: change =str(change) line = ticker.ljust(7) line += stock.get_price().ljust(9)+ change.ljust(8)+ stock.get_volume().ljust(11) + \ str(round(float(stock.get_volume())/float(stock.get_avg_daily_volume())*100.0)).ljust(8) +\ stock.get_open().ljust(10)+ \ stock.get_days_low().ljust(10)+ \ stock.get_days_high().ljust(10)+ \ stock.get_year_low().ljust(10)+ \ stock.get_year_high().ljust(10) line = line + str(stock.get_market_cap()).ljust(11) + \ str(stock.get_price_earnings_ratio()).ljust(8)+\ stock.get_50day_moving_avg().ljust(10) +\ stock.get_200day_moving_avg().ljust(10) print(line) except Exception as e: print("Exception error:", str(e)) traceback.print_exc() i+=1 #you get get a spy.txt and then filter everything by yourself
def YaOrg(gather=[ 'debtToEquity', 'Trailing P/E', 'Price/Sales', 'priceToBook', 'profitMargins', 'operatingMargins', 'returnOnAssets', 'returnOnEquity', 'revenuePerShare', 'Market Cap', 'enterpriseValue', 'forwardPE', 'pegRatio', 'enterpriseToRevenue', 'enterpriseToEbitda', 'totalRevenue', 'grossProfit', 'ebitda', 'netIncomeToCommon', 'trailingEps', 'earningsGrowth', 'revenueGrowth', 'totalCash', 'totalCashPerShare', 'totalDebt', 'currentRatio', 'bookValue', 'operatingCashflow', 'beta', 'heldPercentInsiders', 'heldPercentInstitutions', 'sharesShort', 'shortRatio', 'shortPercentOfFloat', 'sharesShortPriorMonth', 'currentPrice', 'sharesOutstanding' ]): df = pd.DataFrame(columns=[ 'Date', 'Unix', 'Ticker', 'Price', 'stock_p_change', 'SP500', 'sp500_p_change', 'Difference', 'DE Ratio', 'Trailing P/E', 'Price/Sales', 'Price/Book', 'Profit Margin', 'Operating Margin', 'Return on Assets', 'Return on Equity', 'Revenue Per Share', 'Market Cap', 'Enterprise Value', 'Forward P/E', 'PEG Ratio', 'Enterprise Value/Revenue', 'Enterprise Value/EBITDA', 'Revenue', 'Gross Profit', 'EBITDA', 'Net Income Avl to Common ', 'Diluted EPS', 'Earnings Growth', 'Revenue Growth', 'Total Cash', 'Total Cash Per Share', 'Total Debt', 'Current Ratio', 'Book Value Per Share', 'Cash Flow', 'Beta', 'Held by Insiders', 'Held by Institutions', 'Shares Short (as of', 'Short Ratio', 'Short % of Float', 'Shares Short (prior ', 'Status' ]) #time.sleep(2) file_list = os.listdir("YaParse") counter = 0 passfiles = 0 for each_file in file_list: ticker = each_file.split(".json")[0] full_file_path = "YaParse/" + each_file source = open(full_file_path, "r").read() data = Share(ticker.upper()) counter += 1 print("File No: " + str(counter)) try: value_list = [] for each_data in gather: try: #value = float(source.split(gather + ':</td><td class="yfnc_tabledata1">')[1].split('</td>')[0]) regex = re.escape( each_data) + r'.*?(\d{1,8}\.\d{1,8}M?B?K?|N/A)%?' value = re.search(regex, source) value = (value.group(1)) if "B" in value: value = float(value.replace("B", '')) * 1000000000 elif "M" in value: value = float(value.replace("M", '')) * 1000000 value_list.append(value) except Exception as e: if not (each_data == 'Trailing P/E' or each_data == 'Price/Sales' or each_data == 'Market Cap'): print("Exception1: " + str(e)) print("Data: " + str(each_data) + " File: " + str(each_file)) #time.sleep(5) value = "N/A" if each_data == 'Price/Sales': value = data.get_price_sales() if each_data == 'Market Cap': value = data.get_market_cap() if each_data == 'Trailing P/E': value = data.get_price_earnings_ratio() try: if "B" in value: value = float(value.replace("B", '')) * 1000000000 elif "M" in value: value = float(value.replace("M", '')) * 1000000 except Exception as e: value = "N/A" value_list.append(value) #print(value_list) #time.sleep(5) if value_list.count("N/A") > 0: print("Passing on this file: " + str(each_file) + " ::::Count of N/A: " + str(value_list.count("N/A"))) passfiles += 1 pass else: try: df = df.append( { 'Date': "N/A", 'Unix': "N/A", 'Ticker': ticker, 'Price': "N/A", 'stock_p_change': "N/A", 'SP500': "N/A", 'sp500_p_change': "N/A", 'Difference': "N/A", 'DE Ratio': value_list[0], 'Trailing P/E': value_list[1], 'Price/Sales': value_list[2], 'Price/Book': value_list[3], 'Profit Margin': value_list[4], 'Operating Margin': value_list[5], 'Return on Assets': value_list[6], 'Return on Equity': value_list[7], 'Revenue Per Share': value_list[8], 'Market Cap': value_list[9], 'Enterprise Value': value_list[10], 'Forward P/E': value_list[11], 'PEG Ratio': value_list[12], 'Enterprise Value/Revenue': value_list[13], 'Enterprise Value/EBITDA': value_list[14], 'Revenue': value_list[15], 'Gross Profit': value_list[16], 'EBITDA': value_list[17], 'Net Income Avl to Common ': value_list[18], 'Diluted EPS': value_list[19], 'Earnings Growth': value_list[20], 'Revenue Growth': value_list[21], 'Total Cash': value_list[22], 'Total Cash Per Share': value_list[23], 'Total Debt': value_list[24], 'Current Ratio': value_list[25], 'Book Value Per Share': value_list[26], 'Cash Flow': value_list[27], 'Beta': value_list[28], 'Held by Insiders': value_list[29], 'Held by Institutions': value_list[30], 'Shares Short (as of': value_list[31], 'Short Ratio': value_list[32], 'Short % of Float': value_list[33], 'Shares Short (prior ': value_list[34], 'Current Price': value_list[35], 'Shares Outstanding': value_list[36], 'Status': "N/A" }, ignore_index=True) except Exception as e: print("Problem in DF Append: " + str(e)) print("Data: " + str(each_data) + "File: " + str(each_file)) print( 'Error on line {}'.format( sys.exc_info()[-1].tb_lineno), type(e).__name__, e) time.sleep(5) #print("DataFrame: ", df) except Exception as e: print("Problem as a whole: " + str(e)) print('Error on line {}'.format(sys.exc_info()[-1].tb_lineno), type(e).__name__, e) pass df.to_csv('YaParse_sample_NO_NA.csv') print("Done making csv") print("No. of files passed: " + str(passfiles))
def main(): # 1. get the time day = Time.get_utc_day() hours_mins = Time.get_utc_hours_minutes() # 1. Get all the list of stocks stocks = base.managers.stock_manager.get_many() # 2. go through stock and update the desired values for stock in stocks: ticker = stock.get('ticker') try: # 2.1 Get the info from the yahoo API updated_stock = Share(ticker) except: print "-->Failed to update: %s with Yahoo API" % ticker continue price = updated_stock.get_price() open = updated_stock.get_open() days_high = updated_stock.get_days_high() days_low = updated_stock.get_days_low() year_high = updated_stock.get_year_high() year_low = updated_stock.get_year_low() volume = updated_stock.get_volume() market_cap = updated_stock.get_market_cap() pe_ratio = updated_stock.get_price_earnings_ratio() div_yield = updated_stock.get_dividend_yield() change = updated_stock.get_change() change_percent = updated_stock.data_set.get('ChangeinPercent') # 2.2 Get the stock body stock_body = stock.get('body') stock_price = {hours_mins: price} if stock_body: # 1. Get the stock info for the day: stock_info = stock_body.get(day) if stock_info: stock_price = stock_info.get('price') stock_price.update({hours_mins: price}) else: stock_body = {} # 2.2.4 update the stock info dict stock_info = {'price': stock_price} stock_info.update({'open': open}) stock_info.update({'days_high': days_high}) stock_info.update({'days_low': days_low}) stock_info.update({'year_high': year_high}) stock_info.update({'year_low': year_low}) stock_info.update({'volume': volume}) stock_info.update({'market_cap': market_cap}) stock_info.update({'pe_ratio': pe_ratio}) stock_info.update({'div_yield': div_yield}) stock_info.update({'change': change}) stock_info.update({'change_percent': change_percent}) # update the stock body stock_body.update({day: stock_info}) stock.body = stock_body # 3. update the stock in the DB try: base.managers.stock_manager.update_one(stock) except: print "-->Failed to update: %s in DB" % ticker continue
from yahoo_finance import Share, Currency yahoo = Share('AAPL') yahoo.refresh() print yahoo.get_info() print yahoo.get_avg_daily_volume() print yahoo.get_stock_exchange() print yahoo.get_book_value() print yahoo.get_ebitda() print yahoo.get_dividend_share() print yahoo.get_price_earnings_ratio() print yahoo.get_short_ratio() print yahoo.get_price_book() # f = open('nasdaqlisted.txt', 'r') # print (f.readline()) # print (f.readline())
def write_technical_files(stock_code, start_time, end_time): # """ Experiment on quandl """ # print('quandl data') # mydata = quandl.get("FRED/GDP") # print(mydata) # print('hello') # data = quandl.get("WIKI/FB.11", start_date="2014-01-01", end_date="2014-12-31", collapse="monthly", transform="diff") # print(data) stock = Share(stock_code) print('stock.get_info()') print(stock.get_info()) print('get_price()') print(stock.get_price()) print('get_change()') print(stock.get_change()) print('get_stock_exchange()') print(stock.get_stock_exchange()) print('get_market_cap()') print(stock.get_market_cap()) print('get_book_value()') print(stock.get_book_value()) print('get_ebitda()') print(stock.get_ebitda()) print('get_dividend_share()') print(stock.get_dividend_share()) print('get_dividend_yield()') print(stock.get_dividend_yield()) print('get_earnings_share()') print(stock.get_earnings_share()) print('get_50day_moving_avg()') print(stock.get_50day_moving_avg()) print('get_200day_moving_avg()') print(stock.get_200day_moving_avg()) print('get_price_earnings_ratio()') print(stock.get_price_earnings_ratio()) print('get_price_earnings_growth_ratio()') print(stock.get_price_earnings_growth_ratio()) print('get_price_sales()') print(stock.get_price_sales()) print('get_price_book()') print(stock.get_price_book()) print('get_short_ratio()') print(stock.get_short_ratio()) print('historical_data') print(stock.get_historical(start_time, end_time)) historical_data = stock.get_historical(start_time, end_time) info_text = "Symbol\t" + "Stock Exchange\t" + "Price\t" + "Market Cap\t" + "Book Value\t" + "EBITDA\t" + "50d Moving Avg\t" + "100d Moving Avg\n" info_text += str(stock.get_info()['symbol']) + "\t" + str(stock.get_stock_exchange()) + "\t" + str(stock.get_price()) + "\t" + str(stock.get_market_cap()) + "\t" + str(stock.get_book_value()) + "\t"; info_text += str(stock.get_ebitda()) + "\t" + str(stock.get_50day_moving_avg()) + "\t" + str(stock.get_200day_moving_avg()) + "\n"; info_directory = '/data/info.tsv' write_to_file(info_directory, info_text) high_low_text = "date\t" + "High\t" + "Low\n" open_close_text = "date\t" + "Open\t" + "Close\n" volume_text = "date\t" + "Volume\n" for index, value in enumerate(historical_data): date = str(historical_data[len(historical_data) - 1 - index]['Date']) date = date.replace('-','') stock_high = str(historical_data[len(historical_data) - 1 - index]['High']) stock_low = str(historical_data[len(historical_data) - 1 - index]['Low']) stock_open = str(historical_data[len(historical_data) - 1 - index]['Open']) stock_close = str(historical_data[len(historical_data) - 1 - index]['Close']) stock_volume = str(int(historical_data[len(historical_data) - 1 - index]['Volume']) / 1000) high_low_text += date + "\t" + stock_high + "\t" + stock_low + "\n" open_close_text += date + "\t" + stock_open + "\t" + stock_close + "\n" volume_text += date + "\t" + stock_volume + "\n" high_low_directory = '/data/highlow.tsv' open_close_directory = '/data/openclose.tsv' volume_directory = '/data/volume.tsv' write_to_file(high_low_directory, high_low_text) write_to_file(open_close_directory, open_close_text) write_to_file(volume_directory, volume_text) ratio_text = "name\t" + "value\n" if stock.get_change() != None: name = "Change" value = str(stock.get_change()) ratio_text += name + "\t" + value + "\n" if stock.get_dividend_share() != None: name = "Dividend Share" value = str(stock.get_dividend_share()) ratio_text += name + "\t" + value + "\n" if stock.get_dividend_yield() != None: name = "Divident Yield" value = str(stock.get_dividend_yield()) ratio_text += name + "\t" + value + "\n" if stock.get_earnings_share() != None: name = "Earning Share" value = str(stock.get_earnings_share()) ratio_text += name + "\t" + value + "\n" if stock.get_price_earnings_ratio() != None: name = "Price Earning" value = str(stock.get_price_earnings_ratio()) ratio_text += name + "\t" + value + "\n" if stock.get_price_earnings_growth_ratio() != None: name = "Price Earning Growth" value = str(stock.get_price_earnings_growth_ratio()) ratio_text += name + "\t" + value + "\n" if stock.get_price_sales() != None: name = "Price Sales" value = str(stock.get_price_sales()) ratio_text += name + "\t" + value + "\n" if stock.get_price_book() != None: name = "Price Book" value = str(stock.get_price_book()) ratio_text += name + "\t" + value + "\n" if stock.get_short_ratio() != None: name = "Short" value = str(stock.get_short_ratio()) ratio_text += name + "\t" + value + "\n" ratio_directory = '/data/ratio.tsv' write_to_file(ratio_directory, ratio_text)
if myargs.change is True: change = stock.get_change() output.append(change) selections.append('Change: ') print change if myargs.avgvol is True: avgvolume = stock.get_avg_daily_volume() print avgvolume if myargs.short is True: short = stock.get_short_ratio() print short if myargs.peratio is True: pe = stock.get_price_earnings_ratio() print pe if myargs.exchange is True: exchange = stock.get_stock_exchange() if myargs.ma50 is True: ma50 = stock.get_50day_moving_avg() print ma50 if myargs.ma200 is True: ma200 = stock.get_200day_moving_avg() print ma200 if myargs.marketcap is True: marketcap = stock.get_market_cap()
def checklist(symbol, ibd50_list, ibd_session): """ Looks up information on a given stock market symbol. The returned dictionary contains all information from Dr. Wish's Stock Checklist for HONR348M. """ stock = {} # Load price data from yahoo. share = Share(symbol) ks = yahoo_ks(symbol) # Basics basics = stock["basics"] = {} basics["date"] = datetime.now().strftime("%m/%d/%Y %I:%M:%S%z") basics["symbol"] = symbol basics["equity_name"] = share.get_name() basics["price"] = float(share.get_price()) basics["52w_low"] = float(share.get_year_low()) basics["52w_high"] = float(share.get_year_high()) basics["percent_from_52w_low"] = share.get_percent_change_from_year_low() basics["percent_from_52w_high"] = share.get_percent_change_from_year_high() # IBD (Stocks only) ibd = stock["ibd"] = ibd_stock_checkup(symbol, ibd_session) # ibd["industry"] ibd["industry_rank"] = float(ibd["industry_rank"]) # ibd["industry_top5"] # ibd["3y_eps_growth"] # ibd["3y_sales_growth"] # ibd["eps_change"] ibd["eps_rating"] = float(ibd["eps_rating"]) ibd["rs_rating"] = float(ibd["rs_rating"]) # ibd["acc_distr_rating"] ibd["ibd_rating"] = float(ibd["ibd_rating"]) ibd["in_ibd50"] = symbol in ibd50_list # ibd["fundamental_greens"] # ibd["technical_greens"] ibd["next_earning"] = datetime.strptime(ibd["next_earning"], '%m/%d/%Y') # Yahoo Finance (Stocks only) yahoo = stock["yahoo"] = {} yahoo["pe"] = float(share.get_price_earnings_ratio()) yahoo["peg"] = float(share.get_price_earnings_growth_ratio()) yahoo["ps"] = float(share.get_price_sales()) yahoo["market_cap"] = share.get_market_cap() yahoo["float"] = ks["Float"] yahoo["annual_roe"] = ks["Return on Equity"] yahoo["percent_inst"] = ks["% Held by Institutions"] yahoo["percent_float_short"] = ks["Short % of Float"] yahoo["short_ratio"] = float(share.get_short_ratio()) # Evidence of an uptrend/downtrend uptrend = stock["uptrend"] = {} downtrend = stock["downtrend"] = {} pdstockdata = data.DataReader(symbol, 'yahoo', '1900-01-01') sd = StockDataFrame.retype(pdstockdata) sd.BOLL_PERIOD = 15 close1 = sd['close'][-1] close2 = sd['close'][-2] low1 = sd['low'][-1] low2 = sd['low'][-2] high1 = sd['high'][-1] high2 = sd['high'][-2] avg_30d = sd['close_30_sma'][-1] avg_4w = sd['close_20_sma'][-1] avg_10w = sd['close_50_sma'][-1] avg_30w = sd['close_150_sma'][-1] high_52w = sd['high'].tail(250).max() lbb1 = sd['boll_lb'][-1] lbb2 = sd['boll_lb'][-2] ubb1 = sd['boll_ub'][-1] ubb2 = sd['boll_ub'][-2] # Find all GLTs (ATH not broken for at least another 90 days) last_ath = 0.0 ath = Series() for day, day_high in sd['high'].iteritems(): last_ath = max(last_ath, day_high) ath.set_value(day, last_ath) ath_days = sd[sd['high'] == ath]['high'] glt = Series() for i, (day, high) in enumerate(ath_days.iteritems()): next_day = ath_days.keys()[i + 1] if i < len(ath_days) - 1 else Timestamp( str(date.today())) if next_day - day >= Timedelta('90 days'): glt.set_value(day, high) uptrend["c>30d_avg"] = close1 > avg_30d uptrend["c>10w_avg"] = close1 > avg_10w uptrend["c>30w_avg"] = close1 > avg_30w uptrend["4w>10w>30w"] = avg_4w > avg_10w > avg_30w # uptrend["w_rwb"] = uptrend["last_glt_date"] = glt.keys()[-1].to_datetime().date( ) if len(glt) > 0 else None uptrend["last_glt_high"] = glt[-1] if len(glt) > 0 else None uptrend["above_last_glt"] = len(glt) > 0 and close1 > glt[-1] uptrend["macd_hist_rising"] = sd['macdh'][-1] > sd['macdh_4_sma'][-1] uptrend["stoch_fast>slow"] = sd['rsv_10_4_sma'][-1] > sd[ 'rsv_10_4_sma_4_sma'][-1] # uptrend["bb_up_expansion_l2"] # uptrend["rs>30d_avg"] = (Need Investors.com data) # uptrend["rs_rising"] = (Need Investors.com data) uptrend["52w_high_l2"] = high_52w == high1 or high_52w == high2 uptrend["ath_l2"] = ath[-1] == high1 or ath[-2] == high2 uptrend["1y_doubled"] = close1 >= 2 * sd['close'][-255:-245].mean() # uptrend["bounce_30d_l2"] = # uptrend["bounce_10w_l2"] = # uptrend["bounce_30w_l2"] = uptrend["stoch<50"] = sd['rsv_10_4_sma'][-1] < 50 uptrend["<bb_lower_l2"] = low1 < lbb1 or low2 < lbb2 uptrend[ "above_avg_volume"] = sd['volume'][-1] > 1.5 * sd['volume_50_sma'][-1] downtrend["c<30d_avg"] = close1 < avg_30d downtrend["c<10w_avg"] = close1 < avg_10w downtrend["c<30w_avg"] = close1 < avg_30w downtrend["4w<10w<30w"] = avg_4w < avg_10w < avg_30w # downtrend["w_bwr"] = downtrend["macd_hist_falling"] = sd['macdh'][-1] < sd['macdh_4_sma'][-1] downtrend["stoch_fast<slow"] = sd['rsv_10_4_sma'][-1] < sd[ 'rsv_10_4_sma_4_sma'][-1] # downtrend["bb_down_expansion_l2"] # downtrend["bounce_30d_l2"] = # downtrend["bounce_10w_l2"] = # downtrend["bounce_30w_l2"] = downtrend["stoch>50"] = sd['rsv_10_4_sma'][-1] > 50 downtrend[">bb_upper_l2"] = high1 > ubb1 or high2 > ubb2 return stock
except: pass try: russell3000.set_value(s,'Year low',shy.get_year_low()) except: pass try: russell3000.set_value(s,'50 days MA',shy.get_50day_moving_avg()) except: pass try: russell3000.set_value(s,'200 days MA',shy.get_200day_moving_avg()) except: pass try: russell3000.set_value(s,'Price earnings ratio',shy.get_price_earnings_ratio()) except: pass try: russell3000.set_value(s,'Price earnings growth ratio',shy.get_price_earnings_growth_ratio()) except: pass try: russell3000.set_value(s,'Price sales',shy.get_price_sales()) except: pass try: russell3000.set_value(s,'Price book',shy.get_price_book()) except: pass try: