Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

The Barron’s article Still Too Pricey by Andrew Bary looks at the share price of the Facebook and based on the P/E ration valuation metrics concludes that even at the current prices, stock is overvalued. I want to show how to do this type of fundamental analysis using the Systematic Investor Toolbox.

First let’s load historical prices and earnings per share (EPS) for Facebook and a few stocks in the technology sector: LinkedIn, Groupon, Apple, and Google.

###############################################################################
# Load Systematic Investor Toolbox (SIT)
# http://systematicinvestor.wordpress.com/systematic-investor-toolbox/
###############################################################################
setInternet2(TRUE)
con = gzcon(url('http://www.systematicportfolio.com/sit.gz', 'rb'))
source(con)
close(con)

#*****************************************************************
# Load historical fundamental and pricing data
#******************************************************************
tickers = spl('FB,LNKD,GRPN,AAPL,GOOG')
tickers.temp = spl('NASDAQ:FB,NYSE:LNKD,NASDAQ:GRPN,NASDAQ:AAPL,NASDAQ:GOOG')

# get fundamental data
data.fund <- new.env()
for(i in 1:len(tickers)) {
cat(tickers[i],'\n')
data.fund[[tickers[i]]] = fund.data(tickers.temp[i], 80)
}

# get pricing data
data <- new.env()
getSymbols(tickers, src = 'yahoo', from = '1970-01-01', env = data, auto.assign = T)


Next, let’s combine fundamental and pricing data and create P/E ratio for all stocks.

	#*****************************************************************
# Combine fundamental and pricing data
#******************************************************************
for(i in tickers) {
fund = data.fund[[i]]
fund.date = date.fund.data(fund)

# Earnings per Share
EPS = 4 * get.fund.data('Diluted EPS from Total Operations', fund, fund.date)
if(nrow(EPS) > 3)
EPS = rbind(EPS[1:3], get.fund.data('Diluted EPS from Total Operations', fund, fund.date, is.12m.rolling=T)[-c(1:3)])

# merge
data[[i]] = merge(data[[i]], EPS)
}

bt.prep(data, align='keep.all', dates='1995::')

#*****************************************************************
# Create PE
#******************************************************************
prices = data\$prices
prices = bt.apply.matrix(prices, function(x) ifna.prev(x))

EPS =  bt.apply(data, function(x) ifna.prev(x[, 'EPS']))

PE = ifna(prices / EPS, NA)
PE[ abs(EPS) < 0.001 ] = NA


Please note that for very small EPS, the P/E ratio will be very big; therefore, I set P/E to NA in such cases.

The hard part is done, not let’ plot P/E ratios for all companies.

    #*****************************************************************
# Create Report
#******************************************************************
plota.matplot(PE)

plota.matplot(PE, type='b',pch=20, dates='2012::')

plota.matplot(EPS)

plota.matplot(prices)


P/E ratios for all companies:

P/E ratios for all companies in 2012:

Earnings per share (EPS) for all companies:

Prices for all companies:

From these charts I would say it is too early to decide if Facebook is overvalued based on historical P/E ratio basis only, because we only have 3 financial statements, not enough to make an informed conclusion. You might use project one year (FY1) and two year (FY2) earnings estimates to make a better decision.

What is interesting in these charts is how LinkedIn is managing to sustain its astronomical P/E ratio?

I have previously shown examples of how to get and use fundamental data. Here are links for your reference:

To view the complete source code for this example, please have a look at the fundamental.fb.test() function in fundamental.test.r at github.