Exemplo n.º 1
0
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.")
Exemplo n.º 2
0
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})
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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
Exemplo n.º 6
0
    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 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()
Exemplo n.º 11
0
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"
Exemplo n.º 12
0
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))
Exemplo n.º 14
0
    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")
Exemplo n.º 15
0
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">&nbsp;</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)
Exemplo n.º 16
0
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">&nbsp;</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)
Exemplo n.º 17
0
	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()
Exemplo n.º 18
0
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()
Exemplo n.º 19
0
 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
Exemplo n.º 21
0
		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
Exemplo n.º 23
0
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(
Exemplo n.º 24
0
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)
Exemplo n.º 25
0
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')