MSR Strategy

A post that has been on my to-do list for some time is analysis of the MSR indicator in a trading strategy. It is the follow up post of my implementation of the MSR indicator with my self-built Median() function in a dll for amibroker.

The analysis is built up in 4 steps:
1. Application of the MSR indicator to my broad universe of  25 ETF’s
2. Application of the MSR indicator a portfolio of the 25 ETF’s
3. Comparison of the MSR indicator as trend filter with other filters
4. Conclusion

The post is rounded up with the Amibroker code   – QD –

1. MSR indicator used for 25 ETF’s

The Table below summarizes the performance of the simple MSR strategy:

  • long when MSR>50
  • exit when MSR<50
  • fixed position size of 10.000$
  • history: 1/1/2003 – 31/12/2010
  • tx fees based on Interactive Brokers schedule & dividends included.
  • No interest on cash.

The strategy delivers a positive return for all 25 ETF’s over the period with an average CAR of 7.8% and average DD of -17.8%.

2. MSR indicator for a portfolio of 25 ETF’s

The next analysis shows trading the system for each of the ETF’s in a portfolio of 25 ETF’s:

  • long when MSR>50
  • exit when MSR<50
  • fixed position size of 10.000$ for each ETF.
  • history: 1/1/2003 – 31/12/2010
  • tx fees based on Interactive Brokers schedule & dividends included.
  • No interest on cash.

Trading the portfolio increases the risk/reward ratio as measured by CAR/MDD.

3. MSR indicator as trendfilter

Originally the indicator was meant o function as trendfilter.  So let’s look at a simple RSI2 strategy that we can use to measure the MSR effectiveness:

  • long when RSI(2)<50
  • exit when RSI(2)>50
  • fixed position size of 10.000$ for each ETF.
  • history: 1/1/2003 – 31/12/2010
  • tx fees based on Interactive Brokers schedule & dividends included.
  • No interest on cash.

We will apply the MSR filter and compare it with a simple WMA89 filter as well as the DVI filter. See the results below. We can see that the MSR indicator does bring some benefits in reducing drawdown but does it at cost of return. Compared to the other 2 filters it does not do a better job.

Conclusion

The MSR indicator is an interesting & innovative concept. Tested on the ETF portfolio it does a good job on all 25 ETFs, however it does not seem to bring an additional edge when compared to other trendfilters like WMA89 or DVI. I will therefor prefer to work with these and not use the MSR.

Amibroker Code

SystemName="sD_ETF_MSR";
_CashPercentage=0;_MaxScaleIn=4; _Cashticker    ="IEF"; _Cashticker2        = "VIX";
#include<Boiler Plate.afl>
#include<Additional Functions.afl>
#include<OutputStatistics.afl> 
pos=25;
size=10000;
SetOption("InitialEquity",pos*size);
SetPositionSize(size,spsValue);
SetOption("AccountMargin",100);
SetOption("MaxOpenPositions", pos ); 
Period1=Optimize("p1",10,10,50,10);Period2=Optimize("p2",20,10,100,10);Period3=252;
MaxH=HHV(H,period2);MaxL=HHV(L,period2);MaxC=HHV(C,period2);
Max3=Max(Max(MaxH,MaxL),MaxC);
MSR=(QDMedian3(H,L,C,period1)-Max3)/Max3;
rank=percentrank(MSR,252);
BuyCond=RSI(2)<50 AND DVI(252)<50;//C>WMA(C,89);//rank>50 ;
SellCond=RSI(2)>50 OR DVI(252)>50;//C<WMA(C,89);//rank<50 ;
ShortCond=0;//Sellcond;
CoverCond=0;//BuyCond;
Buy = BuyCond ;
Sell =SellCond;
Short =ShortCond;
Cover =CoverCond;

2 thoughts on “MSR Strategy

  1. Q: In these lines
    MaxH=HHV(H,period2);MaxL=HHV(L,period2);MaxC=HHV(C,period2);
    Max3=Max(Max(MaxH,MaxL),MaxC);
    Wouldn’t MaxL never be higher than MaxH and the same for MaxC?
    Also, are you using Ami for the Tables or is this excel?

    All The Best,

    john

    • Hi John,
      I agree with your comments regarding MaxL vs MaxH/MaxC. I left the code in place as I made a 100% exact copy of the formula’s in the original indicator in Excel.
      The tables are made in Excel, using output files created by code in my Amibroker custom backtest file.
      QD

Leave a Comment