Пример #1
0
def build_sector_fundamentals(sector):
    log.info("build_sector_fundamentals")
    '''
    In this method, for the given sector, we'll get the data we need for each stock
    in the sector from IEX. Once we have the data, we'll check that the earnings
    reports meet our criteria with `eps_good()`. We'll put stocks that meet those
    requirements into a dataframe along with all the data about them we'll need.
    '''
    stocks = get_sector(sector)
    if len(stocks) == 0:
        raise ValueError("Invalid sector name: {}".format(sector))

    # If we can't see its PE here, we're probably not interested in a stock.
    # Omit it from batch queries.
    stocks = [s for s in stocks if s['peRatio'] is not None]

    # IEX doesn't like batch queries for more than 100 symbols at a time.
    # We need to build our fundamentals info iteratively.
    batch_idx = 0
    batch_size = 99
    fundamentals_dict = {}
    while batch_idx < len(stocks):
        symbol_batch = [
            s['symbol'] for s in stocks[batch_idx:batch_idx + batch_size]
        ]
        stock_batch = Stock(symbol_batch)

        # Pull all the data we'll need from IEX.
        financials_json = stock_batch.get_financials()
        quote_json = stock_batch.get_quote()
        stats_json = stock_batch.get_key_stats()
        earnings_json = stock_batch.get_earnings()

        for symbol in symbol_batch:
            # We'll filter based on earnings first to keep our fundamentals
            # info a bit cleaner.
            if not eps_good(earnings_json[symbol]):
                continue

            # Make sure we have all the data we'll need for our filters for
            # this stock.
            if not data_quality_good(symbol, financials_json, quote_json,
                                     stats_json):
                continue

            fundamentals_dict[symbol] = get_fundamental_data_for_symbol(
                symbol, financials_json, quote_json, stats_json)

        batch_idx += batch_size
    # Transform all our data into a more filterable form - a dataframe - with
    # a bit of pandas magic.
    return pd.DataFrame.from_dict(fundamentals_dict).T
Пример #2
0
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!')
Пример #3
0
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)
Пример #4
0
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)
Пример #5
0
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")
Пример #6
0
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
Пример #7
0
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
Пример #8
0
# look at AA (Alcoa?)
aa = Stock('AA')
eps = aa.get_latest_eps()
pri = aa.get_price()
print('AA: latest EPS %f, current price %f' % (eps, pri))

# show symbols and company name for each
# for s in symbols:
#   if s['isEnabled'] == True: print(s['symbol'] + ', ' + s['name'])

# Apple
apple = Stock('AAPL')
apple.get_key_stats()
apple.get_volume()
apple.get_earnings()
apple.get_quote()
apple.get_quote()['peRatio']
apple.get_quote()['close']


def pStock(symbol):
    priceCriteria = 5.00
    data = Stock(symbol)
    quote = data.get_quote()
    pe = quote['peRatio']
    close = quote['close']
    sts = data.get_key_stats()
    cName = sts['companyName']

    # apply criteria