def fundamentalStats(stock): try: stokOutput = Share(stock) openPrice = stokOutput.get_open() closePrice = stokOutput.get_prev_close() dailyDelta = stokOutput.get_change() earningsShare = stokOutput.get_earnings_share() fiddyDay = stokOutput.get_50day_moving_avg() priceBook = stokOutput.get_price_book() peeEee = stokOutput.get_price_earnings_ratio() pegRatio = stokOutput.get_price_earnings_growth_ratio() if (float(priceBook) < 1.5 and float(peeEee) < 50 and float(pegRatio) < 2 and float(peeEee) > 0): csvList = [stock, "open price:", openPrice, "previous close:", closePrice, "daily deltas:", dailyDelta, "earnings per share:", earningsShare, "50 day moving avg:", fiddyDay, "price/book:", priceBook, "price/earnings:", peeEee, "peg:", pegRatio, "\n"] print (stock, "will be imported to Excel.") stockPicks = open("picks.csv", "a", newline='') writeCSV = csv.writer(stockPicks, dialect='excel') for stock in csvList: writeCSV.writerow([stock]) else: print (stock, "does not meet criteria.") except: print(stock, "is missing a defined key statistic.")
class Stock: """ """ def __init__(self, n): self.name = n self.confidence_list = [] self.fifty_day_moving_average = None self.two_hundred_day_moving_average = None self.price_earnings_growth_ratio = None self.confidence_string = None self.current_price = None self.stock = Share(self.name) def calculate_confidence_percentage(self): self.confidence_list = [] self.confidence_list.append(sc.formula_00_is_stock_above_50_day_moving_average(self.get_current_price(), self.get_fifty_day_moving_average())) self.confidence_list.append(sc.formula_01_is_stock_above_200_day_moving_average(self.get_current_price(), self.get_two_hundred_day_moving_average())) self.confidence_list.append(sc.formula_02_pattern_guesser_confidence_for_tomorrow(self.name)) confidence_string = '' for c in self.confidence_list: confidence_string += str(c) + ", " self.confidence_string = 'Confidence List: ' + confidence_string + '\tAverage Confidence: ' + str(sum(self.confidence_list) / len(self.confidence_list)) def get_name(self): """TODO:... :return: """ return self.name def get_current_price(self): if self.current_price is None: self.current_price = self.stock.get_price() def get_confidence_string(self): if self.confidence_string is None: self.calculate_confidence_percentage() return self.confidence_string def get_fifty_day_moving_average(self): if self.fifty_day_moving_average is None: self.fifty_day_moving_average = self.stock.get_50day_moving_avg() return self.fifty_day_moving_average def get_two_hundred_day_moving_average(self): if self.two_hundred_day_moving_average is None: self.two_hundred_day_moving_average = self.stock.get_200day_moving_avg() return self.two_hundred_day_moving_average def get_price_earnings_growth_ratio(self): if self.price_earnings_growth_ratio is None: self.price_earnings_growth_ratio = self.stock.get_price_earnings_growth_ratio() return self.price_earnings_growth_ratio
def stock_summary(request, symbol=None): if symbol == None: symbol = request.POST['symbol'] current_stock = Stock() stock = Share(symbol) current_stock.symbol = symbol.upper() current_stock.price = stock.get_price() current_stock.change = stock.get_change() current_stock.volume = stock.get_volume() current_stock.prev_close = stock.get_prev_close() current_stock.stock_open = stock.get_open() current_stock.avg_daily_volume = stock.get_avg_daily_volume() current_stock.stock_exchange = stock.get_stock_exchange() current_stock.market_cap = stock.get_market_cap() current_stock.book_value = stock.get_book_value() current_stock.ebitda = stock.get_ebitda() current_stock.dividend_share = stock.get_dividend_share() current_stock.dividend_yield = stock.get_dividend_yield() current_stock.earnings_share = stock.get_earnings_share() current_stock.days_high = stock.get_days_high() current_stock.days_low = stock.get_days_low() current_stock.year_high = stock.get_year_high() current_stock.year_low = stock.get_year_low() current_stock.fifty_day_moving_avg = stock.get_50day_moving_avg() current_stock.two_hundred_day_moving_avg = stock.get_200day_moving_avg() current_stock.price_earnings_ratio = stock.get_price_earnings_ratio() current_stock.price_earnings_growth_ratio = stock.get_price_earnings_growth_ratio() current_stock.price_sales = stock.get_price_sales() current_stock.price_book = stock.get_price_book() current_stock.short_ratio = stock.get_short_ratio() date_metrics = [] url = 'http://chartapi.finance.yahoo.com/instrument/1.0/'+symbol+'/chartdata;type=quote;range=1y/csv' page = urllib2.urlopen(url).read() pagebreaks = page.split('\n') for line in pagebreaks: items = line.split(',') if 'Company-Name:' in line: current_stock.company_name = line[13:len(line)] current_stock.save() if 'values' not in items: if len(items)==6: hd = HistoricalData( stock_id = Stock.objects.get(id=int(current_stock.id)).id, date = items[0][4:6]+'/'+items[0][6:9]+'/'+items[0][0:4], close = items[1][0:(len(items[1])-2)], high = items[2][0:(len(items[2])-2)], price_open = items[3][0:(len(items[3])-2)], low = items[4][0:(len(items[4])-2)], volume = items[5][0:-6]+","+items[5][-6:-3]+","+items[5][-3:len(items[5])]) hd.save() date_metrics.append(hd) del date_metrics[0] return render(request, "stock_summary.html", {'current_stock': current_stock, 'date_metrics': date_metrics})
def andrews_algo(): """ Various metrics for a given ticker :param tickers: :return: """ global ticker_list for ticker in ticker_list: stock = Share(ticker) print(line_separator) print(stock.get_name()) print("Current Price: " + str(stock.get_price())) # Dollar volume == momentum dollar_volume = float(stock.get_price()) * float(stock.get_volume()) if dollar_volume > 20000000.0: print("High Trading Liquidity, dollar volume: " + num_to_short_text(dollar_volume)) else: print("Low Trading Liquidity, dollar volume: " + num_to_short_text(dollar_volume)) # PEG is apparently inaccurate need to implement checks/also check conditional logic peg = float(stock.get_price_earnings_growth_ratio()) if peg > 1.5: print("Undervalued, Large Growth Potential, PEG ratio: " + str(peg)) elif peg < 1: print("Overvalued, High Risk Potential, PEG ratio: " + str(peg)) else: print("Fairly Priced, Low Growth Potential, PEG ratio: " + str(peg)) # TODO: ROE (increasing ROE signals regular profit generation) # TODO: Beta value to determine volatility # TODO: Actual EPS vs next quarter estimated EPS (to predict imminent stock jump or crash) # TODO: Formula to calculate future theoretical earnings # Converting textual numbers to floats market_cap = short_text_to_float(stock.get_market_cap()) if market_cap > 200000000000.0: print("Mega Cap") elif market_cap > 10000000000.0: print("Large Cap") elif market_cap > 2000000000.0: print("Mid Cap") elif market_cap > 300000000.0: print("Small Cap") elif market_cap > 50000000.0: print("Micro Cap") else: print("Nano Cap") print("Market Capitalization: " + num_to_short_text(market_cap)) print(line_separator)
def getAllStockData(ticker): '''Get a few random tickers.''' stock = Share(ticker) stock.refresh() data = { 'name': stock.get_name(), 'price': stock.get_price(), 'change': stock.get_change(), 'volume': stock.get_volume(), 'prev_close': stock.get_prev_close(), 'open': stock.get_open(), 'avg_daily_volume': stock.get_avg_daily_volume(), 'stock_exchange': stock.get_stock_exchange, 'market_cap': stock.get_market_cap(), 'book_value': stock.get_book_value(), 'ebitda': stock.get_ebitda(), 'dividend_share': stock.get_dividend_share(), 'dividend_yield': stock.get_dividend_yield(), 'earnings_share': stock.get_earnings_share(), 'days_high': stock.get_days_high(), 'days_low': stock.get_days_low(), 'year_high': stock.get_year_high(), 'year_low': stock.get_year_low(), '50day_moving_avg': stock.get_50day_moving_avg(), '200day_moving_avg': stock.get_200day_moving_avg(), 'price_earnings_ratio': stock.get_price_earnings_ratio(), 'price_earnings_growth_ratio': stock.get_price_earnings_growth_ratio(), 'get_price_sales': stock.get_price_sales(), 'get_price_book': stock.get_price_book(), 'get_short_ratio': stock.get_short_ratio(), 'trade_datetime': stock.get_trade_datetime(), 'percent_change_from_year_high': stock.get_percent_change_from_year_high(), 'percent_change_from_year_low': stock.get_percent_change_from_year_low(), 'change_from_year_low': stock.get_change_from_year_low(), 'change_from_year_high': stock.get_change_from_year_high(), 'percent_change_from_200_day_moving_average': stock.get_percent_change_from_200_day_moving_average(), 'change_from_200_day_moving_average': stock.get_change_from_200_day_moving_average(), 'percent_change_from_50_day_moving_average': stock.get_percent_change_from_50_day_moving_average(), 'change_from_50_day_moving_average': stock.get_change_from_50_day_moving_average(), 'EPS_estimate_next_quarter': stock.get_EPS_estimate_next_quarter(), 'EPS_estimate_next_year': stock.get_EPS_estimate_next_year(), 'ex_dividend_date': stock.get_ex_dividend_date(), 'EPS_estimate_current_year': stock.get_EPS_estimate_current_year(), 'price_EPS_estimate_next_year': stock.get_price_EPS_estimate_next_year(), 'price_EPS_estimate_current_year': stock.get_price_EPS_estimate_current_year(), 'one_yr_target_price': stock.get_one_yr_target_price(), 'change_percent_change': stock.get_change_percent_change(), 'divended_pay_date': stock.get_dividend_pay_date(), 'currency': stock.get_currency(), 'last_trade_with_time': stock.get_last_trade_with_time(), 'days_range': stock.get_days_range(), 'years_range': stock.get_year_range() } return data
def peg_ratio(self): for i in range(len(self.list_of_tick)): try: ticker = self.list_of_tick[i][0] info_stock = Share(ticker) pegrowth_val = float( info_stock.get_price_earnings_growth_ratio()) if isinstance(pegrowth_val, float) == True: self.db_validate(pegrowth_val, ticker, "PEGRatio") except yahoo_errors: pass
def rec(p): yahoo = Share(p) a = yahoo.get_prev_close() b = yahoo.get_year_high() c = yahoo.get_year_low() d = yahoo.get_open() e = yahoo.get_ebitda() f = yahoo.get_market_cap() g = yahoo.get_avg_daily_volume() h = yahoo.get_dividend_yield() i = yahoo.get_earnings_share() j = yahoo.get_days_low() k = yahoo.get_days_high() l = yahoo.get_50day_moving_avg() m = yahoo.get_200day_moving_avg() n = yahoo.get_price_earnings_ratio() o = yahoo.get_price_earnings_growth_ratio() print p print "Previous Close: ", a print "Year High", b print "Year Low", c print "Open:", d print "EBIDTA", e print "Market Cap", f print "Average Daily Volume", g print "Dividend Yield", h print "Earnings per share", i print "Days Range:", j, "-", k print "50 Days Moving Average", l print "200 Days Moving Average", m print "Price Earnings Ratio", n print "Price Earnings Growth Ratio", o import MySQLdb db = MySQLdb.connect(host="127.0.0.1", user="******", passwd="1111", db="stocks", local_infile=1) cur = db.cursor() cur.execute( """ INSERT INTO stockapp_info (symbol, prev_close, year_high, year_low, open_price , ebidta, market_cap, avg_daily_vol , dividend_yield, eps , days_low ,days_high, moving_avg_50, moving_avg_200, price_earnings_ratio, price_earnings_growth_ratio) VALUES (%s, %s, %s, %s, %s, %s, %s,%s,%s,%s,%s,%s,%s,%s,%s,%s) """, (p, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)) db.commit() cur.close()
def get_company_info(ticker): try: s = Share(ticker) data = { 'Market_cap': s.get_market_cap(), 'Average_volume': s.get_avg_daily_volume(), 'EPS': s.get_earnings_share(), 'Short_ratio': s.get_short_ratio(), 'PE': s.get_price_earnings_ratio(), 'PEG': s.get_price_earnings_growth_ratio(), } return DataFetcher._extract_company_info(data) except YQLQueryError: logger.error("Company info not found for {}".format(ticker)) except Exception as e: logger.error("Unexpected error occured: {}".format(e)) return {}
def rec(p): yahoo = Share(p) a=yahoo.get_prev_close() b=yahoo.get_year_high() c=yahoo.get_year_low() d=yahoo.get_open() e=yahoo.get_ebitda() f=yahoo.get_market_cap() g=yahoo.get_avg_daily_volume() h=yahoo.get_dividend_yield() i=yahoo.get_earnings_share() j=yahoo.get_days_low() k=yahoo.get_days_high() l=yahoo.get_50day_moving_avg() m=yahoo.get_200day_moving_avg() n=yahoo.get_price_earnings_ratio() o=yahoo.get_price_earnings_growth_ratio() print p print "Previous Close: ",a print "Year High",b print "Year Low",c print "Open:",d print "EBIDTA",e print "Market Cap",f print "Average Daily Volume",g print "Dividend Yield",h print "Earnings per share",i print "Days Range:", j ,"-",k print "50 Days Moving Average",l print "200 Days Moving Average",m print"Price Earnings Ratio", n print"Price Earnings Growth Ratio",o import MySQLdb db = MySQLdb.connect(host="127.0.0.1", user="******",passwd="1111", db="stocks",local_infile = 1) cur=db.cursor() cur.execute (""" INSERT INTO stockapp_info (symbol, prev_close, year_high, year_low, open_price , ebidta, market_cap, avg_daily_vol , dividend_yield, eps , days_low ,days_high, moving_avg_50, moving_avg_200, price_earnings_ratio, price_earnings_growth_ratio) VALUES (%s, %s, %s, %s, %s, %s, %s,%s,%s,%s,%s,%s,%s,%s,%s,%s) """, (p,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)) db.commit() cur.close()
def yahooKeyStats(stock): try: share = Share(stock) per = float(share.get_price_earnings_ratio()) pbr= float (share.get_price_book()) peg = float (share.get_price_earnings_growth_ratio()) #xFirst criteria, price earnings ratio must be lower than 15 if per<15: print stock,'meets requirements' print 'Price Earnings Ratio:',stock,per print 'price to book ratio:',stock,pbr print 'price earnings growth ratio:',stock,peg datafm= {"stock":stock,"per":per,'pbr':pbr,'peg':peg} print(datafm) return datafm else: raise Exception("does not meet the criteria") except Exception,e: print stock, "does not meet the criteria"
def get_symbol_yahoo_stats_yql(symbols, exclude_name=False): """ Get the symbols' basic statistics from Yahoo Finance. Input: symbols - a list of symbol strings, e.g. ['AAPL'] Output: stats in Pandas DataFrame. This function is ported from pandas_datareader/yahoo/components.py """ sym_list = str2list(symbols) if sym_list == None: return DataFrame() # Yahoo Finance tags, refer to http://www.financialwisdomforum.org/gummy-stuff/Yahoo-data.htm tags = ['Symbol'] if not exclude_name: tags += ['Name'] tags += ['Exchange', 'MarketCap', 'Volume', 'AverageDailyVolume', 'BookValue', 'P/E', 'PEG', 'Price/Sales', 'Price/Book', 'EBITDA', 'EPS', 'EPSEstimateNextQuarter', 'EPSEstimateCurrentYear', 'EPSEstimateNextYear', 'OneyrTargetPrice', 'PriceEPSEstimateCurrentYear', 'PriceEPSEstimateNextYear', 'ShortRatio', 'Dividend/Share', 'DividendYield', 'DividendPayDate', 'ExDividendDate'] lines = [] for sym in sym_list: stock = Share(sym) line = [sym] if not exclude_name: line += [stock.get_name()] line += [stock.get_stock_exchange(), str2num(stock.get_market_cap(), m2b=True), str2num(stock.get_volume()), str2num(stock.get_avg_daily_volume()), str2num(stock.get_book_value()), str2num(stock.get_price_earnings_ratio()), str2num(stock.get_price_earnings_growth_ratio()), str2num(stock.get_price_sales()), str2num(stock.get_price_book()), str2num(stock.get_ebitda()), str2num(stock.get_earnings_share()), str2num(stock.get_EPS_estimate_next_quarter()), str2num(stock.get_EPS_estimate_current_year()), str2num(stock.get_EPS_estimate_next_year()), str2num(stock.get_one_yr_target_price()), str2num(stock.get_price_EPS_estimate_current_year()), str2num(stock.get_price_EPS_estimate_next_year()), str2num(stock.get_short_ratio()), str2num(stock.get_dividend_share()), str2num(stock.get_dividend_yield()), stock.get_dividend_pay_date(), stock.get_ex_dividend_date()] lines.append(line) stats = DataFrame(lines, columns=tags) stats = stats.drop_duplicates() stats = stats.set_index('Symbol') return stats
def on_message(self, message): print_logger.debug("Received message: %s" % (message)) self.write_message("Test Message") if "ValidateTicker" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed ticker validation request") self.write_message("ValidationFailed:Malformed") return ticker = message[1] # The file I have stored didn't end up being a good validation # option as it does not contain a complete list of all # securities. I have to acquire the data from yahoo # finance anyway, so just use that. The Share function # call will throw a NameError exception if the ticker doesn't exist # isValid = current_stock_list.is_valid_stock(ticker) isValid = True try: test = Share(str(ticker)) if test.get_price() is None: isValid = False except NameError: isValid = False if isValid: self.write_message("ValidationSucceeded:%s" % ticker) print_logger.debug("Ticker was valid") else: self.write_message("ValidationFailed:%s" % ticker) print_logger.debug("Ticker was bad") return elif "GetCompanyName" in message: print_logger.debug("You got here") message = message.split(":") company_ticker = message[1] company_name = "" try: company_info="../task_1/google_search_program/cleaned_data/" + company_ticker + "/company_info" company_name = " " f = open(company_info, "r") line = f.readlines() company_name = line[0].split(",") company_name = company_name[0] company_name = company_name.title() if '(' not in company_name: company_name = company_name + " (%s)" % company_ticker except Exception: company_name = get_company_title_proxied(company_ticker) self.write_message("CompanyName:%s" % company_name) elif "ExecuteQuery" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed input query") self.write_message("QueryResult:Error") data = current_solr_object.issue_query(str(message[1])) data = current_solr_object.recover_links(data) final_string = "QueryResult" for link in data: final_string = final_string + ":" + str(link) self.write_message(final_string) elif "GetStockData" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] # Get ticker information share_data = Share(ticker) price = share_data.get_price() percent_change = share_data.get_change() previous_close = share_data.get_prev_close() open_price = share_data.get_open() volume = share_data.get_volume() pe_ratio = share_data.get_price_earnings_ratio() peg_ratio = share_data.get_price_earnings_growth_ratio() market_cap = share_data.get_market_cap() book_value = share_data.get_price_book() average_volume = share_data.get_avg_daily_volume() dividend_share = share_data.get_dividend_share() dividend_yield = share_data.get_dividend_yield() earnings_per_share = share_data.get_earnings_share() ebitda = share_data.get_ebitda() fifty_day_ma = share_data.get_50day_moving_avg() days_high = share_data.get_days_high() days_low = share_data.get_days_low() year_high = share_data.get_year_high() year_low = share_data.get_year_low() two_hundred_day_ma = share_data.get_200day_moving_avg() # Build a string to send to the server containing the stock data share_string = "price:" + str(price) + "|"\ + "percentChange:" + str(percent_change) + "|"\ + "previousClose:" + str(previous_close) + "|"\ + "openPrice:" + str(open_price) + "|"\ + "volume:" + str(volume) + "|"\ + "peRatio:" + str(pe_ratio) + "|"\ + "pegRatio:" + str(peg_ratio) + "|"\ + "marketCap:" + str(market_cap) + "|"\ + "bookValue:" + str(book_value) + "|"\ + "averageVolume:" + str(average_volume) + "|"\ + "dividendShare:" + str(dividend_share) + "|"\ + "dividendYield:" + str(dividend_yield) + "|"\ + "earningsPerShare:" + str(earnings_per_share) + "|"\ + "ebitda:" + str(ebitda) + "|"\ + "50DayMa:" + str(fifty_day_ma) + "|"\ + "daysHigh:" + str(days_high) + "|"\ + "daysLow:" + str(days_low) + "|"\ + "yearHigh:" + str(year_high) + "|"\ + "yearLow:" + str(year_low) + "|"\ + "200DayMa:" + str(two_hundred_day_ma) + "|" self.write_message("StockData;%s" % (share_string)) print_logger.debug("Sending Message: StockData;%s" % (share_string)) elif "GetCompanyDesc" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] # Read in the company description description = "" try: f = open("../task_1/google_search_program/cleaned_data/%s/company_description" % str(ticker), "r") description = f.read() except Exception: # If the file does not exist, get the data manually description = update_description_oneoff(ticker) self.write_message("CompanyDescription:%s" % str(description)) elif "GetCompanyDividend" in message and "Record" not in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] # Grab the dividend data from dividata.com dividend_url = "https://dividata.com/stock/%s/dividend" % ticker # This should potentially be a dividend_data = requests.get(dividend_url) dividend_soup = BeautifulSoup(dividend_data.text, 'html5lib') if len(dividend_soup.find_all("table")) > 0: dividend_soup = dividend_soup.find_all("table")[0] else: dividend_soup = "<h3>No dividend history found.</h3>" # Send this div up to the server self.write_message("DividendHistoryData:" + str(dividend_soup)) elif "GetCompanyDividendRecord" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] # Get the dividend record html for the table and send it up dividend_record = strip_dividends(ticker, req_proxy) print_logger.debug("Writing message: " + str(dividend_record)) self.write_message("DividendRecord:" + str(dividend_record)) elif "GetBollinger" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] # Get the bollinger band history along with the 5 day moving average close, lower_band, five_day_ma = calculate_bands(ticker) last_5_days_5_day_ma = [] last_5_days_bb = [] last_5_days_close = [] for i in range(0, 5): last_5_days_5_day_ma.append(five_day_ma[i]) last_5_days_bb.append(lower_band[i]) last_5_days_close.append(close[i]) condition_1 = False condition_2 = False # Condition 1: Has the stock price at close been below the lower bollinger band # at market close within the last 5 days for i in range(0, 5): if last_5_days_close[i] < last_5_days_bb[i]: condition_1 = True # Condition 2: Has the current stock price been above the 5 day moving average sometime in the last 3 days for i in range(0, 3): if last_5_days_close[i] > last_5_days_5_day_ma[i]: condition_2 = True if condition_1 is True and condition_2 is True: self.write_message("BB:GoodCandidate") else: self.write_message("BB:BadCandidate") elif "GetSentiment" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] # Lists of sentiment based words good_words = ["buy", "bull", "bullish", "positive", "gain", "gains", "up"] bad_words = ["sell", "bear", "bearish", "negative", "loss", "losses", "down"] DATA_DIRECTORY = "../task_1/google_search_program/cleaned_data/%s" % ticker.upper() positive_file_stats = [] negative_file_stats = [] positive_files = 0 negative_files = 0 neutral_files = 0 trump_count = 0 files_examined = 0 for root, dirs, files in os.walk(DATA_DIRECTORY): path = root.split(os.sep) print((len(path) - 1) * '---', os.path.basename(root)) for file in files: if "article" in file: f = open('/'.join(path) + '/' + file) title = f.readline() article_text = " ".join(f.readlines()) if article_text.count("trump") > 0: trump_count = trump_count + 1 positive_word_count = 0 negative_word_count = 0 files_examined = files_examined + 1 for word in good_words: if word in article_text: positive_word_count = positive_word_count + article_text.count(word) print "Word: %s, %s" % (word, article_text.count(word)) for word in bad_words: if word in article_text: negative_word_count = negative_word_count + article_text.count(word) if positive_word_count > negative_word_count: positive_ratio = float(positive_word_count) / float(negative_word_count + positive_word_count) if positive_ratio > 0.7: positive_files = positive_files + 1 positive_file_stats.append((positive_word_count, negative_word_count)) else: neutral_files = neutral_files + 1 elif positive_word_count == negative_word_count: neutral_files = neutral_files + 1 else: negative_ratio = float(negative_word_count) / float(negative_word_count + positive_word_count) if negative_ratio > 0.7: negative_files = negative_files + 1 negative_file_stats.append((positive_word_count, negative_word_count)) else: neutral_files = neutral_files + 1 print_logger.debug("Sentiment:" + str(positive_files) + ":" + str(negative_files) +\ ":" + str(neutral_files) + ":" + str(trump_count) + ":" + str(files_examined)) self.write_message("Sentiment:" + str(positive_files) + ":" + str(negative_files) +\ ":" + str(neutral_files) + ":" + str(trump_count) + ":" + str(files_examined))
def on_message(self, message): print_logger.debug("Received message: %s" % (message)) if "ValidateTicker" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed ticker validation request") self.write_message("ValidationFailed:Malformed") return ticker = message[1] if validate_ticker(ticker): self.write_message("ValidationSucceeded:%s" % ticker) print_logger.debug("Ticker was valid") else: self.write_message("ValidationFailed:%s" % ticker) print_logger.debug("Ticker was bad") return elif "GetCompanyName" in message: print_logger.debug("You got here") message = message.split(":") company_ticker = message[1] company_name = get_company_title(company_ticker) self.write_message("CompanyName:%s" % company_name) elif "GetStockData" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] # Get ticker information share_data = Share(ticker) price = share_data.get_price() percent_change = share_data.get_change() previous_close = share_data.get_prev_close() open_price = share_data.get_open() volume = share_data.get_volume() pe_ratio = share_data.get_price_earnings_ratio() peg_ratio = share_data.get_price_earnings_growth_ratio() market_cap = share_data.get_market_cap() book_value = share_data.get_price_book() average_volume = share_data.get_avg_daily_volume() dividend_share = share_data.get_dividend_share() dividend_yield = share_data.get_dividend_yield() earnings_per_share = share_data.get_earnings_share() ebitda = share_data.get_ebitda() fifty_day_ma = share_data.get_50day_moving_avg() days_high = share_data.get_days_high() days_low = share_data.get_days_low() year_high = share_data.get_year_high() year_low = share_data.get_year_low() two_hundred_day_ma = share_data.get_200day_moving_avg() # Build a string to send to the server containing the stock data share_string = "price:" + str(price) + "|"\ + "percentChange:" + str(percent_change) + "|"\ + "previousClose:" + str(previous_close) + "|"\ + "openPrice:" + str(open_price) + "|"\ + "volume:" + str(volume) + "|"\ + "peRatio:" + str(pe_ratio) + "|"\ + "pegRatio:" + str(peg_ratio) + "|"\ + "marketCap:" + str(market_cap) + "|"\ + "bookValue:" + str(book_value) + "|"\ + "averageVolume:" + str(average_volume) + "|"\ + "dividendShare:" + str(dividend_share) + "|"\ + "dividendYield:" + str(dividend_yield) + "|"\ + "earningsPerShare:" + str(earnings_per_share) + "|"\ + "ebitda:" + str(ebitda) + "|"\ + "50DayMa:" + str(fifty_day_ma) + "|"\ + "daysHigh:" + str(days_high) + "|"\ + "daysLow:" + str(days_low) + "|"\ + "yearHigh:" + str(year_high) + "|"\ + "yearLow:" + str(year_low) + "|"\ + "200DayMa:" + str(two_hundred_day_ma) + "|" self.write_message("StockData;%s" % (share_string)) print_logger.debug("Sending Message: StockData;%s" % (share_string)) elif "GetCompanyDesc" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] description = update_description_oneoff(ticker) self.write_message("CompanyDescription:%s" % str(description)) elif "GetCompanyDividend" in message and "Record" not in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] # Grab the dividend data from dividata.com dividend_url = "https://dividata.com/stock/%s/dividend" % ticker # This should potentially be a dividend_data = requests.get(dividend_url) dividend_soup = BeautifulSoup(dividend_data.text, 'html5lib') if len(dividend_soup.find_all("table")) > 0: dividend_soup = dividend_soup.find_all("table")[0] else: dividend_soup = "<h3>No dividend history found.</h3>" # Send this div up to the server self.write_message("DividendHistoryData:" + str(dividend_soup)) elif "GetCompanyDividendRecord" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] # Get the dividend record html for the table and send it up #dividend_record = strip_dividends(ticker, req_proxy) #print_logger.debug("Writing message: " + str(dividend_record)) #self.write_message("DividendRecord:" + str(dividend_record)) elif "GetBollinger" in message: message = message.split(":") if len(message) != 2: print_logger.error("Malformed Message from Client") return ticker = message[1] # Switch into the tmp directory old_dir = os.getcwd() os.chdir(TEMP_DIR) # Update the historical data for the ticker symbol YAHOO_FINANCE_HISTORICAL_OBJECT.read_ticker_historical(ticker) bands = BollingerBandStrategy(data_storage_dir="%s/historical_stock_data" % TEMP_DIR\ , ticker_file="%s/stock_list.txt" % TEMP_DIR, filtered_ticker_file=\ "%s/filtered_stock_list.txt" % TEMP_DIR) # Save the graph so that we can show it on the website bands.save_stock_chart(ticker, "%s" % TEMP_DIR) # Also let the server know that we found an answer result = bands.test_ticker(ticker) if result is not None: print_logger.debug("BB:GoodCandidate") self.write_message("BB:GoodCandidate") else: print_logger.debug("BB:BadCandidate") self.write_message("BB:BadCandidate") elif "CheckRobinhoodLogin" in message: print "HELLO WORLD!!! HELLO WORLD!!! HELLO WORLD!!!%s" % ROBINHOOD_INSTANCE if ROBINHOOD_INSTANCE.is_logged_in() is True: self.write_message("RobinhoodLoggedIn:%s" % ROBINHOOD_INSTANCE.username) else: self.write_message("RobinhoodNotLoggedIn") elif "GetPosition" in message: ticker = message.replace("GetPosition:", "") account_positions = ROBINHOOD_INSTANCE.get_position_history(active=True) user_owns_stock = False position_string = "" for position in account_positions: # Get data about the position, including current price. position_data = requests.get(position["instrument"]) position_data = json.loads(position_data._content) position.update(position_data) if position["symbol"] != ticker: continue quote_data = requests.get(position["quote"]); quote_data = json.loads(quote_data._content) position.update(quote_data) position_string = json.dumps(position) user_owns_stock = True if user_owns_stock is True: self.write_message("Position:%s" % position_string) else: self.write_message("Position:None")
def view_stock(request, ticker): if request.user.__class__.__name__ is 'CustomUser': c_user = get_object_or_404(CustomUser, pk=request.user.pk) account = Account.objects.get(user=c_user) else: account = False stock = get_object_or_404(Stock, ticker=ticker) companyName = stock.ticker companyName = companyName.upper() stock = Stock.objects.get(ticker=companyName) namer = "'" + companyName + "'" ystock = Share(companyName) the_price = ystock.get_price() regex = 'Business Summary</span></th><th align="right"> </th></tr></table><p>(.+?)</p>' pattern = re.compile(regex) root_url = urllib.urlopen("http://finance.yahoo.com/q/pr?s=" + companyName + "+Profile") htmltext = root_url.read() decoded_str = str(re.findall(pattern, htmltext)).decode("utf8") encoded_str = decoded_str.encode('ascii', 'ignore') stock.description = encoded_str stock.description = stock.description[:-2] stock.description = stock.description[2:] stock.book_value = ystockquote.get_book_value(companyName) stock.change = ystockquote.get_change(companyName) #stock.dividend_per_share = ystockquote.get_dividend_per_share(companyName) #stock.dividend_yield = ystockquote.get_dividend_yield(companyName) stock.ebitda = ystockquote.get_ebitda(companyName) stock.fifty_two_week_high = ystockquote.get_52_week_high(companyName) stock.fifty_two_week_low = ystockquote.get_52_week_low(companyName) stock.market_cap = ystockquote.get_market_cap(companyName) stock.short_ratio = ystockquote.get_short_ratio(companyName) stock.stock_exchange = ystockquote.get_stock_exchange(companyName) stock.volume = ystockquote.get_volume(companyName) stock.price = ystock.get_price() #yahoo_finance stock.average_daily_volume = ystock.get_avg_daily_volume() stock.earnings_per_share = ystock.get_price_earnings_ratio() stock.fifty_day_moving_avg = ystock.get_50day_moving_avg() stock.two_hundred_day_moving_avg = ystock.get_200day_moving_avg() stock.price_book_ratio = ystock.get_price_book() stock.last_sale = ystock.get_price() stock.price_earnings_growth_ratio = ystock.get_price_earnings_growth_ratio( ) stock.price_earnings_ratio = ystock.get_price_earnings_ratio() stock.price_sales_ratio = ystock.get_price_sales() stock.save() vl = [] acl = [] hl = [] ll = [] cl = [] ol = [] days_list = [] d = 0 seven_days_ago = datetime.datetime.now() + datetime.timedelta(-30) today = datetime.datetime.now() days = ystockquote.get_historical_prices( 'GOOGL', seven_days_ago.strftime("%Y-%m-%d"), today.strftime("%Y-%m-%d")) for day in days.keys(): d += 1 date_label = datetime.datetime.now() + datetime.timedelta(-d) days_list.append(date_label.strftime("%b-%d")) day_info = days.get(day) vol = int(day_info.get('Volume')) vl.append(vol) adjcl = float(day_info.get('Adj Close')) acl.append(adjcl) highs = float(day_info.get('High')) hl.append(highs) lows = float(day_info.get('Low')) ll.append(lows) closes = float(day_info.get('Close')) cl.append(closes) opens = float(day_info.get('Open')) ol.append(opens) volume = vl lows = ll opens = ol highs = hl averages = acl closes = cl days_l = days_list[::-1] context = RequestContext( request, dict(account=account, request=request, stock=stock, volume=volume, lows=lows, highs=highs, opens=opens, closes=closes, averages=averages, days_l=days_l)) return render_to_response('scrapyr_app/stock.html', context=context)
def view_stock(request, ticker): if request.user.__class__.__name__ is "CustomUser": c_user = get_object_or_404(CustomUser, pk=request.user.pk) account = Account.objects.get(user=c_user) else: account = False stock = get_object_or_404(Stock, ticker=ticker) companyName = stock.ticker companyName = companyName.upper() stock = Stock.objects.get(ticker=companyName) namer = "'" + companyName + "'" ystock = Share(companyName) the_price = ystock.get_price() regex = 'Business Summary</span></th><th align="right"> </th></tr></table><p>(.+?)</p>' pattern = re.compile(regex) root_url = urllib.urlopen("http://finance.yahoo.com/q/pr?s=" + companyName + "+Profile") htmltext = root_url.read() decoded_str = str(re.findall(pattern, htmltext)).decode("utf8") encoded_str = decoded_str.encode("ascii", "ignore") stock.description = encoded_str stock.description = stock.description[:-2] stock.description = stock.description[2:] stock.book_value = ystockquote.get_book_value(companyName) stock.change = ystockquote.get_change(companyName) # stock.dividend_per_share = ystockquote.get_dividend_per_share(companyName) # stock.dividend_yield = ystockquote.get_dividend_yield(companyName) stock.ebitda = ystockquote.get_ebitda(companyName) stock.fifty_two_week_high = ystockquote.get_52_week_high(companyName) stock.fifty_two_week_low = ystockquote.get_52_week_low(companyName) stock.market_cap = ystockquote.get_market_cap(companyName) stock.short_ratio = ystockquote.get_short_ratio(companyName) stock.stock_exchange = ystockquote.get_stock_exchange(companyName) stock.volume = ystockquote.get_volume(companyName) stock.price = ystock.get_price() # yahoo_finance stock.average_daily_volume = ystock.get_avg_daily_volume() stock.earnings_per_share = ystock.get_price_earnings_ratio() stock.fifty_day_moving_avg = ystock.get_50day_moving_avg() stock.two_hundred_day_moving_avg = ystock.get_200day_moving_avg() stock.price_book_ratio = ystock.get_price_book() stock.last_sale = ystock.get_price() stock.price_earnings_growth_ratio = ystock.get_price_earnings_growth_ratio() stock.price_earnings_ratio = ystock.get_price_earnings_ratio() stock.price_sales_ratio = ystock.get_price_sales() stock.save() vl = [] acl = [] hl = [] ll = [] cl = [] ol = [] days_list = [] d = 0 seven_days_ago = datetime.datetime.now() + datetime.timedelta(-30) today = datetime.datetime.now() days = ystockquote.get_historical_prices("GOOGL", seven_days_ago.strftime("%Y-%m-%d"), today.strftime("%Y-%m-%d")) for day in days.keys(): d += 1 date_label = datetime.datetime.now() + datetime.timedelta(-d) days_list.append(date_label.strftime("%b-%d")) day_info = days.get(day) vol = int(day_info.get("Volume")) vl.append(vol) adjcl = float(day_info.get("Adj Close")) acl.append(adjcl) highs = float(day_info.get("High")) hl.append(highs) lows = float(day_info.get("Low")) ll.append(lows) closes = float(day_info.get("Close")) cl.append(closes) opens = float(day_info.get("Open")) ol.append(opens) volume = vl lows = ll opens = ol highs = hl averages = acl closes = cl days_l = days_list[::-1] context = RequestContext( request, dict( account=account, request=request, stock=stock, volume=volume, lows=lows, highs=highs, opens=opens, closes=closes, averages=averages, days_l=days_l, ), ) return render_to_response("scrapyr_app/stock.html", context=context)
except: pass try: russell3000.set_value(s,'50 days MA',shy.get_50day_moving_avg()) except: pass try: russell3000.set_value(s,'200 days MA',shy.get_200day_moving_avg()) except: pass try: russell3000.set_value(s,'Price earnings ratio',shy.get_price_earnings_ratio()) except: pass try: russell3000.set_value(s,'Price earnings growth ratio',shy.get_price_earnings_growth_ratio()) except: pass try: russell3000.set_value(s,'Price sales',shy.get_price_sales()) except: pass try: russell3000.set_value(s,'Price book',shy.get_price_book()) except: pass try: russell3000.set_value(s,'Short ratio',shy.get_short_ratio()) except: pass u=datetime.now()
from yahoo_finance import Share #yahoo = Share('YHOO') #yahoo = Share('SPXC') yahoo = Share('TFM') #yahoo = Share('INDU') #INDEXSP #yahoo = Share('NDX') print yahoo print yahoo.get_open() #'36.60' print yahoo.get_price() print yahoo.get_price_earnings_ratio() print 'get_dividend_share: ',yahoo.get_dividend_share() print 'get_dividend_yield: ',yahoo.get_dividend_yield() print 'get_earnings_share: ',yahoo.get_earnings_share() print 'get_price_earnings_ratio: ',yahoo.get_price_earnings_ratio() print 'get_price_earnings_growth_ratio: ',yahoo.get_price_earnings_growth_ratio() print 'get_year_high: ',yahoo.get_year_high() print 'get_year_low: ',yahoo.get_year_low() print 'get_days_high: ',yahoo.get_days_high() print 'get_days_low: ',yahoo.get_days_low() print 'get_ebitda: ',yahoo.get_ebitda() print 'get_book_value: ',yahoo.get_book_value() #'36.84' #print yahoo.get_trade_datetime() #'2014-02-05 20:50:00 UTC+0000' #get_avg_daily_volume()
def loadKeyStatistics (cls, companyID = 'A'): ''' dataset df= pd.DataFrame(columns=['marketCapital','bookValue','ebitda','dividentShare','DividentYield','earningShare', 'BookPrice','SalesPrice','earningsGrowth','earningsRatio', 'symbol', 'date']) ''' yahoo = Share(companyID) yahoo.refresh() try: a = re.search('[a-zA-Z]+', yahoo.get_market_cap()) b = re.search('[a-zA-Z]+', yahoo.get_ebitda()) if a.group(0) is not None: p = re.split('[a-zA-Z]+', yahoo.get_market_cap()) if a.group(0) in 'B': marketCap = float(p[0]) * 10 ** 9 elif a.group(0) in 'M': marketCap = float(p[0]) * 10 ** 6 else: marketCap = -1 print ('Market cap: ' + yahoo.get_market_cap()) else: marketCap = yahoo.get_market_cap() if b.group(0) is not None: p = re.split('[a-zA-Z]+', yahoo.get_ebitda()) if b.group(0) in 'B': ebitda = float(p[0]) * 10 ** 9 elif b.group(0) in 'M': ebitda = float(p[0]) * 10 ** 6 else: ebitda = -1 print ('Ebitda: ' +yahoo.get_ebitda()) else: ebitda = yahoo.get_ebitda() except (TypeError, AttributeError): print ('Missing :' + companyID) e = sys.exc_info()[0] print( "<p>Error: %s</p>" % e ) ebitda = -1.0 marketCap = -1.0 try: company = LoadYahooFinance(symbol = companyID, marketCap = marketCap, bookValue = float(yahoo.get_book_value()), ebitda = ebitda, dividentShare = float(yahoo.get_dividend_share()), dividentYield = float(yahoo.get_dividend_yield()), earningShare = float(yahoo.get_earnings_share()), bookPrice = float(yahoo.get_price_book()), salesPrice = float(yahoo.get_price_sales()), earningsGrowth = float(yahoo.get_price_earnings_growth_ratio()), earningRatio = float(yahoo.get_price_earnings_ratio())) return company except TypeError: print ('Missing :' + companyID) e = sys.exc_info()[0] print( "<p>Error: %s</p>" % e )
# yahoo_stock_scrapper Find "under valued" companies import time from yahoo_finance import Share Russell3000 = ['FLWS', 'SRCE', 'FOXA', 'FOX', 'TWOU', 'DDD', 'MMM', 'EGHT', 'AVHI', 'ATEN', 'AAC', 'AAON', 'AIR', 'AAN', 'ABAX', 'ABT', 'ABBV', 'ANF', 'ABMD', 'ABM', 'AXAS', 'ACIA', 'ACTG', 'ACHC', 'ACAD', 'AKR', 'AXDX', 'XLRN', 'ACN', 'ANCX', 'ACCO', 'ARAY', 'ACRX', 'ACET', 'ACHN', 'ACIW', 'ACRS', 'ACNB', 'ACOR', 'ATVI', 'ACTA', 'ATU', 'AYI', 'ACXM', 'ADMS', 'AE', 'ADUS', 'ADPT', 'ADBE', 'ADTN', 'ADRO', 'AAP', 'WMS', 'AEIS', 'AMD', 'ADXS', 'ADVM', 'ABCO', 'ACM', 'AEGN', 'AEPI', 'AERI', 'HIVE', 'AJRD', 'AVAV', 'AES', 'AET', 'AMG', 'AFL', 'MITT', 'AGCO', 'AGEN', 'AGRX', 'A', 'AGYS', 'AGIO', 'GAS', 'ADC', 'AGFS', 'AIMT', 'AL', 'AIRM', 'APD', 'ATSG', 'AYR', 'AKS', 'AKAM', 'AKBA', 'AKRX', 'ALG', 'ALRM', 'ALK', 'AIN', 'AMRI', 'ALB', 'AA', 'ALDR', 'ALR', 'ALEX', 'ALX', 'ARE', 'ALXN', 'ALCO', 'ALGN', 'ALJJ', 'ALKS', 'Y', 'ATI', 'ABTX', 'ALGT', 'ALLE', 'AGN', 'ALE', 'ADS', 'AOI', 'LNT', 'AMOT', 'AWH', 'ALSN', 'MDRX', 'ALL', 'ALLY', 'AFAM', 'ALNY', 'ALJ', 'AOSL', 'GOOGL', 'GOOG', 'ASPS', 'RESI', 'AIMC', 'MO', 'AMAG', 'AMZN', 'AMBC', 'AMBA', 'AMBR', 'AMC', 'AMCX', 'DOX', 'AMED', 'APEI', 'UHAL', 'AEE', 'AAL', 'AAT', 'AXL', 'ACC', 'MTGE', 'AGNC', 'AEO', 'AEP', 'AEL', 'AXP', 'AFG', 'AMH', 'AMIC', 'AIG', 'ANAT', 'AMNB', 'ARII', 'ARA', 'ASEI', 'AMSWA', 'AWR', 'AMSC', 'AMT', 'AVD', 'AMWD', 'AWK', 'CRMT', 'AMP', 'ABCB', 'AMSF', 'ABC', 'ATLO', 'AME', 'AMGN', 'FOLD', 'AMKR', 'AHS', 'AP', 'AMPH', 'APH', 'AMPE', 'BETR', 'AMSG', 'AFSI', 'APC', 'ADI', 'ALOG', 'AVXL', 'AMRC', 'ANGI', 'ANGO', 'ANIP', 'ANIK', 'AXE', 'NLY', 'ANSS', 'AR', 'ANTM', 'ANTH', 'ANH', 'AON', 'APA', 'AIV', 'APIC', 'APOG', 'ARI', 'APOL', 'AMTG', 'APPF', 'APLE', 'AAPL', 'AGTC', 'AIT', 'AMAT', 'AMCC', 'AAOI', 'ATR', 'WTR', 'AQMS', 'ARMK', 'PETX', 'ARC', 'ARCB', 'ACGL', 'ADM', 'AROC', 'ACAT', 'ARDX', 'ASC', 'ARNA', 'ACRE', 'AGX', 'AGII', 'ARGS', 'ARIA', 'AI', 'ANDE', 'AFI', 'AWI', 'ARRY', 'ARRS', 'ARW', 'AROW', 'ARWR', 'ARTNA', 'APAM', 'ANET', 'ABG', 'ASNA', 'ASCMA', 'AHP', 'AHT', 'ASH', 'AHL', 'AZPN', 'ASB', 'AC', 'AIZ', 'AGO', 'ASTE', 'AST', 'AF', 'ATRO', 'T', 'ATRA', 'ATHN', 'ATHX', 'ACBI', 'AT', 'ABY', 'AAWW', 'AFH', 'TEAM', 'ATO', 'ATNI', 'ATRC', 'ATRI', 'ATW', 'ABTL', 'ADSK', 'ADP', 'AN', 'AZO', 'AVB', 'AHH', 'ARR', 'AVY', 'AVXS', 'AVG', 'AVID', 'AVGR', 'CAR', 'AVA', 'AVT', 'AVP', 'AVX', 'AXTA', 'ACLS', 'AXLL', 'AXS', 'AXGN', 'AXON', 'AXSM', 'AZZ', 'BGS', 'RILY', 'BW', 'BMI', 'BHI', 'BCPC', 'BWINB', 'BLL', 'BANC', 'BANF', 'BLX', 'TBBK', 'BXS', 'BKMU', 'BAC', 'BOH', 'BMRC', 'BK', 'OZRK', 'BFIN', 'RATE', 'BKU', 'BWFG', 'BANR', 'BHB', 'BNED', 'BKS', 'B', 'AGR', 'AVNU', 'BAX', 'BV', 'BBT', 'BBCN', 'BBX', 'BEAV', 'BECN', 'BSF', 'BZH', 'BDX', 'BBBY', 'BELFB', 'BDC', 'BLCM', 'BEL', 'BMS', 'BHE', 'BNCL', 'BNFT', 'WRB', 'BRK.B', 'BHLB', 'BERY', 'BBY', 'BGCP', 'BGFV', 'BIG', 'BH', 'BBG', 'BPTH', 'BCRX', 'BIIB', 'BMRN', 'BIO', 'BIOS', 'BSTC', 'TECH', 'BEAT', 'BTX', 'BJRI', 'BBOX', 'BKH', 'BKFS', 'BLKB', 'HAWK', 'BLK', 'CUDA', 'BBSI', 'BSET', 'BLBD', 'BUFF', 'BCRH', 'BHBK', 'NILE', 'BLUE', 'BPMC', 'BRG', 'BMCH', 'BNCN', 'BOBE', 'BA', 'BOFI', 'WIFI', 'BCC', 'BOJA', 'BOKF', 'BOOT', 'BAH', 'BWA', 'SAM', 'BPFH', 'BXP', 'BSX', 'EPAY', 'BOX', 'BYD', 'BRC', 'BDN', 'BDGE', 'BPI', 'BGG', 'BFAM', 'BCOV', 'EAT', 'BCO', 'BMY', 'BRS', 'BRX', 'AVGO', 'BR', 'BSFT', 'BRCD', 'BKD', 'BRKL', 'HRB', 'BLMN', 'BCOR', 'BRKR', 'BC', 'BMTC', 'BLMT', 'BKE', 'BWLD', 'BBW', 'BLDR', 'BG', 'BURL', 'BWXT', 'CFFI', 'CHRW', 'BNK', 'CA', 'CAB', 'CABO', 'CBT', 'CCMP', 'COG', 'CACI', 'CDNS', 'CACQ', 'CZR', 'CSTE', 'CAI', 'CALM', 'CLMS', 'CAMP', 'CAA', 'CVGW', 'CAL', 'CCC', 'CFNB', 'CRC', 'CWT', 'CALX', 'ELY', 'CALD', 'CPE', 'CPN', 'ABCD', 'CBM', 'CAC', 'CPT', 'BRKS', 'BRO', 'BF.A', 'BF.B', 'CCBG', 'COF', 'CSU', 'CFFN', 'CMO', 'CARA', 'CRR', 'CARB', 'CFNL', 'CAH', 'CSII', 'CATM', 'CCP', 'CRCM', 'CECO', 'CTRE', 'CSL', 'KMX', 'CKEC', 'CCL', 'CARO', 'CRS', 'CSV', 'CRZO', 'TAST', 'CRI', 'CACB', 'CSCD', 'CWST', 'CASY', 'CSH', 'CASS', 'CSLT', 'CTLT', 'CTT', 'CAT', 'CATY', 'CATO', 'CVCO', 'CAVM', 'CBZ', 'CBL', 'CBOE', 'CBG', 'CPB', 'CMN', 'CPLA', 'CBF', 'CDR', 'CGI', 'CE', 'CPXX', 'CELG', 'CLDX', 'CBMG', 'CEMP', 'CNC', 'CNP', 'CSFL', 'CETV', 'CENT', 'CPF', 'CVCY', 'CENX', 'CNBKA', 'CNTY', 'CCS', 'CTL', 'CPHD', 'CERN', 'CERS', 'CEVA', 'CF', 'ECOM', 'CRL', 'GTLS', 'CHTR', 'CHFN', 'CCF', 'CLDT', 'CAKE', 'CHEF', 'CHGG', 'CHE', 'CHFC', 'CCXI', 'CHMT', 'CHMG', 'LNG', 'CHK', 'CHSP', 'CPK', 'CBS', 'CDK', 'CDW', 'CEB', 'CECE', 'CIM', 'CMRX', 'CMG', 'CHH', 'CDXC', 'CB', 'CHD', 'CHDN', 'CHUY', 'CDTX', 'CIEN', 'CI', 'XEC', 'CMPR', 'CBB', 'CINF', 'CNK', 'CTAS', 'CIR', 'CRUS', 'CSCO', 'CIT', 'CTRN', 'C', 'CZNC', 'CFG', 'CIA', 'CTXS', 'CHCO', 'CIO', 'CIVI', 'CLC', 'CLNE', 'CLH', 'CCO', 'CLFD', 'CLW', 'CLF', 'CSBK', 'CLX', 'CLVS', 'MYCC', 'CME', 'CVX', 'CBI', 'CHS', 'PLCE', 'COBZ', 'COKE', 'KO', 'CDXS', 'CVLY', 'CDE', 'CCOI', 'CGNX', 'CTSH', 'CNS', 'COHR', 'CHRS', 'COHU', 'CFX', 'CL', 'CLCT', 'COLL', 'CLNY', 'SFR', 'COLB', 'CPGX', 'CXP', 'COLM', 'CMCO', 'CMCSA', 'CMA', 'FIX', 'CSAL', 'CBSH', 'CMC', 'COMM', 'CBU', 'CYH', 'CHCT', 'CTBI', 'COB', 'CVLT', 'CMP', 'CPSI', 'CSC', 'CIX', 'SCOR', 'CMTL', 'CAG', 'CMS', 'CNA', 'CCNE', 'CNO', 'COH', 'CIE', 'CNOB', 'CONN', 'COP', 'CNX', 'CNSL', 'ED', 'CTO', 'CWCO', 'STZ', 'MCF', 'CBPX', 'CLR', 'CTRL', 'CVG', 'COO', 'CPS', 'CTB', 'CPA', 'CPRT', 'CORT', 'CORE', 'CLGX', 'CORR', 'COR', 'CVRS', 'CSOD', 'GLW', 'OFC', 'CXW', 'CRVL', 'CRVS', 'CMRE', 'CSGP', 'COST', 'COTV', 'COTY', 'ICBK', 'CUZ', 'CVA', 'CVTI', 'COWN', 'PMTS', 'CNCE', 'CXO', 'CFMS', 'CNMD', 'CTWS', 'CACC', 'CREE', 'CROX', 'CCRN', 'CCI', 'CCK', 'CRY', 'CSGS', 'CSRA', 'CSS', 'CST', 'CSWI', 'CSX', 'CTS', 'CUNB', 'CUBE', 'CUB', 'CFR', 'CFI', 'CMI', 'CRIS', 'CW', 'CUBI', 'CUTR', 'CVBF', 'CVT', 'CVI', 'CVS', 'CYNO', 'CY', 'CONE', 'CYS', 'CYTK', 'CTMX', 'CYTR', 'DHI', 'DJCO', 'DAKT', 'DAN', 'DHR', 'DRI', 'DAR', 'DTLK', 'BCR', 'CRAI', 'CBRL', 'BREW', 'CR', 'CRD.B', 'CRAY', 'DECK', 'DE', 'DFRG', 'TACO', 'DK', 'DLPH', 'DAL', 'DLA', 'DGAS', 'DEL', 'DLX', 'DWRE', 'DNR', 'DENN', 'XRAY', 'DEPO', 'DERM', 'DXLG', 'DVN', 'DV', 'DXCM', 'DHX', 'DHT', 'DHIL', 'DO', 'DRII', 'FANG', 'DRH', 'DKS', 'DBD', 'DGII', 'DMRC', 'DLR', 'DGI', 'DDS', 'DCOM', 'DMTX', 'DIN', 'DIOD', 'DPLO', 'DFS', 'PLAY', 'DVA', 'DWSN', 'DCT', 'DDR', 'DF', 'DPZ', 'UFS', 'DCI', 'DGICA', 'RRD', 'LPG', 'DORM', 'PLOW', 'DEI', 'DOV', 'DOW', 'DPS', 'DWA', 'DW', 'DRQ', 'DSPG', 'DST', 'DSW', 'DTE', 'DTSI', 'DD', 'DCO', 'DUK', 'DRE', 'DLTH', 'DNB', 'DNKN', 'DFT', 'DRRX', 'DXPE', 'DY', 'BOOM', 'DVAX', 'DYN', 'DX', 'ETFC', 'EGBN', 'EXP', 'EGRX', 'ELNK', 'ESTE', 'EWBC', 'DISCA', 'DISCK', 'DISH', 'DIS', 'DLB', 'DG', 'DLTR', 'D', 'EBIX', 'ECHO', 'SATS', 'ECR', 'ECL', 'EDGE', 'EPC', 'EIX', 'EDIT', 'EDR', 'EW', 'EGLT', 'EHTH', 'EIGR', 'EE', 'LOCO', 'ERI', 'ELRC', 'ESIO', 'EA', 'EFII', 'RDEN', 'ELLI', 'PERY', 'EMC', 'EMCI', 'EME', 'EMKR', 'EBS', 'EMR', 'EDE', 'NYNY', 'ESRT', 'EIG', 'ENTA', 'ECPG', 'WIRE', 'ENDP', 'ECYT', 'ELGX', 'DEA', 'EGP', 'EMN', 'KODK', 'ETN', 'EV', 'EBAY', 'EBF', 'ENVA', 'NPO', 'ESV', 'ENSG', 'ESGR', 'ENTG', 'ENTL', 'ETM', 'ETR', 'EBTC', 'EFSC', 'EVC', 'ENV', 'EVHC', 'ENZ', 'EOG', 'EPE', 'EPAM', 'EPIQ', 'EPZM', 'PLUS', 'EPR', 'EQT', 'EFX', 'EQIX', 'EQBK', 'EQC', 'ELS', 'EQY', 'EQR', 'ERA', 'ERIE', 'ERN', 'EROS', 'ESCA', 'ESE', 'ESPR', 'ESSA', 'ESND', 'ESNT', 'EIGI', 'ENH', 'EGN', 'ENR', 'WATT', 'ERII', 'ENOC', 'ENS', 'EGL', 'RE', 'ES', 'EVTC', 'EVDY', 'EVH', 'EPM', 'EXA', 'EXAS', 'EXAC', 'EXAM', 'EXAR', 'XCO', 'EXEL', 'EXC', 'EXLS', 'XONE', 'EXPE', 'EXPD', 'EXPO', 'EXPR', 'ESRX', 'STAY', 'EXTN', 'EXR', 'EXTR', 'XOM', 'EZPW', 'FFIV', 'FN', 'FB', 'FDS', 'FICO', 'FCS', 'FMSA', 'FRP', 'FARM', 'FFKT', 'FMNB', 'FPI', 'ESS', 'EL', 'ESL', 'ETH', 'ETSY', 'EEFT', 'EVER', 'EVR', 'FNHC', 'FDX', 'FEIC', 'FCH', 'FOE', 'GSM', 'FGEN', 'FGL', 'FIS', 'LION', 'FRGI', 'FSAM', 'FITB', 'FNGN', 'FISI', 'FNSR', 'FINL', 'FEYE', 'FAF', 'FNLC', 'FBNC', 'FBP', 'BUSE', 'FBIZ', 'FCFS', 'FCNCA', 'FCBC', 'FCF', 'FCFP', 'FBNK', 'FDC', 'FDEF', 'FFBC', 'THFF', 'FFIN', 'FFNW', 'FFWM', 'FHN', 'FR', 'INBK', 'FARO', 'FAST', 'FFG', 'FBRC', 'FCB', 'AGM', 'FDML', 'FRT', 'FSS', 'FII', 'FRC', 'FSLR', 'FE', 'FMER', 'FISV', 'FIT', 'FIVE', 'FPRX', 'FIVN', 'FBC', 'FLT', 'FLTX', 'FLKS', 'FLXN', 'FLXS', 'FLIR', 'FTK', 'FLO', 'FLS', 'FLDM', 'FLR', 'FFIC', 'FMC', 'FTI', 'FNB', 'FNF', 'FNFV', 'FOGO', 'FL', 'F', 'FCE.A', 'FOR', 'FORM', 'FORR', 'FTNT', 'FBIO', 'FBHS', 'FET', 'FIBK', 'FLIC', 'FRME', 'FMBH', 'FMBI', 'FNBC', 'FNFG', 'FNWB', 'FPO', 'BEN', 'FSP', 'FRED', 'FCX', 'RAIL', 'FDP', 'FRPT', 'FTR', 'FRO', 'FRPH', 'FTD', 'FCN', 'FCEL', 'FULT', 'FF', 'GK', 'GAIA', 'GCAP', 'GALE', 'AJG', 'GBL', 'GME', 'GLPI', 'GCI', 'GPS', 'GRMN', 'IT', 'GLOG', 'GMT', 'GCP', 'GENC', 'GNRT', 'GNRC', 'BGC', 'GNCMA', 'GD', 'GE', 'GGP', 'GIS', 'FWRD', 'FOSL', 'FMI', 'FCPT', 'FXCB', 'FOXF', 'FRAN', 'FC', 'FELE', 'FSB', 'FI', 'THRM', 'GPC', 'GNW', 'GEO', 'GEOS', 'GABC', 'GERN', 'GTY', 'ROCK', 'GIMO', 'GIG', 'GILD', 'GBCI', 'GOOD', 'GLT', 'GKOS', 'GBT', 'BRSS', 'ENT', 'GBLI', 'GNL', 'GPN', 'GSOL', 'GWRS', 'GSAT', 'GLOB', 'GMED', 'GLUU', 'GLYC', 'GMS', 'GNC', 'GDDY', 'GOGO', 'GLNG', 'GORO', 'GDEN', 'GS', 'GM', 'GCO', 'GWR', 'GEN', 'GNE', 'GNMK', 'GHDX', 'G', 'GNTX', 'GIII', 'GVA', 'GPK', 'GTN', 'AJX', 'GLDD', 'GXP', 'GSBC', 'GWB', 'GB', 'GNBC', 'GRBK', 'GDOT', 'GPRE', 'GBX', 'GCBC', 'GHL', 'GLRE', 'GEF', 'GRIF', 'GFF', 'GPI', 'GRPN', 'GRUB', 'GTT', 'GBNK', 'GES', 'GUID', 'GWRE', 'GPOR', 'HEES', 'HABT', 'HCKT', 'HAE', 'HAIN', 'HAL', 'HALL', 'HALO', 'HYH', 'GT', 'GPRO', 'GRC', 'GOV', 'GPX', 'GRA', 'GGG', 'GHM', 'GHC', 'GWW', 'GPT', 'LOPE', 'HLIT', 'HRS', 'HSC', 'HIG', 'HAS', 'HTS', 'HVT', 'HE', 'HA', 'HCOM', 'HWKN', 'HAYN', 'FUL', 'HCHC', 'HCA', 'HCI', 'HCP', 'HDS', 'HW', 'HR', 'HCSG', 'HTA', 'HQY', 'HLS', 'HSTM', 'HWAY', 'HTLD', 'HTLF', 'HTWR', 'HL', 'HEI.A', 'HEI', 'HSII', 'HELE', 'HLX', 'HP', 'HMPR', 'HBHC', 'HNH', 'HBI', 'HAFC', 'HASI', 'THG', 'HDNG', 'HOG', 'HAR', 'HTZ', 'HSKA', 'HES', 'HPE', 'HXL', 'HF', 'HIBB', 'ONE', 'HIW', 'HIL', 'HI', 'HRC', 'HTH', 'HLT', 'HIFS', 'HMSY', 'HNI', 'HFC', 'HOLX', 'HBCP', 'HOMB', 'HD', 'HMST', 'HTBI', 'HON', 'HOFT', 'HMN', 'HBNC', 'HZN', 'HZNP', 'HRL', 'HOS', 'HDP', 'HPT', 'HST', 'HMHC', 'HLI', 'HOV', 'HMTV', 'HNNA', 'JKHY', 'HLF', 'HTBK', 'HCCI', 'HFWA', 'HRTG', 'HEOP', 'MLHR', 'HRTX', 'HT', 'HSY', 'HUN', 'HURC', 'HURN', 'H', 'HY', 'IAC', 'IBKC', 'ICFI', 'ICON', 'ICUI', 'IDA', 'IDRA', 'IEX', 'IDXX', 'IDI', 'IDT', 'IESC', 'RXDX', 'IHS', 'IIVI', 'ITW', 'ILMN', 'IMAX', 'IMMR', 'IMDZ', 'IMGN', 'IMMU', 'IMH', 'IPXL', 'IMPV', 'IMPR', 'IMS', 'INCR', 'SAAS', 'INCY', 'HHC', 'HPQ', 'HRG', 'HSNI', 'HUBG', 'HUBB', 'HUBS', 'HPP', 'HUM', 'HBAN', 'HII', 'IMKTA', 'IM', 'INGR', 'INWK', 'IPHS', 'IOSP', 'INVA', 'INGN', 'ITEK', 'INOV', 'INO', 'IPHI', 'NSIT', 'INSM', 'NSP', 'IBP', 'IIIN', 'INST', 'PODD', 'INSY', 'IART', 'IDTI', 'INTC', 'IQNT', 'NTLA', 'I', 'IPAR', 'IBKR', 'ININ', 'ICPT', 'ICE', 'IDCC', 'TILE', 'IBOC', 'IGT', 'IP', 'ISCA', 'ICD', 'IHC', 'IRT', 'IBCP', 'INDB', 'IBTX', 'INFN', 'INFI', 'IPCC', 'BLOX', 'III', 'HIFR', 'IR', 'NGVT', 'ISRG', 'IVC', 'INVN', 'SNAK', 'IVZ', 'IVR', 'ITG', 'ISBC', 'IRET', 'ITIC', 'NVTA', 'NVIV', 'IONS', 'IPGP', 'IRMD', 'IRIX', 'IRDM', 'IRBT', 'IRM', 'IRWD', 'ISLE', 'ISRL', 'STAR', 'ITC', 'ITRI', 'ITT', 'XXIA', 'IXYS', 'JJSF', 'JAX', 'JCOM', 'JBL', 'JACK', 'JEC', 'IPG', 'XENT', 'ISIL', 'IILG', 'IBM', 'INTL', 'IFF', 'ITCI', 'IL', 'SNOW', 'XON', 'INTU', 'JNPR', 'JUNO', 'LRN', 'KTWO', 'KAI', 'KALU', 'KAMN', 'KSU', 'KS', 'KAR', 'KPTI', 'KATE', 'KBH', 'KBR', 'KCG', 'KRNY', 'K', 'KELYA', 'KMPR', 'KMT', 'KW', 'KERX', 'KEY', 'KEYS', 'KEYW', 'KFRC', 'KRC', 'KE', 'KBAL', 'KMB', 'KIM', 'KMI', 'KND', 'KEX', 'KIRK', 'KITE', 'JAKK', 'JMBA', 'JRVR', 'JNS', 'JBHT', 'JBLU', 'JIVE', 'JBT', 'JNJ', 'JCI', 'JOUT', 'JONE', 'JLL', 'JOY', 'JPM', 'KRA', 'KTOS', 'KKD', 'KR', 'KRO', 'KVHI', 'LB', 'LLL', 'LJPC', 'LQ', 'LZB', 'LH', 'LADR', 'LTS', 'LSBG', 'LBAI', 'LKFN', 'LRCX', 'LAMR', 'LANC', 'LDR', 'LNDC', 'LE', 'LSTR', 'LCI', 'LPI', 'LVS', 'LHO', 'LSCC', 'LAWS', 'LAYN', 'LAZ', 'LCNB', 'KRG', 'KLAC', 'KLXI', 'KMG', 'KNX', 'KNL', 'KN', 'KSS', 'KONA', 'KOPN', 'KOP', 'KFY', 'KOS', 'LXK', 'LGIH', 'LHCG', 'LBY', 'BATRA', 'BATRK', 'LBRDA', 'LBRDK', 'QVCA', 'LMCA', 'LMCK', 'LPT', 'LSXMA', 'LSXMK', 'TAX', 'LTRPA', 'LVNTA', 'LOCK', 'LPNT', 'LCUT', 'LFVN', 'LWAY', 'LGND', 'LLY', 'LLNW', 'LMNR', 'LECO', 'LNC', 'LIND', 'LNN', 'LLTC', 'LNKD', 'LBIO', 'LIOX', 'LGF', 'LDRH', 'LEA', 'LTXB', 'LM', 'LEG', 'LDOS', 'LMAT', 'LC', 'TREE', 'LEN', 'LEN.B', 'LII', 'LUK', 'LVLT', 'LXRX', 'LXP', 'LOXO', 'LPLA', 'LXU', 'LYTS', 'LTC', 'LUB', 'LULU', 'LL', 'LITE', 'LMNX', 'LMOS', 'LDL', 'LYB', 'MTB', 'MHO', 'MCBC', 'MAC', 'CLI', 'MTSI', 'MIC', 'MGNX', 'M', 'SHOO', 'MSG', 'MGLN', 'MHLD', 'MSFG', 'MJCO', 'MBUU', 'MNK', 'MANH', 'MTW', 'LPCN', 'LQDT', 'LAD', 'LFUS', 'LYV', 'LOB', 'LPSN', 'LKQ', 'LMT', 'L', 'LOGM', 'LORL', 'LPX', 'LOW', 'VAC', 'MMC', 'MRTN', 'MLM', 'MRVL', 'MAS', 'MASI', 'DOOR', 'MTZ', 'MA', 'MTDR', 'MTCH', 'MTRN', 'MTRX', 'MATX', 'MAT', 'MATW', 'MFRM', 'MXIM', 'MMS', 'MXL', 'MXWL', 'MBFI', 'MBI', 'MBTF', 'MCFT', 'MKC', 'MDR', 'MCD', 'MGRC', 'MCK', 'MDCA', 'MDC', 'MDU', 'MFS', 'MN', 'MNKD', 'MAN', 'MANT', 'MRO', 'MPC', 'MCHX', 'MMI', 'MCS', 'MPX', 'HZO', 'MKL', 'MKTX', 'MKTO', 'MRLN', 'MAR', 'MBWM', 'MBVT', 'MRK', 'MCY', 'MRCY', 'MDP', 'EBSB', 'VIVO', 'MMSI', 'MTH', 'MTOR', 'MACK', 'MLAB', 'CASH', 'MPG', 'MEI', 'MET', 'MTD', 'MFA', 'MGEE', 'MTG', 'MGM', 'MGPI', 'KORS', 'MIK', 'MCHP', 'MU', 'MSCC', 'MSFT', 'MSTR', 'MAA', 'MJN', 'MDGN', 'MEG', 'MPW', 'MDCO', 'MNOV', 'MDSO', 'MED', 'MDVN', 'MDLY', 'MD', 'MDT', 'MEET', 'MRD', 'MENT', 'MOD', 'MC', 'MHK', 'MOH', 'TAP', 'MNTA', 'MCRI', 'MDLZ', 'MGI', 'MNR', 'MORE', 'MPWR', 'TYPE', 'MNRO', 'MON', 'MNST', 'MWW', 'MCO', 'MOG.A', 'MS', 'MORN', 'MOS', 'MPAA', 'MSI', 'MOV', 'MRC', 'MSA', 'MSM', 'MSCI', 'MSGN', 'MTSC', 'MLI', 'MWA', 'MBRG', 'MIDD', 'MSEX', 'MSBI', 'MOFG', 'MCRN', 'MLR', 'MDXG', 'MB', 'MTX', 'NERV', 'MRTX', 'MG', 'MITK', 'MKSI', 'MINI', 'MOBL', 'MODN', 'NDAQ', 'NTRA', 'NATH', 'NBHC', 'NKSH', 'FIZZ', 'NCMI', 'NCOM', 'NFG', 'NGHC', 'NHI', 'NHC', 'NATI', 'NATL', 'NOV', 'NPK', 'NRCIA', 'NNN', 'NSA', 'NWLI', 'NSM', 'NGS', 'NGVC', 'NHTC', 'NATR', 'BABY', 'NLS', 'NAVI', 'NCI', 'NAVG', 'LABL', 'MPSX', 'MFLX', 'MUR', 'MUSA', 'MFSF', 'MYE', 'MYL', 'MYOK', 'MYRG', 'MYGN', 'NBR', 'NC', 'NANO', 'NSTG', 'NK', 'NBIX', 'NSR', 'NVRO', 'NWHM', 'NJR', 'NEWM', 'NEWR', 'NRZ', 'SNR', 'NYCB', 'NYMT', 'NYRT', 'NYT', 'NWL', 'NFX', 'NLNK', 'NEU', 'NEM', 'NR', 'NWSA', 'NWS', 'NEWS', 'NXRT', 'NXST', 'NEE', 'EGOV', 'NCBS', 'NLSN', 'NIHD', 'NKE', 'NMBL', 'NI', 'NNA', 'NAV', 'NBTB', 'NCS', 'NCIT', 'NCR', 'NP', 'NEFF', 'NKTR', 'NNI', 'NEOG', 'NEO', 'NPTN', 'NEOS', 'NTAP', 'NFLX', 'NTGR', 'NTCT', 'N', 'NSAM', 'NRE', 'NRF', 'NWBI', 'NWN', 'NWE', 'NCLH', 'NOVT', 'NVAX', 'NVCR', 'DNOW', 'NRG', 'NYLD.A', 'NYLD', 'NUS', 'NUAN', 'NUE', 'NMRX', 'NUTR', 'NTRI', 'NUVA', 'NVEE', 'NVEC', 'NVDA', 'NVR', 'NXTM', 'ORLY', 'OAS', 'OXY', 'NL', 'NMIH', 'NNBR', 'HLTH', 'NE', 'NBL', 'NDLS', 'NAT', 'NDSN', 'JWN', 'NSC', 'NTK', 'NOG', 'NTRS', 'NFBK', 'NRIM', 'NOC', 'OHI', 'OME', 'OMER', 'OMCL', 'OMC', 'OMN', 'ASGN', 'ONDK', 'ON', 'OMED', 'OGS', 'OLP', 'OB', 'OMF', 'OKE', 'OPHT', 'OPK', 'OPY', 'OPB', 'ORCL', 'OSUR', 'ORBC', 'OA', 'ORC', 'TIS', 'ONVO', 'ORN', 'ORIT', 'ORA', 'ORRF', 'OFIX', 'OII', 'OCFC', 'OCLR', 'OCUL', 'OCN', 'ODP', 'OFG', 'OGE', 'ODC', 'OIS', 'ODFL', 'OLBK', 'ONB', 'ORI', 'OSBC', 'OLN', 'OLLI', 'ZEUS', 'OMAM', 'OFLX', 'PCAR', 'PACB', 'PCBK', 'PEIX', 'PMBC', 'PPBI', 'PCRX', 'PKG', 'PACW', 'PANW', 'P', 'PNRA', 'PHX', 'PZZA', 'PARR', 'PGRE', 'PRTK', 'PRXL', 'PCYG', 'PKE', 'PRK', 'PKOH', 'PSTB', 'PKD', 'PH', 'PKY', 'PE', 'PRTY', 'OSK', 'OSIS', 'OSIR', 'OTIC', 'OTTR', 'OUTR', 'OUT', 'OVAS', 'OSG', 'OSTK', 'OMI', 'OC', 'OI', 'ORM', 'OXFD', 'OXM', 'PTSI', 'PCCC', 'PFSI', 'PMT', 'PAG', 'PNR', 'PEN', 'PEBO', 'PFIS', 'PBCT', 'PUB', 'PEP', 'PRFT', 'PFGC', 'PSG', 'PKI', 'PRGO', 'PETS', 'PFNX', 'PFE', 'PFSW', 'PCG', 'PGTI', 'PIP', 'PMC', 'PHH', 'PHIIK', 'PAHC', 'PM', 'PSX', 'PLAB', 'DOC', 'PATK', 'PN', 'PEGI', 'PDCO', 'PTEN', 'PAYX', 'PAYC', 'PCTY', 'PYPL', 'PBF', 'PDCE', 'PDFS', 'PDLI', 'PDVW', 'PGC', 'PEB', 'PEGA', 'PENN', 'JCP', 'PWOD', 'PEI', 'PLUG', 'PGEM', 'PNC', 'PNM', 'PII', 'PLCM', 'POL', 'POOL', 'PLKI', 'BPOP', 'POR', 'PTLA', 'POST', 'PPS', 'PBPB', 'PCH', 'POWL', 'POWI', 'PSIX', 'PPG', 'PPL', 'PRAA', 'PRAH', 'PX', 'APTS', 'PFBC', 'PLPC', 'PICO', 'PNY', 'PDM', 'PIR', 'PPC', 'PNK', 'PNFP', 'PF', 'PNW', 'PES', 'PXD', 'PJC', 'PBI', 'PJT', 'PLNT', 'PLPM', 'PLT', 'PAH', 'PLXS', 'PRLB', 'PRSC', 'PVBC', 'PFS', 'PROV', 'PRU', 'PSB', 'PTC', 'PTCT', 'PSA', 'PEG', 'PHM', 'PBYI', 'PSTG', 'PVH', 'PZN', 'QTWO', 'QADA', 'QCRH', 'QEP', 'QGEN', 'QLIK', 'QLGC', 'QRVO', 'QTS', 'QUAD', 'KWR', 'QCOM', 'QSII', 'PFBI', 'PINC', 'PGND', 'PBH', 'TROW', 'PSMT', 'PRI', 'PRMW', 'PRIM', 'PFG', 'PVTB', 'PRA', 'PG', 'PGNX', 'PRGS', 'PGR', 'PLD', 'PFPT', 'PRO', 'PB', 'PTI', 'PRTA', 'RPT', 'RRC', 'RPD', 'RPTP', 'RAVN', 'RJF', 'RYAM', 'RYN', 'RTN', 'ROLL', 'RMAX', 'RDI', 'RELY', 'RNWK', 'RLGY', 'RP', 'O', 'RETA', 'RHT', 'RLH', 'RRGB', 'RRR', 'RWT', 'RBC', 'RGC', 'REG', 'QLYS', 'NX', 'PWR', 'DGX', 'STR', 'QDEL', 'QNST', 'Q', 'QHC', 'QUOT', 'RAX', 'RDN', 'RLGT', 'ROIAK', 'RSYS', 'RDUS', 'RDNT', 'RAS', 'RL', 'RMBS', 'ROIC', 'RPAI', 'SALE', 'RTRX', 'RVNC', 'REV', 'REX', 'REXR', 'RXN', 'RAI', 'RICE', 'RIGL', 'NAME', 'RNET', 'REI', 'RNG', 'RAD', 'RLI', 'RLJ', 'RMR', 'RRTS', 'RHI', 'ROK', 'COL', 'RMTI', 'RSTI', 'ROG', 'ROL', 'REGN', 'RGNX', 'RM', 'RF', 'RGS', 'RGLS', 'RGA', 'REIS', 'RS', 'RLYP', 'RNR', 'RNST', 'REGI', 'RCII', 'RGEN', 'RBCAA', 'FRBK', 'RSG', 'RMD', 'REXI', 'RSO', 'RECN', 'RH', 'RHP', 'STBA', 'SPGI', 'SBRA', 'SABR', 'SFE', 'SAFT', 'SGA', 'SAGE', 'SGNT', 'SAIA', 'SALM', 'CRM', 'SBH', 'SN', 'SAFM', 'SASR', 'JBSS', 'SGMO', 'SANM', 'SC', 'SPNS', 'SRPT', 'BFS', 'SBAC', 'ROP', 'RST', 'ROST', 'RSE', 'ROVI', 'RDC', 'RCL', 'RGLD', 'RES', 'RPM', 'RPXC', 'RSPP', 'RTIX', 'RUBI', 'RT', 'RTEC', 'RUSHA', 'RUTH', 'R', 'RYI', 'SHOS', 'SGEN', 'SEAS', 'EYES', 'SCWX', 'SEIC', 'SCSS', 'SIR', 'SEM', 'SIGI', 'SEMG', 'SRE', 'SMTC', 'SENEA', 'SNH', 'SENS', 'SXT', 'SQBG', 'MCRB', 'SRG', 'SCI', 'SERV', 'NOW', 'SREV', 'SFBS', 'SHAK', 'SHEN', 'SHW', 'SCG', 'SCSC', 'HSIC', 'SLB', 'SCHN', 'SCHL', 'SHLM', 'SCHW', 'SWM', 'SCLN', 'SAIC', 'SGMS', 'SQI', 'SALT', 'STNG', 'SMG', 'SSP', 'SNI', 'SEB', 'SBCF', 'CKH', 'SDRL', 'SEE', 'SHLD', 'SBGI', 'SIRI', 'SITE', 'SIX', 'SJW', 'SKX', 'SKYW', 'SWKS', 'SLG', 'SLM', 'SM', 'SFS', 'SWHC', 'AOS', 'SJM', 'SNA', 'LNCE', 'SCTY', 'SAH', 'SONC', 'SON', 'SONS', 'SRNE', 'BID', 'SFL', 'SCVL', 'SHBI', 'SHOR', 'SFLY', 'SSTK', 'SIFI', 'BSRR', 'SIGM', 'SBNY', 'SIG', 'SLGN', 'SILC', 'SGI', 'SLAB', 'SBY', 'SSNI', 'SAMG', 'SFNC', 'SPG', 'SSD', 'SPR', 'SAVE', 'SRC', 'SPLK', 'SPOK', 'SPWH', 'S', 'SFM', 'SPSC', 'SPXC', 'FLOW', 'SQ', 'SSNC', 'JOE', 'STJ', 'STAA', 'STAG', 'SSI', 'STMP', 'SMP', 'SXI', 'SWK', 'SPLS', 'SBUX', 'HOT', 'STWD', 'STRZA', 'SJI', 'SSB', 'SO', 'SCCO', 'SFST', 'SMBC', 'SONA', 'SBSI', 'LUV', 'OKSB', 'SWX', 'SWN', 'SSS', 'SP', 'SPKE', 'ONCE', 'SPAR', 'SPTN', 'SPA', 'SE', 'SPNC', 'SPB', 'SPPI', 'TRK', 'SR', 'STRA', 'SYK', 'RGR', 'SCMP', 'SCNB', 'SMMF', 'INN', 'SUM', 'SNBC', 'SUI', 'SNHY', 'SXC', 'SPWR', 'RUN', 'SHO', 'STI', 'SMCI', 'SPN', 'SUP', 'SGC', 'SUPN', 'SVU', 'STS', 'STFC', 'STBZ', 'SNC', 'STT', 'STLD', 'SCS', 'SMRT', 'STML', 'SCL', 'SRCL', 'STL', 'STC', 'SF', 'SWC', 'SYBT', 'SGBK', 'SRI', 'STOR', 'STRP', 'SSYS', 'STRT', 'STRS', 'TLRD', 'TTWO', 'TAL', 'TLN', 'TLMR', 'TNDM', 'SKT', 'TNGO', 'TRGP', 'TGT', 'TASR', 'TCO', 'TMHC', 'TCB', 'AMTD', 'TMH', 'TISI', 'TECD', 'TTGT', 'TE', 'TK', 'TNK', 'TGNA', 'TRC', 'TDOC', 'TDY', 'SGRY', 'SCAI', 'SRDX', 'SIVB', 'SWFT', 'SYKE', 'SYMC', 'SSRG', 'SYNA', 'SNCR', 'SYF', 'SNDX', 'SGYP', 'SYRG', 'SNX', 'SNPS', 'SNV', 'SYNT', 'SYN', 'SYUT', 'SYY', 'SYX', 'TTOO', 'DATA', 'TAHO', 'TTI', 'TTPH', 'TCBI', 'TXN', 'TXRH', 'TGH', 'TXT', 'TFSL', 'TGTX', 'CC', 'TCS', 'KHC', 'PCLN', 'WEN', 'TXMD', 'TBPH', 'TMO', 'THR', 'TPRE', 'TRI', 'THO', 'TDW', 'TIER', 'TFX', 'TNAV', 'TDS', 'TTEC', 'TLGT', 'TPX', 'THC', 'TNC', 'TEN', 'TDC', 'TER', 'TEX', 'GLBL', 'TERP', 'TVIA', 'TRNO', 'TBNK', 'TSRO', 'TESO', 'TSLA', 'TSO', 'TSRA', 'TTEK', 'TDG', 'TRXC', 'RIG', 'TRU', 'TRV', 'TVPT', 'TRR', 'TREC', 'TG', 'THS', 'TRVN', 'TREX', 'TPH', 'TRCO', 'TCBK', 'TRS', 'TRMB', 'TNET', 'TRN', 'TPHS', 'TSE', 'TRIP', 'GTS', 'TSC', 'TBK', 'TIF', 'TTS', 'TLYS', 'TIME', 'TWX', 'TKR', 'TMST', 'TIPT', 'TWI', 'TITN', 'TTNP', 'TIVO', 'TJX', 'TMUS', 'TBRA', 'TKAI', 'TOL', 'TMP', 'TR', 'BLD', 'TMK', 'TTC', 'TSS', 'TOWR', 'TOWN', 'TSQ', 'TSCO', 'SLCA', 'UBNT', 'UCP', 'UDR', 'UFPT', 'UGI', 'ULTA', 'ULTI', 'UCTT', 'RARE', 'UTEK', 'UMBF', 'UMH', 'UMPQ', 'UA', 'UA.C', 'UFI', 'UNF', 'UBSH', 'UNB', 'UNP', 'TGI', 'TRNC', 'TROX', 'TROV', 'TBI', 'TRUE', 'TRUP', 'TRST', 'TRMK', 'TTMI', 'TUBE', 'TUES', 'TUMI', 'TUP', 'TPB', 'TPC', 'TWTR', 'TWO', 'TYC', 'TYL', 'TSN', 'USCR', 'USG', 'USPH', 'UHS', 'UVE', 'ULH', 'UVSP', 'UNM', 'UE', 'URBN', 'UBA', 'USB', 'ECOL', 'USFD', 'USAT', 'USAK', 'USNA', 'USMD', 'UTMD', 'VFC', 'MTN', 'VLO', 'VHI', 'VR', 'VLY', 'VMI', 'VAL', 'UFAB', 'UIS', 'UNT', 'UBSI', 'UCFC', 'UCBI', 'UAL', 'UBNK', 'UFCS', 'UIHC', 'UNFI', 'UNTD', 'UPS', 'URI', 'USM', 'USLM', 'X', 'UTX', 'UTHR', 'UNH', 'UTL', 'UNVR', 'UAM', 'UVV', 'OLED', 'UEIC', 'UFPI', 'UHT', 'VRTX', 'VIA', 'VIAB', 'VVI', 'VSAT', 'VIAV', 'VICR', 'VRAY', 'VLGEA', 'VNCE', 'VA', 'VHC', 'VIRT', 'VRTS', 'VRTU', 'V', 'VSH', 'VPG', 'VSTO', 'VC', 'VALU', 'VNDA', 'VNTV', 'VAR', 'VRNS', 'VDSI', 'VASC', 'WOOF', 'VGR', 'VVC', 'VEC', 'VECO', 'VEEV', 'VTR', 'VRA', 'VCYT', 'VER', 'PAY', 'VRNT', 'VRSN', 'VRSK', 'VBTX', 'VRTV', 'VZ', 'VSAR', 'WM', 'WAT', 'WSBF', 'WSO', 'WTS', 'WVE', 'W', 'WCIC', 'WDFC', 'WFT', 'WEB', 'WBMD', 'WBS', 'WEC', 'WTW', 'WRI', 'WMK', 'WCG', 'WFC', 'HCN', 'WERN', 'WSBC', 'WAIR', 'VTAE', 'VTL', 'VSI', 'VSLR', 'VMW', 'VCRA', 'VG', 'VNO', 'VOYA', 'VYGR', 'VSEC', 'VTVT', 'VMC', 'VWR', 'WPC', 'WTI', 'WNC', 'WBC', 'WAB', 'WDR', 'WAGE', 'WMT', 'WBA', 'WD', 'WAC', 'WAFD', 'WRE', 'WASH', 'WFBI', 'WFM', 'JW.A', 'WG', 'WLH', 'CWEI', 'WMB', 'WSM', 'WLFC', 'WIBC', 'WIN', 'WING', 'WINA', 'WGO', 'WINS', 'WTFC', 'WETF', 'WMIH', 'WWW', 'WWD', 'WCC', 'WTBA', 'WSTC', 'WMAR', 'WST', 'WABC', 'WR', 'WAL', 'WMC', 'WDC', 'WNR', 'WU', 'WFD', 'WLK', 'WLB', 'WRK', 'WHG', 'WEX', 'WEYS', 'WY', 'WGL', 'WHR', 'WTM', 'WSR', 'WWAV', 'WLL', 'YORW', 'YCB', 'YRCW', 'YUM', 'ZFGN', 'ZAGG', 'ZAYO', 'ZBRA', 'ZLTQ', 'ZEN', 'ZG', 'Z', 'ZBH', 'ZION', 'ZIOP', 'ZIXI', 'ZOES', 'ZTS', 'ZGNX', 'ZUMZ', 'ZNGA', 'WDAY', 'WKHS', 'WK', 'WRLD', 'INT', 'WWE', 'WOR', 'WPG', 'WPX', 'WMGI', 'WSFS', 'WYN', 'WYNN', 'XTLY', 'XBIT', 'XEL', 'XCRA', 'XNCR', 'XHR', 'XNPT', 'XRX', 'XLNX', 'XL', 'XOXO', 'XPO', 'MESG', 'XYL', 'YDKN', 'YHOO', 'YELP'] ofInterest = [] try: for eachStock in Russell3000: ticker = Share(eachStock) name = ticker.get_name() pbr = ticker.get_price_book() PEG5 = ticker.get_price_earnings_growth_ratio() PE12 = ticker.get_price_earnings_ratio() #print eachStock,'P/B: ',type(pbr) if pbr == None: pass elif float(pbr) < 2: if 0 < float(PEG5) < 2: if PE12 == None: PE12 = '' elif float(PE12) < 15: ofInterest.append(eachStock) print 'Name: ',name print 'Ticker: ',eachStock
print yearhigh if myargs.yearlow is True: yearlow = stock.get_year_low() print yearlow if myargs.ebitda is True: ebitda = stock.get_ebitda() print ebitda if myargs.ps is True: ps = stock.get_price_sales() print ps if myargs.peg is True: peg = stock.get_price_earnings_growth_ratio() print peg if myargs.percentchange is True: change = stock.get_change() getopen = stock.get_open() percentchange = yahoofinancecalc.getPercentChange(stock, change, getopen) print str(percentchange) + "%" if myargs.percentoffhigh is True: realtimequote = realtime.scraper(myargs.ticker) poh = yahoofinancecalc.offHigh(stock, realtimequote) print poh if myargs.percentofflow is True: realtimequote = realtime.scraper(myargs.ticker)
def checklist(symbol, ibd50_list, ibd_session): """ Looks up information on a given stock market symbol. The returned dictionary contains all information from Dr. Wish's Stock Checklist for HONR348M. """ stock = {} # Load price data from yahoo. share = Share(symbol) ks = yahoo_ks(symbol) # Basics basics = stock["basics"] = {} basics["date"] = datetime.now().strftime("%m/%d/%Y %I:%M:%S%z") basics["symbol"] = symbol basics["equity_name"] = share.get_name() basics["price"] = float(share.get_price()) basics["52w_low"] = float(share.get_year_low()) basics["52w_high"] = float(share.get_year_high()) basics["percent_from_52w_low"] = share.get_percent_change_from_year_low() basics["percent_from_52w_high"] = share.get_percent_change_from_year_high() # IBD (Stocks only) ibd = stock["ibd"] = ibd_stock_checkup(symbol, ibd_session) # ibd["industry"] ibd["industry_rank"] = float(ibd["industry_rank"]) # ibd["industry_top5"] # ibd["3y_eps_growth"] # ibd["3y_sales_growth"] # ibd["eps_change"] ibd["eps_rating"] = float(ibd["eps_rating"]) ibd["rs_rating"] = float(ibd["rs_rating"]) # ibd["acc_distr_rating"] ibd["ibd_rating"] = float(ibd["ibd_rating"]) ibd["in_ibd50"] = symbol in ibd50_list # ibd["fundamental_greens"] # ibd["technical_greens"] ibd["next_earning"] = datetime.strptime(ibd["next_earning"], '%m/%d/%Y') # Yahoo Finance (Stocks only) yahoo = stock["yahoo"] = {} yahoo["pe"] = float(share.get_price_earnings_ratio()) yahoo["peg"] = float(share.get_price_earnings_growth_ratio()) yahoo["ps"] = float(share.get_price_sales()) yahoo["market_cap"] = share.get_market_cap() yahoo["float"] = ks["Float"] yahoo["annual_roe"] = ks["Return on Equity"] yahoo["percent_inst"] = ks["% Held by Institutions"] yahoo["percent_float_short"] = ks["Short % of Float"] yahoo["short_ratio"] = float(share.get_short_ratio()) # Evidence of an uptrend/downtrend uptrend = stock["uptrend"] = {} downtrend = stock["downtrend"] = {} pdstockdata = data.DataReader(symbol, 'yahoo', '1900-01-01') sd = StockDataFrame.retype(pdstockdata) sd.BOLL_PERIOD = 15 close1 = sd['close'][-1] close2 = sd['close'][-2] low1 = sd['low'][-1] low2 = sd['low'][-2] high1 = sd['high'][-1] high2 = sd['high'][-2] avg_30d = sd['close_30_sma'][-1] avg_4w = sd['close_20_sma'][-1] avg_10w = sd['close_50_sma'][-1] avg_30w = sd['close_150_sma'][-1] high_52w = sd['high'].tail(250).max() lbb1 = sd['boll_lb'][-1] lbb2 = sd['boll_lb'][-2] ubb1 = sd['boll_ub'][-1] ubb2 = sd['boll_ub'][-2] # Find all GLTs (ATH not broken for at least another 90 days) last_ath = 0.0 ath = Series() for day, day_high in sd['high'].iteritems(): last_ath = max(last_ath, day_high) ath.set_value(day, last_ath) ath_days = sd[sd['high'] == ath]['high'] glt = Series() for i, (day, high) in enumerate(ath_days.iteritems()): next_day = ath_days.keys()[i + 1] if i < len(ath_days) - 1 else Timestamp( str(date.today())) if next_day - day >= Timedelta('90 days'): glt.set_value(day, high) uptrend["c>30d_avg"] = close1 > avg_30d uptrend["c>10w_avg"] = close1 > avg_10w uptrend["c>30w_avg"] = close1 > avg_30w uptrend["4w>10w>30w"] = avg_4w > avg_10w > avg_30w # uptrend["w_rwb"] = uptrend["last_glt_date"] = glt.keys()[-1].to_datetime().date( ) if len(glt) > 0 else None uptrend["last_glt_high"] = glt[-1] if len(glt) > 0 else None uptrend["above_last_glt"] = len(glt) > 0 and close1 > glt[-1] uptrend["macd_hist_rising"] = sd['macdh'][-1] > sd['macdh_4_sma'][-1] uptrend["stoch_fast>slow"] = sd['rsv_10_4_sma'][-1] > sd[ 'rsv_10_4_sma_4_sma'][-1] # uptrend["bb_up_expansion_l2"] # uptrend["rs>30d_avg"] = (Need Investors.com data) # uptrend["rs_rising"] = (Need Investors.com data) uptrend["52w_high_l2"] = high_52w == high1 or high_52w == high2 uptrend["ath_l2"] = ath[-1] == high1 or ath[-2] == high2 uptrend["1y_doubled"] = close1 >= 2 * sd['close'][-255:-245].mean() # uptrend["bounce_30d_l2"] = # uptrend["bounce_10w_l2"] = # uptrend["bounce_30w_l2"] = uptrend["stoch<50"] = sd['rsv_10_4_sma'][-1] < 50 uptrend["<bb_lower_l2"] = low1 < lbb1 or low2 < lbb2 uptrend[ "above_avg_volume"] = sd['volume'][-1] > 1.5 * sd['volume_50_sma'][-1] downtrend["c<30d_avg"] = close1 < avg_30d downtrend["c<10w_avg"] = close1 < avg_10w downtrend["c<30w_avg"] = close1 < avg_30w downtrend["4w<10w<30w"] = avg_4w < avg_10w < avg_30w # downtrend["w_bwr"] = downtrend["macd_hist_falling"] = sd['macdh'][-1] < sd['macdh_4_sma'][-1] downtrend["stoch_fast<slow"] = sd['rsv_10_4_sma'][-1] < sd[ 'rsv_10_4_sma_4_sma'][-1] # downtrend["bb_down_expansion_l2"] # downtrend["bounce_30d_l2"] = # downtrend["bounce_10w_l2"] = # downtrend["bounce_30w_l2"] = downtrend["stoch>50"] = sd['rsv_10_4_sma'][-1] > 50 downtrend[">bb_upper_l2"] = high1 > ubb1 or high2 > ubb2 return stock
print tesla.get_price() print tesla.get_market_cap() print "get_book_value:", tesla.get_book_value() print "get_ebitda:", tesla.get_ebitda() print "get_dividend_share:", tesla.get_dividend_share() print "get_dividend_yield:", tesla.get_dividend_yield() print "get_earnings_share:", tesla.get_earnings_share() print "get_days_high:", tesla.get_days_high() print "get_days_low:", tesla.get_days_low() print "get_year_high:", tesla.get_year_high() print "get_year_low:", tesla.get_year_low() print "get_50day_moving_avg:", tesla.get_50day_moving_avg() print "get_200day_moving_avg:", tesla.get_200day_moving_avg() print "get_price_earnings_ratio:", tesla.get_price_earnings_ratio() print "get_price_earnings_growth_ratio:", tesla.get_price_earnings_growth_ratio( ) print "get_price_sales:", tesla.get_price_sales() print "get_price_book:", tesla.get_price_book() print "get_short_ratio:", tesla.get_short_ratio() print "get_trade_datetime:", tesla.get_trade_datetime() # "a:", print tesla.get_historical(start_date, end_date) # "a:", print tesla.get_info() print "get_name:", tesla.get_name() print "refresh:", tesla.refresh() print "get_percent_change_from_year_high:", tesla.get_percent_change_from_year_high( ) print "get_percent_change_from_year_low:", tesla.get_percent_change_from_year_low( ) print "get_change_from_year_low:", tesla.get_change_from_year_low() print "get_change_from_year_high:", tesla.get_change_from_year_high() print "get_percent_change_from_200_day_moving_average:", tesla.get_percent_change_from_200_day_moving_average(
def write_technical_files(stock_code, start_time, end_time): # """ Experiment on quandl """ # print('quandl data') # mydata = quandl.get("FRED/GDP") # print(mydata) # print('hello') # data = quandl.get("WIKI/FB.11", start_date="2014-01-01", end_date="2014-12-31", collapse="monthly", transform="diff") # print(data) stock = Share(stock_code) print('stock.get_info()') print(stock.get_info()) print('get_price()') print(stock.get_price()) print('get_change()') print(stock.get_change()) print('get_stock_exchange()') print(stock.get_stock_exchange()) print('get_market_cap()') print(stock.get_market_cap()) print('get_book_value()') print(stock.get_book_value()) print('get_ebitda()') print(stock.get_ebitda()) print('get_dividend_share()') print(stock.get_dividend_share()) print('get_dividend_yield()') print(stock.get_dividend_yield()) print('get_earnings_share()') print(stock.get_earnings_share()) print('get_50day_moving_avg()') print(stock.get_50day_moving_avg()) print('get_200day_moving_avg()') print(stock.get_200day_moving_avg()) print('get_price_earnings_ratio()') print(stock.get_price_earnings_ratio()) print('get_price_earnings_growth_ratio()') print(stock.get_price_earnings_growth_ratio()) print('get_price_sales()') print(stock.get_price_sales()) print('get_price_book()') print(stock.get_price_book()) print('get_short_ratio()') print(stock.get_short_ratio()) print('historical_data') print(stock.get_historical(start_time, end_time)) historical_data = stock.get_historical(start_time, end_time) info_text = "Symbol\t" + "Stock Exchange\t" + "Price\t" + "Market Cap\t" + "Book Value\t" + "EBITDA\t" + "50d Moving Avg\t" + "100d Moving Avg\n" info_text += str(stock.get_info()['symbol']) + "\t" + str(stock.get_stock_exchange()) + "\t" + str(stock.get_price()) + "\t" + str(stock.get_market_cap()) + "\t" + str(stock.get_book_value()) + "\t"; info_text += str(stock.get_ebitda()) + "\t" + str(stock.get_50day_moving_avg()) + "\t" + str(stock.get_200day_moving_avg()) + "\n"; info_directory = '/data/info.tsv' write_to_file(info_directory, info_text) high_low_text = "date\t" + "High\t" + "Low\n" open_close_text = "date\t" + "Open\t" + "Close\n" volume_text = "date\t" + "Volume\n" for index, value in enumerate(historical_data): date = str(historical_data[len(historical_data) - 1 - index]['Date']) date = date.replace('-','') stock_high = str(historical_data[len(historical_data) - 1 - index]['High']) stock_low = str(historical_data[len(historical_data) - 1 - index]['Low']) stock_open = str(historical_data[len(historical_data) - 1 - index]['Open']) stock_close = str(historical_data[len(historical_data) - 1 - index]['Close']) stock_volume = str(int(historical_data[len(historical_data) - 1 - index]['Volume']) / 1000) high_low_text += date + "\t" + stock_high + "\t" + stock_low + "\n" open_close_text += date + "\t" + stock_open + "\t" + stock_close + "\n" volume_text += date + "\t" + stock_volume + "\n" high_low_directory = '/data/highlow.tsv' open_close_directory = '/data/openclose.tsv' volume_directory = '/data/volume.tsv' write_to_file(high_low_directory, high_low_text) write_to_file(open_close_directory, open_close_text) write_to_file(volume_directory, volume_text) ratio_text = "name\t" + "value\n" if stock.get_change() != None: name = "Change" value = str(stock.get_change()) ratio_text += name + "\t" + value + "\n" if stock.get_dividend_share() != None: name = "Dividend Share" value = str(stock.get_dividend_share()) ratio_text += name + "\t" + value + "\n" if stock.get_dividend_yield() != None: name = "Divident Yield" value = str(stock.get_dividend_yield()) ratio_text += name + "\t" + value + "\n" if stock.get_earnings_share() != None: name = "Earning Share" value = str(stock.get_earnings_share()) ratio_text += name + "\t" + value + "\n" if stock.get_price_earnings_ratio() != None: name = "Price Earning" value = str(stock.get_price_earnings_ratio()) ratio_text += name + "\t" + value + "\n" if stock.get_price_earnings_growth_ratio() != None: name = "Price Earning Growth" value = str(stock.get_price_earnings_growth_ratio()) ratio_text += name + "\t" + value + "\n" if stock.get_price_sales() != None: name = "Price Sales" value = str(stock.get_price_sales()) ratio_text += name + "\t" + value + "\n" if stock.get_price_book() != None: name = "Price Book" value = str(stock.get_price_book()) ratio_text += name + "\t" + value + "\n" if stock.get_short_ratio() != None: name = "Short" value = str(stock.get_short_ratio()) ratio_text += name + "\t" + value + "\n" ratio_directory = '/data/ratio.tsv' write_to_file(ratio_directory, ratio_text)
def result_page(request): rstlist = list() grow_sortlst = list() value_sortlst = list() quality_sortlst = list() grow_stcklist = [ 'PNW','RL','PPG','ACN', 'ATVI', 'AYI', 'AMD', 'LNT', 'ALXN', 'GOOGL'] value_stcklist = ['AMG', 'AFL', 'APD', 'AKAM','PCG','PM','PSX', 'AAP', 'AES', 'AET'] quality_stcklist = ['MMM', 'ABT', 'ABBV','PEP','PKI','PRGO','PFE', 'ALB', 'ECL', 'AGN'] stckdict = dict() if request.method == 'POST': allotment = int(str(request.POST['allotment'])) ori_allotment = allotment iv_type = 0 for key in request.POST.keys(): print "iv_type="+str(iv_type) print str(key) if key in ['ethical','growth','index','quality','value']: iv_type = iv_type + 1 print("current selected types count = " + str(iv_type)) if iv_type == 2: allotment = allotment/float(2) if 'ethical' in request.POST.keys(): AAPL = Share('AAPL') aapl_f = float(str(AAPL.get_percent_change_from_year_low())[0:-1]) + \ float(str(AAPL.get_percent_change_from_50_day_moving_average())[0:-1]) - \ float(str(AAPL.get_percent_change_from_year_high())[0:-1]) ADBE = Share('ADBE') adbe_f = float(str(ADBE.get_percent_change_from_year_low())[0:-1]) + \ float(str(ADBE.get_percent_change_from_50_day_moving_average())[0:-1]) - \ float(str(ADBE.get_percent_change_from_year_high())[0:-1]) NSRGY = Share('NSRGY') nsrgy_f = float(str(NSRGY.get_percent_change_from_year_low())[0:-1]) + \ float(str(NSRGY.get_percent_change_from_50_day_moving_average())[0:-1]) - \ float(str(NSRGY.get_percent_change_from_year_high())[0:-1]) stckdict['AAPL'] = AAPL stckdict['ADBE'] = ADBE stckdict['NSRGY'] = NSRGY total_f = (aapl_f + adbe_f + nsrgy_f)*iv_type aapl_pct = aapl_f/float(total_f) adbe_pct = adbe_f/float(total_f) nsrgy_pct = nsrgy_f/float(total_f) aaplD = {"sticker":"AAPL","name":AAPL.get_name(),"aloc_pct":str(aapl_pct),"aloc_amt":str(allotment*aapl_pct),"price":str(AAPL.get_price()),"exchange":str(AAPL.get_stock_exchange())} adbeD = {"sticker":"ADBE","name":ADBE.get_name(),"aloc_pct":str(adbe_pct),"aloc_amt":str(allotment*adbe_pct),"price":str(ADBE.get_price()),"exchange":str(ADBE.get_stock_exchange())} nsrgyD = {"sticker":"NSRGY","name":NSRGY.get_name(),"aloc_pct":str(nsrgy_pct),"aloc_amt":str(allotment*nsrgy_pct),"price":str(NSRGY.get_price()),"exchange":str(NSRGY.get_stock_exchange())} rstlist.append(aaplD) rstlist.append(adbeD) rstlist.append(nsrgyD) if 'growth' in request.POST.keys(): for stock in grow_stcklist: while True: try: detail = Share(stock) except: time.sleep(0.1) continue break stckdict[stock]=detail heapq.heappush(grow_sortlst, (float(str(detail.get_percent_change_from_year_low())[0:-1]) + float( str(detail.get_percent_change_from_200_day_moving_average())[0:-1]) + float(str(detail.get_percent_change_from_50_day_moving_average())[0:-1]) + float(str(detail.get_percent_change_from_year_high())[0:-1]), stock, detail)) if len(grow_sortlst) > 3: heapq.heappop(grow_sortlst) total_f = 0 for item in grow_sortlst: total_f = total_f + item[0] for item in grow_sortlst: item_pct = item[0]/float(total_f*iv_type) item_amt = allotment*item_pct rstlist.append({"sticker":item[1],"name":item[2].get_name(),"aloc_pct":str(item_pct),"aloc_amt":str(item_amt),"price":str(item[2].get_price()),"exchange":str(item[2].get_stock_exchange())}) if 'index' in request.POST.keys(): VTI = Share('VTI') vti_f = float(str(VTI.get_percent_change_from_year_low())[0:-1]) + \ float(str(VTI.get_percent_change_from_200_day_moving_average())[0:-1]) - \ float(str(VTI.get_percent_change_from_year_high())[0:-1]) IXUS = Share('IXUS') ixus_f = float(str(IXUS.get_percent_change_from_year_low())[0:-1]) + \ float(str(IXUS.get_percent_change_from_200_day_moving_average())[0:-1]) - \ float(str(IXUS.get_percent_change_from_year_high())[0:-1]) ILTB = Share('ILTB') iltb_f = float(str(ILTB.get_percent_change_from_year_low())[0:-1]) + \ float(str(ILTB.get_percent_change_from_200_day_moving_average())[0:-1]) - \ float(str(ILTB.get_percent_change_from_year_high())[0:-1]) stckdict['VTI'] = VTI stckdict['IXUS'] = IXUS stckdict['ILTB'] = ILTB total_f = (vti_f + ixus_f + iltb_f)*iv_type vti_pct = vti_f / float(total_f) ixus_pct = ixus_f / float(total_f) iltb_pct = iltb_f / float(total_f) vtiD = {"sticker": "VTI", "name": VTI.get_name(), "aloc_pct": str(vti_pct), "aloc_amt": str(allotment * vti_pct), "price": str(VTI.get_price()), "exchange": str(VTI.get_stock_exchange())} ixusD = {"sticker": "IXUS", "name": IXUS.get_name(), "aloc_pct": str(ixus_pct), "aloc_amt": str(allotment * ixus_pct), "price": str(IXUS.get_price()), "exchange": str(IXUS.get_stock_exchange())} iltbD = {"sticker": "ILTB", "name": ILTB.get_name(), "aloc_pct": str(iltb_pct), "aloc_amt": str(allotment * iltb_pct), "price": str(ILTB.get_price()), "exchange": str(ILTB.get_stock_exchange())} rstlist.append(vtiD) rstlist.append(ixusD) rstlist.append(iltbD) if 'quality' in request.POST.keys(): for stock in quality_stcklist: while True: try: detail = Share(stock) except: time.sleep(0.1) continue break stckdict[stock] = detail heapq.heappush(quality_sortlst, ( float(detail.get_price_earnings_ratio() if detail.get_price_earnings_ratio() != None else 0) + float( detail.get_price_earnings_growth_ratio() if detail.get_price_earnings_growth_ratio() != None else 0) + float( detail.get_change_from_200_day_moving_average() if detail.get_change_from_200_day_moving_average() != None else 0) + float( detail.get_price_earnings_growth_ratio() if detail.get_price_earnings_growth_ratio() != None else 0), stock, detail)) if len(quality_sortlst) > 3: heapq.heappop(quality_sortlst) total_f = 0 for item in quality_sortlst: total_f = total_f + item[0] for item in quality_sortlst: item_pct = item[0] / float(total_f*iv_type) item_amt = allotment * item_pct rstlist.append({"sticker": item[1], "name": item[2].get_name(), "aloc_pct": str(item_pct), "aloc_amt": str(item_amt), "price": str(item[2].get_price()), "exchange": str(item[2].get_stock_exchange())}) if 'value' in request.POST.keys(): for stock in value_stcklist: while True: try: detail = Share(stock) except: time.sleep(0.1) continue break stckdict[stock] = detail heapq.heappush(value_sortlst, (float(detail.get_dividend_yield() if detail.get_dividend_yield() != None else 0) + float( detail.get_price_earnings_growth_ratio() if detail.get_price_earnings_growth_ratio() != None else 0) - float(detail.get_price_book() if detail.get_price_book() != None else 0), stock, detail)) if len(value_sortlst) > 3: heapq.heappop(value_sortlst) total_f = 0 for item in value_sortlst: total_f = total_f + item[0] print "total_f=" + str(total_f) for item in value_sortlst: item_pct = item[0] / float(total_f*iv_type) item_amt = allotment * item_pct rstlist.append({"sticker": item[1], "name": item[2].get_name(), "aloc_pct": str(item_pct), "aloc_amt": str(item_amt), "price": str(item[2].get_price()), "exchange": str(item[2].get_stock_exchange())}) days_cnt = 15 str_date = str((datetime.now() - timedelta(days=days_cnt)).date().isoformat()) end_date = str(datetime.today().date().isoformat()) day_pro = list() remaining = 0 for item in rstlist: while True: try: hist_info = stckdict[item["sticker"]].get_historical(str_date,end_date) except: continue break for i in range(0,6): if len(day_pro)<=i: day_pro.append({hist_info[i]["Date"]:float(hist_info[i]["Close"])*int(float(item["aloc_amt"])/float(hist_info[i]["Open"]))+float(item["aloc_amt"])%float(hist_info[i]["Open"])}) else: day_pro[i][hist_info[i]["Date"]] = float(day_pro[i][hist_info[i]["Date"]]) + float(hist_info[i]["Close"])*int(float(item["aloc_amt"])/float(hist_info[i]["Open"])) + float(item["aloc_amt"])%float(hist_info[i]["Open"]) rstlist.append({"sticker":"portfolio","history":day_pro}) print(json.dumps(rstlist)) return render(request, 'portfolio/result.html', {'result': json.dumps(rstlist)}) return render(request, 'portfolio/home.html')