Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the all-in-one-seo-pack domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home1/portfol1/public_html/wp/wp-includes/functions.php on line 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the feedzy-rss-feeds domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home1/portfol1/public_html/wp/wp-includes/functions.php on line 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the restrict-user-access domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home1/portfol1/public_html/wp/wp-includes/functions.php on line 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the updraftplus domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home1/portfol1/public_html/wp/wp-includes/functions.php on line 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the wpforms-lite domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home1/portfol1/public_html/wp/wp-includes/functions.php on line 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the hueman domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home1/portfol1/public_html/wp/wp-includes/functions.php on line 6114

Deprecated: preg_split(): Passing null to parameter #3 ($limit) of type int is deprecated in /home1/portfol1/public_html/wp/wp-content/plugins/add-meta-tags/metadata/amt_basic.php on line 118
Making market returns is easy. Beating the market is very hard | Portfolio Yoga

Making market returns is easy. Beating the market is very hard

The title of this post was taken from the following tweet by Rohit Chauhan

When I first read the tweet, I was stumped. If just 5% of the stocks were able to generate better returns than the Index, there is really no point being in the business of selecting stocks. For a while its been said that beating the markets is difficult, but if it’s just 5%, it’s close to impossible.

I decided to test the same for myself. To also ensure that starting point bias doesn’t screw up the numbers, I decided to test for 3, 4, 5, 6 and 7 year returns. The idea was to verify the percentage of stocks that generated a return greater than the Index.

For this exercise, I used data from NSE. As on date, NSE has 1900 companies that are available for trading. But this is not a static number. If you go back 10 years (2009), this number was around the 1400 mark.

600 are the Net additions post removal of stocks due to delisting and hence the number of stocks that you can find 10 year returns will not be 1900 or even 1300 but much lower. To give you an example, if you were to check for 10 year returns of all stocks, the number of stocks come to 2300. Of these, 600+ stocks have ceased to be available for trading. Then you have another 250+ stocks that don’t have 10 year returns since they were listed in the interim period.

This leaves us with (2300 – (636+252)) = 1412 stocks that have 10 year rolling returns. We need to account for the fact that nearly 27% of stocks that were available  for investing 10 years ago aren’t available today. 

I account this to ensure that the data doesn’t fall prey to Survivor Bias. Do note that tocks that went through demergers and hence had new symbols and prices get removed since they may not have the required amount of data.

Here are the results;


The good news, the number of stocks that have given returns greater than Nifty is not 5% or even in single digits. 3 Year look-back has the lowest number of stocks that have generated returns greater than Nifty and one which isn’t surprising given that over the last two years, it’s been a rally led by a few large caps with small and mid caps nowhere in the picture.

The best returns came for the 6 year period, again not surprising since 6 years back, it was 2013, Modi had been annointed the Prime Minister candidate of the BJP and markets had just started the rally that finally ended in Jan of 2018.

It’s generally in the last phases of a mega bull run that picking stocks become easy. Rest of the time, it requires hard work to be able to spot long term winners. Yet, the fact that hundreds of stocks have been able to beat the Index returns should provide investors the faith that is required to be an active investor. The day, this ratio falls to 5% is the day one should quit active and move to passive.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.