Stocks showing at least 50% upside using a DCF model

There are many screens like Greenblatt, that attempt to measure “cheap and good”, or GARP screens that use a combination of “value and growth”, but there are not any scrrens that attempt to measure discount to intrinsic value. Yesterday, I realised that it was possible to actually do this using Stockopedia.

The values I needed were: market cap (MKT), operating profit (OP), ROCE, net cash (NCASH), and dividend cover (DCOV).

Given DCOV, it is easy to calculate an earnings re-investment rate, which, combined with a ROCE, tells me at what rate I expect OP to grow. I then assume OP grows at that rate for 5 years, and then switches to market-expected rates. Those are the basic assumptions of the model, and allows me to compute an intrinsic value for the company. I can then compare it to the market cap, and apply a filter below 50% upside, The model adjusts for NCASH.

Stockopedia only returns 200 qualifying companies, so I have restricted my search to companies with a market cap of at least £250m, have excluded as many AIM-listed shares as possible, and sorted by ROCE descending.

A number of other assumptions were needed. I used a risk-free rate RF=2.95% and an equity risk premiun ERP=4.96%. I don’t have unlevered betas for the companies, so I assumed all the betas were 1. The hurdle rate is therefore 7.91% in all cases, and the perpetual growth rate is RF. I also did not adjust the cost of capital for debt. These assumptions may be disliked by some, but there’s really other no way of producing bulk computations for intrinsic value.

So you should think of the computations as a starting-off point, from which you can do further work. Note, also, that the OPs are taken “as-is”. Some of them will be distorted by exceptional items, and some of them are in USD, which throws off the calculations. There are also no adjustments for operating leases and pension deficits. Like I say, cavaet emptor.

Here is a table of results:

  #  EPIC       Upside  P/E    Name
---  ------  ---------  -----  -------------------------------
  1  GKN       1.54671  10.4   GKN
  2  ITV       1.58682  20.8   ITV
  3  XPP       1.5979   13.2   XP Power
  4  IPO       1.6034   8.33   IP
  5  DLAR      1.64208  6.95   De La Rue
  6  ATK       1.65468  14.6   WS Atkins
  7  SPD       1.65998  19.3   Sports Direct International
  8  HAS       1.66271  18.3   Hays
  9  CRST      1.66439  9.82   Crest Nicholson Holdings
 10  HL.       1.6858   25.5   Hargreaves Lansdown
 11  RDW       1.70098  9.46   Redrow
 12  HFG       1.74224  14.5   Hilton Food
 13  AVV       1.74855  17.2   AVEVA
 14  PFC       1.8086   10.0   Petrofac
 15  FOXT      1.87711  12.8   Foxtons
 16  DNLM      1.91909  18.2   Dunelm
 17  LOOK      1.97206  10.9   Lookers
 18  UKCM      2.01667  6.03   UK Commercial Property Trust
 19  HWDN      2.0205   18.3   Howden Joinery
 20  VZC       2.10285  15.2   Verizon Communications Inc
 21  LSL       2.15945  11.4   LSL Property Services
 22  IBM       2.17893  11.2   International Business Machine…
 23  PDG       2.30425  8.09   Pendragon
 24  HIK       2.34738  17.3   Hikma Pharmaceuticals
 25  FDM       2.40176  34.6   FDM (Holdings)
 26  GMS       2.43112  10.5   Gulf Marine Services
 27  BLT       2.46258  10.0   BHP Billiton
 28  888       2.47652  14.9   888 Holdings
 29  TT.       2.48817  7.37   TUI Travel
 30  TTA       2.52339  9.88   Total SA
 31  EDCL      2.97754  8.05   Eurasia Drilling
 32  HLCL      2.98072  4.42   Helical Bar
 33  SMWH      3.15547  15.1   WH Smith
 34  GPOR      3.17671  5.10   Great Portland Estates
 35  DLN       3.28182  5.08   Derwent London
 36  ITE       3.36212  9.45   ITE
 37  NBPE      3.36623  4.91   NB Private Equity Partners
 38  NOG       3.39358  9.05   Nostrum Oil & Gas LP
 39  NXT       3.44832  17.0   Next
 40  DMC       3.46037  14.3   DAMAC Real Estate Development
 41  REL       3.5027   12.8   Reed Elsevier
 42  AA.       3.67377  13.9   AA
 43  GLTR      3.70754  8.58   Globaltrans Investment
 44  SIA       4.21821  21.3   SOCO International
 45  XCH       4.3057   25.3   Xchanging
 46  OPHR      4.46711  13.3   Ophir Energy
 47  DGO       4.85896  7.02   Dragon Oil
 48  GMD       4.96425  -      Game Digital
 49  WKP       5.49217  3.74   Workspace
 50  BNK       5.90446  11.5   Bankers Petroleum
 51  AFR       6.74221  8.15   Afren
 52  FXPO      7.15282  2.96   Ferrexpo
 53  AEP      12.7208   17.5   Anglo-Eastern Plantations
 54  OKEY     15.5672   15.0   O'Key SA
 55  RMG      17.968    8.19   Royal Mail
 56  SEPL     27.3966   2.21   Seplat Petroleum Development
 57  SSA      28.8468   27.0   Aktsionernaya Finansovaya Korp…
 58  MFON     28.9517   11.3   Megafon OAO
 59  FIVE     35.8363   3.59   X5 Retail NV
 60  CNCT     38.9168   8.44   Connect
 61  GCLA     45.4253   51.3   Grupo Clarin SA
 62  TRCN     98.8475   0.84   TransContainer OAO
 63  NVTK    104.81     94.9   Novatek OAO
 64  ETLN    134.848    5.86   Etalon
 65  MCRO    195.078    19.4   Micro Focus International
 66  PIK     202.902    8.08   Gruppa Kompaniy PIK OAO
 67  ATAD    203.908    32.7   Tatneft' OAO
 68  GAZ     208.782    18.6   Gazprom neft' OAO
 69  KCEL    363.146    7.14   Kcell AO
 70  OGDC    377.114    85.4   Oil and Gas Development Co
 71  PHST    900.156    1.18   Farmstandart OAO

