2013 Summary

by ivannp on January 6, 2014

2013 was a tough year. Trading was tough, with one of my strategies experiencing a significant drawdown. Research was tough – wasted a lot of time on machine learing techneques, without much to show for it. Also made some expensive mistakes, so all in all – it was a year I’d prefer I had avoided. :)

The strategy I use on the SPY, for which I share my entries and exits, was the biggest disappointment. Not only it ended the year in red (to the tune of -6.5%), but it also dragged me through a significant (close to its historical maximum) drawdown. This unpleasant experience was a practical conformation of the toughness of trading at psychological level.

My ARMA strategy performed well, but not exceptionally so, thus, I ended up with an overall gain of about 5% in my trading account (the SPY strategy and the ARMA strategy).

The Max-Sharpe strategy which I started using in May this year returned 12% for the year. However, that’s exactly where I did my “expensive” mistake, thus, I ended only with a small plus for the months I traded it.

At the end of the year, I like to look at the annual volatility. As the following chart illustrates, 2013 was a year of low volatility on historic basis:

Dow Jones Annual Volatility

Dow Jones Annual Volatility

The following code confirms:

library(quantmod)
 
getSymbols("DJIA", src="FRED", from="1800-01-01")
# Use FRED, Yahoo does not provide Dow Jones historic data anymore
 
dji = na.exclude(DJIA["/2013"])
 
djiVol = aggregate(
               dji,
               as.numeric(format(index(dji), "%Y")),
               function(ss) coredata(tail(TTR:::volatility(
                                                   ss,
                                                   n=NROW(ss),
                                                   calc="close"), 1)))
ecdf(as.vector(djiVol))(as.numeric(tail(djiVol,1)))
# The result is 0.1864407, the 18nd quantile

# Compute the absolute returns
absRets = na.exclude(abs(ROC(dji["/2013"], type="discrete")))
 
# Summarize annually
yy = as.numeric(format(index(absRets), "%Y"))
zz = aggregate(absRets, yy, function(ss) tail(cumprod(1+ss),1))
 
print(as.vector(tail(zz,1)))
# The result is 3.45

The second computation shows how much money an owner of a crystal bowl would have made at best – he would have been able to multiply his money less than three and a half times! As crystal balls go, that’s an inferior performance.

The only significant change I am hoping for in 2014 – is a change in the luck factor. Let’s see whether I was good in 2013 … Happy Trading! :)

{ 3 comments… read them below or add one }

Robert Young January 7, 2014 at 08:45

J.K. Galbraith said, “Financial genius is a rising market”. That’s all you need to know. Quants can aid one in predicting gross money flows, if you’ve got the money needed to acquire sufficiently granular data (and not violate insider trading proscriptions). And, if one can predict money flows, one can front run the traders. Otherwise, buy when the market starts bull, and either leave or short when the party’s over (does Mr. Market ring a servant’s bell when it’s time to go???). Last year, and since 2009, has been a QE fueled bull market.

Individual stocks move based on real events. Anticipating those events, possibly with quant assistance (most likely, not) is the key to large gains. Call them dark swans, not quite black, since many happen each year across an economy.

Reply

quant hobbyist January 10, 2014 at 17:55

Fundamentals can never be taken place of. But good quant is the best compliment to maximizing returns. It can chance a 60% return to 70% return. And compounding rates is quite powerful. This blog is fantastic and shows great skill at writing code. Imagine what he could do with combining macro data through r thinknum.

Keep blogging away.

Reply

Sasha January 29, 2014 at 16:01

Always enjoing from your blog, best of luck for 2014!!!

Reply

Leave a Comment