ml-finance-python
python scripts for finance machine learning
git clone https://9o.is/git/ml-finance-python.git
002_quantitative_momentum_strategy.ipynb
(116215B)
1 {
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Quantitative Momentum Strategy\n",
8 "\n",
9 "\"Momentum investing\" means investing in the stocks that have increased in price the most.\n",
10 "\n",
11 "For this project, we're going to build an investing strategy that selects the 50 stocks with the highest price momentum. From there, we will calculate recommended trades for an equal-weight portfolio of these 50 stocks.\n",
12 "\n",
13 "\n",
14 "## Library Imports\n",
15 "\n",
16 "The first thing we need to do is import the open-source software libraries that we'll be using in this tutorial."
17 ]
18 },
19 {
20 "cell_type": "code",
21 "execution_count": 1,
22 "metadata": {},
23 "outputs": [],
24 "source": [
25 "import numpy as np #The Numpy numerical computing library\n",
26 "import pandas as pd #The Pandas data science library\n",
27 "import requests #The requests library for HTTP requests in Python\n",
28 "import xlsxwriter #The XlsxWriter libarary for \n",
29 "import math #The Python math module\n",
30 "from scipy import stats #The SciPy stats module"
31 ]
32 },
33 {
34 "cell_type": "markdown",
35 "metadata": {},
36 "source": [
37 "## Importing Our List of Stocks\n",
38 "\n",
39 "As before, we'll need to import our list of stocks and our API token before proceeding. Make sure the `.csv` file is still in your working directory and import it with the following command:"
40 ]
41 },
42 {
43 "cell_type": "code",
44 "execution_count": 2,
45 "metadata": {},
46 "outputs": [],
47 "source": [
48 "stocks = pd.read_csv('sp_500_stocks.csv')\n",
49 "from secrets import IEX_CLOUD_API_TOKEN"
50 ]
51 },
52 {
53 "cell_type": "markdown",
54 "metadata": {},
55 "source": [
56 "## Making Our First API Call\n",
57 "\n",
58 "It's now time to make the first version of our momentum screener!\n",
59 "\n",
60 "We need to get one-year price returns for each stock in the universe. Here's how."
61 ]
62 },
63 {
64 "cell_type": "code",
65 "execution_count": 3,
66 "metadata": {},
67 "outputs": [
68 {
69 "data": {
70 "text/plain": [
71 "{'week52change': 1.271858,\n",
72 " 'week52high': 462.02,\n",
73 " 'week52low': 206.85,\n",
74 " 'marketcap': 1937104274094,\n",
75 " 'employees': 137265,\n",
76 " 'day200MovingAvg': 309.44,\n",
77 " 'day50MovingAvg': 390.09,\n",
78 " 'float': 4440629054,\n",
79 " 'avg10Volume': 54435185.2,\n",
80 " 'avg30Volume': 39067154.1,\n",
81 " 'ttmEPS': 13.7084,\n",
82 " 'ttmDividendRate': 3.22,\n",
83 " 'companyName': 'Apple, Inc.',\n",
84 " 'sharesOutstanding': 4331609946,\n",
85 " 'maxChangePercent': 452.5766,\n",
86 " 'year5ChangePercent': 3.0546,\n",
87 " 'year2ChangePercent': 1.1867,\n",
88 " 'year1ChangePercent': 1.186376,\n",
89 " 'ytdChangePercent': 0.512578,\n",
90 " 'month6ChangePercent': 0.407457,\n",
91 " 'month3ChangePercent': 0.485051,\n",
92 " 'month1ChangePercent': 0.19254,\n",
93 " 'day30ChangePercent': 0.253108,\n",
94 " 'day5ChangePercent': -0.008155,\n",
95 " 'nextDividendDate': '2020-08-16',\n",
96 " 'dividendYield': 0.007235663525925464,\n",
97 " 'nextEarningsDate': '2020-10-17',\n",
98 " 'exDividendDate': '2020-08-06',\n",
99 " 'peRatio': 34.17,\n",
100 " 'beta': 1.15885673879414}"
101 ]
102 },
103 "execution_count": 3,
104 "metadata": {},
105 "output_type": "execute_result"
106 }
107 ],
108 "source": [
109 "symbol = 'AAPL'\n",
110 "api_url = f'https://sandbox.iexapis.com/stable/stock/{symbol}/stats?token={IEX_CLOUD_API_TOKEN}'\n",
111 "data = requests.get(api_url).json()\n",
112 "data"
113 ]
114 },
115 {
116 "cell_type": "markdown",
117 "metadata": {},
118 "source": [
119 "## Parsing Our API Call\n",
120 "\n",
121 "This API call has all the information we need. We can parse it using the same square-bracket notation as in the first project of this course. Here is an example."
122 ]
123 },
124 {
125 "cell_type": "code",
126 "execution_count": 4,
127 "metadata": {},
128 "outputs": [
129 {
130 "data": {
131 "text/plain": [
132 "1.186376"
133 ]
134 },
135 "execution_count": 4,
136 "metadata": {},
137 "output_type": "execute_result"
138 }
139 ],
140 "source": [
141 "data['year1ChangePercent']"
142 ]
143 },
144 {
145 "cell_type": "markdown",
146 "metadata": {},
147 "source": [
148 "## Executing A Batch API Call & Building Our DataFrame\n",
149 "\n",
150 "Just like in our first project, it's now time to execute several batch API calls and add the information we need to our DataFrame.\n",
151 "\n",
152 "We'll start by running the following code cell, which contains some code we already built last time that we can re-use for this project. More specifically, it contains a function called `chunks` that we can use to divide our list of securities into groups of 100."
153 ]
154 },
155 {
156 "cell_type": "code",
157 "execution_count": 5,
158 "metadata": {},
159 "outputs": [],
160 "source": [
161 "# Function sourced from \n",
162 "# https://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks\n",
163 "def chunks(lst, n):\n",
164 " \"\"\"Yield successive n-sized chunks from lst.\"\"\"\n",
165 " for i in range(0, len(lst), n):\n",
166 " yield lst[i:i + n] \n",
167 " \n",
168 "symbol_groups = list(chunks(stocks['Ticker'], 100))\n",
169 "symbol_strings = []\n",
170 "for i in range(0, len(symbol_groups)):\n",
171 " symbol_strings.append(','.join(symbol_groups[i]))\n",
172 "# print(symbol_strings[i])\n",
173 "\n",
174 "my_columns = ['Ticker', 'Price', 'One-Year Price Return', 'Number of Shares to Buy']"
175 ]
176 },
177 {
178 "cell_type": "markdown",
179 "metadata": {},
180 "source": [
181 "Now we need to create a blank DataFrame and add our data to the data frame one-by-one."
182 ]
183 },
184 {
185 "cell_type": "code",
186 "execution_count": 6,
187 "metadata": {},
188 "outputs": [
189 {
190 "data": {
191 "text/html": [
192 "<div>\n",
193 "<style scoped>\n",
194 " .dataframe tbody tr th:only-of-type {\n",
195 " vertical-align: middle;\n",
196 " }\n",
197 "\n",
198 " .dataframe tbody tr th {\n",
199 " vertical-align: top;\n",
200 " }\n",
201 "\n",
202 " .dataframe thead th {\n",
203 " text-align: right;\n",
204 " }\n",
205 "</style>\n",
206 "<table border=\"1\" class=\"dataframe\">\n",
207 " <thead>\n",
208 " <tr style=\"text-align: right;\">\n",
209 " <th></th>\n",
210 " <th>Ticker</th>\n",
211 " <th>Price</th>\n",
212 " <th>One-Year Price Return</th>\n",
213 " <th>Number of Shares to Buy</th>\n",
214 " </tr>\n",
215 " </thead>\n",
216 " <tbody>\n",
217 " <tr>\n",
218 " <th>0</th>\n",
219 " <td>A</td>\n",
220 " <td>101.50</td>\n",
221 " <td>0.452986</td>\n",
222 " <td>N/A</td>\n",
223 " </tr>\n",
224 " <tr>\n",
225 " <th>1</th>\n",
226 " <td>AAL</td>\n",
227 " <td>13.65</td>\n",
228 " <td>-0.527621</td>\n",
229 " <td>N/A</td>\n",
230 " </tr>\n",
231 " <tr>\n",
232 " <th>2</th>\n",
233 " <td>AAP</td>\n",
234 " <td>157.72</td>\n",
235 " <td>0.088479</td>\n",
236 " <td>N/A</td>\n",
237 " </tr>\n",
238 " <tr>\n",
239 " <th>3</th>\n",
240 " <td>AAPL</td>\n",
241 " <td>453.87</td>\n",
242 " <td>1.172528</td>\n",
243 " <td>N/A</td>\n",
244 " </tr>\n",
245 " <tr>\n",
246 " <th>4</th>\n",
247 " <td>ABBV</td>\n",
248 " <td>95.71</td>\n",
249 " <td>0.476493</td>\n",
250 " <td>N/A</td>\n",
251 " </tr>\n",
252 " <tr>\n",
253 " <th>...</th>\n",
254 " <td>...</td>\n",
255 " <td>...</td>\n",
256 " <td>...</td>\n",
257 " <td>...</td>\n",
258 " </tr>\n",
259 " <tr>\n",
260 " <th>500</th>\n",
261 " <td>YUM</td>\n",
262 " <td>93.50</td>\n",
263 " <td>-0.208066</td>\n",
264 " <td>N/A</td>\n",
265 " </tr>\n",
266 " <tr>\n",
267 " <th>501</th>\n",
268 " <td>ZBH</td>\n",
269 " <td>138.91</td>\n",
270 " <td>0.003031</td>\n",
271 " <td>N/A</td>\n",
272 " </tr>\n",
273 " <tr>\n",
274 " <th>502</th>\n",
275 " <td>ZBRA</td>\n",
276 " <td>287.51</td>\n",
277 " <td>0.369427</td>\n",
278 " <td>N/A</td>\n",
279 " </tr>\n",
280 " <tr>\n",
281 " <th>503</th>\n",
282 " <td>ZION</td>\n",
283 " <td>35.73</td>\n",
284 " <td>-0.162236</td>\n",
285 " <td>N/A</td>\n",
286 " </tr>\n",
287 " <tr>\n",
288 " <th>504</th>\n",
289 " <td>ZTS</td>\n",
290 " <td>165.46</td>\n",
291 " <td>0.288770</td>\n",
292 " <td>N/A</td>\n",
293 " </tr>\n",
294 " </tbody>\n",
295 "</table>\n",
296 "<p>505 rows × 4 columns</p>\n",
297 "</div>"
298 ],
299 "text/plain": [
300 " Ticker Price One-Year Price Return Number of Shares to Buy\n",
301 "0 A 101.50 0.452986 N/A\n",
302 "1 AAL 13.65 -0.527621 N/A\n",
303 "2 AAP 157.72 0.088479 N/A\n",
304 "3 AAPL 453.87 1.172528 N/A\n",
305 "4 ABBV 95.71 0.476493 N/A\n",
306 ".. ... ... ... ...\n",
307 "500 YUM 93.50 -0.208066 N/A\n",
308 "501 ZBH 138.91 0.003031 N/A\n",
309 "502 ZBRA 287.51 0.369427 N/A\n",
310 "503 ZION 35.73 -0.162236 N/A\n",
311 "504 ZTS 165.46 0.288770 N/A\n",
312 "\n",
313 "[505 rows x 4 columns]"
314 ]
315 },
316 "execution_count": 6,
317 "metadata": {},
318 "output_type": "execute_result"
319 }
320 ],
321 "source": [
322 "final_dataframe = pd.DataFrame(columns = my_columns)\n",
323 "\n",
324 "for symbol_string in symbol_strings:\n",
325 "# print(symbol_strings)\n",
326 " batch_api_call_url = f'https://sandbox.iexapis.com/stable/stock/market/batch/?types=stats,quote&symbols={symbol_string}&token={IEX_CLOUD_API_TOKEN}'\n",
327 " data = requests.get(batch_api_call_url).json()\n",
328 " for symbol in symbol_string.split(','):\n",
329 " final_dataframe = final_dataframe.append(\n",
330 " pd.Series([symbol, \n",
331 " data[symbol]['quote']['latestPrice'],\n",
332 " data[symbol]['stats']['year1ChangePercent'],\n",
333 " 'N/A'\n",
334 " ], \n",
335 " index = my_columns), \n",
336 " ignore_index = True)\n",
337 " \n",
338 " \n",
339 "final_dataframe"
340 ]
341 },
342 {
343 "cell_type": "markdown",
344 "metadata": {},
345 "source": [
346 "## Removing Low-Momentum Stocks\n",
347 "\n",
348 "The investment strategy that we're building seeks to identify the 50 highest-momentum stocks in the S&P 500.\n",
349 "\n",
350 "Because of this, the next thing we need to do is remove all the stocks in our DataFrame that fall below this momentum threshold. We'll sort the DataFrame by the stocks' one-year price return, and drop all stocks outside the top 50.\n"
351 ]
352 },
353 {
354 "cell_type": "code",
355 "execution_count": 7,
356 "metadata": {},
357 "outputs": [
358 {
359 "data": {
360 "text/html": [
361 "<div>\n",
362 "<style scoped>\n",
363 " .dataframe tbody tr th:only-of-type {\n",
364 " vertical-align: middle;\n",
365 " }\n",
366 "\n",
367 " .dataframe tbody tr th {\n",
368 " vertical-align: top;\n",
369 " }\n",
370 "\n",
371 " .dataframe thead th {\n",
372 " text-align: right;\n",
373 " }\n",
374 "</style>\n",
375 "<table border=\"1\" class=\"dataframe\">\n",
376 " <thead>\n",
377 " <tr style=\"text-align: right;\">\n",
378 " <th></th>\n",
379 " <th>Ticker</th>\n",
380 " <th>Price</th>\n",
381 " <th>One-Year Price Return</th>\n",
382 " <th>Number of Shares to Buy</th>\n",
383 " </tr>\n",
384 " </thead>\n",
385 " <tbody>\n",
386 " <tr>\n",
387 " <th>0</th>\n",
388 " <td>NVDA</td>\n",
389 " <td>458.14</td>\n",
390 " <td>2.015964</td>\n",
391 " <td>N/A</td>\n",
392 " </tr>\n",
393 " <tr>\n",
394 " <th>1</th>\n",
395 " <td>DXCM</td>\n",
396 " <td>441.29</td>\n",
397 " <td>1.721219</td>\n",
398 " <td>N/A</td>\n",
399 " </tr>\n",
400 " <tr>\n",
401 " <th>2</th>\n",
402 " <td>AMD</td>\n",
403 " <td>85.46</td>\n",
404 " <td>1.632817</td>\n",
405 " <td>N/A</td>\n",
406 " </tr>\n",
407 " <tr>\n",
408 " <th>3</th>\n",
409 " <td>CARR</td>\n",
410 " <td>29.94</td>\n",
411 " <td>1.489900</td>\n",
412 " <td>N/A</td>\n",
413 " </tr>\n",
414 " <tr>\n",
415 " <th>4</th>\n",
416 " <td>AAPL</td>\n",
417 " <td>453.87</td>\n",
418 " <td>1.172528</td>\n",
419 " <td>N/A</td>\n",
420 " </tr>\n",
421 " <tr>\n",
422 " <th>5</th>\n",
423 " <td>REGN</td>\n",
424 " <td>624.50</td>\n",
425 " <td>1.031728</td>\n",
426 " <td>N/A</td>\n",
427 " </tr>\n",
428 " <tr>\n",
429 " <th>6</th>\n",
430 " <td>SWKS</td>\n",
431 " <td>153.26</td>\n",
432 " <td>0.921570</td>\n",
433 " <td>N/A</td>\n",
434 " </tr>\n",
435 " <tr>\n",
436 " <th>7</th>\n",
437 " <td>WST</td>\n",
438 " <td>283.20</td>\n",
439 " <td>0.921000</td>\n",
440 " <td>N/A</td>\n",
441 " </tr>\n",
442 " <tr>\n",
443 " <th>8</th>\n",
444 " <td>LRCX</td>\n",
445 " <td>393.68</td>\n",
446 " <td>0.892740</td>\n",
447 " <td>N/A</td>\n",
448 " </tr>\n",
449 " <tr>\n",
450 " <th>9</th>\n",
451 " <td>QRVO</td>\n",
452 " <td>132.38</td>\n",
453 " <td>0.858187</td>\n",
454 " <td>N/A</td>\n",
455 " </tr>\n",
456 " <tr>\n",
457 " <th>10</th>\n",
458 " <td>PYPL</td>\n",
459 " <td>196.30</td>\n",
460 " <td>0.829338</td>\n",
461 " <td>N/A</td>\n",
462 " </tr>\n",
463 " <tr>\n",
464 " <th>11</th>\n",
465 " <td>AMZN</td>\n",
466 " <td>3192.88</td>\n",
467 " <td>0.759898</td>\n",
468 " <td>N/A</td>\n",
469 " </tr>\n",
470 " <tr>\n",
471 " <th>12</th>\n",
472 " <td>ATVI</td>\n",
473 " <td>83.82</td>\n",
474 " <td>0.710587</td>\n",
475 " <td>N/A</td>\n",
476 " </tr>\n",
477 " <tr>\n",
478 " <th>13</th>\n",
479 " <td>ALGN</td>\n",
480 " <td>313.73</td>\n",
481 " <td>0.709093</td>\n",
482 " <td>N/A</td>\n",
483 " </tr>\n",
484 " <tr>\n",
485 " <th>14</th>\n",
486 " <td>NEM</td>\n",
487 " <td>63.72</td>\n",
488 " <td>0.698936</td>\n",
489 " <td>N/A</td>\n",
490 " </tr>\n",
491 " <tr>\n",
492 " <th>15</th>\n",
493 " <td>ODFL</td>\n",
494 " <td>196.24</td>\n",
495 " <td>0.690263</td>\n",
496 " <td>N/A</td>\n",
497 " </tr>\n",
498 " <tr>\n",
499 " <th>16</th>\n",
500 " <td>ROL</td>\n",
501 " <td>55.90</td>\n",
502 " <td>0.676072</td>\n",
503 " <td>N/A</td>\n",
504 " </tr>\n",
505 " <tr>\n",
506 " <th>17</th>\n",
507 " <td>NOW</td>\n",
508 " <td>439.05</td>\n",
509 " <td>0.656782</td>\n",
510 " <td>N/A</td>\n",
511 " </tr>\n",
512 " <tr>\n",
513 " <th>18</th>\n",
514 " <td>LOW</td>\n",
515 " <td>159.19</td>\n",
516 " <td>0.646186</td>\n",
517 " <td>N/A</td>\n",
518 " </tr>\n",
519 " <tr>\n",
520 " <th>19</th>\n",
521 " <td>DPZ</td>\n",
522 " <td>405.67</td>\n",
523 " <td>0.644884</td>\n",
524 " <td>N/A</td>\n",
525 " </tr>\n",
526 " <tr>\n",
527 " <th>20</th>\n",
528 " <td>FBHS</td>\n",
529 " <td>85.93</td>\n",
530 " <td>0.635603</td>\n",
531 " <td>N/A</td>\n",
532 " </tr>\n",
533 " <tr>\n",
534 " <th>21</th>\n",
535 " <td>FAST</td>\n",
536 " <td>49.98</td>\n",
537 " <td>0.624303</td>\n",
538 " <td>N/A</td>\n",
539 " </tr>\n",
540 " <tr>\n",
541 " <th>22</th>\n",
542 " <td>TGT</td>\n",
543 " <td>136.10</td>\n",
544 " <td>0.616877</td>\n",
545 " <td>N/A</td>\n",
546 " </tr>\n",
547 " <tr>\n",
548 " <th>23</th>\n",
549 " <td>QCOM</td>\n",
550 " <td>119.34</td>\n",
551 " <td>0.609546</td>\n",
552 " <td>N/A</td>\n",
553 " </tr>\n",
554 " <tr>\n",
555 " <th>24</th>\n",
556 " <td>URI</td>\n",
557 " <td>181.40</td>\n",
558 " <td>0.590406</td>\n",
559 " <td>N/A</td>\n",
560 " </tr>\n",
561 " <tr>\n",
562 " <th>25</th>\n",
563 " <td>CHTR</td>\n",
564 " <td>602.51</td>\n",
565 " <td>0.586074</td>\n",
566 " <td>N/A</td>\n",
567 " </tr>\n",
568 " <tr>\n",
569 " <th>26</th>\n",
570 " <td>MSCI</td>\n",
571 " <td>369.93</td>\n",
572 " <td>0.583839</td>\n",
573 " <td>N/A</td>\n",
574 " </tr>\n",
575 " <tr>\n",
576 " <th>27</th>\n",
577 " <td>VAR</td>\n",
578 " <td>174.79</td>\n",
579 " <td>0.569642</td>\n",
580 " <td>N/A</td>\n",
581 " </tr>\n",
582 " <tr>\n",
583 " <th>28</th>\n",
584 " <td>ROK</td>\n",
585 " <td>247.30</td>\n",
586 " <td>0.560821</td>\n",
587 " <td>N/A</td>\n",
588 " </tr>\n",
589 " <tr>\n",
590 " <th>29</th>\n",
591 " <td>BIO</td>\n",
592 " <td>517.62</td>\n",
593 " <td>0.558503</td>\n",
594 " <td>N/A</td>\n",
595 " </tr>\n",
596 " <tr>\n",
597 " <th>30</th>\n",
598 " <td>KSU</td>\n",
599 " <td>193.03</td>\n",
600 " <td>0.548382</td>\n",
601 " <td>N/A</td>\n",
602 " </tr>\n",
603 " <tr>\n",
604 " <th>31</th>\n",
605 " <td>KLAC</td>\n",
606 " <td>216.00</td>\n",
607 " <td>0.547432</td>\n",
608 " <td>N/A</td>\n",
609 " </tr>\n",
610 " <tr>\n",
611 " <th>32</th>\n",
612 " <td>ADBE</td>\n",
613 " <td>449.01</td>\n",
614 " <td>0.540159</td>\n",
615 " <td>N/A</td>\n",
616 " </tr>\n",
617 " <tr>\n",
618 " <th>33</th>\n",
619 " <td>ABMD</td>\n",
620 " <td>307.07</td>\n",
621 " <td>0.537076</td>\n",
622 " <td>N/A</td>\n",
623 " </tr>\n",
624 " <tr>\n",
625 " <th>34</th>\n",
626 " <td>CDNS</td>\n",
627 " <td>111.60</td>\n",
628 " <td>0.532542</td>\n",
629 " <td>N/A</td>\n",
630 " </tr>\n",
631 " <tr>\n",
632 " <th>35</th>\n",
633 " <td>NFLX</td>\n",
634 " <td>486.12</td>\n",
635 " <td>0.531236</td>\n",
636 " <td>N/A</td>\n",
637 " </tr>\n",
638 " <tr>\n",
639 " <th>36</th>\n",
640 " <td>ADSK</td>\n",
641 " <td>240.90</td>\n",
642 " <td>0.526803</td>\n",
643 " <td>N/A</td>\n",
644 " </tr>\n",
645 " <tr>\n",
646 " <th>37</th>\n",
647 " <td>FTNT</td>\n",
648 " <td>132.50</td>\n",
649 " <td>0.522105</td>\n",
650 " <td>N/A</td>\n",
651 " </tr>\n",
652 " <tr>\n",
653 " <th>38</th>\n",
654 " <td>MSFT</td>\n",
655 " <td>215.73</td>\n",
656 " <td>0.518900</td>\n",
657 " <td>N/A</td>\n",
658 " </tr>\n",
659 " <tr>\n",
660 " <th>39</th>\n",
661 " <td>EA</td>\n",
662 " <td>145.30</td>\n",
663 " <td>0.517087</td>\n",
664 " <td>N/A</td>\n",
665 " </tr>\n",
666 " <tr>\n",
667 " <th>40</th>\n",
668 " <td>TMO</td>\n",
669 " <td>422.95</td>\n",
670 " <td>0.513970</td>\n",
671 " <td>N/A</td>\n",
672 " </tr>\n",
673 " <tr>\n",
674 " <th>41</th>\n",
675 " <td>KR</td>\n",
676 " <td>36.29</td>\n",
677 " <td>0.502626</td>\n",
678 " <td>N/A</td>\n",
679 " </tr>\n",
680 " <tr>\n",
681 " <th>42</th>\n",
682 " <td>DHI</td>\n",
683 " <td>73.64</td>\n",
684 " <td>0.499570</td>\n",
685 " <td>N/A</td>\n",
686 " </tr>\n",
687 " <tr>\n",
688 " <th>43</th>\n",
689 " <td>CTXS</td>\n",
690 " <td>141.53</td>\n",
691 " <td>0.496854</td>\n",
692 " <td>N/A</td>\n",
693 " </tr>\n",
694 " <tr>\n",
695 " <th>44</th>\n",
696 " <td>LEN</td>\n",
697 " <td>77.72</td>\n",
698 " <td>0.495581</td>\n",
699 " <td>N/A</td>\n",
700 " </tr>\n",
701 " <tr>\n",
702 " <th>45</th>\n",
703 " <td>MAS</td>\n",
704 " <td>61.01</td>\n",
705 " <td>0.493611</td>\n",
706 " <td>N/A</td>\n",
707 " </tr>\n",
708 " <tr>\n",
709 " <th>46</th>\n",
710 " <td>TMUS</td>\n",
711 " <td>119.48</td>\n",
712 " <td>0.490167</td>\n",
713 " <td>N/A</td>\n",
714 " </tr>\n",
715 " <tr>\n",
716 " <th>47</th>\n",
717 " <td>BBY</td>\n",
718 " <td>107.33</td>\n",
719 " <td>0.486775</td>\n",
720 " <td>N/A</td>\n",
721 " </tr>\n",
722 " <tr>\n",
723 " <th>48</th>\n",
724 " <td>VRTX</td>\n",
725 " <td>280.26</td>\n",
726 " <td>0.486553</td>\n",
727 " <td>N/A</td>\n",
728 " </tr>\n",
729 " <tr>\n",
730 " <th>49</th>\n",
731 " <td>PWR</td>\n",
732 " <td>50.22</td>\n",
733 " <td>0.482556</td>\n",
734 " <td>N/A</td>\n",
735 " </tr>\n",
736 " <tr>\n",
737 " <th>50</th>\n",
738 " <td>OTIS</td>\n",
739 " <td>67.90</td>\n",
740 " <td>0.481000</td>\n",
741 " <td>N/A</td>\n",
742 " </tr>\n",
743 " </tbody>\n",
744 "</table>\n",
745 "</div>"
746 ],
747 "text/plain": [
748 " Ticker Price One-Year Price Return Number of Shares to Buy\n",
749 "0 NVDA 458.14 2.015964 N/A\n",
750 "1 DXCM 441.29 1.721219 N/A\n",
751 "2 AMD 85.46 1.632817 N/A\n",
752 "3 CARR 29.94 1.489900 N/A\n",
753 "4 AAPL 453.87 1.172528 N/A\n",
754 "5 REGN 624.50 1.031728 N/A\n",
755 "6 SWKS 153.26 0.921570 N/A\n",
756 "7 WST 283.20 0.921000 N/A\n",
757 "8 LRCX 393.68 0.892740 N/A\n",
758 "9 QRVO 132.38 0.858187 N/A\n",
759 "10 PYPL 196.30 0.829338 N/A\n",
760 "11 AMZN 3192.88 0.759898 N/A\n",
761 "12 ATVI 83.82 0.710587 N/A\n",
762 "13 ALGN 313.73 0.709093 N/A\n",
763 "14 NEM 63.72 0.698936 N/A\n",
764 "15 ODFL 196.24 0.690263 N/A\n",
765 "16 ROL 55.90 0.676072 N/A\n",
766 "17 NOW 439.05 0.656782 N/A\n",
767 "18 LOW 159.19 0.646186 N/A\n",
768 "19 DPZ 405.67 0.644884 N/A\n",
769 "20 FBHS 85.93 0.635603 N/A\n",
770 "21 FAST 49.98 0.624303 N/A\n",
771 "22 TGT 136.10 0.616877 N/A\n",
772 "23 QCOM 119.34 0.609546 N/A\n",
773 "24 URI 181.40 0.590406 N/A\n",
774 "25 CHTR 602.51 0.586074 N/A\n",
775 "26 MSCI 369.93 0.583839 N/A\n",
776 "27 VAR 174.79 0.569642 N/A\n",
777 "28 ROK 247.30 0.560821 N/A\n",
778 "29 BIO 517.62 0.558503 N/A\n",
779 "30 KSU 193.03 0.548382 N/A\n",
780 "31 KLAC 216.00 0.547432 N/A\n",
781 "32 ADBE 449.01 0.540159 N/A\n",
782 "33 ABMD 307.07 0.537076 N/A\n",
783 "34 CDNS 111.60 0.532542 N/A\n",
784 "35 NFLX 486.12 0.531236 N/A\n",
785 "36 ADSK 240.90 0.526803 N/A\n",
786 "37 FTNT 132.50 0.522105 N/A\n",
787 "38 MSFT 215.73 0.518900 N/A\n",
788 "39 EA 145.30 0.517087 N/A\n",
789 "40 TMO 422.95 0.513970 N/A\n",
790 "41 KR 36.29 0.502626 N/A\n",
791 "42 DHI 73.64 0.499570 N/A\n",
792 "43 CTXS 141.53 0.496854 N/A\n",
793 "44 LEN 77.72 0.495581 N/A\n",
794 "45 MAS 61.01 0.493611 N/A\n",
795 "46 TMUS 119.48 0.490167 N/A\n",
796 "47 BBY 107.33 0.486775 N/A\n",
797 "48 VRTX 280.26 0.486553 N/A\n",
798 "49 PWR 50.22 0.482556 N/A\n",
799 "50 OTIS 67.90 0.481000 N/A"
800 ]
801 },
802 "execution_count": 7,
803 "metadata": {},
804 "output_type": "execute_result"
805 }
806 ],
807 "source": [
808 "final_dataframe.sort_values('One-Year Price Return', ascending = False, inplace = True)\n",
809 "final_dataframe = final_dataframe[:51]\n",
810 "final_dataframe.reset_index(drop = True, inplace = True)\n",
811 "final_dataframe"
812 ]
813 },
814 {
815 "cell_type": "markdown",
816 "metadata": {},
817 "source": [
818 "## Calculating the Number of Shares to Buy\n",
819 "\n",
820 "Just like in the last project, we now need to calculate the number of shares we need to buy. The one change we're going to make is wrapping this functionality inside a function, since we'll be using it again later in this Jupyter Notebook.\n",
821 "\n",
822 "Since we've already done most of the work on this, try to complete the following two code cells without watching me do it first!"
823 ]
824 },
825 {
826 "cell_type": "code",
827 "execution_count": 8,
828 "metadata": {},
829 "outputs": [
830 {
831 "name": "stdout",
832 "output_type": "stream",
833 "text": [
834 "Enter the value of your portfolio:1000000\n",
835 "1000000\n"
836 ]
837 }
838 ],
839 "source": [
840 "def portfolio_input():\n",
841 " global portfolio_size\n",
842 " portfolio_size = input(\"Enter the value of your portfolio:\")\n",
843 "\n",
844 " try:\n",
845 " val = float(portfolio_size)\n",
846 " except ValueError:\n",
847 " print(\"That's not a number! \\n Try again:\")\n",
848 " portfolio_size = input(\"Enter the value of your portfolio:\")\n",
849 "\n",
850 "portfolio_input()\n",
851 "print(portfolio_size)"
852 ]
853 },
854 {
855 "cell_type": "code",
856 "execution_count": 9,
857 "metadata": {},
858 "outputs": [
859 {
860 "name": "stderr",
861 "output_type": "stream",
862 "text": [
863 "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pandas/core/indexing.py:494: SettingWithCopyWarning: \n",
864 "A value is trying to be set on a copy of a slice from a DataFrame.\n",
865 "Try using .loc[row_indexer,col_indexer] = value instead\n",
866 "\n",
867 "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
868 " self.obj[item] = s\n"
869 ]
870 },
871 {
872 "data": {
873 "text/html": [
874 "<div>\n",
875 "<style scoped>\n",
876 " .dataframe tbody tr th:only-of-type {\n",
877 " vertical-align: middle;\n",
878 " }\n",
879 "\n",
880 " .dataframe tbody tr th {\n",
881 " vertical-align: top;\n",
882 " }\n",
883 "\n",
884 " .dataframe thead th {\n",
885 " text-align: right;\n",
886 " }\n",
887 "</style>\n",
888 "<table border=\"1\" class=\"dataframe\">\n",
889 " <thead>\n",
890 " <tr style=\"text-align: right;\">\n",
891 " <th></th>\n",
892 " <th>Ticker</th>\n",
893 " <th>Price</th>\n",
894 " <th>One-Year Price Return</th>\n",
895 " <th>Number of Shares to Buy</th>\n",
896 " </tr>\n",
897 " </thead>\n",
898 " <tbody>\n",
899 " <tr>\n",
900 " <th>0</th>\n",
901 " <td>NVDA</td>\n",
902 " <td>458.14</td>\n",
903 " <td>2.015964</td>\n",
904 " <td>42</td>\n",
905 " </tr>\n",
906 " <tr>\n",
907 " <th>1</th>\n",
908 " <td>DXCM</td>\n",
909 " <td>441.29</td>\n",
910 " <td>1.721219</td>\n",
911 " <td>44</td>\n",
912 " </tr>\n",
913 " <tr>\n",
914 " <th>2</th>\n",
915 " <td>AMD</td>\n",
916 " <td>85.46</td>\n",
917 " <td>1.632817</td>\n",
918 " <td>229</td>\n",
919 " </tr>\n",
920 " <tr>\n",
921 " <th>3</th>\n",
922 " <td>CARR</td>\n",
923 " <td>29.94</td>\n",
924 " <td>1.489900</td>\n",
925 " <td>654</td>\n",
926 " </tr>\n",
927 " <tr>\n",
928 " <th>4</th>\n",
929 " <td>AAPL</td>\n",
930 " <td>453.87</td>\n",
931 " <td>1.172528</td>\n",
932 " <td>43</td>\n",
933 " </tr>\n",
934 " <tr>\n",
935 " <th>5</th>\n",
936 " <td>REGN</td>\n",
937 " <td>624.50</td>\n",
938 " <td>1.031728</td>\n",
939 " <td>31</td>\n",
940 " </tr>\n",
941 " <tr>\n",
942 " <th>6</th>\n",
943 " <td>SWKS</td>\n",
944 " <td>153.26</td>\n",
945 " <td>0.921570</td>\n",
946 " <td>127</td>\n",
947 " </tr>\n",
948 " <tr>\n",
949 " <th>7</th>\n",
950 " <td>WST</td>\n",
951 " <td>283.20</td>\n",
952 " <td>0.921000</td>\n",
953 " <td>69</td>\n",
954 " </tr>\n",
955 " <tr>\n",
956 " <th>8</th>\n",
957 " <td>LRCX</td>\n",
958 " <td>393.68</td>\n",
959 " <td>0.892740</td>\n",
960 " <td>49</td>\n",
961 " </tr>\n",
962 " <tr>\n",
963 " <th>9</th>\n",
964 " <td>QRVO</td>\n",
965 " <td>132.38</td>\n",
966 " <td>0.858187</td>\n",
967 " <td>148</td>\n",
968 " </tr>\n",
969 " <tr>\n",
970 " <th>10</th>\n",
971 " <td>PYPL</td>\n",
972 " <td>196.30</td>\n",
973 " <td>0.829338</td>\n",
974 " <td>99</td>\n",
975 " </tr>\n",
976 " <tr>\n",
977 " <th>11</th>\n",
978 " <td>AMZN</td>\n",
979 " <td>3192.88</td>\n",
980 " <td>0.759898</td>\n",
981 " <td>6</td>\n",
982 " </tr>\n",
983 " <tr>\n",
984 " <th>12</th>\n",
985 " <td>ATVI</td>\n",
986 " <td>83.82</td>\n",
987 " <td>0.710587</td>\n",
988 " <td>233</td>\n",
989 " </tr>\n",
990 " <tr>\n",
991 " <th>13</th>\n",
992 " <td>ALGN</td>\n",
993 " <td>313.73</td>\n",
994 " <td>0.709093</td>\n",
995 " <td>62</td>\n",
996 " </tr>\n",
997 " <tr>\n",
998 " <th>14</th>\n",
999 " <td>NEM</td>\n",
1000 " <td>63.72</td>\n",
1001 " <td>0.698936</td>\n",
1002 " <td>307</td>\n",
1003 " </tr>\n",
1004 " <tr>\n",
1005 " <th>15</th>\n",
1006 " <td>ODFL</td>\n",
1007 " <td>196.24</td>\n",
1008 " <td>0.690263</td>\n",
1009 " <td>99</td>\n",
1010 " </tr>\n",
1011 " <tr>\n",
1012 " <th>16</th>\n",
1013 " <td>ROL</td>\n",
1014 " <td>55.90</td>\n",
1015 " <td>0.676072</td>\n",
1016 " <td>350</td>\n",
1017 " </tr>\n",
1018 " <tr>\n",
1019 " <th>17</th>\n",
1020 " <td>NOW</td>\n",
1021 " <td>439.05</td>\n",
1022 " <td>0.656782</td>\n",
1023 " <td>44</td>\n",
1024 " </tr>\n",
1025 " <tr>\n",
1026 " <th>18</th>\n",
1027 " <td>LOW</td>\n",
1028 " <td>159.19</td>\n",
1029 " <td>0.646186</td>\n",
1030 " <td>123</td>\n",
1031 " </tr>\n",
1032 " <tr>\n",
1033 " <th>19</th>\n",
1034 " <td>DPZ</td>\n",
1035 " <td>405.67</td>\n",
1036 " <td>0.644884</td>\n",
1037 " <td>48</td>\n",
1038 " </tr>\n",
1039 " <tr>\n",
1040 " <th>20</th>\n",
1041 " <td>FBHS</td>\n",
1042 " <td>85.93</td>\n",
1043 " <td>0.635603</td>\n",
1044 " <td>228</td>\n",
1045 " </tr>\n",
1046 " <tr>\n",
1047 " <th>21</th>\n",
1048 " <td>FAST</td>\n",
1049 " <td>49.98</td>\n",
1050 " <td>0.624303</td>\n",
1051 " <td>392</td>\n",
1052 " </tr>\n",
1053 " <tr>\n",
1054 " <th>22</th>\n",
1055 " <td>TGT</td>\n",
1056 " <td>136.10</td>\n",
1057 " <td>0.616877</td>\n",
1058 " <td>144</td>\n",
1059 " </tr>\n",
1060 " <tr>\n",
1061 " <th>23</th>\n",
1062 " <td>QCOM</td>\n",
1063 " <td>119.34</td>\n",
1064 " <td>0.609546</td>\n",
1065 " <td>164</td>\n",
1066 " </tr>\n",
1067 " <tr>\n",
1068 " <th>24</th>\n",
1069 " <td>URI</td>\n",
1070 " <td>181.40</td>\n",
1071 " <td>0.590406</td>\n",
1072 " <td>108</td>\n",
1073 " </tr>\n",
1074 " <tr>\n",
1075 " <th>25</th>\n",
1076 " <td>CHTR</td>\n",
1077 " <td>602.51</td>\n",
1078 " <td>0.586074</td>\n",
1079 " <td>32</td>\n",
1080 " </tr>\n",
1081 " <tr>\n",
1082 " <th>26</th>\n",
1083 " <td>MSCI</td>\n",
1084 " <td>369.93</td>\n",
1085 " <td>0.583839</td>\n",
1086 " <td>53</td>\n",
1087 " </tr>\n",
1088 " <tr>\n",
1089 " <th>27</th>\n",
1090 " <td>VAR</td>\n",
1091 " <td>174.79</td>\n",
1092 " <td>0.569642</td>\n",
1093 " <td>112</td>\n",
1094 " </tr>\n",
1095 " <tr>\n",
1096 " <th>28</th>\n",
1097 " <td>ROK</td>\n",
1098 " <td>247.30</td>\n",
1099 " <td>0.560821</td>\n",
1100 " <td>79</td>\n",
1101 " </tr>\n",
1102 " <tr>\n",
1103 " <th>29</th>\n",
1104 " <td>BIO</td>\n",
1105 " <td>517.62</td>\n",
1106 " <td>0.558503</td>\n",
1107 " <td>37</td>\n",
1108 " </tr>\n",
1109 " <tr>\n",
1110 " <th>30</th>\n",
1111 " <td>KSU</td>\n",
1112 " <td>193.03</td>\n",
1113 " <td>0.548382</td>\n",
1114 " <td>101</td>\n",
1115 " </tr>\n",
1116 " <tr>\n",
1117 " <th>31</th>\n",
1118 " <td>KLAC</td>\n",
1119 " <td>216.00</td>\n",
1120 " <td>0.547432</td>\n",
1121 " <td>90</td>\n",
1122 " </tr>\n",
1123 " <tr>\n",
1124 " <th>32</th>\n",
1125 " <td>ADBE</td>\n",
1126 " <td>449.01</td>\n",
1127 " <td>0.540159</td>\n",
1128 " <td>43</td>\n",
1129 " </tr>\n",
1130 " <tr>\n",
1131 " <th>33</th>\n",
1132 " <td>ABMD</td>\n",
1133 " <td>307.07</td>\n",
1134 " <td>0.537076</td>\n",
1135 " <td>63</td>\n",
1136 " </tr>\n",
1137 " <tr>\n",
1138 " <th>34</th>\n",
1139 " <td>CDNS</td>\n",
1140 " <td>111.60</td>\n",
1141 " <td>0.532542</td>\n",
1142 " <td>175</td>\n",
1143 " </tr>\n",
1144 " <tr>\n",
1145 " <th>35</th>\n",
1146 " <td>NFLX</td>\n",
1147 " <td>486.12</td>\n",
1148 " <td>0.531236</td>\n",
1149 " <td>40</td>\n",
1150 " </tr>\n",
1151 " <tr>\n",
1152 " <th>36</th>\n",
1153 " <td>ADSK</td>\n",
1154 " <td>240.90</td>\n",
1155 " <td>0.526803</td>\n",
1156 " <td>81</td>\n",
1157 " </tr>\n",
1158 " <tr>\n",
1159 " <th>37</th>\n",
1160 " <td>FTNT</td>\n",
1161 " <td>132.50</td>\n",
1162 " <td>0.522105</td>\n",
1163 " <td>147</td>\n",
1164 " </tr>\n",
1165 " <tr>\n",
1166 " <th>38</th>\n",
1167 " <td>MSFT</td>\n",
1168 " <td>215.73</td>\n",
1169 " <td>0.518900</td>\n",
1170 " <td>90</td>\n",
1171 " </tr>\n",
1172 " <tr>\n",
1173 " <th>39</th>\n",
1174 " <td>EA</td>\n",
1175 " <td>145.30</td>\n",
1176 " <td>0.517087</td>\n",
1177 " <td>134</td>\n",
1178 " </tr>\n",
1179 " <tr>\n",
1180 " <th>40</th>\n",
1181 " <td>TMO</td>\n",
1182 " <td>422.95</td>\n",
1183 " <td>0.513970</td>\n",
1184 " <td>46</td>\n",
1185 " </tr>\n",
1186 " <tr>\n",
1187 " <th>41</th>\n",
1188 " <td>KR</td>\n",
1189 " <td>36.29</td>\n",
1190 " <td>0.502626</td>\n",
1191 " <td>540</td>\n",
1192 " </tr>\n",
1193 " <tr>\n",
1194 " <th>42</th>\n",
1195 " <td>DHI</td>\n",
1196 " <td>73.64</td>\n",
1197 " <td>0.499570</td>\n",
1198 " <td>266</td>\n",
1199 " </tr>\n",
1200 " <tr>\n",
1201 " <th>43</th>\n",
1202 " <td>CTXS</td>\n",
1203 " <td>141.53</td>\n",
1204 " <td>0.496854</td>\n",
1205 " <td>138</td>\n",
1206 " </tr>\n",
1207 " <tr>\n",
1208 " <th>44</th>\n",
1209 " <td>LEN</td>\n",
1210 " <td>77.72</td>\n",
1211 " <td>0.495581</td>\n",
1212 " <td>252</td>\n",
1213 " </tr>\n",
1214 " <tr>\n",
1215 " <th>45</th>\n",
1216 " <td>MAS</td>\n",
1217 " <td>61.01</td>\n",
1218 " <td>0.493611</td>\n",
1219 " <td>321</td>\n",
1220 " </tr>\n",
1221 " <tr>\n",
1222 " <th>46</th>\n",
1223 " <td>TMUS</td>\n",
1224 " <td>119.48</td>\n",
1225 " <td>0.490167</td>\n",
1226 " <td>164</td>\n",
1227 " </tr>\n",
1228 " <tr>\n",
1229 " <th>47</th>\n",
1230 " <td>BBY</td>\n",
1231 " <td>107.33</td>\n",
1232 " <td>0.486775</td>\n",
1233 " <td>182</td>\n",
1234 " </tr>\n",
1235 " <tr>\n",
1236 " <th>48</th>\n",
1237 " <td>VRTX</td>\n",
1238 " <td>280.26</td>\n",
1239 " <td>0.486553</td>\n",
1240 " <td>69</td>\n",
1241 " </tr>\n",
1242 " <tr>\n",
1243 " <th>49</th>\n",
1244 " <td>PWR</td>\n",
1245 " <td>50.22</td>\n",
1246 " <td>0.482556</td>\n",
1247 " <td>390</td>\n",
1248 " </tr>\n",
1249 " <tr>\n",
1250 " <th>50</th>\n",
1251 " <td>OTIS</td>\n",
1252 " <td>67.90</td>\n",
1253 " <td>0.481000</td>\n",
1254 " <td>288</td>\n",
1255 " </tr>\n",
1256 " </tbody>\n",
1257 "</table>\n",
1258 "</div>"
1259 ],
1260 "text/plain": [
1261 " Ticker Price One-Year Price Return Number of Shares to Buy\n",
1262 "0 NVDA 458.14 2.015964 42\n",
1263 "1 DXCM 441.29 1.721219 44\n",
1264 "2 AMD 85.46 1.632817 229\n",
1265 "3 CARR 29.94 1.489900 654\n",
1266 "4 AAPL 453.87 1.172528 43\n",
1267 "5 REGN 624.50 1.031728 31\n",
1268 "6 SWKS 153.26 0.921570 127\n",
1269 "7 WST 283.20 0.921000 69\n",
1270 "8 LRCX 393.68 0.892740 49\n",
1271 "9 QRVO 132.38 0.858187 148\n",
1272 "10 PYPL 196.30 0.829338 99\n",
1273 "11 AMZN 3192.88 0.759898 6\n",
1274 "12 ATVI 83.82 0.710587 233\n",
1275 "13 ALGN 313.73 0.709093 62\n",
1276 "14 NEM 63.72 0.698936 307\n",
1277 "15 ODFL 196.24 0.690263 99\n",
1278 "16 ROL 55.90 0.676072 350\n",
1279 "17 NOW 439.05 0.656782 44\n",
1280 "18 LOW 159.19 0.646186 123\n",
1281 "19 DPZ 405.67 0.644884 48\n",
1282 "20 FBHS 85.93 0.635603 228\n",
1283 "21 FAST 49.98 0.624303 392\n",
1284 "22 TGT 136.10 0.616877 144\n",
1285 "23 QCOM 119.34 0.609546 164\n",
1286 "24 URI 181.40 0.590406 108\n",
1287 "25 CHTR 602.51 0.586074 32\n",
1288 "26 MSCI 369.93 0.583839 53\n",
1289 "27 VAR 174.79 0.569642 112\n",
1290 "28 ROK 247.30 0.560821 79\n",
1291 "29 BIO 517.62 0.558503 37\n",
1292 "30 KSU 193.03 0.548382 101\n",
1293 "31 KLAC 216.00 0.547432 90\n",
1294 "32 ADBE 449.01 0.540159 43\n",
1295 "33 ABMD 307.07 0.537076 63\n",
1296 "34 CDNS 111.60 0.532542 175\n",
1297 "35 NFLX 486.12 0.531236 40\n",
1298 "36 ADSK 240.90 0.526803 81\n",
1299 "37 FTNT 132.50 0.522105 147\n",
1300 "38 MSFT 215.73 0.518900 90\n",
1301 "39 EA 145.30 0.517087 134\n",
1302 "40 TMO 422.95 0.513970 46\n",
1303 "41 KR 36.29 0.502626 540\n",
1304 "42 DHI 73.64 0.499570 266\n",
1305 "43 CTXS 141.53 0.496854 138\n",
1306 "44 LEN 77.72 0.495581 252\n",
1307 "45 MAS 61.01 0.493611 321\n",
1308 "46 TMUS 119.48 0.490167 164\n",
1309 "47 BBY 107.33 0.486775 182\n",
1310 "48 VRTX 280.26 0.486553 69\n",
1311 "49 PWR 50.22 0.482556 390\n",
1312 "50 OTIS 67.90 0.481000 288"
1313 ]
1314 },
1315 "execution_count": 9,
1316 "metadata": {},
1317 "output_type": "execute_result"
1318 }
1319 ],
1320 "source": [
1321 "position_size = float(portfolio_size) / len(final_dataframe.index)\n",
1322 "for i in range(0, len(final_dataframe['Ticker'])):\n",
1323 " final_dataframe.loc[i, 'Number of Shares to Buy'] = math.floor(position_size / final_dataframe['Price'][i])\n",
1324 "final_dataframe"
1325 ]
1326 },
1327 {
1328 "cell_type": "markdown",
1329 "metadata": {},
1330 "source": [
1331 "## Building a Better (and More Realistic) Momentum Strategy\n",
1332 "\n",
1333 "Real-world quantitative investment firms differentiate between \"high quality\" and \"low quality\" momentum stocks:\n",
1334 "\n",
1335 "* High-quality momentum stocks show \"slow and steady\" outperformance over long periods of time\n",
1336 "* Low-quality momentum stocks might not show any momentum for a long time, and then surge upwards.\n",
1337 "\n",
1338 "The reason why high-quality momentum stocks are preferred is because low-quality momentum can often be cause by short-term news that is unlikely to be repeated in the future (such as an FDA approval for a biotechnology company).\n",
1339 "\n",
1340 "To identify high-quality momentum, we're going to build a strategy that selects stocks from the highest percentiles of: \n",
1341 "\n",
1342 "* 1-month price returns\n",
1343 "* 3-month price returns\n",
1344 "* 6-month price returns\n",
1345 "* 1-year price returns\n",
1346 "\n",
1347 "Let's start by building our DataFrame. You'll notice that I use the abbreviation `hqm` often. It stands for `high-quality momentum`."
1348 ]
1349 },
1350 {
1351 "cell_type": "code",
1352 "execution_count": 10,
1353 "metadata": {},
1354 "outputs": [
1355 {
1356 "data": {
1357 "text/plain": [
1358 "Index(['Ticker', 'Price', 'Number of Shares to Buy', 'One-Year Price Return',\n",
1359 " 'One-Year Return Percentile', 'Six-Month Price Return',\n",
1360 " 'Six-Month Return Percentile', 'Three-Month Price Return',\n",
1361 " 'Three-Month Return Percentile', 'One-Month Price Return',\n",
1362 " 'One-Month Return Percentile', 'HQM Score'],\n",
1363 " dtype='object')"
1364 ]
1365 },
1366 "execution_count": 10,
1367 "metadata": {},
1368 "output_type": "execute_result"
1369 }
1370 ],
1371 "source": [
1372 "hqm_columns = [\n",
1373 " 'Ticker', \n",
1374 " 'Price', \n",
1375 " 'Number of Shares to Buy', \n",
1376 " 'One-Year Price Return', \n",
1377 " 'One-Year Return Percentile',\n",
1378 " 'Six-Month Price Return',\n",
1379 " 'Six-Month Return Percentile',\n",
1380 " 'Three-Month Price Return',\n",
1381 " 'Three-Month Return Percentile',\n",
1382 " 'One-Month Price Return',\n",
1383 " 'One-Month Return Percentile',\n",
1384 " 'HQM Score'\n",
1385 " ]\n",
1386 "\n",
1387 "hqm_dataframe = pd.DataFrame(columns = hqm_columns)\n",
1388 "\n",
1389 "for symbol_string in symbol_strings:\n",
1390 "# print(symbol_strings)\n",
1391 " batch_api_call_url = f'https://sandbox.iexapis.com/stable/stock/market/batch/?types=stats,quote&symbols={symbol_string}&token={IEX_CLOUD_API_TOKEN}'\n",
1392 " data = requests.get(batch_api_call_url).json()\n",
1393 " for symbol in symbol_string.split(','):\n",
1394 " hqm_dataframe = hqm_dataframe.append(\n",
1395 " pd.Series([symbol, \n",
1396 " data[symbol]['quote']['latestPrice'],\n",
1397 " 'N/A',\n",
1398 " data[symbol]['stats']['year1ChangePercent'],\n",
1399 " 'N/A',\n",
1400 " data[symbol]['stats']['month6ChangePercent'],\n",
1401 " 'N/A',\n",
1402 " data[symbol]['stats']['month3ChangePercent'],\n",
1403 " 'N/A',\n",
1404 " data[symbol]['stats']['month1ChangePercent'],\n",
1405 " 'N/A',\n",
1406 " 'N/A'\n",
1407 " ], \n",
1408 " index = hqm_columns), \n",
1409 " ignore_index = True)\n",
1410 " \n",
1411 "hqm_dataframe.columns"
1412 ]
1413 },
1414 {
1415 "cell_type": "markdown",
1416 "metadata": {},
1417 "source": [
1418 "## Calculating Momentum Percentiles\n",
1419 "\n",
1420 "We now need to calculate momentum percentile scores for every stock in the universe. More specifically, we need to calculate percentile scores for the following metrics for every stock:\n",
1421 "\n",
1422 "* `One-Year Price Return`\n",
1423 "* `Six-Month Price Return`\n",
1424 "* `Three-Month Price Return`\n",
1425 "* `One-Month Price Return`\n",
1426 "\n",
1427 "Here's how we'll do this:"
1428 ]
1429 },
1430 {
1431 "cell_type": "code",
1432 "execution_count": 11,
1433 "metadata": {},
1434 "outputs": [
1435 {
1436 "name": "stdout",
1437 "output_type": "stream",
1438 "text": [
1439 "0 0.885149\n",
1440 "1 0.0237624\n",
1441 "2 0.578218\n",
1442 "3 0.992079\n",
1443 "4 0.89703\n",
1444 " ... \n",
1445 "500 0.211881\n",
1446 "501 0.457426\n",
1447 "502 0.843564\n",
1448 "503 0.255446\n",
1449 "504 0.772277\n",
1450 "Name: One-Year Return Percentile, Length: 505, dtype: object\n",
1451 "0 0.837624\n",
1452 "1 0.0158416\n",
1453 "2 0.839604\n",
1454 "3 0.968317\n",
1455 "4 0.629703\n",
1456 " ... \n",
1457 "500 0.405941\n",
1458 "501 0.39604\n",
1459 "502 0.906931\n",
1460 "503 0.227723\n",
1461 "504 0.776238\n",
1462 "Name: Six-Month Return Percentile, Length: 505, dtype: object\n",
1463 "0 0.473267\n",
1464 "1 0.908911\n",
1465 "2 0.643564\n",
1466 "3 0.887129\n",
1467 "4 0.19802\n",
1468 " ... \n",
1469 "500 0.374257\n",
1470 "501 0.544554\n",
1471 "502 0.611881\n",
1472 "503 0.70297\n",
1473 "504 0.665347\n",
1474 "Name: Three-Month Return Percentile, Length: 505, dtype: object\n",
1475 "0 0.530693\n",
1476 "1 0.827723\n",
1477 "2 0.742574\n",
1478 "3 0.879208\n",
1479 "4 0.0693069\n",
1480 " ... \n",
1481 "500 0.370297\n",
1482 "501 0.762376\n",
1483 "502 0.641584\n",
1484 "503 0.312871\n",
1485 "504 0.792079\n",
1486 "Name: One-Month Return Percentile, Length: 505, dtype: object\n"
1487 ]
1488 },
1489 {
1490 "data": {
1491 "text/html": [
1492 "<div>\n",
1493 "<style scoped>\n",
1494 " .dataframe tbody tr th:only-of-type {\n",
1495 " vertical-align: middle;\n",
1496 " }\n",
1497 "\n",
1498 " .dataframe tbody tr th {\n",
1499 " vertical-align: top;\n",
1500 " }\n",
1501 "\n",
1502 " .dataframe thead th {\n",
1503 " text-align: right;\n",
1504 " }\n",
1505 "</style>\n",
1506 "<table border=\"1\" class=\"dataframe\">\n",
1507 " <thead>\n",
1508 " <tr style=\"text-align: right;\">\n",
1509 " <th></th>\n",
1510 " <th>Ticker</th>\n",
1511 " <th>Price</th>\n",
1512 " <th>Number of Shares to Buy</th>\n",
1513 " <th>One-Year Price Return</th>\n",
1514 " <th>One-Year Return Percentile</th>\n",
1515 " <th>Six-Month Price Return</th>\n",
1516 " <th>Six-Month Return Percentile</th>\n",
1517 " <th>Three-Month Price Return</th>\n",
1518 " <th>Three-Month Return Percentile</th>\n",
1519 " <th>One-Month Price Return</th>\n",
1520 " <th>One-Month Return Percentile</th>\n",
1521 " <th>HQM Score</th>\n",
1522 " </tr>\n",
1523 " </thead>\n",
1524 " <tbody>\n",
1525 " <tr>\n",
1526 " <th>0</th>\n",
1527 " <td>A</td>\n",
1528 " <td>98.19</td>\n",
1529 " <td>N/A</td>\n",
1530 " <td>0.444090</td>\n",
1531 " <td>0.885149</td>\n",
1532 " <td>0.147456</td>\n",
1533 " <td>0.837624</td>\n",
1534 " <td>0.221461</td>\n",
1535 " <td>0.473267</td>\n",
1536 " <td>0.093820</td>\n",
1537 " <td>0.530693</td>\n",
1538 " <td>N/A</td>\n",
1539 " </tr>\n",
1540 " <tr>\n",
1541 " <th>1</th>\n",
1542 " <td>AAL</td>\n",
1543 " <td>13.89</td>\n",
1544 " <td>N/A</td>\n",
1545 " <td>-0.526494</td>\n",
1546 " <td>0.0237624</td>\n",
1547 " <td>-0.564540</td>\n",
1548 " <td>0.0158416</td>\n",
1549 " <td>0.509431</td>\n",
1550 " <td>0.908911</td>\n",
1551 " <td>0.172430</td>\n",
1552 " <td>0.827723</td>\n",
1553 " <td>N/A</td>\n",
1554 " </tr>\n",
1555 " <tr>\n",
1556 " <th>2</th>\n",
1557 " <td>AAP</td>\n",
1558 " <td>161.13</td>\n",
1559 " <td>N/A</td>\n",
1560 " <td>0.088066</td>\n",
1561 " <td>0.578218</td>\n",
1562 " <td>0.148378</td>\n",
1563 " <td>0.839604</td>\n",
1564 " <td>0.295700</td>\n",
1565 " <td>0.643564</td>\n",
1566 " <td>0.144608</td>\n",
1567 " <td>0.742574</td>\n",
1568 " <td>N/A</td>\n",
1569 " </tr>\n",
1570 " <tr>\n",
1571 " <th>3</th>\n",
1572 " <td>AAPL</td>\n",
1573 " <td>467.65</td>\n",
1574 " <td>N/A</td>\n",
1575 " <td>1.171724</td>\n",
1576 " <td>0.992079</td>\n",
1577 " <td>0.401695</td>\n",
1578 " <td>0.968317</td>\n",
1579 " <td>0.474900</td>\n",
1580 " <td>0.887129</td>\n",
1581 " <td>0.189840</td>\n",
1582 " <td>0.879208</td>\n",
1583 " <td>N/A</td>\n",
1584 " </tr>\n",
1585 " <tr>\n",
1586 " <th>4</th>\n",
1587 " <td>ABBV</td>\n",
1588 " <td>97.29</td>\n",
1589 " <td>N/A</td>\n",
1590 " <td>0.478770</td>\n",
1591 " <td>0.89703</td>\n",
1592 " <td>0.001711</td>\n",
1593 " <td>0.629703</td>\n",
1594 " <td>0.077880</td>\n",
1595 " <td>0.19802</td>\n",
1596 " <td>-0.024533</td>\n",
1597 " <td>0.0693069</td>\n",
1598 " <td>N/A</td>\n",
1599 " </tr>\n",
1600 " <tr>\n",
1601 " <th>...</th>\n",
1602 " <td>...</td>\n",
1603 " <td>...</td>\n",
1604 " <td>...</td>\n",
1605 " <td>...</td>\n",
1606 " <td>...</td>\n",
1607 " <td>...</td>\n",
1608 " <td>...</td>\n",
1609 " <td>...</td>\n",
1610 " <td>...</td>\n",
1611 " <td>...</td>\n",
1612 " <td>...</td>\n",
1613 " <td>...</td>\n",
1614 " </tr>\n",
1615 " <tr>\n",
1616 " <th>500</th>\n",
1617 " <td>YUM</td>\n",
1618 " <td>93.51</td>\n",
1619 " <td>N/A</td>\n",
1620 " <td>-0.214524</td>\n",
1621 " <td>0.211881</td>\n",
1622 " <td>-0.116757</td>\n",
1623 " <td>0.405941</td>\n",
1624 " <td>0.161550</td>\n",
1625 " <td>0.374257</td>\n",
1626 " <td>0.068180</td>\n",
1627 " <td>0.370297</td>\n",
1628 " <td>N/A</td>\n",
1629 " </tr>\n",
1630 " <tr>\n",
1631 " <th>501</th>\n",
1632 " <td>ZBH</td>\n",
1633 " <td>140.16</td>\n",
1634 " <td>N/A</td>\n",
1635 " <td>0.003007</td>\n",
1636 " <td>0.457426</td>\n",
1637 " <td>-0.127491</td>\n",
1638 " <td>0.39604</td>\n",
1639 " <td>0.250906</td>\n",
1640 " <td>0.544554</td>\n",
1641 " <td>0.151414</td>\n",
1642 " <td>0.762376</td>\n",
1643 " <td>N/A</td>\n",
1644 " </tr>\n",
1645 " <tr>\n",
1646 " <th>502</th>\n",
1647 " <td>ZBRA</td>\n",
1648 " <td>285.97</td>\n",
1649 " <td>N/A</td>\n",
1650 " <td>0.373952</td>\n",
1651 " <td>0.843564</td>\n",
1652 " <td>0.223856</td>\n",
1653 " <td>0.906931</td>\n",
1654 " <td>0.283668</td>\n",
1655 " <td>0.611881</td>\n",
1656 " <td>0.115379</td>\n",
1657 " <td>0.641584</td>\n",
1658 " <td>N/A</td>\n",
1659 " </tr>\n",
1660 " <tr>\n",
1661 " <th>503</th>\n",
1662 " <td>ZION</td>\n",
1663 " <td>34.95</td>\n",
1664 " <td>N/A</td>\n",
1665 " <td>-0.161814</td>\n",
1666 " <td>0.255446</td>\n",
1667 " <td>-0.255398</td>\n",
1668 " <td>0.227723</td>\n",
1669 " <td>0.328190</td>\n",
1670 " <td>0.70297</td>\n",
1671 " <td>0.055265</td>\n",
1672 " <td>0.312871</td>\n",
1673 " <td>N/A</td>\n",
1674 " </tr>\n",
1675 " <tr>\n",
1676 " <th>504</th>\n",
1677 " <td>ZTS</td>\n",
1678 " <td>163.66</td>\n",
1679 " <td>N/A</td>\n",
1680 " <td>0.290969</td>\n",
1681 " <td>0.772277</td>\n",
1682 " <td>0.102747</td>\n",
1683 " <td>0.776238</td>\n",
1684 " <td>0.307237</td>\n",
1685 " <td>0.665347</td>\n",
1686 " <td>0.157549</td>\n",
1687 " <td>0.792079</td>\n",
1688 " <td>N/A</td>\n",
1689 " </tr>\n",
1690 " </tbody>\n",
1691 "</table>\n",
1692 "<p>505 rows × 12 columns</p>\n",
1693 "</div>"
1694 ],
1695 "text/plain": [
1696 " Ticker Price Number of Shares to Buy One-Year Price Return \\\n",
1697 "0 A 98.19 N/A 0.444090 \n",
1698 "1 AAL 13.89 N/A -0.526494 \n",
1699 "2 AAP 161.13 N/A 0.088066 \n",
1700 "3 AAPL 467.65 N/A 1.171724 \n",
1701 "4 ABBV 97.29 N/A 0.478770 \n",
1702 ".. ... ... ... ... \n",
1703 "500 YUM 93.51 N/A -0.214524 \n",
1704 "501 ZBH 140.16 N/A 0.003007 \n",
1705 "502 ZBRA 285.97 N/A 0.373952 \n",
1706 "503 ZION 34.95 N/A -0.161814 \n",
1707 "504 ZTS 163.66 N/A 0.290969 \n",
1708 "\n",
1709 " One-Year Return Percentile Six-Month Price Return \\\n",
1710 "0 0.885149 0.147456 \n",
1711 "1 0.0237624 -0.564540 \n",
1712 "2 0.578218 0.148378 \n",
1713 "3 0.992079 0.401695 \n",
1714 "4 0.89703 0.001711 \n",
1715 ".. ... ... \n",
1716 "500 0.211881 -0.116757 \n",
1717 "501 0.457426 -0.127491 \n",
1718 "502 0.843564 0.223856 \n",
1719 "503 0.255446 -0.255398 \n",
1720 "504 0.772277 0.102747 \n",
1721 "\n",
1722 " Six-Month Return Percentile Three-Month Price Return \\\n",
1723 "0 0.837624 0.221461 \n",
1724 "1 0.0158416 0.509431 \n",
1725 "2 0.839604 0.295700 \n",
1726 "3 0.968317 0.474900 \n",
1727 "4 0.629703 0.077880 \n",
1728 ".. ... ... \n",
1729 "500 0.405941 0.161550 \n",
1730 "501 0.39604 0.250906 \n",
1731 "502 0.906931 0.283668 \n",
1732 "503 0.227723 0.328190 \n",
1733 "504 0.776238 0.307237 \n",
1734 "\n",
1735 " Three-Month Return Percentile One-Month Price Return \\\n",
1736 "0 0.473267 0.093820 \n",
1737 "1 0.908911 0.172430 \n",
1738 "2 0.643564 0.144608 \n",
1739 "3 0.887129 0.189840 \n",
1740 "4 0.19802 -0.024533 \n",
1741 ".. ... ... \n",
1742 "500 0.374257 0.068180 \n",
1743 "501 0.544554 0.151414 \n",
1744 "502 0.611881 0.115379 \n",
1745 "503 0.70297 0.055265 \n",
1746 "504 0.665347 0.157549 \n",
1747 "\n",
1748 " One-Month Return Percentile HQM Score \n",
1749 "0 0.530693 N/A \n",
1750 "1 0.827723 N/A \n",
1751 "2 0.742574 N/A \n",
1752 "3 0.879208 N/A \n",
1753 "4 0.0693069 N/A \n",
1754 ".. ... ... \n",
1755 "500 0.370297 N/A \n",
1756 "501 0.762376 N/A \n",
1757 "502 0.641584 N/A \n",
1758 "503 0.312871 N/A \n",
1759 "504 0.792079 N/A \n",
1760 "\n",
1761 "[505 rows x 12 columns]"
1762 ]
1763 },
1764 "execution_count": 11,
1765 "metadata": {},
1766 "output_type": "execute_result"
1767 }
1768 ],
1769 "source": [
1770 "time_periods = [\n",
1771 " 'One-Year',\n",
1772 " 'Six-Month',\n",
1773 " 'Three-Month',\n",
1774 " 'One-Month'\n",
1775 " ]\n",
1776 "\n",
1777 "for row in hqm_dataframe.index:\n",
1778 " for time_period in time_periods:\n",
1779 " hqm_dataframe.loc[row, f'{time_period} Return Percentile'] = stats.percentileofscore(hqm_dataframe[f'{time_period} Price Return'], hqm_dataframe.loc[row, f'{time_period} Price Return'])/100\n",
1780 "\n",
1781 "# Print each percentile score to make sure it was calculated properly\n",
1782 "for time_period in time_periods:\n",
1783 " print(hqm_dataframe[f'{time_period} Return Percentile'])\n",
1784 "\n",
1785 "#Print the entire DataFrame \n",
1786 "hqm_dataframe"
1787 ]
1788 },
1789 {
1790 "cell_type": "markdown",
1791 "metadata": {},
1792 "source": [
1793 "## Calculating the HQM Score\n",
1794 "\n",
1795 "We'll now calculate our `HQM Score`, which is the high-quality momentum score that we'll use to filter for stocks in this investing strategy.\n",
1796 "\n",
1797 "The `HQM Score` will be the arithmetic mean of the 4 momentum percentile scores that we calculated in the last section.\n",
1798 "\n",
1799 "To calculate arithmetic mean, we will use the `mean` function from Python's built-in `statistics` module."
1800 ]
1801 },
1802 {
1803 "cell_type": "code",
1804 "execution_count": 12,
1805 "metadata": {},
1806 "outputs": [],
1807 "source": [
1808 "from statistics import mean\n",
1809 "\n",
1810 "for row in hqm_dataframe.index:\n",
1811 " momentum_percentiles = []\n",
1812 " for time_period in time_periods:\n",
1813 " momentum_percentiles.append(hqm_dataframe.loc[row, f'{time_period} Return Percentile'])\n",
1814 " hqm_dataframe.loc[row, 'HQM Score'] = mean(momentum_percentiles)"
1815 ]
1816 },
1817 {
1818 "cell_type": "markdown",
1819 "metadata": {},
1820 "source": [
1821 "## Selecting the 50 Best Momentum Stocks\n",
1822 "\n",
1823 "As before, we can identify the 50 best momentum stocks in our universe by sorting the DataFrame on the `HQM Score` column and dropping all but the top 50 entries."
1824 ]
1825 },
1826 {
1827 "cell_type": "code",
1828 "execution_count": 13,
1829 "metadata": {},
1830 "outputs": [],
1831 "source": [
1832 "hqm_dataframe.sort_values(by = 'HQM Score', ascending = False)\n",
1833 "hqm_dataframe = hqm_dataframe[:51]"
1834 ]
1835 },
1836 {
1837 "cell_type": "markdown",
1838 "metadata": {},
1839 "source": [
1840 "## Calculating the Number of Shares to Buy\n",
1841 "\n",
1842 "We'll use the `portfolio_input` function that we created earlier to accept our portfolio size. Then we will use similar logic in a `for` loop to calculate the number of shares to buy for each stock in our investment universe."
1843 ]
1844 },
1845 {
1846 "cell_type": "code",
1847 "execution_count": 14,
1848 "metadata": {},
1849 "outputs": [
1850 {
1851 "name": "stdout",
1852 "output_type": "stream",
1853 "text": [
1854 "Enter the value of your portfolio:1000000\n"
1855 ]
1856 }
1857 ],
1858 "source": [
1859 "portfolio_input()"
1860 ]
1861 },
1862 {
1863 "cell_type": "code",
1864 "execution_count": 15,
1865 "metadata": {},
1866 "outputs": [
1867 {
1868 "data": {
1869 "text/html": [
1870 "<div>\n",
1871 "<style scoped>\n",
1872 " .dataframe tbody tr th:only-of-type {\n",
1873 " vertical-align: middle;\n",
1874 " }\n",
1875 "\n",
1876 " .dataframe tbody tr th {\n",
1877 " vertical-align: top;\n",
1878 " }\n",
1879 "\n",
1880 " .dataframe thead th {\n",
1881 " text-align: right;\n",
1882 " }\n",
1883 "</style>\n",
1884 "<table border=\"1\" class=\"dataframe\">\n",
1885 " <thead>\n",
1886 " <tr style=\"text-align: right;\">\n",
1887 " <th></th>\n",
1888 " <th>Ticker</th>\n",
1889 " <th>Price</th>\n",
1890 " <th>Number of Shares to Buy</th>\n",
1891 " <th>One-Year Price Return</th>\n",
1892 " <th>One-Year Return Percentile</th>\n",
1893 " <th>Six-Month Price Return</th>\n",
1894 " <th>Six-Month Return Percentile</th>\n",
1895 " <th>Three-Month Price Return</th>\n",
1896 " <th>Three-Month Return Percentile</th>\n",
1897 " <th>One-Month Price Return</th>\n",
1898 " <th>One-Month Return Percentile</th>\n",
1899 " <th>HQM Score</th>\n",
1900 " </tr>\n",
1901 " </thead>\n",
1902 " <tbody>\n",
1903 " <tr>\n",
1904 " <th>0</th>\n",
1905 " <td>A</td>\n",
1906 " <td>98.19</td>\n",
1907 " <td>199</td>\n",
1908 " <td>0.444090</td>\n",
1909 " <td>0.885149</td>\n",
1910 " <td>0.147456</td>\n",
1911 " <td>0.837624</td>\n",
1912 " <td>0.221461</td>\n",
1913 " <td>0.473267</td>\n",
1914 " <td>0.093820</td>\n",
1915 " <td>0.530693</td>\n",
1916 " <td>0.681683</td>\n",
1917 " </tr>\n",
1918 " <tr>\n",
1919 " <th>1</th>\n",
1920 " <td>AAL</td>\n",
1921 " <td>13.89</td>\n",
1922 " <td>1411</td>\n",
1923 " <td>-0.526494</td>\n",
1924 " <td>0.0237624</td>\n",
1925 " <td>-0.564540</td>\n",
1926 " <td>0.0158416</td>\n",
1927 " <td>0.509431</td>\n",
1928 " <td>0.908911</td>\n",
1929 " <td>0.172430</td>\n",
1930 " <td>0.827723</td>\n",
1931 " <td>0.444059</td>\n",
1932 " </tr>\n",
1933 " <tr>\n",
1934 " <th>2</th>\n",
1935 " <td>AAP</td>\n",
1936 " <td>161.13</td>\n",
1937 " <td>121</td>\n",
1938 " <td>0.088066</td>\n",
1939 " <td>0.578218</td>\n",
1940 " <td>0.148378</td>\n",
1941 " <td>0.839604</td>\n",
1942 " <td>0.295700</td>\n",
1943 " <td>0.643564</td>\n",
1944 " <td>0.144608</td>\n",
1945 " <td>0.742574</td>\n",
1946 " <td>0.70099</td>\n",
1947 " </tr>\n",
1948 " <tr>\n",
1949 " <th>3</th>\n",
1950 " <td>AAPL</td>\n",
1951 " <td>467.65</td>\n",
1952 " <td>41</td>\n",
1953 " <td>1.171724</td>\n",
1954 " <td>0.992079</td>\n",
1955 " <td>0.401695</td>\n",
1956 " <td>0.968317</td>\n",
1957 " <td>0.474900</td>\n",
1958 " <td>0.887129</td>\n",
1959 " <td>0.189840</td>\n",
1960 " <td>0.879208</td>\n",
1961 " <td>0.931683</td>\n",
1962 " </tr>\n",
1963 " <tr>\n",
1964 " <th>4</th>\n",
1965 " <td>ABBV</td>\n",
1966 " <td>97.29</td>\n",
1967 " <td>201</td>\n",
1968 " <td>0.478770</td>\n",
1969 " <td>0.89703</td>\n",
1970 " <td>0.001711</td>\n",
1971 " <td>0.629703</td>\n",
1972 " <td>0.077880</td>\n",
1973 " <td>0.19802</td>\n",
1974 " <td>-0.024533</td>\n",
1975 " <td>0.0693069</td>\n",
1976 " <td>0.448515</td>\n",
1977 " </tr>\n",
1978 " <tr>\n",
1979 " <th>5</th>\n",
1980 " <td>ABC</td>\n",
1981 " <td>104.97</td>\n",
1982 " <td>186</td>\n",
1983 " <td>0.163705</td>\n",
1984 " <td>0.651485</td>\n",
1985 " <td>0.100112</td>\n",
1986 " <td>0.774257</td>\n",
1987 " <td>0.241867</td>\n",
1988 " <td>0.522772</td>\n",
1989 " <td>0.066990</td>\n",
1990 " <td>0.364356</td>\n",
1991 " <td>0.578218</td>\n",
1992 " </tr>\n",
1993 " <tr>\n",
1994 " <th>6</th>\n",
1995 " <td>ABMD</td>\n",
1996 " <td>305.78</td>\n",
1997 " <td>64</td>\n",
1998 " <td>0.546138</td>\n",
1999 " <td>0.942574</td>\n",
2000 " <td>0.874783</td>\n",
2001 " <td>0.99802</td>\n",
2002 " <td>0.645795</td>\n",
2003 " <td>0.954455</td>\n",
2004 " <td>0.145153</td>\n",
2005 " <td>0.746535</td>\n",
2006 " <td>0.910396</td>\n",
2007 " </tr>\n",
2008 " <tr>\n",
2009 " <th>7</th>\n",
2010 " <td>ABT</td>\n",
2011 " <td>102.94</td>\n",
2012 " <td>190</td>\n",
2013 " <td>0.161073</td>\n",
2014 " <td>0.647525</td>\n",
2015 " <td>0.139130</td>\n",
2016 " <td>0.823762</td>\n",
2017 " <td>0.093917</td>\n",
2018 " <td>0.233663</td>\n",
2019 " <td>0.081815</td>\n",
2020 " <td>0.457426</td>\n",
2021 " <td>0.540594</td>\n",
2022 " </tr>\n",
2023 " <tr>\n",
2024 " <th>8</th>\n",
2025 " <td>ACN</td>\n",
2026 " <td>237.88</td>\n",
2027 " <td>82</td>\n",
2028 " <td>0.197484</td>\n",
2029 " <td>0.69505</td>\n",
2030 " <td>0.085519</td>\n",
2031 " <td>0.762376</td>\n",
2032 " <td>0.279570</td>\n",
2033 " <td>0.605941</td>\n",
2034 " <td>0.067045</td>\n",
2035 " <td>0.366337</td>\n",
2036 " <td>0.607426</td>\n",
2037 " </tr>\n",
2038 " <tr>\n",
2039 " <th>9</th>\n",
2040 " <td>ADBE</td>\n",
2041 " <td>453.91</td>\n",
2042 " <td>43</td>\n",
2043 " <td>0.532839</td>\n",
2044 " <td>0.934653</td>\n",
2045 " <td>0.196705</td>\n",
2046 " <td>0.879208</td>\n",
2047 " <td>0.252382</td>\n",
2048 " <td>0.550495</td>\n",
2049 " <td>0.006829</td>\n",
2050 " <td>0.150495</td>\n",
2051 " <td>0.628713</td>\n",
2052 " </tr>\n",
2053 " <tr>\n",
2054 " <th>10</th>\n",
2055 " <td>ADI</td>\n",
2056 " <td>120.52</td>\n",
2057 " <td>162</td>\n",
2058 " <td>0.056525</td>\n",
2059 " <td>0.522772</td>\n",
2060 " <td>0.002920</td>\n",
2061 " <td>0.631683</td>\n",
2062 " <td>0.149173</td>\n",
2063 " <td>0.360396</td>\n",
2064 " <td>0.017244</td>\n",
2065 " <td>0.174257</td>\n",
2066 " <td>0.422277</td>\n",
2067 " </tr>\n",
2068 " <tr>\n",
2069 " <th>11</th>\n",
2070 " <td>ADM</td>\n",
2071 " <td>46.62</td>\n",
2072 " <td>420</td>\n",
2073 " <td>0.178916</td>\n",
2074 " <td>0.679208</td>\n",
2075 " <td>-0.018869</td>\n",
2076 " <td>0.580198</td>\n",
2077 " <td>0.328413</td>\n",
2078 " <td>0.70495</td>\n",
2079 " <td>0.123837</td>\n",
2080 " <td>0.687129</td>\n",
2081 " <td>0.662871</td>\n",
2082 " </tr>\n",
2083 " <tr>\n",
2084 " <th>12</th>\n",
2085 " <td>ADP</td>\n",
2086 " <td>139.82</td>\n",
2087 " <td>140</td>\n",
2088 " <td>-0.174896</td>\n",
2089 " <td>0.243564</td>\n",
2090 " <td>-0.227657</td>\n",
2091 " <td>0.265347</td>\n",
2092 " <td>0.037317</td>\n",
2093 " <td>0.134653</td>\n",
2094 " <td>-0.042030</td>\n",
2095 " <td>0.0435644</td>\n",
2096 " <td>0.171782</td>\n",
2097 " </tr>\n",
2098 " <tr>\n",
2099 " <th>13</th>\n",
2100 " <td>ADSK</td>\n",
2101 " <td>234.20</td>\n",
2102 " <td>83</td>\n",
2103 " <td>0.528696</td>\n",
2104 " <td>0.928713</td>\n",
2105 " <td>0.116990</td>\n",
2106 " <td>0.794059</td>\n",
2107 " <td>0.312257</td>\n",
2108 " <td>0.677228</td>\n",
2109 " <td>-0.001259</td>\n",
2110 " <td>0.122772</td>\n",
2111 " <td>0.630693</td>\n",
2112 " </tr>\n",
2113 " <tr>\n",
2114 " <th>14</th>\n",
2115 " <td>AEE</td>\n",
2116 " <td>85.23</td>\n",
2117 " <td>230</td>\n",
2118 " <td>0.073499</td>\n",
2119 " <td>0.556436</td>\n",
2120 " <td>-0.044706</td>\n",
2121 " <td>0.538614</td>\n",
2122 " <td>0.202938</td>\n",
2123 " <td>0.447525</td>\n",
2124 " <td>0.086675</td>\n",
2125 " <td>0.483168</td>\n",
2126 " <td>0.506436</td>\n",
2127 " </tr>\n",
2128 " <tr>\n",
2129 " <th>15</th>\n",
2130 " <td>AEP</td>\n",
2131 " <td>87.88</td>\n",
2132 " <td>223</td>\n",
2133 " <td>-0.069760</td>\n",
2134 " <td>0.368317</td>\n",
2135 " <td>-0.186159</td>\n",
2136 " <td>0.326733</td>\n",
2137 " <td>0.084255</td>\n",
2138 " <td>0.217822</td>\n",
2139 " <td>-0.007456</td>\n",
2140 " <td>0.106931</td>\n",
2141 " <td>0.25495</td>\n",
2142 " </tr>\n",
2143 " <tr>\n",
2144 " <th>16</th>\n",
2145 " <td>AES</td>\n",
2146 " <td>17.54</td>\n",
2147 " <td>1117</td>\n",
2148 " <td>0.141966</td>\n",
2149 " <td>0.635644</td>\n",
2150 " <td>-0.177281</td>\n",
2151 " <td>0.336634</td>\n",
2152 " <td>0.510037</td>\n",
2153 " <td>0.910891</td>\n",
2154 " <td>0.186968</td>\n",
2155 " <td>0.873267</td>\n",
2156 " <td>0.689109</td>\n",
2157 " </tr>\n",
2158 " <tr>\n",
2159 " <th>17</th>\n",
2160 " <td>AFL</td>\n",
2161 " <td>39.27</td>\n",
2162 " <td>499</td>\n",
2163 " <td>-0.298263</td>\n",
2164 " <td>0.116832</td>\n",
2165 " <td>-0.283044</td>\n",
2166 " <td>0.190099</td>\n",
2167 " <td>0.178662</td>\n",
2168 " <td>0.4</td>\n",
2169 " <td>0.082055</td>\n",
2170 " <td>0.459406</td>\n",
2171 " <td>0.291584</td>\n",
2172 " </tr>\n",
2173 " <tr>\n",
2174 " <th>18</th>\n",
2175 " <td>AIG</td>\n",
2176 " <td>31.76</td>\n",
2177 " <td>617</td>\n",
2178 " <td>-0.468456</td>\n",
2179 " <td>0.0356436</td>\n",
2180 " <td>-0.398200</td>\n",
2181 " <td>0.0673267</td>\n",
2182 " <td>0.242767</td>\n",
2183 " <td>0.528713</td>\n",
2184 " <td>0.042150</td>\n",
2185 " <td>0.271287</td>\n",
2186 " <td>0.225743</td>\n",
2187 " </tr>\n",
2188 " <tr>\n",
2189 " <th>19</th>\n",
2190 " <td>AIV</td>\n",
2191 " <td>39.00</td>\n",
2192 " <td>502</td>\n",
2193 " <td>-0.260956</td>\n",
2194 " <td>0.168317</td>\n",
2195 " <td>-0.323003</td>\n",
2196 " <td>0.142574</td>\n",
2197 " <td>0.096556</td>\n",
2198 " <td>0.243564</td>\n",
2199 " <td>0.004109</td>\n",
2200 " <td>0.140594</td>\n",
2201 " <td>0.173762</td>\n",
2202 " </tr>\n",
2203 " <tr>\n",
2204 " <th>20</th>\n",
2205 " <td>AIZ</td>\n",
2206 " <td>129.93</td>\n",
2207 " <td>150</td>\n",
2208 " <td>0.016575</td>\n",
2209 " <td>0.475248</td>\n",
2210 " <td>-0.116835</td>\n",
2211 " <td>0.40396</td>\n",
2212 " <td>0.418900</td>\n",
2213 " <td>0.839604</td>\n",
2214 " <td>0.254327</td>\n",
2215 " <td>0.948515</td>\n",
2216 " <td>0.666832</td>\n",
2217 " </tr>\n",
2218 " <tr>\n",
2219 " <th>21</th>\n",
2220 " <td>AJG</td>\n",
2221 " <td>111.00</td>\n",
2222 " <td>176</td>\n",
2223 " <td>0.195680</td>\n",
2224 " <td>0.689109</td>\n",
2225 " <td>-0.011750</td>\n",
2226 " <td>0.6</td>\n",
2227 " <td>0.253483</td>\n",
2228 " <td>0.554455</td>\n",
2229 " <td>0.092902</td>\n",
2230 " <td>0.520792</td>\n",
2231 " <td>0.591089</td>\n",
2232 " </tr>\n",
2233 " <tr>\n",
2234 " <th>22</th>\n",
2235 " <td>AKAM</td>\n",
2236 " <td>110.00</td>\n",
2237 " <td>178</td>\n",
2238 " <td>0.206310</td>\n",
2239 " <td>0.70495</td>\n",
2240 " <td>0.075705</td>\n",
2241 " <td>0.752475</td>\n",
2242 " <td>0.125834</td>\n",
2243 " <td>0.312871</td>\n",
2244 " <td>-0.027015</td>\n",
2245 " <td>0.0594059</td>\n",
2246 " <td>0.457426</td>\n",
2247 " </tr>\n",
2248 " <tr>\n",
2249 " <th>23</th>\n",
2250 " <td>ALB</td>\n",
2251 " <td>94.85</td>\n",
2252 " <td>206</td>\n",
2253 " <td>0.339750</td>\n",
2254 " <td>0.823762</td>\n",
2255 " <td>0.036265</td>\n",
2256 " <td>0.691089</td>\n",
2257 " <td>0.528245</td>\n",
2258 " <td>0.918812</td>\n",
2259 " <td>0.120477</td>\n",
2260 " <td>0.673267</td>\n",
2261 " <td>0.776733</td>\n",
2262 " </tr>\n",
2263 " <tr>\n",
2264 " <th>24</th>\n",
2265 " <td>ALGN</td>\n",
2266 " <td>309.25</td>\n",
2267 " <td>63</td>\n",
2268 " <td>0.692338</td>\n",
2269 " <td>0.970297</td>\n",
2270 " <td>0.131757</td>\n",
2271 " <td>0.815842</td>\n",
2272 " <td>0.554489</td>\n",
2273 " <td>0.928713</td>\n",
2274 " <td>0.143933</td>\n",
2275 " <td>0.738614</td>\n",
2276 " <td>0.863366</td>\n",
2277 " </tr>\n",
2278 " <tr>\n",
2279 " <th>25</th>\n",
2280 " <td>ALK</td>\n",
2281 " <td>38.63</td>\n",
2282 " <td>507</td>\n",
2283 " <td>-0.387440</td>\n",
2284 " <td>0.0633663</td>\n",
2285 " <td>-0.438559</td>\n",
2286 " <td>0.0534653</td>\n",
2287 " <td>0.519770</td>\n",
2288 " <td>0.916832</td>\n",
2289 " <td>0.103833</td>\n",
2290 " <td>0.576238</td>\n",
2291 " <td>0.402475</td>\n",
2292 " </tr>\n",
2293 " <tr>\n",
2294 " <th>26</th>\n",
2295 " <td>ALL</td>\n",
2296 " <td>99.53</td>\n",
2297 " <td>197</td>\n",
2298 " <td>-0.079870</td>\n",
2299 " <td>0.354455</td>\n",
2300 " <td>-0.230788</td>\n",
2301 " <td>0.261386</td>\n",
2302 " <td>0.045750</td>\n",
2303 " <td>0.146535</td>\n",
2304 " <td>0.088925</td>\n",
2305 " <td>0.49703</td>\n",
2306 " <td>0.314851</td>\n",
2307 " </tr>\n",
2308 " <tr>\n",
2309 " <th>27</th>\n",
2310 " <td>ALLE</td>\n",
2311 " <td>105.13</td>\n",
2312 " <td>186</td>\n",
2313 " <td>0.071934</td>\n",
2314 " <td>0.542574</td>\n",
2315 " <td>-0.246470</td>\n",
2316 " <td>0.241584</td>\n",
2317 " <td>0.112362</td>\n",
2318 " <td>0.277228</td>\n",
2319 " <td>0.024073</td>\n",
2320 " <td>0.20396</td>\n",
2321 " <td>0.316337</td>\n",
2322 " </tr>\n",
2323 " <tr>\n",
2324 " <th>28</th>\n",
2325 " <td>ALXN</td>\n",
2326 " <td>107.60</td>\n",
2327 " <td>182</td>\n",
2328 " <td>-0.079570</td>\n",
2329 " <td>0.356436</td>\n",
2330 " <td>-0.006381</td>\n",
2331 " <td>0.60396</td>\n",
2332 " <td>0.003280</td>\n",
2333 " <td>0.0792079</td>\n",
2334 " <td>-0.040910</td>\n",
2335 " <td>0.0455446</td>\n",
2336 " <td>0.271287</td>\n",
2337 " </tr>\n",
2338 " <tr>\n",
2339 " <th>29</th>\n",
2340 " <td>AMAT</td>\n",
2341 " <td>68.10</td>\n",
2342 " <td>287</td>\n",
2343 " <td>0.389577</td>\n",
2344 " <td>0.855446</td>\n",
2345 " <td>-0.013556</td>\n",
2346 " <td>0.594059</td>\n",
2347 " <td>0.301391</td>\n",
2348 " <td>0.651485</td>\n",
2349 " <td>0.082413</td>\n",
2350 " <td>0.461386</td>\n",
2351 " <td>0.640594</td>\n",
2352 " </tr>\n",
2353 " <tr>\n",
2354 " <th>30</th>\n",
2355 " <td>AMCR</td>\n",
2356 " <td>11.52</td>\n",
2357 " <td>1702</td>\n",
2358 " <td>0.073093</td>\n",
2359 " <td>0.552475</td>\n",
2360 " <td>0.105582</td>\n",
2361 " <td>0.778218</td>\n",
2362 " <td>0.238793</td>\n",
2363 " <td>0.510891</td>\n",
2364 " <td>0.077579</td>\n",
2365 " <td>0.433663</td>\n",
2366 " <td>0.568812</td>\n",
2367 " </tr>\n",
2368 " <tr>\n",
2369 " <th>31</th>\n",
2370 " <td>AMD</td>\n",
2371 " <td>85.23</td>\n",
2372 " <td>230</td>\n",
2373 " <td>1.590065</td>\n",
2374 " <td>0.99604</td>\n",
2375 " <td>0.532176</td>\n",
2376 " <td>0.984158</td>\n",
2377 " <td>0.597011</td>\n",
2378 " <td>0.948515</td>\n",
2379 " <td>0.560304</td>\n",
2380 " <td>0.99802</td>\n",
2381 " <td>0.981683</td>\n",
2382 " </tr>\n",
2383 " <tr>\n",
2384 " <th>32</th>\n",
2385 " <td>AME</td>\n",
2386 " <td>104.38</td>\n",
2387 " <td>187</td>\n",
2388 " <td>0.177719</td>\n",
2389 " <td>0.677228</td>\n",
2390 " <td>-0.002080</td>\n",
2391 " <td>0.615842</td>\n",
2392 " <td>0.305470</td>\n",
2393 " <td>0.659406</td>\n",
2394 " <td>0.147190</td>\n",
2395 " <td>0.752475</td>\n",
2396 " <td>0.676238</td>\n",
2397 " </tr>\n",
2398 " <tr>\n",
2399 " <th>33</th>\n",
2400 " <td>AMGN</td>\n",
2401 " <td>253.49</td>\n",
2402 " <td>77</td>\n",
2403 " <td>0.176726</td>\n",
2404 " <td>0.671287</td>\n",
2405 " <td>0.086140</td>\n",
2406 " <td>0.764356</td>\n",
2407 " <td>0.020895</td>\n",
2408 " <td>0.112871</td>\n",
2409 " <td>-0.034769</td>\n",
2410 " <td>0.0534653</td>\n",
2411 " <td>0.400495</td>\n",
2412 " </tr>\n",
2413 " <tr>\n",
2414 " <th>34</th>\n",
2415 " <td>AMP</td>\n",
2416 " <td>166.96</td>\n",
2417 " <td>117</td>\n",
2418 " <td>0.254633</td>\n",
2419 " <td>0.736634</td>\n",
2420 " <td>-0.101617</td>\n",
2421 " <td>0.429703</td>\n",
2422 " <td>0.385995</td>\n",
2423 " <td>0.80198</td>\n",
2424 " <td>0.089628</td>\n",
2425 " <td>0.50099</td>\n",
2426 " <td>0.617327</td>\n",
2427 " </tr>\n",
2428 " <tr>\n",
2429 " <th>35</th>\n",
2430 " <td>AMT</td>\n",
2431 " <td>252.70</td>\n",
2432 " <td>77</td>\n",
2433 " <td>0.137500</td>\n",
2434 " <td>0.631683</td>\n",
2435 " <td>-0.022213</td>\n",
2436 " <td>0.574257</td>\n",
2437 " <td>0.091099</td>\n",
2438 " <td>0.231683</td>\n",
2439 " <td>-0.018941</td>\n",
2440 " <td>0.0871287</td>\n",
2441 " <td>0.381188</td>\n",
2442 " </tr>\n",
2443 " <tr>\n",
2444 " <th>36</th>\n",
2445 " <td>AMZN</td>\n",
2446 " <td>3267.82</td>\n",
2447 " <td>6</td>\n",
2448 " <td>0.753428</td>\n",
2449 " <td>0.978218</td>\n",
2450 " <td>0.471720</td>\n",
2451 " <td>0.974257</td>\n",
2452 " <td>0.339324</td>\n",
2453 " <td>0.728713</td>\n",
2454 " <td>0.018781</td>\n",
2455 " <td>0.178218</td>\n",
2456 " <td>0.714851</td>\n",
2457 " </tr>\n",
2458 " <tr>\n",
2459 " <th>37</th>\n",
2460 " <td>ANET</td>\n",
2461 " <td>225.98</td>\n",
2462 " <td>86</td>\n",
2463 " <td>-0.065031</td>\n",
2464 " <td>0.374257</td>\n",
2465 " <td>-0.093866</td>\n",
2466 " <td>0.449505</td>\n",
2467 " <td>0.011798</td>\n",
2468 " <td>0.0910891</td>\n",
2469 " <td>0.024541</td>\n",
2470 " <td>0.207921</td>\n",
2471 " <td>0.280693</td>\n",
2472 " </tr>\n",
2473 " <tr>\n",
2474 " <th>38</th>\n",
2475 " <td>ANSS</td>\n",
2476 " <td>321.00</td>\n",
2477 " <td>61</td>\n",
2478 " <td>0.451591</td>\n",
2479 " <td>0.887129</td>\n",
2480 " <td>0.058949</td>\n",
2481 " <td>0.722772</td>\n",
2482 " <td>0.229415</td>\n",
2483 " <td>0.487129</td>\n",
2484 " <td>0.044242</td>\n",
2485 " <td>0.283168</td>\n",
2486 " <td>0.59505</td>\n",
2487 " </tr>\n",
2488 " <tr>\n",
2489 " <th>39</th>\n",
2490 " <td>ANTM</td>\n",
2491 " <td>293.84</td>\n",
2492 " <td>66</td>\n",
2493 " <td>-0.013031</td>\n",
2494 " <td>0.439604</td>\n",
2495 " <td>-0.053364</td>\n",
2496 " <td>0.514851</td>\n",
2497 " <td>0.058803</td>\n",
2498 " <td>0.164356</td>\n",
2499 " <td>0.104273</td>\n",
2500 " <td>0.582178</td>\n",
2501 " <td>0.425248</td>\n",
2502 " </tr>\n",
2503 " <tr>\n",
2504 " <th>40</th>\n",
2505 " <td>AON</td>\n",
2506 " <td>196.84</td>\n",
2507 " <td>99</td>\n",
2508 " <td>0.006102</td>\n",
2509 " <td>0.463366</td>\n",
2510 " <td>-0.183042</td>\n",
2511 " <td>0.332673</td>\n",
2512 " <td>0.010224</td>\n",
2513 " <td>0.0891089</td>\n",
2514 " <td>-0.026247</td>\n",
2515 " <td>0.0633663</td>\n",
2516 " <td>0.237129</td>\n",
2517 " </tr>\n",
2518 " <tr>\n",
2519 " <th>41</th>\n",
2520 " <td>AOS</td>\n",
2521 " <td>50.31</td>\n",
2522 " <td>389</td>\n",
2523 " <td>0.101690</td>\n",
2524 " <td>0.59802</td>\n",
2525 " <td>0.141115</td>\n",
2526 " <td>0.825743</td>\n",
2527 " <td>0.260257</td>\n",
2528 " <td>0.564356</td>\n",
2529 " <td>0.032405</td>\n",
2530 " <td>0.231683</td>\n",
2531 " <td>0.55495</td>\n",
2532 " </tr>\n",
2533 " <tr>\n",
2534 " <th>42</th>\n",
2535 " <td>APA</td>\n",
2536 " <td>16.40</td>\n",
2537 " <td>1195</td>\n",
2538 " <td>-0.291451</td>\n",
2539 " <td>0.124752</td>\n",
2540 " <td>-0.441406</td>\n",
2541 " <td>0.0514851</td>\n",
2542 " <td>0.485613</td>\n",
2543 " <td>0.893069</td>\n",
2544 " <td>0.260429</td>\n",
2545 " <td>0.952475</td>\n",
2546 " <td>0.505446</td>\n",
2547 " </tr>\n",
2548 " <tr>\n",
2549 " <th>43</th>\n",
2550 " <td>APD</td>\n",
2551 " <td>295.10</td>\n",
2552 " <td>66</td>\n",
2553 " <td>0.242925</td>\n",
2554 " <td>0.728713</td>\n",
2555 " <td>0.124499</td>\n",
2556 " <td>0.807921</td>\n",
2557 " <td>0.273219</td>\n",
2558 " <td>0.592079</td>\n",
2559 " <td>0.040389</td>\n",
2560 " <td>0.265347</td>\n",
2561 " <td>0.598515</td>\n",
2562 " </tr>\n",
2563 " <tr>\n",
2564 " <th>44</th>\n",
2565 " <td>APH</td>\n",
2566 " <td>110.83</td>\n",
2567 " <td>176</td>\n",
2568 " <td>0.255236</td>\n",
2569 " <td>0.738614</td>\n",
2570 " <td>0.053364</td>\n",
2571 " <td>0.714851</td>\n",
2572 " <td>0.342563</td>\n",
2573 " <td>0.740594</td>\n",
2574 " <td>0.168114</td>\n",
2575 " <td>0.819802</td>\n",
2576 " <td>0.753465</td>\n",
2577 " </tr>\n",
2578 " <tr>\n",
2579 " <th>45</th>\n",
2580 " <td>APTV</td>\n",
2581 " <td>91.40</td>\n",
2582 " <td>214</td>\n",
2583 " <td>0.072118</td>\n",
2584 " <td>0.544554</td>\n",
2585 " <td>-0.011731</td>\n",
2586 " <td>0.60198</td>\n",
2587 " <td>0.490744</td>\n",
2588 " <td>0.89505</td>\n",
2589 " <td>0.172564</td>\n",
2590 " <td>0.829703</td>\n",
2591 " <td>0.717822</td>\n",
2592 " </tr>\n",
2593 " <tr>\n",
2594 " <th>46</th>\n",
2595 " <td>ARE</td>\n",
2596 " <td>174.20</td>\n",
2597 " <td>112</td>\n",
2598 " <td>0.208731</td>\n",
2599 " <td>0.706931</td>\n",
2600 " <td>-0.001613</td>\n",
2601 " <td>0.619802</td>\n",
2602 " <td>0.214849</td>\n",
2603 " <td>0.465347</td>\n",
2604 " <td>0.078630</td>\n",
2605 " <td>0.441584</td>\n",
2606 " <td>0.558416</td>\n",
2607 " </tr>\n",
2608 " <tr>\n",
2609 " <th>47</th>\n",
2610 " <td>ATO</td>\n",
2611 " <td>108.98</td>\n",
2612 " <td>179</td>\n",
2613 " <td>-0.039357</td>\n",
2614 " <td>0.415842</td>\n",
2615 " <td>-0.125705</td>\n",
2616 " <td>0.4</td>\n",
2617 " <td>0.089492</td>\n",
2618 " <td>0.229703</td>\n",
2619 " <td>0.053203</td>\n",
2620 " <td>0.306931</td>\n",
2621 " <td>0.338119</td>\n",
2622 " </tr>\n",
2623 " <tr>\n",
2624 " <th>48</th>\n",
2625 " <td>ATVI</td>\n",
2626 " <td>82.88</td>\n",
2627 " <td>236</td>\n",
2628 " <td>0.706749</td>\n",
2629 " <td>0.976238</td>\n",
2630 " <td>0.310780</td>\n",
2631 " <td>0.950495</td>\n",
2632 " <td>0.110910</td>\n",
2633 " <td>0.273267</td>\n",
2634 " <td>0.048812</td>\n",
2635 " <td>0.289109</td>\n",
2636 " <td>0.622277</td>\n",
2637 " </tr>\n",
2638 " <tr>\n",
2639 " <th>49</th>\n",
2640 " <td>AVB</td>\n",
2641 " <td>156.62</td>\n",
2642 " <td>125</td>\n",
2643 " <td>-0.263600</td>\n",
2644 " <td>0.162376</td>\n",
2645 " <td>-0.336301</td>\n",
2646 " <td>0.120792</td>\n",
2647 " <td>0.012586</td>\n",
2648 " <td>0.0930693</td>\n",
2649 " <td>0.005162</td>\n",
2650 " <td>0.142574</td>\n",
2651 " <td>0.129703</td>\n",
2652 " </tr>\n",
2653 " <tr>\n",
2654 " <th>50</th>\n",
2655 " <td>AVGO</td>\n",
2656 " <td>336.73</td>\n",
2657 " <td>N/A</td>\n",
2658 " <td>0.177460</td>\n",
2659 " <td>0.675248</td>\n",
2660 " <td>0.030386</td>\n",
2661 " <td>0.679208</td>\n",
2662 " <td>0.278870</td>\n",
2663 " <td>0.60198</td>\n",
2664 " <td>0.074210</td>\n",
2665 " <td>0.405941</td>\n",
2666 " <td>0.590594</td>\n",
2667 " </tr>\n",
2668 " </tbody>\n",
2669 "</table>\n",
2670 "</div>"
2671 ],
2672 "text/plain": [
2673 " Ticker Price Number of Shares to Buy One-Year Price Return \\\n",
2674 "0 A 98.19 199 0.444090 \n",
2675 "1 AAL 13.89 1411 -0.526494 \n",
2676 "2 AAP 161.13 121 0.088066 \n",
2677 "3 AAPL 467.65 41 1.171724 \n",
2678 "4 ABBV 97.29 201 0.478770 \n",
2679 "5 ABC 104.97 186 0.163705 \n",
2680 "6 ABMD 305.78 64 0.546138 \n",
2681 "7 ABT 102.94 190 0.161073 \n",
2682 "8 ACN 237.88 82 0.197484 \n",
2683 "9 ADBE 453.91 43 0.532839 \n",
2684 "10 ADI 120.52 162 0.056525 \n",
2685 "11 ADM 46.62 420 0.178916 \n",
2686 "12 ADP 139.82 140 -0.174896 \n",
2687 "13 ADSK 234.20 83 0.528696 \n",
2688 "14 AEE 85.23 230 0.073499 \n",
2689 "15 AEP 87.88 223 -0.069760 \n",
2690 "16 AES 17.54 1117 0.141966 \n",
2691 "17 AFL 39.27 499 -0.298263 \n",
2692 "18 AIG 31.76 617 -0.468456 \n",
2693 "19 AIV 39.00 502 -0.260956 \n",
2694 "20 AIZ 129.93 150 0.016575 \n",
2695 "21 AJG 111.00 176 0.195680 \n",
2696 "22 AKAM 110.00 178 0.206310 \n",
2697 "23 ALB 94.85 206 0.339750 \n",
2698 "24 ALGN 309.25 63 0.692338 \n",
2699 "25 ALK 38.63 507 -0.387440 \n",
2700 "26 ALL 99.53 197 -0.079870 \n",
2701 "27 ALLE 105.13 186 0.071934 \n",
2702 "28 ALXN 107.60 182 -0.079570 \n",
2703 "29 AMAT 68.10 287 0.389577 \n",
2704 "30 AMCR 11.52 1702 0.073093 \n",
2705 "31 AMD 85.23 230 1.590065 \n",
2706 "32 AME 104.38 187 0.177719 \n",
2707 "33 AMGN 253.49 77 0.176726 \n",
2708 "34 AMP 166.96 117 0.254633 \n",
2709 "35 AMT 252.70 77 0.137500 \n",
2710 "36 AMZN 3267.82 6 0.753428 \n",
2711 "37 ANET 225.98 86 -0.065031 \n",
2712 "38 ANSS 321.00 61 0.451591 \n",
2713 "39 ANTM 293.84 66 -0.013031 \n",
2714 "40 AON 196.84 99 0.006102 \n",
2715 "41 AOS 50.31 389 0.101690 \n",
2716 "42 APA 16.40 1195 -0.291451 \n",
2717 "43 APD 295.10 66 0.242925 \n",
2718 "44 APH 110.83 176 0.255236 \n",
2719 "45 APTV 91.40 214 0.072118 \n",
2720 "46 ARE 174.20 112 0.208731 \n",
2721 "47 ATO 108.98 179 -0.039357 \n",
2722 "48 ATVI 82.88 236 0.706749 \n",
2723 "49 AVB 156.62 125 -0.263600 \n",
2724 "50 AVGO 336.73 N/A 0.177460 \n",
2725 "\n",
2726 " One-Year Return Percentile Six-Month Price Return \\\n",
2727 "0 0.885149 0.147456 \n",
2728 "1 0.0237624 -0.564540 \n",
2729 "2 0.578218 0.148378 \n",
2730 "3 0.992079 0.401695 \n",
2731 "4 0.89703 0.001711 \n",
2732 "5 0.651485 0.100112 \n",
2733 "6 0.942574 0.874783 \n",
2734 "7 0.647525 0.139130 \n",
2735 "8 0.69505 0.085519 \n",
2736 "9 0.934653 0.196705 \n",
2737 "10 0.522772 0.002920 \n",
2738 "11 0.679208 -0.018869 \n",
2739 "12 0.243564 -0.227657 \n",
2740 "13 0.928713 0.116990 \n",
2741 "14 0.556436 -0.044706 \n",
2742 "15 0.368317 -0.186159 \n",
2743 "16 0.635644 -0.177281 \n",
2744 "17 0.116832 -0.283044 \n",
2745 "18 0.0356436 -0.398200 \n",
2746 "19 0.168317 -0.323003 \n",
2747 "20 0.475248 -0.116835 \n",
2748 "21 0.689109 -0.011750 \n",
2749 "22 0.70495 0.075705 \n",
2750 "23 0.823762 0.036265 \n",
2751 "24 0.970297 0.131757 \n",
2752 "25 0.0633663 -0.438559 \n",
2753 "26 0.354455 -0.230788 \n",
2754 "27 0.542574 -0.246470 \n",
2755 "28 0.356436 -0.006381 \n",
2756 "29 0.855446 -0.013556 \n",
2757 "30 0.552475 0.105582 \n",
2758 "31 0.99604 0.532176 \n",
2759 "32 0.677228 -0.002080 \n",
2760 "33 0.671287 0.086140 \n",
2761 "34 0.736634 -0.101617 \n",
2762 "35 0.631683 -0.022213 \n",
2763 "36 0.978218 0.471720 \n",
2764 "37 0.374257 -0.093866 \n",
2765 "38 0.887129 0.058949 \n",
2766 "39 0.439604 -0.053364 \n",
2767 "40 0.463366 -0.183042 \n",
2768 "41 0.59802 0.141115 \n",
2769 "42 0.124752 -0.441406 \n",
2770 "43 0.728713 0.124499 \n",
2771 "44 0.738614 0.053364 \n",
2772 "45 0.544554 -0.011731 \n",
2773 "46 0.706931 -0.001613 \n",
2774 "47 0.415842 -0.125705 \n",
2775 "48 0.976238 0.310780 \n",
2776 "49 0.162376 -0.336301 \n",
2777 "50 0.675248 0.030386 \n",
2778 "\n",
2779 " Six-Month Return Percentile Three-Month Price Return \\\n",
2780 "0 0.837624 0.221461 \n",
2781 "1 0.0158416 0.509431 \n",
2782 "2 0.839604 0.295700 \n",
2783 "3 0.968317 0.474900 \n",
2784 "4 0.629703 0.077880 \n",
2785 "5 0.774257 0.241867 \n",
2786 "6 0.99802 0.645795 \n",
2787 "7 0.823762 0.093917 \n",
2788 "8 0.762376 0.279570 \n",
2789 "9 0.879208 0.252382 \n",
2790 "10 0.631683 0.149173 \n",
2791 "11 0.580198 0.328413 \n",
2792 "12 0.265347 0.037317 \n",
2793 "13 0.794059 0.312257 \n",
2794 "14 0.538614 0.202938 \n",
2795 "15 0.326733 0.084255 \n",
2796 "16 0.336634 0.510037 \n",
2797 "17 0.190099 0.178662 \n",
2798 "18 0.0673267 0.242767 \n",
2799 "19 0.142574 0.096556 \n",
2800 "20 0.40396 0.418900 \n",
2801 "21 0.6 0.253483 \n",
2802 "22 0.752475 0.125834 \n",
2803 "23 0.691089 0.528245 \n",
2804 "24 0.815842 0.554489 \n",
2805 "25 0.0534653 0.519770 \n",
2806 "26 0.261386 0.045750 \n",
2807 "27 0.241584 0.112362 \n",
2808 "28 0.60396 0.003280 \n",
2809 "29 0.594059 0.301391 \n",
2810 "30 0.778218 0.238793 \n",
2811 "31 0.984158 0.597011 \n",
2812 "32 0.615842 0.305470 \n",
2813 "33 0.764356 0.020895 \n",
2814 "34 0.429703 0.385995 \n",
2815 "35 0.574257 0.091099 \n",
2816 "36 0.974257 0.339324 \n",
2817 "37 0.449505 0.011798 \n",
2818 "38 0.722772 0.229415 \n",
2819 "39 0.514851 0.058803 \n",
2820 "40 0.332673 0.010224 \n",
2821 "41 0.825743 0.260257 \n",
2822 "42 0.0514851 0.485613 \n",
2823 "43 0.807921 0.273219 \n",
2824 "44 0.714851 0.342563 \n",
2825 "45 0.60198 0.490744 \n",
2826 "46 0.619802 0.214849 \n",
2827 "47 0.4 0.089492 \n",
2828 "48 0.950495 0.110910 \n",
2829 "49 0.120792 0.012586 \n",
2830 "50 0.679208 0.278870 \n",
2831 "\n",
2832 " Three-Month Return Percentile One-Month Price Return \\\n",
2833 "0 0.473267 0.093820 \n",
2834 "1 0.908911 0.172430 \n",
2835 "2 0.643564 0.144608 \n",
2836 "3 0.887129 0.189840 \n",
2837 "4 0.19802 -0.024533 \n",
2838 "5 0.522772 0.066990 \n",
2839 "6 0.954455 0.145153 \n",
2840 "7 0.233663 0.081815 \n",
2841 "8 0.605941 0.067045 \n",
2842 "9 0.550495 0.006829 \n",
2843 "10 0.360396 0.017244 \n",
2844 "11 0.70495 0.123837 \n",
2845 "12 0.134653 -0.042030 \n",
2846 "13 0.677228 -0.001259 \n",
2847 "14 0.447525 0.086675 \n",
2848 "15 0.217822 -0.007456 \n",
2849 "16 0.910891 0.186968 \n",
2850 "17 0.4 0.082055 \n",
2851 "18 0.528713 0.042150 \n",
2852 "19 0.243564 0.004109 \n",
2853 "20 0.839604 0.254327 \n",
2854 "21 0.554455 0.092902 \n",
2855 "22 0.312871 -0.027015 \n",
2856 "23 0.918812 0.120477 \n",
2857 "24 0.928713 0.143933 \n",
2858 "25 0.916832 0.103833 \n",
2859 "26 0.146535 0.088925 \n",
2860 "27 0.277228 0.024073 \n",
2861 "28 0.0792079 -0.040910 \n",
2862 "29 0.651485 0.082413 \n",
2863 "30 0.510891 0.077579 \n",
2864 "31 0.948515 0.560304 \n",
2865 "32 0.659406 0.147190 \n",
2866 "33 0.112871 -0.034769 \n",
2867 "34 0.80198 0.089628 \n",
2868 "35 0.231683 -0.018941 \n",
2869 "36 0.728713 0.018781 \n",
2870 "37 0.0910891 0.024541 \n",
2871 "38 0.487129 0.044242 \n",
2872 "39 0.164356 0.104273 \n",
2873 "40 0.0891089 -0.026247 \n",
2874 "41 0.564356 0.032405 \n",
2875 "42 0.893069 0.260429 \n",
2876 "43 0.592079 0.040389 \n",
2877 "44 0.740594 0.168114 \n",
2878 "45 0.89505 0.172564 \n",
2879 "46 0.465347 0.078630 \n",
2880 "47 0.229703 0.053203 \n",
2881 "48 0.273267 0.048812 \n",
2882 "49 0.0930693 0.005162 \n",
2883 "50 0.60198 0.074210 \n",
2884 "\n",
2885 " One-Month Return Percentile HQM Score \n",
2886 "0 0.530693 0.681683 \n",
2887 "1 0.827723 0.444059 \n",
2888 "2 0.742574 0.70099 \n",
2889 "3 0.879208 0.931683 \n",
2890 "4 0.0693069 0.448515 \n",
2891 "5 0.364356 0.578218 \n",
2892 "6 0.746535 0.910396 \n",
2893 "7 0.457426 0.540594 \n",
2894 "8 0.366337 0.607426 \n",
2895 "9 0.150495 0.628713 \n",
2896 "10 0.174257 0.422277 \n",
2897 "11 0.687129 0.662871 \n",
2898 "12 0.0435644 0.171782 \n",
2899 "13 0.122772 0.630693 \n",
2900 "14 0.483168 0.506436 \n",
2901 "15 0.106931 0.25495 \n",
2902 "16 0.873267 0.689109 \n",
2903 "17 0.459406 0.291584 \n",
2904 "18 0.271287 0.225743 \n",
2905 "19 0.140594 0.173762 \n",
2906 "20 0.948515 0.666832 \n",
2907 "21 0.520792 0.591089 \n",
2908 "22 0.0594059 0.457426 \n",
2909 "23 0.673267 0.776733 \n",
2910 "24 0.738614 0.863366 \n",
2911 "25 0.576238 0.402475 \n",
2912 "26 0.49703 0.314851 \n",
2913 "27 0.20396 0.316337 \n",
2914 "28 0.0455446 0.271287 \n",
2915 "29 0.461386 0.640594 \n",
2916 "30 0.433663 0.568812 \n",
2917 "31 0.99802 0.981683 \n",
2918 "32 0.752475 0.676238 \n",
2919 "33 0.0534653 0.400495 \n",
2920 "34 0.50099 0.617327 \n",
2921 "35 0.0871287 0.381188 \n",
2922 "36 0.178218 0.714851 \n",
2923 "37 0.207921 0.280693 \n",
2924 "38 0.283168 0.59505 \n",
2925 "39 0.582178 0.425248 \n",
2926 "40 0.0633663 0.237129 \n",
2927 "41 0.231683 0.55495 \n",
2928 "42 0.952475 0.505446 \n",
2929 "43 0.265347 0.598515 \n",
2930 "44 0.819802 0.753465 \n",
2931 "45 0.829703 0.717822 \n",
2932 "46 0.441584 0.558416 \n",
2933 "47 0.306931 0.338119 \n",
2934 "48 0.289109 0.622277 \n",
2935 "49 0.142574 0.129703 \n",
2936 "50 0.405941 0.590594 "
2937 ]
2938 },
2939 "execution_count": 15,
2940 "metadata": {},
2941 "output_type": "execute_result"
2942 }
2943 ],
2944 "source": [
2945 "position_size = float(portfolio_size) / len(hqm_dataframe.index)\n",
2946 "for i in range(0, len(hqm_dataframe['Ticker'])-1):\n",
2947 " hqm_dataframe.loc[i, 'Number of Shares to Buy'] = math.floor(position_size / hqm_dataframe['Price'][i])\n",
2948 "hqm_dataframe"
2949 ]
2950 },
2951 {
2952 "cell_type": "markdown",
2953 "metadata": {},
2954 "source": [
2955 "## Formatting Our Excel Output\n",
2956 "\n",
2957 "We will be using the XlsxWriter library for Python to create nicely-formatted Excel files.\n",
2958 "\n",
2959 "XlsxWriter is an excellent package and offers tons of customization. However, the tradeoff for this is that the library can seem very complicated to new users. Accordingly, this section will be fairly long because I want to do a good job of explaining how XlsxWriter works."
2960 ]
2961 },
2962 {
2963 "cell_type": "code",
2964 "execution_count": 16,
2965 "metadata": {},
2966 "outputs": [],
2967 "source": [
2968 "writer = pd.ExcelWriter('momentum_strategy.xlsx', engine='xlsxwriter')\n",
2969 "hqm_dataframe.to_excel(writer, sheet_name='Momentum Strategy', index = False)"
2970 ]
2971 },
2972 {
2973 "cell_type": "markdown",
2974 "metadata": {},
2975 "source": [
2976 "## Creating the Formats We'll Need For Our .xlsx File\n",
2977 "\n",
2978 "You'll recall from our first project that formats include colors, fonts, and also symbols like % and $. We'll need four main formats for our Excel document:\n",
2979 "\n",
2980 "* String format for tickers\n",
2981 "* \\$XX.XX format for stock prices\n",
2982 "* \\$XX,XXX format for market capitalization\n",
2983 "* Integer format for the number of shares to purchase\n",
2984 "\n",
2985 "Since we already built our formats in the last section of this course, I've included them below for you. Run this code cell before proceeding."
2986 ]
2987 },
2988 {
2989 "cell_type": "code",
2990 "execution_count": 17,
2991 "metadata": {},
2992 "outputs": [],
2993 "source": [
2994 "background_color = '#0a0a23'\n",
2995 "font_color = '#ffffff'\n",
2996 "\n",
2997 "string_template = writer.book.add_format(\n",
2998 " {\n",
2999 " 'font_color': font_color,\n",
3000 " 'bg_color': background_color,\n",
3001 " 'border': 1\n",
3002 " }\n",
3003 " )\n",
3004 "\n",
3005 "dollar_template = writer.book.add_format(\n",
3006 " {\n",
3007 " 'num_format':'$0.00',\n",
3008 " 'font_color': font_color,\n",
3009 " 'bg_color': background_color,\n",
3010 " 'border': 1\n",
3011 " }\n",
3012 " )\n",
3013 "\n",
3014 "integer_template = writer.book.add_format(\n",
3015 " {\n",
3016 " 'num_format':'0',\n",
3017 " 'font_color': font_color,\n",
3018 " 'bg_color': background_color,\n",
3019 " 'border': 1\n",
3020 " }\n",
3021 " )\n",
3022 "\n",
3023 "percent_template = writer.book.add_format(\n",
3024 " {\n",
3025 " 'num_format':'0.0%',\n",
3026 " 'font_color': font_color,\n",
3027 " 'bg_color': background_color,\n",
3028 " 'border': 1\n",
3029 " }\n",
3030 " )"
3031 ]
3032 },
3033 {
3034 "cell_type": "code",
3035 "execution_count": 18,
3036 "metadata": {},
3037 "outputs": [],
3038 "source": [
3039 "column_formats = { \n",
3040 " 'A': ['Ticker', string_template],\n",
3041 " 'B': ['Price', dollar_template],\n",
3042 " 'C': ['Number of Shares to Buy', integer_template],\n",
3043 " 'D': ['One-Year Price Return', percent_template],\n",
3044 " 'E': ['One-Year Return Percentile', percent_template],\n",
3045 " 'F': ['Six-Month Price Return', percent_template],\n",
3046 " 'G': ['Six-Month Return Percentile', percent_template],\n",
3047 " 'H': ['Three-Month Price Return', percent_template],\n",
3048 " 'I': ['Three-Month Return Percentile', percent_template],\n",
3049 " 'J': ['One-Month Price Return', percent_template],\n",
3050 " 'K': ['One-Month Return Percentile', percent_template],\n",
3051 " 'L': ['HQM Score', integer_template]\n",
3052 " }\n",
3053 "\n",
3054 "for column in column_formats.keys():\n",
3055 " writer.sheets['Momentum Strategy'].set_column(f'{column}:{column}', 20, column_formats[column][1])\n",
3056 " writer.sheets['Momentum Strategy'].write(f'{column}1', column_formats[column][0], string_template)"
3057 ]
3058 },
3059 {
3060 "cell_type": "markdown",
3061 "metadata": {},
3062 "source": [
3063 "## Saving Our Excel Output\n",
3064 "\n",
3065 "As before, saving our Excel output is very easy:"
3066 ]
3067 },
3068 {
3069 "cell_type": "code",
3070 "execution_count": 19,
3071 "metadata": {},
3072 "outputs": [],
3073 "source": [
3074 "writer.save()"
3075 ]
3076 }
3077 ],
3078 "metadata": {
3079 "kernelspec": {
3080 "display_name": "Python 3",
3081 "language": "python",
3082 "name": "python3"
3083 },
3084 "language_info": {
3085 "codemirror_mode": {
3086 "name": "ipython",
3087 "version": 3
3088 },
3089 "file_extension": ".py",
3090 "mimetype": "text/x-python",
3091 "name": "python",
3092 "nbconvert_exporter": "python",
3093 "pygments_lexer": "ipython3",
3094 "version": "3.8.2"
3095 }
3096 },
3097 "nbformat": 4,
3098 "nbformat_minor": 4
3099 }