Not impressed? You should be...
Although you might not be impressed, there is a very impressive and potentially usefull aspect of this strategy. Let's zoom in on the 2008-2009 crash:While SPY (SP500 ETF) crashed 52%, the strategy made 48%.
That's a time when most managers were wiped out. It turns out this "tail risk" protection came purely from the SHORT trades.
Let's break down the equity to long trade equit and short trade equity:
Equity due to LONG trades (flat due to 200 Mov. Average filter)
Equity due to SHORT trades (Once prices under their 200 MA, shorts kick in) :
And here's the Equity for the strategy Short positions only, from 2002 till 2012. Notice the Augoust 2011 mini crash that did damage to most intelligent strategies? This is what I call cheap "tail risk" insurance. This is the effect that most managers want when buying VIX futures and have to accept the roll-over cost.
The Short only stats 2002-2012:
Profit = 70574.62 (70.57%), CAR = 5.17%, MaxSysDD = -11885.08 (-7.72%), CAR/MDD = 0.67,
# winners = 480 (69.87%), # losers = 207 (30.13%)
So here's a strategy that provides tail risk protection, has negative correlation to the market and historically had only a -7.72% draw-down. That is not bad at all.
Keep in mind that there is a extra charge for being short an ETF. For example when Spain was in trouble (2012), keeping an EWP short (spain ETF) would have cost you a 7+% interest. This strategy holds an ETF short for an average of 4.66 bars and it holds up to 10 Etfs. So this would not be much of an additional cost.
Amibroker Code:
Amibroker code:
//Code by VangelisM. (aka - sanzprophet )//Part of Code taken by afl from Library - Paul's "Connors TPS - ETFs.afl"
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle| ParamStyle("Style") | GetPriceStyle() );
aggresive=ParamToggle("Agressive?","NO|YES",0);
Buy=Sell=Cover=Short=0;
SetTradeDelays(0,0,0,0);
BuyPrice=SellPrice=CoverPrice=ShortPrice=C;
qty=Param("Positions",1,1,50,1);
SetOption( "MaxOpenPositions", qty );
FirstTriggerPrice =InFirstPos=0;
if(!aggresive)
{
aboveMA=C>MA(C,220);
belowMA5=C
MDD=Sum(C[=4;]
Buy1=aboveMA AND belowMA5 AND MDD;
Buy=Buy1;
Sell=!belowMA5;
Sell=ExRem(Sell,Buy);
MDU=Sum(C>Ref(C,-1),5)>=4;
Short1=C
Short=Short1;
Cover=belowMA5;
PositionSize=-98/qty;
PositionScore=IIf(Buy,100-RSI(3),RSI(3));
}
if(aggresive)
{
aboveMA=C>MA(C,220);
belowMA5=C
MDD=Sum(C
Buy1=aboveMA AND belowMA5 AND MDD;
Buy=Buy1;
Sell=!belowMA5;
Sell=ExRem(Sell,Buy);
MDU=Sum(C>Ref(C,-1),5)==4;
Short1=C
Short=Short1;
Cover=belowMA5;
BarsSinceSell = BarsSince(Sell);
InFirstPos =Flip(Buy1,Sell);
FirstTrigger = ExRem(InFirstPos, Sell);
BarsSinceFirstTrigger = BarsSince(FirstTrigger);
FirstTriggerPrice = IIf(BarsSinceFirstTrigger < BarsSinceSell,Ref(C,-BarsSinceFirstTrigger), 0 );
SecondEntry = aboveMA AND C < FirstTriggerPrice AND InFirstPos AND Ref(InFirstPos,-1);
InSecondPos = Flip(SecondEntry, Sell);
SecondTrigger = ExRem(InSecondPos, Sell);
BarsSinceSecondTrigger = BarsSince(SecondTrigger);
SecondTriggerPrice = IIf(BarsSinceSecondTrigger < BarsSinceSell,
Ref(C,-BarsSinceSecondTrigger), 0);
BarsSinceCover = BarsSince(Cover);
FirstShortEntry = Short1; ;
InFirstShortPos = Flip(FirstShortEntry, Cover );
FirstShortTrigger = ExRem(InFirstShortPos, Cover );
BarsSinceFirstShortTrigger = BarsSince(FirstShortTrigger);
FirstShortTriggerPrice = IIf(BarsSinceFirstShortTrigger < BarsSinceCover ,Ref(C,-BarsSinceFirstShortTrigger), 0 );
//FirstTriggerPrice = IIf(BarsSinceFirstTrigger < BarsSinceSell,Ref(O,-BarsSinceFirstTrigger+1), 0 );
SecondShortEntry = !aboveMA AND C >FirstShortTriggerPrice AND InFirstShortPos AND Ref(InFirstShortPos,-1);
InSecondShortPos = Flip(SecondShortEntry, Cover );
SecondShortTrigger = ExRem(InSecondShortPos, Cover );
BarsSinceSecondShortTrigger = BarsSince(SecondShortTrigger);
SecondShortTriggerPrice = IIf(BarsSinceSecondShortTrigger < BarsSinceCover,
Ref(C,-BarsSinceSecondShortTrigger), 0);
PositionSize=-98/qty;
PositionScore=IIf(Buy OR SecondEntry ,100-RSI(3),RSI(3));
Buy=IIf(Buy1,1,IIf(SecondEntry AND Sum(Secondentry,BarsSinceSell)==1 ,sigScaleIn,0));
Short=IIf(Short1,1,IIf(SecondShortEntry AND Sum(SecondShortentry,BarsSinceCover)==1 ,sigScaleIn,0));
}
"FirstTriggerPrice "+FirstTriggerPrice ;
"InFirstPos "+InFirstPos ;
"InFirstPos -1 "+Ref(InFirstPos, -1) ;
GfxSelectPen( colorBlack, 2 );
GfxSelectFont("Times New Roman", 12, 200, False );
GfxTextOut("Larry Connors MDD/MDU",10,20);
shape = Buy * shapeUpArrow + Sell * shapeDownArrow;
PlotShapes( shape, IIf( Buy, colorGreen, colorYellow ), 0,C );