No. of Recommendations: 10
If anyone uses Amibroker and would like the code for generating their own superior six candidates here it is. I assume you know how to use Amibroker and accordingly will make only a few comments. Note: I have not found it to ever replicate Zee's picks exactly and between my approach and his I'm pretty sure who is more accurate and it isn't me. :-)

Quick notes (You may want to add them into the script)

1. You can change your base symbols for the UPI calculations. I have chosen SHV and SPY
2. You can use any of the variables below in addition to UPI as the "Position Score". However, I have found UPI to be consistently the best sort over many different backtests
3. MPT lookback length makes a big difference depending on what type of ETF category you use. I have my database broken up into sectors, countries, indexes and combinations of these. You can see some of my comments from summer testing as to what works best. As a general rule around 300 works well for about all categories.
4. You can create your own "superior whatever" by adjusting the Buy/Sell/ShortDays variables.
5. In my backtests I believe a "Superior 10" long works quite well followed immediately by a "Crappy 5" short. In most years it does not hurt returns much and in choppy or bad years it boosts them quite a bit. For example in 2007 doing the Superior 10/Crappy 5 beat the Superior 10 in just about every category thus far.

Cheers Kev




/*There are a few things with this routine that can trip you up depending on your data base.

1)One is the money market rate,

2)The assumed risk free interest rates where convention uses 5.4% (man I wish this were True),

3)The symbol of the S&P 500 Index via the SPY ETF, AND the window OR so called MPT period. The latter are in two
parameters to adjust. I've seen many versions of MPT calculations AND they all present somewhat different values for UI AND UPI.


You can strip the UI UPI code from this AND make your own exploration routine that doesn't depend on Buy/Sell OR the Equity curve.*/


// *************************** Function Section to calculate Risk Free Fixed Rate *********

function Irate(interest_rate)

{

// This gets the log of the daily rate

logbarfactor = log(1 + interest_rate / 100) / 252;

// Force the first bar to 0

logvect = IIf(BarIndex() == 0, 0, logbarfactor);

// Sum the log of the daily gain factors and

// convert back to get equity

return(exp(Cum(logvect)));

}

// -----------------------------------General Section--------------------------------

period = 22; // 22 trading days a month
MPT_Period = Param("MPT Period", 50, 0, 500, 10); //310 broad optimum, 50 for single country
//MPT_Period = Optimize("MPT Period", 130, 0, 500, 5);
IndexSym = ParamStr("S&P 500 Index ETF","SPY"); // NOTE: Figure out how to change this

// ------------------------------------MPT Section------------------------------------

Index = Foreign(IndexSym,"Close");
rfFund = Foreign("SHV","C"); //NOTE: Will need to get this loaded or use a different symbol (original:FDRXX)
riskfree = ((rffund/ Ref(rfFund,-MPT_Period)))^(252);

// Correlation coefficient of Equity to the Index
Corr = 100*Correlation(ROC(C,1),ROC(Index,1),MPT_Period);
SDF = StDev(ROC(Close, 1),MPT_Period);
SDI = StDev(ROC(Index, 1),MPT_Period);
RelStDev = SDF/SDI;

// Calculation of Beta -
Beta = Corr * RelStDev/100; // volatily relative to benchmark
NCAlpha = MA(ROC(Close,1),MPT_Period) - RelStDev*MA(ROC(Index,1),MPT_Period); // noncorrelated Alpha
Alpha = MA(ROC(Close,1),MPT_Period) - Beta*MA(ROC(Index,1),MPT_Period); // textbook definition

// SHARPE PERFORMANCE INDEX a risk adjusted measure of the performance of an Equity compared to the risk free benchmark standard rate of return = 5%
SHARPE = ( MA(ROC(C,1),MPT_Period) - MA(ROC(irate(5.1),1),MPT_Period) )/(SDF);

// ----------------------------------- UPI Code ---------------------------------------

// Retracements from the Highest High Current Draw Down Here using Monthly Period to call these numbers.
Cdd = (HHV(C,MPT_Period) - C)/HHV(C,MPT_Period);

// Max draw down
MaxDD = HHV(CDD,MPT_Period);

// Sum of all retracements squared -
R2 = (Sum(Cdd*Cdd,MPT_Period))/(MPT_Period-1);

// Ulcer Index -Cumulative downside volatility of an equity
UI = sqrt(R2);

// Annual compound percentage rate of return
TR = Close/Ref(Close,-MPT_Period); // Total Return for 1 year
ANN = (exp(log(TR))-1); // Annual compounded rate of return

// Ulcer performance index - risk adjusted performance of an investment.
UPI = (ANN - irate(5.1)/100)/UI; // I have 2.2% here, early analysts used 5.4%

// ----------------------------- Performance Calculation ----------------------------

