├── README.md ├── code ├── Calculate_Intrinsic_Value.ipynb └── Calculating_Stock_Metrics.ipynb ├── data ├── AAPL Key Ratios.csv └── aapl_concise.csv └── reflection_brief_intro.pdf /README.md: -------------------------------------------------------------------------------- 1 | This repository hosts the code of **Value Investing in Python**, a data science tutorial published in Medium. 2 | This tutorial covers fundamental analysis for US stocks. 3 | 4 | ## Syllabus 5 | The organization of this tutorial falls into the following parts: 6 | 7 | **[1. Collecting financial data for fundamental analysis](https://medium.com/@luo9137/collecting-financial-data-for-fundamental-analysis-115140f5f162)** 8 | 9 | Data is the foundation of this project, and all the subsequent analysis will use data collected in this section. In this section, we have 3 learning objectives: 10 | * Understand the basic concept of value investing and intrinsic value 11 | * Understand what data will be needed to calculate intrinsic value 12 | * Learn to collect the financial data needed from future use 13 | 14 | **[2. How to Generate these Popular Stock Terms using Python](https://medium.com/@luo9137/how-to-generate-these-popular-stock-terms-using-python-4e69c6acc6b3)** 15 | 16 | This section covers the relative simple metrics which will be very useful in fundamental analysis. 17 | Here we have 4 learning objectives: 18 | * What are some important metrics for value investing 19 | * Learn to load financial data into Pandas 20 | * Learn how to retrieve and calculate the metrics using Pandas 21 | 22 | **[3. How to calculate the intrinsic value](https://medium.com/@luo9137/how-to-calculate-the-intrinsic-value-of-a-stock-31c0312586a3)** 23 | 24 | This section unveils the definition of intrinsic value, and also provide a step-by-step calculation for intrinsic value. Here we have 2 learning objectives: 25 | * Calculate intrinsic value in 2 ways 26 | * Discuss the downside and remedy for these 2 methods 27 | 28 | ## Who is the target audience? 29 | If you have been trading stocks for years but conducted your fundamental analysis manually, this is the starting point for you to automate your analysis. Thus, you could conduct a fundamental analysis on a large scale, save a lot of time and avoid human mistakes. 30 | 31 | If you have just started to trade stocks, and have no idea about how to evaluate a stock. Then, this tutorial could help you establish a basic framework and hypothetically save you some money for avoiding some obvious mistakes. 32 | 33 | If you are a data science newbie, wish to gain some hands-on experience. Then, the finance field can be an ideal starting point since it could offer you tons of organized and relatively clean data. 34 | 35 | ## Prerequisites 36 | You do not need to know any finance to be able to study this tutorial, as we will introduce Preston Pysh’s videos, who did a great job in teaching financial concepts in an easy-to-understand way. 37 | 38 | Python basics and Pandas would be required. If you are not familiar with them, here are some resources could be helpful: 39 | 40 | * [Python 3 Tutorial — Learn Python in 30 Minutes](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=2ahUKEwjG64PJ7P_mAhXStVkKHb0WAecQFjAAegQIARAB&url=https%3A%2F%2Fwww.programiz.com%2Fpython-programming%2Ftutorial&usg=AOvVaw20Znr2oKGr-03mkPFz4rZT): What you need to know is the first 6 bullet points, from ‘Run Python on your computer’ to ‘Exceptions (Handling, User-defined Exception, …)’ 41 | * [Get Started With Python Pandas In 5 minutes](https://medium.com/bhavaniravi/python-pandas-tutorial-92018da85a33) 42 | 43 | You could also try to start without Python and Pandas basics since I am trying to make everything clear. But if you at some point feel hard to understand what the code does, please feel free to leave me a comment and come back to these tutorials. 44 | 45 | ## Next 46 | 47 | I am working with teammates to build a website that hosts tutorials and also provide financial insights, stock recommendation based on the technologies that we learned and taught on the website. 48 | 49 | ## Acknowledgements 50 | I want to thank [Preston Pysh](https://www.youtube.com/channel/UCLTdCY-fNXc1GqzIuflK-OQ), [Investopedia](http://investopedia.com/), [StatQuest](https://www.youtube.com/user/joshstarmer) and [Towards Data Science](https://towardsdatascience.com/). 51 | 52 | Preston Pysh created a fantastic value investing course on YouTube. I would recommend this course to anyone with an interest in investing and finance. 53 | 54 | Investopedia is my initial source of financial knowledge. It offers an easy-to-understand explanation for financial terms. 55 | StatQuest and Towards Data Science have great tutorials on Machine Learning and Stats. 56 | 57 | I benefited a lot from these resources. 58 | 59 | If you have any suggestions or feedback, please feel free to leave a comment or email me at sicong.zhao@duke.edu. 60 | -------------------------------------------------------------------------------- /code/Calculate_Intrinsic_Value.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "kernelspec": { 6 | "display_name": "Python 3", 7 | "language": "python", 8 | "name": "python3" 9 | }, 10 | "language_info": { 11 | "codemirror_mode": { 12 | "name": "ipython", 13 | "version": 3 14 | }, 15 | "file_extension": ".py", 16 | "mimetype": "text/x-python", 17 | "name": "python", 18 | "nbconvert_exporter": "python", 19 | "pygments_lexer": "ipython3", 20 | "version": "3.7.5" 21 | }, 22 | "colab": { 23 | "name": "Calculate-Intrinsic-Value.ipynb", 24 | "provenance": [], 25 | "collapsed_sections": [] 26 | } 27 | }, 28 | "cells": [ 29 | { 30 | "cell_type": "code", 31 | "metadata": { 32 | "id": "vKmWaIZht5MF", 33 | "colab_type": "code", 34 | "colab": {} 35 | }, 36 | "source": [ 37 | "import pandas as pd" 38 | ], 39 | "execution_count": 0, 40 | "outputs": [] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": { 45 | "id": "o9cWlM8ft5MP", 46 | "colab_type": "text" 47 | }, 48 | "source": [ 49 | "### Import Data" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "metadata": { 55 | "id": "Y1q7r9qJt5MS", 56 | "colab_type": "code", 57 | "colab": {} 58 | }, 59 | "source": [ 60 | "# Load Data\n", 61 | "aapl = pd.read_csv('https://raw.githubusercontent.com/RyC37/Value-Investing-In-Python/master/data/aapl_concise.csv', index_col='Unnamed: 0')" 62 | ], 63 | "execution_count": 0, 64 | "outputs": [] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "metadata": { 69 | "id": "TkicZvIjt5MY", 70 | "colab_type": "code", 71 | "outputId": "74fc251f-4569-42d3-f84d-7135f7999c81", 72 | "colab": {} 73 | }, 74 | "source": [ 75 | "aapl.head()" 76 | ], 77 | "execution_count": 0, 78 | "outputs": [ 79 | { 80 | "output_type": "execute_result", 81 | "data": { 82 | "text/html": [ 83 | "
\n", 84 | "\n", 97 | "\n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | "
shares_outstandingearning_per_sharedividend_ratedividend_yielddebt_to_equitybook_value_per_sharereturn_on_equitycurrent_ratio
2010-096,4732.16NaNNaNNaN7.4535.282.01
2011-096,5573.95NaNNaNNaN11.7841.671.61
2012-096,6176.310.38NaNNaN16.9942.841.50
2013-096,5225.681.6327.40.1419.6030.641.68
2014-096,1236.451.8128.50.2620.6233.611.08
\n", 169 | "
" 170 | ], 171 | "text/plain": [ 172 | " shares_outstanding earning_per_share dividend_rate dividend_yield \\\n", 173 | "2010-09 6,473 2.16 NaN NaN \n", 174 | "2011-09 6,557 3.95 NaN NaN \n", 175 | "2012-09 6,617 6.31 0.38 NaN \n", 176 | "2013-09 6,522 5.68 1.63 27.4 \n", 177 | "2014-09 6,123 6.45 1.81 28.5 \n", 178 | "\n", 179 | " debt_to_equity book_value_per_share return_on_equity current_ratio \n", 180 | "2010-09 NaN 7.45 35.28 2.01 \n", 181 | "2011-09 NaN 11.78 41.67 1.61 \n", 182 | "2012-09 NaN 16.99 42.84 1.50 \n", 183 | "2013-09 0.14 19.60 30.64 1.68 \n", 184 | "2014-09 0.26 20.62 33.61 1.08 " 185 | ] 186 | }, 187 | "metadata": { 188 | "tags": [] 189 | }, 190 | "execution_count": 7 191 | } 192 | ] 193 | }, 194 | { 195 | "cell_type": "markdown", 196 | "metadata": { 197 | "id": "KUnVi0fzt5Mg", 198 | "colab_type": "text" 199 | }, 200 | "source": [ 201 | "### Calculate Intrinsic Value (Simple way)\n", 202 | "\n", 203 | "##### (1) Estimate future dividends" 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "metadata": { 209 | "id": "JJzRV2RCt5Mi", 210 | "colab_type": "code", 211 | "outputId": "6bd9717b-d02e-453f-dcb8-aa6d0f827bc7", 212 | "colab": {} 213 | }, 214 | "source": [ 215 | "# Last 10-year's average dividends\n", 216 | "dvd_avg = aapl['dividend_rate'].mean()\n", 217 | "print(dvd_avg)" 218 | ], 219 | "execution_count": 0, 220 | "outputs": [ 221 | { 222 | "output_type": "stream", 223 | "text": [ 224 | "2.1222222222222222\n" 225 | ], 226 | "name": "stdout" 227 | } 228 | ] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "metadata": { 233 | "id": "J3gkQqyht5Mm", 234 | "colab_type": "code", 235 | "outputId": "2f5a9031-bc56-465b-d322-1740969d5eae", 236 | "colab": {} 237 | }, 238 | "source": [ 239 | "risk_free_rate = 0.0179\n", 240 | "# The discounted capital for the dividend of 3-year later\n", 241 | "dvd_avg/(1+risk_free_rate)**3\n", 242 | "# The discounted capital for the dividend of 10-year later\n", 243 | "# dvd_avg/(1+risk_free_rate)**10" 244 | ], 245 | "execution_count": 0, 246 | "outputs": [ 247 | { 248 | "output_type": "execute_result", 249 | "data": { 250 | "text/plain": [ 251 | "2.0122202476874578" 252 | ] 253 | }, 254 | "metadata": { 255 | "tags": [] 256 | }, 257 | "execution_count": 31 258 | } 259 | ] 260 | }, 261 | { 262 | "cell_type": "code", 263 | "metadata": { 264 | "id": "OwiDxfWgt5Mr", 265 | "colab_type": "code", 266 | "outputId": "af6fd92a-04f8-4ebf-c75d-6968c801fd76", 267 | "colab": {} 268 | }, 269 | "source": [ 270 | "dvd_total = 0\n", 271 | "for i in range(1,11):\n", 272 | " dvd_total = dvd_total + dvd_avg/(1+risk_free_rate)**i\n", 273 | "print(dvd_total)" 274 | ], 275 | "execution_count": 0, 276 | "outputs": [ 277 | { 278 | "output_type": "stream", 279 | "text": [ 280 | "19.27420500514451\n" 281 | ], 282 | "name": "stdout" 283 | } 284 | ] 285 | }, 286 | { 287 | "cell_type": "markdown", 288 | "metadata": { 289 | "id": "HdPRblpSt5My", 290 | "colab_type": "text" 291 | }, 292 | "source": [ 293 | "##### (2) Estimate future book value" 294 | ] 295 | }, 296 | { 297 | "cell_type": "code", 298 | "metadata": { 299 | "id": "3_gnH46zt5Mz", 300 | "colab_type": "code", 301 | "colab": {} 302 | }, 303 | "source": [ 304 | "# Average growth rate\n", 305 | "book_value = aapl['book_value_per_share']" 306 | ], 307 | "execution_count": 0, 308 | "outputs": [] 309 | }, 310 | { 311 | "cell_type": "code", 312 | "metadata": { 313 | "id": "2NY9FN6Vt5M3", 314 | "colab_type": "code", 315 | "outputId": "6f48dd0e-df08-4ed2-ae83-a86a58af6119", 316 | "colab": {} 317 | }, 318 | "source": [ 319 | "# 9th root\n", 320 | "book_value = aapl['book_value_per_share']\n", 321 | "growth_rate_of_9y= book_value['2019-09']/book_value['2010-09']\n", 322 | "avg_growth_rate = growth_rate_of_9y**(1/9)\n", 323 | "print(avg_growth_rate)" 324 | ], 325 | "execution_count": 0, 326 | "outputs": [ 327 | { 328 | "output_type": "stream", 329 | "text": [ 330 | "1.1261895823169403\n" 331 | ], 332 | "name": "stdout" 333 | } 334 | ] 335 | }, 336 | { 337 | "cell_type": "code", 338 | "metadata": { 339 | "id": "RRj0EFept5M5", 340 | "colab_type": "code", 341 | "outputId": "7c356ff7-aca7-4253-cd9f-8c91f0fa07ae", 342 | "colab": {} 343 | }, 344 | "source": [ 345 | "# Book value per share in next 10 years\n", 346 | "bvps_pred = book_value['2019-09']*(growth_rate**10)\n", 347 | "print(bvps_pred)" 348 | ], 349 | "execution_count": 0, 350 | "outputs": [ 351 | { 352 | "output_type": "stream", 353 | "text": [ 354 | "63.26497986577179\n" 355 | ], 356 | "name": "stdout" 357 | } 358 | ] 359 | }, 360 | { 361 | "cell_type": "markdown", 362 | "metadata": { 363 | "id": "5_6dXpsft5M-", 364 | "colab_type": "text" 365 | }, 366 | "source": [ 367 | "##### (3) Combine 2 parts" 368 | ] 369 | }, 370 | { 371 | "cell_type": "code", 372 | "metadata": { 373 | "id": "9h0wN_6Nt5NB", 374 | "colab_type": "code", 375 | "outputId": "2e0c48ab-b147-4aa3-f349-567cbd132cb3", 376 | "colab": {} 377 | }, 378 | "source": [ 379 | "aapl_intrinsic = bvps_pred + dvd_total\n", 380 | "print(aapl_intrinsic)" 381 | ], 382 | "execution_count": 0, 383 | "outputs": [ 384 | { 385 | "output_type": "stream", 386 | "text": [ 387 | "82.5391848709163\n" 388 | ], 389 | "name": "stdout" 390 | } 391 | ] 392 | }, 393 | { 394 | "cell_type": "code", 395 | "metadata": { 396 | "id": "3ISxO0nZt5NG", 397 | "colab_type": "code", 398 | "colab": {} 399 | }, 400 | "source": [ 401 | "# ignore TTM for now\n", 402 | "aapl = aapl.drop(aapl.tail(1).index)" 403 | ], 404 | "execution_count": 0, 405 | "outputs": [] 406 | }, 407 | { 408 | "cell_type": "code", 409 | "metadata": { 410 | "id": "m-KJxMd3t5NN", 411 | "colab_type": "code", 412 | "outputId": "9aedf36c-e247-4745-8087-b4385fd24723", 413 | "colab": {} 414 | }, 415 | "source": [ 416 | "aapl['dividend_rate'].plot(figsize=(10,6), title=\"Apple's Dividends in Last 10 Years\")" 417 | ], 418 | "execution_count": 0, 419 | "outputs": [ 420 | { 421 | "output_type": "execute_result", 422 | "data": { 423 | "text/plain": [ 424 | "" 425 | ] 426 | }, 427 | "metadata": { 428 | "tags": [] 429 | }, 430 | "execution_count": 56 431 | }, 432 | { 433 | "output_type": "display_data", 434 | "data": { 435 | "image/png": "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\n", 436 | "text/plain": [ 437 | "
" 438 | ] 439 | }, 440 | "metadata": { 441 | "tags": [], 442 | "needs_background": "light" 443 | } 444 | } 445 | ] 446 | }, 447 | { 448 | "cell_type": "code", 449 | "metadata": { 450 | "id": "yE50TSvyt5NP", 451 | "colab_type": "code", 452 | "outputId": "0a382879-45fd-49d2-bb18-a14f420c2c21", 453 | "colab": {} 454 | }, 455 | "source": [ 456 | "aapl['book_value_per_share'].plot(figsize=(10,6), title=\"Apple's Book Value in Last 10 Years\")" 457 | ], 458 | "execution_count": 0, 459 | "outputs": [ 460 | { 461 | "output_type": "execute_result", 462 | "data": { 463 | "text/plain": [ 464 | "" 465 | ] 466 | }, 467 | "metadata": { 468 | "tags": [] 469 | }, 470 | "execution_count": 55 471 | }, 472 | { 473 | "output_type": "display_data", 474 | "data": { 475 | "image/png": "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\n", 476 | "text/plain": [ 477 | "
" 478 | ] 479 | }, 480 | "metadata": { 481 | "tags": [], 482 | "needs_background": "light" 483 | } 484 | } 485 | ] 486 | }, 487 | { 488 | "cell_type": "markdown", 489 | "metadata": { 490 | "id": "RPNtcnRft5NR", 491 | "colab_type": "text" 492 | }, 493 | "source": [ 494 | "### Calculate Intrinsic Value using Linear Regression" 495 | ] 496 | }, 497 | { 498 | "cell_type": "code", 499 | "metadata": { 500 | "id": "j2kQv859t5NR", 501 | "colab_type": "code", 502 | "colab": {} 503 | }, 504 | "source": [ 505 | "import statsmodels.api as sm" 506 | ], 507 | "execution_count": 0, 508 | "outputs": [] 509 | }, 510 | { 511 | "cell_type": "markdown", 512 | "metadata": { 513 | "id": "UN2eyIMkt5NT", 514 | "colab_type": "text" 515 | }, 516 | "source": [ 517 | "##### (1) House Keeping" 518 | ] 519 | }, 520 | { 521 | "cell_type": "code", 522 | "metadata": { 523 | "id": "uCALdjI3t5NT", 524 | "colab_type": "code", 525 | "colab": {} 526 | }, 527 | "source": [ 528 | "# 'year_index' as the order of the year\n", 529 | "aapl['year_index'] = range(1, len(aapl) + 1)\n", 530 | "# add intercept\n", 531 | "aapl['intercept'] = 1" 532 | ], 533 | "execution_count": 0, 534 | "outputs": [] 535 | }, 536 | { 537 | "cell_type": "markdown", 538 | "metadata": { 539 | "id": "HMA6aLT6t5NV", 540 | "colab_type": "text" 541 | }, 542 | "source": [ 543 | "##### (2) Book Value per Share" 544 | ] 545 | }, 546 | { 547 | "cell_type": "code", 548 | "metadata": { 549 | "id": "_YCywohOt5NX", 550 | "colab_type": "code", 551 | "colab": {} 552 | }, 553 | "source": [ 554 | "# modeling\n", 555 | "bvps_model = sm.OLS(aapl['book_value_per_share'], aapl[['year_index','intercept']]).fit()" 556 | ], 557 | "execution_count": 0, 558 | "outputs": [] 559 | }, 560 | { 561 | "cell_type": "code", 562 | "metadata": { 563 | "id": "34rFjajCt5NY", 564 | "colab_type": "code", 565 | "outputId": "49bdc281-e004-49c9-f156-187e6f5a8e56", 566 | "colab": {} 567 | }, 568 | "source": [ 569 | "bvps_pred_lr = bvps_model.predict([19,1])[0]\n", 570 | "print(bvps_pred_lr)" 571 | ], 572 | "execution_count": 0, 573 | "outputs": [ 574 | { 575 | "output_type": "stream", 576 | "text": [ 577 | "41.81709090909092\n" 578 | ], 579 | "name": "stdout" 580 | } 581 | ] 582 | }, 583 | { 584 | "cell_type": "markdown", 585 | "metadata": { 586 | "id": "lmJBNOSgt5Na", 587 | "colab_type": "text" 588 | }, 589 | "source": [ 590 | "##### (3) Dividends" 591 | ] 592 | }, 593 | { 594 | "cell_type": "code", 595 | "metadata": { 596 | "id": "XBMbK5KDt5Nb", 597 | "colab_type": "code", 598 | "colab": {} 599 | }, 600 | "source": [ 601 | "aapl_new = aapl.dropna(subset = ['dividend_rate'])" 602 | ], 603 | "execution_count": 0, 604 | "outputs": [] 605 | }, 606 | { 607 | "cell_type": "code", 608 | "metadata": { 609 | "id": "gvyaQMKKt5Nd", 610 | "colab_type": "code", 611 | "colab": {} 612 | }, 613 | "source": [ 614 | "# modeling\n", 615 | "dvd_model = sm.OLS(aapl_new['dividend_rate'], aapl_new[['year_index','intercept']]).fit()" 616 | ], 617 | "execution_count": 0, 618 | "outputs": [] 619 | }, 620 | { 621 | "cell_type": "code", 622 | "metadata": { 623 | "id": "Fs8FMODet5Nf", 624 | "colab_type": "code", 625 | "outputId": "6fadb7c8-dfbf-4b27-bb2c-a9d002daa4da", 626 | "colab": {} 627 | }, 628 | "source": [ 629 | "# predict future dvd\n", 630 | "dvd_model.predict([19,1])[0]" 631 | ], 632 | "execution_count": 0, 633 | "outputs": [ 634 | { 635 | "output_type": "execute_result", 636 | "data": { 637 | "text/plain": [ 638 | "5.845833333333332" 639 | ] 640 | }, 641 | "metadata": { 642 | "tags": [] 643 | }, 644 | "execution_count": 91 645 | } 646 | ] 647 | }, 648 | { 649 | "cell_type": "code", 650 | "metadata": { 651 | "id": "CjhxWJ5ft5Nh", 652 | "colab_type": "code", 653 | "outputId": "0ec5e216-bba2-4d89-8299-daaab5facb26", 654 | "colab": {} 655 | }, 656 | "source": [ 657 | "dvd_total_lr = 0\n", 658 | "current_year_order = 9\n", 659 | "for i in range(1,11):\n", 660 | " dvd_new = dvd_model.predict([current_year_order + i,1])[0]\n", 661 | " dvd_total_lr = dvd_total_lr + dvd_new/(1+risk_free_rate)**i\n", 662 | "print(dvd_total_lr)" 663 | ], 664 | "execution_count": 0, 665 | "outputs": [ 666 | { 667 | "output_type": "stream", 668 | "text": [ 669 | "40.15163616617433\n" 670 | ], 671 | "name": "stdout" 672 | } 673 | ] 674 | }, 675 | { 676 | "cell_type": "code", 677 | "metadata": { 678 | "id": "cZRoLNzft5Nj", 679 | "colab_type": "code", 680 | "outputId": "b41762ef-c7f4-4c23-ea93-30491f982f52", 681 | "colab": {} 682 | }, 683 | "source": [ 684 | "aapl_intrinsic_lr = dvd_total_lr + bvps_pred_lr\n", 685 | "print(aapl_intrinsic_lr)" 686 | ], 687 | "execution_count": 0, 688 | "outputs": [ 689 | { 690 | "output_type": "stream", 691 | "text": [ 692 | "81.96872707526525\n" 693 | ], 694 | "name": "stdout" 695 | } 696 | ] 697 | } 698 | ] 699 | } -------------------------------------------------------------------------------- /code/Calculating_Stock_Metrics.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "kernelspec": { 6 | "display_name": "Python 3", 7 | "language": "python", 8 | "name": "python3" 9 | }, 10 | "language_info": { 11 | "codemirror_mode": { 12 | "name": "ipython", 13 | "version": 3 14 | }, 15 | "file_extension": ".py", 16 | "mimetype": "text/x-python", 17 | "name": "python", 18 | "nbconvert_exporter": "python", 19 | "pygments_lexer": "ipython3", 20 | "version": "3.7.5" 21 | }, 22 | "colab": { 23 | "name": "Calculating-Stock-Metrics.ipynb", 24 | "provenance": [], 25 | "include_colab_link": true 26 | } 27 | }, 28 | "cells": [ 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "id": "view-in-github", 33 | "colab_type": "text" 34 | }, 35 | "source": [ 36 | "\"Open" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "metadata": { 42 | "id": "pUVMRN-3IJU7", 43 | "colab_type": "code", 44 | "colab": {} 45 | }, 46 | "source": [ 47 | "import pandas as pd\n", 48 | "!pip install yfinance\n", 49 | "import yfinance as yf" 50 | ], 51 | "execution_count": 0, 52 | "outputs": [] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": { 57 | "id": "YbpgXGAJIJVE", 58 | "colab_type": "text" 59 | }, 60 | "source": [ 61 | "### 1.Load Data" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "metadata": { 67 | "id": "7uaPKUZHIJVH", 68 | "colab_type": "code", 69 | "colab": {} 70 | }, 71 | "source": [ 72 | "aapl = pd.read_csv('https://raw.githubusercontent.com/RyC37/Value-Investing-In-Python/master/data/AAPL%20Key%20Ratios.csv', skiprows=2, index_col='Unnamed: 0')" 73 | ], 74 | "execution_count": 0, 75 | "outputs": [] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "metadata": { 80 | "id": "V3GgVINrIJVM", 81 | "colab_type": "code", 82 | "colab": { 83 | "base_uri": "https://localhost:8080/", 84 | "height": 360 85 | }, 86 | "outputId": "84b8da44-ead2-492a-9e1e-54bce1a42fd5" 87 | }, 88 | "source": [ 89 | "aapl.head()" 90 | ], 91 | "execution_count": 12, 92 | "outputs": [ 93 | { 94 | "output_type": "execute_result", 95 | "data": { 96 | "text/html": [ 97 | "
\n", 98 | "\n", 111 | "\n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | "
2010-092011-092012-092013-092014-092015-092016-092017-092018-092019-09TTM
Revenue USD Mil65,225108,249156,508170,910182,795233,715215,639229,234265,595260,174260,174
Gross Margin %39.440.543.937.638.640.139.138.538.337.837.8
Operating Income USD Mil18,38533,79055,24148,99952,50371,23060,02461,34470,89863,93063,930
Operating Margin %28.231.235.328.728.730.527.826.826.724.624.6
Net Income USD Mil14,01325,92241,73337,03739,51053,39445,68748,35159,53155,25655,256
\n", 201 | "
" 202 | ], 203 | "text/plain": [ 204 | " 2010-09 2011-09 2012-09 ... 2018-09 2019-09 TTM\n", 205 | "Revenue USD Mil 65,225 108,249 156,508 ... 265,595 260,174 260,174\n", 206 | "Gross Margin % 39.4 40.5 43.9 ... 38.3 37.8 37.8\n", 207 | "Operating Income USD Mil 18,385 33,790 55,241 ... 70,898 63,930 63,930\n", 208 | "Operating Margin % 28.2 31.2 35.3 ... 26.7 24.6 24.6\n", 209 | "Net Income USD Mil 14,013 25,922 41,733 ... 59,531 55,256 55,256\n", 210 | "\n", 211 | "[5 rows x 11 columns]" 212 | ] 213 | }, 214 | "metadata": { 215 | "tags": [] 216 | }, 217 | "execution_count": 12 218 | } 219 | ] 220 | }, 221 | { 222 | "cell_type": "markdown", 223 | "metadata": { 224 | "id": "AYdrkRSRIJVT", 225 | "colab_type": "text" 226 | }, 227 | "source": [ 228 | "### 2.Read Metrics From Financial Data\n", 229 | "\n", 230 | "##### (1)Shares Outstanding" 231 | ] 232 | }, 233 | { 234 | "cell_type": "code", 235 | "metadata": { 236 | "id": "j_vFXw--IJVU", 237 | "colab_type": "code", 238 | "colab": { 239 | "base_uri": "https://localhost:8080/", 240 | "height": 34 241 | }, 242 | "outputId": "fc6f0543-f630-4026-d01e-aa40cdb0487b" 243 | }, 244 | "source": [ 245 | "# Read the latest data point\n", 246 | "aapl.loc['Shares Mil', '2019-09']" 247 | ], 248 | "execution_count": 13, 249 | "outputs": [ 250 | { 251 | "output_type": "execute_result", 252 | "data": { 253 | "text/plain": [ 254 | "'4,649'" 255 | ] 256 | }, 257 | "metadata": { 258 | "tags": [] 259 | }, 260 | "execution_count": 13 261 | } 262 | ] 263 | }, 264 | { 265 | "cell_type": "code", 266 | "metadata": { 267 | "id": "cEnOFDWVIJVa", 268 | "colab_type": "code", 269 | "colab": { 270 | "base_uri": "https://localhost:8080/", 271 | "height": 34 272 | }, 273 | "outputId": "2d0f567f-2cdb-4d13-f89d-3274afe6c5ef" 274 | }, 275 | "source": [ 276 | "# Convert to number, could also use int()\n", 277 | "float(aapl.loc['Shares Mil', '2019-09'].replace(',',''))" 278 | ], 279 | "execution_count": 14, 280 | "outputs": [ 281 | { 282 | "output_type": "execute_result", 283 | "data": { 284 | "text/plain": [ 285 | "4649.0" 286 | ] 287 | }, 288 | "metadata": { 289 | "tags": [] 290 | }, 291 | "execution_count": 14 292 | } 293 | ] 294 | }, 295 | { 296 | "cell_type": "code", 297 | "metadata": { 298 | "id": "W3kum0TuIJVh", 299 | "colab_type": "code", 300 | "colab": { 301 | "base_uri": "https://localhost:8080/", 302 | "height": 221 303 | }, 304 | "outputId": "bfec8eca-f699-4bbf-e5c1-40f531ff727e" 305 | }, 306 | "source": [ 307 | "# Read the historical data\n", 308 | "aapl.loc['Shares Mil', ]" 309 | ], 310 | "execution_count": 15, 311 | "outputs": [ 312 | { 313 | "output_type": "execute_result", 314 | "data": { 315 | "text/plain": [ 316 | "2010-09 6,473\n", 317 | "2011-09 6,557\n", 318 | "2012-09 6,617\n", 319 | "2013-09 6,522\n", 320 | "2014-09 6,123\n", 321 | "2015-09 5,793\n", 322 | "2016-09 5,500\n", 323 | "2017-09 5,252\n", 324 | "2018-09 5,000\n", 325 | "2019-09 4,649\n", 326 | "TTM 4,649\n", 327 | "Name: Shares Mil, dtype: object" 328 | ] 329 | }, 330 | "metadata": { 331 | "tags": [] 332 | }, 333 | "execution_count": 15 334 | } 335 | ] 336 | }, 337 | { 338 | "cell_type": "code", 339 | "metadata": { 340 | "id": "24xzTg-oIJVo", 341 | "colab_type": "code", 342 | "colab": { 343 | "base_uri": "https://localhost:8080/", 344 | "height": 221 345 | }, 346 | "outputId": "a50446d8-3aa5-4c79-9a0e-34481cd2e0bd" 347 | }, 348 | "source": [ 349 | "# Convert data type to float\n", 350 | "aapl.loc['Shares Mil', ].str.replace(',','').astype(float)" 351 | ], 352 | "execution_count": 16, 353 | "outputs": [ 354 | { 355 | "output_type": "execute_result", 356 | "data": { 357 | "text/plain": [ 358 | "2010-09 6473.0\n", 359 | "2011-09 6557.0\n", 360 | "2012-09 6617.0\n", 361 | "2013-09 6522.0\n", 362 | "2014-09 6123.0\n", 363 | "2015-09 5793.0\n", 364 | "2016-09 5500.0\n", 365 | "2017-09 5252.0\n", 366 | "2018-09 5000.0\n", 367 | "2019-09 4649.0\n", 368 | "TTM 4649.0\n", 369 | "Name: Shares Mil, dtype: float64" 370 | ] 371 | }, 372 | "metadata": { 373 | "tags": [] 374 | }, 375 | "execution_count": 16 376 | } 377 | ] 378 | }, 379 | { 380 | "cell_type": "markdown", 381 | "metadata": { 382 | "id": "UqttGWPBIJVv", 383 | "colab_type": "text" 384 | }, 385 | "source": [ 386 | "##### (2)EPS" 387 | ] 388 | }, 389 | { 390 | "cell_type": "code", 391 | "metadata": { 392 | "id": "sN3kc5ERIJVw", 393 | "colab_type": "code", 394 | "colab": { 395 | "base_uri": "https://localhost:8080/", 396 | "height": 34 397 | }, 398 | "outputId": "aab3de88-f291-41b3-a5d9-e701db0b3a65" 399 | }, 400 | "source": [ 401 | "float(aapl.loc['Earnings Per Share USD', '2019-09'])" 402 | ], 403 | "execution_count": 17, 404 | "outputs": [ 405 | { 406 | "output_type": "execute_result", 407 | "data": { 408 | "text/plain": [ 409 | "11.89" 410 | ] 411 | }, 412 | "metadata": { 413 | "tags": [] 414 | }, 415 | "execution_count": 17 416 | } 417 | ] 418 | }, 419 | { 420 | "cell_type": "code", 421 | "metadata": { 422 | "id": "dxPWUzEWIJVy", 423 | "colab_type": "code", 424 | "colab": { 425 | "base_uri": "https://localhost:8080/", 426 | "height": 221 427 | }, 428 | "outputId": "ae592d52-adf9-41a9-a422-3263b9916a69" 429 | }, 430 | "source": [ 431 | "aapl.loc['Earnings Per Share USD', ].astype(float)" 432 | ], 433 | "execution_count": 18, 434 | "outputs": [ 435 | { 436 | "output_type": "execute_result", 437 | "data": { 438 | "text/plain": [ 439 | "2010-09 2.16\n", 440 | "2011-09 3.95\n", 441 | "2012-09 6.31\n", 442 | "2013-09 5.68\n", 443 | "2014-09 6.45\n", 444 | "2015-09 9.22\n", 445 | "2016-09 8.31\n", 446 | "2017-09 9.21\n", 447 | "2018-09 11.91\n", 448 | "2019-09 11.89\n", 449 | "TTM 11.89\n", 450 | "Name: Earnings Per Share USD, dtype: float64" 451 | ] 452 | }, 453 | "metadata": { 454 | "tags": [] 455 | }, 456 | "execution_count": 18 457 | } 458 | ] 459 | }, 460 | { 461 | "cell_type": "markdown", 462 | "metadata": { 463 | "id": "OdZJbvJgIJV3", 464 | "colab_type": "text" 465 | }, 466 | "source": [ 467 | "##### (3)Dividend Rate" 468 | ] 469 | }, 470 | { 471 | "cell_type": "code", 472 | "metadata": { 473 | "id": "sLaNDRjJIJV4", 474 | "colab_type": "code", 475 | "colab": {} 476 | }, 477 | "source": [ 478 | "def search_value(index_name, date):\n", 479 | " '''This function return a specific stock metric of at a specific date\n", 480 | " from aapl dataframe\n", 481 | " '''\n", 482 | " return float(aapl.loc[index_name, date])" 483 | ], 484 | "execution_count": 0, 485 | "outputs": [] 486 | }, 487 | { 488 | "cell_type": "code", 489 | "metadata": { 490 | "id": "YGck0iJLIJV_", 491 | "colab_type": "code", 492 | "colab": { 493 | "base_uri": "https://localhost:8080/", 494 | "height": 34 495 | }, 496 | "outputId": "07980dfc-a1e0-464f-b44a-aac71e719f6c" 497 | }, 498 | "source": [ 499 | "search_value('Dividends USD', '2019-09')" 500 | ], 501 | "execution_count": 20, 502 | "outputs": [ 503 | { 504 | "output_type": "execute_result", 505 | "data": { 506 | "text/plain": [ 507 | "3.0" 508 | ] 509 | }, 510 | "metadata": { 511 | "tags": [] 512 | }, 513 | "execution_count": 20 514 | } 515 | ] 516 | }, 517 | { 518 | "cell_type": "code", 519 | "metadata": { 520 | "id": "sa0SIZO7IJWB", 521 | "colab_type": "code", 522 | "colab": {} 523 | }, 524 | "source": [ 525 | "def historical_value(index_name):\n", 526 | " return aapl.loc[index_name, ].astype(float)" 527 | ], 528 | "execution_count": 0, 529 | "outputs": [] 530 | }, 531 | { 532 | "cell_type": "code", 533 | "metadata": { 534 | "id": "lBuLI-XmIJWD", 535 | "colab_type": "code", 536 | "colab": { 537 | "base_uri": "https://localhost:8080/", 538 | "height": 221 539 | }, 540 | "outputId": "966f7c3f-11aa-46ae-f05e-83215b7e778e" 541 | }, 542 | "source": [ 543 | "historical_value('Dividends USD')" 544 | ], 545 | "execution_count": 22, 546 | "outputs": [ 547 | { 548 | "output_type": "execute_result", 549 | "data": { 550 | "text/plain": [ 551 | "2010-09 NaN\n", 552 | "2011-09 NaN\n", 553 | "2012-09 0.38\n", 554 | "2013-09 1.63\n", 555 | "2014-09 1.81\n", 556 | "2015-09 1.98\n", 557 | "2016-09 2.18\n", 558 | "2017-09 2.40\n", 559 | "2018-09 2.72\n", 560 | "2019-09 3.00\n", 561 | "TTM 3.00\n", 562 | "Name: Dividends USD, dtype: float64" 563 | ] 564 | }, 565 | "metadata": { 566 | "tags": [] 567 | }, 568 | "execution_count": 22 569 | } 570 | ] 571 | }, 572 | { 573 | "cell_type": "code", 574 | "metadata": { 575 | "id": "iggPHMMBIJWF", 576 | "colab_type": "code", 577 | "colab": {} 578 | }, 579 | "source": [ 580 | "# NaN manipulation will be introduced later" 581 | ], 582 | "execution_count": 0, 583 | "outputs": [] 584 | }, 585 | { 586 | "cell_type": "markdown", 587 | "metadata": { 588 | "id": "6IrS3Vk1IJWG", 589 | "colab_type": "text" 590 | }, 591 | "source": [ 592 | "##### (4)Dividend Yield" 593 | ] 594 | }, 595 | { 596 | "cell_type": "code", 597 | "metadata": { 598 | "id": "rBBJbfElIJWI", 599 | "colab_type": "code", 600 | "colab": { 601 | "base_uri": "https://localhost:8080/", 602 | "height": 34 603 | }, 604 | "outputId": "73402a6a-589a-4dca-92c8-2fafdb1900ec" 605 | }, 606 | "source": [ 607 | "search_value('Payout Ratio % *', '2019-09')" 608 | ], 609 | "execution_count": 24, 610 | "outputs": [ 611 | { 612 | "output_type": "execute_result", 613 | "data": { 614 | "text/plain": [ 615 | "25.1" 616 | ] 617 | }, 618 | "metadata": { 619 | "tags": [] 620 | }, 621 | "execution_count": 24 622 | } 623 | ] 624 | }, 625 | { 626 | "cell_type": "code", 627 | "metadata": { 628 | "id": "YPvaan_AIJWM", 629 | "colab_type": "code", 630 | "colab": { 631 | "base_uri": "https://localhost:8080/", 632 | "height": 221 633 | }, 634 | "outputId": "e148542b-31d0-4ae2-8cb8-4b5d98c62085" 635 | }, 636 | "source": [ 637 | "historical_value('Payout Ratio % *')" 638 | ], 639 | "execution_count": 25, 640 | "outputs": [ 641 | { 642 | "output_type": "execute_result", 643 | "data": { 644 | "text/plain": [ 645 | "2010-09 NaN\n", 646 | "2011-09 NaN\n", 647 | "2012-09 NaN\n", 648 | "2013-09 27.4\n", 649 | "2014-09 28.5\n", 650 | "2015-09 22.3\n", 651 | "2016-09 24.8\n", 652 | "2017-09 26.5\n", 653 | "2018-09 23.7\n", 654 | "2019-09 25.1\n", 655 | "TTM 25.2\n", 656 | "Name: Payout Ratio % *, dtype: float64" 657 | ] 658 | }, 659 | "metadata": { 660 | "tags": [] 661 | }, 662 | "execution_count": 25 663 | } 664 | ] 665 | }, 666 | { 667 | "cell_type": "markdown", 668 | "metadata": { 669 | "id": "t5MmSkvwIJWO", 670 | "colab_type": "text" 671 | }, 672 | "source": [ 673 | "##### (5)Debt/Equity Ratio" 674 | ] 675 | }, 676 | { 677 | "cell_type": "code", 678 | "metadata": { 679 | "id": "GsK8JpzXIJWO", 680 | "colab_type": "code", 681 | "colab": { 682 | "base_uri": "https://localhost:8080/", 683 | "height": 34 684 | }, 685 | "outputId": "d6effc84-92da-4a68-a0b2-6b0e459bde39" 686 | }, 687 | "source": [ 688 | "search_value('Debt/Equity', '2019-09')" 689 | ], 690 | "execution_count": 26, 691 | "outputs": [ 692 | { 693 | "output_type": "execute_result", 694 | "data": { 695 | "text/plain": [ 696 | "1.01" 697 | ] 698 | }, 699 | "metadata": { 700 | "tags": [] 701 | }, 702 | "execution_count": 26 703 | } 704 | ] 705 | }, 706 | { 707 | "cell_type": "code", 708 | "metadata": { 709 | "id": "arXQQOGVIJWQ", 710 | "colab_type": "code", 711 | "colab": { 712 | "base_uri": "https://localhost:8080/", 713 | "height": 221 714 | }, 715 | "outputId": "fc10a2b3-3a2e-44f2-f355-416dfd8798a0" 716 | }, 717 | "source": [ 718 | "historical_value('Debt/Equity')" 719 | ], 720 | "execution_count": 27, 721 | "outputs": [ 722 | { 723 | "output_type": "execute_result", 724 | "data": { 725 | "text/plain": [ 726 | "2010-09 NaN\n", 727 | "2011-09 NaN\n", 728 | "2012-09 NaN\n", 729 | "2013-09 0.14\n", 730 | "2014-09 0.26\n", 731 | "2015-09 0.45\n", 732 | "2016-09 0.59\n", 733 | "2017-09 0.73\n", 734 | "2018-09 0.87\n", 735 | "2019-09 1.01\n", 736 | "TTM 1.01\n", 737 | "Name: Debt/Equity, dtype: float64" 738 | ] 739 | }, 740 | "metadata": { 741 | "tags": [] 742 | }, 743 | "execution_count": 27 744 | } 745 | ] 746 | }, 747 | { 748 | "cell_type": "markdown", 749 | "metadata": { 750 | "id": "7KazUwjrIJWT", 751 | "colab_type": "text" 752 | }, 753 | "source": [ 754 | "##### (6)Book Value Per Share" 755 | ] 756 | }, 757 | { 758 | "cell_type": "code", 759 | "metadata": { 760 | "id": "h6RqEP8WIJWU", 761 | "colab_type": "code", 762 | "colab": { 763 | "base_uri": "https://localhost:8080/", 764 | "height": 34 765 | }, 766 | "outputId": "922c45d2-db1d-41a5-e603-c4c50f4c5162" 767 | }, 768 | "source": [ 769 | "search_value('Book Value Per Share * USD', '2019-09')" 770 | ], 771 | "execution_count": 28, 772 | "outputs": [ 773 | { 774 | "output_type": "execute_result", 775 | "data": { 776 | "text/plain": [ 777 | "21.71" 778 | ] 779 | }, 780 | "metadata": { 781 | "tags": [] 782 | }, 783 | "execution_count": 28 784 | } 785 | ] 786 | }, 787 | { 788 | "cell_type": "code", 789 | "metadata": { 790 | "id": "FYlRNB-gIJWW", 791 | "colab_type": "code", 792 | "colab": { 793 | "base_uri": "https://localhost:8080/", 794 | "height": 221 795 | }, 796 | "outputId": "d3851fff-ee4a-4c08-9852-8a402c156213" 797 | }, 798 | "source": [ 799 | "historical_value('Book Value Per Share * USD')" 800 | ], 801 | "execution_count": 29, 802 | "outputs": [ 803 | { 804 | "output_type": "execute_result", 805 | "data": { 806 | "text/plain": [ 807 | "2010-09 7.45\n", 808 | "2011-09 11.78\n", 809 | "2012-09 16.99\n", 810 | "2013-09 19.60\n", 811 | "2014-09 20.62\n", 812 | "2015-09 22.53\n", 813 | "2016-09 23.71\n", 814 | "2017-09 25.83\n", 815 | "2018-09 24.17\n", 816 | "2019-09 21.71\n", 817 | "TTM 20.64\n", 818 | "Name: Book Value Per Share * USD, dtype: float64" 819 | ] 820 | }, 821 | "metadata": { 822 | "tags": [] 823 | }, 824 | "execution_count": 29 825 | } 826 | ] 827 | }, 828 | { 829 | "cell_type": "markdown", 830 | "metadata": { 831 | "id": "JGDD-821IJWZ", 832 | "colab_type": "text" 833 | }, 834 | "source": [ 835 | "##### (7)ROE (Return on Equity)" 836 | ] 837 | }, 838 | { 839 | "cell_type": "code", 840 | "metadata": { 841 | "id": "a_5z0KgZIJWZ", 842 | "colab_type": "code", 843 | "colab": { 844 | "base_uri": "https://localhost:8080/", 845 | "height": 34 846 | }, 847 | "outputId": "db1ad314-2bad-479b-e5fa-82a71651c013" 848 | }, 849 | "source": [ 850 | "search_value('Return on Equity %', '2019-09')" 851 | ], 852 | "execution_count": 30, 853 | "outputs": [ 854 | { 855 | "output_type": "execute_result", 856 | "data": { 857 | "text/plain": [ 858 | "55.92" 859 | ] 860 | }, 861 | "metadata": { 862 | "tags": [] 863 | }, 864 | "execution_count": 30 865 | } 866 | ] 867 | }, 868 | { 869 | "cell_type": "code", 870 | "metadata": { 871 | "id": "RTYuiIBpIJWb", 872 | "colab_type": "code", 873 | "colab": { 874 | "base_uri": "https://localhost:8080/", 875 | "height": 221 876 | }, 877 | "outputId": "7e7c41f5-1365-4925-d933-81ebf2cd65b6" 878 | }, 879 | "source": [ 880 | "historical_value('Return on Equity %')" 881 | ], 882 | "execution_count": 31, 883 | "outputs": [ 884 | { 885 | "output_type": "execute_result", 886 | "data": { 887 | "text/plain": [ 888 | "2010-09 35.28\n", 889 | "2011-09 41.67\n", 890 | "2012-09 42.84\n", 891 | "2013-09 30.64\n", 892 | "2014-09 33.61\n", 893 | "2015-09 46.25\n", 894 | "2016-09 36.90\n", 895 | "2017-09 36.87\n", 896 | "2018-09 49.36\n", 897 | "2019-09 55.92\n", 898 | "TTM 55.92\n", 899 | "Name: Return on Equity %, dtype: float64" 900 | ] 901 | }, 902 | "metadata": { 903 | "tags": [] 904 | }, 905 | "execution_count": 31 906 | } 907 | ] 908 | }, 909 | { 910 | "cell_type": "markdown", 911 | "metadata": { 912 | "id": "okzk5BQrIJWd", 913 | "colab_type": "text" 914 | }, 915 | "source": [ 916 | "##### (8)Current Ratio" 917 | ] 918 | }, 919 | { 920 | "cell_type": "code", 921 | "metadata": { 922 | "id": "ynvMbpk0IJWd", 923 | "colab_type": "code", 924 | "colab": { 925 | "base_uri": "https://localhost:8080/", 926 | "height": 34 927 | }, 928 | "outputId": "6e6c5ef3-8105-4d5d-b25a-57d87d6e6c6a" 929 | }, 930 | "source": [ 931 | "search_value('Current Ratio', '2019-09')" 932 | ], 933 | "execution_count": 32, 934 | "outputs": [ 935 | { 936 | "output_type": "execute_result", 937 | "data": { 938 | "text/plain": [ 939 | "1.54" 940 | ] 941 | }, 942 | "metadata": { 943 | "tags": [] 944 | }, 945 | "execution_count": 32 946 | } 947 | ] 948 | }, 949 | { 950 | "cell_type": "code", 951 | "metadata": { 952 | "id": "m09tKRPqIJWf", 953 | "colab_type": "code", 954 | "colab": { 955 | "base_uri": "https://localhost:8080/", 956 | "height": 221 957 | }, 958 | "outputId": "78660853-ab7b-439f-c3a7-c812cfd922f6" 959 | }, 960 | "source": [ 961 | "historical_value('Current Ratio')" 962 | ], 963 | "execution_count": 33, 964 | "outputs": [ 965 | { 966 | "output_type": "execute_result", 967 | "data": { 968 | "text/plain": [ 969 | "2010-09 2.01\n", 970 | "2011-09 1.61\n", 971 | "2012-09 1.50\n", 972 | "2013-09 1.68\n", 973 | "2014-09 1.08\n", 974 | "2015-09 1.11\n", 975 | "2016-09 1.35\n", 976 | "2017-09 1.28\n", 977 | "2018-09 1.12\n", 978 | "2019-09 1.54\n", 979 | "TTM 1.54\n", 980 | "Name: Current Ratio, dtype: float64" 981 | ] 982 | }, 983 | "metadata": { 984 | "tags": [] 985 | }, 986 | "execution_count": 33 987 | } 988 | ] 989 | }, 990 | { 991 | "cell_type": "markdown", 992 | "metadata": { 993 | "id": "miWi8QhJIJWh", 994 | "colab_type": "text" 995 | }, 996 | "source": [ 997 | "### 3.Get Stock Price" 998 | ] 999 | }, 1000 | { 1001 | "cell_type": "code", 1002 | "metadata": { 1003 | "id": "ohiyR2huIJWh", 1004 | "colab_type": "code", 1005 | "colab": {} 1006 | }, 1007 | "source": [ 1008 | "apple = yf.Ticker('AAPL')" 1009 | ], 1010 | "execution_count": 0, 1011 | "outputs": [] 1012 | }, 1013 | { 1014 | "cell_type": "code", 1015 | "metadata": { 1016 | "id": "G2eWT2MCIJWi", 1017 | "colab_type": "code", 1018 | "colab": {} 1019 | }, 1020 | "source": [ 1021 | "apple_price = apple.history(period='max')" 1022 | ], 1023 | "execution_count": 0, 1024 | "outputs": [] 1025 | }, 1026 | { 1027 | "cell_type": "markdown", 1028 | "metadata": { 1029 | "id": "7P0lQIxeIJWj", 1030 | "colab_type": "text" 1031 | }, 1032 | "source": [ 1033 | "### 4.Calculate P/E & P/BV\n", 1034 | "\n", 1035 | "##### (1) Latest P/E" 1036 | ] 1037 | }, 1038 | { 1039 | "cell_type": "code", 1040 | "metadata": { 1041 | "id": "NO-ekSyoIJWk", 1042 | "colab_type": "code", 1043 | "colab": { 1044 | "base_uri": "https://localhost:8080/", 1045 | "height": 34 1046 | }, 1047 | "outputId": "c33fac86-41ba-4b20-fbf8-9038f6fdbdd8" 1048 | }, 1049 | "source": [ 1050 | "latest_price = apple_price.loc['2020-01-14','Close']\n", 1051 | "latest_eps = search_value('Earnings Per Share USD', '2019-09')\n", 1052 | "latest_PtoE = latest_price/latest_eps\n", 1053 | "print(latest_PtoE)" 1054 | ], 1055 | "execution_count": 36, 1056 | "outputs": [ 1057 | { 1058 | "output_type": "stream", 1059 | "text": [ 1060 | "26.297729184188395\n" 1061 | ], 1062 | "name": "stdout" 1063 | } 1064 | ] 1065 | }, 1066 | { 1067 | "cell_type": "markdown", 1068 | "metadata": { 1069 | "id": "3sYRzw9OIJWl", 1070 | "colab_type": "text" 1071 | }, 1072 | "source": [ 1073 | "##### (2) Latest P/BV" 1074 | ] 1075 | }, 1076 | { 1077 | "cell_type": "code", 1078 | "metadata": { 1079 | "id": "UlF_ATanIJWl", 1080 | "colab_type": "code", 1081 | "colab": { 1082 | "base_uri": "https://localhost:8080/", 1083 | "height": 34 1084 | }, 1085 | "outputId": "fa22cd43-dcee-47d8-ddf5-49c190d620c3" 1086 | }, 1087 | "source": [ 1088 | "latest_price = apple_price.loc['2020-01-14','Close']\n", 1089 | "latest_eps = search_value('Book Value Per Share * USD', '2019-09')\n", 1090 | "latest_PtoBV = latest_price/latest_eps\n", 1091 | "print(latest_PtoBV)" 1092 | ], 1093 | "execution_count": 37, 1094 | "outputs": [ 1095 | { 1096 | "output_type": "stream", 1097 | "text": [ 1098 | "14.402579456471672\n" 1099 | ], 1100 | "name": "stdout" 1101 | } 1102 | ] 1103 | }, 1104 | { 1105 | "cell_type": "markdown", 1106 | "metadata": { 1107 | "id": "cf9H7tWeIJWn", 1108 | "colab_type": "text" 1109 | }, 1110 | "source": [ 1111 | "### 5.Formatting\n", 1112 | "\n", 1113 | "##### (1) Traspose Dataframe\n", 1114 | "For the convenience of calculation, we want to transpose the dataframe. Such that the time would be rows and metrics would be columns." 1115 | ] 1116 | }, 1117 | { 1118 | "cell_type": "code", 1119 | "metadata": { 1120 | "id": "kRxRWL1ZIJWn", 1121 | "colab_type": "code", 1122 | "colab": {} 1123 | }, 1124 | "source": [ 1125 | "aapl = aapl.T" 1126 | ], 1127 | "execution_count": 0, 1128 | "outputs": [] 1129 | }, 1130 | { 1131 | "cell_type": "code", 1132 | "metadata": { 1133 | "id": "nV-mDFZ_IJWp", 1134 | "colab_type": "code", 1135 | "colab": { 1136 | "base_uri": "https://localhost:8080/", 1137 | "height": 423 1138 | }, 1139 | "outputId": "fcb75144-0c57-4858-d96c-c55ce0095dc8" 1140 | }, 1141 | "source": [ 1142 | "aapl.head()" 1143 | ], 1144 | "execution_count": 39, 1145 | "outputs": [ 1146 | { 1147 | "output_type": "execute_result", 1148 | "data": { 1149 | "text/html": [ 1150 | "
\n", 1151 | "\n", 1164 | "\n", 1165 | " \n", 1166 | " \n", 1167 | " \n", 1168 | " \n", 1169 | " \n", 1170 | " \n", 1171 | " \n", 1172 | " \n", 1173 | " \n", 1174 | " \n", 1175 | " \n", 1176 | " \n", 1177 | " \n", 1178 | " \n", 1179 | " \n", 1180 | " \n", 1181 | " \n", 1182 | " \n", 1183 | " \n", 1184 | " \n", 1185 | " \n", 1186 | " \n", 1187 | " \n", 1188 | " \n", 1189 | " \n", 1190 | " \n", 1191 | " \n", 1192 | " \n", 1193 | " \n", 1194 | " \n", 1195 | " \n", 1196 | " \n", 1197 | " \n", 1198 | " \n", 1199 | " \n", 1200 | " \n", 1201 | " \n", 1202 | " \n", 1203 | " \n", 1204 | " \n", 1205 | " \n", 1206 | " \n", 1207 | " \n", 1208 | " \n", 1209 | " \n", 1210 | " \n", 1211 | " \n", 1212 | " \n", 1213 | " \n", 1214 | " \n", 1215 | " \n", 1216 | " \n", 1217 | " \n", 1218 | " \n", 1219 | " \n", 1220 | " \n", 1221 | " \n", 1222 | " \n", 1223 | " \n", 1224 | " \n", 1225 | " \n", 1226 | " \n", 1227 | " \n", 1228 | " \n", 1229 | " \n", 1230 | " \n", 1231 | " \n", 1232 | " \n", 1233 | " \n", 1234 | " \n", 1235 | " \n", 1236 | " \n", 1237 | " \n", 1238 | " \n", 1239 | " \n", 1240 | " \n", 1241 | " \n", 1242 | " \n", 1243 | " \n", 1244 | " \n", 1245 | " \n", 1246 | " \n", 1247 | " \n", 1248 | " \n", 1249 | " \n", 1250 | " \n", 1251 | " \n", 1252 | " \n", 1253 | " \n", 1254 | " \n", 1255 | " \n", 1256 | " \n", 1257 | " \n", 1258 | " \n", 1259 | " \n", 1260 | " \n", 1261 | " \n", 1262 | " \n", 1263 | " \n", 1264 | " \n", 1265 | " \n", 1266 | " \n", 1267 | " \n", 1268 | " \n", 1269 | " \n", 1270 | " \n", 1271 | " \n", 1272 | " \n", 1273 | " \n", 1274 | " \n", 1275 | " \n", 1276 | " \n", 1277 | " \n", 1278 | " \n", 1279 | " \n", 1280 | " \n", 1281 | " \n", 1282 | " \n", 1283 | " \n", 1284 | " \n", 1285 | " \n", 1286 | " \n", 1287 | " \n", 1288 | " \n", 1289 | " \n", 1290 | " \n", 1291 | " \n", 1292 | " \n", 1293 | " \n", 1294 | " \n", 1295 | " \n", 1296 | " \n", 1297 | " \n", 1298 | " \n", 1299 | " \n", 1300 | " \n", 1301 | " \n", 1302 | " \n", 1303 | " \n", 1304 | " \n", 1305 | " \n", 1306 | " \n", 1307 | " \n", 1308 | " \n", 1309 | " \n", 1310 | " \n", 1311 | " \n", 1312 | " \n", 1313 | " \n", 1314 | " \n", 1315 | " \n", 1316 | " \n", 1317 | " \n", 1318 | " \n", 1319 | " \n", 1320 | " \n", 1321 | " \n", 1322 | " \n", 1323 | " \n", 1324 | " \n", 1325 | " \n", 1326 | " \n", 1327 | " \n", 1328 | " \n", 1329 | " \n", 1330 | " \n", 1331 | " \n", 1332 | " \n", 1333 | " \n", 1334 | " \n", 1335 | " \n", 1336 | " \n", 1337 | " \n", 1338 | " \n", 1339 | " \n", 1340 | " \n", 1341 | " \n", 1342 | " \n", 1343 | " \n", 1344 | " \n", 1345 | " \n", 1346 | " \n", 1347 | " \n", 1348 | " \n", 1349 | " \n", 1350 | " \n", 1351 | " \n", 1352 | " \n", 1353 | " \n", 1354 | " \n", 1355 | " \n", 1356 | " \n", 1357 | " \n", 1358 | " \n", 1359 | " \n", 1360 | " \n", 1361 | " \n", 1362 | " \n", 1363 | " \n", 1364 | " \n", 1365 | " \n", 1366 | " \n", 1367 | " \n", 1368 | " \n", 1369 | " \n", 1370 | " \n", 1371 | " \n", 1372 | " \n", 1373 | " \n", 1374 | " \n", 1375 | " \n", 1376 | " \n", 1377 | " \n", 1378 | " \n", 1379 | " \n", 1380 | " \n", 1381 | " \n", 1382 | " \n", 1383 | " \n", 1384 | " \n", 1385 | " \n", 1386 | " \n", 1387 | " \n", 1388 | " \n", 1389 | " \n", 1390 | " \n", 1391 | " \n", 1392 | " \n", 1393 | " \n", 1394 | " \n", 1395 | " \n", 1396 | " \n", 1397 | " \n", 1398 | " \n", 1399 | " \n", 1400 | " \n", 1401 | " \n", 1402 | " \n", 1403 | " \n", 1404 | " \n", 1405 | " \n", 1406 | " \n", 1407 | " \n", 1408 | " \n", 1409 | " \n", 1410 | " \n", 1411 | " \n", 1412 | " \n", 1413 | " \n", 1414 | " \n", 1415 | " \n", 1416 | " \n", 1417 | " \n", 1418 | " \n", 1419 | " \n", 1420 | " \n", 1421 | " \n", 1422 | " \n", 1423 | " \n", 1424 | " \n", 1425 | " \n", 1426 | " \n", 1427 | " \n", 1428 | " \n", 1429 | " \n", 1430 | " \n", 1431 | " \n", 1432 | " \n", 1433 | " \n", 1434 | " \n", 1435 | " \n", 1436 | " \n", 1437 | " \n", 1438 | " \n", 1439 | " \n", 1440 | " \n", 1441 | " \n", 1442 | " \n", 1443 | " \n", 1444 | " \n", 1445 | " \n", 1446 | " \n", 1447 | " \n", 1448 | " \n", 1449 | " \n", 1450 | " \n", 1451 | " \n", 1452 | " \n", 1453 | " \n", 1454 | " \n", 1455 | " \n", 1456 | " \n", 1457 | " \n", 1458 | " \n", 1459 | " \n", 1460 | " \n", 1461 | " \n", 1462 | " \n", 1463 | " \n", 1464 | " \n", 1465 | " \n", 1466 | " \n", 1467 | " \n", 1468 | " \n", 1469 | " \n", 1470 | " \n", 1471 | " \n", 1472 | " \n", 1473 | " \n", 1474 | " \n", 1475 | " \n", 1476 | " \n", 1477 | " \n", 1478 | " \n", 1479 | " \n", 1480 | " \n", 1481 | " \n", 1482 | " \n", 1483 | " \n", 1484 | " \n", 1485 | " \n", 1486 | " \n", 1487 | " \n", 1488 | " \n", 1489 | " \n", 1490 | " \n", 1491 | " \n", 1492 | " \n", 1493 | " \n", 1494 | " \n", 1495 | " \n", 1496 | " \n", 1497 | " \n", 1498 | " \n", 1499 | " \n", 1500 | " \n", 1501 | " \n", 1502 | " \n", 1503 | " \n", 1504 | " \n", 1505 | " \n", 1506 | " \n", 1507 | " \n", 1508 | " \n", 1509 | " \n", 1510 | " \n", 1511 | " \n", 1512 | " \n", 1513 | " \n", 1514 | " \n", 1515 | " \n", 1516 | " \n", 1517 | " \n", 1518 | " \n", 1519 | " \n", 1520 | " \n", 1521 | " \n", 1522 | " \n", 1523 | " \n", 1524 | " \n", 1525 | " \n", 1526 | " \n", 1527 | " \n", 1528 | " \n", 1529 | " \n", 1530 | " \n", 1531 | " \n", 1532 | " \n", 1533 | " \n", 1534 | " \n", 1535 | " \n", 1536 | " \n", 1537 | " \n", 1538 | " \n", 1539 | " \n", 1540 | " \n", 1541 | " \n", 1542 | " \n", 1543 | " \n", 1544 | " \n", 1545 | " \n", 1546 | " \n", 1547 | " \n", 1548 | " \n", 1549 | " \n", 1550 | " \n", 1551 | " \n", 1552 | " \n", 1553 | " \n", 1554 | " \n", 1555 | " \n", 1556 | " \n", 1557 | " \n", 1558 | " \n", 1559 | " \n", 1560 | " \n", 1561 | " \n", 1562 | " \n", 1563 | " \n", 1564 | " \n", 1565 | " \n", 1566 | " \n", 1567 | " \n", 1568 | " \n", 1569 | " \n", 1570 | " \n", 1571 | " \n", 1572 | " \n", 1573 | " \n", 1574 | " \n", 1575 | " \n", 1576 | " \n", 1577 | " \n", 1578 | " \n", 1579 | " \n", 1580 | " \n", 1581 | " \n", 1582 | " \n", 1583 | " \n", 1584 | " \n", 1585 | " \n", 1586 | " \n", 1587 | " \n", 1588 | " \n", 1589 | " \n", 1590 | " \n", 1591 | " \n", 1592 | " \n", 1593 | " \n", 1594 | " \n", 1595 | " \n", 1596 | " \n", 1597 | " \n", 1598 | " \n", 1599 | " \n", 1600 | " \n", 1601 | " \n", 1602 | " \n", 1603 | " \n", 1604 | " \n", 1605 | " \n", 1606 | " \n", 1607 | " \n", 1608 | " \n", 1609 | " \n", 1610 | " \n", 1611 | " \n", 1612 | " \n", 1613 | " \n", 1614 | " \n", 1615 | " \n", 1616 | " \n", 1617 | " \n", 1618 | " \n", 1619 | " \n", 1620 | " \n", 1621 | " \n", 1622 | " \n", 1623 | " \n", 1624 | " \n", 1625 | " \n", 1626 | " \n", 1627 | " \n", 1628 | " \n", 1629 | " \n", 1630 | " \n", 1631 | " \n", 1632 | " \n", 1633 | " \n", 1634 | " \n", 1635 | " \n", 1636 | " \n", 1637 | " \n", 1638 | " \n", 1639 | " \n", 1640 | " \n", 1641 | " \n", 1642 | " \n", 1643 | " \n", 1644 | " \n", 1645 | " \n", 1646 | " \n", 1647 | " \n", 1648 | " \n", 1649 | " \n", 1650 | " \n", 1651 | " \n", 1652 | " \n", 1653 | " \n", 1654 | " \n", 1655 | " \n", 1656 | " \n", 1657 | " \n", 1658 | " \n", 1659 | " \n", 1660 | " \n", 1661 | " \n", 1662 | " \n", 1663 | " \n", 1664 | " \n", 1665 | " \n", 1666 | " \n", 1667 | " \n", 1668 | " \n", 1669 | " \n", 1670 | " \n", 1671 | " \n", 1672 | " \n", 1673 | "
Revenue USD MilGross Margin %Operating Income USD MilOperating Margin %Net Income USD MilEarnings Per Share USDDividends USDPayout Ratio % *Shares MilBook Value Per Share * USDOperating Cash Flow USD MilCap Spending USD MilFree Cash Flow USD MilFree Cash Flow Per Share * USDWorking Capital USD MilKey Ratios -> ProfitabilityMargins % of SalesRevenueCOGSGross MarginSG&AR&DOtherOperating MarginNet Int Inc & OtherEBT MarginProfitabilityTax Rate %Net Margin %Asset Turnover (Average)Return on Assets %Financial Leverage (Average)Return on Equity %Return on Invested Capital %Interest CoverageKey Ratios -> GrowthNaNRevenue %Year over Year3-Year Average...Cap Ex as a % of SalesFree Cash Flow/Sales %Free Cash Flow/Net IncomeKey Ratios -> Financial HealthBalance Sheet Items (in %)Cash & Short-Term InvestmentsAccounts ReceivableInventoryOther Current AssetsTotal Current AssetsNet PP&EIntangiblesOther Long-Term AssetsTotal AssetsAccounts PayableShort-Term DebtTaxes PayableAccrued LiabilitiesOther Short-Term LiabilitiesTotal Current LiabilitiesLong-Term DebtOther Long-Term LiabilitiesTotal LiabilitiesTotal Stockholders' EquityTotal Liabilities & EquityLiquidity/Financial HealthCurrent RatioQuick RatioFinancial LeverageDebt/EquityKey Ratios -> Efficiency RatiosEfficiencyDays Sales OutstandingDays InventoryPayables PeriodCash Conversion CycleReceivables TurnoverInventory TurnoverFixed Assets TurnoverAsset Turnover
2010-0965,22539.418,38528.214,0132.16NaNNaN6,4737.4518,595-2,12116,4742.5420,956NaN2010-09100.0060.6239.388.462.73NaN28.190.2428.422010-0924.4221.481.0622.841.5735.2834.77NaNNaN2010-09NaN52.0239.54...3.2525.261.18NaN2010-0934.0813.201.406.7655.446.341.4436.78100.0015.98NaN0.285.875.4327.56NaN8.8736.4363.57100.002010-092.011.721.57NaNNaN2010-0924.826.9581.30-49.5314.7152.5116.891.06
2011-09108,24940.533,79031.225,9223.95NaNNaN6,55711.7837,529-7,45230,0774.5917,018NaN2011-09100.0059.5240.487.022.24NaN31.220.3831.602011-0924.2223.951.1327.071.5241.6741.13NaNNaN2011-09NaN65.9649.37...6.8827.791.16NaN2011-0922.3010.070.675.6238.666.683.8150.85100.0012.57NaN0.986.464.0224.04NaN10.1334.1665.84100.002011-091.611.351.52NaNNaN2011-0918.345.1775.48-51.9619.9070.5317.261.13
2012-09156,50843.955,24135.341,7336.310.38NaN6,61716.9950,856-9,40241,4546.3119,111NaN2012-09100.0056.1343.876.422.16NaN35.300.3335.632012-0925.1626.671.0728.541.4942.8442.01NaNNaN2012-09NaN44.5853.94...6.0126.490.99NaN2012-0916.5410.620.455.1432.758.783.0455.43100.0012.03NaN0.871.457.5421.89NaN10.9732.8667.14100.002012-091.501.241.49NaNNaN2012-0919.013.2674.38-52.1319.20112.1213.481.07
2013-09170,91037.648,99928.737,0375.681.6327.46,52219.6053,666-9,07644,5906.4629,628NaN2013-09100.0062.3837.626.342.62NaN28.670.6829.352013-0926.1521.670.8919.341.6830.6426.08369.79NaN2013-09NaN9.2037.86...5.3126.091.20NaN2013-0919.599.970.854.9935.408.022.7853.80100.0010.81NaN0.582.067.6521.098.1911.0340.3159.69100.002013-091.681.401.680.14NaN2013-0925.664.3774.54-44.5014.2283.4510.670.89
2014-09182,79538.652,50328.739,5106.451.8128.56,12320.6259,713-9,81349,9007.735,083NaN2014-09100.0061.4138.596.563.30NaN28.720.5429.262014-0926.1321.610.8318.012.0833.6126.20140.28NaN2014-09NaN6.9519.08...5.3727.301.26NaN2014-0910.8211.740.916.0929.568.903.7857.77100.0013.022.720.522.808.3127.3712.5012.0251.8948.11100.002014-091.080.822.080.26NaN2014-0930.516.3085.45-48.6411.9657.949.820.83
\n", 1674 | "

5 rows × 101 columns

\n", 1675 | "
" 1676 | ], 1677 | "text/plain": [ 1678 | " Revenue USD Mil Gross Margin % ... Fixed Assets Turnover Asset Turnover\n", 1679 | "2010-09 65,225 39.4 ... 16.89 1.06\n", 1680 | "2011-09 108,249 40.5 ... 17.26 1.13\n", 1681 | "2012-09 156,508 43.9 ... 13.48 1.07\n", 1682 | "2013-09 170,910 37.6 ... 10.67 0.89\n", 1683 | "2014-09 182,795 38.6 ... 9.82 0.83\n", 1684 | "\n", 1685 | "[5 rows x 101 columns]" 1686 | ] 1687 | }, 1688 | "metadata": { 1689 | "tags": [] 1690 | }, 1691 | "execution_count": 39 1692 | } 1693 | ] 1694 | }, 1695 | { 1696 | "cell_type": "markdown", 1697 | "metadata": { 1698 | "id": "Vkp6AyXAIJWr", 1699 | "colab_type": "text" 1700 | }, 1701 | "source": [ 1702 | "##### (2) Extract metrics we need\n", 1703 | "The financial data contains a lot of metrics, we are not going to use most of them. So, let's create a smaller dataframe with whatever metrics we will use." 1704 | ] 1705 | }, 1706 | { 1707 | "cell_type": "code", 1708 | "metadata": { 1709 | "id": "l9qYfm3KIJWr", 1710 | "colab_type": "code", 1711 | "colab": { 1712 | "base_uri": "https://localhost:8080/", 1713 | "height": 357 1714 | }, 1715 | "outputId": "d61526f0-f7d3-4615-e5af-7e2ee9d2f8be" 1716 | }, 1717 | "source": [ 1718 | "col_names = ['Shares Mil','Earnings Per Share USD','Dividends USD',\n", 1719 | " 'Payout Ratio % *', 'Debt/Equity', 'Book Value Per Share * USD',\n", 1720 | " 'Return on Equity %', 'Current Ratio']\n", 1721 | "aapl_df = aapl[col_names]\n", 1722 | "aapl_df.head()" 1723 | ], 1724 | "execution_count": 40, 1725 | "outputs": [ 1726 | { 1727 | "output_type": "execute_result", 1728 | "data": { 1729 | "text/html": [ 1730 | "
\n", 1731 | "\n", 1744 | "\n", 1745 | " \n", 1746 | " \n", 1747 | " \n", 1748 | " \n", 1749 | " \n", 1750 | " \n", 1751 | " \n", 1752 | " \n", 1753 | " \n", 1754 | " \n", 1755 | " \n", 1756 | " \n", 1757 | " \n", 1758 | " \n", 1759 | " \n", 1760 | " \n", 1761 | " \n", 1762 | " \n", 1763 | " \n", 1764 | " \n", 1765 | " \n", 1766 | " \n", 1767 | " \n", 1768 | " \n", 1769 | " \n", 1770 | " \n", 1771 | " \n", 1772 | " \n", 1773 | " \n", 1774 | " \n", 1775 | " \n", 1776 | " \n", 1777 | " \n", 1778 | " \n", 1779 | " \n", 1780 | " \n", 1781 | " \n", 1782 | " \n", 1783 | " \n", 1784 | " \n", 1785 | " \n", 1786 | " \n", 1787 | " \n", 1788 | " \n", 1789 | " \n", 1790 | " \n", 1791 | " \n", 1792 | " \n", 1793 | " \n", 1794 | " \n", 1795 | " \n", 1796 | " \n", 1797 | " \n", 1798 | " \n", 1799 | " \n", 1800 | " \n", 1801 | " \n", 1802 | " \n", 1803 | " \n", 1804 | " \n", 1805 | " \n", 1806 | " \n", 1807 | " \n", 1808 | " \n", 1809 | " \n", 1810 | " \n", 1811 | " \n", 1812 | " \n", 1813 | " \n", 1814 | " \n", 1815 | "
Shares MilEarnings Per Share USDDividends USDPayout Ratio % *Debt/EquityBook Value Per Share * USDReturn on Equity %Current Ratio
2010-096,4732.16NaNNaNNaN7.4535.282.01
2011-096,5573.95NaNNaNNaN11.7841.671.61
2012-096,6176.310.38NaNNaN16.9942.841.50
2013-096,5225.681.6327.40.1419.6030.641.68
2014-096,1236.451.8128.50.2620.6233.611.08
\n", 1816 | "
" 1817 | ], 1818 | "text/plain": [ 1819 | " Shares Mil Earnings Per Share USD ... Return on Equity % Current Ratio\n", 1820 | "2010-09 6,473 2.16 ... 35.28 2.01\n", 1821 | "2011-09 6,557 3.95 ... 41.67 1.61\n", 1822 | "2012-09 6,617 6.31 ... 42.84 1.50\n", 1823 | "2013-09 6,522 5.68 ... 30.64 1.68\n", 1824 | "2014-09 6,123 6.45 ... 33.61 1.08\n", 1825 | "\n", 1826 | "[5 rows x 8 columns]" 1827 | ] 1828 | }, 1829 | "metadata": { 1830 | "tags": [] 1831 | }, 1832 | "execution_count": 40 1833 | } 1834 | ] 1835 | }, 1836 | { 1837 | "cell_type": "markdown", 1838 | "metadata": { 1839 | "id": "Y5Tc4CImIJWt", 1840 | "colab_type": "text" 1841 | }, 1842 | "source": [ 1843 | "Now we have a concise dataframe `aapl_df`, which is easier to use. But the awkward name of columns still puzzles me. Let's get rid of special symbols and unify the name style by renaming them.\n", 1844 | "\n", 1845 | "##### (3) Rename Columns" 1846 | ] 1847 | }, 1848 | { 1849 | "cell_type": "code", 1850 | "metadata": { 1851 | "id": "vOY7_ZngIJWt", 1852 | "colab_type": "code", 1853 | "colab": { 1854 | "base_uri": "https://localhost:8080/", 1855 | "height": 309 1856 | }, 1857 | "outputId": "067904c5-2cd1-4ee9-b1af-c3759937e5b1" 1858 | }, 1859 | "source": [ 1860 | "new_col = ['shares_outstanding', 'earning_per_share', 'dividend_rate', \n", 1861 | " 'dividend_yield', 'debt_to_equity', 'book_value_per_share',\n", 1862 | " 'return_on_equity', 'current_ratio']\n", 1863 | "aapl_df.columns = new_col\n", 1864 | "aapl_df.head()" 1865 | ], 1866 | "execution_count": 41, 1867 | "outputs": [ 1868 | { 1869 | "output_type": "execute_result", 1870 | "data": { 1871 | "text/html": [ 1872 | "
\n", 1873 | "\n", 1886 | "\n", 1887 | " \n", 1888 | " \n", 1889 | " \n", 1890 | " \n", 1891 | " \n", 1892 | " \n", 1893 | " \n", 1894 | " \n", 1895 | " \n", 1896 | " \n", 1897 | " \n", 1898 | " \n", 1899 | " \n", 1900 | " \n", 1901 | " \n", 1902 | " \n", 1903 | " \n", 1904 | " \n", 1905 | " \n", 1906 | " \n", 1907 | " \n", 1908 | " \n", 1909 | " \n", 1910 | " \n", 1911 | " \n", 1912 | " \n", 1913 | " \n", 1914 | " \n", 1915 | " \n", 1916 | " \n", 1917 | " \n", 1918 | " \n", 1919 | " \n", 1920 | " \n", 1921 | " \n", 1922 | " \n", 1923 | " \n", 1924 | " \n", 1925 | " \n", 1926 | " \n", 1927 | " \n", 1928 | " \n", 1929 | " \n", 1930 | " \n", 1931 | " \n", 1932 | " \n", 1933 | " \n", 1934 | " \n", 1935 | " \n", 1936 | " \n", 1937 | " \n", 1938 | " \n", 1939 | " \n", 1940 | " \n", 1941 | " \n", 1942 | " \n", 1943 | " \n", 1944 | " \n", 1945 | " \n", 1946 | " \n", 1947 | " \n", 1948 | " \n", 1949 | " \n", 1950 | " \n", 1951 | " \n", 1952 | " \n", 1953 | " \n", 1954 | " \n", 1955 | " \n", 1956 | " \n", 1957 | "
shares_outstandingearning_per_sharedividend_ratedividend_yielddebt_to_equitybook_value_per_sharereturn_on_equitycurrent_ratio
2010-096,4732.16NaNNaNNaN7.4535.282.01
2011-096,5573.95NaNNaNNaN11.7841.671.61
2012-096,6176.310.38NaNNaN16.9942.841.50
2013-096,5225.681.6327.40.1419.6030.641.68
2014-096,1236.451.8128.50.2620.6233.611.08
\n", 1958 | "
" 1959 | ], 1960 | "text/plain": [ 1961 | " shares_outstanding earning_per_share ... return_on_equity current_ratio\n", 1962 | "2010-09 6,473 2.16 ... 35.28 2.01\n", 1963 | "2011-09 6,557 3.95 ... 41.67 1.61\n", 1964 | "2012-09 6,617 6.31 ... 42.84 1.50\n", 1965 | "2013-09 6,522 5.68 ... 30.64 1.68\n", 1966 | "2014-09 6,123 6.45 ... 33.61 1.08\n", 1967 | "\n", 1968 | "[5 rows x 8 columns]" 1969 | ] 1970 | }, 1971 | "metadata": { 1972 | "tags": [] 1973 | }, 1974 | "execution_count": 41 1975 | } 1976 | ] 1977 | }, 1978 | { 1979 | "cell_type": "markdown", 1980 | "metadata": { 1981 | "id": "XsMSAdIdIJWv", 1982 | "colab_type": "text" 1983 | }, 1984 | "source": [ 1985 | "Now the dataframe looks great! Attention, do not get the order of new column (`new_col`) names wrong. It should be in exactly the same order as current column." 1986 | ] 1987 | } 1988 | ] 1989 | } -------------------------------------------------------------------------------- /data/AAPL Key Ratios.csv: -------------------------------------------------------------------------------- 1 | Growth Profitability and Financial Ratios for Apple Inc 2 | Financials 3 | ,2010-09,2011-09,2012-09,2013-09,2014-09,2015-09,2016-09,2017-09,2018-09,2019-09,TTM 4 | Revenue USD Mil,"65,225","108,249","156,508","170,910","182,795","233,715","215,639","229,234","265,595","260,174","260,174" 5 | Gross Margin %,39.4,40.5,43.9,37.6,38.6,40.1,39.1,38.5,38.3,37.8,37.8 6 | Operating Income USD Mil,"18,385","33,790","55,241","48,999","52,503","71,230","60,024","61,344","70,898","63,930","63,930" 7 | Operating Margin %,28.2,31.2,35.3,28.7,28.7,30.5,27.8,26.8,26.7,24.6,24.6 8 | Net Income USD Mil,"14,013","25,922","41,733","37,037","39,510","53,394","45,687","48,351","59,531","55,256","55,256" 9 | Earnings Per Share USD,2.16,3.95,6.31,5.68,6.45,9.22,8.31,9.21,11.91,11.89,11.89 10 | Dividends USD,,,0.38,1.63,1.81,1.98,2.18,2.40,2.72,3.00,3.00 11 | Payout Ratio % *,,,,27.4,28.5,22.3,24.8,26.5,23.7,25.1,25.2 12 | Shares Mil,"6,473","6,557","6,617","6,522","6,123","5,793","5,500","5,252","5,000","4,649","4,649" 13 | Book Value Per Share * USD,7.45,11.78,16.99,19.60,20.62,22.53,23.71,25.83,24.17,21.71,20.64 14 | Operating Cash Flow USD Mil,"18,595","37,529","50,856","53,666","59,713","81,266","65,824","63,598","77,434","69,391","69,391" 15 | Cap Spending USD Mil,"-2,121","-7,452","-9,402","-9,076","-9,813","-11,488","-13,548","-12,795","-13,313","-10,495","-10,495" 16 | Free Cash Flow USD Mil,"16,474","30,077","41,454","44,590","49,900","69,778","52,276","50,803","64,121","58,896","58,896" 17 | Free Cash Flow Per Share * USD,2.54,4.59,6.31,6.46,7.73,11.82,8.97,9.66,11.52,12.31, 18 | Working Capital USD Mil,"20,956","17,018","19,111","29,628","5,083","8,768","27,863","27,831","14,473","57,101", 19 | 20 | Key Ratios -> Profitability 21 | Margins % of Sales,2010-09,2011-09,2012-09,2013-09,2014-09,2015-09,2016-09,2017-09,2018-09,2019-09,TTM 22 | Revenue,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00 23 | COGS,60.62,59.52,56.13,62.38,61.41,59.94,60.92,61.53,61.66,62.18,62.18 24 | Gross Margin,39.38,40.48,43.87,37.62,38.59,40.06,39.08,38.47,38.34,37.82,37.82 25 | SG&A,8.46,7.02,6.42,6.34,6.56,6.13,6.58,6.66,6.29,7.01,7.01 26 | R&D,2.73,2.24,2.16,2.62,3.30,3.45,4.66,5.05,5.36,6.23,6.23 27 | Other,,,,,,,,,,, 28 | Operating Margin,28.19,31.22,35.30,28.67,28.72,30.48,27.84,26.76,26.69,24.57,24.57 29 | Net Int Inc & Other,0.24,0.38,0.33,0.68,0.54,0.55,0.63,1.20,0.75,0.69,0.69 30 | EBT Margin,28.42,31.60,35.63,29.35,29.26,31.03,28.46,27.96,27.45,25.27,25.27 31 | 32 | Profitability,2010-09,2011-09,2012-09,2013-09,2014-09,2015-09,2016-09,2017-09,2018-09,2019-09,TTM 33 | Tax Rate %,24.42,24.22,25.16,26.15,26.13,26.37,25.56,24.56,18.34,15.94,15.94 34 | Net Margin %,21.48,23.95,26.67,21.67,21.61,22.85,21.19,21.09,22.41,21.24,21.24 35 | Asset Turnover (Average),1.06,1.13,1.07,0.89,0.83,0.89,0.70,0.66,0.72,0.74,0.74 36 | Return on Assets %,22.84,27.07,28.54,19.34,18.01,20.45,14.93,13.87,16.07,15.69,15.69 37 | Financial Leverage (Average),1.57,1.52,1.49,1.68,2.08,2.43,2.51,2.80,3.41,3.74,3.74 38 | Return on Equity %,35.28,41.67,42.84,30.64,33.61,46.25,36.90,36.87,49.36,55.92,55.92 39 | Return on Invested Capital %,34.77,41.13,42.01,26.08,26.20,31.32,21.95,19.86,24.41,25.75,25.75 40 | Interest Coverage,,,,369.79,140.28,99.93,43.15,28.59,23.50,19.38,19.38 41 | 42 | Key Ratios -> Growth 43 | ,2010-09,2011-09,2012-09,2013-09,2014-09,2015-09,2016-09,2017-09,2018-09,2019-09,Latest Qtr 44 | Revenue % 45 | Year over Year,52.02,65.96,44.58,9.20,6.95,27.86,-7.73,6.30,15.86,-2.04,1.81 46 | 3-Year Average,39.54,49.37,53.94,37.86,19.08,14.30,8.06,7.84,4.35,6.46, 47 | 5-Year Average,36.17,41.16,45.49,39.39,33.63,29.08,14.78,7.93,9.22,7.31, 48 | 10-Year Average,23.37,35.05,39.17,39.31,36.27,32.58,27.29,25.31,23.38,19.75, 49 | Operating Income % 50 | Year over Year,56.60,83.79,63.48,-11.30,7.15,35.67,-15.73,2.20,15.57,-9.83,-3.06 51 | 3-Year Average,60.96,75.28,67.57,38.65,15.82,8.84,7.00,5.32,-0.16,2.12, 52 | 5-Year Average,61.96,68.97,65.80,50.84,34.93,31.11,12.18,2.12,7.67,4.02, 53 | 10-Year Average,42.78,,102.35,113.41,65.10,45.72,37.68,30.12,27.44,18.47, 54 | Net Income % 55 | Year over Year,70.16,84.99,60.99,-11.25,6.68,35.14,-14.43,5.83,23.12,-7.18, 56 | 3-Year Average,58.85,75.03,71.77,38.26,15.08,8.56,7.25,6.96,3.69,6.54, 57 | 5-Year Average,60.03,67.11,64.20,50.27,36.84,30.67,12.00,2.99,9.96,6.94, 58 | 10-Year Average,33.39,,90.88,87.49,64.28,44.61,36.81,30.04,28.54,20.97, 59 | EPS % 60 | Year over Year,66.85,82.71,59.50,-9.97,13.58,42.95,-9.87,10.83,29.32,-0.17,4.12 61 | 3-Year Average,56.80,72.85,69.41,37.92,17.71,13.49,13.53,12.61,8.91,12.68, 62 | 5-Year Average,57.56,64.90,62.22,49.29,37.82,33.62,16.01,7.87,15.97,13.01, 63 | 10-Year Average,30.11,,85.81,82.88,62.35,45.10,38.31,32.28,31.58,24.80, 64 | 65 | Key Ratios -> Cash Flow 66 | Cash Flow Ratios,2010-09,2011-09,2012-09,2013-09,2014-09,2015-09,2016-09,2017-09,2018-09,2019-09,TTM 67 | Operating Cash Flow Growth % YOY,83.04,101.82,35.51,5.53,11.27,36.09,-19.00,-3.38,21.76,-10.39, 68 | Free Cash Flow Growth % YOY,84.15,82.57,37.83,7.57,11.91,39.84,-25.08,-2.82,26.22,-8.15, 69 | Cap Ex as a % of Sales,3.25,6.88,6.01,5.31,5.37,4.92,6.28,5.58,5.01,4.03,4.03 70 | Free Cash Flow/Sales %,25.26,27.79,26.49,26.09,27.30,29.86,24.24,22.16,24.14,22.64,22.64 71 | Free Cash Flow/Net Income,1.18,1.16,0.99,1.20,1.26,1.31,1.14,1.05,1.08,1.07,1.07 72 | 73 | Key Ratios -> Financial Health 74 | Balance Sheet Items (in %),2010-09,2011-09,2012-09,2013-09,2014-09,2015-09,2016-09,2017-09,2018-09,2019-09,Latest Qtr 75 | Cash & Short-Term Investments,34.08,22.30,16.54,19.59,10.82,14.32,20.88,19.76,18.13,29.71,29.71 76 | Accounts Receivable,13.20,10.07,10.62,9.97,11.74,10.45,9.11,9.50,13.40,13.53,13.53 77 | Inventory,1.40,0.67,0.45,0.85,0.91,0.81,0.66,1.29,1.08,1.21,1.21 78 | Other Current Assets,6.76,5.62,5.14,4.99,6.09,5.19,2.57,3.71,3.30,3.65,3.65 79 | Total Current Assets,55.44,38.66,32.75,35.40,29.56,30.77,33.22,34.28,35.91,48.10,48.10 80 | Net PP&E,6.34,6.68,8.78,8.02,8.90,7.74,8.40,9.00,11.29,11.04,11.04 81 | Intangibles,1.44,3.81,3.04,2.78,3.78,3.10,2.68,2.14,,, 82 | Other Long-Term Assets,36.78,50.85,55.43,53.80,57.77,58.39,55.70,54.59,52.79,40.86,40.86 83 | Total Assets,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00 84 | Accounts Payable,15.98,12.57,12.03,10.81,13.02,12.22,11.59,13.07,15.28,13.66,13.66 85 | Short-Term Debt,,,,,2.72,3.79,3.61,4.92,5.67,4.80,4.80 86 | Taxes Payable,0.28,0.98,0.87,0.58,0.52,,,,,, 87 | Accrued Liabilities,5.87,6.46,1.45,2.06,2.80,8.67,6.85,6.86,,, 88 | Other Short-Term Liabilities,5.43,4.02,7.54,7.65,8.31,3.08,2.51,2.01,11.00,12.77,12.77 89 | Total Current Liabilities,27.56,24.04,21.89,21.09,27.37,27.75,24.56,26.86,31.95,31.23,31.23 90 | Long-Term Debt,,,,8.19,12.50,18.41,23.45,25.90,25.63,27.12,27.12 91 | Other Long-Term Liabilities,8.87,10.13,10.97,11.03,12.02,12.76,12.12,11.52,13.12,14.92,14.92 92 | Total Liabilities,36.43,34.16,32.86,40.31,51.89,58.91,60.13,64.28,70.70,73.27,73.27 93 | Total Stockholders' Equity,63.57,65.84,67.14,59.69,48.11,41.09,39.87,35.72,29.30,26.73,26.73 94 | Total Liabilities & Equity,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00 95 | 96 | Liquidity/Financial Health,2010-09,2011-09,2012-09,2013-09,2014-09,2015-09,2016-09,2017-09,2018-09,2019-09,Latest Qtr 97 | Current Ratio,2.01,1.61,1.50,1.68,1.08,1.11,1.35,1.28,1.12,1.54,1.54 98 | Quick Ratio,1.72,1.35,1.24,1.40,0.82,0.89,1.22,1.09,0.99,1.38,1.38 99 | Financial Leverage,1.57,1.52,1.49,1.68,2.08,2.43,2.51,2.80,3.41,3.74,3.74 100 | Debt/Equity,,,,0.14,0.26,0.45,0.59,0.73,0.87,1.01,1.01 101 | 102 | Key Ratios -> Efficiency Ratios 103 | Efficiency,2010-09,2011-09,2012-09,2013-09,2014-09,2015-09,2016-09,2017-09,2018-09,2019-09,TTM 104 | Days Sales Outstanding,24.82,18.34,19.01,25.66,30.51,26.79,27.59,26.77,28.21,32.35,32.35 105 | Days Inventory,6.95,5.17,3.26,4.37,6.30,5.81,6.22,9.04,9.82,9.09,9.09 106 | Payables Period,81.30,75.48,74.38,74.54,85.45,85.57,101.11,111.72,116.95,115.20,115.20 107 | Cash Conversion Cycle,-49.53,-51.96,-52.13,-44.50,-48.64,-52.97,-67.29,-75.91,-78.92,-73.76,-73.76 108 | Receivables Turnover,14.71,19.90,19.20,14.22,11.96,13.62,13.23,13.63,12.94,11.28,11.28 109 | Inventory Turnover,52.51,70.53,112.12,83.45,57.94,62.82,58.64,40.37,37.17,40.13,40.13 110 | Fixed Assets Turnover,16.89,17.26,13.48,10.67,9.82,10.85,8.71,7.54,7.07,6.61,6.61 111 | Asset Turnover,1.06,1.13,1.07,0.89,0.83,0.89,0.70,0.66,0.72,0.74,0.74 112 | -------------------------------------------------------------------------------- /data/aapl_concise.csv: -------------------------------------------------------------------------------- 1 | ,shares_outstanding,earning_per_share,dividend_rate,dividend_yield,debt_to_equity,book_value_per_share,return_on_equity,current_ratio 2 | 2010-09,"6,473",2.16,,,,7.45,35.28,2.01 3 | 2011-09,"6,557",3.95,,,,11.78,41.67,1.61 4 | 2012-09,"6,617",6.31,0.38,,,16.99,42.84,1.50 5 | 2013-09,"6,522",5.68,1.63,27.4,0.14,19.60,30.64,1.68 6 | 2014-09,"6,123",6.45,1.81,28.5,0.26,20.62,33.61,1.08 7 | 2015-09,"5,793",9.22,1.98,22.3,0.45,22.53,46.25,1.11 8 | 2016-09,"5,500",8.31,2.18,24.8,0.59,23.71,36.90,1.35 9 | 2017-09,"5,252",9.21,2.40,26.5,0.73,25.83,36.87,1.28 10 | 2018-09,"5,000",11.91,2.72,23.7,0.87,24.17,49.36,1.12 11 | 2019-09,"4,649",11.89,3.00,25.1,1.01,21.71,55.92,1.54 12 | TTM,"4,649",11.89,3.00,25.2,1.01,20.64,55.92,1.54 13 | -------------------------------------------------------------------------------- /reflection_brief_intro.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sicongzhao/Value-Investing-In-Python/cc1ee84fb641e9cf480789a25e42054e3b3891e4/reflection_brief_intro.pdf --------------------------------------------------------------------------------