Exemple #1
0
#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
Exemple #2
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)
Exemple #3
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")
Exemple #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)
Exemple #5
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
Exemple #6
0
 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"])
Exemple #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
Exemple #8
0
 def test_nondefault_params_1(self):
     aapl = Stock("AAPL", _range='5y')
     aapl2 = Stock("AAPL")
     assert len(aapl.get_chart()) > len(aapl2.get_chart())
Exemple #9
0
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