In pt.1 we backtested a “fuzzified” trading strategy in Matlab (read part 1):
Buy when RSI(3) is Low and it’s before Expiration week.
Although it was easy to develop this fuzzy model in Matlab, due to the intuitive GUI, it is difficult to get meaningful backtest results, visual signals, statistics and, of course, portfolio level backtesting. Everything is possible in Matlab but it takes considerable time and effort. I would rather backtest in Amibroker and get all my usual statistics, equity curves, visual arrows, as well as 1 click portfolio backtesting.
So how do we code this in Amibroker?
Again here’s the basic idea:
You can say buy when RSI(3)<25
Or you can say Buy when RSI(3) is fairly Low
You can say Buy on Monday of Expiration Week
Or Buy around the middle of the month.
I will be using some custom functions I developed:
//Let’s keep these for reference
indicators = “rsi3,Day_M”;
Property_ind1 = “Low,Neutral,High”;
Property_ind2 = “EarlyMonth,AroundExpirationWeek,EndMonth”;
Output = “Action”;
Property_Action = “Buy,Hold,Sell”;
RSI3 = RSI( 3 ); //0-100
Day_M = Day(); //1-31
and
So now we’ll use two more custom functions that create the rules
1. FuzzyAndInf() – Stands for Fuzzy “AND” inference
2.FuzzyInf()
FuzzyAndInf( 0, “rsi3”, “Low”, “Day_M”, “AroundExpirationWeek”, “Action”, 1 );
FuzzyAndInf( 1, “rsi3”, “High”, “Day_M”, “EarlyMonth”, “Action”, -1 );
FuzzyInf( 2, “rsi3”, “High” , “Action”, -1 );
that roughly corresponds to these statements:
If RSI(3) is Low and it’s AroundExpirationWeek then Action is Buy
If RSI(3) is High and it’s EarlyMonth then Action is Sell
If RSI(3) is High then Sell
Then we have to weight the rules and defuzzify. Here I will simplify things since I cannot yet code a proper output membership function and de-fuzzify algorithm (help would be appreciated from math inclined people…).
Anyways, here are the reults. Remember this is a very simple concept of low RSI and expiration week positive bias…
1. SPY from 1995-August 2012
2. $0.006 commission per trade
3. Start with 100,000. Long only
Profit = 1359462.71 (1359.46%),
CAR = 16.37%,
MaxSysDD = -358582.04 (-43.88%),
CAR/MDD = 0.37,
# winners = 363 (68.75%),
# losers = 165 (31.25%)
So here’s the whole code:
indicators = “rsi3,Day_M”;
Property_ind1 = “Low,Neutral,High”;
Property_ind2 = “EarlyMonth,AroundExpirationWeek,EndMonth”;
Output = “Action”;
Property_Action = “Buy,Hold,Sell”;
RSI3 = RSI( 3 ); //0-100
Day_M = Day(); //1-31
SetMember( “rsi3”, “Low”, TRIMember( rsi3, -40.5, 0.475, 40.34 ) );
SetMember( “rsi3”, “Neutral”, TRIMember( rsi3, 10, 50, 90 ) );
SetMember( “rsi3”, “High”, TRIMember( rsi3, 60, 100, 140 ) );
SetMember( “Day_M”, “EarlyMonth”, GaussMember( Day_M, 5.27, -0.164 ) );
SetMember( “Day_M”, “AroundExpirationWeek”, GaussMember( Day_M, 3.94, 15.83 ) );
SetMember( “Day_M”, “EndMonth”, GaussMember( Day_M, 5.266, 31) );
FuzzyAndInf( 0, “rsi3”, “Low”, “Day_M”, “AroundExpirationWeek”, “Action”, 1 );
FuzzyAndInf( 1, “rsi3”, “High”, “Day_M”, “EarlyMonth”, “Action”, -1 );
FuzzyInf( 2, “rsi3”, “High” , “Action”, -1 );
//FuzzyAndInf( 3, “rsi3”, “Low”, “Day_M”, “EndMonth”, “Action”, 0 );
weight=0;
weight[0]=Param( “w0”, 1, 0.1, 1, 0.1 );
weight[1]=Param( “w1”, 1, 0.1, 1, 0.1 );
weight[2]=Param( “w2”, 1, 0.1, 1, 0.1 );
// weight[3]=Param( “w3”, 1, 0.1, 1, 0.1 );
Sellout = Holdout = Buyout = 0;
for ( k = 0;k <= 2;k++ )
{
Buyout = Buyout +( Nz( getRuleRes( 1, k ) ) ) * weight[k];
Holdout = Holdout +( Nz( getRuleRes( 0, k ) ) ) * weight[k];
Sellout = Sellout + (Nz( getRuleRes( -1, k ) ) )* weight[k];
}
decision = ( 0 * Sellout + 0.5 * Holdout + 1 * Buyout ) / ( Sellout + Holdout + Buyout );
decision=IIf( ( Sellout + Holdout + Buyout )==0,0 ,decision );
//Plot(decision,”decision”,colorRed);
Buy=decision>0.5;
Sell=decision<0.5;
Anonymous says
Can you post the clean formula for amibroker ? I paste this formula and i get errors on amibroker.
Thanks.
Sanz Prophet says
The Amibroker formula has custom functions (i.e., SetMember() ,TRIMember()) that I have not shared publicly. The formula is a template to get you started developing your own fuzzy code. You can e-mail me explaining what it is you want to do and I'd be happy to help and point you in the right direction.
Anonymous says
please send me me function on miner[dot]traderatyahoo[dot]com[dot]sg
Anonymous says
Hello sir,
this looks interesting and very promising
Kindly guide me ..how to apply this in amibroker ,
Thank you.
my mail = darshan_age[at]rediffmail[dot]com
many thanks