Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /home/calcul9/public_html/wp-content/themes/suffusion/functions/media.php on line 580

Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /home/calcul9/public_html/wp-content/themes/suffusion/functions/media.php on line 583

Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /home/calcul9/public_html/wp-content/themes/suffusion/functions/media.php on line 586

Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /home/calcul9/public_html/wp-content/themes/suffusion/functions/media.php on line 589

Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /home/calcul9/public_html/wp-content/themes/suffusion/functions/media.php on line 592

Warning: Cannot modify header information - headers already sent by (output started at /home/calcul9/public_html/wp-content/themes/suffusion/functions/media.php:580) in /home/calcul9/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1673

Warning: Cannot modify header information - headers already sent by (output started at /home/calcul9/public_html/wp-content/themes/suffusion/functions/media.php:580) in /home/calcul9/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1673

Warning: Cannot modify header information - headers already sent by (output started at /home/calcul9/public_html/wp-content/themes/suffusion/functions/media.php:580) in /home/calcul9/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1673

Warning: Cannot modify header information - headers already sent by (output started at /home/calcul9/public_html/wp-content/themes/suffusion/functions/media.php:580) in /home/calcul9/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1673

Warning: Cannot modify header information - headers already sent by (output started at /home/calcul9/public_html/wp-content/themes/suffusion/functions/media.php:580) in /home/calcul9/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1673

Warning: Cannot modify header information - headers already sent by (output started at /home/calcul9/public_html/wp-content/themes/suffusion/functions/media.php:580) in /home/calcul9/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1673

Warning: Cannot modify header information - headers already sent by (output started at /home/calcul9/public_html/wp-content/themes/suffusion/functions/media.php:580) in /home/calcul9/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1673

