#Stocks #tsla = Stock(symbol500.ix[[1,2],'Symbol'].values.T.tolist(),output_format='pandas') #tsla = Stock(symbol500.iloc[0:1,0].values.T.tolist(),output_format='pandas') allkeys = {} tsla = Stock('TSLA', output_format='pandas') ohlc = tsla.get_ohlc() ohlc.fillna(value=pd.np.nan, inplace=True) quote = tsla.get_quote() quote.fillna(value=pd.np.nan, inplace=True) keys = tsla.get_key_stats() keys.fillna(value=pd.np.nan, inplace=True) financial = tsla.get_financials() financial.fillna(value=pd.np.nan, inplace=True) chart = tsla.get_chart() allkeys['ohlc'] = ohlc.to_dict() allkeys['quote'] = quote.to_dict() allkeys['keys'] = keys.to_dict() allkeys['financial'] = financial.to_dict() allkeys['chart'] = chart io.savemat('result.mat', {'tsPY': allkeys}) # Historical Data start = datetime(2013, 11, 13) #end = datetime(2017, 5, 24) end = datetime.today() df = get_historical_data('MMM', start=start, end=end, output_format='pandas') df['date'] = df.index
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 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 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 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_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"])
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_1(self): aapl = Stock("AAPL", _range='5y') aapl2 = Stock("AAPL") assert len(aapl.get_chart()) > len(aapl2.get_chart())
def get_chart_data(company_code): stock_reader = Stock(company_code, output_format='json', session=cache_session) chart_dict = stock_reader.get_chart(range="5y") return chart_dict