def update_graph(submit, input_value):
    b = Stock(input_value)
    d = b.get_news()
    df = pd.DataFrame(d)
    df = df[['headline', 'url']]
    e = pd.DataFrame([b.get_key_stats()])
    e = e[['EBITDA', 'beta', 'latestEPS', 'marketcap']]

    return e.to_dict('records')
Beispiel #2
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
Beispiel #3
0
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
    if close > priceCriteria:
        return

    # print the results for what is left
    print('%s,%s,%s,%s' % (symbol, cName, close, pe))
Beispiel #4
0
def get_ma(ticker):
	stock = Stock(ticker)
	start = now - timedelta(days=25)
	try:
		keyStats = stock.get_key_stats()
		if (stock.get_price() < 5):
			return -1,-1,-1
		
		df_hist = get_historical_data(ticker, start=start, end=now, output_format='pandas')
		dma50 = keyStats['day50MovingAvg']
		dma10 = df_hist.tail(10)['close'].mean()
		dma20 = df_hist.tail(20)['close'].mean()
	except:
		return -1,-1,-1
	
	return dma10, dma20, dma50
Beispiel #5
0
def get_ma(ticker):
    stock = Stock(ticker)
    start = now - timedelta(days=25)
    try:
        keyStats = stock.get_key_stats()
        if (stock.get_price() < 5):
            return -1, -1, -1

        df_hist = get_historical_data(ticker,
                                      start=start,
                                      end=now,
                                      output_format='pandas')
        dma50 = keyStats['day50MovingAvg']
        dma10 = df_hist.tail(10)['close'].mean()
        dma20 = df_hist.tail(20)['close'].mean()
    except:
        return -1, -1, -1

    return dma10, dma20, dma50
Beispiel #6
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)
Beispiel #7
0
io.savemat('test.mat', {'struct': df})

[symbol, symbol500] = load_symbols()

#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)
Beispiel #8
0
    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),
                         '{:.2f}'.format(norm_stock_intrinsic_value)))
