├── README.md ├── Value-Investing-Greenblatt-Formula.ipynb └── .ipynb_checkpoints └── Value-Investing-Greenblatt-Formula-checkpoint.ipynb /README.md: -------------------------------------------------------------------------------- 1 | # Greenblatt-Magic-Formula-Value-Investing 2 | Implementation of Joel Greenblatt's magic formula, which he described in his book - "The Little Book That Still Beats the Market". 3 | 4 | **Disclaimer - This is purely for educational and research purposes, I am in no way responsible for any monetary loss/gain you make using this, I highly encourage you to view this as a learning resource and not as an investment advice.** 5 | 6 | Joel Greenblatt is one of the most successful investors in the world, he has derived a rule-based approach for screening stocks for Value investing, which he calls the 'Magic Formula', using which he has generated a whopping 40% CAGR over a period of 20 years(v/s a CAGR of 9.5% generated by the famous S&P500), which means if you had invested $2000, that would become 1.62M$ in 20 years. 7 | 8 | His formula gives a systematic approach to create a portfolio of bluechip companies, which have the potential for wealth-creation in the **long term**. 9 | 10 | **For conclusion, you can jump to the end of the notebook, but it is highly advisable not to do this, as Warren Buffett says, "Risk comes from not knowing what you're doing".** 11 | 12 | ## Why you should consider looking at the Magic Formula ? 13 | 14 | * Developed by one of the most successful investor/hegde-fund manager Joel Greenblatt(just Google him and you will know) 15 | * Thoroughly applied and backtested strategy, that has beated the market by a significant measure. 16 | * This follows a systematic approach and throws emotional investments out of the way. 17 | 18 | ## Some Important things 19 | * This is expected to work only if you invest for long-term(5-20 years) 20 | * This is not expected to work on Finance/Insurance companies(since the calculations and their business functions and entirely different from what the formula uses) 21 | * This is only applicable to large-cap(Market cap more than 10B$)/mega-cap(market cap more than 200B$) companies. 22 | * This is expected to work only for US Companies(I highly encourage you to study this for your own country's stocks and backtest the results to learn if it really works) 23 | * At the end of the day, this is stock market, and stock market investments are subject to Market risk. 24 | 25 | ## Some of the drawbacks of the magic formula 26 | * It only uses historical data to make decisions, it does not encorporate news and other factors that might influence a stock's price. 27 | * It is not guaranteed to outperform the market every single year, it might underperform and make you exit sooner than planned(making you loose out on long-term gains) 28 | * What happens if there is some internal issues going on in the company(Example - Poor management), it cannot filter those things when choosing stocks. 29 | 30 | *** 31 | I hope this helps you make better decisions for investing your hard-earned money, happy investing! 32 | -------------------------------------------------------------------------------- /Value-Investing-Greenblatt-Formula.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Important information before proceeding" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "For some theoretical understanding, refer to README. Also, the magic formula by Greenblatt is known to work well only for US listed stocks, excluding insurance and finance companies(their financial statments are quite different from other companies).
\n", 15 | "\n", 16 | "Also, a disclaimer once again - **This is purely for educational and research purposes, I am in no way responsible for any monetary loss/gain you make using this, I highly encourage you to view this as a learning resource and not as an investment advice.**" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": {}, 23 | "outputs": [], 24 | "source": [ 25 | "import requests\n", 26 | "from bs4 import BeautifulSoup\n", 27 | "import pandas as pd" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 2, 33 | "metadata": {}, 34 | "outputs": [], 35 | "source": [ 36 | "# We will pick the 30 stocks listed in DOW Jones index, feel free to change these as per your requirement.\n", 37 | "stocks = [\"AXP\",\"AAPL\",\"BA\",\"CAT\",\"CVX\",\"CSCO\",\"DIS\",\"DOW\", \"XOM\",\n", 38 | " \"HD\",\"IBM\",\"INTC\",\"JNJ\",\"KO\",\"MCD\",\"MMM\",\"MRK\",\"MSFT\",\n", 39 | " \"NKE\",\"PFE\",\"PG\",\"TRV\",\"UTX\",\"UNH\",\"VZ\",\"V\",\"WMT\",\"WBA\"]" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "## Scraping data from Yahoo Finance" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 3, 52 | "metadata": {}, 53 | "outputs": [ 54 | { 55 | "name": "stdout", 56 | "output_type": "stream", 57 | "text": [ 58 | "Data successfully scraped for AXP\n", 59 | "Data successfully scraped for AAPL\n", 60 | "Data successfully scraped for BA\n", 61 | "Data successfully scraped for CAT\n", 62 | "Data successfully scraped for CVX\n", 63 | "Data successfully scraped for CSCO\n", 64 | "Data successfully scraped for DIS\n", 65 | "Data successfully scraped for DOW\n", 66 | "Data successfully scraped for XOM\n", 67 | "Data successfully scraped for HD\n", 68 | "Data successfully scraped for IBM\n", 69 | "Data successfully scraped for INTC\n", 70 | "Data successfully scraped for JNJ\n", 71 | "Data successfully scraped for KO\n", 72 | "Data successfully scraped for MCD\n", 73 | "Data successfully scraped for MMM\n", 74 | "Data successfully scraped for MRK\n", 75 | "Data successfully scraped for MSFT\n", 76 | "Data successfully scraped for NKE\n", 77 | "Data successfully scraped for PFE\n", 78 | "Data successfully scraped for PG\n", 79 | "Data successfully scraped for TRV\n", 80 | "Data successfully scraped for UTX\n", 81 | "Data successfully scraped for UNH\n", 82 | "Data successfully scraped for VZ\n", 83 | "Data successfully scraped for V\n", 84 | "Data successfully scraped for WMT\n", 85 | "Data successfully scraped for WBA\n", 86 | "All data webscraped\n" 87 | ] 88 | } 89 | ], 90 | "source": [ 91 | "# Dictionary to hold information for each stock/ticker\n", 92 | "financial_dir = {}\n", 93 | "\n", 94 | "for ticker in stocks:\n", 95 | " try:\n", 96 | " #getting balance sheet data from yahoo finance for the given ticker\n", 97 | " temp_dir = {}\n", 98 | " url = 'https://in.finance.yahoo.com/quote/'+ticker+'/balance-sheet?p='+ticker\n", 99 | " page = requests.get(url)\n", 100 | " page_content = page.content\n", 101 | " soup = BeautifulSoup(page_content,'html.parser')\n", 102 | " tabl = soup.find_all(\"div\", {\"class\" : \"M(0) Whs(n) BdEnd Bdc($seperatorColor) D(itb)\"})\n", 103 | " for t in tabl:\n", 104 | " rows = t.find_all(\"div\", {\"class\" : \"rw-expnded\"})\n", 105 | " for row in rows:\n", 106 | " temp_dir[row.get_text(separator='|').split(\"|\")[0]]=row.get_text(separator='|').split(\"|\")[1]\n", 107 | " \n", 108 | " #getting income statement data from yahoo finance for the given ticker\n", 109 | " url = 'https://in.finance.yahoo.com/quote/'+ticker+'/financials?p='+ticker\n", 110 | " page = requests.get(url)\n", 111 | " page_content = page.content\n", 112 | " soup = BeautifulSoup(page_content,'html.parser')\n", 113 | " tabl = soup.find_all(\"div\", {\"class\" : \"M(0) Whs(n) BdEnd Bdc($seperatorColor) D(itb)\"})\n", 114 | " for t in tabl:\n", 115 | " rows = t.find_all(\"div\", {\"class\" : \"rw-expnded\"})\n", 116 | " for row in rows:\n", 117 | " temp_dir[row.get_text(separator='|').split(\"|\")[0]]=row.get_text(separator='|').split(\"|\")[1]\n", 118 | " \n", 119 | " #getting cashflow statement data from yahoo finance for the given ticker\n", 120 | " url = 'https://in.finance.yahoo.com/quote/'+ticker+'/cash-flow?p='+ticker\n", 121 | " page = requests.get(url)\n", 122 | " page_content = page.content\n", 123 | " soup = BeautifulSoup(page_content,'html.parser')\n", 124 | " tabl = soup.find_all(\"div\", {\"class\" : \"M(0) Whs(n) BdEnd Bdc($seperatorColor) D(itb)\"})\n", 125 | " for t in tabl:\n", 126 | " rows = t.find_all(\"div\", {\"class\" : \"rw-expnded\"})\n", 127 | " for row in rows:\n", 128 | " temp_dir[row.get_text(separator='|').split(\"|\")[0]]=row.get_text(separator='|').split(\"|\")[1]\n", 129 | " \n", 130 | " #getting key statistics data from yahoo finance for the given ticker\n", 131 | " url = 'https://in.finance.yahoo.com/quote/'+ticker+'/key-statistics?p='+ticker\n", 132 | " page = requests.get(url)\n", 133 | " page_content = page.content\n", 134 | " soup = BeautifulSoup(page_content,'html.parser')\n", 135 | " tabl = soup.findAll(\"table\", {\"class\": \"W(100%) Bdcl(c)\"}) \n", 136 | " for t in tabl:\n", 137 | " rows = t.find_all(\"tr\")\n", 138 | " for row in rows:\n", 139 | " if len(row.get_text(separator='|').split(\"|\")[0:2])>0:\n", 140 | " temp_dir[row.get_text(separator='|').split(\"|\")[0]]=row.get_text(separator='|').split(\"|\")[-1] \n", 141 | " \n", 142 | "\n", 143 | " #combining all extracted information with the corresponding ticker into the dictionary\n", 144 | " financial_dir[ticker] = temp_dir\n", 145 | " print(\"Data successfully scraped for \", ticker)\n", 146 | " except:\n", 147 | " print(\"Problem scraping data for \",ticker)\n", 148 | "print('All data webscraped')" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": 4, 154 | "metadata": {}, 155 | "outputs": [], 156 | "source": [ 157 | "# Storing the scraped info to a Dataframe\n", 158 | "combined_financials = pd.DataFrame(financial_dir)\n", 159 | "combined_financials.dropna(how='all',axis=1,inplace=True) #dropping columns with all Null values\n", 160 | "tickers = combined_financials.columns #updating the tickers list based on only those tickers whose values were successfully extracted\n", 161 | "for ticker in stocks:\n", 162 | " combined_financials = combined_financials[~combined_financials[ticker].str.contains(\"[a-z]\").fillna(False)]" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": 5, 168 | "metadata": {}, 169 | "outputs": [ 170 | { 171 | "data": { 172 | "text/html": [ 173 | "
\n", 174 | "\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 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | "
AXPAAPLBACATCVXCSCODISDOWXOMHD...NKEPFEPGTRVUTXUNHVZVWMTWBA
Total assets19,83,21,00033,85,16,00013,36,25,0007,84,53,00023,74,28,0009,48,53,00019,39,84,0006,05,24,00036,25,97,0005,12,36,000...3,13,42,00016,74,89,00012,07,00,00011,01,22,00013,97,16,00017,38,89,00029,17,27,0007,25,74,00023,64,95,0006,75,98,000
Total liabilities17,52,50,00024,80,28,00014,19,25,0006,38,24,0009,22,20,0005,69,33,00010,00,95,0004,64,30,00016,36,59,0005,43,52,000...2,32,87,00010,40,42,0007,38,22,0008,41,79,0009,54,85,00011,34,53,00022,88,92,0003,78,90,00015,49,43,0004,34,46,000
Common stock1,63,0004,51,74,00050,61,00059,35,00018,32,000-5,39,07,0008,0001,56,37,00089,000...3,0004,85,00049,06,0002,34,69,0002,30,19,0009,0004,29,00054,62,0002,84,00012,000
Retained earnings1,38,71,0004,58,98,0005,06,44,0003,44,37,00017,49,45,000-4,24,94,0001,70,45,00042,13,41,0005,17,29,000...-1,91,0009,76,70,00010,02,39,0003,69,77,0006,15,94,0006,11,78,0005,31,47,0001,35,02,0008,39,43,0003,58,15,000
Accumulated other comprehensive income-27,37,000-5,84,000-1,61,53,000-15,67,000-52,30,000--66,17,000-1,02,46,000-1,94,93,000-7,39,000...-56,000-1,16,40,000-1,72,45,0006,40,000-1,01,49,000-35,78,0009,98,000-6,50,000-1,28,05,000-38,97,000
\n", 337 | "

5 rows × 28 columns

\n", 338 | "
" 339 | ], 340 | "text/plain": [ 341 | " AXP AAPL \\\n", 342 | "Total assets 19,83,21,000 33,85,16,000 \n", 343 | "Total liabilities 17,52,50,000 24,80,28,000 \n", 344 | "Common stock 1,63,000 4,51,74,000 \n", 345 | "Retained earnings 1,38,71,000 4,58,98,000 \n", 346 | "Accumulated other comprehensive income -27,37,000 -5,84,000 \n", 347 | "\n", 348 | " BA CAT \\\n", 349 | "Total assets 13,36,25,000 7,84,53,000 \n", 350 | "Total liabilities 14,19,25,000 6,38,24,000 \n", 351 | "Common stock 50,61,000 59,35,000 \n", 352 | "Retained earnings 5,06,44,000 3,44,37,000 \n", 353 | "Accumulated other comprehensive income -1,61,53,000 -15,67,000 \n", 354 | "\n", 355 | " CVX CSCO \\\n", 356 | "Total assets 23,74,28,000 9,48,53,000 \n", 357 | "Total liabilities 9,22,20,000 5,69,33,000 \n", 358 | "Common stock 18,32,000 - \n", 359 | "Retained earnings 17,49,45,000 - \n", 360 | "Accumulated other comprehensive income -52,30,000 - \n", 361 | "\n", 362 | " DIS DOW \\\n", 363 | "Total assets 19,39,84,000 6,05,24,000 \n", 364 | "Total liabilities 10,00,95,000 4,64,30,000 \n", 365 | "Common stock 5,39,07,000 8,000 \n", 366 | "Retained earnings 4,24,94,000 1,70,45,000 \n", 367 | "Accumulated other comprehensive income -66,17,000 -1,02,46,000 \n", 368 | "\n", 369 | " XOM HD ... \\\n", 370 | "Total assets 36,25,97,000 5,12,36,000 ... \n", 371 | "Total liabilities 16,36,59,000 5,43,52,000 ... \n", 372 | "Common stock 1,56,37,000 89,000 ... \n", 373 | "Retained earnings 42,13,41,000 5,17,29,000 ... \n", 374 | "Accumulated other comprehensive income -1,94,93,000 -7,39,000 ... \n", 375 | "\n", 376 | " NKE PFE \\\n", 377 | "Total assets 3,13,42,000 16,74,89,000 \n", 378 | "Total liabilities 2,32,87,000 10,40,42,000 \n", 379 | "Common stock 3,000 4,85,000 \n", 380 | "Retained earnings -1,91,000 9,76,70,000 \n", 381 | "Accumulated other comprehensive income -56,000 -1,16,40,000 \n", 382 | "\n", 383 | " PG TRV \\\n", 384 | "Total assets 12,07,00,000 11,01,22,000 \n", 385 | "Total liabilities 7,38,22,000 8,41,79,000 \n", 386 | "Common stock 49,06,000 2,34,69,000 \n", 387 | "Retained earnings 10,02,39,000 3,69,77,000 \n", 388 | "Accumulated other comprehensive income -1,72,45,000 6,40,000 \n", 389 | "\n", 390 | " UTX UNH \\\n", 391 | "Total assets 13,97,16,000 17,38,89,000 \n", 392 | "Total liabilities 9,54,85,000 11,34,53,000 \n", 393 | "Common stock 2,30,19,000 9,000 \n", 394 | "Retained earnings 6,15,94,000 6,11,78,000 \n", 395 | "Accumulated other comprehensive income -1,01,49,000 -35,78,000 \n", 396 | "\n", 397 | " VZ V \\\n", 398 | "Total assets 29,17,27,000 7,25,74,000 \n", 399 | "Total liabilities 22,88,92,000 3,78,90,000 \n", 400 | "Common stock 4,29,000 54,62,000 \n", 401 | "Retained earnings 5,31,47,000 1,35,02,000 \n", 402 | "Accumulated other comprehensive income 9,98,000 -6,50,000 \n", 403 | "\n", 404 | " WMT WBA \n", 405 | "Total assets 23,64,95,000 6,75,98,000 \n", 406 | "Total liabilities 15,49,43,000 4,34,46,000 \n", 407 | "Common stock 2,84,000 12,000 \n", 408 | "Retained earnings 8,39,43,000 3,58,15,000 \n", 409 | "Accumulated other comprehensive income -1,28,05,000 -38,97,000 \n", 410 | "\n", 411 | "[5 rows x 28 columns]" 412 | ] 413 | }, 414 | "execution_count": 5, 415 | "metadata": {}, 416 | "output_type": "execute_result" 417 | } 418 | ], 419 | "source": [ 420 | "combined_financials.head()" 421 | ] 422 | }, 423 | { 424 | "cell_type": "code", 425 | "execution_count": 6, 426 | "metadata": {}, 427 | "outputs": [], 428 | "source": [ 429 | "# Required stats for the magic formula\n", 430 | "stats = [\"EBITDA\",\n", 431 | " \"Depreciation & amortisation\",\n", 432 | " \"Market cap (intra-day)\",\n", 433 | " \"Net income available to common shareholders\",\n", 434 | " \"Net cash provided by operating activities\",\n", 435 | " \"Capital expenditure\",\n", 436 | " \"Total current assets\",\n", 437 | " \"Total current liabilities\",\n", 438 | " \"Net property, plant and equipment\",\n", 439 | " \"Total stockholders' equity\",\n", 440 | " \"Long-term debt\",\n", 441 | " \"Forward annual dividend yield\"]\n", 442 | "\n", 443 | "# Short hands for above to keep things simple\n", 444 | "indx = [\"EBITDA\",\"D&A\",\"MarketCap\",\"NetIncome\",\"CashFlowOps\",\"Capex\",\"CurrAsset\",\n", 445 | " \"CurrLiab\",\"PPE\",\"BookValue\",\"TotDebt\",\"DivYield\"]" 446 | ] 447 | }, 448 | { 449 | "cell_type": "code", 450 | "execution_count": 7, 451 | "metadata": {}, 452 | "outputs": [], 453 | "source": [ 454 | "all_stats = {}\n", 455 | "for ticker in stocks:\n", 456 | " try:\n", 457 | " temp = combined_financials[ticker]\n", 458 | " ticker_stats = []\n", 459 | " for stat in stats:\n", 460 | " ticker_stats.append(temp.loc[stat])\n", 461 | " all_stats['{}'.format(ticker)] = ticker_stats\n", 462 | " except:\n", 463 | " print(\"Can't read data for \",ticker)" 464 | ] 465 | }, 466 | { 467 | "cell_type": "markdown", 468 | "metadata": {}, 469 | "source": [ 470 | "### Combining everything into one single dataframe with all required stats and some data cleaning\n" 471 | ] 472 | }, 473 | { 474 | "cell_type": "code", 475 | "execution_count": 8, 476 | "metadata": {}, 477 | "outputs": [], 478 | "source": [ 479 | "all_stats_df = pd.DataFrame(all_stats,index=indx)\n", 480 | "all_stats_df[tickers] = all_stats_df[tickers].replace({',': ''}, regex=True)\n", 481 | "all_stats_df[tickers] = all_stats_df[tickers].replace({'M': 'E+03'}, regex=True)\n", 482 | "all_stats_df[tickers] = all_stats_df[tickers].replace({'B': 'E+06'}, regex=True)\n", 483 | "all_stats_df[tickers] = all_stats_df[tickers].replace({'T': 'E+09'}, regex=True)\n", 484 | "all_stats_df[tickers] = all_stats_df[tickers].replace({'%': 'E-02'}, regex=True)\n", 485 | "for ticker in all_stats_df.columns:\n", 486 | " all_stats_df[ticker] = pd.to_numeric(all_stats_df[ticker].values,errors='coerce')\n", 487 | "all_stats_df.dropna(axis=1,inplace=True)\n", 488 | "\n", 489 | "stocks = all_stats_df.columns" 490 | ] 491 | }, 492 | { 493 | "cell_type": "code", 494 | "execution_count": 11, 495 | "metadata": {}, 496 | "outputs": [ 497 | { 498 | "data": { 499 | "text/html": [ 500 | "
\n", 501 | "\n", 514 | "\n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | "
AAPLCATCSCODOWHDIBMINTCJNJKOMCD...MRKMSFTNKEPFEPGUNHVZVWMTWBA
EBITDA7.867000e+078.580000e+061.591000e+075.680000e+061.910000e+071.558000e+073.812000e+072.721000e+071.125000e+078.910000e+06...1.905000e+076.526000e+074.230000e+062.005000e+071.919000e+072.649000e+074.751000e+071.548000e+073.382000e+075.020000e+06
D&A1.153300e+072.511000e+061.808000e+062.876000e+062.411000e+066.632000e+061.176000e+077.016000e+061.511000e+061.674000e+06...3.650000e+061.279600e+077.140000e+055.406000e+063.013000e+062.867000e+061.655000e+077.430000e+051.111300e+071.973000e+06
MarketCap2.160000e+097.680000e+071.783900e+083.434000e+073.139800e+081.105800e+082.107400e+084.009800e+082.068700e+081.590600e+08...2.163500e+081.670000e+091.739700e+082.114400e+083.440500e+082.934800e+082.460500e+084.616100e+083.701400e+083.351000e+07
NetIncome5.842400e+074.142000e+061.121400e+07-1.976000e+061.182700e+077.878000e+062.366100e+071.518500e+079.189000e+064.770800e+06...1.047900e+074.428100e+074.304000e+061.417100e+071.276400e+071.709800e+071.914500e+071.248200e+071.789500e+077.600000e+05
CashFlowOps8.000800e+075.724000e+061.542600e+076.503000e+062.005500e+071.512200e+073.791400e+072.073500e+078.756000e+065.508900e+06...1.309400e+076.067500e+074.996000e+061.496700e+071.740300e+072.230100e+074.346200e+071.238600e+073.302600e+075.777000e+06
Capex-8.302000e+06-2.442000e+06-7.700000e+05-1.717000e+06-2.464000e+06-2.996000e+06-1.601400e+07-3.292000e+06-1.823000e+06-2.068100e+06...-3.750000e+06-1.544100e+07-1.086000e+06-2.363000e+06-3.073000e+06-2.014000e+06-2.232200e+07-8.170000e+05-9.403000e+06-1.418000e+06
CurrAsset1.628190e+083.919300e+074.357300e+071.681500e+071.981000e+073.842000e+073.123900e+074.527400e+072.041100e+073.557900e+06...2.748300e+071.819150e+082.055600e+073.280300e+072.798700e+074.263400e+073.747300e+072.097000e+076.180600e+071.870000e+07
CurrLiab1.057180e+082.662100e+072.533100e+071.067900e+071.837500e+073.770100e+072.231000e+073.596400e+072.697300e+073.621000e+06...2.222000e+077.231000e+078.284000e+063.730400e+073.297600e+076.178200e+074.486800e+071.341500e+077.779000e+072.576900e+07
PPE3.737800e+071.290400e+072.453000e+062.306800e+072.836500e+071.500500e+075.538600e+071.765800e+071.083800e+073.742120e+07...1.505300e+075.290400e+077.963000e+061.396700e+072.069200e+078.704000e+061.146090e+082.695000e+061.270490e+081.347900e+07
BookValue9.048800e+071.458800e+073.792000e+071.354100e+07-3.116000e+062.084100e+077.765900e+075.947100e+071.898100e+07-8.210300e+06...2.590700e+071.183040e+088.055000e+066.314300e+074.652100e+075.761600e+076.139500e+073.468400e+077.466900e+072.351200e+07
TotDebt9.180700e+072.615300e+071.157800e+071.597500e+072.867000e+075.410200e+072.530800e+072.649400e+072.751600e+073.411810e+07...2.273600e+075.957800e+079.406000e+063.595500e+072.353700e+073.680800e+079.993200e+071.672900e+074.371400e+071.109800e+07
DivYield6.600000e-032.920000e-023.430000e-026.070000e-022.100000e-025.230000e-022.670000e-022.660000e-023.420000e-022.350000e-02...2.850000e-029.400000e-038.800000e-033.960000e-022.270000e-021.600000e-024.140000e-025.800000e-031.650000e-024.730000e-02
\n", 832 | "

12 rows × 21 columns

\n", 833 | "
" 834 | ], 835 | "text/plain": [ 836 | " AAPL CAT CSCO DOW \\\n", 837 | "EBITDA 7.867000e+07 8.580000e+06 1.591000e+07 5.680000e+06 \n", 838 | "D&A 1.153300e+07 2.511000e+06 1.808000e+06 2.876000e+06 \n", 839 | "MarketCap 2.160000e+09 7.680000e+07 1.783900e+08 3.434000e+07 \n", 840 | "NetIncome 5.842400e+07 4.142000e+06 1.121400e+07 -1.976000e+06 \n", 841 | "CashFlowOps 8.000800e+07 5.724000e+06 1.542600e+07 6.503000e+06 \n", 842 | "Capex -8.302000e+06 -2.442000e+06 -7.700000e+05 -1.717000e+06 \n", 843 | "CurrAsset 1.628190e+08 3.919300e+07 4.357300e+07 1.681500e+07 \n", 844 | "CurrLiab 1.057180e+08 2.662100e+07 2.533100e+07 1.067900e+07 \n", 845 | "PPE 3.737800e+07 1.290400e+07 2.453000e+06 2.306800e+07 \n", 846 | "BookValue 9.048800e+07 1.458800e+07 3.792000e+07 1.354100e+07 \n", 847 | "TotDebt 9.180700e+07 2.615300e+07 1.157800e+07 1.597500e+07 \n", 848 | "DivYield 6.600000e-03 2.920000e-02 3.430000e-02 6.070000e-02 \n", 849 | "\n", 850 | " HD IBM INTC JNJ \\\n", 851 | "EBITDA 1.910000e+07 1.558000e+07 3.812000e+07 2.721000e+07 \n", 852 | "D&A 2.411000e+06 6.632000e+06 1.176000e+07 7.016000e+06 \n", 853 | "MarketCap 3.139800e+08 1.105800e+08 2.107400e+08 4.009800e+08 \n", 854 | "NetIncome 1.182700e+07 7.878000e+06 2.366100e+07 1.518500e+07 \n", 855 | "CashFlowOps 2.005500e+07 1.512200e+07 3.791400e+07 2.073500e+07 \n", 856 | "Capex -2.464000e+06 -2.996000e+06 -1.601400e+07 -3.292000e+06 \n", 857 | "CurrAsset 1.981000e+07 3.842000e+07 3.123900e+07 4.527400e+07 \n", 858 | "CurrLiab 1.837500e+07 3.770100e+07 2.231000e+07 3.596400e+07 \n", 859 | "PPE 2.836500e+07 1.500500e+07 5.538600e+07 1.765800e+07 \n", 860 | "BookValue -3.116000e+06 2.084100e+07 7.765900e+07 5.947100e+07 \n", 861 | "TotDebt 2.867000e+07 5.410200e+07 2.530800e+07 2.649400e+07 \n", 862 | "DivYield 2.100000e-02 5.230000e-02 2.670000e-02 2.660000e-02 \n", 863 | "\n", 864 | " KO MCD ... MRK MSFT \\\n", 865 | "EBITDA 1.125000e+07 8.910000e+06 ... 1.905000e+07 6.526000e+07 \n", 866 | "D&A 1.511000e+06 1.674000e+06 ... 3.650000e+06 1.279600e+07 \n", 867 | "MarketCap 2.068700e+08 1.590600e+08 ... 2.163500e+08 1.670000e+09 \n", 868 | "NetIncome 9.189000e+06 4.770800e+06 ... 1.047900e+07 4.428100e+07 \n", 869 | "CashFlowOps 8.756000e+06 5.508900e+06 ... 1.309400e+07 6.067500e+07 \n", 870 | "Capex -1.823000e+06 -2.068100e+06 ... -3.750000e+06 -1.544100e+07 \n", 871 | "CurrAsset 2.041100e+07 3.557900e+06 ... 2.748300e+07 1.819150e+08 \n", 872 | "CurrLiab 2.697300e+07 3.621000e+06 ... 2.222000e+07 7.231000e+07 \n", 873 | "PPE 1.083800e+07 3.742120e+07 ... 1.505300e+07 5.290400e+07 \n", 874 | "BookValue 1.898100e+07 -8.210300e+06 ... 2.590700e+07 1.183040e+08 \n", 875 | "TotDebt 2.751600e+07 3.411810e+07 ... 2.273600e+07 5.957800e+07 \n", 876 | "DivYield 3.420000e-02 2.350000e-02 ... 2.850000e-02 9.400000e-03 \n", 877 | "\n", 878 | " NKE PFE PG UNH \\\n", 879 | "EBITDA 4.230000e+06 2.005000e+07 1.919000e+07 2.649000e+07 \n", 880 | "D&A 7.140000e+05 5.406000e+06 3.013000e+06 2.867000e+06 \n", 881 | "MarketCap 1.739700e+08 2.114400e+08 3.440500e+08 2.934800e+08 \n", 882 | "NetIncome 4.304000e+06 1.417100e+07 1.276400e+07 1.709800e+07 \n", 883 | "CashFlowOps 4.996000e+06 1.496700e+07 1.740300e+07 2.230100e+07 \n", 884 | "Capex -1.086000e+06 -2.363000e+06 -3.073000e+06 -2.014000e+06 \n", 885 | "CurrAsset 2.055600e+07 3.280300e+07 2.798700e+07 4.263400e+07 \n", 886 | "CurrLiab 8.284000e+06 3.730400e+07 3.297600e+07 6.178200e+07 \n", 887 | "PPE 7.963000e+06 1.396700e+07 2.069200e+07 8.704000e+06 \n", 888 | "BookValue 8.055000e+06 6.314300e+07 4.652100e+07 5.761600e+07 \n", 889 | "TotDebt 9.406000e+06 3.595500e+07 2.353700e+07 3.680800e+07 \n", 890 | "DivYield 8.800000e-03 3.960000e-02 2.270000e-02 1.600000e-02 \n", 891 | "\n", 892 | " VZ V WMT WBA \n", 893 | "EBITDA 4.751000e+07 1.548000e+07 3.382000e+07 5.020000e+06 \n", 894 | "D&A 1.655000e+07 7.430000e+05 1.111300e+07 1.973000e+06 \n", 895 | "MarketCap 2.460500e+08 4.616100e+08 3.701400e+08 3.351000e+07 \n", 896 | "NetIncome 1.914500e+07 1.248200e+07 1.789500e+07 7.600000e+05 \n", 897 | "CashFlowOps 4.346200e+07 1.238600e+07 3.302600e+07 5.777000e+06 \n", 898 | "Capex -2.232200e+07 -8.170000e+05 -9.403000e+06 -1.418000e+06 \n", 899 | "CurrAsset 3.747300e+07 2.097000e+07 6.180600e+07 1.870000e+07 \n", 900 | "CurrLiab 4.486800e+07 1.341500e+07 7.779000e+07 2.576900e+07 \n", 901 | "PPE 1.146090e+08 2.695000e+06 1.270490e+08 1.347900e+07 \n", 902 | "BookValue 6.139500e+07 3.468400e+07 7.466900e+07 2.351200e+07 \n", 903 | "TotDebt 9.993200e+07 1.672900e+07 4.371400e+07 1.109800e+07 \n", 904 | "DivYield 4.140000e-02 5.800000e-03 1.650000e-02 4.730000e-02 \n", 905 | "\n", 906 | "[12 rows x 21 columns]" 907 | ] 908 | }, 909 | "execution_count": 11, 910 | "metadata": {}, 911 | "output_type": "execute_result" 912 | } 913 | ], 914 | "source": [ 915 | "all_stats_df" 916 | ] 917 | }, 918 | { 919 | "cell_type": "markdown", 920 | "metadata": {}, 921 | "source": [ 922 | "## Calculation of some metrics for the formula using above information" 923 | ] 924 | }, 925 | { 926 | "cell_type": "code", 927 | "execution_count": 12, 928 | "metadata": {}, 929 | "outputs": [], 930 | "source": [ 931 | "transpose_df = all_stats_df.transpose()\n", 932 | "final_stats_df = pd.DataFrame()\n", 933 | "final_stats_df[\"EBIT\"] = transpose_df[\"EBITDA\"] - transpose_df[\"D&A\"]\n", 934 | "final_stats_df[\"TEV\"] = transpose_df[\"MarketCap\"].fillna(0) \\\n", 935 | " +transpose_df[\"TotDebt\"].fillna(0) \\\n", 936 | " -(transpose_df[\"CurrAsset\"].fillna(0)-transpose_df[\"CurrLiab\"].fillna(0))\n", 937 | "final_stats_df[\"EarningYield\"] = final_stats_df[\"EBIT\"]/final_stats_df[\"TEV\"]\n", 938 | "final_stats_df[\"FCFYield\"] = (transpose_df[\"CashFlowOps\"]-transpose_df[\"Capex\"])/transpose_df[\"MarketCap\"]\n", 939 | "final_stats_df[\"ROC\"] = (transpose_df[\"EBITDA\"] - transpose_df[\"D&A\"])/(transpose_df[\"PPE\"]+transpose_df[\"CurrAsset\"]-transpose_df[\"CurrLiab\"])\n", 940 | "final_stats_df[\"BookToMkt\"] = transpose_df[\"BookValue\"]/transpose_df[\"MarketCap\"]\n", 941 | "final_stats_df[\"DivYield\"] = transpose_df[\"DivYield\"]" 942 | ] 943 | }, 944 | { 945 | "cell_type": "code", 946 | "execution_count": 13, 947 | "metadata": {}, 948 | "outputs": [ 949 | { 950 | "data": { 951 | "text/html": [ 952 | "
\n", 953 | "\n", 966 | "\n", 967 | " \n", 968 | " \n", 969 | " \n", 970 | " \n", 971 | " \n", 972 | " \n", 973 | " \n", 974 | " \n", 975 | " \n", 976 | " \n", 977 | " \n", 978 | " \n", 979 | " \n", 980 | " \n", 981 | " \n", 982 | " \n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | " \n", 1030 | " \n", 1031 | " \n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | " \n", 1036 | " \n", 1037 | " \n", 1038 | " \n", 1039 | " \n", 1040 | " \n", 1041 | " \n", 1042 | " \n", 1043 | " \n", 1044 | " \n", 1045 | " \n", 1046 | " \n", 1047 | " \n", 1048 | " \n", 1049 | " \n", 1050 | " \n", 1051 | " \n", 1052 | " \n", 1053 | " \n", 1054 | " \n", 1055 | " \n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | " \n", 1066 | " \n", 1067 | " \n", 1068 | " \n", 1069 | " \n", 1070 | " \n", 1071 | " \n", 1072 | " \n", 1073 | " \n", 1074 | " \n", 1075 | " \n", 1076 | " \n", 1077 | " \n", 1078 | " \n", 1079 | " \n", 1080 | " \n", 1081 | " \n", 1082 | " \n", 1083 | " \n", 1084 | " \n", 1085 | " \n", 1086 | " \n", 1087 | " \n", 1088 | " \n", 1089 | " \n", 1090 | " \n", 1091 | " \n", 1092 | " \n", 1093 | " \n", 1094 | " \n", 1095 | " \n", 1096 | " \n", 1097 | " \n", 1098 | " \n", 1099 | " \n", 1100 | " \n", 1101 | " \n", 1102 | " \n", 1103 | " \n", 1104 | " \n", 1105 | " \n", 1106 | " \n", 1107 | " \n", 1108 | " \n", 1109 | " \n", 1110 | " \n", 1111 | " \n", 1112 | " \n", 1113 | " \n", 1114 | " \n", 1115 | " \n", 1116 | " \n", 1117 | " \n", 1118 | " \n", 1119 | " \n", 1120 | " \n", 1121 | " \n", 1122 | " \n", 1123 | " \n", 1124 | " \n", 1125 | " \n", 1126 | " \n", 1127 | " \n", 1128 | " \n", 1129 | " \n", 1130 | " \n", 1131 | " \n", 1132 | " \n", 1133 | " \n", 1134 | " \n", 1135 | " \n", 1136 | " \n", 1137 | " \n", 1138 | " \n", 1139 | " \n", 1140 | " \n", 1141 | " \n", 1142 | " \n", 1143 | " \n", 1144 | " \n", 1145 | " \n", 1146 | " \n", 1147 | " \n", 1148 | " \n", 1149 | " \n", 1150 | " \n", 1151 | " \n", 1152 | " \n", 1153 | " \n", 1154 | " \n", 1155 | " \n", 1156 | " \n", 1157 | " \n", 1158 | " \n", 1159 | " \n", 1160 | " \n", 1161 | " \n", 1162 | " \n", 1163 | " \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 | "
EBITTEVEarningYieldFCFYieldROCBookToMktDivYield
AAPL67137000.02.194706e+090.0305900.0408840.7106020.0418930.0066
CAT6069000.09.038100e+070.0671490.1063280.2382240.1899480.0292
CSCO14102000.01.717260e+080.0821190.0907900.6814210.2125680.0343
DOW2804000.04.417900e+070.0634690.2393710.0960140.3943210.0607
HD16689000.03.412150e+080.0489110.0717210.560034-0.0099240.0210
IBM8948000.01.639630e+080.0545730.1638450.5690660.1884700.0523
INTC26360000.02.271190e+080.1160630.2558980.4098580.3685060.0267
JNJ20194000.04.181640e+080.0482920.0599210.7488130.1483140.0266
KO9739000.02.409480e+080.0404200.0511382.2775960.0917530.0342
MCD7236000.01.932412e+080.0374450.0476360.193693-0.0516180.0235
MMM6676000.01.081790e+080.0617130.0961340.4789100.1065880.0361
MRK15400000.02.338230e+080.0658620.0778550.7580230.1197460.0285
MSFT52464000.01.619973e+090.0323860.0455780.3228380.0708410.0094
NKE3516000.01.711040e+080.0205490.0349600.1737580.0463010.0088
PFE14644000.02.518960e+080.0581350.0819621.5470100.2986330.0396
PG16177000.03.725760e+080.0434190.0595151.0301850.1352160.0227
UNH23623000.03.494360e+080.0676030.082851-2.2618730.1963200.0160
VZ30960000.03.533770e+080.0876120.2673600.2887680.2495220.0414
V14737000.04.707840e+080.0313030.0286021.4377560.0751370.0058
WMT22707000.04.298380e+080.0528270.1146300.2044480.2017320.0165
WBA3047000.05.167700e+070.0589620.2147120.4753510.7016410.0473
\n", 1192 | "
" 1193 | ], 1194 | "text/plain": [ 1195 | " EBIT TEV EarningYield FCFYield ROC BookToMkt \\\n", 1196 | "AAPL 67137000.0 2.194706e+09 0.030590 0.040884 0.710602 0.041893 \n", 1197 | "CAT 6069000.0 9.038100e+07 0.067149 0.106328 0.238224 0.189948 \n", 1198 | "CSCO 14102000.0 1.717260e+08 0.082119 0.090790 0.681421 0.212568 \n", 1199 | "DOW 2804000.0 4.417900e+07 0.063469 0.239371 0.096014 0.394321 \n", 1200 | "HD 16689000.0 3.412150e+08 0.048911 0.071721 0.560034 -0.009924 \n", 1201 | "IBM 8948000.0 1.639630e+08 0.054573 0.163845 0.569066 0.188470 \n", 1202 | "INTC 26360000.0 2.271190e+08 0.116063 0.255898 0.409858 0.368506 \n", 1203 | "JNJ 20194000.0 4.181640e+08 0.048292 0.059921 0.748813 0.148314 \n", 1204 | "KO 9739000.0 2.409480e+08 0.040420 0.051138 2.277596 0.091753 \n", 1205 | "MCD 7236000.0 1.932412e+08 0.037445 0.047636 0.193693 -0.051618 \n", 1206 | "MMM 6676000.0 1.081790e+08 0.061713 0.096134 0.478910 0.106588 \n", 1207 | "MRK 15400000.0 2.338230e+08 0.065862 0.077855 0.758023 0.119746 \n", 1208 | "MSFT 52464000.0 1.619973e+09 0.032386 0.045578 0.322838 0.070841 \n", 1209 | "NKE 3516000.0 1.711040e+08 0.020549 0.034960 0.173758 0.046301 \n", 1210 | "PFE 14644000.0 2.518960e+08 0.058135 0.081962 1.547010 0.298633 \n", 1211 | "PG 16177000.0 3.725760e+08 0.043419 0.059515 1.030185 0.135216 \n", 1212 | "UNH 23623000.0 3.494360e+08 0.067603 0.082851 -2.261873 0.196320 \n", 1213 | "VZ 30960000.0 3.533770e+08 0.087612 0.267360 0.288768 0.249522 \n", 1214 | "V 14737000.0 4.707840e+08 0.031303 0.028602 1.437756 0.075137 \n", 1215 | "WMT 22707000.0 4.298380e+08 0.052827 0.114630 0.204448 0.201732 \n", 1216 | "WBA 3047000.0 5.167700e+07 0.058962 0.214712 0.475351 0.701641 \n", 1217 | "\n", 1218 | " DivYield \n", 1219 | "AAPL 0.0066 \n", 1220 | "CAT 0.0292 \n", 1221 | "CSCO 0.0343 \n", 1222 | "DOW 0.0607 \n", 1223 | "HD 0.0210 \n", 1224 | "IBM 0.0523 \n", 1225 | "INTC 0.0267 \n", 1226 | "JNJ 0.0266 \n", 1227 | "KO 0.0342 \n", 1228 | "MCD 0.0235 \n", 1229 | "MMM 0.0361 \n", 1230 | "MRK 0.0285 \n", 1231 | "MSFT 0.0094 \n", 1232 | "NKE 0.0088 \n", 1233 | "PFE 0.0396 \n", 1234 | "PG 0.0227 \n", 1235 | "UNH 0.0160 \n", 1236 | "VZ 0.0414 \n", 1237 | "V 0.0058 \n", 1238 | "WMT 0.0165 \n", 1239 | "WBA 0.0473 " 1240 | ] 1241 | }, 1242 | "execution_count": 13, 1243 | "metadata": {}, 1244 | "output_type": "execute_result" 1245 | } 1246 | ], 1247 | "source": [ 1248 | "final_stats_df" 1249 | ] 1250 | }, 1251 | { 1252 | "cell_type": "markdown", 1253 | "metadata": {}, 1254 | "source": [ 1255 | "#### We now have everything in place to apply the magic formula, let's do it!" 1256 | ] 1257 | }, 1258 | { 1259 | "cell_type": "markdown", 1260 | "metadata": {}, 1261 | "source": [ 1262 | "### Ranking using earning yield and ROC(Return on Capital)" 1263 | ] 1264 | }, 1265 | { 1266 | "cell_type": "code", 1267 | "execution_count": 15, 1268 | "metadata": {}, 1269 | "outputs": [ 1270 | { 1271 | "name": "stdout", 1272 | "output_type": "stream", 1273 | "text": [ 1274 | "------------------------------------------------\n", 1275 | "Value stocks based on Greenblatt's Magic Formula\n" 1276 | ] 1277 | }, 1278 | { 1279 | "data": { 1280 | "text/html": [ 1281 | "
\n", 1282 | "\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 | "
EarningYieldROCMagicFormulaRank
CSCO0.0821190.6814211.0
MRK0.0658620.7580232.0
PFE0.0581351.5470103.0
INTC0.1160630.4098584.0
KO0.0404202.2775965.0
VZ0.0876120.2887686.0
MMM0.0617130.4789107.0
PG0.0434191.0301858.0
IBM0.0545730.5690669.0
JNJ0.0482920.74881310.0
CAT0.0671490.23822411.0
WBA0.0589620.47535112.0
V0.0313031.43775613.0
HD0.0489110.56003414.0
UNH0.067603-2.26187315.0
AAPL0.0305900.71060216.0
DOW0.0634690.09601417.0
WMT0.0528270.20444818.0
MSFT0.0323860.32283819.0
MCD0.0374450.19369320.0
NKE0.0205490.17375821.0
\n", 1433 | "
" 1434 | ], 1435 | "text/plain": [ 1436 | " EarningYield ROC MagicFormulaRank\n", 1437 | "CSCO 0.082119 0.681421 1.0\n", 1438 | "MRK 0.065862 0.758023 2.0\n", 1439 | "PFE 0.058135 1.547010 3.0\n", 1440 | "INTC 0.116063 0.409858 4.0\n", 1441 | "KO 0.040420 2.277596 5.0\n", 1442 | "VZ 0.087612 0.288768 6.0\n", 1443 | "MMM 0.061713 0.478910 7.0\n", 1444 | "PG 0.043419 1.030185 8.0\n", 1445 | "IBM 0.054573 0.569066 9.0\n", 1446 | "JNJ 0.048292 0.748813 10.0\n", 1447 | "CAT 0.067149 0.238224 11.0\n", 1448 | "WBA 0.058962 0.475351 12.0\n", 1449 | "V 0.031303 1.437756 13.0\n", 1450 | "HD 0.048911 0.560034 14.0\n", 1451 | "UNH 0.067603 -2.261873 15.0\n", 1452 | "AAPL 0.030590 0.710602 16.0\n", 1453 | "DOW 0.063469 0.096014 17.0\n", 1454 | "WMT 0.052827 0.204448 18.0\n", 1455 | "MSFT 0.032386 0.322838 19.0\n", 1456 | "MCD 0.037445 0.193693 20.0\n", 1457 | "NKE 0.020549 0.173758 21.0" 1458 | ] 1459 | }, 1460 | "execution_count": 15, 1461 | "metadata": {}, 1462 | "output_type": "execute_result" 1463 | } 1464 | ], 1465 | "source": [ 1466 | "final_stats_val_df = final_stats_df.loc[stocks,:]\n", 1467 | "final_stats_val_df[\"CombRank\"] = final_stats_val_df[\"EarningYield\"].rank(ascending=False,na_option='bottom')+final_stats_val_df[\"ROC\"].rank(ascending=False,na_option='bottom')\n", 1468 | "final_stats_val_df[\"MagicFormulaRank\"] = final_stats_val_df[\"CombRank\"].rank(method='first')\n", 1469 | "value_stocks = final_stats_val_df.sort_values(\"MagicFormulaRank\").iloc[:,[2,4,8]]\n", 1470 | "print(\"------------------------------------------------\")\n", 1471 | "print(\"Value stocks based on Greenblatt's Magic Formula\")\n", 1472 | "df = value_stocks.fillna(0)\n", 1473 | "df" 1474 | ] 1475 | }, 1476 | { 1477 | "cell_type": "markdown", 1478 | "metadata": {}, 1479 | "source": [ 1480 | "Hmm, looks like Cisco, Merk Pharma and Pfizer are the top 3 picks, based on earning yield and ROC" 1481 | ] 1482 | }, 1483 | { 1484 | "cell_type": "markdown", 1485 | "metadata": {}, 1486 | "source": [ 1487 | "### Ranking using dividend yield(not included in Magic formula)\n", 1488 | "\n", 1489 | "Although I personally invest in stocks for value, not for dividends, they are an extra incentive sometimes! :)" 1490 | ] 1491 | }, 1492 | { 1493 | "cell_type": "code", 1494 | "execution_count": 17, 1495 | "metadata": {}, 1496 | "outputs": [ 1497 | { 1498 | "name": "stdout", 1499 | "output_type": "stream", 1500 | "text": [ 1501 | "------------------------------------------------\n", 1502 | "Highest dividend paying stocks\n" 1503 | ] 1504 | }, 1505 | { 1506 | "data": { 1507 | "text/html": [ 1508 | "
\n", 1509 | "\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 | "
DivYield
DOW0.0607
IBM0.0523
WBA0.0473
VZ0.0414
PFE0.0396
MMM0.0361
CSCO0.0343
KO0.0342
CAT0.0292
MRK0.0285
INTC0.0267
JNJ0.0266
MCD0.0235
PG0.0227
HD0.0210
WMT0.0165
UNH0.0160
MSFT0.0094
NKE0.0088
AAPL0.0066
V0.0058
\n", 1616 | "
" 1617 | ], 1618 | "text/plain": [ 1619 | " DivYield\n", 1620 | "DOW 0.0607\n", 1621 | "IBM 0.0523\n", 1622 | "WBA 0.0473\n", 1623 | "VZ 0.0414\n", 1624 | "PFE 0.0396\n", 1625 | "MMM 0.0361\n", 1626 | "CSCO 0.0343\n", 1627 | "KO 0.0342\n", 1628 | "CAT 0.0292\n", 1629 | "MRK 0.0285\n", 1630 | "INTC 0.0267\n", 1631 | "JNJ 0.0266\n", 1632 | "MCD 0.0235\n", 1633 | "PG 0.0227\n", 1634 | "HD 0.0210\n", 1635 | "WMT 0.0165\n", 1636 | "UNH 0.0160\n", 1637 | "MSFT 0.0094\n", 1638 | "NKE 0.0088\n", 1639 | "AAPL 0.0066\n", 1640 | "V 0.0058" 1641 | ] 1642 | }, 1643 | "execution_count": 17, 1644 | "metadata": {}, 1645 | "output_type": "execute_result" 1646 | } 1647 | ], 1648 | "source": [ 1649 | "high_dividend_stocks = final_stats_df.sort_values(\"DivYield\",ascending=False).iloc[:,6]\n", 1650 | "print(\"------------------------------------------------\")\n", 1651 | "print(\"Highest dividend paying stocks\")\n", 1652 | "high_dividend_stocks.to_frame()" 1653 | ] 1654 | }, 1655 | { 1656 | "cell_type": "markdown", 1657 | "metadata": {}, 1658 | "source": [ 1659 | "## Conclusion\n", 1660 | "\n", 1661 | "Combining both the magic formula and dividend yield.\n" 1662 | ] 1663 | }, 1664 | { 1665 | "cell_type": "code", 1666 | "execution_count": 18, 1667 | "metadata": {}, 1668 | "outputs": [ 1669 | { 1670 | "name": "stdout", 1671 | "output_type": "stream", 1672 | "text": [ 1673 | "------------------------------------------------\n", 1674 | "Magic Formula and Dividend Yield combined\n" 1675 | ] 1676 | }, 1677 | { 1678 | "data": { 1679 | "text/html": [ 1680 | "
\n", 1681 | "\n", 1694 | "\n", 1695 | " \n", 1696 | " \n", 1697 | " \n", 1698 | " \n", 1699 | " \n", 1700 | " \n", 1701 | " \n", 1702 | " \n", 1703 | " \n", 1704 | " \n", 1705 | " \n", 1706 | " \n", 1707 | " \n", 1708 | " \n", 1709 | " \n", 1710 | " \n", 1711 | " \n", 1712 | " \n", 1713 | " \n", 1714 | " \n", 1715 | " \n", 1716 | " \n", 1717 | " \n", 1718 | " \n", 1719 | " \n", 1720 | " \n", 1721 | " \n", 1722 | " \n", 1723 | " \n", 1724 | " \n", 1725 | " \n", 1726 | " \n", 1727 | " \n", 1728 | " \n", 1729 | " \n", 1730 | " \n", 1731 | " \n", 1732 | " \n", 1733 | " \n", 1734 | " \n", 1735 | " \n", 1736 | " \n", 1737 | " \n", 1738 | " \n", 1739 | " \n", 1740 | " \n", 1741 | " \n", 1742 | " \n", 1743 | " \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 | " \n", 1816 | " \n", 1817 | " \n", 1818 | " \n", 1819 | " \n", 1820 | " \n", 1821 | " \n", 1822 | " \n", 1823 | " \n", 1824 | " \n", 1825 | " \n", 1826 | " \n", 1827 | " \n", 1828 | " \n", 1829 | " \n", 1830 | " \n", 1831 | " \n", 1832 | " \n", 1833 | " \n", 1834 | " \n", 1835 | " \n", 1836 | " \n", 1837 | " \n", 1838 | " \n", 1839 | " \n", 1840 | " \n", 1841 | " \n", 1842 | " \n", 1843 | " \n", 1844 | " \n", 1845 | " \n", 1846 | " \n", 1847 | " \n", 1848 | " \n", 1849 | " \n", 1850 | " \n", 1851 | " \n", 1852 | " \n", 1853 | "
EarningYieldROCDivYieldCombinedRank
PFE0.0581351.5470100.03961.0
CSCO0.0821190.6814210.03432.0
MRK0.0658620.7580230.02853.0
VZ0.0876120.2887680.04144.0
IBM0.0545730.5690660.05235.0
WBA0.0589620.4753510.04736.0
INTC0.1160630.4098580.02677.0
KO0.0404202.2775960.03428.0
MMM0.0617130.4789100.03619.0
DOW0.0634690.0960140.060710.0
CAT0.0671490.2382240.029211.0
JNJ0.0482920.7488130.026612.0
PG0.0434191.0301850.022713.0
HD0.0489110.5600340.021014.0
UNH0.067603-2.2618730.016015.0
V0.0313031.4377560.005816.0
WMT0.0528270.2044480.016517.0
AAPL0.0305900.7106020.006618.0
MCD0.0374450.1936930.023519.0
MSFT0.0323860.3228380.009420.0
NKE0.0205490.1737580.008821.0
\n", 1854 | "
" 1855 | ], 1856 | "text/plain": [ 1857 | " EarningYield ROC DivYield CombinedRank\n", 1858 | "PFE 0.058135 1.547010 0.0396 1.0\n", 1859 | "CSCO 0.082119 0.681421 0.0343 2.0\n", 1860 | "MRK 0.065862 0.758023 0.0285 3.0\n", 1861 | "VZ 0.087612 0.288768 0.0414 4.0\n", 1862 | "IBM 0.054573 0.569066 0.0523 5.0\n", 1863 | "WBA 0.058962 0.475351 0.0473 6.0\n", 1864 | "INTC 0.116063 0.409858 0.0267 7.0\n", 1865 | "KO 0.040420 2.277596 0.0342 8.0\n", 1866 | "MMM 0.061713 0.478910 0.0361 9.0\n", 1867 | "DOW 0.063469 0.096014 0.0607 10.0\n", 1868 | "CAT 0.067149 0.238224 0.0292 11.0\n", 1869 | "JNJ 0.048292 0.748813 0.0266 12.0\n", 1870 | "PG 0.043419 1.030185 0.0227 13.0\n", 1871 | "HD 0.048911 0.560034 0.0210 14.0\n", 1872 | "UNH 0.067603 -2.261873 0.0160 15.0\n", 1873 | "V 0.031303 1.437756 0.0058 16.0\n", 1874 | "WMT 0.052827 0.204448 0.0165 17.0\n", 1875 | "AAPL 0.030590 0.710602 0.0066 18.0\n", 1876 | "MCD 0.037445 0.193693 0.0235 19.0\n", 1877 | "MSFT 0.032386 0.322838 0.0094 20.0\n", 1878 | "NKE 0.020549 0.173758 0.0088 21.0" 1879 | ] 1880 | }, 1881 | "execution_count": 18, 1882 | "metadata": {}, 1883 | "output_type": "execute_result" 1884 | } 1885 | ], 1886 | "source": [ 1887 | "final_stats_df[\"CombRank\"] = final_stats_df[\"EarningYield\"].rank(ascending=False,method='first') \\\n", 1888 | " +final_stats_df[\"ROC\"].rank(ascending=False,method='first') \\\n", 1889 | " +final_stats_df[\"DivYield\"].rank(ascending=False,method='first')\n", 1890 | "final_stats_df[\"CombinedRank\"] = final_stats_df[\"CombRank\"].rank(method='first')\n", 1891 | "value_high_div_stocks = final_stats_df.sort_values(\"CombinedRank\").iloc[:,[2,4,6,8]]\n", 1892 | "print(\"------------------------------------------------\")\n", 1893 | "print(\"Magic Formula and Dividend Yield combined\")\n", 1894 | "value_high_div_stocks" 1895 | ] 1896 | }, 1897 | { 1898 | "cell_type": "markdown", 1899 | "metadata": {}, 1900 | "source": [ 1901 | "#### With that we come to an end of this notebook, hope you liked it, please do not use these results to make actual investments, do your own research and make decisions based on that, happy investing! :)" 1902 | ] 1903 | } 1904 | ], 1905 | "metadata": { 1906 | "kernelspec": { 1907 | "display_name": "Python 3", 1908 | "language": "python", 1909 | "name": "python3" 1910 | }, 1911 | "language_info": { 1912 | "codemirror_mode": { 1913 | "name": "ipython", 1914 | "version": 3 1915 | }, 1916 | "file_extension": ".py", 1917 | "mimetype": "text/x-python", 1918 | "name": "python", 1919 | "nbconvert_exporter": "python", 1920 | "pygments_lexer": "ipython3", 1921 | "version": "3.6.10" 1922 | } 1923 | }, 1924 | "nbformat": 4, 1925 | "nbformat_minor": 4 1926 | } 1927 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/Value-Investing-Greenblatt-Formula-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Important information before proceeding" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "For some theoretical understanding, refer to README. Also, the magic formula by Greenblatt is known to work well only for US listed stocks, excluding insurance and finance companies(their financial statments are quite different from other companies).
\n", 15 | "\n", 16 | "Also, a disclaimer once again - **This is purely for educational and research purposes, I am in no way responsible for any monetary loss/gain you make using this, I highly encourage you to view this as a learning resource and not as an investment advice.**" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": {}, 23 | "outputs": [], 24 | "source": [ 25 | "import requests\n", 26 | "from bs4 import BeautifulSoup\n", 27 | "import pandas as pd" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 2, 33 | "metadata": {}, 34 | "outputs": [], 35 | "source": [ 36 | "# We will pick the 30 stocks listed in DOW Jones index, feel free to change these as per your requirement.\n", 37 | "stocks = [\"AXP\",\"AAPL\",\"BA\",\"CAT\",\"CVX\",\"CSCO\",\"DIS\",\"DOW\", \"XOM\",\n", 38 | " \"HD\",\"IBM\",\"INTC\",\"JNJ\",\"KO\",\"MCD\",\"MMM\",\"MRK\",\"MSFT\",\n", 39 | " \"NKE\",\"PFE\",\"PG\",\"TRV\",\"UTX\",\"UNH\",\"VZ\",\"V\",\"WMT\",\"WBA\"]" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "## Scraping data from Yahoo Finance" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 3, 52 | "metadata": {}, 53 | "outputs": [ 54 | { 55 | "name": "stdout", 56 | "output_type": "stream", 57 | "text": [ 58 | "Data successfully scraped for AXP\n", 59 | "Data successfully scraped for AAPL\n", 60 | "Data successfully scraped for BA\n", 61 | "Data successfully scraped for CAT\n", 62 | "Data successfully scraped for CVX\n", 63 | "Data successfully scraped for CSCO\n", 64 | "Data successfully scraped for DIS\n", 65 | "Data successfully scraped for DOW\n", 66 | "Data successfully scraped for XOM\n", 67 | "Data successfully scraped for HD\n", 68 | "Data successfully scraped for IBM\n", 69 | "Data successfully scraped for INTC\n", 70 | "Data successfully scraped for JNJ\n", 71 | "Data successfully scraped for KO\n", 72 | "Data successfully scraped for MCD\n", 73 | "Data successfully scraped for MMM\n", 74 | "Data successfully scraped for MRK\n", 75 | "Data successfully scraped for MSFT\n", 76 | "Data successfully scraped for NKE\n", 77 | "Data successfully scraped for PFE\n", 78 | "Data successfully scraped for PG\n", 79 | "Data successfully scraped for TRV\n", 80 | "Data successfully scraped for UTX\n", 81 | "Data successfully scraped for UNH\n", 82 | "Data successfully scraped for VZ\n", 83 | "Data successfully scraped for V\n", 84 | "Data successfully scraped for WMT\n", 85 | "Data successfully scraped for WBA\n", 86 | "All data webscraped\n" 87 | ] 88 | } 89 | ], 90 | "source": [ 91 | "# Dictionary to hold information for each stock/ticker\n", 92 | "financial_dir = {}\n", 93 | "\n", 94 | "for ticker in stocks:\n", 95 | " try:\n", 96 | " #getting balance sheet data from yahoo finance for the given ticker\n", 97 | " temp_dir = {}\n", 98 | " url = 'https://in.finance.yahoo.com/quote/'+ticker+'/balance-sheet?p='+ticker\n", 99 | " page = requests.get(url)\n", 100 | " page_content = page.content\n", 101 | " soup = BeautifulSoup(page_content,'html.parser')\n", 102 | " tabl = soup.find_all(\"div\", {\"class\" : \"M(0) Whs(n) BdEnd Bdc($seperatorColor) D(itb)\"})\n", 103 | " for t in tabl:\n", 104 | " rows = t.find_all(\"div\", {\"class\" : \"rw-expnded\"})\n", 105 | " for row in rows:\n", 106 | " temp_dir[row.get_text(separator='|').split(\"|\")[0]]=row.get_text(separator='|').split(\"|\")[1]\n", 107 | " \n", 108 | " #getting income statement data from yahoo finance for the given ticker\n", 109 | " url = 'https://in.finance.yahoo.com/quote/'+ticker+'/financials?p='+ticker\n", 110 | " page = requests.get(url)\n", 111 | " page_content = page.content\n", 112 | " soup = BeautifulSoup(page_content,'html.parser')\n", 113 | " tabl = soup.find_all(\"div\", {\"class\" : \"M(0) Whs(n) BdEnd Bdc($seperatorColor) D(itb)\"})\n", 114 | " for t in tabl:\n", 115 | " rows = t.find_all(\"div\", {\"class\" : \"rw-expnded\"})\n", 116 | " for row in rows:\n", 117 | " temp_dir[row.get_text(separator='|').split(\"|\")[0]]=row.get_text(separator='|').split(\"|\")[1]\n", 118 | " \n", 119 | " #getting cashflow statement data from yahoo finance for the given ticker\n", 120 | " url = 'https://in.finance.yahoo.com/quote/'+ticker+'/cash-flow?p='+ticker\n", 121 | " page = requests.get(url)\n", 122 | " page_content = page.content\n", 123 | " soup = BeautifulSoup(page_content,'html.parser')\n", 124 | " tabl = soup.find_all(\"div\", {\"class\" : \"M(0) Whs(n) BdEnd Bdc($seperatorColor) D(itb)\"})\n", 125 | " for t in tabl:\n", 126 | " rows = t.find_all(\"div\", {\"class\" : \"rw-expnded\"})\n", 127 | " for row in rows:\n", 128 | " temp_dir[row.get_text(separator='|').split(\"|\")[0]]=row.get_text(separator='|').split(\"|\")[1]\n", 129 | " \n", 130 | " #getting key statistics data from yahoo finance for the given ticker\n", 131 | " url = 'https://in.finance.yahoo.com/quote/'+ticker+'/key-statistics?p='+ticker\n", 132 | " page = requests.get(url)\n", 133 | " page_content = page.content\n", 134 | " soup = BeautifulSoup(page_content,'html.parser')\n", 135 | " tabl = soup.findAll(\"table\", {\"class\": \"W(100%) Bdcl(c)\"}) \n", 136 | " for t in tabl:\n", 137 | " rows = t.find_all(\"tr\")\n", 138 | " for row in rows:\n", 139 | " if len(row.get_text(separator='|').split(\"|\")[0:2])>0:\n", 140 | " temp_dir[row.get_text(separator='|').split(\"|\")[0]]=row.get_text(separator='|').split(\"|\")[-1] \n", 141 | " \n", 142 | "\n", 143 | " #combining all extracted information with the corresponding ticker into the dictionary\n", 144 | " financial_dir[ticker] = temp_dir\n", 145 | " print(\"Data successfully scraped for \", ticker)\n", 146 | " except:\n", 147 | " print(\"Problem scraping data for \",ticker)\n", 148 | "print('All data webscraped')" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": 4, 154 | "metadata": {}, 155 | "outputs": [], 156 | "source": [ 157 | "# Storing the scraped info to a Dataframe\n", 158 | "combined_financials = pd.DataFrame(financial_dir)\n", 159 | "combined_financials.dropna(how='all',axis=1,inplace=True) #dropping columns with all Null values\n", 160 | "tickers = combined_financials.columns #updating the tickers list based on only those tickers whose values were successfully extracted\n", 161 | "for ticker in stocks:\n", 162 | " combined_financials = combined_financials[~combined_financials[ticker].str.contains(\"[a-z]\").fillna(False)]" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": 5, 168 | "metadata": {}, 169 | "outputs": [ 170 | { 171 | "data": { 172 | "text/html": [ 173 | "
\n", 174 | "\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 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | "
AXPAAPLBACATCVXCSCODISDOWXOMHD...NKEPFEPGTRVUTXUNHVZVWMTWBA
Total assets19,83,21,00033,85,16,00013,36,25,0007,84,53,00023,74,28,0009,48,53,00019,39,84,0006,05,24,00036,25,97,0005,12,36,000...3,13,42,00016,74,89,00012,07,00,00011,01,22,00013,97,16,00017,38,89,00029,17,27,0007,25,74,00023,64,95,0006,75,98,000
Total liabilities17,52,50,00024,80,28,00014,19,25,0006,38,24,0009,22,20,0005,69,33,00010,00,95,0004,64,30,00016,36,59,0005,43,52,000...2,32,87,00010,40,42,0007,38,22,0008,41,79,0009,54,85,00011,34,53,00022,88,92,0003,78,90,00015,49,43,0004,34,46,000
Common stock1,63,0004,51,74,00050,61,00059,35,00018,32,000-5,39,07,0008,0001,56,37,00089,000...3,0004,85,00049,06,0002,34,69,0002,30,19,0009,0004,29,00054,62,0002,84,00012,000
Retained earnings1,38,71,0004,58,98,0005,06,44,0003,44,37,00017,49,45,000-4,24,94,0001,70,45,00042,13,41,0005,17,29,000...-1,91,0009,76,70,00010,02,39,0003,69,77,0006,15,94,0006,11,78,0005,31,47,0001,35,02,0008,39,43,0003,58,15,000
Accumulated other comprehensive income-27,37,000-5,84,000-1,61,53,000-15,67,000-52,30,000--66,17,000-1,02,46,000-1,94,93,000-7,39,000...-56,000-1,16,40,000-1,72,45,0006,40,000-1,01,49,000-35,78,0009,98,000-6,50,000-1,28,05,000-38,97,000
\n", 337 | "

5 rows × 28 columns

\n", 338 | "
" 339 | ], 340 | "text/plain": [ 341 | " AXP AAPL \\\n", 342 | "Total assets 19,83,21,000 33,85,16,000 \n", 343 | "Total liabilities 17,52,50,000 24,80,28,000 \n", 344 | "Common stock 1,63,000 4,51,74,000 \n", 345 | "Retained earnings 1,38,71,000 4,58,98,000 \n", 346 | "Accumulated other comprehensive income -27,37,000 -5,84,000 \n", 347 | "\n", 348 | " BA CAT \\\n", 349 | "Total assets 13,36,25,000 7,84,53,000 \n", 350 | "Total liabilities 14,19,25,000 6,38,24,000 \n", 351 | "Common stock 50,61,000 59,35,000 \n", 352 | "Retained earnings 5,06,44,000 3,44,37,000 \n", 353 | "Accumulated other comprehensive income -1,61,53,000 -15,67,000 \n", 354 | "\n", 355 | " CVX CSCO \\\n", 356 | "Total assets 23,74,28,000 9,48,53,000 \n", 357 | "Total liabilities 9,22,20,000 5,69,33,000 \n", 358 | "Common stock 18,32,000 - \n", 359 | "Retained earnings 17,49,45,000 - \n", 360 | "Accumulated other comprehensive income -52,30,000 - \n", 361 | "\n", 362 | " DIS DOW \\\n", 363 | "Total assets 19,39,84,000 6,05,24,000 \n", 364 | "Total liabilities 10,00,95,000 4,64,30,000 \n", 365 | "Common stock 5,39,07,000 8,000 \n", 366 | "Retained earnings 4,24,94,000 1,70,45,000 \n", 367 | "Accumulated other comprehensive income -66,17,000 -1,02,46,000 \n", 368 | "\n", 369 | " XOM HD ... \\\n", 370 | "Total assets 36,25,97,000 5,12,36,000 ... \n", 371 | "Total liabilities 16,36,59,000 5,43,52,000 ... \n", 372 | "Common stock 1,56,37,000 89,000 ... \n", 373 | "Retained earnings 42,13,41,000 5,17,29,000 ... \n", 374 | "Accumulated other comprehensive income -1,94,93,000 -7,39,000 ... \n", 375 | "\n", 376 | " NKE PFE \\\n", 377 | "Total assets 3,13,42,000 16,74,89,000 \n", 378 | "Total liabilities 2,32,87,000 10,40,42,000 \n", 379 | "Common stock 3,000 4,85,000 \n", 380 | "Retained earnings -1,91,000 9,76,70,000 \n", 381 | "Accumulated other comprehensive income -56,000 -1,16,40,000 \n", 382 | "\n", 383 | " PG TRV \\\n", 384 | "Total assets 12,07,00,000 11,01,22,000 \n", 385 | "Total liabilities 7,38,22,000 8,41,79,000 \n", 386 | "Common stock 49,06,000 2,34,69,000 \n", 387 | "Retained earnings 10,02,39,000 3,69,77,000 \n", 388 | "Accumulated other comprehensive income -1,72,45,000 6,40,000 \n", 389 | "\n", 390 | " UTX UNH \\\n", 391 | "Total assets 13,97,16,000 17,38,89,000 \n", 392 | "Total liabilities 9,54,85,000 11,34,53,000 \n", 393 | "Common stock 2,30,19,000 9,000 \n", 394 | "Retained earnings 6,15,94,000 6,11,78,000 \n", 395 | "Accumulated other comprehensive income -1,01,49,000 -35,78,000 \n", 396 | "\n", 397 | " VZ V \\\n", 398 | "Total assets 29,17,27,000 7,25,74,000 \n", 399 | "Total liabilities 22,88,92,000 3,78,90,000 \n", 400 | "Common stock 4,29,000 54,62,000 \n", 401 | "Retained earnings 5,31,47,000 1,35,02,000 \n", 402 | "Accumulated other comprehensive income 9,98,000 -6,50,000 \n", 403 | "\n", 404 | " WMT WBA \n", 405 | "Total assets 23,64,95,000 6,75,98,000 \n", 406 | "Total liabilities 15,49,43,000 4,34,46,000 \n", 407 | "Common stock 2,84,000 12,000 \n", 408 | "Retained earnings 8,39,43,000 3,58,15,000 \n", 409 | "Accumulated other comprehensive income -1,28,05,000 -38,97,000 \n", 410 | "\n", 411 | "[5 rows x 28 columns]" 412 | ] 413 | }, 414 | "execution_count": 5, 415 | "metadata": {}, 416 | "output_type": "execute_result" 417 | } 418 | ], 419 | "source": [ 420 | "combined_financials.head()" 421 | ] 422 | }, 423 | { 424 | "cell_type": "code", 425 | "execution_count": 6, 426 | "metadata": {}, 427 | "outputs": [], 428 | "source": [ 429 | "# Required stats for the magic formula\n", 430 | "stats = [\"EBITDA\",\n", 431 | " \"Depreciation & amortisation\",\n", 432 | " \"Market cap (intra-day)\",\n", 433 | " \"Net income available to common shareholders\",\n", 434 | " \"Net cash provided by operating activities\",\n", 435 | " \"Capital expenditure\",\n", 436 | " \"Total current assets\",\n", 437 | " \"Total current liabilities\",\n", 438 | " \"Net property, plant and equipment\",\n", 439 | " \"Total stockholders' equity\",\n", 440 | " \"Long-term debt\",\n", 441 | " \"Forward annual dividend yield\"]\n", 442 | "\n", 443 | "# Short hands for above to keep things simple\n", 444 | "indx = [\"EBITDA\",\"D&A\",\"MarketCap\",\"NetIncome\",\"CashFlowOps\",\"Capex\",\"CurrAsset\",\n", 445 | " \"CurrLiab\",\"PPE\",\"BookValue\",\"TotDebt\",\"DivYield\"]" 446 | ] 447 | }, 448 | { 449 | "cell_type": "code", 450 | "execution_count": 7, 451 | "metadata": {}, 452 | "outputs": [], 453 | "source": [ 454 | "all_stats = {}\n", 455 | "for ticker in stocks:\n", 456 | " try:\n", 457 | " temp = combined_financials[ticker]\n", 458 | " ticker_stats = []\n", 459 | " for stat in stats:\n", 460 | " ticker_stats.append(temp.loc[stat])\n", 461 | " all_stats['{}'.format(ticker)] = ticker_stats\n", 462 | " except:\n", 463 | " print(\"Can't read data for \",ticker)" 464 | ] 465 | }, 466 | { 467 | "cell_type": "markdown", 468 | "metadata": {}, 469 | "source": [ 470 | "### Combining everything into one single dataframe with all required stats and some data cleaning\n" 471 | ] 472 | }, 473 | { 474 | "cell_type": "code", 475 | "execution_count": 8, 476 | "metadata": {}, 477 | "outputs": [], 478 | "source": [ 479 | "all_stats_df = pd.DataFrame(all_stats,index=indx)\n", 480 | "all_stats_df[tickers] = all_stats_df[tickers].replace({',': ''}, regex=True)\n", 481 | "all_stats_df[tickers] = all_stats_df[tickers].replace({'M': 'E+03'}, regex=True)\n", 482 | "all_stats_df[tickers] = all_stats_df[tickers].replace({'B': 'E+06'}, regex=True)\n", 483 | "all_stats_df[tickers] = all_stats_df[tickers].replace({'T': 'E+09'}, regex=True)\n", 484 | "all_stats_df[tickers] = all_stats_df[tickers].replace({'%': 'E-02'}, regex=True)\n", 485 | "for ticker in all_stats_df.columns:\n", 486 | " all_stats_df[ticker] = pd.to_numeric(all_stats_df[ticker].values,errors='coerce')\n", 487 | "all_stats_df.dropna(axis=1,inplace=True)\n", 488 | "\n", 489 | "stocks = all_stats_df.columns" 490 | ] 491 | }, 492 | { 493 | "cell_type": "code", 494 | "execution_count": 11, 495 | "metadata": {}, 496 | "outputs": [ 497 | { 498 | "data": { 499 | "text/html": [ 500 | "
\n", 501 | "\n", 514 | "\n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | "
AAPLCATCSCODOWHDIBMINTCJNJKOMCD...MRKMSFTNKEPFEPGUNHVZVWMTWBA
EBITDA7.867000e+078.580000e+061.591000e+075.680000e+061.910000e+071.558000e+073.812000e+072.721000e+071.125000e+078.910000e+06...1.905000e+076.526000e+074.230000e+062.005000e+071.919000e+072.649000e+074.751000e+071.548000e+073.382000e+075.020000e+06
D&A1.153300e+072.511000e+061.808000e+062.876000e+062.411000e+066.632000e+061.176000e+077.016000e+061.511000e+061.674000e+06...3.650000e+061.279600e+077.140000e+055.406000e+063.013000e+062.867000e+061.655000e+077.430000e+051.111300e+071.973000e+06
MarketCap2.160000e+097.680000e+071.783900e+083.434000e+073.139800e+081.105800e+082.107400e+084.009800e+082.068700e+081.590600e+08...2.163500e+081.670000e+091.739700e+082.114400e+083.440500e+082.934800e+082.460500e+084.616100e+083.701400e+083.351000e+07
NetIncome5.842400e+074.142000e+061.121400e+07-1.976000e+061.182700e+077.878000e+062.366100e+071.518500e+079.189000e+064.770800e+06...1.047900e+074.428100e+074.304000e+061.417100e+071.276400e+071.709800e+071.914500e+071.248200e+071.789500e+077.600000e+05
CashFlowOps8.000800e+075.724000e+061.542600e+076.503000e+062.005500e+071.512200e+073.791400e+072.073500e+078.756000e+065.508900e+06...1.309400e+076.067500e+074.996000e+061.496700e+071.740300e+072.230100e+074.346200e+071.238600e+073.302600e+075.777000e+06
Capex-8.302000e+06-2.442000e+06-7.700000e+05-1.717000e+06-2.464000e+06-2.996000e+06-1.601400e+07-3.292000e+06-1.823000e+06-2.068100e+06...-3.750000e+06-1.544100e+07-1.086000e+06-2.363000e+06-3.073000e+06-2.014000e+06-2.232200e+07-8.170000e+05-9.403000e+06-1.418000e+06
CurrAsset1.628190e+083.919300e+074.357300e+071.681500e+071.981000e+073.842000e+073.123900e+074.527400e+072.041100e+073.557900e+06...2.748300e+071.819150e+082.055600e+073.280300e+072.798700e+074.263400e+073.747300e+072.097000e+076.180600e+071.870000e+07
CurrLiab1.057180e+082.662100e+072.533100e+071.067900e+071.837500e+073.770100e+072.231000e+073.596400e+072.697300e+073.621000e+06...2.222000e+077.231000e+078.284000e+063.730400e+073.297600e+076.178200e+074.486800e+071.341500e+077.779000e+072.576900e+07
PPE3.737800e+071.290400e+072.453000e+062.306800e+072.836500e+071.500500e+075.538600e+071.765800e+071.083800e+073.742120e+07...1.505300e+075.290400e+077.963000e+061.396700e+072.069200e+078.704000e+061.146090e+082.695000e+061.270490e+081.347900e+07
BookValue9.048800e+071.458800e+073.792000e+071.354100e+07-3.116000e+062.084100e+077.765900e+075.947100e+071.898100e+07-8.210300e+06...2.590700e+071.183040e+088.055000e+066.314300e+074.652100e+075.761600e+076.139500e+073.468400e+077.466900e+072.351200e+07
TotDebt9.180700e+072.615300e+071.157800e+071.597500e+072.867000e+075.410200e+072.530800e+072.649400e+072.751600e+073.411810e+07...2.273600e+075.957800e+079.406000e+063.595500e+072.353700e+073.680800e+079.993200e+071.672900e+074.371400e+071.109800e+07
DivYield6.600000e-032.920000e-023.430000e-026.070000e-022.100000e-025.230000e-022.670000e-022.660000e-023.420000e-022.350000e-02...2.850000e-029.400000e-038.800000e-033.960000e-022.270000e-021.600000e-024.140000e-025.800000e-031.650000e-024.730000e-02
\n", 832 | "

12 rows × 21 columns

\n", 833 | "
" 834 | ], 835 | "text/plain": [ 836 | " AAPL CAT CSCO DOW \\\n", 837 | "EBITDA 7.867000e+07 8.580000e+06 1.591000e+07 5.680000e+06 \n", 838 | "D&A 1.153300e+07 2.511000e+06 1.808000e+06 2.876000e+06 \n", 839 | "MarketCap 2.160000e+09 7.680000e+07 1.783900e+08 3.434000e+07 \n", 840 | "NetIncome 5.842400e+07 4.142000e+06 1.121400e+07 -1.976000e+06 \n", 841 | "CashFlowOps 8.000800e+07 5.724000e+06 1.542600e+07 6.503000e+06 \n", 842 | "Capex -8.302000e+06 -2.442000e+06 -7.700000e+05 -1.717000e+06 \n", 843 | "CurrAsset 1.628190e+08 3.919300e+07 4.357300e+07 1.681500e+07 \n", 844 | "CurrLiab 1.057180e+08 2.662100e+07 2.533100e+07 1.067900e+07 \n", 845 | "PPE 3.737800e+07 1.290400e+07 2.453000e+06 2.306800e+07 \n", 846 | "BookValue 9.048800e+07 1.458800e+07 3.792000e+07 1.354100e+07 \n", 847 | "TotDebt 9.180700e+07 2.615300e+07 1.157800e+07 1.597500e+07 \n", 848 | "DivYield 6.600000e-03 2.920000e-02 3.430000e-02 6.070000e-02 \n", 849 | "\n", 850 | " HD IBM INTC JNJ \\\n", 851 | "EBITDA 1.910000e+07 1.558000e+07 3.812000e+07 2.721000e+07 \n", 852 | "D&A 2.411000e+06 6.632000e+06 1.176000e+07 7.016000e+06 \n", 853 | "MarketCap 3.139800e+08 1.105800e+08 2.107400e+08 4.009800e+08 \n", 854 | "NetIncome 1.182700e+07 7.878000e+06 2.366100e+07 1.518500e+07 \n", 855 | "CashFlowOps 2.005500e+07 1.512200e+07 3.791400e+07 2.073500e+07 \n", 856 | "Capex -2.464000e+06 -2.996000e+06 -1.601400e+07 -3.292000e+06 \n", 857 | "CurrAsset 1.981000e+07 3.842000e+07 3.123900e+07 4.527400e+07 \n", 858 | "CurrLiab 1.837500e+07 3.770100e+07 2.231000e+07 3.596400e+07 \n", 859 | "PPE 2.836500e+07 1.500500e+07 5.538600e+07 1.765800e+07 \n", 860 | "BookValue -3.116000e+06 2.084100e+07 7.765900e+07 5.947100e+07 \n", 861 | "TotDebt 2.867000e+07 5.410200e+07 2.530800e+07 2.649400e+07 \n", 862 | "DivYield 2.100000e-02 5.230000e-02 2.670000e-02 2.660000e-02 \n", 863 | "\n", 864 | " KO MCD ... MRK MSFT \\\n", 865 | "EBITDA 1.125000e+07 8.910000e+06 ... 1.905000e+07 6.526000e+07 \n", 866 | "D&A 1.511000e+06 1.674000e+06 ... 3.650000e+06 1.279600e+07 \n", 867 | "MarketCap 2.068700e+08 1.590600e+08 ... 2.163500e+08 1.670000e+09 \n", 868 | "NetIncome 9.189000e+06 4.770800e+06 ... 1.047900e+07 4.428100e+07 \n", 869 | "CashFlowOps 8.756000e+06 5.508900e+06 ... 1.309400e+07 6.067500e+07 \n", 870 | "Capex -1.823000e+06 -2.068100e+06 ... -3.750000e+06 -1.544100e+07 \n", 871 | "CurrAsset 2.041100e+07 3.557900e+06 ... 2.748300e+07 1.819150e+08 \n", 872 | "CurrLiab 2.697300e+07 3.621000e+06 ... 2.222000e+07 7.231000e+07 \n", 873 | "PPE 1.083800e+07 3.742120e+07 ... 1.505300e+07 5.290400e+07 \n", 874 | "BookValue 1.898100e+07 -8.210300e+06 ... 2.590700e+07 1.183040e+08 \n", 875 | "TotDebt 2.751600e+07 3.411810e+07 ... 2.273600e+07 5.957800e+07 \n", 876 | "DivYield 3.420000e-02 2.350000e-02 ... 2.850000e-02 9.400000e-03 \n", 877 | "\n", 878 | " NKE PFE PG UNH \\\n", 879 | "EBITDA 4.230000e+06 2.005000e+07 1.919000e+07 2.649000e+07 \n", 880 | "D&A 7.140000e+05 5.406000e+06 3.013000e+06 2.867000e+06 \n", 881 | "MarketCap 1.739700e+08 2.114400e+08 3.440500e+08 2.934800e+08 \n", 882 | "NetIncome 4.304000e+06 1.417100e+07 1.276400e+07 1.709800e+07 \n", 883 | "CashFlowOps 4.996000e+06 1.496700e+07 1.740300e+07 2.230100e+07 \n", 884 | "Capex -1.086000e+06 -2.363000e+06 -3.073000e+06 -2.014000e+06 \n", 885 | "CurrAsset 2.055600e+07 3.280300e+07 2.798700e+07 4.263400e+07 \n", 886 | "CurrLiab 8.284000e+06 3.730400e+07 3.297600e+07 6.178200e+07 \n", 887 | "PPE 7.963000e+06 1.396700e+07 2.069200e+07 8.704000e+06 \n", 888 | "BookValue 8.055000e+06 6.314300e+07 4.652100e+07 5.761600e+07 \n", 889 | "TotDebt 9.406000e+06 3.595500e+07 2.353700e+07 3.680800e+07 \n", 890 | "DivYield 8.800000e-03 3.960000e-02 2.270000e-02 1.600000e-02 \n", 891 | "\n", 892 | " VZ V WMT WBA \n", 893 | "EBITDA 4.751000e+07 1.548000e+07 3.382000e+07 5.020000e+06 \n", 894 | "D&A 1.655000e+07 7.430000e+05 1.111300e+07 1.973000e+06 \n", 895 | "MarketCap 2.460500e+08 4.616100e+08 3.701400e+08 3.351000e+07 \n", 896 | "NetIncome 1.914500e+07 1.248200e+07 1.789500e+07 7.600000e+05 \n", 897 | "CashFlowOps 4.346200e+07 1.238600e+07 3.302600e+07 5.777000e+06 \n", 898 | "Capex -2.232200e+07 -8.170000e+05 -9.403000e+06 -1.418000e+06 \n", 899 | "CurrAsset 3.747300e+07 2.097000e+07 6.180600e+07 1.870000e+07 \n", 900 | "CurrLiab 4.486800e+07 1.341500e+07 7.779000e+07 2.576900e+07 \n", 901 | "PPE 1.146090e+08 2.695000e+06 1.270490e+08 1.347900e+07 \n", 902 | "BookValue 6.139500e+07 3.468400e+07 7.466900e+07 2.351200e+07 \n", 903 | "TotDebt 9.993200e+07 1.672900e+07 4.371400e+07 1.109800e+07 \n", 904 | "DivYield 4.140000e-02 5.800000e-03 1.650000e-02 4.730000e-02 \n", 905 | "\n", 906 | "[12 rows x 21 columns]" 907 | ] 908 | }, 909 | "execution_count": 11, 910 | "metadata": {}, 911 | "output_type": "execute_result" 912 | } 913 | ], 914 | "source": [ 915 | "all_stats_df" 916 | ] 917 | }, 918 | { 919 | "cell_type": "markdown", 920 | "metadata": {}, 921 | "source": [ 922 | "## Calculation of some metrics for the formula using above information" 923 | ] 924 | }, 925 | { 926 | "cell_type": "code", 927 | "execution_count": 12, 928 | "metadata": {}, 929 | "outputs": [], 930 | "source": [ 931 | "transpose_df = all_stats_df.transpose()\n", 932 | "final_stats_df = pd.DataFrame()\n", 933 | "final_stats_df[\"EBIT\"] = transpose_df[\"EBITDA\"] - transpose_df[\"D&A\"]\n", 934 | "final_stats_df[\"TEV\"] = transpose_df[\"MarketCap\"].fillna(0) \\\n", 935 | " +transpose_df[\"TotDebt\"].fillna(0) \\\n", 936 | " -(transpose_df[\"CurrAsset\"].fillna(0)-transpose_df[\"CurrLiab\"].fillna(0))\n", 937 | "final_stats_df[\"EarningYield\"] = final_stats_df[\"EBIT\"]/final_stats_df[\"TEV\"]\n", 938 | "final_stats_df[\"FCFYield\"] = (transpose_df[\"CashFlowOps\"]-transpose_df[\"Capex\"])/transpose_df[\"MarketCap\"]\n", 939 | "final_stats_df[\"ROC\"] = (transpose_df[\"EBITDA\"] - transpose_df[\"D&A\"])/(transpose_df[\"PPE\"]+transpose_df[\"CurrAsset\"]-transpose_df[\"CurrLiab\"])\n", 940 | "final_stats_df[\"BookToMkt\"] = transpose_df[\"BookValue\"]/transpose_df[\"MarketCap\"]\n", 941 | "final_stats_df[\"DivYield\"] = transpose_df[\"DivYield\"]" 942 | ] 943 | }, 944 | { 945 | "cell_type": "code", 946 | "execution_count": 13, 947 | "metadata": {}, 948 | "outputs": [ 949 | { 950 | "data": { 951 | "text/html": [ 952 | "
\n", 953 | "\n", 966 | "\n", 967 | " \n", 968 | " \n", 969 | " \n", 970 | " \n", 971 | " \n", 972 | " \n", 973 | " \n", 974 | " \n", 975 | " \n", 976 | " \n", 977 | " \n", 978 | " \n", 979 | " \n", 980 | " \n", 981 | " \n", 982 | " \n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | " \n", 1030 | " \n", 1031 | " \n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | " \n", 1036 | " \n", 1037 | " \n", 1038 | " \n", 1039 | " \n", 1040 | " \n", 1041 | " \n", 1042 | " \n", 1043 | " \n", 1044 | " \n", 1045 | " \n", 1046 | " \n", 1047 | " \n", 1048 | " \n", 1049 | " \n", 1050 | " \n", 1051 | " \n", 1052 | " \n", 1053 | " \n", 1054 | " \n", 1055 | " \n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | " \n", 1066 | " \n", 1067 | " \n", 1068 | " \n", 1069 | " \n", 1070 | " \n", 1071 | " \n", 1072 | " \n", 1073 | " \n", 1074 | " \n", 1075 | " \n", 1076 | " \n", 1077 | " \n", 1078 | " \n", 1079 | " \n", 1080 | " \n", 1081 | " \n", 1082 | " \n", 1083 | " \n", 1084 | " \n", 1085 | " \n", 1086 | " \n", 1087 | " \n", 1088 | " \n", 1089 | " \n", 1090 | " \n", 1091 | " \n", 1092 | " \n", 1093 | " \n", 1094 | " \n", 1095 | " \n", 1096 | " \n", 1097 | " \n", 1098 | " \n", 1099 | " \n", 1100 | " \n", 1101 | " \n", 1102 | " \n", 1103 | " \n", 1104 | " \n", 1105 | " \n", 1106 | " \n", 1107 | " \n", 1108 | " \n", 1109 | " \n", 1110 | " \n", 1111 | " \n", 1112 | " \n", 1113 | " \n", 1114 | " \n", 1115 | " \n", 1116 | " \n", 1117 | " \n", 1118 | " \n", 1119 | " \n", 1120 | " \n", 1121 | " \n", 1122 | " \n", 1123 | " \n", 1124 | " \n", 1125 | " \n", 1126 | " \n", 1127 | " \n", 1128 | " \n", 1129 | " \n", 1130 | " \n", 1131 | " \n", 1132 | " \n", 1133 | " \n", 1134 | " \n", 1135 | " \n", 1136 | " \n", 1137 | " \n", 1138 | " \n", 1139 | " \n", 1140 | " \n", 1141 | " \n", 1142 | " \n", 1143 | " \n", 1144 | " \n", 1145 | " \n", 1146 | " \n", 1147 | " \n", 1148 | " \n", 1149 | " \n", 1150 | " \n", 1151 | " \n", 1152 | " \n", 1153 | " \n", 1154 | " \n", 1155 | " \n", 1156 | " \n", 1157 | " \n", 1158 | " \n", 1159 | " \n", 1160 | " \n", 1161 | " \n", 1162 | " \n", 1163 | " \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 | "
EBITTEVEarningYieldFCFYieldROCBookToMktDivYield
AAPL67137000.02.194706e+090.0305900.0408840.7106020.0418930.0066
CAT6069000.09.038100e+070.0671490.1063280.2382240.1899480.0292
CSCO14102000.01.717260e+080.0821190.0907900.6814210.2125680.0343
DOW2804000.04.417900e+070.0634690.2393710.0960140.3943210.0607
HD16689000.03.412150e+080.0489110.0717210.560034-0.0099240.0210
IBM8948000.01.639630e+080.0545730.1638450.5690660.1884700.0523
INTC26360000.02.271190e+080.1160630.2558980.4098580.3685060.0267
JNJ20194000.04.181640e+080.0482920.0599210.7488130.1483140.0266
KO9739000.02.409480e+080.0404200.0511382.2775960.0917530.0342
MCD7236000.01.932412e+080.0374450.0476360.193693-0.0516180.0235
MMM6676000.01.081790e+080.0617130.0961340.4789100.1065880.0361
MRK15400000.02.338230e+080.0658620.0778550.7580230.1197460.0285
MSFT52464000.01.619973e+090.0323860.0455780.3228380.0708410.0094
NKE3516000.01.711040e+080.0205490.0349600.1737580.0463010.0088
PFE14644000.02.518960e+080.0581350.0819621.5470100.2986330.0396
PG16177000.03.725760e+080.0434190.0595151.0301850.1352160.0227
UNH23623000.03.494360e+080.0676030.082851-2.2618730.1963200.0160
VZ30960000.03.533770e+080.0876120.2673600.2887680.2495220.0414
V14737000.04.707840e+080.0313030.0286021.4377560.0751370.0058
WMT22707000.04.298380e+080.0528270.1146300.2044480.2017320.0165
WBA3047000.05.167700e+070.0589620.2147120.4753510.7016410.0473
\n", 1192 | "
" 1193 | ], 1194 | "text/plain": [ 1195 | " EBIT TEV EarningYield FCFYield ROC BookToMkt \\\n", 1196 | "AAPL 67137000.0 2.194706e+09 0.030590 0.040884 0.710602 0.041893 \n", 1197 | "CAT 6069000.0 9.038100e+07 0.067149 0.106328 0.238224 0.189948 \n", 1198 | "CSCO 14102000.0 1.717260e+08 0.082119 0.090790 0.681421 0.212568 \n", 1199 | "DOW 2804000.0 4.417900e+07 0.063469 0.239371 0.096014 0.394321 \n", 1200 | "HD 16689000.0 3.412150e+08 0.048911 0.071721 0.560034 -0.009924 \n", 1201 | "IBM 8948000.0 1.639630e+08 0.054573 0.163845 0.569066 0.188470 \n", 1202 | "INTC 26360000.0 2.271190e+08 0.116063 0.255898 0.409858 0.368506 \n", 1203 | "JNJ 20194000.0 4.181640e+08 0.048292 0.059921 0.748813 0.148314 \n", 1204 | "KO 9739000.0 2.409480e+08 0.040420 0.051138 2.277596 0.091753 \n", 1205 | "MCD 7236000.0 1.932412e+08 0.037445 0.047636 0.193693 -0.051618 \n", 1206 | "MMM 6676000.0 1.081790e+08 0.061713 0.096134 0.478910 0.106588 \n", 1207 | "MRK 15400000.0 2.338230e+08 0.065862 0.077855 0.758023 0.119746 \n", 1208 | "MSFT 52464000.0 1.619973e+09 0.032386 0.045578 0.322838 0.070841 \n", 1209 | "NKE 3516000.0 1.711040e+08 0.020549 0.034960 0.173758 0.046301 \n", 1210 | "PFE 14644000.0 2.518960e+08 0.058135 0.081962 1.547010 0.298633 \n", 1211 | "PG 16177000.0 3.725760e+08 0.043419 0.059515 1.030185 0.135216 \n", 1212 | "UNH 23623000.0 3.494360e+08 0.067603 0.082851 -2.261873 0.196320 \n", 1213 | "VZ 30960000.0 3.533770e+08 0.087612 0.267360 0.288768 0.249522 \n", 1214 | "V 14737000.0 4.707840e+08 0.031303 0.028602 1.437756 0.075137 \n", 1215 | "WMT 22707000.0 4.298380e+08 0.052827 0.114630 0.204448 0.201732 \n", 1216 | "WBA 3047000.0 5.167700e+07 0.058962 0.214712 0.475351 0.701641 \n", 1217 | "\n", 1218 | " DivYield \n", 1219 | "AAPL 0.0066 \n", 1220 | "CAT 0.0292 \n", 1221 | "CSCO 0.0343 \n", 1222 | "DOW 0.0607 \n", 1223 | "HD 0.0210 \n", 1224 | "IBM 0.0523 \n", 1225 | "INTC 0.0267 \n", 1226 | "JNJ 0.0266 \n", 1227 | "KO 0.0342 \n", 1228 | "MCD 0.0235 \n", 1229 | "MMM 0.0361 \n", 1230 | "MRK 0.0285 \n", 1231 | "MSFT 0.0094 \n", 1232 | "NKE 0.0088 \n", 1233 | "PFE 0.0396 \n", 1234 | "PG 0.0227 \n", 1235 | "UNH 0.0160 \n", 1236 | "VZ 0.0414 \n", 1237 | "V 0.0058 \n", 1238 | "WMT 0.0165 \n", 1239 | "WBA 0.0473 " 1240 | ] 1241 | }, 1242 | "execution_count": 13, 1243 | "metadata": {}, 1244 | "output_type": "execute_result" 1245 | } 1246 | ], 1247 | "source": [ 1248 | "final_stats_df" 1249 | ] 1250 | }, 1251 | { 1252 | "cell_type": "markdown", 1253 | "metadata": {}, 1254 | "source": [ 1255 | "#### We now have everything in place to apply the magic formula, let's do it!" 1256 | ] 1257 | }, 1258 | { 1259 | "cell_type": "markdown", 1260 | "metadata": {}, 1261 | "source": [ 1262 | "### Ranking using earning yield and ROC(Return on Capital)" 1263 | ] 1264 | }, 1265 | { 1266 | "cell_type": "code", 1267 | "execution_count": 15, 1268 | "metadata": {}, 1269 | "outputs": [ 1270 | { 1271 | "name": "stdout", 1272 | "output_type": "stream", 1273 | "text": [ 1274 | "------------------------------------------------\n", 1275 | "Value stocks based on Greenblatt's Magic Formula\n" 1276 | ] 1277 | }, 1278 | { 1279 | "data": { 1280 | "text/html": [ 1281 | "
\n", 1282 | "\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 | "
EarningYieldROCMagicFormulaRank
CSCO0.0821190.6814211.0
MRK0.0658620.7580232.0
PFE0.0581351.5470103.0
INTC0.1160630.4098584.0
KO0.0404202.2775965.0
VZ0.0876120.2887686.0
MMM0.0617130.4789107.0
PG0.0434191.0301858.0
IBM0.0545730.5690669.0
JNJ0.0482920.74881310.0
CAT0.0671490.23822411.0
WBA0.0589620.47535112.0
V0.0313031.43775613.0
HD0.0489110.56003414.0
UNH0.067603-2.26187315.0
AAPL0.0305900.71060216.0
DOW0.0634690.09601417.0
WMT0.0528270.20444818.0
MSFT0.0323860.32283819.0
MCD0.0374450.19369320.0
NKE0.0205490.17375821.0
\n", 1433 | "
" 1434 | ], 1435 | "text/plain": [ 1436 | " EarningYield ROC MagicFormulaRank\n", 1437 | "CSCO 0.082119 0.681421 1.0\n", 1438 | "MRK 0.065862 0.758023 2.0\n", 1439 | "PFE 0.058135 1.547010 3.0\n", 1440 | "INTC 0.116063 0.409858 4.0\n", 1441 | "KO 0.040420 2.277596 5.0\n", 1442 | "VZ 0.087612 0.288768 6.0\n", 1443 | "MMM 0.061713 0.478910 7.0\n", 1444 | "PG 0.043419 1.030185 8.0\n", 1445 | "IBM 0.054573 0.569066 9.0\n", 1446 | "JNJ 0.048292 0.748813 10.0\n", 1447 | "CAT 0.067149 0.238224 11.0\n", 1448 | "WBA 0.058962 0.475351 12.0\n", 1449 | "V 0.031303 1.437756 13.0\n", 1450 | "HD 0.048911 0.560034 14.0\n", 1451 | "UNH 0.067603 -2.261873 15.0\n", 1452 | "AAPL 0.030590 0.710602 16.0\n", 1453 | "DOW 0.063469 0.096014 17.0\n", 1454 | "WMT 0.052827 0.204448 18.0\n", 1455 | "MSFT 0.032386 0.322838 19.0\n", 1456 | "MCD 0.037445 0.193693 20.0\n", 1457 | "NKE 0.020549 0.173758 21.0" 1458 | ] 1459 | }, 1460 | "execution_count": 15, 1461 | "metadata": {}, 1462 | "output_type": "execute_result" 1463 | } 1464 | ], 1465 | "source": [ 1466 | "final_stats_val_df = final_stats_df.loc[stocks,:]\n", 1467 | "final_stats_val_df[\"CombRank\"] = final_stats_val_df[\"EarningYield\"].rank(ascending=False,na_option='bottom')+final_stats_val_df[\"ROC\"].rank(ascending=False,na_option='bottom')\n", 1468 | "final_stats_val_df[\"MagicFormulaRank\"] = final_stats_val_df[\"CombRank\"].rank(method='first')\n", 1469 | "value_stocks = final_stats_val_df.sort_values(\"MagicFormulaRank\").iloc[:,[2,4,8]]\n", 1470 | "print(\"------------------------------------------------\")\n", 1471 | "print(\"Value stocks based on Greenblatt's Magic Formula\")\n", 1472 | "df = value_stocks.fillna(0)\n", 1473 | "df" 1474 | ] 1475 | }, 1476 | { 1477 | "cell_type": "markdown", 1478 | "metadata": {}, 1479 | "source": [ 1480 | "Hmm, looks like Cisco, Merk Pharma and Pfizer are the top 3 picks, based on earning yield and ROC" 1481 | ] 1482 | }, 1483 | { 1484 | "cell_type": "markdown", 1485 | "metadata": {}, 1486 | "source": [ 1487 | "### Ranking using dividend yield(not included in Magic formula)\n", 1488 | "\n", 1489 | "Although I personally invest in stocks for value, not for dividends, they are an extra incentive sometimes! :)" 1490 | ] 1491 | }, 1492 | { 1493 | "cell_type": "code", 1494 | "execution_count": 17, 1495 | "metadata": {}, 1496 | "outputs": [ 1497 | { 1498 | "name": "stdout", 1499 | "output_type": "stream", 1500 | "text": [ 1501 | "------------------------------------------------\n", 1502 | "Highest dividend paying stocks\n" 1503 | ] 1504 | }, 1505 | { 1506 | "data": { 1507 | "text/html": [ 1508 | "
\n", 1509 | "\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 | "
DivYield
DOW0.0607
IBM0.0523
WBA0.0473
VZ0.0414
PFE0.0396
MMM0.0361
CSCO0.0343
KO0.0342
CAT0.0292
MRK0.0285
INTC0.0267
JNJ0.0266
MCD0.0235
PG0.0227
HD0.0210
WMT0.0165
UNH0.0160
MSFT0.0094
NKE0.0088
AAPL0.0066
V0.0058
\n", 1616 | "
" 1617 | ], 1618 | "text/plain": [ 1619 | " DivYield\n", 1620 | "DOW 0.0607\n", 1621 | "IBM 0.0523\n", 1622 | "WBA 0.0473\n", 1623 | "VZ 0.0414\n", 1624 | "PFE 0.0396\n", 1625 | "MMM 0.0361\n", 1626 | "CSCO 0.0343\n", 1627 | "KO 0.0342\n", 1628 | "CAT 0.0292\n", 1629 | "MRK 0.0285\n", 1630 | "INTC 0.0267\n", 1631 | "JNJ 0.0266\n", 1632 | "MCD 0.0235\n", 1633 | "PG 0.0227\n", 1634 | "HD 0.0210\n", 1635 | "WMT 0.0165\n", 1636 | "UNH 0.0160\n", 1637 | "MSFT 0.0094\n", 1638 | "NKE 0.0088\n", 1639 | "AAPL 0.0066\n", 1640 | "V 0.0058" 1641 | ] 1642 | }, 1643 | "execution_count": 17, 1644 | "metadata": {}, 1645 | "output_type": "execute_result" 1646 | } 1647 | ], 1648 | "source": [ 1649 | "high_dividend_stocks = final_stats_df.sort_values(\"DivYield\",ascending=False).iloc[:,6]\n", 1650 | "print(\"------------------------------------------------\")\n", 1651 | "print(\"Highest dividend paying stocks\")\n", 1652 | "high_dividend_stocks.to_frame()" 1653 | ] 1654 | }, 1655 | { 1656 | "cell_type": "markdown", 1657 | "metadata": {}, 1658 | "source": [ 1659 | "## Conclusion\n", 1660 | "\n", 1661 | "Combining both the magic formula and dividend yield.\n" 1662 | ] 1663 | }, 1664 | { 1665 | "cell_type": "code", 1666 | "execution_count": 18, 1667 | "metadata": {}, 1668 | "outputs": [ 1669 | { 1670 | "name": "stdout", 1671 | "output_type": "stream", 1672 | "text": [ 1673 | "------------------------------------------------\n", 1674 | "Magic Formula and Dividend Yield combined\n" 1675 | ] 1676 | }, 1677 | { 1678 | "data": { 1679 | "text/html": [ 1680 | "
\n", 1681 | "\n", 1694 | "\n", 1695 | " \n", 1696 | " \n", 1697 | " \n", 1698 | " \n", 1699 | " \n", 1700 | " \n", 1701 | " \n", 1702 | " \n", 1703 | " \n", 1704 | " \n", 1705 | " \n", 1706 | " \n", 1707 | " \n", 1708 | " \n", 1709 | " \n", 1710 | " \n", 1711 | " \n", 1712 | " \n", 1713 | " \n", 1714 | " \n", 1715 | " \n", 1716 | " \n", 1717 | " \n", 1718 | " \n", 1719 | " \n", 1720 | " \n", 1721 | " \n", 1722 | " \n", 1723 | " \n", 1724 | " \n", 1725 | " \n", 1726 | " \n", 1727 | " \n", 1728 | " \n", 1729 | " \n", 1730 | " \n", 1731 | " \n", 1732 | " \n", 1733 | " \n", 1734 | " \n", 1735 | " \n", 1736 | " \n", 1737 | " \n", 1738 | " \n", 1739 | " \n", 1740 | " \n", 1741 | " \n", 1742 | " \n", 1743 | " \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 | " \n", 1816 | " \n", 1817 | " \n", 1818 | " \n", 1819 | " \n", 1820 | " \n", 1821 | " \n", 1822 | " \n", 1823 | " \n", 1824 | " \n", 1825 | " \n", 1826 | " \n", 1827 | " \n", 1828 | " \n", 1829 | " \n", 1830 | " \n", 1831 | " \n", 1832 | " \n", 1833 | " \n", 1834 | " \n", 1835 | " \n", 1836 | " \n", 1837 | " \n", 1838 | " \n", 1839 | " \n", 1840 | " \n", 1841 | " \n", 1842 | " \n", 1843 | " \n", 1844 | " \n", 1845 | " \n", 1846 | " \n", 1847 | " \n", 1848 | " \n", 1849 | " \n", 1850 | " \n", 1851 | " \n", 1852 | " \n", 1853 | "
EarningYieldROCDivYieldCombinedRank
PFE0.0581351.5470100.03961.0
CSCO0.0821190.6814210.03432.0
MRK0.0658620.7580230.02853.0
VZ0.0876120.2887680.04144.0
IBM0.0545730.5690660.05235.0
WBA0.0589620.4753510.04736.0
INTC0.1160630.4098580.02677.0
KO0.0404202.2775960.03428.0
MMM0.0617130.4789100.03619.0
DOW0.0634690.0960140.060710.0
CAT0.0671490.2382240.029211.0
JNJ0.0482920.7488130.026612.0
PG0.0434191.0301850.022713.0
HD0.0489110.5600340.021014.0
UNH0.067603-2.2618730.016015.0
V0.0313031.4377560.005816.0
WMT0.0528270.2044480.016517.0
AAPL0.0305900.7106020.006618.0
MCD0.0374450.1936930.023519.0
MSFT0.0323860.3228380.009420.0
NKE0.0205490.1737580.008821.0
\n", 1854 | "
" 1855 | ], 1856 | "text/plain": [ 1857 | " EarningYield ROC DivYield CombinedRank\n", 1858 | "PFE 0.058135 1.547010 0.0396 1.0\n", 1859 | "CSCO 0.082119 0.681421 0.0343 2.0\n", 1860 | "MRK 0.065862 0.758023 0.0285 3.0\n", 1861 | "VZ 0.087612 0.288768 0.0414 4.0\n", 1862 | "IBM 0.054573 0.569066 0.0523 5.0\n", 1863 | "WBA 0.058962 0.475351 0.0473 6.0\n", 1864 | "INTC 0.116063 0.409858 0.0267 7.0\n", 1865 | "KO 0.040420 2.277596 0.0342 8.0\n", 1866 | "MMM 0.061713 0.478910 0.0361 9.0\n", 1867 | "DOW 0.063469 0.096014 0.0607 10.0\n", 1868 | "CAT 0.067149 0.238224 0.0292 11.0\n", 1869 | "JNJ 0.048292 0.748813 0.0266 12.0\n", 1870 | "PG 0.043419 1.030185 0.0227 13.0\n", 1871 | "HD 0.048911 0.560034 0.0210 14.0\n", 1872 | "UNH 0.067603 -2.261873 0.0160 15.0\n", 1873 | "V 0.031303 1.437756 0.0058 16.0\n", 1874 | "WMT 0.052827 0.204448 0.0165 17.0\n", 1875 | "AAPL 0.030590 0.710602 0.0066 18.0\n", 1876 | "MCD 0.037445 0.193693 0.0235 19.0\n", 1877 | "MSFT 0.032386 0.322838 0.0094 20.0\n", 1878 | "NKE 0.020549 0.173758 0.0088 21.0" 1879 | ] 1880 | }, 1881 | "execution_count": 18, 1882 | "metadata": {}, 1883 | "output_type": "execute_result" 1884 | } 1885 | ], 1886 | "source": [ 1887 | "final_stats_df[\"CombRank\"] = final_stats_df[\"EarningYield\"].rank(ascending=False,method='first') \\\n", 1888 | " +final_stats_df[\"ROC\"].rank(ascending=False,method='first') \\\n", 1889 | " +final_stats_df[\"DivYield\"].rank(ascending=False,method='first')\n", 1890 | "final_stats_df[\"CombinedRank\"] = final_stats_df[\"CombRank\"].rank(method='first')\n", 1891 | "value_high_div_stocks = final_stats_df.sort_values(\"CombinedRank\").iloc[:,[2,4,6,8]]\n", 1892 | "print(\"------------------------------------------------\")\n", 1893 | "print(\"Magic Formula and Dividend Yield combined\")\n", 1894 | "value_high_div_stocks" 1895 | ] 1896 | }, 1897 | { 1898 | "cell_type": "markdown", 1899 | "metadata": {}, 1900 | "source": [ 1901 | "#### With that we come to an end of this notebook, hope you liked it, please do not use these results to make actual investments, do your own research and make decisions based on that, happy investing! :)" 1902 | ] 1903 | } 1904 | ], 1905 | "metadata": { 1906 | "kernelspec": { 1907 | "display_name": "Python 3", 1908 | "language": "python", 1909 | "name": "python3" 1910 | }, 1911 | "language_info": { 1912 | "codemirror_mode": { 1913 | "name": "ipython", 1914 | "version": 3 1915 | }, 1916 | "file_extension": ".py", 1917 | "mimetype": "text/x-python", 1918 | "name": "python", 1919 | "nbconvert_exporter": "python", 1920 | "pygments_lexer": "ipython3", 1921 | "version": "3.6.10" 1922 | } 1923 | }, 1924 | "nbformat": 4, 1925 | "nbformat_minor": 4 1926 | } 1927 | --------------------------------------------------------------------------------