def update_graph(submit, input_value): b = Stock(input_value) d = b.get_news() df = pd.DataFrame(d) df = df[['headline', 'url']] e = pd.DataFrame([b.get_key_stats()]) e = e[['EBITDA', 'beta', 'latestEPS', 'marketcap']] return e.to_dict('records')
def update_table(submit, input_value): b = Stock(input_value) d = b.get_news() df = pd.DataFrame(d) df = df[['headline', 'url']] name = pd.DataFrame([b.get_company()]) name = name['companyName'] return [ html.Tr([ html.Td( html.A( df.iloc[i]["headline"], href=df.iloc[i]["url"], target="_blank", )) ]) for i in range(min(len(df), 10)) ]
def on_message(message): global last_activity_timer #global variable, variable, etc is required to pull 'globals' between coroutines tab="\t" newline = "\n" time = "%s:%s" % (datetime.now().hour,datetime.now().minute) if message.author == client.user: #ignore messages from ourselves (the bot) return elif message.server.id =="317462567532625944": Capture_Message(message,tab,newline,time) if message.content.upper().startswith('!TODAYSEARNINGS'): last_activity_timer = datetime.now() page = urlopen("https://www.nasdaq.com/earnings/earnings-calendar.aspx").read() soup = BeautifulSoup(page, "html5lib") table = soup.find('table') #print(table) table_body = table.find('tbody') rows = table_body.find_all('tr') data = prettytable.PrettyTable(["PM/AH","Ticker","Consensus","# of est","#Last Yr EPS"]) columns_to_grab = [0,1,4,5,7] new_rows = [] for row in rows: cols = row.find_all('td') if "Pre-market" in str(cols[0]): #turn cols[0] to a string - .text gives us nothing cols[0].clear() #clear the existing data cols[0].append("PM") #add in PM new_rows.insert(0,cols) else: cols[0].clear() cols[0].append("AH") new_rows.append(cols) #end of list = append Name = str(cols[1]).split() #Shorten the name to just the Ticker to save space for word in Name: if '(' in word: Half_Ticker = word.replace('(','') Ticker = Half_Ticker.replace(')','') cols[1].clear() cols[1].append(Ticker) for row in new_rows: cols = [ele.text.strip() for ele in (row[x] for x in columns_to_grab)] data.add_row(cols) if len(data.get_string()) > 1800: yield from client.send_message(message.channel, "```" + data.get_string(sortby='PM/AH', reversesort=True) + "```") data.clear_rows() yield from client.send_message(message.channel, "```" + data.get_string() + "```") #End !upcomingearnings elif message.content.upper().startswith('!BUY') or message.content.upper().startswith('!SELL'): split_message = message.content.upper().split(' ') if len(split_message) > 1: Ticker = split_message[1] else: Ticker = 'HMNY' Number = random.uniform(0,100) List = ['#'+Ticker+'? Sure, why not?','BEEP BOOP what the f**k do I know?',"According to my probability back-testing algorithm, you have a " + str(round(Number,4)) + "% chance of successfully doing your ass in with " + Ticker, "Seems like a shitty idea, go for it", "I've seen better ideas on Wall Street Bets","You're going to make StockTwits Proud buying "+Ticker,'#'+Ticker+' will blow up again tomorrow... feel sorry for those of you that panicked','#'+Ticker+' got in at 6.22 with 1k shares. Your best trades just go.','#'+Ticker+' 60 mullion shares traded and UP big. What else do you need to know! ','#'+Ticker+ ' I was gonna short this but then I got high','In 4 weeks #'+Ticker+' will be in a $110.9 Billion Market. Cheap Here', Ticker + '? far from worried lol',Ticker + ' has to go eventually, right?'] String = random.choice(List) yield from client.send_message(message.channel, "```" + String + "```") #End !buy or !sell elif message.content.upper().startswith('!BLOOMBERG'): #DRIVER = 'chromedriver' chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome(executable_path="C:/Users/Liquid Trading LLC/Desktop/le_stock_bot/chromedriver.exe") #driver = webdriver.Chrome(DRIVER) #print("driver") driver.get('https://finviz.com/') #maximize_window() #print("google'd") screenshot = driver.get_screenshot_as_file('C:/Users/Liquid Trading LLC/Desktop/finviz.png') yield from client.send_file(message.channel, "C:/Users/Liquid Trading LLC/Desktop/finviz.png", content='', filename= "finviz.png") #print("screenshot") driver.quit() #print("quit") #yield from client.send_file(message.channel, screenshot, content="", filename="bloomberg.png") elif message.content.upper().startswith('!UPGRADE') or message.content.upper().startswith('!DOWNGRADE'): split_message = message.content.split(' ') Ticker = split_message[1] driver = webdriver.Chrome() driver.get("https://finviz.com/quote.ashx?t="+ Ticker + "&ty=c&ta=0&p=d") table = driver.find_element_by_xpath('//div[@class="fullview-ratings-outer"]/table//table/..') table_html = table.get_attribute('innerHTML') page = urlopen("https://finviz.com/quote.ashx?t="+ Ticker + "&ty=c&ta=0&p=d").read() soup = BeautifulSoup(page, "html5lib") table = soup.find_all('table') for i in range(len(table)): print(table[i].text) table_body = table[7].find('tbody') #is the ?th table on the page afaik Date = '' Up_Down = '' Company = '' Weight = '' Price = '' data = prettytable.PrettyTable(["Date","Type","Company","Weight","Price"]) i = 0 cells = table_body.find_all('td') while i < len(rows): Date = cells[0+i].text Up_Down = cells[1+i].text Company = cells[2+i].text Weight = cells[3+i].text Price = cells[4+i].text data.add_row([Date, Up_Down, Weight, Price]) i+=5 if len(data.get_string()) > 1500: yield from client.send_message(message.channel, "```" + data.get_string() + "```") data.clear_rows() yield from client.send_message(message.channel, "```" + data.get_string() + "```") #End Upgrade elif message.content.upper().startswith("!HALT"): page = urlopen("https://www.nasdaqtrader.com/trader.aspx?id=TradeHalts").read() soup = BeautifulSoup(page, "html5lib") table = soup.find(id='divTradeHaltResults').find_all('table') #//*[@id="divTradeHaltResults"] comes up empty for some reason print(table) rows = soup.find_all('td') print(rows) elif message.content.upper().startswith('!DATA'): #!newdata cbrp #For CBRP Price is : 6.59 || Volume : 257,671 || Float : 42.42M || Short Float : 15.76% || Avg Volume : 1.22M || Change : 4.56% || Earnings: October 9 AMC split_message = message.content.split(' ') k=1 while (k) < len(split_message): Ticker= split_message[k] page = urlopen("https://finviz.com/quote.ashx?t="+ Ticker + "&ty=c&ta=0&p=d").read() soup = BeautifulSoup(page, "html5lib") table = soup.find_all('table') table_body = table[3].find('tbody') #is the 4th table on the page afaik cells = table_body.find_all('td') Shares_Outstanding = '' Earnings = '' Float = '' Short_Float = '' Rel_Vol = '' Average_Volume = '' Volume_Today ='' Price ='' Change = '' Beta = '' Volume ='' i=0 while i < (len(cells)): #may have to str() everything to get it to work if 'Shs Outstand' in cells[i]: Shares_Outstanding = cells[i+1].text if 'Earnings' in cells[i]: Earnings = cells[i+1].text if 'Shs Float' in cells[i]: Float = cells[i+1].text if 'Short Float' in cells[i]: Short_Float = cells[i+1].text if 'Rel Volume' in cells[i]: Rel_Vol = cells[i+1].text if 'Avg Vol' in cells[i]: Average_Volume = cells[i+1].text if 'Volume' == cells[i].text: Volume_Today = cells[i+1].text if "Price" in cells[i]: Price = cells[i+1].text if "Change" in cells[i]: Change = cells[i+1].text if "Beta" in cells[i]: Beta = cells[i+1].text i+=1 Columns = '||' Price_String = '%s Price : %s' % (Ticker, Price) Volume_String = 'Volume : %s' % Volume_Today # Volume_Today, Shares_Outstanding, Float, Short_Float, Rel_Vol, Beta, Change, Earnings Shares_String = 'Shares : %s' % Shares_Outstanding Float_String = 'Float : %s' % Float Short_String = 'Short Float : %s' % Short_Float Rel_String = 'Rel Volume : %s' % Rel_Vol Beta_String = 'Beta : %s' % Beta Change_String = 'Change : %s' % Change Earnings_String = 'Earnings : %s' % Earnings All_Data_In_Strings = [Price_String, Volume_String, Shares_String,Short_String,Rel_String,Beta_String,Change_String,Earnings_String] padding = max(map(len,All_Data_In_Strings)) print(padding) New_String = '{0} {1} {2} {3} {4}\n{5} {6} {7} {8} {9}\n{10} {11} {12} {13} {14}'.format(Price_String.ljust(padding),Columns, Volume_String.ljust(padding),Columns, Shares_String.ljust(padding),Float_String.ljust(padding), Columns, Short_String.ljust(padding),Columns,Rel_String.ljust(padding),Beta_String.ljust(padding),Columns,Change_String.ljust(padding),Columns,Earnings_String.ljust(padding)) print(New_String) String = "```%s Price : %s \t\t|| Volume : %s \t\t|| Shares : %s\n\t Float : %s \t\t|| Short Float : %s \t\t|| Rel Volume : %s\n\t Beta : %s \t\t\t|| Change : %s \t\t|| Earnings : %s ```" % (Ticker, Price, Volume_Today, Shares_Outstanding, Float, Short_Float, Rel_Vol, Beta, Change, Earnings) yield from client.send_message(message.channel, "`"+New_String+"`") k+=1 # end !data # elif message.content.upper().startswith('!DATA'): # last_activity_timer = datetime.now() # #For crbp Price is : 6.59 || Volume : 257,671 || Float : 42.42M || Short Float : 15.76% || Avg Volume : 1.22M || Prev Close : 6.45 # stock_name = message.content[6:] #cut out !data *space* (will it get multiple if we do STOCK, STOCK1, STOCK2 ?) # doForLoop = False # if "," in stock_name: # stock_name = stock_name.replace(" ", "").split(",") # doForLoop = True # try: # if doForLoop: # the_message = "" # for x in stock_name: # x = x.upper() # stock_data = Stock(stock_name) # the_message = the_message + "{} - {} || Price : ${:,.2f} || Volume : {} || Float : {} || Short Float : {:.3%} || Avg Volume : {} || Prev Close : ${:,.2f}\n\n".format( # stock_data.get_company_name()[x], stock_data.get_company()[x]["symbol"], stock_data.get_price()[x], human_format(stock_data.get_volume()[x]), human_format(stock_data.get_float()[x]), # (stock_data.get_short_interest()[x]/stock_data.get_float()[x]), human_format(stock_data.get_quote()[x]['avgTotalVolume']), stock_data.get_previous()[x]['close'] # ) # yield from client.send_message(message.channel, the_message.rstrip('\n')) #rstrip last \n out # else: # stock_data = Stock(stock_name) # yield from client.send_message(message.channel, "{} - {} || Price : ${:,.2f} || Volume : {} || Float : {} || Short Float : {:.3%} || Avg Volume : {} || Prev Close : ${:,.2f}".format( # stock_data.get_company_name(), stock_data.get_company()["symbol"], stock_data.get_price(), human_format(stock_data.get_volume()), human_format(stock_data.get_float()), # (stock_data.get_short_interest()/stock_data.get_float()), human_format(stock_data.get_quote()['avgTotalVolume']), stock_data.get_previous()['close'] # )) # except iexfinance.utils.exceptions.IEXSymbolError as error: # yield from client.send_message(message.channel, "Error: {0}".format(error)) # except ValueError as error: # yield from client.send_message(message.channel, "Error: {0}".format(error)) #end !data elif message.content.lower().startswith("!join"): pyautogui.click(1220,400) elif message.content.lower().startswith("!leave"): yield from client.disconnect() elif message.content.startswith('!news'): last_activity_timer = datetime.now() stock_name = message.content[6:] try: stock_data = Stock(stock_name) message_to_send = "News for: {} - {}".format(stock_data.get_company_name(), stock_data.get_company()["symbol"]) for x in stock_data.get_news(last=5): message_to_send += "\n{} - {}".format(unescape(x["headline"]), x["url"]) yield from client.send_message(message.channel, message_to_send) except iexfinance.utils.exceptions.IEXSymbolError as error: yield from client.send_message(message.channel, "Error: {0}".format(error)) except ValueError as error: yield from client.send_message(message.channel, "Error: {0}".format(error)) #end !news elif message.content.upper().startswith('!EARNINGS'): last_activity_timer = datetime.now() stock_name = message.content[10:] try: stock_data = Stock(stock_name) page = urlopen("https://finviz.com/quote.ashx?t="+ stock_name + "&ty=c&ta=0&p=d").read() soup = BeautifulSoup(page, "html5lib") table = soup.find_all('table') table_body = table[3].find('tbody') #is the 4th table on the page afaik cells = table_body.find_all('td') i=0 Future_Earnings = '' EPS_Next = '' TTM = '' while i < (len(cells)): if 'EPS next Q' in cells[i]: EPS_Next = cells[i+1].text elif 'Earnings' in cells[i]: Future_Earnings = cells[i+1].text elif 'EPS (ttm)' in cells[i]: TTM = cells[i+1].text i+=1 stock_data_earnings = stock_data.get_earnings()[0] stock_data_earnings_two = stock_data.get_earnings()[1] stock_data_earnings_three = stock_data.get_earnings()[2] stock_data_earnings_four = stock_data.get_earnings()[3] yield from client.send_message(message.channel, "{} - {}```\nReport Date: {}\t Expected : {} \tEPS(ttm) : {}\nReport Date : {}\tConsensus : {}\tActual : {}\nReport Date : {}\tConsensus : {}\tActual : {} \ \nReport Date : {}\tConsensus : {}\tActual : {}\nReport Date : {}\tConsensus : {}\tActual : {}```".format( stock_data.get_company_name(), stock_data.get_company()["symbol"],Future_Earnings,EPS_Next,TTM, stock_data_earnings["EPSReportDate"], stock_data_earnings["consensusEPS"], stock_data_earnings["actualEPS"], stock_data_earnings_two["EPSReportDate"], stock_data_earnings_two["consensusEPS"], stock_data_earnings_two["actualEPS"], stock_data_earnings_three["EPSReportDate"], stock_data_earnings_three["consensusEPS"], stock_data_earnings_three["actualEPS"], stock_data_earnings_four["EPSReportDate"], stock_data_earnings_four["consensusEPS"], stock_data_earnings_four["actualEPS"] )) except iexfinance.utils.exceptions.IEXSymbolError as error: yield from client.send_message(message.channel, "Error: {0}".format(error)) except ValueError as error: yield from client.send_message(message.channel, "Error: {0}".format(error)) #end !earnings elif message.content.startswith('!heatmap'): urllib.request.urlretrieve('https://finviz.com/grp_image.ashx?bar_sector_t.png', "heatmap.png") yield from client.send_file(message.channel, 'heatmap.png') #end !heatmap elif message.content.upper().startswith('!TREEMAP'): last_activity_timer = datetime.now() e = discord.Embed() e.set_image(url="https://finviz.com/map.ashx?t=sec") #e.set_thumbnail(url=""https://finviz.com/map.ashx?t=sec") yield from client.send_message(message.channel, embed=e) # end !treemap elif message.content.lower().startswith("!shout"): f = open("TickersAndTimes.txt","r") lines = f.readlines() Alerts = [] test = False for line in lines: alert = line.split("\t") for shout in Alerts: test = False if alert[1] == shout.ticker: print(alert[1],shout.ticker) test = True if test is False: print("appending %s" % alert[1]) try: Alerts.append(Shout(alert[0],alert[1],alert[2],alert[3],alert[4],alert[5])) #mention ticker time price currentprice sentiment except: print("failure to append") alertString = '' space = ' ' tab = '\t' newline = '\n' for alert in Alerts: page = urlopen("https://www.nasdaq.com/market-activity/stocks/"+str(alert.ticker)).read() print("page") soup = BeautifulSoup(page, "html5lib") print("soup") tr = soup.find_all("tr","summary-data__row") for i in tr: td = i.find_all("td","summary-data__cell") c = 0 while c < len(td): print(td[c]) if td[c] == "Today's High/Low": print("Found it!") string = td[c+1].split("/") high = string[0] low = string[1] highdiff = (high - alert.price)/alert.price lowdiff = (alert.price-low)/low if lowdiff > highdiff: change = "decreased" highlow = low difference = lowdiff else: change = "increased" highlow = high difference = highdiff c+=1 else: highlow = "f**k" difference = "can't find it" change = "dunno" stringToAdd=alert.mention+" alerted us of " + alert.ticker + " at " + alert.time + " and $"+alert.price+". It then went from $" +alert.currentprice + " to $" + highlow + " giving us a " + difference + "% " + change + "." + newline if (len(alertString) + len(stringToAdd)) < 2000: alertString += stringToAdd else: if (len(alertString)) < 2000: yield from client.send_message(message.channel,alertString) yield from client.send_message(message.channel,alertString) elif message.content.upper().startswith('!HOTSTOCKS'): f = open("pprint.txt","w") last_activity_timer = datetime.now() page = urlopen("https://finviz.com/").read() soup = BeautifulSoup(page, "html5lib") tables = soup.find_all('table',class_='t-home-table') for i in tables: table_rows = i.find_all('tr', onmouseout="this.className='table-light-cp-row';") print(i.text) f.write(str(pprint(i))) print("NEXT TABLE") for j in table_rows: print(j.text) print("NEXT ROW") f.close() elif message.content.upper().startswith('!CHART'): #!chart d amzn split_message = message.content.upper().split(' ') if 'D' in split_message[1]: time = 'd' #daily elif '1M' in split_message[1]: time = '1m' #intraday is premium? not sure what the timeframe is set as elif 'W' in split_message[1]: time = 'w' #week elif 'MO' in split_message[1]: time = 'm' #month else: time = 'd' ticker = split_message[2] e = discord.Embed() e.set_image(url="https://finviz.com/chart.ashx?t="+ticker+"&ty=c&ta=0&p="+time+"&s=l") yield from client.send_message(message.channel, embed=e) #end !chart elif message.content.upper().startswith('!IPOLIST'): last_activity_timer = datetime.now() page = urlopen("https://www.nasdaq.com/markets/ipos/activity.aspx?tab=upcoming").read() soup = BeautifulSoup(page, "html5lib") table = soup.find('table') #print(table) table_body = table.find('tbody') rows = table_body.find_all('tr') if len(rows) == 3 and 'NASDAQ' in rows[0].text: yield from client.send_message(message.channel, "```ain't none of them IPO sum bitches left dis here month```") else: data = prettytable.PrettyTable(["Company Name","Symbol","Market","Price","Shares","Offer Amount","Expected IPO Date"]) for row in rows: cols = row.find_all('td') cols = [ele.text.strip() for ele in cols] data.add_row(cols) if len(data.get_string()) > 1500: yield from client.send_message(message.channel, "```" + data.get_string() + "```") data.clear_rows() yield from client.send_message(message.channel, "```" + data.get_string() + "```") #print(data.get_string()) #end !ipolist elif message.content.startswith('!calendar'): last_activity_timer = datetime.now() page = urlopen("https://anasdaq.econoday.com/byday.asp").read() soup = BeautifulSoup(page, "html5lib") table = soup.find_all('table') #print(table[6]) table_body = table[6].find('tbody') rows = table_body.find_all('tr') data = prettytable.PrettyTable(["Time","For","Event","Value Name","Consensus","Actual"]) #data.vrules = prettytable.ALL #data.hrules = prettytable.ALL for row in rows[3:]: cols = row.find_all('td') cols = [ele.text.strip() for ele in cols] if len(cols) == 6: data.add_row(cols) if len(data.get_string()) > 1500: #if our string is big, send and reset yield from client.send_message(message.channel, "```" + data.get_string() + "```") data = prettytable.PrettyTable(["Time","For","Event","Value Name","Consensus","Actual"]) #data.vrules = prettytable.ALL #data.hrules = prettytable.ALL yield from client.send_message(message.channel, "```" + data.get_string() + "```") #send after we're 'really' done #end !calendar elif message.content.startswith('!fda'): last_activity_timer = datetime.now() page = urlopen("https://www.biopharmcatalyst.com/calendars/fda-calendar").read() soup = BeautifulSoup(page, "html5lib") table = soup.find('table') #print(table) table_body = table.find('tbody') rows = table_body.find_all('tr') data = prettytable.PrettyTable(["TICKER","DRUG","STAGE","CATALYST"]) count = 1 columns_to_grab = [0,2,3,4] for row in rows: cols = row.find_all('td') cols = [ele.text.strip() for ele in (cols[x] for x in columns_to_grab)] cols[1] = cols[1].splitlines()[0] #split off the drug stuff cols[3] = cols[3].splitlines()[0] #split off the catalyst notes #print(cols) if len(data.get_string()) > 1000: yield from client.send_message(message.channel, "```" + data.get_string() + "```") data = prettytable.PrettyTable(["TICKER","DRUG","STAGE","CATALYST"]) count = count + 1 data.add_row(cols) if count > 2: break #end !fda elif message.content.startswith('!ta'): last_activity_timer = datetime.now() stock_name = message.content[4:] data = prettytable.PrettyTable(["Levels","Price"]) try: stock_data = Stock(stock_name) key_stats = stock_data.get_key_stats() recent_data = stock_data.get_chart() recent_data_input = [] for ele in recent_data: recent_data_input.append(ele["high"]) #print(recent_data_input) sup_res_data = gentrends(recent_data_input) sup_res_data.seek(0) #return to 0, otherwise we get an empty file? data.add_row(["52-Week High",key_stats["week52high"]]) data.add_row(["52-Week Low",key_stats["week52low"]]) yield from client.send_message(message.channel, "```" + data.get_string() + "```") yield from client.send_file(message.channel, sup_res_data, content="", filename="daschart.png") except iexfinance.utils.exceptions.IEXSymbolError as error: yield from client.send_message(message.channel, "Error: {0}".format(error)) except ValueError as error: yield from client.send_message(message.channel, "Error: {0}".format(error)) #end !ta elif message.content.startswith('!command'): list_of_commands = ['ta [stock]','todaysearnings','data [stock]','news [stock]','earnings [stock]','fda','calendar','ipolist','heatmap','chart [timeframe (D,W,M)] [stock]','buy [stock]','sell [stock]','bloomberg (in development)','upgrades/downgrades (in development)'] text = '' for command in list_of_commands: text += '!' + command + '\n' yield from client.send_message(message.channel, text)
class TestShareDefault(object): def setup_class(self): self.cshare = Stock("aapl") self.cshare2 = Stock("aapl", output_format='pandas') self.cshare3 = Stock("svxy") self.cshare4 = Stock("aapl", json_parse_int=Decimal, json_parse_float=Decimal) self.cshare5 = Stock("gig^") def test_invalid_symbol(self): data = Stock("BAD SYMBOL") with pytest.raises(IEXSymbolError): data.get_price() def test_get_all_format(self): data = self.cshare.get_all() assert isinstance(data, dict) def test_get_all(self): data = self.cshare.get_all() assert len(data) == 20 def test_get_endpoints(self): data = self.cshare.get_endpoints(["price"]) assert list(data) == ["price"] def test_get_endpoints_bad_endpoint(self): with pytest.raises(IEXEndpointError): self.cshare.get_endpoints(["BAD ENDPOINT", "quote"]) with pytest.raises(IEXEndpointError): self.cshare.get_endpoints("BAD ENDPOINT") def test_get_book_format(self): data = self.cshare.get_book() assert isinstance(data, dict) data2 = self.cshare2.get_book() assert isinstance(data2, pd.DataFrame) def test_get_chart_format(self): data = self.cshare.get_chart() assert isinstance(data, list) data2 = self.cshare2.get_chart() assert isinstance(data2, list) def test_get_chart_params(self): data = self.cshare.get_chart() # Test chart ranges data2 = self.cshare.get_chart(range_='1y') assert 15 < len(data) < 35 assert 240 < len(data2) < 260 # Test chartSimplify data4 = self.cshare.get_chart(chartSimplify=True)[0] assert "simplifyFactor" in list(data4) data5 = self.cshare.get_chart(range_='1y', chartInterval=5) assert 45 < len(data5) < 55 @pytest.mark.xfail(reason="This test only runs correctly between 00:00 and" "09:30 EST") def test_get_chart_reset(self): # Test chartReset data3 = self.cshare.get_chart(range_='1d', chartReset=True) assert data3 == [] def test_get_company_format(self): data = self.cshare.get_company() assert isinstance(data, dict) data2 = self.cshare2.get_company() assert isinstance(data2, pd.DataFrame) def test_get_delayed_quote_format(self): data = self.cshare.get_delayed_quote() assert isinstance(data, dict) data2 = self.cshare2.get_delayed_quote() assert isinstance(data2, pd.DataFrame) def test_get_dividends_format(self): data = self.cshare.get_dividends() assert isinstance(data, list) data2 = self.cshare2.get_dividends() assert isinstance(data2, list) def test_get_dividends_params(self): data = self.cshare.get_dividends() data2 = self.cshare.get_dividends(range_='2y') data3 = self.cshare.get_dividends(range_='5y') assert len(data) < len(data2) < len(data3) def test_get_earnings_format(self): data = self.cshare.get_earnings() assert isinstance(data, list) data2 = self.cshare2.get_earnings() assert isinstance(data2, pd.DataFrame) # Ensure empty list is returned for symbol with no earnings data3 = self.cshare5.get_earnings() assert isinstance(data3, list) def test_get_effective_spread_format(self): data = self.cshare.get_effective_spread() assert isinstance(data, list) data2 = self.cshare2.get_effective_spread() assert isinstance(data2, pd.DataFrame) def test_get_financials_format(self): data = self.cshare.get_financials() assert isinstance(data, list) data2 = self.cshare2.get_financials() assert isinstance(data2, pd.DataFrame) # Ensure empty list is returned even when ticker has no financials data3 = self.cshare5.get_financials() assert isinstance(data3, list) def test_get_key_stats_format(self): data = self.cshare.get_key_stats() assert isinstance(data, dict) data2 = self.cshare2.get_key_stats() assert isinstance(data2, pd.DataFrame) def test_get_largest_trades(self): data = self.cshare.get_largest_trades() assert isinstance(data, list) data2 = self.cshare2.get_largest_trades() assert isinstance(data2, pd.DataFrame) def test_get_logo_format(self): data = self.cshare.get_logo() assert isinstance(data, dict) data2 = self.cshare2.get_logo() assert isinstance(data2, pd.DataFrame) def test_get_news_format(self): data = self.cshare.get_news() assert isinstance(data, list) @pytest.mark.xfail(reason="Provider error. Awaiting patch.") def test_get_news_params(self): data = self.cshare.get_news(last=15) assert len(data) == 15 def test_ohlc(self): data = self.cshare.get_ohlc() assert isinstance(data, dict) data2 = self.cshare2.get_ohlc() assert isinstance(data2, pd.DataFrame) def test_get_open_close_format(self): data = self.cshare.get_open_close() assert isinstance(data, dict) data2 = self.cshare2.get_open_close() assert isinstance(data2, pd.DataFrame) def test_get_peers_format(self): data = self.cshare.get_peers() assert isinstance(data, list) data2 = self.cshare2.get_peers() assert isinstance(data2, list) def test_get_previous_format(self): data = self.cshare.get_previous() assert isinstance(data, dict) data2 = self.cshare2.get_previous() assert isinstance(data2, pd.DataFrame) def test_get_price_format(self): data = self.cshare.get_price() assert isinstance(data, float) data2 = self.cshare2.get_price() assert isinstance(data2, pd.DataFrame) data4 = self.cshare4.get_price() assert isinstance(data4, Decimal) def test_get_quote_format(self): data = self.cshare.get_quote() assert isinstance(data, dict) data2 = self.cshare2.get_quote() assert isinstance(data2, pd.DataFrame) def test_get_quote_params(self): data = self.cshare.get_quote() data2 = self.cshare.get_quote(displayPercent=True) assert (abs(data2["ytdChange"]) > abs(data["ytdChange"])) def test_get_relevant_format(self): data = self.cshare.get_relevant() assert isinstance(data, dict) data2 = self.cshare2.get_relevant() assert isinstance(data2, pd.DataFrame) def test_get_splits_format(self): data = self.cshare3.get_splits() assert isinstance(data, list) data2 = self.cshare3.get_splits(range_="1y") assert isinstance(data2, list) def test_get_splits_params(self): data = self.cshare3.get_splits(range_="2y") data2 = self.cshare3.get_splits(range_="5y") assert len(data2) > len(data) def test_get_time_series(self): data = self.cshare.get_time_series() data2 = self.cshare.get_chart() assert data == data2 def test_get_volume_by_venue_format(self): data = self.cshare.get_volume_by_venue() assert isinstance(data, list) data2 = self.cshare2.get_volume_by_venue() assert isinstance(data2, pd.DataFrame) def test_filter(self): data = self.cshare.get_quote(filter_='ytdChange') assert isinstance(data, dict) assert isinstance(data["ytdChange"], float) data4 = self.cshare4.get_quote(filter_='ytdChange') assert isinstance(data4, dict) assert isinstance(data4["ytdChange"], Decimal)
class TestBatchDefault(object): def setup_class(self): self.cbatch = Stock(["aapl", "tsla"]) self.cbatch2 = Stock(["aapl", "tsla"], output_format='pandas') self.cbatch3 = Stock(["uvxy", "svxy"]) def test_invalid_symbol_or_symbols(self): with pytest.raises(IEXSymbolError): a = Stock(["TSLA", "BAD SYMBOL", "BAD SYMBOL"]) a.get_price() def test_get_endpoints(self): data = self.cbatch.get_endpoints(["price"])["AAPL"] assert list(data) == ["price"] def test_get_endpoints_bad_endpoint(self): with pytest.raises(IEXEndpointError): self.cbatch.get_endpoints(["BAD ENDPOINT", "quote"]) with pytest.raises(IEXEndpointError): self.cbatch.get_endpoints("BAD ENDPOINT") def test_get_all(self): data = self.cbatch.get_all() assert len(data) == 2 assert len(data["AAPL"]) == 20 def test_get_all_format(self): data = self.cbatch.get_all() assert isinstance(data, dict) data2 = self.cbatch2.get_all() assert isinstance(data2["AAPL"], dict) def test_get_book_format(self): data = self.cbatch.get_book() assert isinstance(data, dict) data2 = self.cbatch2.get_book() assert isinstance(data2, pd.DataFrame) def test_get_chart_format(self): data = self.cbatch.get_chart() assert isinstance(data, dict) data2 = self.cbatch2.get_chart() assert isinstance(data2["AAPL"], list) def test_get_chart_params(self): data = self.cbatch.get_chart()["AAPL"] # Test chart range_s data2 = self.cbatch.get_chart(range_='1y')["AAPL"] assert 15 < len(data) < 35 assert 240 < len(data2) < 260 # Test chartSimplify data4 = self.cbatch.get_chart(chartSimplify=True)["AAPL"][0] assert "simplifyFactor" in list(data4) data5 = self.cbatch.get_chart(range_='1y', chartInterval=5)["AAPL"] assert 45 < len(data5) < 55 @pytest.mark.xfail(reason="This test only works overnight") def test_get_chart_reset(self): # Test chartReset data = self.cbatch.get_chart(range_='1d', chartReset=True) assert data == [] def test_get_company_format(self): data = self.cbatch.get_company() assert isinstance(data, dict) data2 = self.cbatch2.get_company() assert isinstance(data2, pd.DataFrame) def test_get_delayed_quote_format(self): data = self.cbatch.get_delayed_quote() assert isinstance(data, dict) data2 = self.cbatch2.get_delayed_quote() assert isinstance(data2, pd.DataFrame) def test_get_dividends_format(self): data = self.cbatch.get_dividends() assert isinstance(data, dict) data2 = self.cbatch2.get_dividends() assert isinstance(data2, dict) def test_get_dividends_params(self): data = self.cbatch.get_dividends()["AAPL"] data2 = self.cbatch.get_dividends(range_='2y')["AAPL"] data3 = self.cbatch.get_dividends(range_='5y')["AAPL"] assert len(data) < len(data2) < len(data3) def test_get_earnings_format(self): data = self.cbatch.get_earnings() assert isinstance(data, dict) data2 = self.cbatch2.get_earnings() assert isinstance(data2, pd.DataFrame) def test_get_effective_spread_format(self): data = self.cbatch.get_effective_spread() assert isinstance(data, dict) data2 = self.cbatch2.get_effective_spread() assert isinstance(data2, pd.DataFrame) def test_get_financials_format(self): data = self.cbatch.get_financials() assert isinstance(data, dict) data2 = self.cbatch2.get_financials() assert isinstance(data2, pd.DataFrame) def test_get_key_stats_format(self): data = self.cbatch.get_key_stats() assert isinstance(data, dict) data2 = self.cbatch2.get_key_stats() assert isinstance(data2, pd.DataFrame) def test_get_logo_format(self): data = self.cbatch.get_logo() assert isinstance(data, dict) data2 = self.cbatch2.get_logo() assert isinstance(data2, pd.DataFrame) def test_get_news_format(self): data = self.cbatch.get_news() assert isinstance(data, dict) def test_ohlc(self): data = self.cbatch.get_ohlc() assert isinstance(data, dict) def test_get_open_close_format(self): data = self.cbatch.get_open_close() assert isinstance(data, dict) data2 = self.cbatch2.get_open_close() assert isinstance(data2, pd.DataFrame) def test_get_peers_format(self): data = self.cbatch.get_peers() assert isinstance(data, dict) data2 = self.cbatch2.get_peers() assert isinstance(data2, dict) def test_get_previous_format(self): data = self.cbatch.get_previous() assert isinstance(data, dict) data2 = self.cbatch2.get_previous() assert isinstance(data2, pd.DataFrame) def test_get_price_format(self): data = self.cbatch.get_price() assert isinstance(data, dict) data2 = self.cbatch2.get_price() assert isinstance(data2, pd.DataFrame) def test_get_quote_format(self): data = self.cbatch.get_quote() assert isinstance(data, dict) data2 = self.cbatch2.get_quote() assert isinstance(data2, pd.DataFrame) data3 = self.cbatch.get_quote(displayPercent=True) assert (abs(data3["AAPL"]["ytdChange"]) > abs( data["AAPL"]["ytdChange"])) def test_get_relevant_format(self): data = self.cbatch.get_relevant() assert isinstance(data, dict) data2 = self.cbatch2.get_relevant() assert isinstance(data2, pd.DataFrame) def test_get_splits(self): data = self.cbatch.get_splits() assert isinstance(data, dict) data2 = self.cbatch2.get_splits() assert isinstance(data2, pd.DataFrame) def test_get_splits_params(self): data = self.cbatch3.get_splits(range_="2y")["SVXY"] data2 = self.cbatch3.get_splits(range_="5y")["SVXY"] assert len(data2) > len(data) def test_time_series(self): data = self.cbatch.get_time_series() data2 = self.cbatch.get_chart() assert data == data2 def test_get_volume_by_venue_format(self): data = self.cbatch.get_volume_by_venue() assert isinstance(data, dict) data2 = self.cbatch2.get_volume_by_venue() assert isinstance(data2, pd.DataFrame) def test_get_select_ep_bad_params(self): with pytest.raises(ValueError): self.cbatch.get_endpoints() with pytest.raises(IEXEndpointError): self.cbatch.get_endpoints("BADENDPOINT")
class TestShare(object): def setup_class(self): self.cshare = Stock("aapl") def test_get_all_format(self): data = self.cshare.get_all() assert isinstance(data, dict,) def test_get_chart_format(self): data = self.cshare.get_chart() assert isinstance(data, list) def test_get_book_format(self): data = self.cshare.get_book() assert isinstance(data, dict) def test_get_open_close_format(self): data = self.cshare.get_open_close() assert isinstance(data, dict) def test_get_previous_format(self): data = self.cshare.get_previous() assert isinstance(data, dict) def test_get_company_format(self): data = self.cshare.get_company() assert isinstance(data, dict) def test_get_key_stats_format(self): data = self.cshare.get_key_stats() assert isinstance(data, dict) def test_get_relevant_format(self): data = self.cshare.get_relevant() assert isinstance(data, dict) def test_get_news_format(self): data = self.cshare.get_news() assert isinstance(data, list) def test_get_financials_format(self): data = self.cshare.get_financials() assert isinstance(data, dict) def test_get_earnings_format(self): data = self.cshare.get_earnings() assert isinstance(data, dict) def test_get_logo_format(self): data = self.cshare.get_logo() assert isinstance(data, dict) def test_get_price_format(self): data = self.cshare.get_price() assert isinstance(data, float) def test_get_delayed_quote_format(self): data = self.cshare.get_delayed_quote() assert isinstance(data, dict) def test_get_effective_spread_format(self): data = self.cshare.get_effective_spread() assert isinstance(data, list) def test_get_volume_by_venue_format(self): data = self.cshare.get_volume_by_venue() assert isinstance(data, list) def test_ohlc(self): data = self.cshare.get_ohlc() assert isinstance(data, dict) def test_time_series(self): data = self.cshare.get_time_series() data2 = self.cshare.get_chart() assert data == data2 def test_nondefault_params_1(self): aapl = Stock("AAPL", _range='5y') aapl2 = Stock("AAPL") assert len(aapl.get_chart()) > len(aapl2.get_chart()) def test_nondefault_params_2(self): aapl = Stock("AAPL", last=37) assert len(aapl.get_news()) == 37
def test_nondefault_params_2(self): data = Stock(["AAPL", "TSLA"], last=37) assert len(data.get_news()["AAPL"]) == 37 assert len(data.get_news()["TSLA"]) == 37
class TestBatch(object): def setup_class(self): self.cbatch = Stock(["aapl", "tsla"]) def test_invalid_symbol_or_symbols(self): with pytest.raises(IEXSymbolError): Stock(["TSLA", "AAAPLPL", "fwoeiwf"]) def test_get_all_format(self): data = self.cbatch.get_all() assert isinstance(data, dict) def test_get_chart_format(self): data = self.cbatch.get_chart() assert isinstance(data, dict) def test_get_book_format(self): data = self.cbatch.get_book() assert isinstance(data, dict) def test_get_open_close_format(self): data = self.cbatch.get_open_close() assert isinstance(data, dict) def test_get_previous_format(self): data = self.cbatch.get_previous() assert isinstance(data, dict) def test_get_company_format(self): data = self.cbatch.get_company() assert isinstance(data, dict) def test_get_key_stats_format(self): data = self.cbatch.get_key_stats() assert isinstance(data, dict) def test_get_relevant_format(self): data = self.cbatch.get_relevant() assert isinstance(data, dict) def test_get_news_format(self): data = self.cbatch.get_news() assert isinstance(data, dict) def test_get_financials_format(self): data = self.cbatch.get_financials() assert isinstance(data, dict) def test_get_earnings_format(self): data = self.cbatch.get_earnings() assert isinstance(data, dict) def test_get_logo_format(self): data = self.cbatch.get_logo() assert isinstance(data, dict) def test_get_price_format(self): data = self.cbatch.get_price() assert isinstance(data, dict) def test_get_delayed_quote_format(self): data = self.cbatch.get_delayed_quote() assert isinstance(data, dict) def test_get_effective_spread_format(self): data = self.cbatch.get_effective_spread() assert isinstance(data, dict) def test_get_volume_by_venue_format(self): data = self.cbatch.get_volume_by_venue() assert isinstance(data, dict) def test_get_select_ep_bad_params(self): with pytest.raises(ValueError): self.cbatch.get_select_endpoints() with pytest.raises(IEXEndpointError): self.cbatch.get_select_endpoints("BADENDPOINT") def test_ohlc(self): data = self.cbatch.get_ohlc() assert isinstance(data, dict) def test_time_series(self): data = self.cbatch.get_time_series() data2 = self.cbatch.get_chart() assert data == data2 def test_nondefault_params_1(self): data = Stock(["AAPL", "TSLA"], _range='5y') data2 = Stock(["AAPL", "TSLA"]) assert len(data.get_chart()["AAPL"]) > len(data2.get_chart()["AAPL"]) assert len(data.get_chart()["TSLA"]) > len(data2.get_chart()["TSLA"]) def test_nondefault_params_2(self): data = Stock(["AAPL", "TSLA"], last=37) assert len(data.get_news()["AAPL"]) == 37 assert len(data.get_news()["TSLA"]) == 37
def test_nondefault_params_2(self): aapl = Stock("AAPL", last=37) assert len(aapl.get_news()) == 37
'LDOS', 'BA', 'MSTR', 'BMCH', 'CTSH', 'WIT', 'OTEX', 'SPOT', 'AYX', 'SATS', 'MAR', 'TENB', 'CBLK', 'ZS', 'GCI', 'VRNT' ] # Create separate Dictionaries for 'Open' and 'Close' prices qOpen = {} qClose = {} qNews = {} # Attributes={datetime, headline, source, url, summary, related} for x in myList: print('Retrieving quote info for %s...' % x) theQuote = Stock(x) #x, output_format='pandas') resOpen = theQuote.get_open() resClose = theQuote.get_close( ) #get_quote(filter_=['ytdChange', 'open', 'close', 'avgTotalVolume']) qOpen[x] = resOpen qClose[x] = resClose newsList = theQuote.get_news(last=7) print('') print('Formatting output...') for key in qOpen.keys(): val = qOpen[key] print("Key: ", key, "\t Open:", val, "\t Close:", qClose[key]) #, "\t News:", qNews[key]) print('') del qOpen del qClose #End
import requests import plotly.graph_objs as go from fbprophet import Prophet import matplotlib.pyplot as plt from matplotlib.dates import AutoDateFormatter, AutoDateLocator import plotly.plotly as py import plotly.tools as tls import datetime from dash.dependencies import Input, Output, State from iexfinance.stocks import get_historical_data from iexfinance import Stock import dash_table_experiments as dt import dash_table b = Stock('spy') d = b.get_news() df = pd.DataFrame(d) df = df[['headline', 'url']] e = pd.DataFrame([b.get_key_stats()]) e = e[['EBITDA', 'beta', 'latestEPS', 'marketcap']] e[:] = 0 external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css'] app = dash.Dash(__name__, external_stylesheets=external_stylesheets) app.layout = html.Div( [ html.Div(children='''Enter stock symbol'''), dcc.Input(id='input-1-state', value='', type='text'), # html.Div(id='intermediate', ),