Of late, I’ve been toying with financial data. In this first post on a series on asset trading, I

Introduction

If you own an SGX trading account and are sufficiently serious about investing, you will surely be familiar with analyst reports on stocks. Take for example this report on one of my favourite REITs, Capitaland Mall Trust (C38U). Maybank Kim Eng put forth a price call/recommendation - SELL - and a price target of S$1.96, citing lower occupancy and weaker rental reversions amidst a weak leasing market. To the uninformed investor, it sounds legit. But just how accurate are these calls?

In this post, I evaluate the accuracy of 536 price call and price target pairs from Jun 2015 to Jun 2016 inclusive. I use financial data from Yahoo to assess whether stock prices actually hit price targets, and compare the results for the different price calls (buy/sell/hold) and the different research houses.

Analyst Reports

For the benefit of all readers, financially savvy or not, I think it’s worth clarifying what analyst reports are. Typically, analyst reports contain three key pieces of information:

  1. A price call: A recommendation to buy, hold or sell a stock.
  2. A price target: A price that the stock is likely to hit, typically over a 1-year horizon. Price targets are typically backed by calculations to estimate value like the discounted cash flow (DCF) method.
  3. Justifications: Why the stock price is likely to rise, fall, or be stagnant.

The objective of providing this information is to provide a recommendation to investors on what to do with their holding of stock. It is a value-added service that provides investors with information about a company that would otherwise be difficult to obtain. Therefore, it should help investors make more informed decisions.

However, a convincing analyst report, while well-grounded in facts about a company, may not necessarily predict the company’s stock price. We can only be sure that such a report is, well, convincing. Fortunately, it is possible to assess the accuracy of these price calls and targets using open srouce data. For simplicity, I refer to price calls and targets jointly as “calls”.

Data

Price Calls and Targets

I scraped price targets from NextInsight, a Singaporean website/forum on investing. NextInsight releases price targets on a monthly basis, and has archived this data for quite some time. I chose price targets released from Jun 2015 to Jun 2016 inclusive, because the typical time horizon for each call is one year. This provides sufficient time for calls to be actualised, if accurate.

First, I manually collected the URLs of the monthly price target pages. Although NextInsight archives all this data, the pages are linked only to each succeeding month’s page. As such, it was easier to click through the pages back in time one-by-one than to use a programmatic solution. Second, I performed some data cleaning on the tables. All steps were performed in R except for the standardisation of names of companies and research houses. I standardised the names in Excel simply because it was more efficient to do so. Third, I labelled each stock with its respective tickers. Stock tickers are codes that identify a stock on the exchange. For example, Capitaland Mall Trust is identified by the code C38U. This is consistent across all platforms.

Next, I added several important variables to allow for a tolerable level of inaccuracy when evaluating calls:

  1. Threshold Date: Although calls typically have a time horizon of one year, I created a buffer of 30 days for the actualisation of price targets. For example, if a call was made on 1st Mar 2016, the algorithm will check if the stock hit the price target by 31st Mar 2017, one year and 30 days after 1st Mar 2016.
  2. Upper and Lower Limits: Stocks may come close to the price targets as opposed to hitting them. As such, I set upper and lower limits of 0.5% above and below the price targets respectively. If a stock with a buy (sell) call hit the lower (upper) limit, I counted that as a hit.

Hence, these variables enable us to identify price targets (hits) based on the following the criterion:

The stock price comes within 0.5% of the price target within 395 days.

Stock Data

I used the quantmod package to collect stock data. Fortunately, I kept a list of SGX tickers from a past project. I used this list to make queries to the Yahoo! Finance API through quantmod. I saved this data on my computer in CSV format. You can download it here here. I then performed a filter on the stocks to be included in this study on the grounds of data availability. Stocks included in this study had to have data from 1 Jun 2015 onwards. Without data from 1 Jun 2015, any evaluation of the call for that stock would not be fair. For example, if there was a BUY call on Capitaland Mall Trust on 1 Jun 2015 and the stock’s price hit the price target on 1 Jan 2016, but data was available only from 1 Feb 2016, the algorithm would incorrectly reflect that the call was inaccurate.

Finally, I created IDs for the calls, and split them into buy, sell and hold calls. The resulting data looked like this:

Stock Date Research House Target Call Ticker Threshold Upper Limit Lower Limit ID
KSH Holdings 2015-06-02 OCBC 0.710 buy ER0 2016-07-01 0.713550 0.706450 tp-1
Silverlake Axis 2015-06-02 CIMB 0.970 sell 5CP 2016-07-01 0.974850 0.965150 tp-2
Tat Hong 2015-06-03 DBS Vickers 0.520 hold T03 2016-07-02 0.522600 0.517400 tp-3
Wilmar 2015-06-03 DBS Vickers 4.050 buy F34 2016-07-02 4.070250 4.029750 tp-4
ISOTeam 2015-06-04 UOB Kay Hian 0.725 buy 5WF 2016-07-03 0.728625 0.721375 tp-5
First Sponsor 2015-06-05 RHB Research 1.550 buy ADN 2016-07-04 1.557750 1.542250 tp-6
Sarine 2015-06-05 Maybank Kim Eng 3.070 buy U77 2016-07-04 3.085350 3.054650 tp-7
Suntec REIT 2015-06-05 UOB Kay Hian 2.080 buy T82U 2016-07-04 2.090400 2.069600 tp-8
China Everbright Water 2015-06-09 Deutsche Bank 1.320 buy U9E 2016-07-08 1.326600 1.313400 tp-9
Comfort DelGro 2015-06-09 CIMB 3.420 buy C52 2016-07-08 3.437100 3.402900 tp-10

