## 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():
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.