EndV = ValueWhen(DateNum()==DateNum(), C); // Today's Close
BegV = ValueWhen(DateNum()==1070103, C); // Starts year with Jan 3, 2005 Closing Value (original:1050103)

//Returns the array with numbers that represent quotation dates coded as follows:
//10000 * (Year - 1900) + 100 * Month + Day, so 2001-12-31 becomes 1011231 AND 1995-12-31 becomes 951231
YTD = 100*(EndV-BegV)/BegV;

// --------------------------- Calculate RSI / Stochastics - Exploration --------------------------------------

slow=LLV(C,21);
shigh=HHV(C,21);
faststoc=EMA(100*(C-slow)/(shigh-slow),13)/2 + RSI(14)/2;
momentum=faststoc-Ref(faststoc,-6); // as used in Cheese3 and FT
momentumchg=((faststoc-Ref(faststoc,-6))/Ref(faststoc,-6))*100; //as used in Cheese3 and FT

// ---------------------------- Test Section -----------------------------------------------------
xbar = MA(ROC(C,1),MPT_Period);
SumR2 = Sum((ROC(C,1)-xbar)^2,MPT_Period);
Sigma = (SumR2/(MPT_Period-1))^.5;
Filter = 1;
AddTextColumn(FullName(),"Name",1.2);
AddColumn(Corr,"Cor Coeff");
AddColumn(Alpha,"Alpha");
AddColumn(NCAlpha,"NCAlpha");
AddColumn(Beta,"Beta");
AddColumn(SDF,"Std Dev");
AddColumn(RelStDev,"RelSD");
AddColumn(Sharpe,"Sharpe");
AddColumn(100*Ann,"ANN");
AddColumn(100*MaxDD,"MDD %");
AddColumn(100*UI,"UI");
AddColumn(UPI,"UPI");
AddColumn(faststoc,"Stoch/RSI",1.2);
AddColumn(momentum,"Mom",1.2);
AddColumn(momentumchg,"Mom-Chg%",1.2);
AddColumn(ROC(C,Period)," 1 mnth");
AddColumn(YTD," YTD");
AddColumn(ROC(C,MPT_Period)," 1 yr ");

PositionScore = UPI;

PosSize = Param("Position Size", 1, 1, 25, 1 );
//PosSize = Optimize("Postion Size", 2, 1, 10, 1 );
//MArginFactor = Param("Margin Factor", 1, 1, 100 );
//MarginFactor = Optimize("Margin Factor", 1, 1, 10, 1 );
SetOption("MaxOpenPositions", Possize );
PositionSize = -100/PosSize;

//All 6/3/6/360/37.7% hold 1, 29.5% hold 3
//EEM Settings 7/4/5/-/41.1%
//Country 6/3/4/450/25.7% Analysis of days only yields 6/2 long only as optimal and in sample set of 50 days (as of 7/4/2007)
//Intl Sector 6/3/4/350/33.5% Analysis of days only yields 6/2 long only as optimal and in sample set of 50 days (as of 7/4/2007)
//US Sector 6/4/4/310/29.3%
//Asset Classes 6/3/5/310/22.9%
//Intl Index 6/3/6/350/44.7%
//iShares 6/3/5/420/34.97%
//Ultra Long Shares 6/2/50/10.1% Analysis of days only yields 6/2 long only as optimal and in sample set of 50 days (as of 7/4/2007)



//BuyDays = Param("# of BuyDays", 6, 1, 10, 1 );
//SellDays = Param("# of SellDays", 2, -1, 15, 1 );
//ShortDays = Param("# of ShortDays", 3, 0, 10, 1 );
//Mo = Param("Month", 1, 1, 12, 1);*/

BuyDays = Optimize("# of BuyDays", 6, 1, 11, 1 );
SellDays = Optimize("# of SellDays", 3, 0, 11, 1 );
ShortDays = Optimize("# of ShortDays", 4, 3, 8, 1 );
//Mo = Optimize("Month", 1, 1, 12, 1);*/


m = Month()!=Ref(Month(),-1);
Buy = Ref( m, BuyDays );// AND Month() != 6 AND Month() !=7 AND Month() !=8;//
Sell = Ref( m, -SellDays ); //AND Month() == Mo+1;
Short = Ref(m, - SellDays);// AND Month() == 6;
Cover = Ref(m, - (SellDays+ShortDays)); //AND Month() == Mo+1;
Print the post  

Announcements

What was Your Dumbest Investment?
Share it with us -- and learn from others' stories of flubs.
When Life Gives You Lemons
We all have had hardships and made poor decisions. The important thing is how we respond and grow. Read the story of a Fool who started from nothing, and looks to gain everything.
Contact Us
Contact Customer Service and other Fool departments here.
Work for Fools?
Winner of the Washingtonian great places to work, and Glassdoor #1 Company to Work For 2015! Have access to all of TMF's online and email products for FREE, and be paid for your contributions to TMF! Click the link and start your Fool career.