Warning: Cannot modify header information - headers already sent by (output started at /home/calcul9/public_html/wp-content/themes/suffusion/functions/media.php:580) in /home/calcul9/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1673
{"id":1102,"date":"2011-02-21T20:55:02","date_gmt":"2011-02-22T02:55:02","guid":{"rendered":"http:\/\/www.calculatinginvestor.com\/?p=1102"},"modified":"2011-02-21T20:55:02","modified_gmt":"2011-02-22T02:55:02","slug":"market-timing","status":"publish","type":"post","link":"http:\/\/www.calculatinginvestor.com\/2011\/02\/21\/market-timing\/","title":{"rendered":"Market Timing: How good is good enough?"},"content":{"rendered":"

Monte Carlo Simulations using return data from 1926-2010<\/strong><\/p>\n

In 1975, Nobel laureate William Sharpe published a study titled “Likely Gains from Market Timing”. In this paper, Sharpe reportedly found that a market timer who switches between 100% stocks and 100% T-bills on an annual basis\u00a0must be correct about 74% of the time (on average)\u00a0to beat the market. <\/span><\/p>\n

Unfortunately, a free copy of this paper is not available on the web, and I don\u2019t have access to this much cited paper. However, I\u2019ve seen a number of related analyses based on Sharpe\u2019s approach, and I believe we can recreate a similar result through simulation.<\/span><\/p>\n

In this post, I\u2019ll simulate a simple market timing strategy and determine the market timing accuracy required to outperform buy-and-hold. I\u2019ll compare market timing to buy-and-hold in terms of both total returns and risk-adjusted returns (measured by the Sharpe Ratio). I\u2019m going to use market and T-bill returns for the years 1927-2010.<\/p>\n

My assumptions are that an investor makes a decision at the beginning of each year to invest in either stocks or T-bills, based on his\/her prediction for the coming year. The Monte Carlo simulation is run using the actual annual returns for stocks and T-bills from 1927 to 2010, and 10,000 runs of the simulation are\u00a0plotted to generate a distribution.<\/p>\n

The Monte-Carlo results\u00a0for 50% prediction accuracy\u00a0are shown below.\u00a0 The red line represents the arithmetic average return for a buy and hold investor over\u00a0the years from 1926 thru 2010, and the distribution represents the market timing outcomes for the 10,000 trials:<\/p>\n

\"\"<\/a><\/p>\n

<\/p>\n

Clearly, the investor who decides between stocks and T-bills with only 50 percent accuracy has a very high chance of underperforming the market.\u00a0 The results do look slightly better if we compare the potential Sharpe ratios (i.e. the risk adjusted return) generated by this strategy to the Sharpe ratio realized by\u00a0the buy and hold investor.<\/p>\n

\"\"<\/a><\/p>\n

On average, the 50% accurate investor still tends to underperform after adjusting for risk, but there is now at least a small\u00a0chance of outperforming buy-and-hold.\u00a0 This occurs because the investor with 50% accurate timing spends a lot of time invested in risk-free assets (T-bills).<\/p>\n

If we repeat these tests with 60% accurate timing we get the following:<\/p>\n

\"\"<\/a><\/p>\n

\"\"<\/a><\/p>\n

We can see that, with 60% accurate market timing, there is still a high chance of underperforming buy-and-hold.\u00a0 However, on a risk adjusted basis, the average\u00a0results are similar to\u00a0buy-and-hold.<\/p>\n

If we examine the\u00a01926-2010\u00a0return data closely, we find that the stocks outperform T-bills\u00a0about 67% of the time, so the buy and hold investor who\u00a0holds only stocks\u00a0is actually invested in the higher performing asset class about 67% of the time.\u00a0 For this reason, we might expect that as accuracy goes to 70% we will see the average returns of the market timer outperform the buy and hold.\u00a0<\/p>\n

Here are the results with 70% accuracy:<\/p>\n

\"\"<\/a><\/p>\n

\"\"<\/a><\/p>\n

These simulation results show that the average returns of a market timer with 70% accuracy still underperform the buy and hold investor slightly over half the time.\u00a0\u00a0 This is true even though the buy and hold investor\u00a0is correct only about\u00a067% of the time.\u00a0 \u00a0The reason for this result\u00a0is that the\u00a0gain in return, when the investor correctly picks T-bills over stocks, is less, on average, than the loss of return when the market timer incorrectly picks T-bills over stocks.\u00a0<\/p>\n

Here are the results for 80% accurate market timing:<\/p>\n

\"\"<\/a><\/p>\n

\"\"<\/a><\/p>\n

With 80% accuracy we finally see the market timer outperform the returns of the buy-and-hold investor.\u00a0 However, note that, on average, the return is less than 2% higher.\u00a0 Therefore, if the market-timer is paying an advisor 2% of assets for timing advice, then even 80% timing will not be good enough!<\/p>\n

Conclusion:<\/strong><\/p>\n

This analysis illustrates the difficulties faced by an aspiring market timer.\u00a0 A very\u00a0high accuracy is required to beat the buy and hold investor in terms of raw returns, and an even higher accuracy is required if\u00a0we consider additional\u00a0costs such as management fees or trading costs.\u00a0 Our simulation results support Sharpe’s conclusion that the minimum accuracy required\u00a0is\u00a0over 70%.\u00a0<\/p>\n

On a risk adjusted basis, the results look better, but we still need an accuracy of over\u00a060%\u00a0for market timing to pay off.<\/p>\n

Supplemental Information:<\/strong><\/p>\n

Data:\u00a0\u00a0<\/strong><\/p>\n

The data for this analysis is from the Kenneth French website.\u00a0 The annual returns were extracted from the Fama-French Factor Data, and stored in a file named “F-F_Factors_annual.txt”.<\/p>\n

Code:<\/strong><\/p>\n

The Octave code used to generate these plots is shown here:<\/p>\n

\r\nclear all;\r\nclose all;\r\n\r\n%% Load Data into Octave\r\n\r\nff_returns = load('F-F_Factors_annual.txt');\r\n\r\n% Extract Data Columns\r\nannual_stock_dates = ff_returns(:,1);\r\nannual_stock_return = ff_returns(:,2)\/100 + ff_returns(:,5)\/100;\r\nannual_tbill_return = ff_returns(:,5)\/100;\r\n\r\n%plot(annual_stock_return);\r\n%figure\r\n%plot(annual_tbill_return);\r\n\r\n%% Part 1 Calculations\r\n\r\n% Stock beating tbills\r\npercent_stocks_exceeds_tbills = 100* sum((annual_stock_return - annual_tbill_return)>0)\/length(annual_stock_return);\r\n\r\n% 10,000 Random Guesses\r\n\r\nreturns = [annual_stock_return annual_tbill_return];\r\nfor i = 1:10000\r\n    % Guess t-bill or stock with 50\/50 probability\r\n    guess = 1+round(rand(length(annual_stock_return),1));\r\n    for j = 1:length(annual_stock_return)\r\n        return_draw(j) = returns(j,guess(j));\r\n    end\r\n    wealth(i) = prod(1+return_draw);\r\n    averagereturn(i) = mean(return_draw);\r\n    stdreturn(i) = std(return_draw);\r\n    sharpe(i) = mean(return_draw - annual_tbill_return')\/std(return_draw - annual_tbill_return');\r\nend\r\n\r\n%% Imperfect Timing\r\n\r\nreturns = [annual_stock_return annual_tbill_return];\r\n\r\n% Generate Random values for all sims\r\nguess = rand(length(annual_stock_return),10000);\r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n% 50% Accuracy\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\nfor i = 1:10000\r\n    for j = 1:length(annual_stock_return)\r\n        if guess(j,i) < 0.5\r\n            return_draw(j) =max(returns(j,:));\r\n        else\r\n            return_draw(j) = min(returns(j,:));\r\n        end\r\n    end\r\n    wealth50(i) = prod(1+return_draw);\r\n    averagereturn50(i) = mean(return_draw);\r\n    stdreturn50(i) = std(return_draw);\r\n    sharpe50(i) = mean(return_draw - annual_tbill_return')\/std(return_draw - annual_tbill_return');\r\nend\r\n\r\nfigure;\r\nhist(averagereturn50,100)\r\ntitle('Average Return of 50% Accurate Timing','fontsize',18)\r\nxlabel('Average Return','fontsize',16)\r\nhold on\r\nline([mean(annual_stock_return) mean(annual_stock_return)], [ylim()], 'linewidth',3.5,'color','red')\r\nhold off\r\n\r\nfigure;\r\nhist(sharpe50,100)\r\ntitle('Average Sharpe Ratio of 50% Accurate Market Timing','fontsize',18)\r\nxlabel('Average Sharpe Ratio','fontsize',16)\r\nhold on\r\nline([mean(annual_stock_return-annual_tbill_return)\/std(annual_stock_return-annual_tbill_return)...\r\n    mean(annual_stock_return-annual_tbill_return)\/std(annual_stock_return-annual_tbill_return) ],...\r\n    [ylim()], 'linewidth',3.5,'color','red')\r\nhold off\r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n% 60% Accuracy\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\nfor i = 1:10000\r\n    for j = 1:length(annual_stock_return)\r\n        if guess(j,i) < 0.6\r\n            return_draw(j) =max(returns(j,:));\r\n        else\r\n            return_draw(j) = min(returns(j,:));\r\n        end\r\n    end\r\n    wealth60(i) = prod(1+return_draw);\r\n    averagereturn60(i) = mean(return_draw);\r\n    stdreturn60(i) = std(return_draw);\r\n    sharpe60(i) = mean(return_draw - annual_tbill_return')\/std(return_draw - annual_tbill_return');\r\nend\r\n\r\nfigure;\r\nhist(averagereturn60,100)\r\ntitle('Average Return of 60% Accurate Timing','fontsize',18)\r\nxlabel('Average Return','fontsize',16)\r\nhold on\r\nline([mean(annual_stock_return) mean(annual_stock_return)], [ylim()], 'linewidth',3.5,'color','red')\r\nhold off\r\n\r\nfigure;\r\nhist(sharpe60,100)\r\ntitle('Average Sharpe Ratio of 60% Accurate Market Timing','fontsize',18)\r\nxlabel('Average Sharpe Ratio','fontsize',16)\r\nhold on\r\nline([mean(annual_stock_return-annual_tbill_return)\/std(annual_stock_return-annual_tbill_return)...\r\n    mean(annual_stock_return-annual_tbill_return)\/std(annual_stock_return-annual_tbill_return) ],...\r\n    [ylim()], 'linewidth',3.5,'color','red')\r\nhold off\r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n% 70% Accuracy\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\nfor i = 1:10000\r\n    for j = 1:length(annual_stock_return)\r\n        if guess(j,i) < 0.7\r\n            return_draw(j) =max(returns(j,:));\r\n        else\r\n            return_draw(j) = min(returns(j,:));\r\n        end\r\n    end\r\n    wealth70(i) = prod(1+return_draw);\r\n    averagereturn70(i) = mean(return_draw);\r\n    stdreturn70(i) = std(return_draw);\r\n    sharpe70(i) = mean(return_draw - annual_tbill_return')\/std(return_draw - annual_tbill_return');\r\nend\r\n\r\nfigure;\r\nhist(averagereturn70,100)\r\ntitle('Average Return of 70% Accurate Timing','fontsize',18)\r\nxlabel('Average Return','fontsize',16)\r\nhold on\r\nline([mean(annual_stock_return) mean(annual_stock_return)], [ylim()], 'linewidth',3.5,'color','red')\r\nhold off\r\n\r\nfigure;\r\nhist(sharpe70,100)\r\ntitle('Average Sharpe Ratio of 70% Accurate Market Timing','fontsize',18)\r\nxlabel('Average Sharpe Ratio','fontsize',16)\r\nhold on\r\nline([mean(annual_stock_return-annual_tbill_return)\/std(annual_stock_return-annual_tbill_return)...\r\n    mean(annual_stock_return-annual_tbill_return)\/std(annual_stock_return-annual_tbill_return) ],...\r\n    [ylim()], 'linewidth',3.5,'color','red')\r\nhold off\r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n% 80% Accuracy\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\nfor i = 1:10000\r\n    for j = 1:length(annual_stock_return)\r\n        if guess(j,i) < 0.8\r\n            return_draw(j) =max(returns(j,:));\r\n        else\r\n            return_draw(j) = min(returns(j,:));\r\n        end\r\n    end\r\n    wealth80(i) = prod(1+return_draw);\r\n    averagereturn80(i) = mean(return_draw);\r\n    stdreturn80(i) = std(return_draw);\r\n    sharpe80(i) = mean(return_draw - annual_tbill_return')\/std(return_draw - annual_tbill_return');\r\nend\r\n\r\nfigure;\r\nhist(averagereturn80,100)\r\ntitle('Average Return of 80% Accurate Timing','fontsize',18)\r\nxlabel('Average Return','fontsize',16)\r\nhold on\r\nline([mean(annual_stock_return) mean(annual_stock_return)], [ylim()], 'linewidth',3.5,'color','red')\r\nhold off\r\n\r\nfigure;\r\nhist(sharpe80,100)\r\ntitle('Average Sharpe Ratio of 80% Accurate Market Timing','fontsize',18)\r\nxlabel('Average Sharpe Ratio','fontsize',16)\r\nhold on\r\nline([mean(annual_stock_return-annual_tbill_return)\/std(annual_stock_return-annual_tbill_return)...\r\n    mean(annual_stock_return-annual_tbill_return)\/std(annual_stock_return-annual_tbill_return) ],...\r\n    [ylim()], 'linewidth',3.5,'color','red')\r\nhold off\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"

Monte Carlo Simulations using return data from 1926-2010 In 1975, Nobel laureate William Sharpe published a study titled “Likely Gains from Market Timing”. In this paper, Sharpe reportedly found that a market timer who switches between 100% stocks and 100% T-bills on an annual basis\u00a0must be correct about 74% of the time (on average)\u00a0to beat […]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/www.calculatinginvestor.com\/wp-json\/wp\/v2\/posts\/1102"}],"collection":[{"href":"http:\/\/www.calculatinginvestor.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.calculatinginvestor.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.calculatinginvestor.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.calculatinginvestor.com\/wp-json\/wp\/v2\/comments?post=1102"}],"version-history":[{"count":66,"href":"http:\/\/www.calculatinginvestor.com\/wp-json\/wp\/v2\/posts\/1102\/revisions"}],"predecessor-version":[{"id":1609,"href":"http:\/\/www.calculatinginvestor.com\/wp-json\/wp\/v2\/posts\/1102\/revisions\/1609"}],"wp:attachment":[{"href":"http:\/\/www.calculatinginvestor.com\/wp-json\/wp\/v2\/media?parent=1102"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.calculatinginvestor.com\/wp-json\/wp\/v2\/categories?post=1102"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.calculatinginvestor.com\/wp-json\/wp\/v2\/tags?post=1102"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}