def index(): form = investmentForm() if request.method == 'POST' and form.validate(): #Get form field data symb = form.stockSymbol.data stock = Stock(symb) openPrice = stock.get_open() nowPrice = stock.get_price() companyInfo = stock.get_company() companyName = companyInfo['companyName'] symbol = companyInfo['symbol'] calculate = openPrice - nowPrice calc = "{:.2f}".format(calculate) ct = datetimeConverstion() percentage = ((openPrice - nowPrice) / openPrice) * 100 percent = "{:.2f}".format(percentage) new_date = ct.strftime('%A %Y-%m-%d %I:%M %p') return render_template('price.html', symbol=symbol, companyName=companyName, nowPrice=nowPrice, new_date=new_date, calc=calc, percent=percent) return render_template('home.html', form=form)
def update_header(submit, input_value): b = Stock(input_value) name = pd.DataFrame([b.get_company()]) description = name['description'] return description
def update_header(submit, input_value): b = Stock(input_value) name = pd.DataFrame([b.get_company()]) name = name['companyName'].values[0] f = str(b.get_price()) title = name + ' $' + f return title
def CurrentData(ticker): try: equity = Stock('%s' % (ticker), output_format='pandas') df1 = equity.get_company( ) # gives basic company info like CEO, location, industry, etc. df2 = equity.get_earnings( ) # earnings per share (net income / shares outstanding) for past 4Q df3 = equity.get_financials( ) # basic financial metrics like revenue, gross profit, etc. df1.to_csv('company_info.csv') df2.to_csv('earnings.csv') df3.to_csv('financial_statements.csv') except ValueError: print('That ticker is not valid, choose another one!')
def get_stock_info(ticker): """ Checks if the ticker is valid :param ticker String: the stock ticker :return: company name or None if invalid :rtype: String """ # Let connection errors percolate to the calling function try: stock = Stock(ticker.upper()) return stock.get_company().get("companyName") except iexfinance.utils.exceptions.IEXSymbolError as exc: return None except ValueError as ve: # If empty return None
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
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