Beispiel #9
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)
Beispiel #10
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")
Beispiel #11
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
Beispiel #12
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
Beispiel #13
0
    def import_data(self):
        self.download()
        stock_list = pd.read_csv("stock_list.csv")
        os.remove("stock_list.csv")

        stocks = pd.DataFrame(get_available_symbols(output_format='pandas'))
        stocks = stocks.loc[stocks['type'] == 'cs']

        stocks = stocks.merge(stock_list,
                              how='inner',
                              left_on='symbol',
                              right_on='Symbol')

        #Plainly filter list to reduce further analysis load
        stocks = stocks.loc[(stocks['MarketCap'] > 0)
                            & stocks['MarketCap'].notnull()]
        stocks = stocks.loc[stocks['Industry'].notnull()]
        stocks = stocks.loc[(stocks['LastSale'] > .25)
                            & (stocks['LastSale'] <= 5.0)]

        #add columns to df that we will go through and fill for analysis
        stocks['profitMargin'] = Series([])
        stocks['day50MovingAvg'] = Series([])
        stocks['beta'] = Series([])

        stocks['avg_daily_change_30'] = Series([])
        stocks['avg_change_over_time_30'] = Series([])
        stocks['avg_daily_change_5'] = Series([])
        stocks['avg_change_over_time_5'] = Series([])
        stocks['last_change_percent'] = Series([])
        stocks['avg_close_30'] = Series([])
        stocks['std_close_30'] = Series([])
        stocks['avg_close_5'] = Series([])
        stocks['std_close_5'] = Series([])

        stocks['avg_volume_30'] = Series([])
        stocks['avg_volume_5'] = Series([])
        stocks['last_volume'] = Series([])

        stocks['shortRatio'] = Series([])

        stocks.reset_index(inplace=True, drop=True)
        print(stocks.head(), stocks.info())

        for index, row in stocks.iterrows():
            #print (index, row)
            #Pause so api doesn't kick us out
            if index % 7 == 0 and index != 0:
                print("Waiting 3 seconds")
                time.sleep(3)

            stock = Stock(str(row['symbol']))

            stock_stats = pd.DataFrame(stock.get_key_stats(), index=[0])
            #Five day timeseries avg for values
            stock_book = pd.DataFrame(
                stock.get_time_series(output_format='pandas'))
            stock_book_3 = stock_book.tail(3)
            #Close to real time
            #stock_quote = pd.DataFrame(stock.get_quote(), index=[0])

            #print (stock_move.head(), stock_move.info())
            #print (stock_stats)
            print(index)
            #print (stock_stats)

            stock_stats = stock_stats[[
                'profitMargin', 'day50MovingAvg', 'beta', 'shortRatio'
            ]]

            stocks.loc[index,
                       'profitMargin'] = stock_stats.iloc[0]['profitMargin']
            stocks.loc[
                index,
                'day50MovingAvg'] = stock_stats.iloc[0]['day50MovingAvg']
            stocks.loc[index, 'beta'] = stock_stats.iloc[0]['beta']
            stocks.loc[index, 'shortRatio'] = stock_stats.iloc[0]['shortRatio']

            stocks.loc[
                index,
                'avg_daily_change_30'] = stock_book['changePercent'].mean()
            stocks.loc[index, 'avg_change_over_time_30'] = stock_book[
                'changeOverTime'].mean()

            stocks.loc[
                index,
                'avg_daily_change_5'] = stock_book_3['changePercent'].mean()
            stocks.loc[index, 'avg_change_over_time_5'] = stock_book_3[
                'changeOverTime'].mean()
            stocks.loc[index, 'last_change_percent'] = stock_book.loc[
                len(stock_book) - 1, 'changePercent']

            stocks.loc[index, 'avg_close_30'] = stock_book['close'].mean()
            stocks.loc[index, 'std_close_30'] = stock_book['close'].std()
            stocks.loc[index, 'avg_close_5'] = stock_book_3['close'].mean()
            stocks.loc[index, 'std_close_5'] = stock_book_3['close'].std()

            stocks.loc[index, 'avg_volume_30'] = stock_book['volume'].mean()
            stocks.loc[index, 'avg_volume_5'] = stock_book_3['volume'].mean()
            stocks.loc[index,
                       'last_volume'] = stock_book.loc[len(stock_book) - 1,
                                                       'volume']
            #if index > 50:
            #break

        stocks.to_csv('stocks_before_filter.csv')
        stocks = stocks.loc[
            (stocks['LastSale'] < (stocks['avg_close_30'] -
                                   (1.40 * stocks['std_close_30'])))
            & (stocks['LastSale'] >= (stocks['avg_close_30'] -
                                      (2.00 * stocks['std_close_30'])))]
        stocks = stocks.loc[((stocks['avg_volume_5'] / stocks['avg_volume_30'])
                             > 1.02)]

        stocks.sort_values('shortRatio', inplace=True)

        stocks.reset_index(inplace=True, drop=True)
        #print (stocks.head(20),stocks.info())
        stocks.to_csv('stocklist.csv')
        return (stocks)
Beispiel #14
0
pri = tsla.get_price()
print('Tesla: open price %f, current price %f' % (opn, pri))

# 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']
Beispiel #15
0
def get_key_stats(symbol):
	stock_reader = Stock(symbol, output_format='json', session=cache_session)
	chart_dict = stock_reader.get_key_stats()
	return chart_dict
import matplotlib.pyplot as plt
from matplotlib.dates import AutoDateFormatter, AutoDateLocator
import plotly.plotly as py
import plotly.tools as tls
import datetime
from dash.dependencies import Input, Output, State
from iexfinance.stocks import get_historical_data
from iexfinance import Stock
import dash_table_experiments as dt
import dash_table

b = Stock('spy')
d = b.get_news()
df = pd.DataFrame(d)
df = df[['headline', 'url']]
e = pd.DataFrame([b.get_key_stats()])
e = e[['EBITDA', 'beta', 'latestEPS', 'marketcap']]
e[:] = 0
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div(
    [
        html.Div(children='''Enter stock symbol'''),
        dcc.Input(id='input-1-state', value='', type='text'),

        # html.Div(id='intermediate', ),
        dcc.Graph(id='intermediate',
                  figure={
                      'data': [],