├── LICENSE
├── Lecture 00_Introduction to Algorithmic Trading.ipynb
├── Lecture 00_Introduction to Python.ipynb
├── Lecture 01_Data Handling.ipynb
├── Lecture 02_Stock Screener.ipynb
├── Lecture 03_Trading Strategies _ Paradigms.ipynb
├── Lecture 04_Regression Recap and Asset Pricing Models.ipynb
├── Lecture 05_Time Series Forecasting.ipynb
├── Lecture 06_Machine Learning for Algo Trading.ipynb
├── Lecture 07_ Strategy Testing.ipynb
├── Lecture 08_Connect to a trading API.ipynb
├── README.md
└── images
├── 11.2.png
├── 11.3.png
├── Life is like ML.jpg
├── activationfun.png
├── ai_ml.png
├── autoencoder.png
├── autoencoder2.png
├── bpro.png
├── error.jpg
├── eta.png
├── ex1.png
├── hello.png
├── highlow.png
├── intro_nn.png
├── ipython-notebook-screenshot.jpg
├── ipython-screenshot.jpg
├── jupyter-screenshot.png
├── mlp.PNG
├── model.png
├── nn-3-layer-network.png
├── nn.png
├── nn_timeline.jpg
├── optimizing-what-2.png
├── optimizing-what.png
├── python-screenshot.jpg
├── spyder-screenshot.jpg
├── supervised.png
└── types.png
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Ali Habibnia
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Lecture 02_Stock Screener.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "1034a875",
6 | "metadata": {},
7 | "source": [
8 | "##
Algorithmic Trading with Python
\n",
9 | "###
Stock Screener
\n",
10 | "####
Ali Habibnia
"
11 | ]
12 | },
13 | {
14 | "cell_type": "markdown",
15 | "id": "064a07cd",
16 | "metadata": {},
17 | "source": [
18 | "A stock screener is a tool that investors and traders use to filter stocks based on specific criteria. It allows users to search and analyze stocks within the market according to metrics such as technical analysis indicators, market capitalization, dividend yield, price-to-earnings ratio (P/E), revenue growth, industry, and many other factors.\n",
19 | "\n",
20 | "Stock screeners can help to narrow down the choices to a more manageable number, allowing investors to focus on stocks that meet their investment criteria. They can be found on many financial news websites, brokerage platforms, and specialized investment tools.\n",
21 | "\n",
22 | "For example, if an investor is looking for high-dividend-yielding stocks in the technology sector with a P/E ratio below a certain level, they can input these criteria into the stock screener, and it will provide a list of stocks that meet those conditions.\n",
23 | "\n",
24 | "Stock screeners can be simple or highly complex, depending on the platform and the user's requirements. They are a useful resource for both novice and seasoned investors, helping them to identify potential investment opportunities that align with their strategies and risk tolerance.\n",
25 | "\n",
26 | "There are dozens of amazing stock screener apps and sites out there like Finviz and TradingView. However, most sites do not offer as much customization as you want, if you don’t pay for it.\n",
27 | "\n",
28 | "https://finviz.com/screener.ashx\n",
29 | "\n",
30 | "https://www.tradingview.com/screener/\n",
31 | "\n",
32 | "with a few lines of Python code, you can make your own customized simple stock screener, and this notebook is here to show you how."
33 | ]
34 | },
35 | {
36 | "cell_type": "markdown",
37 | "id": "11175d76",
38 | "metadata": {},
39 | "source": [
40 | "The process of stock screening involves using various metrics and indicators to filter stocks that match certain requirements. A well-designed stock screener can help investors save time and focus on stocks that align with their investment strategies.\n",
41 | "\n"
42 | ]
43 | },
44 | {
45 | "cell_type": "markdown",
46 | "id": "a4b7ba3f",
47 | "metadata": {},
48 | "source": [
49 | "## Making a Stock Screener with Python"
50 | ]
51 | },
52 | {
53 | "cell_type": "markdown",
54 | "id": "fdbbfe90",
55 | "metadata": {},
56 | "source": [
57 | "### Combining all S&P 500 company prices into one DataFrame"
58 | ]
59 | },
60 | {
61 | "cell_type": "code",
62 | "execution_count": 2,
63 | "id": "c5761d4b",
64 | "metadata": {},
65 | "outputs": [],
66 | "source": [
67 | "%matplotlib inline\n",
68 | "\n",
69 | "import yfinance as yf\n",
70 | "import bs4 as bs\n",
71 | "import numpy as np\n",
72 | "import os\n",
73 | "import missingno as msno\n",
74 | "import requests\n",
75 | "import pandas as pd\n",
76 | "import datetime\n",
77 | "import matplotlib.pyplot as plt\n",
78 | "from matplotlib.dates import DateFormatter"
79 | ]
80 | },
81 | {
82 | "cell_type": "code",
83 | "execution_count": 6,
84 | "id": "04ac54cb",
85 | "metadata": {},
86 | "outputs": [
87 | {
88 | "name": "stdout",
89 | "output_type": "stream",
90 | "text": [
91 | "[*********************100%***********************] 504 of 504 completed\n",
92 | "\n",
93 | "2 Failed downloads:\n",
94 | "- BRK.B: No data found, symbol may be delisted\n",
95 | "- BF.B: No data found for this date range, symbol may be delisted\n",
96 | " A AAL AAP AAPL ABBV \\\n",
97 | "Date \n",
98 | "2020-01-02 83.948051 28.982893 147.959641 73.347931 75.656319 \n",
99 | "2020-01-03 82.600204 27.548195 147.968903 72.634842 74.938171 \n",
100 | "2020-01-06 82.844376 27.219410 145.537094 73.213608 75.529572 \n",
101 | "2020-01-07 83.098328 27.119778 143.810669 72.869286 75.098701 \n",
102 | "2020-01-08 83.918762 27.737495 142.158569 74.041489 75.630951 \n",
103 | "... ... ... ... ... ... \n",
104 | "2023-06-26 118.144394 16.440001 67.052231 185.270004 133.470322 \n",
105 | "2023-06-27 116.816925 17.350000 68.078590 188.059998 131.146103 \n",
106 | "2023-06-28 116.148201 17.549999 67.839439 189.250000 131.057083 \n",
107 | "2023-06-29 117.825005 17.600000 67.988907 189.589996 131.769180 \n",
108 | "2023-06-30 NaN NaN NaN NaN NaN \n",
109 | "\n",
110 | " ABC ABT ACGL ACN ADBE ... \\\n",
111 | "Date ... \n",
112 | "2020-01-02 80.829391 81.730194 43.400002 199.225372 334.429993 ... \n",
113 | "2020-01-03 79.812843 80.733826 43.349998 198.893616 331.809998 ... \n",
114 | "2020-01-06 80.981392 81.156807 43.520000 197.594788 333.709991 ... \n",
115 | "2020-01-07 80.401886 80.705650 43.160000 193.328720 333.390015 ... \n",
116 | "2020-01-08 81.180901 81.034615 42.730000 193.707977 337.869995 ... \n",
117 | "... ... ... ... ... ... ... \n",
118 | "2023-06-26 187.759995 107.992081 71.220001 296.334534 479.510010 ... \n",
119 | "2023-06-27 188.779999 107.275520 71.139999 299.722229 489.269989 ... \n",
120 | "2023-06-28 189.720001 107.096375 71.680000 300.628937 482.429993 ... \n",
121 | "2023-06-29 190.520004 107.146141 73.029999 307.215027 483.769989 ... \n",
122 | "2023-06-30 NaN NaN NaN NaN NaN ... \n",
123 | "\n",
124 | " XEL XOM XRAY XYL YUM \\\n",
125 | "Date \n",
126 | "2020-01-02 56.588825 58.530800 54.796291 76.566856 95.838875 \n",
127 | "2020-01-03 56.860977 58.060257 54.189899 77.017525 95.538704 \n",
128 | "2020-01-06 56.779324 58.506031 54.488281 76.518929 95.482422 \n",
129 | "2020-01-07 56.661400 58.027222 54.777042 76.231239 95.651283 \n",
130 | "2020-01-08 56.606968 57.152138 55.354542 76.490143 95.820129 \n",
131 | "... ... ... ... ... ... \n",
132 | "2023-06-26 62.860001 104.290001 39.170956 110.669998 134.229996 \n",
133 | "2023-06-27 62.439999 104.550003 39.768833 111.610001 134.279999 \n",
134 | "2023-06-28 61.240002 105.400002 39.440002 110.540001 135.160004 \n",
135 | "2023-06-29 61.290001 106.699997 39.509998 111.339996 137.259995 \n",
136 | "2023-06-30 NaN NaN NaN NaN NaN \n",
137 | "\n",
138 | " ZBH ZBRA ZION ZTS ^GSPC \n",
139 | "Date \n",
140 | "2020-01-02 141.097336 259.140015 46.758438 130.801010 3257.850098 \n",
141 | "2020-01-03 140.728516 256.049988 46.098618 130.820526 3234.850098 \n",
142 | "2020-01-06 139.915176 258.010010 45.536877 129.816162 3246.280029 \n",
143 | "2020-01-07 139.792282 256.470001 45.260460 130.254974 3237.179932 \n",
144 | "2020-01-08 141.466156 247.639999 45.706284 129.972168 3253.050049 \n",
145 | "... ... ... ... ... ... \n",
146 | "2023-06-26 142.809998 273.109985 27.080000 167.172348 4328.819824 \n",
147 | "2023-06-27 144.809998 282.809998 27.299999 170.295486 4378.410156 \n",
148 | "2023-06-28 144.000000 283.489990 27.090000 168.728928 4376.859863 \n",
149 | "2023-06-29 145.149994 288.679993 27.280001 171.492844 4396.439941 \n",
150 | "2023-06-30 NaN NaN NaN NaN NaN \n",
151 | "\n",
152 | "[880 rows x 504 columns]\n"
153 | ]
154 | }
155 | ],
156 | "source": [
157 | "resp = requests.get('http://en.wikipedia.org/wiki/List_of_S%26P_500_companies')\n",
158 | "\n",
159 | "#pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')\n",
160 | "\n",
161 | "soup = bs.BeautifulSoup(resp.text, 'lxml')\n",
162 | "table = soup.find('table', {'class': 'wikitable sortable'})\n",
163 | "tickers = []\n",
164 | "for row in table.findAll('tr')[1:]:\n",
165 | " ticker = row.findAll('td')[0].text\n",
166 | " tickers.append(ticker)\n",
167 | "\n",
168 | "tickers = [s.replace('\\n', '') for s in tickers]\n",
169 | "start = datetime.datetime(2020,1,1)\n",
170 | "end = datetime.datetime(2023,6,30)\n",
171 | "\n",
172 | "# The ticker for the S&P 500 index is ^GSPC, but it cannot be traded. \n",
173 | "# SPY is the ticker symbol for the SPDR® S&P 500® ETF, an exchange traded fund that tracks the performance of the S&P 500® Index.\n",
174 | "\n",
175 | "tickers=tickers+[\"^GSPC\"]; \n",
176 | "data = yf.download(tickers, start=start, end=end)['Adj Close']\n",
177 | "\n",
178 | "# data = yf.download(tickers, period=\"5d\", interval=\"1m\")\n",
179 | "print(data)"
180 | ]
181 | },
182 | {
183 | "cell_type": "code",
184 | "execution_count": 7,
185 | "id": "49bbc602",
186 | "metadata": {},
187 | "outputs": [
188 | {
189 | "data": {
190 | "text/plain": [
191 | ""
192 | ]
193 | },
194 | "execution_count": 7,
195 | "metadata": {},
196 | "output_type": "execute_result"
197 | },
198 | {
199 | "data": {
200 | "image/png": "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\n",
201 | "text/plain": [
202 | ""
203 | ]
204 | },
205 | "metadata": {
206 | "needs_background": "light"
207 | },
208 | "output_type": "display_data"
209 | }
210 | ],
211 | "source": [
212 | "msno.matrix(data)"
213 | ]
214 | },
215 | {
216 | "cell_type": "code",
217 | "execution_count": 10,
218 | "id": "df265c82",
219 | "metadata": {},
220 | "outputs": [
221 | {
222 | "data": {
223 | "text/plain": [
224 | ""
225 | ]
226 | },
227 | "execution_count": 10,
228 | "metadata": {},
229 | "output_type": "execute_result"
230 | },
231 | {
232 | "data": {
233 | "image/png": "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\n",
234 | "text/plain": [
235 | ""
236 | ]
237 | },
238 | "metadata": {
239 | "needs_background": "light"
240 | },
241 | "output_type": "display_data"
242 | }
243 | ],
244 | "source": [
245 | "# Clean before calculating return values\n",
246 | "cleaned_data = data.copy()\n",
247 | "\n",
248 | "# Remove companies (columns) with all missing values for whole time range\n",
249 | "cleaned_data.dropna(axis='columns', how='all', inplace=True)\n",
250 | "\n",
251 | "# Remove days (rows) with missing values for all of companies\n",
252 | "cleaned_data.dropna(axis='index', how='all', inplace=True)\n",
253 | "\n",
254 | "# Finally, remove the columns with at least one Nan (missing value)\n",
255 | "cleaned_data.dropna(axis='columns', how='any', inplace=True)\n",
256 | "\n",
257 | "msno.matrix(cleaned_data)"
258 | ]
259 | },
260 | {
261 | "cell_type": "markdown",
262 | "id": "cd80d419",
263 | "metadata": {},
264 | "source": [
265 | "### Example 1: Mark Minervini’s Trend Template\n",
266 | "\n",
267 | "Let's take a look at Mark Minervini’s Trend Template as an example. Mark Minervini is a U.S. trader and author who has developed a specific method for trading stocks known as the \"SEPA® methodology\" or the Minervini Trend Template. It's a systematic approach that combines both fundamental and technical analysis to identify stocks that are beginning or continuing in a significant uptrend.\n",
268 | "\n",
269 | "Here's a step-by-step breakdown of Mark Minervini's trend template, which is part of his broader methodology:\n",
270 | "\n",
271 | "#### 1. Price Above 150 and 200-day Moving Average\n",
272 | "The stock's current price must be above its 150-day and 200-day simple moving average. This helps to ensure that the stock is in an overall uptrend, as the price being above a longer-term moving average is often considered a bullish sign.\n",
273 | "#### 2. 150-Day Moving Average Sloping Upwards\n",
274 | "The 150-day moving average itself should be sloping upwards or The 150-day simple moving average must be greater than the 200-day simple moving average. This ensures that the long-term trend is bullish and that the stock is consistently moving in the right direction.\n",
275 | "\n",
276 | "#### 3. Current Price Above 30-Day Moving Average\n",
277 | "The stock's current price must also be above its 30-day moving average. This shorter-term moving average helps to confirm that the stock is in an immediate uptrend.\n",
278 | "#### 4. 30-Day Moving Average Above 150-Day Moving Average\n",
279 | "The 30-day moving average must be above the 150-day moving average. This alignment of moving averages is a sign that both short-term and long-term trends are bullish.\n",
280 | "#### 5. Current Price is at Least 30% Above the 52-Week Low\n",
281 | "The stock's current price must be at least 30% above its 52-week low. This helps to identify stocks that have already begun a significant upward trend.\n",
282 | "#### 6. Current Price Within 25% of the 52-Week High\n",
283 | "The stock's current price should be within 25% of its 52-week high. This criterion helps to ensure that the stock is trading near its recent highs, another sign of strength.\n",
284 | "#### 7. Relative Strength Rating (RSR)\n",
285 | "A stock's relative strength compared to the rest of the market should be considered and must be greater than 70 (the higher, the better). The RS rating is a metric of a stock’s price performance over the last year compared to all other stocks and the overall market. Minervini often looks for stocks that are outperforming the market or their peers, as this can be indicative of underlying strength.\n",
286 | "#### 8. Average Daily Volume\n",
287 | "Minervini typically looks for stocks with sufficient liquidity, considering the average daily trading volume. Trading stocks with higher volume can reduce the cost of trading and increase the ease of entering and exiting positions.\n",
288 | "\n",
289 | "These criteria can be used as part of a systematic approach to identify stocks that are in strong uptrends and may be likely to continue those trends. It's worth noting that while the trend template can be a powerful tool, it should be used in conjunction with other analyses, including a comprehensive understanding of the stock's fundamentals, market conditions, and risk management practices. Minervini's books, especially \"Trade Like a Stock Market Wizard,\" provide a more detailed explanation of his methodology and how to apply it."
290 | ]
291 | },
292 | {
293 | "cell_type": "code",
294 | "execution_count": null,
295 | "id": "48d077e4",
296 | "metadata": {},
297 | "outputs": [],
298 | "source": [
299 | "! pip install yahoo_fin"
300 | ]
301 | },
302 | {
303 | "cell_type": "code",
304 | "execution_count": 26,
305 | "id": "29656723",
306 | "metadata": {},
307 | "outputs": [],
308 | "source": [
309 | "from pandas_datareader import data as pdr\n",
310 | "from yahoo_fin import stock_info as si\n",
311 | "from pandas import ExcelWriter\n",
312 | "import yfinance as yf\n",
313 | "import pandas as pd\n",
314 | "import datetime\n",
315 | "import time\n",
316 | "import os\n",
317 | "yf.pdr_override()\n",
318 | "\n",
319 | "# Variables\n",
320 | "tickers = si.tickers_sp500()\n",
321 | "tickers = [item.replace(\".\", \"-\") for item in tickers] # Yahoo Finance uses dashes instead of dots\n",
322 | "index_name = '^GSPC' # S&P 500\n",
323 | "start_date = datetime.datetime.now() - datetime.timedelta(days=365)\n",
324 | "end_date = datetime.date.today()\n",
325 | "exportList = pd.DataFrame(columns=['Stock', \"RS_Rating\", \"50 Day MA\", \"150 Day Ma\", \"200 Day MA\", \"52 Week Low\", \"52 week High\"])\n",
326 | "returns_multiples = []"
327 | ]
328 | },
329 | {
330 | "cell_type": "code",
331 | "execution_count": 18,
332 | "id": "625e15e4",
333 | "metadata": {},
334 | "outputs": [
335 | {
336 | "name": "stdout",
337 | "output_type": "stream",
338 | "text": [
339 | "[*********************100%***********************] 1 of 1 completed\n",
340 | "[*********************100%***********************] 1 of 1 completed\n",
341 | "Ticker: A; Returns Multiple against S&P 500: 0.88\n",
342 | "\n",
343 | "[*********************100%***********************] 1 of 1 completed\n",
344 | "Ticker: AAL; Returns Multiple against S&P 500: 0.98\n",
345 | "\n",
346 | "[*********************100%***********************] 1 of 1 completed\n",
347 | "Ticker: AAP; Returns Multiple against S&P 500: 0.35\n",
348 | "\n",
349 | "[*********************100%***********************] 1 of 1 completed\n",
350 | "Ticker: AAPL; Returns Multiple against S&P 500: 1.0\n",
351 | "\n",
352 | "[*********************100%***********************] 1 of 1 completed\n",
353 | "Ticker: ABBV; Returns Multiple against S&P 500: 1.02\n",
354 | "\n",
355 | "[*********************100%***********************] 1 of 1 completed\n",
356 | "Ticker: ABC; Returns Multiple against S&P 500: 1.23\n",
357 | "\n",
358 | "[*********************100%***********************] 1 of 1 completed\n",
359 | "Ticker: ABT; Returns Multiple against S&P 500: 0.93\n",
360 | "\n",
361 | "[*********************100%***********************] 1 of 1 completed\n",
362 | "Ticker: ACGL; Returns Multiple against S&P 500: 1.62\n",
363 | "\n",
364 | "[*********************100%***********************] 1 of 1 completed\n",
365 | "Ticker: ACN; Returns Multiple against S&P 500: 0.95\n",
366 | "\n",
367 | "[*********************100%***********************] 1 of 1 completed\n",
368 | "Ticker: ADBE; Returns Multiple against S&P 500: 1.12\n",
369 | "\n",
370 | "[*********************100%***********************] 1 of 1 completed\n",
371 | "Ticker: ADI; Returns Multiple against S&P 500: 1.01\n",
372 | "\n",
373 | "[*********************100%***********************] 1 of 1 completed\n",
374 | "Ticker: ADM; Returns Multiple against S&P 500: 0.99\n",
375 | "\n",
376 | "[*********************100%***********************] 1 of 1 completed\n",
377 | "Ticker: ADP; Returns Multiple against S&P 500: 0.94\n",
378 | "\n",
379 | "[*********************100%***********************] 1 of 1 completed\n",
380 | "Ticker: ADSK; Returns Multiple against S&P 500: 0.85\n",
381 | "\n",
382 | "[*********************100%***********************] 1 of 1 completed\n",
383 | "Ticker: AEE; Returns Multiple against S&P 500: 0.83\n",
384 | "\n",
385 | "[*********************100%***********************] 1 of 1 completed\n",
386 | "Ticker: AEP; Returns Multiple against S&P 500: 0.77\n",
387 | "\n",
388 | "[*********************100%***********************] 1 of 1 completed\n",
389 | "Ticker: AES; Returns Multiple against S&P 500: 0.78\n",
390 | "\n",
391 | "[*********************100%***********************] 1 of 1 completed\n",
392 | "Ticker: AFL; Returns Multiple against S&P 500: 1.23\n",
393 | "\n",
394 | "[*********************100%***********************] 1 of 1 completed\n",
395 | "Ticker: AIG; Returns Multiple against S&P 500: 1.11\n",
396 | "\n",
397 | "[*********************100%***********************] 1 of 1 completed\n",
398 | "Ticker: AIZ; Returns Multiple against S&P 500: 0.84\n",
399 | "\n",
400 | "[*********************100%***********************] 1 of 1 completed\n",
401 | "Ticker: AJG; Returns Multiple against S&P 500: 1.16\n",
402 | "\n",
403 | "[*********************100%***********************] 1 of 1 completed\n",
404 | "Ticker: AKAM; Returns Multiple against S&P 500: 0.91\n",
405 | "\n",
406 | "[*********************100%***********************] 1 of 1 completed\n",
407 | "Ticker: ALB; Returns Multiple against S&P 500: 0.74\n",
408 | "\n",
409 | "[*********************100%***********************] 1 of 1 completed\n",
410 | "Ticker: ALGN; Returns Multiple against S&P 500: 1.13\n",
411 | "\n",
412 | "[*********************100%***********************] 1 of 1 completed\n",
413 | "Ticker: ALK; Returns Multiple against S&P 500: 0.92\n",
414 | "\n",
415 | "[*********************100%***********************] 1 of 1 completed\n",
416 | "Ticker: ALL; Returns Multiple against S&P 500: 0.88\n",
417 | "\n",
418 | "[*********************100%***********************] 1 of 1 completed\n",
419 | "Ticker: ALLE; Returns Multiple against S&P 500: 1.02\n",
420 | "\n",
421 | "[*********************100%***********************] 1 of 1 completed\n",
422 | "Ticker: AMAT; Returns Multiple against S&P 500: 1.29\n",
423 | "\n",
424 | "[*********************100%***********************] 1 of 1 completed\n",
425 | "Ticker: AMCR; Returns Multiple against S&P 500: 0.77\n",
426 | "\n",
427 | "[*********************100%***********************] 1 of 1 completed\n",
428 | "Ticker: AMD; Returns Multiple against S&P 500: 1.07\n",
429 | "\n",
430 | "[*********************100%***********************] 1 of 1 completed\n",
431 | "Ticker: AME; Returns Multiple against S&P 500: 1.18\n",
432 | "\n",
433 | "[*********************100%***********************] 1 of 1 completed\n",
434 | "Ticker: AMGN; Returns Multiple against S&P 500: 0.97\n",
435 | "\n",
436 | "[*********************100%***********************] 1 of 1 completed\n",
437 | "Ticker: AMP; Returns Multiple against S&P 500: 1.2\n",
438 | "\n",
439 | "[*********************100%***********************] 1 of 1 completed\n",
440 | "Ticker: AMT; Returns Multiple against S&P 500: 0.63\n",
441 | "\n",
442 | "[*********************100%***********************] 1 of 1 completed\n",
443 | "Ticker: AMZN; Returns Multiple against S&P 500: 0.93\n",
444 | "\n",
445 | "[*********************100%***********************] 1 of 1 completed\n",
446 | "Ticker: ANET; Returns Multiple against S&P 500: 1.32\n",
447 | "\n",
448 | "[*********************100%***********************] 1 of 1 completed\n",
449 | "Ticker: ANSS; Returns Multiple against S&P 500: 0.99\n",
450 | "\n",
451 | "[*********************100%***********************] 1 of 1 completed\n",
452 | "Ticker: AON; Returns Multiple against S&P 500: 1.01\n",
453 | "\n",
454 | "[*********************100%***********************] 1 of 1 completed\n",
455 | "Ticker: AOS; Returns Multiple against S&P 500: 1.12\n",
456 | "\n",
457 | "[*********************100%***********************] 1 of 1 completed\n",
458 | "Ticker: APA; Returns Multiple against S&P 500: 1.23\n",
459 | "\n",
460 | "[*********************100%***********************] 1 of 1 completed\n",
461 | "Ticker: APD; Returns Multiple against S&P 500: 1.03\n",
462 | "\n",
463 | "[*********************100%***********************] 1 of 1 completed\n",
464 | "Ticker: APH; Returns Multiple against S&P 500: 1.06\n",
465 | "\n",
466 | "[*********************100%***********************] 1 of 1 completed\n",
467 | "Ticker: APTV; Returns Multiple against S&P 500: 0.96\n",
468 | "\n",
469 | "[*********************100%***********************] 1 of 1 completed\n",
470 | "Ticker: ARE; Returns Multiple against S&P 500: 0.73\n",
471 | "\n",
472 | "[*********************100%***********************] 1 of 1 completed\n",
473 | "Ticker: ATO; Returns Multiple against S&P 500: 0.97\n",
474 | "\n",
475 | "[*********************100%***********************] 1 of 1 completed\n",
476 | "Ticker: ATVI; Returns Multiple against S&P 500: 1.05\n",
477 | "\n",
478 | "[*********************100%***********************] 1 of 1 completed\n",
479 | "Ticker: AVB; Returns Multiple against S&P 500: 0.87\n",
480 | "\n",
481 | "[*********************100%***********************] 1 of 1 completed\n",
482 | "Ticker: AVGO; Returns Multiple against S&P 500: 1.55\n",
483 | "\n",
484 | "[*********************100%***********************] 1 of 1 completed\n",
485 | "Ticker: AVY; Returns Multiple against S&P 500: 0.88\n",
486 | "\n",
487 | "[*********************100%***********************] 1 of 1 completed\n",
488 | "Ticker: AWK; Returns Multiple against S&P 500: 0.86\n",
489 | "\n",
490 | "[*********************100%***********************] 1 of 1 completed\n",
491 | "Ticker: AXON; Returns Multiple against S&P 500: 1.42\n",
492 | "\n",
493 | "[*********************100%***********************] 1 of 1 completed\n",
494 | "Ticker: AXP; Returns Multiple against S&P 500: 0.99\n",
495 | "\n",
496 | "[*********************100%***********************] 1 of 1 completed\n",
497 | "Ticker: AZO; Returns Multiple against S&P 500: 1.02\n",
498 | "\n",
499 | "[*********************100%***********************] 1 of 1 completed\n",
500 | "Ticker: BA; Returns Multiple against S&P 500: 1.32\n",
501 | "\n",
502 | "[*********************100%***********************] 1 of 1 completed\n",
503 | "Ticker: BAC; Returns Multiple against S&P 500: 0.9\n",
504 | "\n",
505 | "[*********************100%***********************] 1 of 1 completed\n",
506 | "Ticker: BALL; Returns Multiple against S&P 500: 0.93\n",
507 | "\n",
508 | "[*********************100%***********************] 1 of 1 completed\n",
509 | "Ticker: BAX; Returns Multiple against S&P 500: 0.68\n",
510 | "\n",
511 | "[*********************100%***********************] 1 of 1 completed\n",
512 | "Ticker: BBWI; Returns Multiple against S&P 500: 0.96\n",
513 | "\n",
514 | "[*********************100%***********************] 1 of 1 completed\n",
515 | "Ticker: BBY; Returns Multiple against S&P 500: 0.98\n",
516 | "\n",
517 | "[*********************100%***********************] 1 of 1 completed\n",
518 | "Ticker: BDX; Returns Multiple against S&P 500: 1.0\n",
519 | "\n",
520 | "[*********************100%***********************] 1 of 1 completed\n",
521 | "Ticker: BEN; Returns Multiple against S&P 500: 0.98\n",
522 | "\n",
523 | "[*********************100%***********************] 1 of 1 completed\n",
524 | "Ticker: BF-B; Returns Multiple against S&P 500: 0.88\n",
525 | "\n",
526 | "[*********************100%***********************] 1 of 1 completed\n",
527 | "Ticker: BG; Returns Multiple against S&P 500: 1.13\n",
528 | "\n",
529 | "[*********************100%***********************] 1 of 1 completed\n",
530 | "Ticker: BIIB; Returns Multiple against S&P 500: 1.14\n",
531 | "\n",
532 | "[*********************100%***********************] 1 of 1 completed\n",
533 | "Ticker: BIO; Returns Multiple against S&P 500: 0.69\n",
534 | "\n",
535 | "[*********************100%***********************] 1 of 1 completed\n",
536 | "Ticker: BK; Returns Multiple against S&P 500: 1.02\n",
537 | "\n"
538 | ]
539 | },
540 | {
541 | "name": "stdout",
542 | "output_type": "stream",
543 | "text": [
544 | "[*********************100%***********************] 1 of 1 completed\n",
545 | "Ticker: BKNG; Returns Multiple against S&P 500: 1.52\n",
546 | "\n",
547 | "[*********************100%***********************] 1 of 1 completed\n",
548 | "Ticker: BKR; Returns Multiple against S&P 500: 1.38\n",
549 | "\n",
550 | "[*********************100%***********************] 1 of 1 completed\n",
551 | "Ticker: BLK; Returns Multiple against S&P 500: 0.97\n",
552 | "\n",
553 | "[*********************100%***********************] 1 of 1 completed\n",
554 | "Ticker: BMY; Returns Multiple against S&P 500: 0.78\n",
555 | "\n",
556 | "[*********************100%***********************] 1 of 1 completed\n",
557 | "Ticker: BR; Returns Multiple against S&P 500: 0.93\n",
558 | "\n",
559 | "[*********************100%***********************] 1 of 1 completed\n",
560 | "Ticker: BRK-B; Returns Multiple against S&P 500: 1.14\n",
561 | "\n",
562 | "[*********************100%***********************] 1 of 1 completed\n",
563 | "Ticker: BRO; Returns Multiple against S&P 500: 1.01\n",
564 | "\n",
565 | "[*********************100%***********************] 1 of 1 completed\n",
566 | "Ticker: BSX; Returns Multiple against S&P 500: 1.13\n",
567 | "\n",
568 | "[*********************100%***********************] 1 of 1 completed\n",
569 | "Ticker: BWA; Returns Multiple against S&P 500: 1.17\n",
570 | "\n",
571 | "[*********************100%***********************] 1 of 1 completed\n",
572 | "Ticker: BXP; Returns Multiple against S&P 500: 0.79\n",
573 | "\n",
574 | "[*********************100%***********************] 1 of 1 completed\n",
575 | "Ticker: C; Returns Multiple against S&P 500: 0.85\n",
576 | "\n",
577 | "[*********************100%***********************] 1 of 1 completed\n",
578 | "Ticker: CAG; Returns Multiple against S&P 500: 0.89\n",
579 | "\n",
580 | "[*********************100%***********************] 1 of 1 completed\n",
581 | "Ticker: CAH; Returns Multiple against S&P 500: 1.41\n",
582 | "\n",
583 | "[*********************100%***********************] 1 of 1 completed\n",
584 | "Ticker: CARR; Returns Multiple against S&P 500: 1.29\n",
585 | "\n",
586 | "[*********************100%***********************] 1 of 1 completed\n",
587 | "Ticker: CAT; Returns Multiple against S&P 500: 1.42\n",
588 | "\n",
589 | "[*********************100%***********************] 1 of 1 completed\n",
590 | "Ticker: CB; Returns Multiple against S&P 500: 1.01\n",
591 | "\n",
592 | "[*********************100%***********************] 1 of 1 completed\n",
593 | "Ticker: CBOE; Returns Multiple against S&P 500: 1.13\n",
594 | "\n",
595 | "[*********************100%***********************] 1 of 1 completed\n",
596 | "Ticker: CBRE; Returns Multiple against S&P 500: 0.93\n",
597 | "\n",
598 | "[*********************100%***********************] 1 of 1 completed\n",
599 | "Ticker: CCI; Returns Multiple against S&P 500: 0.56\n",
600 | "\n",
601 | "[*********************100%***********************] 1 of 1 completed\n",
602 | "Ticker: CCL; Returns Multiple against S&P 500: 1.65\n",
603 | "\n",
604 | "[*********************100%***********************] 1 of 1 completed\n",
605 | "Ticker: CDAY; Returns Multiple against S&P 500: 1.02\n",
606 | "\n",
607 | "[*********************100%***********************] 1 of 1 completed\n",
608 | "Ticker: CDNS; Returns Multiple against S&P 500: 1.16\n",
609 | "\n",
610 | "[*********************100%***********************] 1 of 1 completed\n",
611 | "Ticker: CDW; Returns Multiple against S&P 500: 1.05\n",
612 | "\n",
613 | "[*********************100%***********************] 1 of 1 completed\n",
614 | "Ticker: CE; Returns Multiple against S&P 500: 1.06\n",
615 | "\n",
616 | "[*********************100%***********************] 1 of 1 completed\n",
617 | "Ticker: CEG; Returns Multiple against S&P 500: 1.27\n",
618 | "\n",
619 | "[*********************100%***********************] 1 of 1 completed\n",
620 | "Ticker: CF; Returns Multiple against S&P 500: 0.76\n",
621 | "\n",
622 | "[*********************100%***********************] 1 of 1 completed\n",
623 | "Ticker: CFG; Returns Multiple against S&P 500: 0.81\n",
624 | "\n",
625 | "[*********************100%***********************] 1 of 1 completed\n",
626 | "Ticker: CHD; Returns Multiple against S&P 500: 1.01\n",
627 | "\n",
628 | "[*********************100%***********************] 1 of 1 completed\n",
629 | "Ticker: CHRW; Returns Multiple against S&P 500: 0.84\n",
630 | "\n",
631 | "[*********************100%***********************] 1 of 1 completed\n",
632 | "Ticker: CHTR; Returns Multiple against S&P 500: 0.83\n",
633 | "\n",
634 | "[*********************100%***********************] 1 of 1 completed\n",
635 | "Ticker: CI; Returns Multiple against S&P 500: 0.96\n",
636 | "\n",
637 | "[*********************100%***********************] 1 of 1 completed\n",
638 | "Ticker: CINF; Returns Multiple against S&P 500: 1.05\n",
639 | "\n",
640 | "[*********************100%***********************] 1 of 1 completed\n",
641 | "Ticker: CL; Returns Multiple against S&P 500: 0.89\n",
642 | "\n",
643 | "[*********************100%***********************] 1 of 1 completed\n",
644 | "Ticker: CLX; Returns Multiple against S&P 500: 1.06\n",
645 | "\n",
646 | "[*********************100%***********************] 1 of 1 completed\n",
647 | "Ticker: CMA; Returns Multiple against S&P 500: 0.66\n",
648 | "\n",
649 | "[*********************100%***********************] 1 of 1 completed\n",
650 | "Ticker: CMCSA; Returns Multiple against S&P 500: 1.11\n",
651 | "\n",
652 | "[*********************100%***********************] 1 of 1 completed\n",
653 | "Ticker: CME; Returns Multiple against S&P 500: 1.0\n",
654 | "\n",
655 | "[*********************100%***********************] 1 of 1 completed\n",
656 | "Ticker: CMG; Returns Multiple against S&P 500: 1.07\n",
657 | "\n",
658 | "[*********************100%***********************] 1 of 1 completed\n",
659 | "Ticker: CMI; Returns Multiple against S&P 500: 1.02\n",
660 | "\n",
661 | "[*********************100%***********************] 1 of 1 completed\n",
662 | "Ticker: CMS; Returns Multiple against S&P 500: 0.8\n",
663 | "\n",
664 | "[*********************100%***********************] 1 of 1 completed\n",
665 | "Ticker: CNC; Returns Multiple against S&P 500: 0.66\n",
666 | "\n",
667 | "[*********************100%***********************] 1 of 1 completed\n",
668 | "Ticker: CNP; Returns Multiple against S&P 500: 0.86\n",
669 | "\n",
670 | "[*********************100%***********************] 1 of 1 completed\n",
671 | "Ticker: COF; Returns Multiple against S&P 500: 1.0\n",
672 | "\n",
673 | "[*********************100%***********************] 1 of 1 completed\n",
674 | "Ticker: COO; Returns Multiple against S&P 500: 1.07\n",
675 | "\n",
676 | "[*********************100%***********************] 1 of 1 completed\n",
677 | "Ticker: COP; Returns Multiple against S&P 500: 1.18\n",
678 | "\n",
679 | "[*********************100%***********************] 1 of 1 completed\n",
680 | "Ticker: COST; Returns Multiple against S&P 500: 0.95\n",
681 | "\n",
682 | "[*********************100%***********************] 1 of 1 completed\n",
683 | "Ticker: CPB; Returns Multiple against S&P 500: 0.84\n",
684 | "\n",
685 | "[*********************100%***********************] 1 of 1 completed\n",
686 | "Ticker: CPRT; Returns Multiple against S&P 500: 1.27\n",
687 | "\n",
688 | "[*********************100%***********************] 1 of 1 completed\n",
689 | "Ticker: CPT; Returns Multiple against S&P 500: 0.76\n",
690 | "\n",
691 | "[*********************100%***********************] 1 of 1 completed\n",
692 | "Ticker: CRL; Returns Multiple against S&P 500: 0.85\n",
693 | "\n",
694 | "[*********************100%***********************] 1 of 1 completed\n",
695 | "Ticker: CRM; Returns Multiple against S&P 500: 1.04\n",
696 | "\n",
697 | "[*********************100%***********************] 1 of 1 completed\n",
698 | "Ticker: CSCO; Returns Multiple against S&P 500: 1.11\n",
699 | "\n",
700 | "[*********************100%***********************] 1 of 1 completed\n",
701 | "Ticker: CSGP; Returns Multiple against S&P 500: 1.03\n",
702 | "\n",
703 | "[*********************100%***********************] 1 of 1 completed\n",
704 | "Ticker: CSX; Returns Multiple against S&P 500: 0.9\n",
705 | "\n",
706 | "[*********************100%***********************] 1 of 1 completed\n",
707 | "Ticker: CTAS; Returns Multiple against S&P 500: 1.08\n",
708 | "\n",
709 | "[*********************100%***********************] 1 of 1 completed\n",
710 | "Ticker: CTLT; Returns Multiple against S&P 500: 0.38\n",
711 | "\n",
712 | "[*********************100%***********************] 1 of 1 completed\n",
713 | "Ticker: CTRA; Returns Multiple against S&P 500: 0.99\n",
714 | "\n",
715 | "[*********************100%***********************] 1 of 1 completed\n",
716 | "Ticker: CTSH; Returns Multiple against S&P 500: 0.97\n",
717 | "\n",
718 | "[*********************100%***********************] 1 of 1 completed\n",
719 | "Ticker: CTVA; Returns Multiple against S&P 500: 0.85\n",
720 | "\n",
721 | "[*********************100%***********************] 1 of 1 completed\n",
722 | "Ticker: CVS; Returns Multiple against S&P 500: 0.68\n",
723 | "\n",
724 | "[*********************100%***********************] 1 of 1 completed\n",
725 | "Ticker: CVX; Returns Multiple against S&P 500: 0.99\n",
726 | "\n",
727 | "[*********************100%***********************] 1 of 1 completed\n",
728 | "Ticker: CZR; Returns Multiple against S&P 500: 1.05\n",
729 | "\n",
730 | "[*********************100%***********************] 1 of 1 completed\n",
731 | "Ticker: D; Returns Multiple against S&P 500: 0.58\n",
732 | "\n",
733 | "[*********************100%***********************] 1 of 1 completed\n",
734 | "Ticker: DAL; Returns Multiple against S&P 500: 1.23\n",
735 | "\n",
736 | "[*********************100%***********************] 1 of 1 completed\n",
737 | "Ticker: DD; Returns Multiple against S&P 500: 1.23\n",
738 | "\n",
739 | "[*********************100%***********************] 1 of 1 completed\n",
740 | "Ticker: DE; Returns Multiple against S&P 500: 1.16\n",
741 | "\n",
742 | "[*********************100%***********************] 1 of 1 completed\n",
743 | "Ticker: DFS; Returns Multiple against S&P 500: 0.94\n",
744 | "\n"
745 | ]
746 | },
747 | {
748 | "name": "stdout",
749 | "output_type": "stream",
750 | "text": [
751 | "[*********************100%***********************] 1 of 1 completed\n",
752 | "Ticker: DG; Returns Multiple against S&P 500: 0.61\n",
753 | "\n",
754 | "[*********************100%***********************] 1 of 1 completed\n",
755 | "Ticker: DGX; Returns Multiple against S&P 500: 0.91\n",
756 | "\n",
757 | "[*********************100%***********************] 1 of 1 completed\n",
758 | "Ticker: DHI; Returns Multiple against S&P 500: 1.53\n",
759 | "\n",
760 | "[*********************100%***********************] 1 of 1 completed\n",
761 | "Ticker: DHR; Returns Multiple against S&P 500: 0.82\n",
762 | "\n",
763 | "[*********************100%***********************] 1 of 1 completed\n",
764 | "Ticker: DIS; Returns Multiple against S&P 500: 0.73\n",
765 | "\n",
766 | "[*********************100%***********************] 1 of 1 completed\n",
767 | "Ticker: DLR; Returns Multiple against S&P 500: 0.88\n",
768 | "\n",
769 | "[*********************100%***********************] 1 of 1 completed\n",
770 | "Ticker: DLTR; Returns Multiple against S&P 500: 0.83\n",
771 | "\n",
772 | "[*********************100%***********************] 1 of 1 completed\n",
773 | "Ticker: DOV; Returns Multiple against S&P 500: 0.99\n",
774 | "\n",
775 | "[*********************100%***********************] 1 of 1 completed\n",
776 | "Ticker: DOW; Returns Multiple against S&P 500: 1.03\n",
777 | "\n",
778 | "[*********************100%***********************] 1 of 1 completed\n",
779 | "Ticker: DPZ; Returns Multiple against S&P 500: 0.94\n",
780 | "\n",
781 | "[*********************100%***********************] 1 of 1 completed\n",
782 | "Ticker: DRI; Returns Multiple against S&P 500: 1.25\n",
783 | "\n",
784 | "[*********************100%***********************] 1 of 1 completed\n",
785 | "Ticker: DTE; Returns Multiple against S&P 500: 0.79\n",
786 | "\n",
787 | "[*********************100%***********************] 1 of 1 completed\n",
788 | "Ticker: DUK; Returns Multiple against S&P 500: 0.78\n",
789 | "\n",
790 | "[*********************100%***********************] 1 of 1 completed\n",
791 | "Ticker: DVA; Returns Multiple against S&P 500: 1.17\n",
792 | "\n",
793 | "[*********************100%***********************] 1 of 1 completed\n",
794 | "Ticker: DVN; Returns Multiple against S&P 500: 0.87\n",
795 | "\n",
796 | "[*********************100%***********************] 1 of 1 completed\n",
797 | "Ticker: DXC; Returns Multiple against S&P 500: 0.68\n",
798 | "\n",
799 | "[*********************100%***********************] 1 of 1 completed\n",
800 | "Ticker: DXCM; Returns Multiple against S&P 500: 1.21\n",
801 | "\n",
802 | "[*********************100%***********************] 1 of 1 completed\n",
803 | "Ticker: EA; Returns Multiple against S&P 500: 0.87\n",
804 | "\n",
805 | "[*********************100%***********************] 1 of 1 completed\n",
806 | "Ticker: EBAY; Returns Multiple against S&P 500: 0.86\n",
807 | "\n",
808 | "[*********************100%***********************] 1 of 1 completed\n",
809 | "Ticker: ECL; Returns Multiple against S&P 500: 1.04\n",
810 | "\n",
811 | "[*********************100%***********************] 1 of 1 completed\n",
812 | "Ticker: ED; Returns Multiple against S&P 500: 0.87\n",
813 | "\n",
814 | "[*********************100%***********************] 1 of 1 completed\n",
815 | "Ticker: EFX; Returns Multiple against S&P 500: 0.86\n",
816 | "\n",
817 | "[*********************100%***********************] 1 of 1 completed\n",
818 | "Ticker: EG; Returns Multiple against S&P 500: 1.3\n",
819 | "\n",
820 | "[*********************100%***********************] 1 of 1 completed\n",
821 | "Ticker: EIX; Returns Multiple against S&P 500: 0.99\n",
822 | "\n",
823 | "[*********************100%***********************] 1 of 1 completed\n",
824 | "Ticker: EL; Returns Multiple against S&P 500: 0.58\n",
825 | "\n",
826 | "[*********************100%***********************] 1 of 1 completed\n",
827 | "Ticker: ELV; Returns Multiple against S&P 500: 0.92\n",
828 | "\n",
829 | "[*********************100%***********************] 1 of 1 completed\n",
830 | "Ticker: EMN; Returns Multiple against S&P 500: 0.84\n",
831 | "\n",
832 | "[*********************100%***********************] 1 of 1 completed\n",
833 | "Ticker: EMR; Returns Multiple against S&P 500: 1.01\n",
834 | "\n",
835 | "[*********************100%***********************] 1 of 1 completed\n",
836 | "Ticker: ENPH; Returns Multiple against S&P 500: 0.43\n",
837 | "\n",
838 | "[*********************100%***********************] 1 of 1 completed\n",
839 | "Ticker: EOG; Returns Multiple against S&P 500: 1.16\n",
840 | "\n",
841 | "[*********************100%***********************] 1 of 1 completed\n",
842 | "Ticker: EPAM; Returns Multiple against S&P 500: 0.53\n",
843 | "\n",
844 | "[*********************100%***********************] 1 of 1 completed\n",
845 | "Ticker: EQIX; Returns Multiple against S&P 500: 1.04\n",
846 | "\n",
847 | "[*********************100%***********************] 1 of 1 completed\n",
848 | "Ticker: EQR; Returns Multiple against S&P 500: 0.83\n",
849 | "\n",
850 | "[*********************100%***********************] 1 of 1 completed\n",
851 | "Ticker: EQT; Returns Multiple against S&P 500: 0.95\n",
852 | "\n",
853 | "[*********************100%***********************] 1 of 1 completed\n",
854 | "Ticker: ES; Returns Multiple against S&P 500: 0.7\n",
855 | "\n",
856 | "[*********************100%***********************] 1 of 1 completed\n",
857 | "Ticker: ESS; Returns Multiple against S&P 500: 0.83\n",
858 | "\n",
859 | "[*********************100%***********************] 1 of 1 completed\n",
860 | "Ticker: ETN; Returns Multiple against S&P 500: 1.4\n",
861 | "\n",
862 | "[*********************100%***********************] 1 of 1 completed\n",
863 | "Ticker: ETR; Returns Multiple against S&P 500: 0.78\n",
864 | "\n",
865 | "[*********************100%***********************] 1 of 1 completed\n",
866 | "Ticker: ETSY; Returns Multiple against S&P 500: 0.69\n",
867 | "\n",
868 | "[*********************100%***********************] 1 of 1 completed\n",
869 | "Ticker: EVRG; Returns Multiple against S&P 500: 0.8\n",
870 | "\n",
871 | "[*********************100%***********************] 1 of 1 completed\n",
872 | "Ticker: EW; Returns Multiple against S&P 500: 0.69\n",
873 | "\n",
874 | "[*********************100%***********************] 1 of 1 completed\n",
875 | "Ticker: EXC; Returns Multiple against S&P 500: 0.84\n",
876 | "\n",
877 | "[*********************100%***********************] 1 of 1 completed\n",
878 | "Ticker: EXPD; Returns Multiple against S&P 500: 1.12\n",
879 | "\n",
880 | "[*********************100%***********************] 1 of 1 completed\n",
881 | "Ticker: EXPE; Returns Multiple against S&P 500: 0.93\n",
882 | "\n",
883 | "[*********************100%***********************] 1 of 1 completed\n",
884 | "Ticker: EXR; Returns Multiple against S&P 500: 0.63\n",
885 | "\n",
886 | "[*********************100%***********************] 1 of 1 completed\n",
887 | "Ticker: F; Returns Multiple against S&P 500: 0.83\n",
888 | "\n",
889 | "[*********************100%***********************] 1 of 1 completed\n",
890 | "Ticker: FANG; Returns Multiple against S&P 500: 1.18\n",
891 | "\n",
892 | "[*********************100%***********************] 1 of 1 completed\n",
893 | "Ticker: FAST; Returns Multiple against S&P 500: 1.0\n",
894 | "\n",
895 | "[*********************100%***********************] 1 of 1 completed\n",
896 | "Ticker: FCX; Returns Multiple against S&P 500: 1.29\n",
897 | "\n",
898 | "[*********************100%***********************] 1 of 1 completed\n",
899 | "Ticker: FDS; Returns Multiple against S&P 500: 0.93\n",
900 | "\n",
901 | "[*********************100%***********************] 1 of 1 completed\n",
902 | "Ticker: FDX; Returns Multiple against S&P 500: 1.08\n",
903 | "\n",
904 | "[*********************100%***********************] 1 of 1 completed\n",
905 | "Ticker: FE; Returns Multiple against S&P 500: 0.9\n",
906 | "\n",
907 | "[*********************100%***********************] 1 of 1 completed\n",
908 | "Ticker: FFIV; Returns Multiple against S&P 500: 0.86\n",
909 | "\n",
910 | "[*********************100%***********************] 1 of 1 completed\n",
911 | "Ticker: FI; Returns Multiple against S&P 500: 1.1\n",
912 | "\n",
913 | "[*********************100%***********************] 1 of 1 completed\n",
914 | "Ticker: FICO; Returns Multiple against S&P 500: 1.61\n",
915 | "\n",
916 | "[*********************100%***********************] 1 of 1 completed\n",
917 | "Ticker: FIS; Returns Multiple against S&P 500: 0.56\n",
918 | "\n",
919 | "[*********************100%***********************] 1 of 1 completed\n",
920 | "Ticker: FITB; Returns Multiple against S&P 500: 0.79\n",
921 | "\n",
922 | "[*********************100%***********************] 1 of 1 completed\n",
923 | "Ticker: FLT; Returns Multiple against S&P 500: 0.99\n",
924 | "\n",
925 | "[*********************100%***********************] 1 of 1 completed\n",
926 | "Ticker: FMC; Returns Multiple against S&P 500: 0.79\n",
927 | "\n",
928 | "[*********************100%***********************] 1 of 1 completed\n",
929 | "Ticker: FOX; Returns Multiple against S&P 500: 0.93\n",
930 | "\n",
931 | "[*********************100%***********************] 1 of 1 completed\n",
932 | "Ticker: FOXA; Returns Multiple against S&P 500: 0.92\n",
933 | "\n",
934 | "[*********************100%***********************] 1 of 1 completed\n",
935 | "Ticker: FRT; Returns Multiple against S&P 500: 0.93\n",
936 | "\n",
937 | "[*********************100%***********************] 1 of 1 completed\n",
938 | "Ticker: FSLR; Returns Multiple against S&P 500: 1.68\n",
939 | "\n",
940 | "[*********************100%***********************] 1 of 1 completed\n",
941 | "Ticker: FTNT; Returns Multiple against S&P 500: 0.99\n",
942 | "\n",
943 | "[*********************100%***********************] 1 of 1 completed\n",
944 | "Ticker: FTV; Returns Multiple against S&P 500: 1.1\n",
945 | "\n",
946 | "[*********************100%***********************] 1 of 1 completed\n",
947 | "Ticker: GD; Returns Multiple against S&P 500: 0.94\n",
948 | "\n",
949 | "[*********************100%***********************] 1 of 1 completed\n",
950 | "Ticker: GE; Returns Multiple against S&P 500: 1.8\n",
951 | "\n"
952 | ]
953 | },
954 | {
955 | "name": "stdout",
956 | "output_type": "stream",
957 | "text": [
958 | "[*********************100%***********************] 1 of 1 completed\n",
959 | "Ticker: GEHC; Returns Multiple against S&P 500: 1.16\n",
960 | "\n",
961 | "[*********************100%***********************] 1 of 1 completed\n",
962 | "Ticker: GEN; Returns Multiple against S&P 500: 0.82\n",
963 | "\n",
964 | "[*********************100%***********************] 1 of 1 completed\n",
965 | "Ticker: GILD; Returns Multiple against S&P 500: 1.25\n",
966 | "\n",
967 | "[*********************100%***********************] 1 of 1 completed\n",
968 | "Ticker: GIS; Returns Multiple against S&P 500: 0.91\n",
969 | "\n",
970 | "[*********************100%***********************] 1 of 1 completed\n",
971 | "Ticker: GL; Returns Multiple against S&P 500: 1.09\n",
972 | "\n",
973 | "[*********************100%***********************] 1 of 1 completed\n",
974 | "Ticker: GLW; Returns Multiple against S&P 500: 0.87\n",
975 | "\n",
976 | "[*********************100%***********************] 1 of 1 completed\n",
977 | "Ticker: GM; Returns Multiple against S&P 500: 0.91\n",
978 | "\n",
979 | "[*********************100%***********************] 1 of 1 completed\n",
980 | "Ticker: GNRC; Returns Multiple against S&P 500: 0.4\n",
981 | "\n",
982 | "[*********************100%***********************] 1 of 1 completed\n",
983 | "Ticker: GOOG; Returns Multiple against S&P 500: 1.02\n",
984 | "\n",
985 | "[*********************100%***********************] 1 of 1 completed\n",
986 | "Ticker: GOOGL; Returns Multiple against S&P 500: 1.03\n",
987 | "\n",
988 | "[*********************100%***********************] 1 of 1 completed\n",
989 | "Ticker: GPC; Returns Multiple against S&P 500: 0.97\n",
990 | "\n",
991 | "[*********************100%***********************] 1 of 1 completed\n",
992 | "Ticker: GPN; Returns Multiple against S&P 500: 0.88\n",
993 | "\n",
994 | "[*********************100%***********************] 1 of 1 completed\n",
995 | "Ticker: GRMN; Returns Multiple against S&P 500: 1.02\n",
996 | "\n",
997 | "[*********************100%***********************] 1 of 1 completed\n",
998 | "Ticker: GS; Returns Multiple against S&P 500: 1.0\n",
999 | "\n",
1000 | "[*********************100%***********************] 1 of 1 completed\n",
1001 | "Ticker: GWW; Returns Multiple against S&P 500: 1.18\n",
1002 | "\n",
1003 | "[*********************100%***********************] 1 of 1 completed\n",
1004 | "Ticker: HAL; Returns Multiple against S&P 500: 1.32\n",
1005 | "\n",
1006 | "[*********************100%***********************] 1 of 1 completed\n",
1007 | "Ticker: HAS; Returns Multiple against S&P 500: 0.8\n",
1008 | "\n",
1009 | "[*********************100%***********************] 1 of 1 completed\n",
1010 | "Ticker: HBAN; Returns Multiple against S&P 500: 0.88\n",
1011 | "\n",
1012 | "[*********************100%***********************] 1 of 1 completed\n",
1013 | "Ticker: HCA; Returns Multiple against S&P 500: 1.19\n",
1014 | "\n",
1015 | "[*********************100%***********************] 1 of 1 completed\n",
1016 | "Ticker: HD; Returns Multiple against S&P 500: 0.99\n",
1017 | "\n",
1018 | "[*********************100%***********************] 1 of 1 completed\n",
1019 | "Ticker: HES; Returns Multiple against S&P 500: 1.35\n",
1020 | "\n",
1021 | "[*********************100%***********************] 1 of 1 completed\n",
1022 | "Ticker: HIG; Returns Multiple against S&P 500: 1.07\n",
1023 | "\n",
1024 | "[*********************100%***********************] 1 of 1 completed\n",
1025 | "Ticker: HII; Returns Multiple against S&P 500: 0.97\n",
1026 | "\n",
1027 | "[*********************100%***********************] 1 of 1 completed\n",
1028 | "Ticker: HLT; Returns Multiple against S&P 500: 1.08\n",
1029 | "\n",
1030 | "[*********************100%***********************] 1 of 1 completed\n",
1031 | "Ticker: HOLX; Returns Multiple against S&P 500: 0.97\n",
1032 | "\n",
1033 | "[*********************100%***********************] 1 of 1 completed\n",
1034 | "Ticker: HON; Returns Multiple against S&P 500: 0.91\n",
1035 | "\n",
1036 | "[*********************100%***********************] 1 of 1 completed\n",
1037 | "Ticker: HPE; Returns Multiple against S&P 500: 1.15\n",
1038 | "\n",
1039 | "[*********************100%***********************] 1 of 1 completed\n",
1040 | "Ticker: HPQ; Returns Multiple against S&P 500: 0.93\n",
1041 | "\n",
1042 | "[*********************100%***********************] 1 of 1 completed\n",
1043 | "Ticker: HRL; Returns Multiple against S&P 500: 0.78\n",
1044 | "\n",
1045 | "[*********************100%***********************] 1 of 1 completed\n",
1046 | "Ticker: HSIC; Returns Multiple against S&P 500: 0.91\n",
1047 | "\n",
1048 | "[*********************100%***********************] 1 of 1 completed\n",
1049 | "Ticker: HST; Returns Multiple against S&P 500: 0.89\n",
1050 | "\n",
1051 | "[*********************100%***********************] 1 of 1 completed\n",
1052 | "Ticker: HSY; Returns Multiple against S&P 500: 0.94\n",
1053 | "\n",
1054 | "[*********************100%***********************] 1 of 1 completed\n",
1055 | "Ticker: HUM; Returns Multiple against S&P 500: 0.95\n",
1056 | "\n",
1057 | "[*********************100%***********************] 1 of 1 completed\n",
1058 | "Ticker: HWM; Returns Multiple against S&P 500: 1.24\n",
1059 | "\n",
1060 | "[*********************100%***********************] 1 of 1 completed\n",
1061 | "Ticker: IBM; Returns Multiple against S&P 500: 1.06\n",
1062 | "\n",
1063 | "[*********************100%***********************] 1 of 1 completed\n",
1064 | "Ticker: ICE; Returns Multiple against S&P 500: 1.04\n",
1065 | "\n",
1066 | "[*********************100%***********************] 1 of 1 completed\n",
1067 | "Ticker: IDXX; Returns Multiple against S&P 500: 1.14\n",
1068 | "\n",
1069 | "[*********************100%***********************] 1 of 1 completed\n",
1070 | "Ticker: IEX; Returns Multiple against S&P 500: 0.98\n",
1071 | "\n",
1072 | "[*********************100%***********************] 1 of 1 completed\n",
1073 | "Ticker: IFF; Returns Multiple against S&P 500: 0.6\n",
1074 | "\n",
1075 | "[*********************100%***********************] 1 of 1 completed\n",
1076 | "Ticker: ILMN; Returns Multiple against S&P 500: 0.77\n",
1077 | "\n",
1078 | "[*********************100%***********************] 1 of 1 completed\n",
1079 | "Ticker: INCY; Returns Multiple against S&P 500: 0.8\n",
1080 | "\n",
1081 | "[*********************100%***********************] 1 of 1 completed\n",
1082 | "Ticker: INTC; Returns Multiple against S&P 500: 0.94\n",
1083 | "\n",
1084 | "[*********************100%***********************] 1 of 1 completed\n",
1085 | "Ticker: INTU; Returns Multiple against S&P 500: 1.0\n",
1086 | "\n",
1087 | "[*********************100%***********************] 1 of 1 completed\n",
1088 | "Ticker: INVH; Returns Multiple against S&P 500: 0.87\n",
1089 | "\n",
1090 | "[*********************100%***********************] 1 of 1 completed\n",
1091 | "Ticker: IP; Returns Multiple against S&P 500: 0.82\n",
1092 | "\n",
1093 | "[*********************100%***********************] 1 of 1 completed\n",
1094 | "Ticker: IPG; Returns Multiple against S&P 500: 1.1\n",
1095 | "\n",
1096 | "[*********************100%***********************] 1 of 1 completed\n",
1097 | "Ticker: IQV; Returns Multiple against S&P 500: 0.86\n",
1098 | "\n",
1099 | "[*********************100%***********************] 1 of 1 completed\n",
1100 | "Ticker: IR; Returns Multiple against S&P 500: 1.25\n",
1101 | "\n",
1102 | "[*********************100%***********************] 1 of 1 completed\n",
1103 | "Ticker: IRM; Returns Multiple against S&P 500: 1.09\n",
1104 | "\n",
1105 | "[*********************100%***********************] 1 of 1 completed\n",
1106 | "Ticker: ISRG; Returns Multiple against S&P 500: 1.18\n",
1107 | "\n",
1108 | "[*********************100%***********************] 1 of 1 completed\n",
1109 | "Ticker: IT; Returns Multiple against S&P 500: 1.06\n",
1110 | "\n",
1111 | "[*********************100%***********************] 1 of 1 completed\n",
1112 | "Ticker: ITW; Returns Multiple against S&P 500: 1.12\n",
1113 | "\n",
1114 | "[*********************100%***********************] 1 of 1 completed\n",
1115 | "Ticker: IVZ; Returns Multiple against S&P 500: 0.9\n",
1116 | "\n",
1117 | "[*********************100%***********************] 1 of 1 completed\n",
1118 | "Ticker: J; Returns Multiple against S&P 500: 0.94\n",
1119 | "\n",
1120 | "[*********************100%***********************] 1 of 1 completed\n",
1121 | "Ticker: JBHT; Returns Multiple against S&P 500: 1.02\n",
1122 | "\n",
1123 | "[*********************100%***********************] 1 of 1 completed\n",
1124 | "Ticker: JCI; Returns Multiple against S&P 500: 1.07\n",
1125 | "\n",
1126 | "[*********************100%***********************] 1 of 1 completed\n",
1127 | "Ticker: JKHY; Returns Multiple against S&P 500: 0.76\n",
1128 | "\n",
1129 | "[*********************100%***********************] 1 of 1 completed\n",
1130 | "Ticker: JNJ; Returns Multiple against S&P 500: 0.96\n",
1131 | "\n",
1132 | "[*********************100%***********************] 1 of 1 completed\n",
1133 | "Ticker: JNPR; Returns Multiple against S&P 500: 0.94\n",
1134 | "\n",
1135 | "[*********************100%***********************] 1 of 1 completed\n",
1136 | "Ticker: JPM; Returns Multiple against S&P 500: 1.3\n",
1137 | "\n",
1138 | "[*********************100%***********************] 1 of 1 completed\n",
1139 | "Ticker: K; Returns Multiple against S&P 500: 0.82\n",
1140 | "\n",
1141 | "[*********************100%***********************] 1 of 1 completed\n",
1142 | "Ticker: KDP; Returns Multiple against S&P 500: 0.82\n",
1143 | "\n",
1144 | "[*********************100%***********************] 1 of 1 completed\n",
1145 | "Ticker: KEY; Returns Multiple against S&P 500: 0.64\n",
1146 | "\n",
1147 | "[*********************100%***********************] 1 of 1 completed\n",
1148 | "Ticker: KEYS; Returns Multiple against S&P 500: 0.88\n",
1149 | "\n",
1150 | "[*********************100%***********************] 1 of 1 completed\n",
1151 | "Ticker: KHC; Returns Multiple against S&P 500: 0.88\n",
1152 | "\n",
1153 | "[*********************100%***********************] 1 of 1 completed\n",
1154 | "Ticker: KIM; Returns Multiple against S&P 500: 0.88\n",
1155 | "\n",
1156 | "[*********************100%***********************] 1 of 1 completed\n",
1157 | "Ticker: KLAC; Returns Multiple against S&P 500: 1.21\n",
1158 | "\n"
1159 | ]
1160 | },
1161 | {
1162 | "name": "stdout",
1163 | "output_type": "stream",
1164 | "text": [
1165 | "[*********************100%***********************] 1 of 1 completed\n",
1166 | "Ticker: KMB; Returns Multiple against S&P 500: 0.91\n",
1167 | "\n",
1168 | "[*********************100%***********************] 1 of 1 completed\n",
1169 | "Ticker: KMI; Returns Multiple against S&P 500: 0.96\n",
1170 | "\n",
1171 | "[*********************100%***********************] 1 of 1 completed\n",
1172 | "Ticker: KMX; Returns Multiple against S&P 500: 0.78\n",
1173 | "\n",
1174 | "[*********************100%***********************] 1 of 1 completed\n",
1175 | "Ticker: KO; Returns Multiple against S&P 500: 0.92\n",
1176 | "\n",
1177 | "[*********************100%***********************] 1 of 1 completed\n",
1178 | "Ticker: KR; Returns Multiple against S&P 500: 0.99\n",
1179 | "\n",
1180 | "[*********************100%***********************] 1 of 1 completed\n",
1181 | "Ticker: L; Returns Multiple against S&P 500: 1.06\n",
1182 | "\n",
1183 | "[*********************100%***********************] 1 of 1 completed\n",
1184 | "Ticker: LDOS; Returns Multiple against S&P 500: 0.92\n",
1185 | "\n",
1186 | "[*********************100%***********************] 1 of 1 completed\n",
1187 | "Ticker: LEN; Returns Multiple against S&P 500: 1.37\n",
1188 | "\n",
1189 | "[*********************100%***********************] 1 of 1 completed\n",
1190 | "Ticker: LH; Returns Multiple against S&P 500: 0.91\n",
1191 | "\n",
1192 | "[*********************100%***********************] 1 of 1 completed\n",
1193 | "Ticker: LHX; Returns Multiple against S&P 500: 0.76\n",
1194 | "\n",
1195 | "[*********************100%***********************] 1 of 1 completed\n",
1196 | "Ticker: LIN; Returns Multiple against S&P 500: 1.19\n",
1197 | "\n",
1198 | "[*********************100%***********************] 1 of 1 completed\n",
1199 | "Ticker: LKQ; Returns Multiple against S&P 500: 0.93\n",
1200 | "\n",
1201 | "[*********************100%***********************] 1 of 1 completed\n",
1202 | "Ticker: LLY; Returns Multiple against S&P 500: 1.39\n",
1203 | "\n",
1204 | "[*********************100%***********************] 1 of 1 completed\n",
1205 | "Ticker: LMT; Returns Multiple against S&P 500: 1.0\n",
1206 | "\n",
1207 | "[*********************100%***********************] 1 of 1 completed\n",
1208 | "Ticker: LNC; Returns Multiple against S&P 500: 0.58\n",
1209 | "\n",
1210 | "[*********************100%***********************] 1 of 1 completed\n",
1211 | "Ticker: LNT; Returns Multiple against S&P 500: 0.8\n",
1212 | "\n",
1213 | "[*********************100%***********************] 1 of 1 completed\n",
1214 | "Ticker: LOW; Returns Multiple against S&P 500: 1.03\n",
1215 | "\n",
1216 | "[*********************100%***********************] 1 of 1 completed\n",
1217 | "Ticker: LRCX; Returns Multiple against S&P 500: 1.29\n",
1218 | "\n",
1219 | "[*********************100%***********************] 1 of 1 completed\n",
1220 | "Ticker: LUV; Returns Multiple against S&P 500: 0.79\n",
1221 | "\n",
1222 | "[*********************100%***********************] 1 of 1 completed\n",
1223 | "Ticker: LVS; Returns Multiple against S&P 500: 1.44\n",
1224 | "\n",
1225 | "[*********************100%***********************] 1 of 1 completed\n",
1226 | "Ticker: LW; Returns Multiple against S&P 500: 1.19\n",
1227 | "\n",
1228 | "[*********************100%***********************] 1 of 1 completed\n",
1229 | "Ticker: LYB; Returns Multiple against S&P 500: 1.11\n",
1230 | "\n",
1231 | "[*********************100%***********************] 1 of 1 completed\n",
1232 | "Ticker: LYV; Returns Multiple against S&P 500: 0.84\n",
1233 | "\n",
1234 | "[*********************100%***********************] 1 of 1 completed\n",
1235 | "Ticker: MA; Returns Multiple against S&P 500: 1.04\n",
1236 | "\n",
1237 | "[*********************100%***********************] 1 of 1 completed\n",
1238 | "Ticker: MAA; Returns Multiple against S&P 500: 0.78\n",
1239 | "\n",
1240 | "[*********************100%***********************] 1 of 1 completed\n",
1241 | "Ticker: MAR; Returns Multiple against S&P 500: 1.2\n",
1242 | "\n",
1243 | "[*********************100%***********************] 1 of 1 completed\n",
1244 | "Ticker: MAS; Returns Multiple against S&P 500: 1.06\n",
1245 | "\n",
1246 | "[*********************100%***********************] 1 of 1 completed\n",
1247 | "Ticker: MCD; Returns Multiple against S&P 500: 1.06\n",
1248 | "\n",
1249 | "[*********************100%***********************] 1 of 1 completed\n",
1250 | "Ticker: MCHP; Returns Multiple against S&P 500: 1.12\n",
1251 | "\n",
1252 | "[*********************100%***********************] 1 of 1 completed\n",
1253 | "Ticker: MCK; Returns Multiple against S&P 500: 1.12\n",
1254 | "\n",
1255 | "[*********************100%***********************] 1 of 1 completed\n",
1256 | "Ticker: MCO; Returns Multiple against S&P 500: 1.01\n",
1257 | "\n",
1258 | "[*********************100%***********************] 1 of 1 completed\n",
1259 | "Ticker: MDLZ; Returns Multiple against S&P 500: 1.09\n",
1260 | "\n",
1261 | "[*********************100%***********************] 1 of 1 completed\n",
1262 | "Ticker: MDT; Returns Multiple against S&P 500: 0.86\n",
1263 | "\n",
1264 | "[*********************100%***********************] 1 of 1 completed\n",
1265 | "Ticker: MET; Returns Multiple against S&P 500: 0.96\n",
1266 | "\n",
1267 | "[*********************100%***********************] 1 of 1 completed\n",
1268 | "Ticker: META; Returns Multiple against S&P 500: 1.7\n",
1269 | "\n",
1270 | "[*********************100%***********************] 1 of 1 completed\n",
1271 | "Ticker: MGM; Returns Multiple against S&P 500: 1.21\n",
1272 | "\n",
1273 | "[*********************100%***********************] 1 of 1 completed\n",
1274 | "Ticker: MHK; Returns Multiple against S&P 500: 0.79\n",
1275 | "\n",
1276 | "[*********************100%***********************] 1 of 1 completed\n",
1277 | "Ticker: MKC; Returns Multiple against S&P 500: 0.92\n",
1278 | "\n",
1279 | "[*********************100%***********************] 1 of 1 completed\n",
1280 | "Ticker: MKTX; Returns Multiple against S&P 500: 0.84\n",
1281 | "\n",
1282 | "[*********************100%***********************] 1 of 1 completed\n",
1283 | "Ticker: MLM; Returns Multiple against S&P 500: 1.21\n",
1284 | "\n",
1285 | "[*********************100%***********************] 1 of 1 completed\n",
1286 | "Ticker: MMC; Returns Multiple against S&P 500: 1.07\n",
1287 | "\n",
1288 | "[*********************100%***********************] 1 of 1 completed\n",
1289 | "Ticker: MMM; Returns Multiple against S&P 500: 0.68\n",
1290 | "\n",
1291 | "[*********************100%***********************] 1 of 1 completed\n",
1292 | "Ticker: MNST; Returns Multiple against S&P 500: 1.2\n",
1293 | "\n",
1294 | "[*********************100%***********************] 1 of 1 completed\n",
1295 | "Ticker: MO; Returns Multiple against S&P 500: 0.99\n",
1296 | "\n",
1297 | "[*********************100%***********************] 1 of 1 completed\n",
1298 | "Ticker: MOH; Returns Multiple against S&P 500: 0.87\n",
1299 | "\n",
1300 | "[*********************100%***********************] 1 of 1 completed\n",
1301 | "Ticker: MOS; Returns Multiple against S&P 500: 0.75\n",
1302 | "\n",
1303 | "[*********************100%***********************] 1 of 1 completed\n",
1304 | "Ticker: MPC; Returns Multiple against S&P 500: 1.46\n",
1305 | "\n",
1306 | "[*********************100%***********************] 1 of 1 completed\n",
1307 | "Ticker: MPWR; Returns Multiple against S&P 500: 0.93\n",
1308 | "\n",
1309 | "[*********************100%***********************] 1 of 1 completed\n",
1310 | "Ticker: MRK; Returns Multiple against S&P 500: 1.13\n",
1311 | "\n",
1312 | "[*********************100%***********************] 1 of 1 completed\n",
1313 | "Ticker: MRNA; Returns Multiple against S&P 500: 0.51\n",
1314 | "\n",
1315 | "[*********************100%***********************] 1 of 1 completed\n",
1316 | "Ticker: MRO; Returns Multiple against S&P 500: 1.11\n",
1317 | "\n",
1318 | "[*********************100%***********************] 1 of 1 completed\n",
1319 | "Ticker: MS; Returns Multiple against S&P 500: 0.98\n",
1320 | "\n",
1321 | "[*********************100%***********************] 1 of 1 completed\n",
1322 | "Ticker: MSCI; Returns Multiple against S&P 500: 1.02\n",
1323 | "\n",
1324 | "[*********************100%***********************] 1 of 1 completed\n",
1325 | "Ticker: MSFT; Returns Multiple against S&P 500: 1.09\n",
1326 | "\n",
1327 | "[*********************100%***********************] 1 of 1 completed\n",
1328 | "Ticker: MSI; Returns Multiple against S&P 500: 1.05\n",
1329 | "\n",
1330 | "[*********************100%***********************] 1 of 1 completed\n",
1331 | "Ticker: MTB; Returns Multiple against S&P 500: 0.75\n",
1332 | "\n",
1333 | "[*********************100%***********************] 1 of 1 completed\n",
1334 | "Ticker: MTCH; Returns Multiple against S&P 500: 0.58\n",
1335 | "\n",
1336 | "[*********************100%***********************] 1 of 1 completed\n",
1337 | "Ticker: MTD; Returns Multiple against S&P 500: 0.86\n",
1338 | "\n",
1339 | "[*********************100%***********************] 1 of 1 completed\n",
1340 | "Ticker: MU; Returns Multiple against S&P 500: 1.04\n",
1341 | "\n",
1342 | "[*********************100%***********************] 1 of 1 completed\n",
1343 | "Ticker: NCLH; Returns Multiple against S&P 500: 1.25\n",
1344 | "\n",
1345 | "[*********************100%***********************] 1 of 1 completed\n",
1346 | "Ticker: NDAQ; Returns Multiple against S&P 500: 0.76\n",
1347 | "\n",
1348 | "[*********************100%***********************] 1 of 1 completed\n",
1349 | "Ticker: NDSN; Returns Multiple against S&P 500: 0.99\n",
1350 | "\n",
1351 | "[*********************100%***********************] 1 of 1 completed\n",
1352 | "Ticker: NEE; Returns Multiple against S&P 500: 0.74\n",
1353 | "\n",
1354 | "[*********************100%***********************] 1 of 1 completed\n",
1355 | "Ticker: NEM; Returns Multiple against S&P 500: 0.87\n",
1356 | "\n",
1357 | "[*********************100%***********************] 1 of 1 completed\n",
1358 | "Ticker: NFLX; Returns Multiple against S&P 500: 1.73\n",
1359 | "\n",
1360 | "[*********************100%***********************] 1 of 1 completed\n",
1361 | "Ticker: NI; Returns Multiple against S&P 500: 0.85\n",
1362 | "\n",
1363 | "[*********************100%***********************] 1 of 1 completed\n",
1364 | "Ticker: NKE; Returns Multiple against S&P 500: 0.9\n",
1365 | "\n"
1366 | ]
1367 | },
1368 | {
1369 | "name": "stdout",
1370 | "output_type": "stream",
1371 | "text": [
1372 | "[*********************100%***********************] 1 of 1 completed\n",
1373 | "Ticker: NOC; Returns Multiple against S&P 500: 0.86\n",
1374 | "\n",
1375 | "[*********************100%***********************] 1 of 1 completed\n",
1376 | "Ticker: NOW; Returns Multiple against S&P 500: 1.03\n",
1377 | "\n",
1378 | "[*********************100%***********************] 1 of 1 completed\n",
1379 | "Ticker: NRG; Returns Multiple against S&P 500: 0.92\n",
1380 | "\n",
1381 | "[*********************100%***********************] 1 of 1 completed\n",
1382 | "Ticker: NSC; Returns Multiple against S&P 500: 0.84\n",
1383 | "\n",
1384 | "[*********************100%***********************] 1 of 1 completed\n",
1385 | "Ticker: NTAP; Returns Multiple against S&P 500: 1.02\n",
1386 | "\n",
1387 | "[*********************100%***********************] 1 of 1 completed\n",
1388 | "Ticker: NTRS; Returns Multiple against S&P 500: 0.77\n",
1389 | "\n",
1390 | "[*********************100%***********************] 1 of 1 completed\n",
1391 | "Ticker: NUE; Returns Multiple against S&P 500: 1.15\n",
1392 | "\n",
1393 | "[*********************100%***********************] 1 of 1 completed\n",
1394 | "Ticker: NVDA; Returns Multiple against S&P 500: 2.34\n",
1395 | "\n",
1396 | "[*********************100%***********************] 1 of 1 completed\n",
1397 | "Ticker: NVR; Returns Multiple against S&P 500: 1.34\n",
1398 | "\n",
1399 | "[*********************100%***********************] 1 of 1 completed\n",
1400 | "Ticker: NWL; Returns Multiple against S&P 500: 0.51\n",
1401 | "\n",
1402 | "[*********************100%***********************] 1 of 1 completed\n",
1403 | "Ticker: NWS; Returns Multiple against S&P 500: 1.09\n",
1404 | "\n",
1405 | "[*********************100%***********************] 1 of 1 completed\n",
1406 | "Ticker: NWSA; Returns Multiple against S&P 500: 1.08\n",
1407 | "\n",
1408 | "[*********************100%***********************] 1 of 1 completed\n",
1409 | "Ticker: NXPI; Returns Multiple against S&P 500: 1.14\n",
1410 | "\n",
1411 | "[*********************100%***********************] 1 of 1 completed\n",
1412 | "Ticker: O; Returns Multiple against S&P 500: 0.79\n",
1413 | "\n",
1414 | "[*********************100%***********************] 1 of 1 completed\n",
1415 | "Ticker: ODFL; Returns Multiple against S&P 500: 1.23\n",
1416 | "\n",
1417 | "[*********************100%***********************] 1 of 1 completed\n",
1418 | "Ticker: OGN; Returns Multiple against S&P 500: 0.66\n",
1419 | "\n",
1420 | "[*********************100%***********************] 1 of 1 completed\n",
1421 | "Ticker: OKE; Returns Multiple against S&P 500: 1.07\n",
1422 | "\n",
1423 | "[*********************100%***********************] 1 of 1 completed\n",
1424 | "Ticker: OMC; Returns Multiple against S&P 500: 1.1\n",
1425 | "\n",
1426 | "[*********************100%***********************] 1 of 1 completed\n",
1427 | "Ticker: ON; Returns Multiple against S&P 500: 1.41\n",
1428 | "\n",
1429 | "[*********************100%***********************] 1 of 1 completed\n",
1430 | "Ticker: ORCL; Returns Multiple against S&P 500: 1.41\n",
1431 | "\n",
1432 | "[*********************100%***********************] 1 of 1 completed\n",
1433 | "Ticker: ORLY; Returns Multiple against S&P 500: 1.2\n",
1434 | "\n",
1435 | "[*********************100%***********************] 1 of 1 completed\n",
1436 | "Ticker: OTIS; Returns Multiple against S&P 500: 1.06\n",
1437 | "\n",
1438 | "[*********************100%***********************] 1 of 1 completed\n",
1439 | "Ticker: OXY; Returns Multiple against S&P 500: 0.98\n",
1440 | "\n",
1441 | "[*********************100%***********************] 1 of 1 completed\n",
1442 | "Ticker: PANW; Returns Multiple against S&P 500: 1.18\n",
1443 | "\n",
1444 | "[*********************100%***********************] 1 of 1 completed\n",
1445 | "Ticker: PARA; Returns Multiple against S&P 500: 0.61\n",
1446 | "\n",
1447 | "[*********************100%***********************] 1 of 1 completed\n",
1448 | "Ticker: PAYC; Returns Multiple against S&P 500: 0.73\n",
1449 | "\n",
1450 | "[*********************100%***********************] 1 of 1 completed\n",
1451 | "Ticker: PAYX; Returns Multiple against S&P 500: 0.9\n",
1452 | "\n",
1453 | "[*********************100%***********************] 1 of 1 completed\n",
1454 | "Ticker: PCAR; Returns Multiple against S&P 500: 1.32\n",
1455 | "\n",
1456 | "[*********************100%***********************] 1 of 1 completed\n",
1457 | "Ticker: PCG; Returns Multiple against S&P 500: 1.42\n",
1458 | "\n",
1459 | "[*********************100%***********************] 1 of 1 completed\n",
1460 | "Ticker: PEAK; Returns Multiple against S&P 500: 0.76\n",
1461 | "\n",
1462 | "[*********************100%***********************] 1 of 1 completed\n",
1463 | "Ticker: PEG; Returns Multiple against S&P 500: 0.88\n",
1464 | "\n",
1465 | "[*********************100%***********************] 1 of 1 completed\n",
1466 | "Ticker: PEP; Returns Multiple against S&P 500: 1.01\n",
1467 | "\n",
1468 | "[*********************100%***********************] 1 of 1 completed\n",
1469 | "Ticker: PFE; Returns Multiple against S&P 500: 0.69\n",
1470 | "\n",
1471 | "[*********************100%***********************] 1 of 1 completed\n",
1472 | "Ticker: PFG; Returns Multiple against S&P 500: 1.1\n",
1473 | "\n",
1474 | "[*********************100%***********************] 1 of 1 completed\n",
1475 | "Ticker: PG; Returns Multiple against S&P 500: 1.02\n",
1476 | "\n",
1477 | "[*********************100%***********************] 1 of 1 completed\n",
1478 | "Ticker: PGR; Returns Multiple against S&P 500: 0.99\n",
1479 | "\n",
1480 | "[*********************100%***********************] 1 of 1 completed\n",
1481 | "Ticker: PH; Returns Multiple against S&P 500: 1.35\n",
1482 | "\n",
1483 | "[*********************100%***********************] 1 of 1 completed\n",
1484 | "Ticker: PHM; Returns Multiple against S&P 500: 1.83\n",
1485 | "\n",
1486 | "[*********************100%***********************] 1 of 1 completed\n",
1487 | "Ticker: PKG; Returns Multiple against S&P 500: 1.06\n",
1488 | "\n",
1489 | "[*********************100%***********************] 1 of 1 completed\n",
1490 | "Ticker: PLD; Returns Multiple against S&P 500: 0.89\n",
1491 | "\n",
1492 | "[*********************100%***********************] 1 of 1 completed\n",
1493 | "Ticker: PM; Returns Multiple against S&P 500: 0.96\n",
1494 | "\n",
1495 | "[*********************100%***********************] 1 of 1 completed\n",
1496 | "Ticker: PNC; Returns Multiple against S&P 500: 0.76\n",
1497 | "\n",
1498 | "[*********************100%***********************] 1 of 1 completed\n",
1499 | "Ticker: PNR; Returns Multiple against S&P 500: 1.32\n",
1500 | "\n",
1501 | "[*********************100%***********************] 1 of 1 completed\n",
1502 | "Ticker: PNW; Returns Multiple against S&P 500: 0.97\n",
1503 | "\n",
1504 | "[*********************100%***********************] 1 of 1 completed\n",
1505 | "Ticker: PODD; Returns Multiple against S&P 500: 0.91\n",
1506 | "\n",
1507 | "[*********************100%***********************] 1 of 1 completed\n",
1508 | "Ticker: POOL; Returns Multiple against S&P 500: 0.94\n",
1509 | "\n",
1510 | "[*********************100%***********************] 1 of 1 completed\n",
1511 | "Ticker: PPG; Returns Multiple against S&P 500: 1.04\n",
1512 | "\n",
1513 | "[*********************100%***********************] 1 of 1 completed\n",
1514 | "Ticker: PPL; Returns Multiple against S&P 500: 0.88\n",
1515 | "\n",
1516 | "[*********************100%***********************] 1 of 1 completed\n",
1517 | "Ticker: PRU; Returns Multiple against S&P 500: 0.97\n",
1518 | "\n",
1519 | "[*********************100%***********************] 1 of 1 completed\n",
1520 | "Ticker: PSA; Returns Multiple against S&P 500: 0.8\n",
1521 | "\n",
1522 | "[*********************100%***********************] 1 of 1 completed\n",
1523 | "Ticker: PSX; Returns Multiple against S&P 500: 1.27\n",
1524 | "\n",
1525 | "[*********************100%***********************] 1 of 1 completed\n",
1526 | "Ticker: PTC; Returns Multiple against S&P 500: 1.1\n",
1527 | "\n",
1528 | "[*********************100%***********************] 1 of 1 completed\n",
1529 | "Ticker: PWR; Returns Multiple against S&P 500: 1.35\n",
1530 | "\n",
1531 | "[*********************100%***********************] 1 of 1 completed\n",
1532 | "Ticker: PXD; Returns Multiple against S&P 500: 1.09\n",
1533 | "\n",
1534 | "[*********************100%***********************] 1 of 1 completed\n",
1535 | "Ticker: PYPL; Returns Multiple against S&P 500: 0.61\n",
1536 | "\n",
1537 | "[*********************100%***********************] 1 of 1 completed\n",
1538 | "Ticker: QCOM; Returns Multiple against S&P 500: 0.76\n",
1539 | "\n",
1540 | "[*********************100%***********************] 1 of 1 completed\n",
1541 | "Ticker: QRVO; Returns Multiple against S&P 500: 0.92\n",
1542 | "\n",
1543 | "[*********************100%***********************] 1 of 1 completed\n",
1544 | "Ticker: RCL; Returns Multiple against S&P 500: 2.46\n",
1545 | "\n",
1546 | "[*********************100%***********************] 1 of 1 completed\n",
1547 | "Ticker: REG; Returns Multiple against S&P 500: 0.99\n",
1548 | "\n",
1549 | "[*********************100%***********************] 1 of 1 completed\n",
1550 | "Ticker: REGN; Returns Multiple against S&P 500: 1.13\n",
1551 | "\n",
1552 | "[*********************100%***********************] 1 of 1 completed\n",
1553 | "Ticker: RF; Returns Multiple against S&P 500: 0.94\n",
1554 | "\n",
1555 | "[*********************100%***********************] 1 of 1 completed\n",
1556 | "Ticker: RHI; Returns Multiple against S&P 500: 0.9\n",
1557 | "\n",
1558 | "[*********************100%***********************] 1 of 1 completed\n",
1559 | "Ticker: RJF; Returns Multiple against S&P 500: 0.99\n",
1560 | "\n",
1561 | "[*********************100%***********************] 1 of 1 completed\n",
1562 | "Ticker: RL; Returns Multiple against S&P 500: 1.23\n",
1563 | "\n",
1564 | "[*********************100%***********************] 1 of 1 completed\n",
1565 | "Ticker: RMD; Returns Multiple against S&P 500: 0.73\n",
1566 | "\n",
1567 | "[*********************100%***********************] 1 of 1 completed\n",
1568 | "Ticker: ROK; Returns Multiple against S&P 500: 1.16\n",
1569 | "\n",
1570 | "[*********************100%***********************] 1 of 1 completed\n",
1571 | "Ticker: ROL; Returns Multiple against S&P 500: 0.99\n",
1572 | "\n"
1573 | ]
1574 | },
1575 | {
1576 | "name": "stdout",
1577 | "output_type": "stream",
1578 | "text": [
1579 | "[*********************100%***********************] 1 of 1 completed\n",
1580 | "Ticker: ROP; Returns Multiple against S&P 500: 1.05\n",
1581 | "\n",
1582 | "[*********************100%***********************] 1 of 1 completed\n",
1583 | "Ticker: ROST; Returns Multiple against S&P 500: 1.23\n",
1584 | "\n",
1585 | "[*********************100%***********************] 1 of 1 completed\n",
1586 | "Ticker: RSG; Returns Multiple against S&P 500: 0.97\n",
1587 | "\n",
1588 | "[*********************100%***********************] 1 of 1 completed\n",
1589 | "Ticker: RTX; Returns Multiple against S&P 500: 0.88\n",
1590 | "\n",
1591 | "[*********************100%***********************] 1 of 1 completed\n",
1592 | "Ticker: RVTY; Returns Multiple against S&P 500: 0.73\n",
1593 | "\n",
1594 | "[*********************100%***********************] 1 of 1 completed\n",
1595 | "Ticker: SBAC; Returns Multiple against S&P 500: 0.59\n",
1596 | "\n",
1597 | "[*********************100%***********************] 1 of 1 completed\n",
1598 | "Ticker: SBUX; Returns Multiple against S&P 500: 1.11\n",
1599 | "\n",
1600 | "[*********************100%***********************] 1 of 1 completed\n",
1601 | "Ticker: SCHW; Returns Multiple against S&P 500: 0.9\n",
1602 | "\n",
1603 | "[*********************100%***********************] 1 of 1 completed\n",
1604 | "Ticker: SEDG; Returns Multiple against S&P 500: 0.55\n",
1605 | "\n",
1606 | "[*********************100%***********************] 1 of 1 completed\n",
1607 | "Ticker: SEE; Returns Multiple against S&P 500: 0.72\n",
1608 | "\n",
1609 | "[*********************100%***********************] 1 of 1 completed\n",
1610 | "Ticker: SHW; Returns Multiple against S&P 500: 1.06\n",
1611 | "\n",
1612 | "[*********************100%***********************] 1 of 1 completed\n",
1613 | "Ticker: SJM; Returns Multiple against S&P 500: 1.06\n",
1614 | "\n",
1615 | "[*********************100%***********************] 1 of 1 completed\n",
1616 | "Ticker: SLB; Returns Multiple against S&P 500: 1.56\n",
1617 | "\n",
1618 | "[*********************100%***********************] 1 of 1 completed\n",
1619 | "Ticker: SNA; Returns Multiple against S&P 500: 1.15\n",
1620 | "\n",
1621 | "[*********************100%***********************] 1 of 1 completed\n",
1622 | "Ticker: SNPS; Returns Multiple against S&P 500: 1.09\n",
1623 | "\n",
1624 | "[*********************100%***********************] 1 of 1 completed\n",
1625 | "Ticker: SO; Returns Multiple against S&P 500: 0.84\n",
1626 | "\n",
1627 | "[*********************100%***********************] 1 of 1 completed\n",
1628 | "Ticker: SPG; Returns Multiple against S&P 500: 1.07\n",
1629 | "\n",
1630 | "[*********************100%***********************] 1 of 1 completed\n",
1631 | "Ticker: SPGI; Returns Multiple against S&P 500: 0.96\n",
1632 | "\n",
1633 | "[*********************100%***********************] 1 of 1 completed\n",
1634 | "Ticker: SRE; Returns Multiple against S&P 500: 0.84\n",
1635 | "\n",
1636 | "[*********************100%***********************] 1 of 1 completed\n",
1637 | "Ticker: STE; Returns Multiple against S&P 500: 0.98\n",
1638 | "\n",
1639 | "[*********************100%***********************] 1 of 1 completed\n",
1640 | "Ticker: STLD; Returns Multiple against S&P 500: 1.23\n",
1641 | "\n",
1642 | "[*********************100%***********************] 1 of 1 completed\n",
1643 | "Ticker: STT; Returns Multiple against S&P 500: 1.0\n",
1644 | "\n",
1645 | "[*********************100%***********************] 1 of 1 completed\n",
1646 | "Ticker: STX; Returns Multiple against S&P 500: 0.81\n",
1647 | "\n",
1648 | "[*********************100%***********************] 1 of 1 completed\n",
1649 | "Ticker: STZ; Returns Multiple against S&P 500: 1.07\n",
1650 | "\n",
1651 | "[*********************100%***********************] 1 of 1 completed\n",
1652 | "Ticker: SWK; Returns Multiple against S&P 500: 0.97\n",
1653 | "\n",
1654 | "[*********************100%***********************] 1 of 1 completed\n",
1655 | "Ticker: SWKS; Returns Multiple against S&P 500: 0.92\n",
1656 | "\n",
1657 | "[*********************100%***********************] 1 of 1 completed\n",
1658 | "Ticker: SYF; Returns Multiple against S&P 500: 0.95\n",
1659 | "\n",
1660 | "[*********************100%***********************] 1 of 1 completed\n",
1661 | "Ticker: SYK; Returns Multiple against S&P 500: 1.22\n",
1662 | "\n",
1663 | "[*********************100%***********************] 1 of 1 completed\n",
1664 | "Ticker: SYY; Returns Multiple against S&P 500: 0.8\n",
1665 | "\n",
1666 | "[*********************100%***********************] 1 of 1 completed\n",
1667 | "Ticker: T; Returns Multiple against S&P 500: 0.76\n",
1668 | "\n",
1669 | "[*********************100%***********************] 1 of 1 completed\n",
1670 | "Ticker: TAP; Returns Multiple against S&P 500: 1.12\n",
1671 | "\n",
1672 | "[*********************100%***********************] 1 of 1 completed\n",
1673 | "Ticker: TDG; Returns Multiple against S&P 500: 1.34\n",
1674 | "\n",
1675 | "[*********************100%***********************] 1 of 1 completed\n",
1676 | "Ticker: TDY; Returns Multiple against S&P 500: 0.89\n",
1677 | "\n",
1678 | "[*********************100%***********************] 1 of 1 completed\n",
1679 | "Ticker: TECH; Returns Multiple against S&P 500: 0.8\n",
1680 | "\n",
1681 | "[*********************100%***********************] 1 of 1 completed\n",
1682 | "Ticker: TEL; Returns Multiple against S&P 500: 0.98\n",
1683 | "\n",
1684 | "[*********************100%***********************] 1 of 1 completed\n",
1685 | "Ticker: TER; Returns Multiple against S&P 500: 1.01\n",
1686 | "\n",
1687 | "[*********************100%***********************] 1 of 1 completed\n",
1688 | "Ticker: TFC; Returns Multiple against S&P 500: 0.63\n",
1689 | "\n",
1690 | "[*********************100%***********************] 1 of 1 completed\n",
1691 | "Ticker: TFX; Returns Multiple against S&P 500: 0.86\n",
1692 | "\n",
1693 | "[*********************100%***********************] 1 of 1 completed\n",
1694 | "Ticker: TGT; Returns Multiple against S&P 500: 0.74\n",
1695 | "\n",
1696 | "[*********************100%***********************] 1 of 1 completed\n",
1697 | "Ticker: TJX; Returns Multiple against S&P 500: 1.26\n",
1698 | "\n",
1699 | "[*********************100%***********************] 1 of 1 completed\n",
1700 | "Ticker: TMO; Returns Multiple against S&P 500: 0.87\n",
1701 | "\n",
1702 | "[*********************100%***********************] 1 of 1 completed\n",
1703 | "Ticker: TMUS; Returns Multiple against S&P 500: 0.87\n",
1704 | "\n",
1705 | "[*********************100%***********************] 1 of 1 completed\n",
1706 | "Ticker: TPR; Returns Multiple against S&P 500: 1.16\n",
1707 | "\n",
1708 | "[*********************100%***********************] 1 of 1 completed\n",
1709 | "Ticker: TRGP; Returns Multiple against S&P 500: 1.18\n",
1710 | "\n",
1711 | "[*********************100%***********************] 1 of 1 completed\n",
1712 | "Ticker: TRMB; Returns Multiple against S&P 500: 0.74\n",
1713 | "\n",
1714 | "[*********************100%***********************] 1 of 1 completed\n",
1715 | "Ticker: TROW; Returns Multiple against S&P 500: 0.87\n",
1716 | "\n",
1717 | "[*********************100%***********************] 1 of 1 completed\n",
1718 | "Ticker: TRV; Returns Multiple against S&P 500: 1.0\n",
1719 | "\n",
1720 | "[*********************100%***********************] 1 of 1 completed\n",
1721 | "Ticker: TSCO; Returns Multiple against S&P 500: 1.08\n",
1722 | "\n",
1723 | "[*********************100%***********************] 1 of 1 completed\n",
1724 | "Ticker: TSLA; Returns Multiple against S&P 500: 0.79\n",
1725 | "\n",
1726 | "[*********************100%***********************] 1 of 1 completed\n",
1727 | "Ticker: TSN; Returns Multiple against S&P 500: 0.64\n",
1728 | "\n",
1729 | "[*********************100%***********************] 1 of 1 completed\n",
1730 | "Ticker: TT; Returns Multiple against S&P 500: 1.24\n",
1731 | "\n",
1732 | "[*********************100%***********************] 1 of 1 completed\n",
1733 | "Ticker: TTWO; Returns Multiple against S&P 500: 1.03\n",
1734 | "\n",
1735 | "[*********************100%***********************] 1 of 1 completed\n",
1736 | "Ticker: TXN; Returns Multiple against S&P 500: 0.87\n",
1737 | "\n",
1738 | "[*********************100%***********************] 1 of 1 completed\n",
1739 | "Ticker: TXT; Returns Multiple against S&P 500: 1.13\n",
1740 | "\n",
1741 | "[*********************100%***********************] 1 of 1 completed\n",
1742 | "Ticker: TYL; Returns Multiple against S&P 500: 0.85\n",
1743 | "\n",
1744 | "[*********************100%***********************] 1 of 1 completed\n",
1745 | "Ticker: UAL; Returns Multiple against S&P 500: 1.27\n",
1746 | "\n",
1747 | "[*********************100%***********************] 1 of 1 completed\n",
1748 | "Ticker: UDR; Returns Multiple against S&P 500: 0.82\n",
1749 | "\n",
1750 | "[*********************100%***********************] 1 of 1 completed\n",
1751 | "Ticker: UHS; Returns Multiple against S&P 500: 1.14\n",
1752 | "\n",
1753 | "[*********************100%***********************] 1 of 1 completed\n",
1754 | "Ticker: ULTA; Returns Multiple against S&P 500: 1.06\n",
1755 | "\n",
1756 | "[*********************100%***********************] 1 of 1 completed\n",
1757 | "Ticker: UNH; Returns Multiple against S&P 500: 0.88\n",
1758 | "\n",
1759 | "[*********************100%***********************] 1 of 1 completed\n",
1760 | "Ticker: UNP; Returns Multiple against S&P 500: 0.95\n",
1761 | "\n",
1762 | "[*********************100%***********************] 1 of 1 completed\n",
1763 | "Ticker: UPS; Returns Multiple against S&P 500: 0.88\n",
1764 | "\n",
1765 | "[*********************100%***********************] 1 of 1 completed\n",
1766 | "Ticker: URI; Returns Multiple against S&P 500: 1.39\n",
1767 | "\n",
1768 | "[*********************100%***********************] 1 of 1 completed\n",
1769 | "Ticker: USB; Returns Multiple against S&P 500: 0.82\n",
1770 | "\n",
1771 | "[*********************100%***********************] 1 of 1 completed\n",
1772 | "Ticker: V; Returns Multiple against S&P 500: 1.05\n",
1773 | "\n",
1774 | "[*********************100%***********************] 1 of 1 completed\n",
1775 | "Ticker: VFC; Returns Multiple against S&P 500: 0.41\n",
1776 | "\n",
1777 | "[*********************100%***********************] 1 of 1 completed\n",
1778 | "Ticker: VICI; Returns Multiple against S&P 500: 0.87\n",
1779 | "\n"
1780 | ]
1781 | },
1782 | {
1783 | "name": "stdout",
1784 | "output_type": "stream",
1785 | "text": [
1786 | "[*********************100%***********************] 1 of 1 completed\n",
1787 | "Ticker: VLO; Returns Multiple against S&P 500: 1.15\n",
1788 | "\n",
1789 | "[*********************100%***********************] 1 of 1 completed\n",
1790 | "Ticker: VMC; Returns Multiple against S&P 500: 1.23\n",
1791 | "\n",
1792 | "[*********************100%***********************] 1 of 1 completed\n",
1793 | "Ticker: VRSK; Returns Multiple against S&P 500: 1.08\n",
1794 | "\n",
1795 | "[*********************100%***********************] 1 of 1 completed\n",
1796 | "Ticker: VRSN; Returns Multiple against S&P 500: 0.95\n",
1797 | "\n",
1798 | "[*********************100%***********************] 1 of 1 completed\n",
1799 | "Ticker: VRTX; Returns Multiple against S&P 500: 1.08\n",
1800 | "\n",
1801 | "[*********************100%***********************] 1 of 1 completed\n",
1802 | "Ticker: VTR; Returns Multiple against S&P 500: 0.88\n",
1803 | "\n",
1804 | "[*********************100%***********************] 1 of 1 completed\n",
1805 | "Ticker: VTRS; Returns Multiple against S&P 500: 1.05\n",
1806 | "\n",
1807 | "[*********************100%***********************] 1 of 1 completed\n",
1808 | "Ticker: VZ; Returns Multiple against S&P 500: 0.72\n",
1809 | "\n",
1810 | "[*********************100%***********************] 1 of 1 completed\n",
1811 | "Ticker: WAB; Returns Multiple against S&P 500: 1.15\n",
1812 | "\n",
1813 | "[*********************100%***********************] 1 of 1 completed\n",
1814 | "Ticker: WAT; Returns Multiple against S&P 500: 0.8\n",
1815 | "\n",
1816 | "[*********************100%***********************] 1 of 1 completed\n",
1817 | "Ticker: WBA; Returns Multiple against S&P 500: 0.73\n",
1818 | "\n",
1819 | "[*********************100%***********************] 1 of 1 completed\n",
1820 | "Ticker: WBD; Returns Multiple against S&P 500: 0.95\n",
1821 | "\n",
1822 | "[*********************100%***********************] 1 of 1 completed\n",
1823 | "Ticker: WDC; Returns Multiple against S&P 500: 0.84\n",
1824 | "\n",
1825 | "[*********************100%***********************] 1 of 1 completed\n",
1826 | "Ticker: WEC; Returns Multiple against S&P 500: 0.8\n",
1827 | "\n",
1828 | "[*********************100%***********************] 1 of 1 completed\n",
1829 | "Ticker: WELL; Returns Multiple against S&P 500: 0.98\n",
1830 | "\n",
1831 | "[*********************100%***********************] 1 of 1 completed\n",
1832 | "Ticker: WFC; Returns Multiple against S&P 500: 0.98\n",
1833 | "\n",
1834 | "[*********************100%***********************] 1 of 1 completed\n",
1835 | "Ticker: WHR; Returns Multiple against S&P 500: 0.83\n",
1836 | "\n",
1837 | "[*********************100%***********************] 1 of 1 completed\n",
1838 | "Ticker: WM; Returns Multiple against S&P 500: 0.89\n",
1839 | "\n",
1840 | "[*********************100%***********************] 1 of 1 completed\n",
1841 | "Ticker: WMB; Returns Multiple against S&P 500: 1.03\n",
1842 | "\n",
1843 | "[*********************100%***********************] 1 of 1 completed\n",
1844 | "Ticker: WMT; Returns Multiple against S&P 500: 1.17\n",
1845 | "\n",
1846 | "[*********************100%***********************] 1 of 1 completed\n",
1847 | "Ticker: WRB; Returns Multiple against S&P 500: 0.94\n",
1848 | "\n",
1849 | "[*********************100%***********************] 1 of 1 completed\n",
1850 | "Ticker: WRK; Returns Multiple against S&P 500: 0.8\n",
1851 | "\n",
1852 | "[*********************100%***********************] 1 of 1 completed\n",
1853 | "Ticker: WST; Returns Multiple against S&P 500: 1.03\n",
1854 | "\n",
1855 | "[*********************100%***********************] 1 of 1 completed\n",
1856 | "Ticker: WTW; Returns Multiple against S&P 500: 0.93\n",
1857 | "\n",
1858 | "[*********************100%***********************] 1 of 1 completed\n",
1859 | "Ticker: WY; Returns Multiple against S&P 500: 0.9\n",
1860 | "\n",
1861 | "[*********************100%***********************] 1 of 1 completed\n",
1862 | "Ticker: WYNN; Returns Multiple against S&P 500: 1.46\n",
1863 | "\n",
1864 | "[*********************100%***********************] 1 of 1 completed\n",
1865 | "Ticker: XEL; Returns Multiple against S&P 500: 0.76\n",
1866 | "\n",
1867 | "[*********************100%***********************] 1 of 1 completed\n",
1868 | "Ticker: XOM; Returns Multiple against S&P 500: 1.14\n",
1869 | "\n",
1870 | "[*********************100%***********************] 1 of 1 completed\n",
1871 | "Ticker: XRAY; Returns Multiple against S&P 500: 0.99\n",
1872 | "\n",
1873 | "[*********************100%***********************] 1 of 1 completed\n",
1874 | "Ticker: XYL; Returns Multiple against S&P 500: 1.0\n",
1875 | "\n",
1876 | "[*********************100%***********************] 1 of 1 completed\n",
1877 | "Ticker: YUM; Returns Multiple against S&P 500: 1.06\n",
1878 | "\n",
1879 | "[*********************100%***********************] 1 of 1 completed\n",
1880 | "Ticker: ZBH; Returns Multiple against S&P 500: 1.03\n",
1881 | "\n",
1882 | "[*********************100%***********************] 1 of 1 completed\n",
1883 | "Ticker: ZBRA; Returns Multiple against S&P 500: 0.69\n",
1884 | "\n",
1885 | "[*********************100%***********************] 1 of 1 completed\n",
1886 | "Ticker: ZION; Returns Multiple against S&P 500: 0.67\n",
1887 | "\n",
1888 | "[*********************100%***********************] 1 of 1 completed\n",
1889 | "Ticker: ZTS; Returns Multiple against S&P 500: 0.96\n",
1890 | "\n"
1891 | ]
1892 | }
1893 | ],
1894 | "source": [
1895 | "# Index Returns\n",
1896 | "index_df = pdr.get_data_yahoo(index_name, start_date, end_date)\n",
1897 | "index_df['Percent Change'] = index_df['Adj Close'].pct_change()\n",
1898 | "index_return = (index_df['Percent Change'] + 1).cumprod()[-1]\n",
1899 | "\n",
1900 | "if not os.path.exists('ScanMarket'):\n",
1901 | " os.makedirs('ScanMarket')\n",
1902 | "\n",
1903 | "# Find top 30% performing stocks (relative to the S&P 500)\n",
1904 | "for ticker in tickers:\n",
1905 | " # Download historical data as CSV for each stock (makes the process faster)\n",
1906 | " df = pdr.get_data_yahoo(ticker, start_date, end_date)\n",
1907 | " df.to_csv(f'ScanMarket/{ticker}.csv')\n",
1908 | "\n",
1909 | " # Calculating returns relative to the market (returns multiple)\n",
1910 | " df['Percent Change'] = df['Adj Close'].pct_change()\n",
1911 | " stock_return = (df['Percent Change'] + 1).cumprod()[-1]\n",
1912 | " \n",
1913 | " returns_multiple = round((stock_return / index_return), 2)\n",
1914 | " returns_multiples.extend([returns_multiple])\n",
1915 | " \n",
1916 | " print (f'Ticker: {ticker}; Returns Multiple against S&P 500: {returns_multiple}\\n')\n",
1917 | " time.sleep(1)\n",
1918 | "\n",
1919 | "# Creating dataframe of only top 30%\n",
1920 | "rs_df = pd.DataFrame(list(zip(tickers, returns_multiples)), columns=['Ticker', 'Returns_multiple'])\n",
1921 | "rs_df['RS_Rating'] = rs_df.Returns_multiple.rank(pct=True) * 100\n",
1922 | "rs_df = rs_df[rs_df.RS_Rating >= rs_df.RS_Rating.quantile(.70)]"
1923 | ]
1924 | },
1925 | {
1926 | "cell_type": "code",
1927 | "execution_count": 35,
1928 | "id": "acd08f62",
1929 | "metadata": {},
1930 | "outputs": [
1931 | {
1932 | "name": "stdout",
1933 | "output_type": "stream",
1934 | "text": [
1935 | "ABC made the Minervini requirements\n",
1936 | "ACGL made the Minervini requirements\n",
1937 | "ADBE made the Minervini requirements\n",
1938 | "AFL made the Minervini requirements\n",
1939 | "AJG made the Minervini requirements\n",
1940 | "ALGN made the Minervini requirements\n",
1941 | "AMAT made the Minervini requirements\n",
1942 | "AMD made the Minervini requirements\n",
1943 | "AME made the Minervini requirements\n",
1944 | "AMP made the Minervini requirements\n",
1945 | "ANET made the Minervini requirements\n",
1946 | "AOS made the Minervini requirements\n",
1947 | "AVGO made the Minervini requirements\n",
1948 | "BA made the Minervini requirements\n",
1949 | "BKNG made the Minervini requirements\n",
1950 | "BKR made the Minervini requirements\n",
1951 | "BRK-B made the Minervini requirements\n",
1952 | "CAH made the Minervini requirements\n",
1953 | "CARR made the Minervini requirements\n",
1954 | "CAT made the Minervini requirements\n",
1955 | "CCL made the Minervini requirements\n",
1956 | "CMCSA made the Minervini requirements\n",
1957 | "COO made the Minervini requirements\n",
1958 | "CPRT made the Minervini requirements\n",
1959 | "CSCO made the Minervini requirements\n",
1960 | "CTAS made the Minervini requirements\n",
1961 | "DAL made the Minervini requirements\n",
1962 | "DD made the Minervini requirements\n",
1963 | "DHI made the Minervini requirements\n",
1964 | "DRI made the Minervini requirements\n",
1965 | "DVA made the Minervini requirements\n",
1966 | "ETN made the Minervini requirements\n",
1967 | "EXPD made the Minervini requirements\n",
1968 | "FDX made the Minervini requirements\n",
1969 | "FI made the Minervini requirements\n",
1970 | "FICO made the Minervini requirements\n",
1971 | "FSLR made the Minervini requirements\n",
1972 | "FTV made the Minervini requirements\n",
1973 | "GE made the Minervini requirements\n",
1974 | "HLT made the Minervini requirements\n",
1975 | "HPE made the Minervini requirements\n",
1976 | "HWM made the Minervini requirements\n",
1977 | "IDXX made the Minervini requirements\n",
1978 | "IR made the Minervini requirements\n",
1979 | "IRM made the Minervini requirements\n",
1980 | "ITW made the Minervini requirements\n",
1981 | "JPM made the Minervini requirements\n",
1982 | "KLAC made the Minervini requirements\n",
1983 | "LEN made the Minervini requirements\n",
1984 | "LIN made the Minervini requirements\n",
1985 | "LLY made the Minervini requirements\n",
1986 | "LRCX made the Minervini requirements\n",
1987 | "LVS made the Minervini requirements\n",
1988 | "LYB made the Minervini requirements\n",
1989 | "MAR made the Minervini requirements\n",
1990 | "MDLZ made the Minervini requirements\n",
1991 | "META made the Minervini requirements\n",
1992 | "MGM made the Minervini requirements\n",
1993 | "MLM made the Minervini requirements\n",
1994 | "MNST made the Minervini requirements\n",
1995 | "NFLX made the Minervini requirements\n",
1996 | "NUE made the Minervini requirements\n",
1997 | "NVDA made the Minervini requirements\n",
1998 | "NVR made the Minervini requirements\n",
1999 | "NWS made the Minervini requirements\n",
2000 | "NWSA made the Minervini requirements\n",
2001 | "NXPI made the Minervini requirements\n",
2002 | "ODFL made the Minervini requirements\n",
2003 | "ON made the Minervini requirements\n",
2004 | "ORCL made the Minervini requirements\n",
2005 | "PCAR made the Minervini requirements\n",
2006 | "PCG made the Minervini requirements\n",
2007 | "PH made the Minervini requirements\n",
2008 | "PHM made the Minervini requirements\n",
2009 | "PNR made the Minervini requirements\n",
2010 | "PTC made the Minervini requirements\n",
2011 | "PWR made the Minervini requirements\n",
2012 | "RCL made the Minervini requirements\n",
2013 | "RL made the Minervini requirements\n",
2014 | "SLB made the Minervini requirements\n",
2015 | "SNPS made the Minervini requirements\n",
2016 | "SPG made the Minervini requirements\n",
2017 | "TDG made the Minervini requirements\n",
2018 | "TJX made the Minervini requirements\n",
2019 | "TRGP made the Minervini requirements\n",
2020 | "TT made the Minervini requirements\n",
2021 | "UAL made the Minervini requirements\n",
2022 | "URI made the Minervini requirements\n",
2023 | "VMC made the Minervini requirements\n",
2024 | "VRSK made the Minervini requirements\n",
2025 | "WAB made the Minervini requirements\n"
2026 | ]
2027 | }
2028 | ],
2029 | "source": [
2030 | "# Checking Minervini conditions of top 30% of stocks in given list\n",
2031 | "rs_stocks = rs_df['Ticker']\n",
2032 | "for stock in rs_stocks: \n",
2033 | " try:\n",
2034 | " df = pd.read_csv(f'ScanMarket/{stock}.csv', index_col=0)\n",
2035 | " sma = [50, 150, 200]\n",
2036 | " for x in sma:\n",
2037 | " df[\"SMA_\"+str(x)] = round(df['Adj Close'].rolling(window=x).mean(), 2)\n",
2038 | " \n",
2039 | " # Storing required values \n",
2040 | " currentClose = df[\"Adj Close\"][-1]\n",
2041 | " moving_average_50 = df[\"SMA_50\"][-1]\n",
2042 | " moving_average_150 = df[\"SMA_150\"][-1]\n",
2043 | " moving_average_200 = df[\"SMA_200\"][-1]\n",
2044 | " low_of_52week = round(min(df[\"Low\"][-260:]), 2)\n",
2045 | " high_of_52week = round(max(df[\"High\"][-260:]), 2)\n",
2046 | " RS_Rating = round(rs_df[rs_df['Ticker']==stock].RS_Rating.tolist()[0])\n",
2047 | " \n",
2048 | " try:\n",
2049 | " moving_average_200_20 = df[\"SMA_200\"][-20]\n",
2050 | " except Exception:\n",
2051 | " moving_average_200_20 = 0\n",
2052 | "\n",
2053 | " # Condition 1: Current Price > 150 SMA and > 200 SMA\n",
2054 | " condition_1 = currentClose > moving_average_150 > moving_average_200\n",
2055 | " \n",
2056 | " # Condition 2: 150 SMA and > 200 SMA\n",
2057 | " condition_2 = moving_average_150 > moving_average_200\n",
2058 | "\n",
2059 | " # Condition 3: 200 SMA trending up for at least 1 month\n",
2060 | " condition_3 = moving_average_200 > moving_average_200_20\n",
2061 | " \n",
2062 | " # Condition 4: 50 SMA> 150 SMA and 50 SMA> 200 SMA\n",
2063 | " condition_4 = moving_average_50 > moving_average_150 > moving_average_200\n",
2064 | " \n",
2065 | " # Condition 5: Current Price > 50 SMA\n",
2066 | " condition_5 = currentClose > moving_average_50\n",
2067 | " \n",
2068 | " # Condition 6: Current Price is at least 30% above 52 week low\n",
2069 | " condition_6 = currentClose >= (1.3*low_of_52week)\n",
2070 | " \n",
2071 | " # Condition 7: Current Price is within 25% of 52 week high\n",
2072 | " condition_7 = currentClose >= (.75*high_of_52week)\n",
2073 | " \n",
2074 | " # If all conditions above are true, add stock to exportList\n",
2075 | " if(condition_1 and condition_2 and condition_3 and condition_4 and condition_5 and condition_6 and condition_7):\n",
2076 | " new_row = pd.DataFrame({'Stock': [stock], \n",
2077 | " \"RS_Rating\": [RS_Rating], \n",
2078 | " \"50 Day MA\": [moving_average_50], \n",
2079 | " \"150 Day Ma\": [moving_average_150], \n",
2080 | " \"200 Day MA\": [moving_average_200], \n",
2081 | " \"52 Week Low\": [low_of_52week], \n",
2082 | " \"52 week High\": [high_of_52week]})\n",
2083 | "\n",
2084 | " exportList = pd.concat([exportList, new_row], ignore_index=True)\n",
2085 | " print (stock + \" made the Minervini requirements\")\n",
2086 | " except Exception as e:\n",
2087 | " print (e)\n",
2088 | " print(f\"Could not gather data on {stock}\")\n",
2089 | "\n",
2090 | "#writer = ExcelWriter(\"ScanMarket/ScreenOutput.xlsx\")\n",
2091 | "#exportList.to_excel(writer, \"Sheet1\")\n",
2092 | "#writer.save()"
2093 | ]
2094 | },
2095 | {
2096 | "cell_type": "markdown",
2097 | "id": "65f316b9",
2098 | "metadata": {},
2099 | "source": [
2100 | "### Example 2: Based on Tentative Technical Analysis Indicators\n",
2101 | "\n",
2102 | "Overall, this code automates the process of screening stocks within the S&P 500 based on a blend of technical indicators, focusing on Exponential Moving Averages and Stochastic Oscillator, to potentially identify investment opportunities."
2103 | ]
2104 | },
2105 | {
2106 | "cell_type": "code",
2107 | "execution_count": 54,
2108 | "id": "87faaf7e",
2109 | "metadata": {},
2110 | "outputs": [],
2111 | "source": [
2112 | "import yfinance as yf\n",
2113 | "import pandas as pd\n",
2114 | "from yahoo_fin import stock_info as si"
2115 | ]
2116 | },
2117 | {
2118 | "cell_type": "code",
2119 | "execution_count": 52,
2120 | "id": "69665213",
2121 | "metadata": {},
2122 | "outputs": [],
2123 | "source": [
2124 | "def get_stock_price(code):\n",
2125 | " # you can change the start date\n",
2126 | " data = yf.download(code, start=\"2023-01-01\", progress=False, threads= False)\n",
2127 | " return data\n",
2128 | "\n",
2129 | "def add_EMA(price, day):\n",
2130 | " return price.ewm(span=day).mean()\n",
2131 | "\n",
2132 | "def add_STOCH(close, low, high, period, k, d=0): \n",
2133 | " STOCH_K = ((close - low.rolling(window=period).min()) / (high.rolling(window=period).max() - low.rolling(window=period).min())) * 100\n",
2134 | " STOCH_K = STOCH_K.rolling(window=k).mean()\n",
2135 | " if d == 0:\n",
2136 | " return STOCH_K\n",
2137 | " else:\n",
2138 | " STOCH_D = STOCH_K.rolling(window=d).mean()\n",
2139 | " return STOCH_D\n",
2140 | "\n",
2141 | "def check_bounce_EMA(df):\n",
2142 | " candle1 = df.iloc[-1]\n",
2143 | " candle2 = df.iloc[-2]\n",
2144 | " cond1 = candle1['EMA18'] > candle1['EMA50'] > candle1['EMA100']\n",
2145 | " cond2 = candle1['STOCH_%K(5,3,3)'] <= 30 or candle1['STOCH_%D(5,3,3)'] <= 30\n",
2146 | " cond3 = candle2['Low'] < candle2['EMA50'] and \\\n",
2147 | " candle2['Close'] > candle2['EMA50']\n",
2148 | " return cond1 and cond2 and cond3"
2149 | ]
2150 | },
2151 | {
2152 | "cell_type": "code",
2153 | "execution_count": 53,
2154 | "id": "955cad92",
2155 | "metadata": {},
2156 | "outputs": [
2157 | {
2158 | "name": "stdout",
2159 | "output_type": "stream",
2160 | "text": [
2161 | "['ABT']\n",
2162 | "['ABT', 'DRI']\n",
2163 | "['ABT', 'DRI', 'FAST']\n",
2164 | "['ABT', 'DRI', 'FAST', 'FIS']\n",
2165 | "['ABT', 'DRI', 'FAST', 'FIS', 'INVH']\n",
2166 | "['ABT', 'DRI', 'FAST', 'FIS', 'INVH', 'LOW']\n",
2167 | "['ABT', 'DRI', 'FAST', 'FIS', 'INVH', 'LOW', 'MCO']\n",
2168 | "['ABT', 'DRI', 'FAST', 'FIS', 'INVH', 'LOW', 'MCO', 'MTCH']\n",
2169 | "['ABT', 'DRI', 'FAST', 'FIS', 'INVH', 'LOW', 'MCO', 'MTCH', 'NOW']\n",
2170 | "['ABT', 'DRI', 'FAST', 'FIS', 'INVH', 'LOW', 'MCO', 'MTCH', 'NOW', 'PEP']\n",
2171 | "['ABT', 'DRI', 'FAST', 'FIS', 'INVH', 'LOW', 'MCO', 'MTCH', 'NOW', 'PEP', 'PM']\n",
2172 | "['ABT', 'DRI', 'FAST', 'FIS', 'INVH', 'LOW', 'MCO', 'MTCH', 'NOW', 'PEP', 'PM', 'TER']\n",
2173 | "['ABT', 'DRI', 'FAST', 'FIS', 'INVH', 'LOW', 'MCO', 'MTCH', 'NOW', 'PEP', 'PM', 'TER', 'TSLA']\n",
2174 | "['ABT', 'DRI', 'FAST', 'FIS', 'INVH', 'LOW', 'MCO', 'MTCH', 'NOW', 'PEP', 'PM', 'TER', 'TSLA', 'UPS']\n"
2175 | ]
2176 | }
2177 | ],
2178 | "source": [
2179 | "# a list to store the screened results\n",
2180 | "screened_list = [] \n",
2181 | "# get the full stock list\n",
2182 | "stock_list = si.tickers_sp500()\n",
2183 | "stock_list = [item.replace(\".\", \"-\") for item in tickers] # Yahoo Finance uses dashes instead of dots\n",
2184 | "\n",
2185 | "for stock_code in stock_list:\n",
2186 | " try: \n",
2187 | " # Step 1: get stock price for each stock\n",
2188 | " price_chart_df = get_stock_price(stock_code)\n",
2189 | " # Step 2: add technical indicators (in this case EMA)\n",
2190 | " close = price_chart_df['Close']\n",
2191 | " low = price_chart_df['Low']\n",
2192 | " high = price_chart_df['High']\n",
2193 | " price_chart_df['EMA18'] = add_EMA(close,18)\n",
2194 | " price_chart_df['EMA50'] = add_EMA(close,50)\n",
2195 | " price_chart_df['EMA100'] = add_EMA(close,100)\n",
2196 | " price_chart_df['STOCH_%K(5,3,3)'] = add_STOCH(close, low, high, 5, 3)\n",
2197 | " price_chart_df['STOCH_%D(5,3,3)'] = add_STOCH(close, low, high, 5, 3, 3)\n",
2198 | " # if all 3 conditions are met, add stock into screened list\n",
2199 | " if check_bounce_EMA(price_chart_df):\n",
2200 | " screened_list.append(stock_code)\n",
2201 | " print(screened_list)\n",
2202 | " except Exception as e:\n",
2203 | " print(e)"
2204 | ]
2205 | },
2206 | {
2207 | "cell_type": "markdown",
2208 | "id": "040432c2",
2209 | "metadata": {},
2210 | "source": [
2211 | "### Example 3: Stock Screening Strategy for S&P 500: A Combined Approach of Technical and Fundamental Analysis\n",
2212 | "\n",
2213 | "#### Introduction\n",
2214 | "The following strategy seeks to identify promising stocks within the S&P 500 index by employing a combination of technical and fundamental analysis. The method uses a systematic approach to filter stocks that meet specific criteria, targeting potentially undervalued and technically favorable positions.\n",
2215 | "\n",
2216 | "#### Criteria\n",
2217 | "The screening strategy is based on the following three conditions:\n",
2218 | "\n",
2219 | "1. **MACD (Moving Average Convergence Divergence) Greater Than Zero**: The MACD is a momentum oscillator that highlights the relationship between two moving averages of a security's price. A MACD greater than zero may indicate bullish momentum and an upward trend, suggesting that the stock could be poised for further growth.\n",
2220 | "\n",
2221 | "2. **RSI 14 (Relative Strength Index) Greater Than 50**: The RSI is a momentum indicator that measures the speed and change of price movements, scaled from 0 to 100. An RSI value greater than 50 typically reflects strengthening price momentum. When combined with other factors, this could suggest that the stock is gaining traction and has potential for further upside.\n",
2222 | "\n",
2223 | "3. **P/E Ratio (Price-to-Earnings Ratio) Less Than 10**: The P/E ratio is a fundamental valuation measure that compares the current share price with the earnings per share. A P/E ratio under 10 can be a sign of an undervalued stock, provided the company's fundamentals are solid. This criterion helps to ensure that the stock offers value and may not be overpriced relative to its earnings.\n",
2224 | "\n",
2225 | "#### Strategy Implementation\n",
2226 | "By applying the above criteria, the strategy screens the S&P 500 stocks to find those that meet all three conditions. The stocks that satisfy these parameters may offer a blend of potential growth (as indicated by the MACD and RSI) and value (as reflected in the low P/E ratio).\n",
2227 | "\n",
2228 | "#### Potential Benefits and Risks\n",
2229 | "This integrated approach can offer a more nuanced perspective, merging trend-following aspects with value considerations. However, it is essential to remember that no screening strategy is foolproof. Market conditions, unexpected news, and other unforeseen factors can influence stock performance.\n",
2230 | "\n",
2231 | "Investors implementing this strategy should consider conducting further due diligence, including a comprehensive assessment of the company's financial health, management quality, and industry prospects.\n",
2232 | "\n",
2233 | "------\n",
2234 | "\n",
2235 | "### Pandas Technical Analysis (pandas-ta)\n",
2236 | "is an open-source Python library that provides a comprehensive suite of over 130 technical indicators. It integrates seamlessly with the pandas library, allowing financial and time-series data to be manipulated and analyzed efficiently. Whether you're an experienced trader or new to technical analysis, pandas-ta offers a streamlined approach to design, test, and implement trading strategies.\n"
2237 | ]
2238 | },
2239 | {
2240 | "cell_type": "code",
2241 | "execution_count": null,
2242 | "id": "76d98709",
2243 | "metadata": {},
2244 | "outputs": [],
2245 | "source": [
2246 | "!pip install pandas-ta"
2247 | ]
2248 | },
2249 | {
2250 | "cell_type": "code",
2251 | "execution_count": 45,
2252 | "id": "6fb34fab",
2253 | "metadata": {},
2254 | "outputs": [
2255 | {
2256 | "name": "stdout",
2257 | "output_type": "stream",
2258 | "text": [
2259 | "Processing A\n",
2260 | "Processing AAL\n",
2261 | "Stock AAL meets the criteria.\n",
2262 | "Last MACD value: 0.7323452264297288\n",
2263 | "Last RSI value: 68.50672758995597\n",
2264 | "P/E ratio: 6.32\n",
2265 | "Processing AAP\n",
2266 | "Processing AAPL\n",
2267 | "Processing ABBV\n",
2268 | "Processing ABC\n",
2269 | "Processing ABT\n",
2270 | "Processing ACGL\n",
2271 | "Processing ACN\n",
2272 | "Processing ADBE\n",
2273 | "Processing ADI\n",
2274 | "Processing ADM\n",
2275 | "Processing ADP\n",
2276 | "Processing ADSK\n",
2277 | "Processing AEE\n",
2278 | "Processing AEP\n",
2279 | "Processing AES\n",
2280 | "Processing AFL\n",
2281 | "Processing AIG\n",
2282 | "Stock AIG meets the criteria.\n",
2283 | "Last MACD value: 1.0637837099209904\n",
2284 | "Last RSI value: 63.93095253000273\n",
2285 | "P/E ratio: 7.69\n",
2286 | "Processing AIZ\n",
2287 | "Processing AJG\n",
2288 | "Processing AKAM\n",
2289 | "Processing ALB\n",
2290 | "Stock ALB meets the criteria.\n",
2291 | "Last MACD value: 5.521204813944138\n",
2292 | "Last RSI value: 53.89930928793342\n",
2293 | "P/E ratio: 6.27\n",
2294 | "Processing ALGN\n",
2295 | "Processing ALK\n",
2296 | "Processing ALL\n",
2297 | "Processing ALLE\n",
2298 | "Processing AMAT\n",
2299 | "Processing AMCR\n",
2300 | "Processing AMD\n",
2301 | "Processing AME\n",
2302 | "Processing AMGN\n",
2303 | "Processing AMP\n",
2304 | "Processing AMT\n",
2305 | "Processing AMZN\n",
2306 | "Processing ANET\n",
2307 | "Processing ANSS\n",
2308 | "Processing AON\n",
2309 | "Processing AOS\n",
2310 | "Processing APA\n",
2311 | "Stock APA meets the criteria.\n",
2312 | "Last MACD value: 1.7974175873071871\n",
2313 | "Last RSI value: 73.63909959998334\n",
2314 | "P/E ratio: 6.8\n",
2315 | "Processing APD\n",
2316 | "Processing APH\n",
2317 | "Processing APTV\n",
2318 | "Processing ARE\n",
2319 | "Processing ATO\n",
2320 | "Processing ATVI\n",
2321 | "Processing AVB\n",
2322 | "Processing AVGO\n",
2323 | "Processing AVY\n",
2324 | "Processing AWK\n",
2325 | "Processing AXON\n",
2326 | "Processing AXP\n",
2327 | "Processing AZO\n",
2328 | "Processing BA\n",
2329 | "Processing BAC\n",
2330 | "Stock BAC meets the criteria.\n",
2331 | "Last MACD value: 0.5884667407900288\n",
2332 | "Last RSI value: 54.586280625724804\n",
2333 | "P/E ratio: 8.99\n",
2334 | "Processing BALL\n",
2335 | "Processing BAX\n",
2336 | "Processing BBWI\n",
2337 | "Processing BBY\n",
2338 | "Processing BDX\n",
2339 | "Processing BEN\n",
2340 | "Processing BF-B\n",
2341 | "Processing BG\n",
2342 | "Processing BIIB\n",
2343 | "Processing BIO\n",
2344 | "Processing BK\n",
2345 | "Processing BKNG\n",
2346 | "Processing BKR\n",
2347 | "Processing BLK\n",
2348 | "Processing BMY\n",
2349 | "Processing BR\n",
2350 | "Processing BRK-B\n",
2351 | "Processing BRO\n",
2352 | "Processing BSX\n",
2353 | "Processing BWA\n",
2354 | "Processing BXP\n",
2355 | "Processing C\n",
2356 | "Stock C meets the criteria.\n",
2357 | "Last MACD value: 0.21552476711143242\n",
2358 | "Last RSI value: 50.267097595328934\n",
2359 | "P/E ratio: 7.16\n",
2360 | "Processing CAG\n",
2361 | "Processing CAH\n",
2362 | "Processing CARR\n",
2363 | "Processing CAT\n",
2364 | "Processing CB\n",
2365 | "Processing CBOE\n",
2366 | "Processing CBRE\n",
2367 | "Processing CCI\n",
2368 | "Processing CCL\n",
2369 | "Processing CDAY\n",
2370 | "Processing CDNS\n",
2371 | "Processing CDW\n",
2372 | "Processing CE\n",
2373 | "Stock CE meets the criteria.\n",
2374 | "Last MACD value: 2.365797760697575\n",
2375 | "Last RSI value: 62.330685822625476\n",
2376 | "P/E ratio: 9.17\n",
2377 | "Processing CEG\n",
2378 | "Processing CF\n",
2379 | "Stock CF meets the criteria.\n",
2380 | "Last MACD value: 2.36649295126972\n",
2381 | "Last RSI value: 57.80043253508871\n",
2382 | "P/E ratio: 5.28\n",
2383 | "Processing CFG\n",
2384 | "Stock CFG meets the criteria.\n",
2385 | "Last MACD value: 0.9642836470678127\n",
2386 | "Last RSI value: 56.41788417320801\n",
2387 | "P/E ratio: 6.98\n",
2388 | "Processing CHD\n",
2389 | "Processing CHRW\n",
2390 | "Processing CHTR\n",
2391 | "Processing CI\n",
2392 | "Processing CINF\n",
2393 | "Processing CL\n",
2394 | "Processing CLX\n",
2395 | "Processing CMA\n",
2396 | "Stock CMA meets the criteria.\n",
2397 | "Last MACD value: 2.235306809994796\n",
2398 | "Last RSI value: 61.38416918313675\n",
2399 | "P/E ratio: 5.53\n",
2400 | "Processing CMCSA\n",
2401 | "Processing CME\n",
2402 | "Processing CMG\n",
2403 | "Processing CMI\n",
2404 | "Processing CMS\n",
2405 | "Processing CNC\n",
2406 | "Processing CNP\n",
2407 | "Processing COF\n",
2408 | "Stock COF meets the criteria.\n",
2409 | "Last MACD value: 1.1887447231144392\n",
2410 | "Last RSI value: 54.07965375820503\n",
2411 | "P/E ratio: 8.73\n",
2412 | "Processing COO\n",
2413 | "Processing COP\n",
2414 | "Stock COP meets the criteria.\n",
2415 | "Last MACD value: 2.6622829829666586\n",
2416 | "Last RSI value: 61.96483657401206\n",
2417 | "P/E ratio: 9.2\n",
2418 | "Processing COST\n",
2419 | "Processing CPB\n",
2420 | "Processing CPRT\n",
2421 | "Processing CPT\n",
2422 | "Processing CRL\n",
2423 | "Processing CRM\n",
2424 | "Processing CSCO\n",
2425 | "Processing CSGP\n",
2426 | "Processing CSX\n",
2427 | "Processing CTAS\n",
2428 | "Processing CTLT\n",
2429 | "Processing CTRA\n",
2430 | "Stock CTRA meets the criteria.\n",
2431 | "Last MACD value: 0.6149570197303476\n",
2432 | "Last RSI value: 62.21311322708498\n",
2433 | "P/E ratio: 5.29\n",
2434 | "Processing CTSH\n",
2435 | "Processing CTVA\n",
2436 | "Processing CVS\n",
2437 | "Processing CVX\n",
2438 | "Stock CVX meets the criteria.\n",
2439 | "Last MACD value: 1.0214206469109968\n",
2440 | "Last RSI value: 52.70717342810775\n",
2441 | "P/E ratio: 8.62\n",
2442 | "Processing CZR\n",
2443 | "Processing D\n",
2444 | "Processing DAL\n",
2445 | "Stock DAL meets the criteria.\n",
2446 | "Last MACD value: 0.0658574597242918\n",
2447 | "Last RSI value: 51.406986374965946\n",
2448 | "P/E ratio: 9.83\n",
2449 | "Processing DD\n",
2450 | "Processing DE\n",
2451 | "Processing DFS\n",
2452 | "Stock DFS meets the criteria.\n",
2453 | "Last MACD value: 2.6553033792337715\n",
2454 | "Last RSI value: 70.53863274611317\n",
2455 | "P/E ratio: 7.26\n",
2456 | "Processing DG\n",
2457 | "Processing DGX\n",
2458 | "Processing DHI\n",
2459 | "Stock DHI meets the criteria.\n",
2460 | "Last MACD value: 1.692989874213069\n",
2461 | "Last RSI value: 56.55354651199853\n",
2462 | "P/E ratio: 9.08\n",
2463 | "Processing DHR\n",
2464 | "Processing DIS\n",
2465 | "Processing DLR\n",
2466 | "Processing DLTR\n",
2467 | "Processing DOV\n",
2468 | "Processing DOW\n",
2469 | "Processing DPZ\n",
2470 | "Processing DRI\n",
2471 | "Processing DTE\n",
2472 | "Processing DUK\n",
2473 | "Processing DVA\n",
2474 | "Processing DVN\n",
2475 | "Stock DVN meets the criteria.\n",
2476 | "Last MACD value: 1.213271865416658\n",
2477 | "Last RSI value: 64.10778851047516\n",
2478 | "P/E ratio: 5.54\n",
2479 | "Processing DXC\n",
2480 | "Processing DXCM\n",
2481 | "Processing EA\n",
2482 | "Processing EBAY\n",
2483 | "Processing ECL\n",
2484 | "Processing ED\n",
2485 | "Processing EFX\n",
2486 | "Processing EG\n",
2487 | "Processing EIX\n",
2488 | "Processing EL\n",
2489 | "Processing ELV\n",
2490 | "Processing EMN\n",
2491 | "Processing EMR\n",
2492 | "Processing ENPH\n",
2493 | "Processing EOG\n",
2494 | "Stock EOG meets the criteria.\n",
2495 | "Last MACD value: 3.599360634029324\n",
2496 | "Last RSI value: 59.37529713632802\n",
2497 | "P/E ratio: 8.02\n",
2498 | "Processing EPAM\n",
2499 | "Processing EQIX\n",
2500 | "Processing EQR\n",
2501 | "Processing EQT\n",
2502 | "Stock EQT meets the criteria.\n",
2503 | "Last MACD value: 0.832173268289381\n",
2504 | "Last RSI value: 64.7108399208102\n",
2505 | "P/E ratio: 4.77\n",
2506 | "Processing ES\n",
2507 | "Processing ESS\n",
2508 | "Processing ETN\n",
2509 | "Processing ETR\n",
2510 | "Processing ETSY\n",
2511 | "Processing EVRG\n",
2512 | "Processing EW\n",
2513 | "Processing EXC\n",
2514 | "Processing EXPD\n",
2515 | "Processing EXPE\n",
2516 | "Processing EXR\n",
2517 | "Processing F\n",
2518 | "Processing FANG\n",
2519 | "Stock FANG meets the criteria.\n",
2520 | "Last MACD value: 4.103330114305152\n",
2521 | "Last RSI value: 71.80801487239752\n",
2522 | "P/E ratio: 6.18\n",
2523 | "Processing FAST\n",
2524 | "Processing FCX\n",
2525 | "Processing FDS\n",
2526 | "Processing FDX\n",
2527 | "Processing FE\n",
2528 | "Processing FFIV\n",
2529 | "Processing FI\n",
2530 | "Processing FICO\n",
2531 | "Processing FIS\n",
2532 | "Processing FITB\n",
2533 | "Stock FITB meets the criteria.\n",
2534 | "Last MACD value: 0.4421049715851879\n",
2535 | "Last RSI value: 51.588284188661355\n",
2536 | "P/E ratio: 8.01\n",
2537 | "Processing FLT\n",
2538 | "Processing FMC\n",
2539 | "Processing FOX\n",
2540 | "Processing FOXA\n",
2541 | "Processing FRT\n",
2542 | "Processing FSLR\n",
2543 | "Processing FTNT\n",
2544 | "Processing FTV\n",
2545 | "Processing GD\n",
2546 | "Processing GE\n",
2547 | "Processing GEHC\n",
2548 | "Processing GEN\n",
2549 | "Stock GEN meets the criteria.\n",
2550 | "Last MACD value: 0.428073505898233\n",
2551 | "Last RSI value: 60.68432492417218\n",
2552 | "P/E ratio: 9.39\n",
2553 | "Processing GILD\n",
2554 | "Processing GIS\n",
2555 | "Processing GL\n",
2556 | "Processing GLW\n",
2557 | "Processing GM\n",
2558 | "Stock GM meets the criteria.\n",
2559 | "Last MACD value: 0.29553954269997007\n",
2560 | "Last RSI value: 50.07168346375038\n",
2561 | "P/E ratio: 5.69\n",
2562 | "Processing GNRC\n",
2563 | "Processing GOOG\n",
2564 | "Processing GOOGL\n",
2565 | "Processing GPC\n",
2566 | "Processing GPN\n",
2567 | "Processing GRMN\n",
2568 | "Processing GS\n",
2569 | "Processing GWW\n",
2570 | "Processing HAL\n",
2571 | "Processing HAS\n",
2572 | "Processing HBAN\n",
2573 | "Stock HBAN meets the criteria.\n",
2574 | "Last MACD value: 0.3083203626360813\n",
2575 | "Last RSI value: 57.41037809354255\n",
2576 | "P/E ratio: 7.74\n",
2577 | "Processing HCA\n",
2578 | "Processing HD\n",
2579 | "Processing HES\n",
2580 | "Processing HIG\n",
2581 | "Processing HII\n",
2582 | "Processing HLT\n",
2583 | "Processing HOLX\n",
2584 | "Processing HON\n",
2585 | "Processing HPE\n",
2586 | "Processing HPQ\n",
2587 | "Processing HRL\n",
2588 | "Processing HSIC\n",
2589 | "Processing HST\n",
2590 | "Processing HSY\n",
2591 | "Processing HUM\n",
2592 | "Processing HWM\n",
2593 | "Processing IBM\n",
2594 | "Processing ICE\n",
2595 | "Processing IDXX\n",
2596 | "Processing IEX\n",
2597 | "Processing IFF\n",
2598 | "Processing ILMN\n",
2599 | "Processing INCY\n",
2600 | "Processing INTC\n",
2601 | "Processing INTU\n",
2602 | "Processing INVH\n",
2603 | "Processing IP\n",
2604 | "Stock IP meets the criteria.\n",
2605 | "Last MACD value: 1.2573448716953237\n",
2606 | "Last RSI value: 68.72911476362458\n",
2607 | "P/E ratio: 7.91\n",
2608 | "Processing IPG\n",
2609 | "Processing IQV\n",
2610 | "Processing IR\n",
2611 | "Processing IRM\n",
2612 | "Processing ISRG\n",
2613 | "Processing IT\n",
2614 | "Processing ITW\n",
2615 | "Processing IVZ\n",
2616 | "Processing J\n",
2617 | "Processing JBHT\n",
2618 | "Processing JCI\n",
2619 | "Processing JKHY\n",
2620 | "Processing JNJ\n",
2621 | "Processing JNPR\n",
2622 | "Processing JPM\n",
2623 | "Processing K\n",
2624 | "Processing KDP\n",
2625 | "Processing KEY\n",
2626 | "Stock KEY meets the criteria.\n",
2627 | "Last MACD value: 0.494661027608311\n",
2628 | "Last RSI value: 58.819358047425034\n",
2629 | "P/E ratio: 8.01\n",
2630 | "Processing KEYS\n",
2631 | "Processing KHC\n",
2632 | "Processing KIM\n",
2633 | "Processing KLAC\n",
2634 | "Processing KMB\n",
2635 | "Processing KMI\n",
2636 | "Processing KMX\n",
2637 | "Processing KO\n",
2638 | "Processing KR\n",
2639 | "Processing L\n",
2640 | "Processing LDOS\n",
2641 | "Processing LEN\n",
2642 | "Stock LEN meets the criteria.\n",
2643 | "Last MACD value: 0.854415303464009\n",
2644 | "Last RSI value: 54.01923420860962\n",
2645 | "P/E ratio: 8.68\n",
2646 | "Processing LH\n",
2647 | "Processing LHX\n",
2648 | "Processing LIN\n",
2649 | "Processing LKQ\n",
2650 | "Processing LLY\n",
2651 | "Processing LMT\n",
2652 | "Processing LNC\n",
2653 | "Processing LNT\n",
2654 | "Processing LOW\n",
2655 | "Processing LRCX\n",
2656 | "Processing LUV\n",
2657 | "Processing LVS\n",
2658 | "Processing LW\n",
2659 | "Processing LYB\n",
2660 | "Processing LYV\n",
2661 | "Processing MA\n",
2662 | "Processing MAA\n",
2663 | "Processing MAR\n",
2664 | "Processing MAS\n",
2665 | "Processing MCD\n",
2666 | "Processing MCHP\n",
2667 | "Processing MCK\n",
2668 | "Processing MCO\n",
2669 | "Processing MDLZ\n",
2670 | "Processing MDT\n",
2671 | "Processing MET\n",
2672 | "Processing META\n",
2673 | "Processing MGM\n",
2674 | "Stock MGM meets the criteria.\n",
2675 | "Last MACD value: 1.687432310535634\n",
2676 | "Last RSI value: 59.87535190769721\n",
2677 | "P/E ratio: 9.6\n",
2678 | "Processing MHK\n",
2679 | "Processing MKC\n",
2680 | "Processing MKTX\n",
2681 | "Processing MLM\n",
2682 | "Processing MMC\n",
2683 | "Processing MMM\n",
2684 | "Processing MNST\n",
2685 | "Processing MO\n",
2686 | "Processing MOH\n",
2687 | "Processing MOS\n",
2688 | "Stock MOS meets the criteria.\n",
2689 | "Last MACD value: 1.4191396216233159\n",
2690 | "Last RSI value: 71.37423082034007\n",
2691 | "P/E ratio: 5.12\n",
2692 | "Processing MPC\n"
2693 | ]
2694 | },
2695 | {
2696 | "name": "stdout",
2697 | "output_type": "stream",
2698 | "text": [
2699 | "Stock MPC meets the criteria.\n",
2700 | "Last MACD value: 6.000346567626565\n",
2701 | "Last RSI value: 86.69033060710144\n",
2702 | "P/E ratio: 4.35\n",
2703 | "Processing MPWR\n",
2704 | "Processing MRK\n",
2705 | "Processing MRNA\n",
2706 | "Stock MRNA meets the criteria.\n",
2707 | "Last MACD value: 1.3220304927134237\n",
2708 | "Last RSI value: 53.37425234271124\n",
2709 | "P/E ratio: 8.58\n",
2710 | "Processing MRO\n",
2711 | "Stock MRO meets the criteria.\n",
2712 | "Last MACD value: 0.617852808126564\n",
2713 | "Last RSI value: 59.2894055807351\n",
2714 | "P/E ratio: 6.24\n",
2715 | "Processing MS\n",
2716 | "Processing MSCI\n",
2717 | "Processing MSFT\n",
2718 | "Processing MSI\n",
2719 | "Processing MTB\n",
2720 | "Stock MTB meets the criteria.\n",
2721 | "Last MACD value: 3.3074392050035613\n",
2722 | "Last RSI value: 60.20214601700526\n",
2723 | "P/E ratio: 8.14\n",
2724 | "Processing MTCH\n",
2725 | "Processing MTD\n",
2726 | "Processing MU\n",
2727 | "Processing NCLH\n",
2728 | "Processing NDAQ\n",
2729 | "Processing NDSN\n",
2730 | "Processing NEE\n",
2731 | "Processing NEM\n",
2732 | "Processing NFLX\n",
2733 | "Processing NI\n",
2734 | "Processing NKE\n",
2735 | "Processing NOC\n",
2736 | "Processing NOW\n",
2737 | "Processing NRG\n",
2738 | "Processing NSC\n",
2739 | "Processing NTAP\n",
2740 | "Processing NTRS\n",
2741 | "Processing NUE\n",
2742 | "Stock NUE meets the criteria.\n",
2743 | "Last MACD value: 2.8838486707294635\n",
2744 | "Last RSI value: 56.23471948057987\n",
2745 | "P/E ratio: 7.81\n",
2746 | "Processing NVDA\n",
2747 | "Processing NVR\n",
2748 | "Processing NWL\n",
2749 | "Processing NWS\n",
2750 | "Processing NWSA\n",
2751 | "Processing NXPI\n",
2752 | "Processing O\n",
2753 | "Processing ODFL\n",
2754 | "Processing OGN\n",
2755 | "Stock OGN meets the criteria.\n",
2756 | "Last MACD value: 0.4553582330161703\n",
2757 | "Last RSI value: 73.60327777012311\n",
2758 | "P/E ratio: 8.06\n",
2759 | "Processing OKE\n",
2760 | "Processing OMC\n",
2761 | "Processing ON\n",
2762 | "Processing ORCL\n",
2763 | "Processing ORLY\n",
2764 | "Processing OTIS\n",
2765 | "Processing OXY\n",
2766 | "Stock OXY meets the criteria.\n",
2767 | "Last MACD value: 1.0877993172183409\n",
2768 | "Last RSI value: 62.90527326817742\n",
2769 | "P/E ratio: 7.29\n",
2770 | "Processing PANW\n",
2771 | "Processing PARA\n",
2772 | "Processing PAYC\n",
2773 | "Processing PAYX\n",
2774 | "Processing PCAR\n",
2775 | "Processing PCG\n",
2776 | "Processing PEAK\n",
2777 | "Processing PEG\n",
2778 | "Processing PEP\n",
2779 | "Processing PFE\n",
2780 | "Stock PFE meets the criteria.\n",
2781 | "Last MACD value: 0.32540431612962095\n",
2782 | "Last RSI value: 53.17542742376637\n",
2783 | "P/E ratio: 7.03\n",
2784 | "Processing PFG\n",
2785 | "Stock PFG meets the criteria.\n",
2786 | "Last MACD value: 0.8878869364643833\n",
2787 | "Last RSI value: 52.98472736263415\n",
2788 | "P/E ratio: 4.65\n",
2789 | "Processing PG\n",
2790 | "Processing PGR\n",
2791 | "Processing PH\n",
2792 | "Processing PHM\n",
2793 | "Stock PHM meets the criteria.\n",
2794 | "Last MACD value: 2.27419272301438\n",
2795 | "Last RSI value: 65.14786708006037\n",
2796 | "P/E ratio: 7.16\n",
2797 | "Processing PKG\n",
2798 | "Processing PLD\n",
2799 | "Processing PM\n",
2800 | "Processing PNC\n",
2801 | "Stock PNC meets the criteria.\n",
2802 | "Last MACD value: 1.8514419024169797\n",
2803 | "Last RSI value: 53.04374464641121\n",
2804 | "P/E ratio: 8.92\n",
2805 | "Processing PNR\n",
2806 | "Processing PNW\n",
2807 | "Processing PODD\n",
2808 | "Skipping PODD due to unavailable P/E ratio.\n",
2809 | "Processing POOL\n",
2810 | "Processing PPG\n",
2811 | "Processing PPL\n",
2812 | "Processing PRU\n",
2813 | "Processing PSA\n",
2814 | "Processing PSX\n",
2815 | "Stock PSX meets the criteria.\n",
2816 | "Last MACD value: 3.5799559468635493\n",
2817 | "Last RSI value: 71.2703188728833\n",
2818 | "P/E ratio: 4.3\n",
2819 | "Processing PTC\n",
2820 | "Processing PWR\n",
2821 | "Processing PXD\n",
2822 | "Stock PXD meets the criteria.\n",
2823 | "Last MACD value: 6.451943380568366\n",
2824 | "Last RSI value: 73.59405629240082\n",
2825 | "P/E ratio: 8.26\n",
2826 | "Processing PYPL\n",
2827 | "Processing QCOM\n",
2828 | "Processing QRVO\n",
2829 | "Processing RCL\n",
2830 | "Processing REG\n",
2831 | "Processing REGN\n",
2832 | "Processing RF\n",
2833 | "Stock RF meets the criteria.\n",
2834 | "Last MACD value: 0.6175746852870283\n",
2835 | "Last RSI value: 69.14863608199396\n",
2836 | "P/E ratio: 8.89\n",
2837 | "Processing RHI\n",
2838 | "Processing RJF\n",
2839 | "Processing RL\n",
2840 | "Processing RMD\n",
2841 | "Processing ROK\n",
2842 | "Processing ROL\n",
2843 | "Processing ROP\n",
2844 | "Processing ROST\n",
2845 | "Processing RSG\n",
2846 | "Processing RTX\n",
2847 | "Processing RVTY\n",
2848 | "Processing SBAC\n",
2849 | "Processing SBUX\n",
2850 | "Processing SCHW\n",
2851 | "Processing SEDG\n",
2852 | "Processing SEE\n",
2853 | "Processing SHW\n",
2854 | "Processing SJM\n",
2855 | "Processing SLB\n",
2856 | "Processing SNA\n",
2857 | "Processing SNPS\n",
2858 | "Processing SO\n",
2859 | "Processing SPG\n",
2860 | "Processing SPGI\n",
2861 | "Processing SRE\n",
2862 | "Processing STE\n",
2863 | "Processing STLD\n",
2864 | "Stock STLD meets the criteria.\n",
2865 | "Last MACD value: 0.32735184020532415\n",
2866 | "Last RSI value: 51.891646917685186\n",
2867 | "P/E ratio: 6.02\n",
2868 | "Processing STT\n",
2869 | "Stock STT meets the criteria.\n",
2870 | "Last MACD value: 0.26340114565597617\n",
2871 | "Last RSI value: 52.49528943575974\n",
2872 | "P/E ratio: 9.84\n",
2873 | "Processing STX\n",
2874 | "Processing STZ\n",
2875 | "Processing SWK\n",
2876 | "Processing SWKS\n",
2877 | "Processing SYF\n",
2878 | "Stock SYF meets the criteria.\n",
2879 | "Last MACD value: 0.21192777359517123\n",
2880 | "Last RSI value: 54.34616303838704\n",
2881 | "P/E ratio: 6.33\n",
2882 | "Processing SYK\n",
2883 | "Processing SYY\n",
2884 | "Processing T\n",
2885 | "Processing TAP\n",
2886 | "Processing TDG\n",
2887 | "Processing TDY\n",
2888 | "Processing TECH\n",
2889 | "Processing TEL\n",
2890 | "Processing TER\n",
2891 | "Processing TFC\n",
2892 | "Stock TFC meets the criteria.\n",
2893 | "Last MACD value: 0.1266059726788029\n",
2894 | "Last RSI value: 50.55880658108705\n",
2895 | "P/E ratio: 7.48\n",
2896 | "Processing TFX\n",
2897 | "Processing TGT\n",
2898 | "Processing TJX\n",
2899 | "Processing TMO\n",
2900 | "Processing TMUS\n",
2901 | "Processing TPR\n",
2902 | "Processing TRGP\n",
2903 | "Processing TRMB\n",
2904 | "Processing TROW\n",
2905 | "Processing TRV\n",
2906 | "Processing TSCO\n",
2907 | "Processing TSLA\n",
2908 | "Processing TSN\n",
2909 | "Processing TT\n",
2910 | "Processing TTWO\n",
2911 | "Processing TXN\n",
2912 | "Processing TXT\n",
2913 | "Processing TYL\n",
2914 | "Processing UAL\n",
2915 | "Stock UAL meets the criteria.\n",
2916 | "Last MACD value: 0.4805373008242455\n",
2917 | "Last RSI value: 50.74576693793488\n",
2918 | "P/E ratio: 6.99\n",
2919 | "Processing UDR\n",
2920 | "Processing UHS\n",
2921 | "Processing ULTA\n",
2922 | "Processing UNH\n",
2923 | "Processing UNP\n",
2924 | "Processing UPS\n",
2925 | "Processing URI\n",
2926 | "Processing USB\n",
2927 | "Processing V\n",
2928 | "Processing VFC\n",
2929 | "Processing VICI\n",
2930 | "Processing VLO\n",
2931 | "Stock VLO meets the criteria.\n",
2932 | "Last MACD value: 3.7085447608429547\n",
2933 | "Last RSI value: 70.54442475674506\n",
2934 | "P/E ratio: 3.74\n",
2935 | "Processing VMC\n",
2936 | "Processing VRSK\n",
2937 | "Processing VRSN\n",
2938 | "Processing VRTX\n",
2939 | "Processing VTR\n",
2940 | "Processing VTRS\n",
2941 | "Stock VTRS meets the criteria.\n",
2942 | "Last MACD value: 0.22511514930596377\n",
2943 | "Last RSI value: 70.3345437358976\n",
2944 | "P/E ratio: 7.1\n",
2945 | "Processing VZ\n",
2946 | "Stock VZ meets the criteria.\n",
2947 | "Last MACD value: 0.2988492087525003\n",
2948 | "Last RSI value: 59.468166284215826\n",
2949 | "P/E ratio: 6.51\n",
2950 | "Processing WAB\n",
2951 | "Processing WAT\n",
2952 | "Processing WBA\n",
2953 | "Processing WBD\n",
2954 | "Processing WDC\n",
2955 | "Processing WEC\n",
2956 | "Processing WELL\n",
2957 | "Processing WFC\n",
2958 | "Processing WHR\n",
2959 | "Processing WM\n",
2960 | "Processing WMB\n",
2961 | "Processing WMT\n",
2962 | "Processing WRB\n",
2963 | "Processing WRK\n",
2964 | "Processing WST\n",
2965 | "Processing WTW\n",
2966 | "Processing WY\n",
2967 | "Processing WYNN\n",
2968 | "Processing XEL\n",
2969 | "Processing XOM\n",
2970 | "Stock XOM meets the criteria.\n",
2971 | "Last MACD value: 0.6620604631902296\n",
2972 | "Last RSI value: 57.983758304692444\n",
2973 | "P/E ratio: 7.29\n",
2974 | "Processing XRAY\n",
2975 | "Processing XYL\n",
2976 | "Processing YUM\n",
2977 | "Processing ZBH\n",
2978 | "Processing ZBRA\n",
2979 | "Processing ZION\n",
2980 | "Stock ZION meets the criteria.\n",
2981 | "Last MACD value: 2.1258270326451267\n",
2982 | "Last RSI value: 64.54332115271208\n",
2983 | "P/E ratio: 6.53\n",
2984 | "Processing ZTS\n",
2985 | "Screening complete.\n"
2986 | ]
2987 | }
2988 | ],
2989 | "source": [
2990 | "import warnings\n",
2991 | "warnings.simplefilter(action='ignore', category=FutureWarning)\n",
2992 | "\n",
2993 | "import pandas as pd\n",
2994 | "import pandas_ta as ta\n",
2995 | "from yahoo_fin import stock_info\n",
2996 | "\n",
2997 | "# Function to extract P/E ratio\n",
2998 | "def get_pe_ratio(ticker):\n",
2999 | " try:\n",
3000 | " quote_table = stock_info.get_quote_table(ticker)\n",
3001 | " pe_ratio = quote_table['PE Ratio (TTM)']\n",
3002 | " return float(pe_ratio) if pe_ratio and pe_ratio != 'N/A' else None\n",
3003 | " except:\n",
3004 | " return None\n",
3005 | "\n",
3006 | "# Get S&P 500 tickers\n",
3007 | "sp500_tickers = stock_info.tickers_sp500()\n",
3008 | "start_date = '2023-01-01'\n",
3009 | "\n",
3010 | "\n",
3011 | "# Screen the stocks\n",
3012 | "for ticker in sp500_tickers:\n",
3013 | " try:\n",
3014 | " print(f\"Processing {ticker}\")\n",
3015 | " historical_data = stock_info.get_data(ticker, start_date=start_date)\n",
3016 | "\n",
3017 | " # Calculate MACD using pandas-ta\n",
3018 | " historical_data['MACD'] = ta.macd(historical_data['adjclose']).iloc[:, 0]\n",
3019 | "\n",
3020 | " # Calculate RSI 14 using pandas-ta\n",
3021 | " historical_data['RSI14'] = ta.rsi(historical_data['adjclose'], length=14)\n",
3022 | "\n",
3023 | " # Drop any rows with NaN values in RSI14 or MACD\n",
3024 | " historical_data.dropna(subset=['RSI14', 'MACD'], inplace=True)\n",
3025 | "\n",
3026 | " # Get Price to Earnings ratio\n",
3027 | " pe_ratio = get_pe_ratio(ticker)\n",
3028 | "\n",
3029 | " if pe_ratio is None:\n",
3030 | " print(f\"Skipping {ticker} due to unavailable P/E ratio.\")\n",
3031 | " continue\n",
3032 | "\n",
3033 | " # Filter stocks based on the conditions\n",
3034 | " filtered_data = historical_data[\n",
3035 | " (historical_data['RSI14'] > 50) &\n",
3036 | " (historical_data['MACD'] > 0) &\n",
3037 | " (pe_ratio < 10)\n",
3038 | " ]\n",
3039 | "\n",
3040 | " if not filtered_data.empty:\n",
3041 | " print(f\"Stock {ticker} meets the criteria.\")\n",
3042 | " print(f\"Last MACD value: {filtered_data['MACD'].iloc[-1]}\") # Print the last MACD value for this ticker\n",
3043 | " print(f\"Last RSI value: {filtered_data['RSI14'].iloc[-1]}\") # Print the last RSI value for this ticker\n",
3044 | " print(f\"P/E ratio: {pe_ratio}\") # Print the P/E ratio for this ticker\n",
3045 | " except Exception as e:\n",
3046 | " print(f\"An error occurred with {ticker}: {str(e)}\")\n",
3047 | " continue\n",
3048 | "\n",
3049 | "print(\"Screening complete.\")\n"
3050 | ]
3051 | }
3052 | ],
3053 | "metadata": {
3054 | "kernelspec": {
3055 | "display_name": "Python 3 (ipykernel)",
3056 | "language": "python",
3057 | "name": "python3"
3058 | },
3059 | "language_info": {
3060 | "codemirror_mode": {
3061 | "name": "ipython",
3062 | "version": 3
3063 | },
3064 | "file_extension": ".py",
3065 | "mimetype": "text/x-python",
3066 | "name": "python",
3067 | "nbconvert_exporter": "python",
3068 | "pygments_lexer": "ipython3",
3069 | "version": "3.10.0"
3070 | }
3071 | },
3072 | "nbformat": 4,
3073 | "nbformat_minor": 5
3074 | }
3075 |
--------------------------------------------------------------------------------
/Lecture 08_Connect to a trading API.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "protected-handle",
6 | "metadata": {},
7 | "source": [
8 | "###
Algorithmic Trading with Python
\n",
9 | "###
Connect to a Trading API Using Python
\n",
10 | "####
Ali Habibnia
"
11 | ]
12 | },
13 | {
14 | "cell_type": "markdown",
15 | "id": "e8f09ad3",
16 | "metadata": {},
17 | "source": [
18 | "\n",
19 | "\n",
20 | "### Introduction to API Technologies and Communication Protocols\n",
21 | "\n",
22 | "APIs (Application Programming Interfaces) and communication protocols are pivotal in enabling software applications to interact and communicate with each other. They define a set of rules and conventions for building and interacting with software applications. In this short tutorial, we will explore the main concept of API technologies and delve into examples like REST API, FIX API Protocol 4.2, and Websocket.\n",
23 | "\n",
24 | "\n",
25 | "#### Example 1: REST API\n",
26 | "\n",
27 | "- **Definition**: REST (Representational State Transfer) API is a web standards-based architecture that uses HTTP. It is stateless and utilizes HTTP methods like GET, POST, PUT, and DELETE.\n",
28 | " \n",
29 | "- **Use Case**: REST APIs are commonly used in web development to create interfaces for interacting with databases and other backend services.\n",
30 | "\n",
31 | "- **Key Points**:\n",
32 | " - **Stateless**: Each HTTP request from a client to a server must contain all the information needed to understand and process the request.\n",
33 | " - **Uniform Interface**: Simplifies the architecture by having a standard set of rules for creating APIs.\n",
34 | "\n",
35 | "#### Example 2: FIX API Protocol 4.2\n",
36 | "\n",
37 | "- **Definition**: FIX (Financial Information eXchange) API is a communication protocol designed specifically for the real-time exchange of information related to financial securities transactions.\n",
38 | "\n",
39 | "- **Use Case**: Widely used in the financial industry, especially in trading platforms, for communicating orders and executions.\n",
40 | "\n",
41 | "- **Key Points**:\n",
42 | " - **Real-time Communication**: Enables fast and efficient communication, which is crucial in financial transactions.\n",
43 | " - **Standardized**: Ensures that financial entities can communicate with each other in a consistent and reliable manner.\n",
44 | "\n",
45 | "#### Example 3: Websocket\n",
46 | "\n",
47 | "- **Definition**: Websocket is a communication protocol that provides full-duplex communication channels over a single TCP connection.\n",
48 | "\n",
49 | "- **Use Case**: Used in applications that require real-time bidirectional communication, such as chat applications, online gaming, and live sports updates.\n",
50 | "\n",
51 | "- **Key Points**:\n",
52 | " - **Persistent Connection**: Unlike HTTP, Websocket allows a continuous flow of data, maintaining a persistent connection between client and server.\n",
53 | " - **Real-time Communication**: Ideal for applications that require real-time updates and interactions.\n",
54 | "\n"
55 | ]
56 | },
57 | {
58 | "cell_type": "markdown",
59 | "id": "ff87a637",
60 | "metadata": {},
61 | "source": [
62 | "### Tutorial: Placing a Limit Order on Coinbase Pro using Python\n",
63 | "\n",
64 | "Connecting to a trading API using Python typically involves using the requests library to make HTTP requests to the API endpoint. Below is a general guideline and example code to get you started. Note that the exact details might vary depending on the specific API you're using.\n",
65 | "\n",
66 | "First, obtain API credentials (like API key, secret, etc.) from the trading platform. Always refer to the API documentation provided by the trading platform for specific details on endpoints, authentication, rate limits, and data formats.\n",
67 | "\n",
68 | "In this tutorial, we'll walk through how to place a limit order on Coinbase Pro using Python. A limit order allows you to specify the price at which you want to buy or sell an asset, providing more control over the execution price.\n",
69 | "\n",
70 | "https://docs.cloud.coinbase.com/exchange/reference"
71 | ]
72 | },
73 | {
74 | "cell_type": "code",
75 | "execution_count": 2,
76 | "id": "union-latin",
77 | "metadata": {},
78 | "outputs": [
79 | {
80 | "data": {
81 | "text/plain": [
82 | "'\\nJavaScript Object Notation (JSON) is a standard text-based format for representing structured data\\nbased on JavaScript object syntax. It is commonly used for transmitting data in web applications\\n(e.g., sending some data from the server to the client, so it can be displayed on a web page, or vice versa).\\n'"
83 | ]
84 | },
85 | "execution_count": 2,
86 | "metadata": {},
87 | "output_type": "execute_result"
88 | }
89 | ],
90 | "source": [
91 | "import requests\n",
92 | "\n",
93 | "\"\"\"\n",
94 | "The requests module allows you to send HTTP requests using Python. The HTTP request returns a \n",
95 | "Response Object with all the response data (content, encoding, status, etc).\n",
96 | "\"\"\"\n",
97 | "\n",
98 | "import json\n",
99 | "\n",
100 | "\"\"\"\n",
101 | "JavaScript Object Notation (JSON) is a standard text-based format for representing structured data\n",
102 | "based on JavaScript object syntax. It is commonly used for transmitting data in web applications\n",
103 | "(e.g., sending some data from the server to the client, so it can be displayed on a web page, or vice versa).\n",
104 | "\"\"\""
105 | ]
106 | },
107 | {
108 | "cell_type": "markdown",
109 | "id": "9ece806c",
110 | "metadata": {},
111 | "source": [
112 | "Here's a basic example of how you might connect to a trading API using Python. For instance, to interact with the Coinbase API and place a new order using Python, you'll need to obtain your API credentials (API key, API secret, and API passphrase) from your Coinbase Pro account. Go to the API section of your Coinbase Pro account and create a new API key. You will get an API key, API secret, and API passphrase, which you will use to authenticate your requests.\n",
113 | "\n",
114 | "Request Type: In the example, a POST request is made (requests.post). Depending on the operation, you might need to use GET, PUT, DELETE, etc."
115 | ]
116 | },
117 | {
118 | "cell_type": "code",
119 | "execution_count": 16,
120 | "id": "31cd877e",
121 | "metadata": {},
122 | "outputs": [
123 | {
124 | "name": "stdout",
125 | "output_type": "stream",
126 | "text": [
127 | "Order placed successfully: {'id': 'a9c3e81b-0f4a-40d8-b2d7-ebf2fbfd29cc', 'price': '10000.00', 'size': '0.0005', 'product_id': 'BTC-USD', 'side': 'buy', 'stp': 'dc', 'type': 'limit', 'time_in_force': 'GTC', 'post_only': False, 'created_at': '2023-10-04T05:49:05.192918Z', 'fill_fees': '0', 'filled_size': '0', 'executed_value': '0', 'status': 'pending', 'settled': False}\n"
128 | ]
129 | }
130 | ],
131 | "source": [
132 | "import time\n",
133 | "import hmac\n",
134 | "import hashlib\n",
135 | "import base64\n",
136 | "import requests\n",
137 | "import json\n",
138 | "\n",
139 | "# Your API credentials\n",
140 | "API_KEY = \"8da29a53638e3951badf48920316fd4\"\n",
141 | "API_SECRET = \"4cfPZdXovGxOLQqfXFZIZXfaHoMpsuRdSMC0GRJQmPAreoBgeoxdy3Vj7KVhRZTgt3NU9/4BZLJDyCTUxJ9W+g==\"\n",
142 | "API_PASS = \"algoclass\"\n",
143 | "\n",
144 | "# API URL\n",
145 | "API_URL = 'https://api.pro.coinbase.com/orders'\n",
146 | "\n",
147 | "# Create a timestamp\n",
148 | "timestamp = str(time.time())\n",
149 | "\n",
150 | "# Request method\n",
151 | "method = 'POST'\n",
152 | "\n",
153 | "# Request body\n",
154 | "body = {\n",
155 | " 'size': '0.0005', # Specify the amount of BTC you want to buy\n",
156 | " 'price': '10000.00', # Specify the price at which you want to buy\n",
157 | " 'side': 'buy',\n",
158 | " 'product_id': 'BTC-USD',\n",
159 | " 'type': 'limit' # Specify that this is a limit order\n",
160 | "}\n",
161 | "body_json = json.dumps(body)\n",
162 | "\n",
163 | "# Create a signature\n",
164 | "message = timestamp + method + '/orders' + body_json\n",
165 | "hmac_key = base64.b64decode(API_SECRET)\n",
166 | "signature = hmac.new(hmac_key, message.encode('utf-8'), hashlib.sha256)\n",
167 | "signature_b64 = base64.b64encode(signature.digest()).decode('utf-8')\n",
168 | "\n",
169 | "# Headers\n",
170 | "headers = {\n",
171 | " 'CB-ACCESS-KEY': API_KEY,\n",
172 | " 'CB-ACCESS-PASSPHRASE': API_PASS,\n",
173 | " 'CB-ACCESS-SIGN': signature_b64,\n",
174 | " 'CB-ACCESS-TIMESTAMP': timestamp,\n",
175 | " 'Content-Type': 'application/json'\n",
176 | "}\n",
177 | "\n",
178 | "# Send the request\n",
179 | "response = requests.post(API_URL, headers=headers, data=body_json)\n",
180 | "\n",
181 | "# Print the response\n",
182 | "if response.status_code == 200:\n",
183 | " print('Order placed successfully:', response.json())\n",
184 | "else:\n",
185 | " print('Failed to place order:', response.json())\n"
186 | ]
187 | },
188 | {
189 | "cell_type": "markdown",
190 | "id": "4e1841dd",
191 | "metadata": {},
192 | "source": [
193 | "Coinbase Pro provides a public API for developers and investors to programmatically interact with the platform. Below are some of the endpoint URLs for various functionalities in the Coinbase Pro API:\n",
194 | "\n",
195 | "1. **Get Products:**\n",
196 | " - `GET https://api.pro.coinbase.com/products`\n",
197 | " \n",
198 | "2. **Get Product Order Book:**\n",
199 | " - `GET https://api.pro.coinbase.com/products/:product-id/book`\n",
200 | " \n",
201 | "3. **Get Product Ticker:**\n",
202 | " - `GET https://api.pro.coinbase.com/products/:product-id/ticker`\n",
203 | " \n",
204 | "4. **Get Trades:**\n",
205 | " - `GET https://api.pro.coinbase.com/products/:product-id/trades`\n",
206 | " \n",
207 | "5. **Get Historical Rates:**\n",
208 | " - `GET https://api.pro.coinbase.com/products/:product-id/candles`\n",
209 | " \n",
210 | "6. **Get 24hr Stats:**\n",
211 | " - `GET https://api.pro.coinbase.com/products/:product-id/stats`\n",
212 | " \n",
213 | "7. **List Accounts:**\n",
214 | " - `GET https://api.pro.coinbase.com/accounts`\n",
215 | " \n",
216 | "8. **Get Account:**\n",
217 | " - `GET https://api.pro.coinbase.com/accounts/:account-id`\n",
218 | " \n",
219 | "9. **Get Account History:**\n",
220 | " - `GET https://api.pro.coinbase.com/accounts/:account-id/ledger`\n",
221 | " \n",
222 | "10. **Get Holds:**\n",
223 | " - `GET https://api.pro.coinbase.com/accounts/:account-id/holds`\n",
224 | " \n",
225 | "11. **Place a New Order:**\n",
226 | " - `POST https://api.pro.coinbase.com/orders`\n",
227 | " \n",
228 | "12. **Cancel an Order:**\n",
229 | " - `DELETE https://api.pro.coinbase.com/orders/:order-id`\n",
230 | " \n",
231 | "13. **List Orders:**\n",
232 | " - `GET https://api.pro.coinbase.com/orders`\n",
233 | " \n",
234 | "14. **Get an Order:**\n",
235 | " - `GET https://api.pro.coinbase.com/orders/:order-id`\n",
236 | " \n",
237 | "15. **List Fills:**\n",
238 | " - `GET https://api.pro.coinbase.com/fills`\n",
239 | " \n",
240 | "16. **List Payment Methods:**\n",
241 | " - `GET https://api.pro.coinbase.com/payment-methods`\n",
242 | " \n",
243 | "17. **Get a Payment Method:**\n",
244 | " - `GET https://api.pro.coinbase.com/payment-methods/:payment-method-id`\n",
245 | " \n",
246 | "18. **Coinbase Accounts:**\n",
247 | " - `GET https://api.pro.coinbase.com/coinbase-accounts`\n",
248 | " \n",
249 | "19. **List Currencies:**\n",
250 | " - `GET https://api.pro.coinbase.com/currencies`\n",
251 | " \n",
252 | "20. **Get Server Time:**\n",
253 | " - `GET https://api.pro.coinbase.com/time`\n",
254 | "\n",
255 | "Note that for endpoints requiring a `:product-id`, you should replace this with the actual product ID (e.g., `BTC-USD`). Similarly, for endpoints requiring `:account-id`, `:order-id`, or `:payment-method-id`, you should replace these with the actual IDs relevant to your account or order."
256 | ]
257 | }
258 | ],
259 | "metadata": {
260 | "kernelspec": {
261 | "display_name": "Python 3 (ipykernel)",
262 | "language": "python",
263 | "name": "python3"
264 | },
265 | "language_info": {
266 | "codemirror_mode": {
267 | "name": "ipython",
268 | "version": 3
269 | },
270 | "file_extension": ".py",
271 | "mimetype": "text/x-python",
272 | "name": "python",
273 | "nbconvert_exporter": "python",
274 | "pygments_lexer": "ipython3",
275 | "version": "3.10.0"
276 | }
277 | },
278 | "nbformat": 4,
279 | "nbformat_minor": 5
280 | }
281 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Course Title: Algorithmic Trading with Python
2 | # Instructor: Ali Habibnia, Ph.D.
3 |
4 | This comprehensive, hands-on course provides a thorough exploration into the world of algorithmic trading, aimed at students, professionals, and enthusiasts with a basic understanding of Python programming and financial markets. We will dissect the vast landscape of trading from an algorithmic perspective, starting with the foundations and gradually progressing to more complex, cutting-edge techniques used by professionals in the trading industry.
5 |
6 | Tentative Course syllabus:
7 |
8 | 1. Introduction to Trading and Algorithmic Trading
9 | - Overview of Trading
10 | - Fundamental Trading Concepts
11 | - Order Types and Order Management
12 | - Introduction to Algorithmic Trading Systems and Automated Trading
13 | - Day Trading, Market Microstructure and High-Frequency Trading (HFT)
14 | - Spot Trading vs. Derivatives Trading
15 | 2. Python Programming for Algorithmic Trading
16 | - Essential Python Libraries
17 | - Popular Python Trading Platforms for Algorithmic Trading
18 | 3. Data Handling and Preparation
19 | - Acquiring Financial Data from Open Data Sources & Broker APIs
20 | - Retrieving and Visualizing Historical and Streaming Data via APIs
21 | - Web Scraping for Financial Data
22 | - Data Preprocessing Techniques
23 | - Limit Order Book Data
24 | 4. Algorithmic Trading Strategies and Paradigms
25 | - Algorithmic Trading System Development Process
26 | - Trend- and Momentum-Based Strategies
27 | - Technical Analysis-Based Strategies
28 | - Reversion and Change-Point-Based Strategies
29 | - Statistical Arbitrage Trading Strategies
30 | - High-Frequency Trading Strategies
31 | - Machine Learning-Based Strategies
32 | - Deep Learning for Algorithmic Trading Strategies
33 | - Sentiment Analysis and Natural Language Processing
34 | - Advanced Quantitative Trading Techniques
35 | 5. Strategy Testing and Evaluation
36 | - Backtest- Historical Test
37 | - Object Oriented Programming for the Backtesting
38 | - Walk Forward Testing
39 | - Paper Trading (Forward Testing)
40 | - Live Testing
41 | 6. Order Execution and Management via APIs
42 | - Execution Technologies and Advanced Order Handling Techniques
43 | - Evaluating and Improving Trading Strategies
44 | - Running Algorithms in the Cloud and High Performance Computing (HPC)
45 | 7. Algorithmic Trading Platforms and APIs
46 | - Example 1: Stock Trading with Thinkorswim
47 | - Example 2: Crypto Trading with Binance
48 | - Example 3: Forex Trading with IG
49 |
50 |
--------------------------------------------------------------------------------
/images/11.2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/11.2.png
--------------------------------------------------------------------------------
/images/11.3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/11.3.png
--------------------------------------------------------------------------------
/images/Life is like ML.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/Life is like ML.jpg
--------------------------------------------------------------------------------
/images/activationfun.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/activationfun.png
--------------------------------------------------------------------------------
/images/ai_ml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/ai_ml.png
--------------------------------------------------------------------------------
/images/autoencoder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/autoencoder.png
--------------------------------------------------------------------------------
/images/autoencoder2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/autoencoder2.png
--------------------------------------------------------------------------------
/images/bpro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/bpro.png
--------------------------------------------------------------------------------
/images/error.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/error.jpg
--------------------------------------------------------------------------------
/images/eta.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/eta.png
--------------------------------------------------------------------------------
/images/ex1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/ex1.png
--------------------------------------------------------------------------------
/images/hello.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/hello.png
--------------------------------------------------------------------------------
/images/highlow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/highlow.png
--------------------------------------------------------------------------------
/images/intro_nn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/intro_nn.png
--------------------------------------------------------------------------------
/images/ipython-notebook-screenshot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/ipython-notebook-screenshot.jpg
--------------------------------------------------------------------------------
/images/ipython-screenshot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/ipython-screenshot.jpg
--------------------------------------------------------------------------------
/images/jupyter-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/jupyter-screenshot.png
--------------------------------------------------------------------------------
/images/mlp.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/mlp.PNG
--------------------------------------------------------------------------------
/images/model.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/model.png
--------------------------------------------------------------------------------
/images/nn-3-layer-network.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/nn-3-layer-network.png
--------------------------------------------------------------------------------
/images/nn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/nn.png
--------------------------------------------------------------------------------
/images/nn_timeline.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/nn_timeline.jpg
--------------------------------------------------------------------------------
/images/optimizing-what-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/optimizing-what-2.png
--------------------------------------------------------------------------------
/images/optimizing-what.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/optimizing-what.png
--------------------------------------------------------------------------------
/images/python-screenshot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/python-screenshot.jpg
--------------------------------------------------------------------------------
/images/spyder-screenshot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/spyder-screenshot.jpg
--------------------------------------------------------------------------------
/images/supervised.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/supervised.png
--------------------------------------------------------------------------------
/images/types.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AliHabibnia/Algorithmic_Trading_with_Python/ddda59eb73547309441157f294fa6dbfc11df466/images/types.png
--------------------------------------------------------------------------------