Dual momentum: lookback parameter

A great advantage of dual momentum is the low number of parameters (typically only a lookback length of 12 months is used).  This reduces the likelihood that results are curve-fitted or uncovered by data-mining and subsequently useless in real-time trading.

The plot below compares a 12 month lookback against 1 month and a 50:50 combination of both lookbacks:

Dual4

Annual returns and sharpe ratios are listed in the chart legend and are very similar.

Of major interest though, the correlation between ’12’ and ‘1’ monthly returns is only 0.62.  Finding consistently uncorrelated strategies is difficult but rewarding.  When the two strategies are combined, standard deviation is reduced and sharpe ratio is increased to 1.3.

A zoomed plot from 2000 to present is shown below:

Dual5

The larger drawdowns experienced by the individual strategies (2002, 2009 and 2011) have been reduced by combining the two relatively uncorrelated curves, without sacrificing returns.

Advertisements

12 thoughts on “Dual momentum: lookback parameter

  1. Pingback: The Whole Street’s Daily Wrap for 2/12/2015 | The Whole Street

  2. Hello. Thank you for sharing your test results. Can you post the simplest form of dual momentum in Amibroker code? The one that uses relative momentum against another equity index, and absolute momentum against T-Bill return. Thank you.

    • I did this in Excel but in Amibroker (using 0 instead of T-Bill for simplicity):

      Buy = ROC(C,12) > 0;
      Sell = 1-Buy;
      Positionscore = ROC(C,12);

      • Thank you very much!
        Do you know how can I add the T-Bill filter (SHY, AGG or TLT for example)?
        I would like to stay invested in short term ETF while equity indexes returns are below T-bill returns.
        Thank you again.

      • Use rotational trading and T-Bills will be selected when their 12 month returns are highest:

        EnableRotationalTrading();
        SetOption(“WorstRankHeld”,1);
        PositionScore = ROC(C,12);

      • Thank you for the rotational trading code!. This could be one of the best systems of all time (in terms of risk and return). I added SetOption(“MaxOpenPositions”, 1); to select only one ETF.
        But in backtester report > charts > profit table I get the real return of a specific month reported in the previous month (for example, february return appears on the month of january). Do you know how could be wrong? maybe the trade should be opened at the first day of the month or its necessary to change something in settings?… Thanks again for your help.

      • I agree, this is what I use in my own accounts.
        You can try setting the trade delays but sometimes the rotational backtester is a mystery.
        settradedelays( 1, 1, 1, 1 );
        settradedelays( 0, 0, 0, 0 );

        Alternatively you could test on a daily timeframe using ROC(C,252). There may be slightly more trades but the result should be similar and the returns would align with the correct dates +/- 1 day.

    • All lookbacks from 1-12 work fine. Annual return is ~1% lower for the intermediate values. It would be interesting to equal weight portfolios with all lookbacks – this should give the best sharpe. Perhaps the subject of a future post.

  3. As a real world example, if one had $100k to invest would they put 50% in the 12 month leader and 50% in the one month or average the two and invest 100% in that?
    Loved your book by the way.

    • Thanks! To match the above strategy it would 50% in each leader in a tax sheltered account. In a taxable account the 12 month lookback would probably be preferred as the switches are less frequent.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s