Algorithm for Evaluating of Price Targets

I hard-coded the abovementioned criterion to check whether price targets were actually met. The checking algorithm was run separately for buy, sell and hold calls. The algorithm is as such:

For each stock:

  1. Pull stock data (CSV file) from my computer
  2. Filter calls on that stock from the complete list
  3. For each call:
    1. Filter stock data to include only data from the call date until the threshold date
    2. Check if the closing prices hit the price target. For BUY calls, the price target is the lower limit. For SELL calls, the price target is the upper limit. For HOLD calls, the target is the range between the upper and lower limits.
    3. If there is at least one hit, save the date of the earliest hit.
    4. Repeat steps 3a-3c for the remaining calls for that stock.
  4. Repeat steps 1-3 for all stocks.

Results

Combined Results

A total of 536 calls were evaluated, on which there were 238 hits. That makes for a combined accuracy of only 44.4%! The detailed breakdown is given below:

Research House Hits Total Calls Accuracy
UOB Kay Hian 34 86 39.53%
RHB Research 28 80 35%
OCBC 42 74 56.76%
DBS Vickers 41 71 57.75%
Maybank Kim Eng 26 64 40.62%
CIMB 20 53 37.74%
Credit Suisse 15 29 51.72%
Deutsche Bank 9 24 37.5%
KGI Fraser 6 18 33.33%
Phillip Securities 7 9 77.78%
JP Morgan 4 7 57.14%
Daiwa 2 5 40%
Goldman Sachs 1 4 25%
HSBC 0 4 0%
Nomura 1 4 25%
NRA Capital 1 2 50%
BNP Paribas 1 1 100%
Morgan Stanley 0 1 0%

As we can see, the calls are generally inaccurate. Of the research houses that made at least 10 calls (on the graphs: left of Phillip Securities), only three had an accuracy above 50%. The remaining six had an accuracy of 41% or below!1

Buy Calls

There were a total of 112 hits on 348 buy calls, for an accuracy of 32.2%. The results for buy calls are given below:

Research House Hits Total Calls Accuracy
RHB Research 15 63 23.81%
UOB Kay Hian 18 63 28.57%
DBS Vickers 18 47 38.3%
OCBC 23 40 57.5%
Maybank Kim Eng 10 33 30.3%
CIMB 7 32 21.88%
Deutsche Bank 3 17 17.65%
KGI Fraser 5 16 31.25%
Credit Suisse 6 12 50%
Phillip Securities 5 7 71.43%
Daiwa 1 4 25%
HSBC 0 4 0%
JP Morgan 1 4 25%
Goldman Sachs 0 2 0%
Nomura 0 2 0%
Morgan Stanley 0 1 0%
NRA Capital 0 1 0%

The research houses performed worse on buy calls. Of the research houses that made at least 10 calls (on the graphs: left of Phillip Securities), only two had an accuracy above 50%. The remaining seven did not reach 40% accuracy.

Sell Calls

There were a total of 26 hits on 47 sell calls, for an accuracy of 55.3%, which was better than that for buy calls. However, due to the small number of sell calls, this may not be representative of the true accuracy of sell calls. The smaller number of sell calls (than buy calls) is expected because buying is generally associated with making money, and selling with preventing losses. Surely more resources would be diverted to identifying profit opportunities - this is much juicier info!

Research House Hits Total Calls Accuracy
Maybank Kim Eng 8 16 50%
CIMB 7 9 77.78%
UOB Kay Hian 2 6 33.33%
OCBC 1 5 20%
Credit Suisse 2 3 66.67%
JP Morgan 3 3 100%
Deutsche Bank 1 2 50%
RHB Research 2 2 100%
KGI Fraser 0 1 0%

Hold Calls

There were a total of 100 hits on 141 sell calls, for an accuracy of 70.9%, which was the highest overall. However, due to the small number of sell calls, this may not be representative of the true accuracy of sell calls. This is expected: buying is generally associated with making money, and selling with preventing losses. Surely more resources would be diverted to identifying profit opportunities - it’s much juicier info!

Research House Hits Total Calls Accuracy
OCBC 18 29 62.07%
DBS Vickers 23 24 95.83%
UOB Kay Hian 14 17 82.35%
Maybank Kim Eng 8 15 53.33%
RHB Research 11 15 73.33%
Credit Suisse 7 14 50%
CIMB 6 12 50%
Deutsche Bank 5 5 100%
Goldman Sachs 1 2 50%
Nomura 1 2 50%
Phillip Securities 2 2 100%
BNP Paribas 1 1 100%
Daiwa 1 1 100%
KGI Fraser 1 1 100%
NRA Capital 1 1 100%

Discussion

Results don’t mean that analysts are stupid. Quite the contrary actually. They are the most informed people about companies’ business models and performance. However, knowing how well companies are doing does not help us in estimating its stock price. That’s because real world value from assets owned, and the production and sale of goods is delinked from market value. The former is termed book value, which measures the tangible value of a company, that is, how much money you would get from closing the company and selling everything it has away at the prevailing prices.

If you and I were the market, and we both think that a stock’s price is $10 and will be $10 for all eternity by coincidence or otherwise, then $10 will be the stock’s price for all eternity.

The people making money are the people who own the platforms.

Conclusion

The Oxford English dictionary’s definition of invest is to put (money) into financial schemes, shares, property, or a commercial venture with the expectation of achieving a profit. By definition, we don’t need to have a justification for expecting a profit from investing. All we need is to expect a profit, and we are investing. Th


  1. I would not compare this accuracy with a coin flip, because a coin flip does not give you a price target - an absolute number to hit. If instead, the research houses gave only a price call of up or down, the comparison with a coin flip would be valid.