[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [amibroker] Ulcer Index and Ulcer Performance Index



PureBytes Links

Trading Reference Links

Dave 9542 - 

 All of the formulas can be attributed to Brian Stocks author of FastTools, Ed Gilbert author TRADE and SCRIPTS written by others, CHEESE CHARTS,

and a local Amibroker guru (who become well know to you in the weeks ahead as he ramps up a virtual training room) . 

There are a few things with this routine that can trip you up depending on your data base. 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 Russell 2000 index,

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.  All of the formulas can be attributed to FastTools,

TRADE SCRIPTS, CHEESE CHARTS, and a local Amibroker guru. 

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.


Best regards
JOE

// *************************** 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", 252,125,500,5);

IndexSym = ParamStr("Russell 2000 Index Symbol","!rut");

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

Index = Foreign(IndexSym,"Close");

rfFund = Foreign("FDRXX","C");

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(2.2),1),MPT_Period) )/(SDF);

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

// Retracements from the Highest High Current Draw Down Here using Monthly Period to cal 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(2.2)/100)/UI;     // I have 2.2% here, early analysts used 5.4%

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

EndV = ValueWhen(DateNum()==DateNum(),C); // Today's Close

// hardcoded for 2005

BegV = ValueWhen(DateNum()==1050103,Close); // Starts year with Jan 3, 2005 Closing Value

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 ");

----- Original Message -----
From: dave9542
Sent: Thursday, April 14, 2005 2:01 PM
Subject: [amibroker] Ulcer Index and Ulcer Performance Index



Newby needs help.

I am interested in code that allows me to look at Ulcer Index and
Ulcer Performance Index for individual issues. Marcin was good enough
to point me to code written by Ken Close and then modified by TJ but
I still cannot get it to work. When run in Explore I'm told
that "variable Buy is used without being initialized".

Is it enough to place "Buy = 1" as first line in code or does this
distort results?

Here's code

Filter = Buy OR Sell;
Eq=Equity(0,0);
Per = 252;
Per2 = 40;
Cdd = (HHV(Eq,Per2) - Eq)/HHV(Eq,Per2);
MaxCdd = HHV(Cdd,252)*100;
R2 = (Sum(Cdd*Cdd,Per))/Per;
UI = 100*sqrt(R2);
Gain = Eq/Ref(Eq,-Per);
ANN = 100 * ((Gain^(252/Per)) - 1);
UPI = (ANN - 0.054)/UI;
AddColumn(MaxCdd,"MaxCdd",1.2);
AddColumn(ANN,"ANN",1.2);
AddColumn(UPI,"UPI",1.3);
AddColumn(ANN/MaxCdd,"ANN/dd",1.3);

Thanks
Dave









Please note that this group is for discussion between users only.

To get support from AmiBroker please send an e-mail directly to
SUPPORT {at} amibroker.com

For other support material please check also:
http://www.amibroker.com/support.html





Please note that this group is for discussion between users only.

To get support from AmiBroker please send an e-mail directly to
SUPPORT {at} amibroker.com

For other support material please check also:
http://www.amibroker.com/support.html





Yahoo! Groups Links