There is obviously going to be suspicious ones amongst them. Clearly, companies are not likely to have an upside of 10X+.By way of example, GKN has an upside of 55%. It currently trades on a PE of 10.4. Note that my computations make no use of PEs. PEs are a pricing statistic, not an intrinsic valuation metric.

You will see that some companies have high P/Es, yet are ostensibly undervalued. This is possible if companies have high re-investment rates and high returns on capital.

Here’s my code:

# -*- coding: latin-1 -*-

import operator
from pprint import pprint as prin

import tabulate

import aswath
import mython.csvmc


def floatm(x):
    x = x.replace(',', '')
    return float(x)

def calc(d):
    #print(d['Name'])
    del d['']

    dcov = d['Div Cover']
    if dcov == '-': dcov = "inf"
    dcov = floatm(dcov)
    roce = floatm(d['ROCE %'])/100
    op = floatm(d['Op Profit'])
    mkt = floatm(d['Mkt Cap £m'])
    ncash = mkt - floatm(d['EV'] )
    vc = aswath.grow2b(op, dcov, roce, ncash)
    d['upside'] = vc/mkt

    return d

def upside(d): return d['upside']

def main():
    inp = mython.csvmc.read_dict('~/Downloads/stocko.csv')
    calcs = map(calc, inp)
    calcs = filter(lambda x: upside(x) > 1.5, calcs)
    calcs = list(calcs)
    calcs.sort(key = upside)
    prin(len(calcs))
    prin(calcs)

    tab =[ [i+1, d['Ticker'], d['upside'], d['P/E'],  d['Name']] for i, d in enumerate(calcs)]
    print(tabulate.tabulate(tab, headers= ['#', 'EPIC', 'Upside', 'P/E', 'Name']))

if __name__ == "__main__" :
    main()

All of the computations are in the aswath module, which can be obtained from github.

Happy investing to you all.

Advertisements

About mcturra2000

Computer programmer living in Scotland.
This entry was posted in Uncategorized and tagged , . Bookmark the permalink.

One Response to Stocks showing at least 50% upside using a DCF model

  1. Pingback: Two-phase growth model app available | mcturra2000

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s