When do financial analysts make mistakes?

While helping one of my students, Oleg Karapaev, in his struggle with a paper on determinants of divergence between “fair” and observed prices in stocks (written as a part of his bachelor research project), I’ve made some observations perhaps worth sharing with blogosphere. I used some R code and ggplot2ggthemes by Jeffrey Arnolds to represent findings visually (important: to replicate code in full you should have an access to Bloomberg and Rbbg package to download data).

Bloomberg collects target prices for equities from sell-side research analysts. They claim to have around 1500 contributors around the world. Generally speaking, sell-side analysts are not directly interested in quality of their research, at least not as interested as buy-sides are (see how Investopedia explains it.) Usually, when you plot blended forward 12-month target price (consensual between several analysts, covering stock), you expect to see something like the plot in the beginning of the post (shaded zone is last crisis, below – the code to generate it).

library(ggthemes)
library(xts)

## Here and below, prices and targets are matrices with historical ## and target prices, downloaded from Bloomberg with rBbg package. ## Tickers are in columns, dates in rows. See full code below 

ticker <- 'MSFT'
range <- '2005-01-01::'
crisis <- data.frame(start = '2007-11-30', end = '2009-05-29')
dtf <- xts(
 data.frame(
 historical = as.numeric(prices[12:nrow(targets),ticker]), 
 predicted = as.numeric(targets[1:(nrow(prices)-11),ticker])),
 order.by = time(prices[12:nrow(targets),ticker]))[range]
dtf <- data.frame(dtf)
dtf$Date <- as.Date(rownames(dtf))

ggplot(data = dtf) + 
 geom_line(aes(x = Date, y = historical, col='Historical')) +
 geom_line(aes(x = Date, y = predicted, col='Predicted')) + 
 theme_economist() +
 scale_colour_economist() +
 theme(legend.title=element_blank()) +
 geom_rect(data=crisis, aes(xmin=as.Date(start), xmax=as.Date(end),   ymin=-Inf, ymax=+Inf), fill='blue', alpha=0.2) + 
 xlab("Date") + ylab("Price") + 
 ggtitle("Historical vs. Predicted Price: MSFT")
%d bloggers like this: