├── output ├── Health Care_2016-12-05_22.07.pdf └── Industrials_2016-12-06_15.13.pdf ├── src ├── keys.yaml ├── getTickers.py ├── constituents.py ├── findTranscriptsURLs.py ├── login.py ├── pdfgen.py ├── relevantExtracts.py └── main.py ├── README.md └── data └── constituents.csv /output/Health Care_2016-12-05_22.07.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acomets/web-scraper/HEAD/output/Health Care_2016-12-05_22.07.pdf -------------------------------------------------------------------------------- /output/Industrials_2016-12-06_15.13.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acomets/web-scraper/HEAD/output/Industrials_2016-12-06_15.13.pdf -------------------------------------------------------------------------------- /src/keys.yaml: -------------------------------------------------------------------------------- 1 | # Seeking Alpha login details 2 | 3 | username: 4 | password: -------------------------------------------------------------------------------- /src/getTickers.py: -------------------------------------------------------------------------------- 1 | """ 2 | Author: Antoine Comets 3 | Date: 12/04/2016 4 | 5 | This file contains the source code of getTicker, which returns the tickers of all the S&P 500 companies 6 | belonging to the relevant industry sector given as input. 7 | 8 | """ 9 | 10 | import pandas as pd 11 | from os.path import join 12 | 13 | def getTickers(sector): 14 | file = join("..", "data/constituents.csv") 15 | data = pd.read_csv(file) 16 | companies = data[data["Sector"] == sector] 17 | return list(companies["Symbol"]) 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # web-scraper 2 | ### Author: Antoine Comets 3 | ### Date: 12/05/2016 4 | 5 | A simple web-scraping script to find all relevant extracts from Earnings Call Transcripts of S&P 500 companies in a given sector containing specified keywords. 6 | 7 | This was done for an interview with an equity research firm. 8 | 9 | It uses git code from the following sources: 10 | 11 | • https://github.com/datasets/s-and-p-500-companies 12 | 13 | • https://github.com/trinitybest/Web_Scraping_SeekingAlpha 14 | 15 | Please note that in order to function properly you need to populate the keys.yaml file with your Seeking Alpha (free) account login details as follow: 16 | 17 | username: <your email address, used to log into Seeking Alpha> 18 | 19 | password: <your Seeking Alpha password> 20 | -------------------------------------------------------------------------------- /src/constituents.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file contains the source code to update our list of S&P 500 companies containing 3 | their name, symbol and sector. It was found on the following git repo 4 | 5 | Source: https://github.com/datasets/s-and-p-500-companies 6 | 7 | """ 8 | 9 | from bs4 import BeautifulSoup 10 | import urllib2 11 | import csv 12 | from os import mkdir 13 | from os.path import exists, join 14 | 15 | datadir = join('..', 'data') 16 | if not exists(datadir): 17 | mkdir(datadir) 18 | source_page = urllib2.urlopen('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies').read() 19 | soup = BeautifulSoup(source_page, 'lxml') 20 | table = soup.find("table", { "class" : "wikitable sortable" }) 21 | 22 | # Fail now if we haven't found the right table 23 | header = table.findAll('th') 24 | if header[0].string != "Ticker symbol" or header[1].string != "Security": 25 | raise Exception("Can't parse wikipedia's table!") 26 | 27 | # Retreive the values in the table 28 | records = [] 29 | rows = table.findAll('tr') 30 | for row in rows: 31 | fields = row.findAll('td') 32 | if fields: 33 | symbol = fields[0].string 34 | name = fields[1].string 35 | sector = fields[3].string 36 | records.append([symbol, name, sector]) 37 | 38 | header = ['Symbol', 'Name', 'Sector'] 39 | writer = csv.writer(open('../data/constituents.csv', 'w'), lineterminator='\n') 40 | writer.writerow(header) 41 | # Sorting ensure easy tracking of modifications 42 | records.sort(key=lambda s: s[1].lower()) 43 | writer.writerows(records) 44 | -------------------------------------------------------------------------------- /src/findTranscriptsURLs.py: -------------------------------------------------------------------------------- 1 | """ 2 | Author: Antoine Comets 3 | Date: 12/04/2016 4 | 5 | This file contains the source code for findTranscriptURLs which finds the URLs of transcripts 6 | from earnings calls of a company, taking as input the company ticker and the number of transcripts to look at. 7 | 8 | """ 9 | 10 | from bs4 import BeautifulSoup 11 | from urlparse import urljoin 12 | from login import loginSA 13 | from os.path import join 14 | 15 | def findTranscriptsURLs(session, ticker, n): 16 | 17 | userHeader = {"Referer": "http://seekingalpha.com/", 18 | "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"} 19 | 20 | url = urljoin('http://seekingalpha.com/symbol/', '/'.join([ticker, "earnings", "transcripts"])) 21 | r = session.get(url, headers = userHeader) 22 | 23 | soup = BeautifulSoup(r.content, 'lxml') 24 | 25 | transcripts = [] 26 | transcriptsAll = soup.find_all("a", {"sasource":"qp_analysis"}) 27 | for transcript in transcriptsAll: 28 | if "Earnings" in transcript.text and "Transcript" in transcript.text: 29 | transcripts.append(urljoin('http://seekingalpha.com/', transcript.get("href"))) 30 | #print("Tickers About are: {0}".format(', '.join(tickersAbout))) 31 | transcriptsStr = ', '.join(transcripts) 32 | 33 | return transcripts[:n] 34 | 35 | 36 | if __name__ == "__main__": 37 | session = loginSA()[1] 38 | ticker = "AMZN" 39 | findTranscriptsURLs(session, ticker, 4) 40 | 41 | -------------------------------------------------------------------------------- /src/login.py: -------------------------------------------------------------------------------- 1 | """ 2 | Author:TH 3 | Date:16/05/2016 4 | 5 | This file contains the source code for loginSA, which allows our python script to login to Seeking Alpha. 6 | http://seekingalpha.com 7 | 8 | Source: https://github.com/trinitybest/Web_Scraping_SeekingAlpha 9 | 10 | 11 | """ 12 | 13 | import yaml 14 | import requests 15 | import sys 16 | from lxml import html 17 | 18 | def loginSA(): 19 | #we get data from keys 20 | filepath = "keys.yaml" 21 | with open(filepath, 'r') as f: 22 | keys = yaml.load(f) 23 | 24 | #print(keys['username']) 25 | #print(keys['password']) 26 | # Start a session so we can have persistant cookies 27 | sessionRequests = requests.Session() 28 | 29 | loginUrl = "http://seekingalpha.com/account/login" 30 | 31 | # This is the form data that the page sends when logging in 32 | loginData = { 33 | 'slugs[]': None, 34 | 'rt':None, 35 | 'user[url_source]':None, 36 | 'user[location_source]':'orthodox_login', 37 | 'user[email]':keys['username'], 38 | 'user[password]':keys['password'], 39 | 40 | } 41 | # Authenticate 42 | r = sessionRequests.post(loginUrl, data = loginData, headers={"Referer": "http://seekingalpha.com/", 43 | "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"}) 44 | # add some more headers, like browsers 45 | # r = sessionRequests.get('http://seekingalpha.com/account/login') 46 | 47 | return [r.status_code, sessionRequests] 48 | 49 | if __name__ == "__main__": 50 | print(loginSA()[0]) 51 | tempUrl = 'http://seekingalpha.com/article/3973265-apple-can-reverse-revenue-curse' 52 | userHeader = {"Referer": "http://seekingalpha.com/", 53 | "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"} 54 | print(loginSA()[1].get(tempUrl, headers = userHeader).text) 55 | -------------------------------------------------------------------------------- /src/pdfgen.py: -------------------------------------------------------------------------------- 1 | """ 2 | Author: Antoine Comets 3 | Date: 12/05/2016 4 | 5 | This file contains the source code for pdfgen which generates a pdf with the relevant extracts 6 | returned by relevantExtracts given as input, using the reportlib library. 7 | """ 8 | 9 | from os import mkdir, chdir 10 | from os.path import exists, join 11 | from reportlab.lib.styles import ParagraphStyle as PS 12 | from reportlab.pdfgen import canvas 13 | from reportlab.lib.pagesizes import letter, A4 14 | import datetime 15 | from reportlab.lib.units import inch 16 | from reportlab.lib.styles import getSampleStyleSheet 17 | from reportlab.platypus import SimpleDocTemplate, Preformatted, Spacer 18 | from reportlab.platypus.doctemplate import PageTemplate 19 | from reportlab.platypus.frames import Frame 20 | from reportlab.lib.units import cm 21 | from reportlab.platypus.paragraph import Paragraph 22 | 23 | h1 = PS(name = 'Heading1', 24 | fontSize = 12, 25 | leading = 14) 26 | 27 | def pdfgen(relevant_extracts, sector, keywords): 28 | today = datetime.datetime.today() 29 | today.replace(second=0, microsecond=0) 30 | 31 | outputdir = join('..', 'output') 32 | if not exists(outputdir): 33 | mkdir(outputdir) 34 | chdir(outputdir) 35 | 36 | doc = SimpleDocTemplate('%s_%s.pdf' % (sector, today.strftime("%Y-%m-%d_%H.%M"))) 37 | template = PageTemplate('normal', [Frame(2.5*cm, 2.5*cm, 15*cm, 25*cm, id='F1')]) 38 | doc.addPageTemplates(template) 39 | 40 | Story = [Spacer(1,0.5*inch)] 41 | styleSheet=getSampleStyleSheet() 42 | style = styleSheet['BodyText'] 43 | title = Paragraph('%s Industry Earnings Call Transcripts Report' % sector, 44 | style) 45 | Story.append(title) 46 | subtitle = Paragraph('Keywords: %s' % ", ".join(keywords), 47 | style) 48 | Story.append(subtitle) 49 | Story.append(Spacer(1,0.5*inch)) 50 | 51 | 52 | for extract in relevant_extracts: 53 | Story.append(Paragraph("From %s" % extract["title"], h1)) 54 | Story.append(Paragraph("Published on %s at %s" % (extract["date"], extract["time"]), h1)) 55 | text = Preformatted(extract["bodyContent"].encode('utf8'), style, maxLineLength=100) 56 | Story.append(text) 57 | Story.append(Spacer(1,0.2*inch)) 58 | 59 | doc.build(Story) 60 | 61 | 62 | -------------------------------------------------------------------------------- /src/relevantExtracts.py: -------------------------------------------------------------------------------- 1 | """ 2 | Author: Antoine Comets 3 | Date: 12/04/2016 4 | 5 | This file contains the source code for relevantExtracts which extracts excerpts from a list of earnings call 6 | transcripts URLs given as input. The relevant excerpts contain keywords also passed as argument in a list. 7 | Source: https://github.com/trinitybest/Web_Scraping_SeekingAlpha 8 | 9 | """ 10 | 11 | import requests 12 | from bs4 import BeautifulSoup 13 | from urlparse import urljoin 14 | from login import loginSA 15 | import sys 16 | import codecs 17 | from time import sleep 18 | 19 | def relevantExtracts(session, urls, keywords): 20 | #session = loginSA()[1] 21 | extracts = [] 22 | 23 | userHeader = {"Referer": "http://seekingalpha.com/", 24 | "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"} 25 | 26 | for url in urls: 27 | displayoptions = {'part': 'single'} 28 | r = session.get(url, headers = userHeader, params = displayoptions) 29 | 30 | soup = BeautifulSoup(r.content, 'lxml') 31 | sleep(0.1) 32 | 33 | headline = soup.find_all("h1", {"itemprop":"headline"}) 34 | title = headline[0].text if headline else 'Title missing' 35 | ###print("title: ", title) 36 | 37 | dateTime = soup.find_all("meta", {"property":"article:published_time"}) 38 | date1 = dateTime[0].get("content") if dateTime else '' 39 | date2 = date1.split('T') if date1 else '' 40 | date = date2[0] if date2 else 'Date missing' 41 | time1 = date2[1:] if date2 else '' 42 | time2 = time1[0].split('Z') if time1 else '' 43 | time = time2[0] if time2 else 'Time missing' 44 | ###print("Date time is: {0} and {1}".format(date, time)) 45 | 46 | 47 | bodyAll = soup.find_all("div", {"id":"a-body"}) 48 | if bodyAll: 49 | bodyAll = bodyAll[0].text 50 | body = bodyAll.split("\n") 51 | for p in body: 52 | if any(keyword in p for keyword in keywords): 53 | extracts.append({"title": title, 54 | "date": date, 55 | "time": time, 56 | "bodyContent": p}) 57 | else: 58 | extracts.append({"title": title, 59 | "date": date, 60 | "time": time, 61 | "bodyContent": "Unable to retrieve content from URL: " + url}) 62 | #print(bodyAll) 63 | 64 | 65 | return extracts 66 | 67 | 68 | if __name__ == "__main__": 69 | session = loginSA()[1] 70 | 71 | -------------------------------------------------------------------------------- /src/main.py: -------------------------------------------------------------------------------- 1 | """ 2 | Author: Antoine Comets 3 | Date: 12/05/2016 4 | 5 | This file contains the source code for the GUI which then calls all other functions. 6 | It uses the tkinter framework. 7 | 8 | """ 9 | 10 | from Tkinter import * 11 | from os.path import join 12 | import pandas as pd 13 | from login import loginSA 14 | from getTickers import getTickers 15 | from findTranscriptsURLs import findTranscriptsURLs 16 | from relevantExtracts import relevantExtracts 17 | from pdfgen import pdfgen 18 | 19 | 20 | file = join("..", "data/constituents.csv") 21 | spx = pd.read_csv(file) 22 | sectors = set(spx['Sector']) 23 | 24 | class App: 25 | 26 | def __init__(self, master): 27 | 28 | topframe = Frame(master) 29 | topframe.pack(side=TOP) 30 | 31 | self.sectorLabel = Label( 32 | topframe, text="Industry sector:" 33 | ) 34 | self.sectorLabel.grid(row=0, column=0) 35 | 36 | self.sector = StringVar(master) 37 | self.sectorOptionMenu = apply(OptionMenu, (topframe, self.sector) + tuple(sectors)) 38 | self.sectorOptionMenu.grid(row=0, column=1, sticky='ew') 39 | 40 | self.keywordsLabel = Label( 41 | topframe, text="Enter keywords (separated by ', '):" 42 | ) 43 | self.keywordsLabel.grid(row=1, column=0) 44 | 45 | self.keywords = StringVar(master) 46 | self.keywordsEntry = Entry( 47 | topframe, textvariable=self.keywords, width=80 48 | ) 49 | self.keywordsEntry.grid(row=1, column=1) 50 | 51 | bottomframe = Frame(master) 52 | bottomframe.pack(side=BOTTOM) 53 | 54 | self.goButton = Button( 55 | bottomframe, text="Go", command=self.okbutton 56 | ) 57 | self.goButton.pack(side=LEFT) 58 | 59 | self.closeButton = Button( 60 | bottomframe, text="Close", command=self.close 61 | ) 62 | self.closeButton.pack(side=RIGHT) 63 | 64 | def okbutton(self): 65 | session = loginSA()[1] 66 | sector = self.sector.get() 67 | keywords = self.keywords.get() 68 | tickers = getTickers(sector) 69 | keywords = keywords.split(', ') 70 | n_last_quarters = 4 71 | 72 | relevant_extracts = [] 73 | 74 | for ticker in tickers: 75 | urls = findTranscriptsURLs(session, ticker, n_last_quarters) 76 | if urls != []: 77 | relevant_extracts += relevantExtracts(session, urls, keywords) 78 | 79 | pdfgen(relevant_extracts, sector, keywords) 80 | 81 | def close(self): 82 | root.destroy() 83 | 84 | root = Tk() 85 | 86 | app = App(root) 87 | 88 | root.mainloop() 89 | root.destroy() # optional; see description below 90 | 91 | -------------------------------------------------------------------------------- /data/constituents.csv: -------------------------------------------------------------------------------- 1 | Symbol,Name,Sector 2 | MMM,3M Company,Industrials 3 | ABT,Abbott Laboratories,Health Care 4 | ABBV,AbbVie,Health Care 5 | ACN,Accenture plc,Information Technology 6 | ATVI,Activision Blizzard,Information Technology 7 | AYI,Acuity Brands Inc,Industrials 8 | ADBE,Adobe Systems Inc,Information Technology 9 | AAP,Advance Auto Parts,Consumer Discretionary 10 | AES,AES Corp,Utilities 11 | AET,Aetna Inc,Health Care 12 | AMG,Affiliated Managers Group Inc,Financials 13 | AFL,AFLAC Inc,Financials 14 | A,Agilent Technologies Inc,Health Care 15 | APD,Air Products & Chemicals Inc,Materials 16 | AKAM,Akamai Technologies Inc,Information Technology 17 | ALK,Alaska Air Group Inc,Industrials 18 | ALB,Albemarle Corp,Materials 19 | ALXN,Alexion Pharmaceuticals,Health Care 20 | ALLE,Allegion,Industrials 21 | AGN,"Allergan, Plc",Health Care 22 | ADS,Alliance Data Systems,Information Technology 23 | LNT,Alliant Energy Corp,Utilities 24 | ALL,Allstate Corp,Financials 25 | GOOGL,Alphabet Inc Class A,Information Technology 26 | GOOG,Alphabet Inc Class C,Information Technology 27 | MO,Altria Group Inc,Consumer Staples 28 | AMZN,Amazon.com Inc,Consumer Discretionary 29 | AEE,Ameren Corp,Utilities 30 | AAL,American Airlines Group,Industrials 31 | AEP,American Electric Power,Utilities 32 | AXP,American Express Co,Financials 33 | AIG,"American International Group, Inc.",Financials 34 | AMT,American Tower Corp A,Real Estate 35 | AWK,American Water Works Company Inc,Utilities 36 | AMP,Ameriprise Financial,Financials 37 | ABC,AmerisourceBergen Corp,Health Care 38 | AME,Ametek,Industrials 39 | AMGN,Amgen Inc,Health Care 40 | APH,Amphenol Corp A,Industrials 41 | APC,Anadarko Petroleum Corp,Energy 42 | ADI,"Analog Devices, Inc.",Information Technology 43 | ANTM,Anthem Inc.,Health Care 44 | AON,Aon plc,Financials 45 | APA,Apache Corporation,Energy 46 | AIV,Apartment Investment & Mgmt,Real Estate 47 | AAPL,Apple Inc.,Information Technology 48 | AMAT,Applied Materials Inc,Information Technology 49 | ADM,Archer-Daniels-Midland Co,Consumer Staples 50 | ARNC,Arconic Inc,Industrials 51 | AJG,Arthur J. Gallagher & Co.,Financials 52 | AIZ,Assurant Inc,Financials 53 | T,AT&T Inc,Telecommunications Services 54 | ADSK,Autodesk Inc,Information Technology 55 | ADP,Automatic Data Processing,Information Technology 56 | AN,AutoNation Inc,Consumer Discretionary 57 | AZO,AutoZone Inc,Consumer Discretionary 58 | AVB,"AvalonBay Communities, Inc.",Real Estate 59 | AVY,Avery Dennison Corp,Materials 60 | BHI,Baker Hughes Inc,Energy 61 | BLL,Ball Corp,Materials 62 | BAC,Bank of America Corp,Financials 63 | BCR,Bard (C.R.) Inc.,Health Care 64 | BAX,Baxter International Inc.,Health Care 65 | BBT,BB&T Corporation,Financials 66 | BDX,Becton Dickinson,Health Care 67 | BBBY,Bed Bath & Beyond,Consumer Discretionary 68 | BRK-B,Berkshire Hathaway,Financials 69 | BBY,Best Buy Co. Inc.,Consumer Discretionary 70 | BIIB,BIOGEN IDEC Inc.,Health Care 71 | BLK,BlackRock,Financials 72 | HRB,Block H&R,Financials 73 | BA,Boeing Company,Industrials 74 | BWA,BorgWarner,Consumer Discretionary 75 | BXP,Boston Properties,Real Estate 76 | BSX,Boston Scientific,Health Care 77 | BMY,Bristol-Myers Squibb,Health Care 78 | AVGO,Broadcom,Information Technology 79 | BF-B,Brown-Forman Corporation,Consumer Staples 80 | CHRW,C. H. Robinson Worldwide,Industrials 81 | CA,"CA, Inc.",Information Technology 82 | COG,Cabot Oil & Gas,Energy 83 | CPB,Campbell Soup,Consumer Staples 84 | COF,Capital One Financial,Financials 85 | CAH,Cardinal Health Inc.,Health Care 86 | KMX,Carmax Inc,Consumer Discretionary 87 | CCL,Carnival Corp.,Consumer Discretionary 88 | CAT,Caterpillar Inc.,Industrials 89 | CBG,CBRE Group,Real Estate 90 | CBS,CBS Corp.,Consumer Discretionary 91 | CELG,Celgene Corp.,Health Care 92 | CNC,Centene Corporation,Health Care 93 | CNP,CenterPoint Energy,Utilities 94 | CTL,CenturyLink Inc,Telecommunications Services 95 | CERN,Cerner,Health Care 96 | CF,CF Industries Holdings Inc,Materials 97 | SCHW,Charles Schwab Corporation,Financials 98 | CHTR,Charter Communications,Consumer Discretionary 99 | CHK,Chesapeake Energy,Energy 100 | CVX,Chevron Corp.,Energy 101 | CMG,Chipotle Mexican Grill,Consumer Discretionary 102 | CB,Chubb Limited,Financials 103 | CHD,Church & Dwight,Consumer Staples 104 | CI,CIGNA Corp.,Health Care 105 | XEC,Cimarex Energy,Energy 106 | CINF,Cincinnati Financial,Financials 107 | CTAS,Cintas Corporation,Industrials 108 | CSCO,Cisco Systems,Information Technology 109 | C,Citigroup Inc.,Financials 110 | CFG,Citizens Financial Group,Financials 111 | CTXS,Citrix Systems,Information Technology 112 | CME,CME Group Inc.,Financials 113 | CMS,CMS Energy,Utilities 114 | COH,Coach Inc.,Consumer Discretionary 115 | KO,Coca Cola Company,Consumer Staples 116 | CTSH,Cognizant Technology Solutions,Information Technology 117 | CL,Colgate-Palmolive,Consumer Staples 118 | CMCSA,Comcast A Corp,Consumer Discretionary 119 | CMA,Comerica Inc.,Financials 120 | CAG,ConAgra Foods Inc.,Consumer Staples 121 | CXO,Concho Resources,Energy 122 | COP,ConocoPhillips,Energy 123 | ED,Consolidated Edison,Utilities 124 | STZ,Constellation Brands,Consumer Staples 125 | GLW,Corning Inc.,Industrials 126 | COST,Costco Co.,Consumer Staples 127 | COTY,"Coty, Inc",Consumer Staples 128 | CCI,Crown Castle International Corp.,Real Estate 129 | CSRA,CSRA Inc.,Information Technology 130 | CSX,CSX Corp.,Industrials 131 | CMI,Cummins Inc.,Industrials 132 | CVS,CVS Health,Consumer Staples 133 | DHI,D. R. Horton,Consumer Discretionary 134 | DHR,Danaher Corp.,Industrials 135 | DRI,Darden Restaurants,Consumer Discretionary 136 | DVA,DaVita Inc.,Health Care 137 | DE,Deere & Co.,Industrials 138 | DLPH,Delphi Automotive,Consumer Discretionary 139 | DAL,Delta Air Lines,Industrials 140 | XRAY,Dentsply Sirona,Health Care 141 | DVN,Devon Energy Corp.,Energy 142 | DLR,Digital Realty Trust,Real Estate 143 | DFS,Discover Financial Services,Financials 144 | DISCA,Discovery Communications-A,Consumer Discretionary 145 | DISCK,Discovery Communications-C,Consumer Discretionary 146 | DG,Dollar General,Consumer Discretionary 147 | DLTR,Dollar Tree,Consumer Discretionary 148 | D,Dominion Resources,Utilities 149 | DOV,Dover Corp.,Industrials 150 | DOW,Dow Chemical,Materials 151 | DPS,Dr Pepper Snapple Group,Consumer Staples 152 | DTE,DTE Energy Co.,Utilities 153 | DD,Du Pont (E.I.),Materials 154 | DUK,Duke Energy,Utilities 155 | DNB,Dun & Bradstreet,Industrials 156 | ETFC,E*Trade,Financials 157 | EMN,Eastman Chemical,Materials 158 | ETN,Eaton Corporation,Industrials 159 | EBAY,eBay Inc.,Information Technology 160 | ECL,Ecolab Inc.,Materials 161 | EIX,Edison Int'l,Utilities 162 | EW,Edwards Lifesciences,Health Care 163 | EA,Electronic Arts,Information Technology 164 | EMR,Emerson Electric Company,Industrials 165 | ENDP,Endo International,Health Care 166 | ETR,Entergy Corp.,Utilities 167 | EVHC,Envision Healthcare Corp,Health Care 168 | EOG,EOG Resources,Energy 169 | EQT,EQT Corporation,Energy 170 | EFX,Equifax Inc.,Financials 171 | EQIX,Equinix,Real Estate 172 | EQR,Equity Residential,Real Estate 173 | ESS,"Essex Property Trust, Inc.",Real Estate 174 | EL,Estee Lauder Cos.,Consumer Staples 175 | ES,Eversource Energy,Utilities 176 | EXC,Exelon Corp.,Utilities 177 | EXPE,Expedia Inc.,Consumer Discretionary 178 | EXPD,Expeditors Int'l,Industrials 179 | ESRX,Express Scripts,Health Care 180 | EXR,Extra Space Storage,Real Estate 181 | XOM,Exxon Mobil Corp.,Energy 182 | FFIV,F5 Networks,Information Technology 183 | FB,Facebook,Information Technology 184 | FAST,Fastenal Co,Industrials 185 | FRT,Federal Realty Investment Trust,Real Estate 186 | FDX,FedEx Corporation,Industrials 187 | FIS,Fidelity National Information Services,Information Technology 188 | FITB,Fifth Third Bancorp,Financials 189 | FSLR,First Solar Inc,Information Technology 190 | FE,FirstEnergy Corp,Utilities 191 | FISV,Fiserv Inc,Information Technology 192 | FLIR,FLIR Systems,Industrials 193 | FLS,Flowserve Corporation,Industrials 194 | FLR,Fluor Corp.,Industrials 195 | FMC,FMC Corporation,Materials 196 | FTI,FMC Technologies Inc.,Energy 197 | FL,Foot Locker Inc,Consumer Discretionary 198 | F,Ford Motor,Consumer Discretionary 199 | FTV,Fortive Corp,Industrials 200 | FBHS,Fortune Brands Home & Security,Industrials 201 | BEN,Franklin Resources,Financials 202 | FCX,Freeport-McMoran Cp & Gld,Materials 203 | FTR,Frontier Communications,Telecommunications Services 204 | GPS,Gap (The),Consumer Discretionary 205 | GRMN,Garmin Ltd.,Consumer Discretionary 206 | GD,General Dynamics,Industrials 207 | GE,General Electric,Industrials 208 | GGP,General Growth Properties Inc.,Real Estate 209 | GIS,General Mills,Consumer Staples 210 | GM,General Motors,Consumer Discretionary 211 | GPC,Genuine Parts,Consumer Discretionary 212 | GILD,Gilead Sciences,Health Care 213 | GPN,Global Payments Inc,Information Technology 214 | GS,Goldman Sachs Group,Financials 215 | GT,Goodyear Tire & Rubber,Consumer Discretionary 216 | GWW,Grainger (W.W.) Inc.,Industrials 217 | HAL,Halliburton Co.,Energy 218 | HBI,Hanesbrands Inc,Consumer Discretionary 219 | HOG,Harley-Davidson,Consumer Discretionary 220 | HAR,Harman Int'l Industries,Consumer Discretionary 221 | HRS,Harris Corporation,Information Technology 222 | HIG,Hartford Financial Svc.Gp.,Financials 223 | HAS,Hasbro Inc.,Consumer Discretionary 224 | HCA,HCA Holdings,Health Care 225 | HCP,HCP Inc.,Real Estate 226 | HP,Helmerich & Payne,Energy 227 | HSIC,Henry Schein,Health Care 228 | HES,Hess Corporation,Energy 229 | HPE,Hewlett Packard Enterprise,Information Technology 230 | HOLX,Hologic,Health Care 231 | HD,Home Depot,Consumer Discretionary 232 | HON,Honeywell Int'l Inc.,Industrials 233 | HRL,Hormel Foods Corp.,Consumer Staples 234 | HST,Host Hotels & Resorts,Real Estate 235 | HPQ,HP Inc.,Information Technology 236 | HUM,Humana Inc.,Health Care 237 | HBAN,Huntington Bancshares,Financials 238 | ITW,Illinois Tool Works,Industrials 239 | ILMN,Illumina Inc,Health Care 240 | IR,Ingersoll-Rand PLC,Industrials 241 | INTC,Intel Corp.,Information Technology 242 | ICE,Intercontinental Exchange,Financials 243 | IBM,International Bus. Machines,Information Technology 244 | IP,International Paper,Materials 245 | IPG,Interpublic Group,Consumer Discretionary 246 | IFF,Intl Flavors & Fragrances,Materials 247 | INTU,Intuit Inc.,Information Technology 248 | ISRG,Intuitive Surgical Inc.,Health Care 249 | IVZ,Invesco Ltd.,Financials 250 | IRM,Iron Mountain Incorporated,Real Estate 251 | JBHT,J. B. Hunt Transport Services,Industrials 252 | JEC,Jacobs Engineering Group,Industrials 253 | SJM,JM Smucker,Consumer Staples 254 | JNJ,Johnson & Johnson,Health Care 255 | JCI,Johnson Controls,Consumer Discretionary 256 | JPM,JPMorgan Chase & Co.,Financials 257 | JNPR,Juniper Networks,Information Technology 258 | KSU,Kansas City Southern,Industrials 259 | K,Kellogg Co.,Consumer Staples 260 | KEY,KeyCorp,Financials 261 | KMB,Kimberly-Clark,Consumer Staples 262 | KIM,Kimco Realty,Real Estate 263 | KMI,Kinder Morgan,Energy 264 | KLAC,KLA-Tencor Corp.,Information Technology 265 | KSS,Kohl's Corp.,Consumer Discretionary 266 | KHC,Kraft Heinz Co,Consumer Staples 267 | KR,Kroger Co.,Consumer Staples 268 | LB,L Brands Inc.,Consumer Discretionary 269 | LLL,L-3 Communications Holdings,Industrials 270 | LH,Laboratory Corp. of America Holding,Health Care 271 | LRCX,Lam Research,Information Technology 272 | LEG,Leggett & Platt,Industrials 273 | LEN,Lennar Corp.,Consumer Discretionary 274 | LUK,Leucadia National Corp.,Financials 275 | LVLT,Level 3 Communications,Telecommunications Services 276 | LLY,Lilly (Eli) & Co.,Health Care 277 | LNC,Lincoln National,Financials 278 | LLTC,Linear Technology Corp.,Information Technology 279 | LKQ,LKQ Corporation,Consumer Discretionary 280 | LMT,Lockheed Martin Corp.,Industrials 281 | L,Loews Corp.,Financials 282 | LOW,Lowe's Cos.,Consumer Discretionary 283 | LYB,LyondellBasell,Materials 284 | MTB,M&T Bank Corp.,Financials 285 | MAC,Macerich,Real Estate 286 | M,Macy's Inc.,Consumer Discretionary 287 | MNK,Mallinckrodt Plc,Health Care 288 | MRO,Marathon Oil Corp.,Energy 289 | MPC,Marathon Petroleum,Energy 290 | MAR,Marriott Int'l.,Consumer Discretionary 291 | MMC,Marsh & McLennan,Financials 292 | MLM,Martin Marietta Materials,Materials 293 | MAS,Masco Corp.,Industrials 294 | MA,Mastercard Inc.,Information Technology 295 | MAT,Mattel Inc.,Consumer Discretionary 296 | MKC,McCormick & Co.,Consumer Staples 297 | MCD,McDonald's Corp.,Consumer Discretionary 298 | MCK,McKesson Corp.,Health Care 299 | MJN,Mead Johnson,Consumer Staples 300 | MDT,Medtronic plc,Health Care 301 | MRK,Merck & Co.,Health Care 302 | MET,MetLife Inc.,Financials 303 | MTD,Mettler Toledo,Health Care 304 | KORS,Michael Kors Holdings,Consumer Discretionary 305 | MCHP,Microchip Technology,Information Technology 306 | MU,Micron Technology,Information Technology 307 | MSFT,Microsoft Corp.,Information Technology 308 | MAA,Mid-America Apartments,Real Estate 309 | MHK,Mohawk Industries,Consumer Discretionary 310 | TAP,Molson Coors Brewing Company,Consumer Staples 311 | MDLZ,Mondelez International,Consumer Staples 312 | MON,Monsanto Co.,Materials 313 | MNST,Monster Beverage,Consumer Staples 314 | MCO,Moody's Corp,Financials 315 | MS,Morgan Stanley,Financials 316 | MSI,Motorola Solutions Inc.,Information Technology 317 | MUR,Murphy Oil,Energy 318 | MYL,Mylan N.V.,Health Care 319 | NDAQ,NASDAQ OMX Group,Financials 320 | NOV,National Oilwell Varco Inc.,Energy 321 | NAVI,Navient,Financials 322 | NTAP,NetApp,Information Technology 323 | NFLX,Netflix Inc.,Information Technology 324 | NWL,Newell Rubbermaid Co.,Consumer Discretionary 325 | NFX,Newfield Exploration Co,Energy 326 | NEM,Newmont Mining Corp. (Hldg. Co.),Materials 327 | NWSA,News Corp. Class A,Consumer Discretionary 328 | NWS,News Corp. Class B,Consumer Discretionary 329 | NEE,NextEra Energy,Utilities 330 | NLSN,Nielsen Holdings,Industrials 331 | NKE,Nike,Consumer Discretionary 332 | NI,NiSource Inc.,Utilities 333 | NBL,Noble Energy Inc,Energy 334 | JWN,Nordstrom,Consumer Discretionary 335 | NSC,Norfolk Southern Corp.,Industrials 336 | NTRS,Northern Trust Corp.,Financials 337 | NOC,Northrop Grumman Corp.,Industrials 338 | NRG,NRG Energy,Utilities 339 | NUE,Nucor Corp.,Materials 340 | NVDA,Nvidia Corporation,Information Technology 341 | ORLY,O'Reilly Automotive,Consumer Discretionary 342 | OXY,Occidental Petroleum,Energy 343 | OMC,Omnicom Group,Consumer Discretionary 344 | OKE,ONEOK,Energy 345 | ORCL,Oracle Corp.,Information Technology 346 | PCAR,PACCAR Inc.,Industrials 347 | PH,Parker-Hannifin,Industrials 348 | PDCO,Patterson Companies,Health Care 349 | PAYX,Paychex Inc.,Information Technology 350 | PYPL,PayPal,Information Technology 351 | PNR,Pentair Ltd.,Industrials 352 | PBCT,People's United Financial,Financials 353 | PEP,PepsiCo Inc.,Consumer Staples 354 | PKI,PerkinElmer,Health Care 355 | PRGO,Perrigo,Health Care 356 | PFE,Pfizer Inc.,Health Care 357 | PCG,PG&E Corp.,Utilities 358 | PM,Philip Morris International,Consumer Staples 359 | PSX,Phillips 66,Energy 360 | PNW,Pinnacle West Capital,Utilities 361 | PXD,Pioneer Natural Resources,Energy 362 | PBI,Pitney-Bowes,Industrials 363 | PNC,PNC Financial Services,Financials 364 | RL,Polo Ralph Lauren Corp.,Consumer Discretionary 365 | PPG,PPG Industries,Materials 366 | PPL,PPL Corp.,Utilities 367 | PX,Praxair Inc.,Materials 368 | PCLN,Priceline.com Inc,Consumer Discretionary 369 | PFG,Principal Financial Group,Financials 370 | PG,Procter & Gamble,Consumer Staples 371 | PGR,Progressive Corp.,Financials 372 | PLD,Prologis,Real Estate 373 | PRU,Prudential Financial,Financials 374 | PEG,Public Serv. Enterprise Inc.,Utilities 375 | PSA,Public Storage,Real Estate 376 | PHM,Pulte Homes Inc.,Consumer Discretionary 377 | PVH,PVH Corp.,Consumer Discretionary 378 | QRVO,Qorvo,Information Technology 379 | QCOM,QUALCOMM Inc.,Information Technology 380 | PWR,Quanta Services Inc.,Industrials 381 | DGX,Quest Diagnostics,Health Care 382 | RRC,Range Resources Corp.,Energy 383 | RTN,Raytheon Co.,Industrials 384 | O,Realty Income Corporation,Real Estate 385 | RHT,Red Hat Inc.,Information Technology 386 | REGN,Regeneron,Health Care 387 | RF,Regions Financial Corp.,Financials 388 | RSG,Republic Services Inc,Industrials 389 | RAI,Reynolds American Inc.,Consumer Staples 390 | RHI,Robert Half International,Industrials 391 | ROK,Rockwell Automation Inc.,Industrials 392 | COL,Rockwell Collins,Industrials 393 | ROP,Roper Industries,Industrials 394 | ROST,Ross Stores,Consumer Discretionary 395 | RCL,Royal Caribbean Cruises Ltd,Consumer Discretionary 396 | R,Ryder System,Industrials 397 | SPGI,"S&P Global, Inc.",Financials 398 | CRM,Salesforce.com,Information Technology 399 | SCG,SCANA Corp,Utilities 400 | SLB,Schlumberger Ltd.,Energy 401 | SNI,Scripps Networks Interactive Inc.,Consumer Discretionary 402 | STX,Seagate Technology,Information Technology 403 | SEE,Sealed Air,Materials 404 | SRE,Sempra Energy,Utilities 405 | SHW,Sherwin-Williams,Materials 406 | SIG,Signet Jewelers,Consumer Discretionary 407 | SPG,Simon Property Group Inc,Real Estate 408 | SWKS,Skyworks Solutions,Information Technology 409 | SLG,SL Green Realty,Real Estate 410 | SNA,Snap-On Inc.,Consumer Discretionary 411 | SO,Southern Co.,Utilities 412 | LUV,Southwest Airlines,Industrials 413 | SWN,Southwestern Energy,Energy 414 | SE,Spectra Energy Corp.,Energy 415 | STJ,St Jude Medical,Health Care 416 | SWK,Stanley Black & Decker,Consumer Discretionary 417 | SPLS,Staples Inc.,Consumer Discretionary 418 | SBUX,Starbucks Corp.,Consumer Discretionary 419 | STT,State Street Corp.,Financials 420 | SRCL,Stericycle Inc,Industrials 421 | SYK,Stryker Corp.,Health Care 422 | STI,SunTrust Banks,Financials 423 | SYMC,Symantec Corp.,Information Technology 424 | SYF,Synchrony Financial,Financials 425 | SYY,Sysco Corp.,Consumer Staples 426 | TROW,T. Rowe Price Group,Financials 427 | TGT,Target Corp.,Consumer Discretionary 428 | TEL,TE Connectivity Ltd.,Information Technology 429 | TGNA,"Tegna, Inc.",Consumer Discretionary 430 | TDC,Teradata Corp.,Information Technology 431 | TSO,Tesoro Petroleum Co.,Energy 432 | TXN,Texas Instruments,Information Technology 433 | TXT,Textron Inc.,Industrials 434 | BK,The Bank of New York Mellon Corp.,Financials 435 | CLX,The Clorox Company,Consumer Staples 436 | COO,The Cooper Companies,Health Care 437 | HSY,The Hershey Company,Consumer Staples 438 | MOS,The Mosaic Company,Materials 439 | TRV,The Travelers Companies Inc.,Financials 440 | DIS,The Walt Disney Company,Consumer Discretionary 441 | TMO,Thermo Fisher Scientific,Health Care 442 | TIF,Tiffany & Co.,Consumer Discretionary 443 | TWX,Time Warner Inc.,Consumer Discretionary 444 | TJX,TJX Companies Inc.,Consumer Discretionary 445 | TMK,Torchmark Corp.,Financials 446 | TSS,Total System Services,Information Technology 447 | TSCO,Tractor Supply Company,Consumer Discretionary 448 | TDG,TransDigm Group,Industrials 449 | RIG,Tran --------------------------------------------------------------------------------