def add_stock(self, stock_code): # check if record already exist try: Stock.objects.get(code=stock_code) except Stock.DoesNotExist: # check if insertion is valid try: user_stock = IEXStock(stock_code) new_stock = Stock() new_stock.name = user_stock.get_company_name() new_stock.code = stock_code new_stock.save() except: return False return True
def index(): if request.method == 'POST': #this block is only entered when the form is submitted stock = request.form['symbol'] symbol = Stock(stock) name = symbol.get_company_name() + " (" + str(stock) + ")\n\n" curr_time = now price = str(symbol.get_price()) + " " + str( symbol.get_quote().get('change')) + " (" + str( symbol.get_quote().get('changePercent')) + ")" return '''<title>Python Finance Info</title> <form method="POST"> <h3>Python Finance Info</h3><br/> <i>Input:</i><br/><br/> Enter a symbol <input type="text" name="symbol"> <input type="submit" value="Submit"><br/><br/> </form> <i>Output: </i><br/><br/> {} <br/> {} <br/> {} </h5>'''.format( name, curr_time, price) return '''<title>Python Finance Info</title>
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)
def format_result_string(*args): return ' | '.join(args) default_ticker = 'KO' if len(sys.argv) == 1: print(f"No ticker passed in as an arguement, default to {default_ticker}") ticker = default_ticker else: ticker = sys.argv[1] stock = Stock(ticker, output_format='pandas') stock_name = stock.get_company_name()['companyName'].to_string() stock_price = stock.get_price()['price'][ticker] stock_eps = stock.get_key_stats()[ticker]['latestEPS'] flat_growth_estimate = 5 aaa_corporate_bond_yield = 3.56 stock_intrinsic_value = (stock_eps * (8.5 + (2 * flat_growth_estimate)) * 4.4) / aaa_corporate_bond_yield norm_stock_intrinsic_value = stock_intrinsic_value / stock_price print( format_result_string(stock_name, ticker.upper(), format_num_to_currency(stock_price), float_to_percentage_string(flat_growth_estimate), float_to_percentage_string(aaa_corporate_bond_yield), format_num_to_currency(stock_eps), format_num_to_currency(stock_intrinsic_value),
class TestFieldMethodsBatch(object): def setup_class(self): self.batch = Stock(["AAPL", "TSLA"]) self.batch2 = Stock(["AAPL", "TSLA"], output_format='pandas') self.batch4 = Stock(["AAPL", "TSLA"], json_parse_int=Decimal, json_parse_float=Decimal) def test_get_company_name(self): data = self.batch.get_company_name() assert isinstance(data, dict) assert data["AAPL"] == "Apple Inc." data2 = self.batch2.get_company_name() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) def test_get_primary_exchange(self): data = self.batch.get_primary_exchange() assert isinstance(data, dict) assert data["AAPL"] == "Nasdaq Global Select" data2 = self.batch2.get_primary_exchange() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) def test_get_sector(self): data = self.batch.get_sector() assert isinstance(data, dict) assert data["AAPL"] == "Technology" data2 = self.batch2.get_sector() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) def test_get_open(self): data = self.batch.get_open() assert isinstance(data, dict) assert data["AAPL"] > 0 data2 = self.batch2.get_open() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) assert data2.loc["AAPL"].dtype == "float64" def test_get_close(self): data = self.batch.get_close() assert isinstance(data, dict) assert data["AAPL"] > 0 data2 = self.batch2.get_close() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) assert data2.loc["AAPL"].dtype == "float64" def test_get_years_high(self): data = self.batch.get_years_high() assert isinstance(data, dict) assert data["AAPL"] > 0 data2 = self.batch2.get_years_high() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) assert data2.loc["AAPL"].dtype == "float64" def test_get_years_low(self): data = self.batch.get_years_low() assert isinstance(data, dict) assert data["AAPL"] > 0 data2 = self.batch2.get_years_low() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) assert data2.loc["AAPL"].dtype == "float64" def test_get_ytd_change(self): data = self.batch.get_ytd_change() assert isinstance(data, dict) data2 = self.batch2.get_ytd_change() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) assert data2.loc["AAPL"].dtype == "float64" def test_get_volume(self): data = self.batch.get_volume() assert isinstance(data, dict) assert data["AAPL"] > 50000 data2 = self.batch2.get_volume() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) assert data2.loc["AAPL"].dtype == "int64" def test_get_market_cap(self): data = self.batch.get_market_cap() assert isinstance(data, dict) assert data["AAPL"] > 1000000 data2 = self.batch2.get_market_cap() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) assert data2.loc["AAPL"].dtype == "int64" def test_get_beta(self): data = self.batch.get_beta() assert isinstance(data, dict) assert isinstance(data["AAPL"], float) data2 = self.batch2.get_beta() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) assert data2.loc["AAPL"].dtype == "float64" data4 = self.batch4.get_beta() assert isinstance(data4, dict) assert isinstance(data4["AAPL"], Decimal) def test_get_short_interest(self): data = self.batch.get_short_interest() assert isinstance(data, dict) assert data["AAPL"] > 50000 data2 = self.batch2.get_short_interest() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) assert data2.loc["AAPL"].dtype == "int64" def test_get_short_ratio(self): data = self.batch.get_short_ratio() assert isinstance(data, dict) assert isinstance(data["AAPL"], float) data2 = self.batch2.get_short_ratio() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) assert data2.loc["AAPL"].dtype == "float64" data4 = self.batch4.get_short_ratio() assert isinstance(data4, dict) assert isinstance(data4["AAPL"], Decimal) def test_get_latest_eps(self): data = self.batch.get_latest_eps() assert isinstance(data, dict) assert isinstance(data["TSLA"], float) data2 = self.batch2.get_latest_eps() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) assert data2.loc["TSLA"].dtype == "float64" data4 = self.batch4.get_latest_eps() assert isinstance(data4, dict) assert isinstance(data4["AAPL"], Decimal) def test_get_shares_outstanding(self): data = self.batch.get_shares_outstanding() assert isinstance(data, dict) assert data["AAPL"] > 100000 data2 = self.batch2.get_shares_outstanding() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) assert data2.loc["AAPL"].dtype == "int64" def test_get_float(self): data = self.batch.get_float() assert isinstance(data, dict) assert data["AAPL"] > 1000000 data2 = self.batch2.get_float() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) assert data2.loc["AAPL"].dtype == "int64" def test_get_eps_consensus(self): data = self.batch.get_eps_consensus() assert isinstance(data, dict) assert isinstance(data["AAPL"], float) data2 = self.batch2.get_eps_consensus() assert isinstance(data2, pd.DataFrame) assert_index_equal(data2.index, pd.Index(self.batch2.symbols)) assert data2.loc["AAPL"].dtype == "float64" data4 = self.batch4.get_eps_consensus() assert isinstance(data4, dict) assert isinstance(data4["AAPL"], Decimal)
class TestFieldMethodsShare(object): def setup_class(self): self.share = Stock("AAPL") self.share2 = Stock("AAPL", output_format='pandas') self.share4 = Stock("AAPL", json_parse_int=Decimal, json_parse_float=Decimal) self.share5 = Stock("TSLA") def test_get_company_name(self): data = self.share.get_company_name() print(type(data)) assert isinstance(data, six.string_types) assert data == "Apple Inc." data2 = self.share2.get_company_name() assert isinstance(data2, pd.DataFrame) def test_get_primary_exchange(self): data = self.share.get_primary_exchange() assert isinstance(data, six.string_types) assert data == "Nasdaq Global Select" data2 = self.share2.get_primary_exchange() assert isinstance(data2, pd.DataFrame) def test_get_sector(self): data = self.share.get_sector() assert isinstance(data, six.string_types) assert data == "Technology" data2 = self.share2.get_sector() assert isinstance(data2, pd.DataFrame) def test_get_open(self): data = self.share.get_open() assert isinstance(data, float) assert data > 0 data2 = self.share2.get_open() assert isinstance(data2, pd.DataFrame) assert data2.loc["AAPL"].dtype == "float64" data4 = self.share4.get_open() assert isinstance(data4, Decimal) assert data4 > 0 def test_get_close(self): data = self.share.get_close() assert isinstance(data, float) assert data > 0 data2 = self.share2.get_close() assert isinstance(data2, pd.DataFrame) assert data2.loc["AAPL"].dtype == "float64" data4 = self.share4.get_close() assert isinstance(data4, Decimal) assert data4 > 0 def test_get_years_high(self): data = self.share.get_years_high() assert isinstance(data, float) assert data > 0 data2 = self.share2.get_years_high() assert isinstance(data2, pd.DataFrame) assert data2.loc["AAPL"].dtype == "float64" data4 = self.share4.get_years_high() assert isinstance(data4, Decimal) assert data4 > 0 def test_get_years_low(self): data = self.share.get_years_low() assert isinstance(data, float) assert data > 0 data2 = self.share2.get_years_low() assert isinstance(data2, pd.DataFrame) assert data2.loc["AAPL"].dtype == "float64" data4 = self.share4.get_years_low() assert isinstance(data4, Decimal) assert data4 > 0 def test_get_ytd_change(self): data = self.share.get_ytd_change() assert isinstance(data, float) data2 = self.share2.get_ytd_change() assert isinstance(data2, pd.DataFrame) assert data2.loc["AAPL"].dtype == "float64" data4 = self.share4.get_ytd_change() assert isinstance(data4, Decimal) def test_get_volume(self): data = self.share.get_volume() assert isinstance(data, int) assert data > 1000 data2 = self.share2.get_volume() assert isinstance(data2, pd.DataFrame) assert data2.loc["AAPL"].dtype == "int64" data4 = self.share4.get_volume() assert isinstance(data4, Decimal) assert data4 > 1000 def test_get_market_cap(self): data = self.share.get_market_cap() assert isinstance(data, int) data2 = self.share2.get_market_cap() assert isinstance(data2, pd.DataFrame) assert data2.loc["AAPL"].dtype == "int64" data4 = self.share4.get_market_cap() assert isinstance(data4, Decimal) def test_get_beta(self): data = self.share.get_beta() assert isinstance(data, float) data2 = self.share2.get_beta() assert isinstance(data2, pd.DataFrame) assert data2.loc["AAPL"].dtype == "float64" data4 = self.share4.get_beta() assert isinstance(data4, Decimal) def test_get_short_interest(self): data = self.share.get_short_interest() assert isinstance(data, int) data2 = self.share2.get_short_interest() assert isinstance(data2, pd.DataFrame) assert data2.loc["AAPL"].dtype == "int64" data4 = self.share4.get_short_interest() assert isinstance(data4, Decimal) def test_get_short_ratio(self): data = self.share.get_short_ratio() assert isinstance(data, float) data2 = self.share2.get_short_ratio() assert isinstance(data2, pd.DataFrame) assert data2.loc["AAPL"].dtype == "float64" data4 = self.share4.get_short_ratio() assert isinstance(data4, Decimal) def test_get_latest_eps(self): data = self.share5.get_latest_eps() assert isinstance(data, float) data4 = self.share4.get_latest_eps() assert isinstance(data4, Decimal) def test_get_shares_outstanding(self): data = self.share.get_shares_outstanding() assert isinstance(data, int) data2 = self.share2.get_shares_outstanding() assert isinstance(data2, pd.DataFrame) assert data2.loc["AAPL"].dtype == "int64" data4 = self.share4.get_shares_outstanding() assert isinstance(data4, Decimal) def test_get_float(self): data = self.share.get_float() assert isinstance(data, int) data2 = self.share2.get_float() assert isinstance(data2, pd.DataFrame) assert data2.loc["AAPL"].dtype == "int64" data4 = self.share4.get_float() assert isinstance(data4, Decimal) def test_get_eps_consensus(self): data = self.share.get_eps_consensus() assert isinstance(data, float) data2 = self.share2.get_eps_consensus() assert isinstance(data2, pd.DataFrame) assert data2.loc["AAPL"].dtype == "float64" data4 = self.share4.get_eps_consensus() assert isinstance(data4, Decimal)
ticker = sheet['B' + str(row)].value CompanyNameList.append(company_name) TickerList.append(ticker) wb.save('stock_screenv2.xlsx') print('Adding biotech tickers ...') res = requests.get('https://www.biopharmcatalyst.com/calendars/fda-calendar') soup = bs4.BeautifulSoup(res.text, 'lxml') for symbol in soup.find_all('td', class_= 'js-td--ticker'): symbol = symbol.get_text().replace('\n','') try: if symbol not in symbols: symbols.append(symbol) ticker = Stock(symbol) company_name = ticker.get_company_name() CompanyNameList.append(company_name) TickerList.append(ticker) except: print('Investigating :',company_name) pass lower = [x.lower() for x in CompanyNameList] lower = [x.replace('.com', ' com') for x in lower] lower = [x.replace('.', '') for x in lower] lower = [x.replace(',', '') for x in lower] lower = [x.replace('-', ' ') for x in lower] lower = [x.replace('\xa0', ' ') for x in lower] if '&' in lower: lower = lower.replace('&', '&') if ''' in lower: