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

Re: [amibroker] KASE PeakOscillator



PureBytes Links

Trading Reference Links

Byron, Ram and others interested, here is what I've come up with
re. 
the KASE PeakOscillator and PeakOut Lines. I am quite confident that 
this code captures the essence of Kase's measurements but less 
confident that code efficiency can't be improved. 

Traders using momentum, not averse to math and not yet familiar with 
Kase's work I recommend to take a look. For me it is the first 
purely technical indicator that caught my serious interest. Always 
turned off by fixed lookbacks I found Kase's approach very 
refreshing: with adaptive lookbacks and a very sound statistical 
foundation her work truly stands out in my opinion. 

The use of functions in the code makes me personally see things 
clearer and as I understood these do not slow things down I use them 
wherever applicable (Dimitris I twisted your dynamic st.dev code 
into a function as well).

This one could replace the "out-moded MACD" (Kase quote),
though has 
a very different foundation. For those interested in details Kase 
explains most (but not all) in a bunch of articles free available at

http://www.kaseco.com/articles_etc/articles.htm

under "primarily trading related" esp. the 2 articles "the best
momentum indicators" and "the two faces of momentum".

Read the remarks after the code for some explanations.
 
/* code start */

/* 
Definition of 3 different standard deviation measurements.
SD_pop is the population or biased version, similar to AFL StDev.
SD_sam is the sample or non-biased version which Kase describes in 
her book and assumedly uses in her indicators.
SD_nnc is the non-centered version in which not the distances 
between the values and the mean are squared but instead the values 
themselves. Though not formally a standard deviation it appears used 
by traders especially for measuring short-term volatility in strong 
trends. 
*/

function SD_pop(input,n)
{ return sqrt( (n*Sum(input^2,n)-(Sum(input,n))^2) / n^2 ); }

function SD_sam(input,n)
{ return sqrt( (n*Sum(input^2,n)-(Sum(input,n))^2) / (n^2-n) ); }

function SD_nnc(input,n)
{ return sqrt( Sum(input^2,n) / n ); }

/* Set your preferred standard deviation measurement SD */
function SD(input,n) { return SD_pop(input,n); } 
//function SD(input,n) { return SD_sam(input,n); } 
//function SD(input,n) { return SD_nnc(input,n); } 

/* Set minimum and maximum lookbacks */
minLB = 8;
maxLB = 65;

/* Set percentiles for PeakOut lines using numbers between 81 and 99 
*/
PCcycl = 98;
PChist = 90;

/* Definition of Kase PeakOscillator KPO */

function Kup(n)
{ return log(H/Ref(L,-n)); }

function Kdn(n)
{ return log(Ref(H,-n)/L); }

function Kvol(n)
{ return SD(log(Ref(C,-1)/C), n); }

function KSDIup(n)
{ return Kup(n)/(Kvol(n)*sqrt(n)); }

function KSDIdn(n)
{ return Kdn(n)/(Kvol(n)*sqrt(n)); }

maxKSDIup = KSDIup(minLB);
for (i=minLB+1;i<=maxLB;i++)
{ maxKSDIup = IIf(KSDIup(i)>maxKSDIup,KSDIup(i),maxKSDIup); }

maxKSDIdn = KSDIdn(minLB);
for (i=minLB+1;i<=maxLB;i++)
{ maxKSDIdn = IIf(KSDIdn(i)>maxKSDIdn,KSDIdn(i),maxKSDIdn); }

KPO = maxKSDIup - maxKSDIdn;

/* Definition of PeakOut lines POmax and POmin */

UPcycle = minLB;
for (i=minLB+1;i<=maxLB;i++)
{ UPcycle = IIf(KSDIup(i)==maxKSDIup,i,UPcycle); } 

DNcycle = minLB;
for (i=minLB+1;i<=maxLB;i++)
{ DNcycle = IIf(KSDIdn(i)==maxKSDIdn,i,DNcycle); } 

function t(x)
{ return 1 / (1+0.2316419*x); }

function HAS(x)
{ return 1 - (exp(-0.5*x^2)/sqrt(2*3.141592654))*(0.31938153*t(x)-
0.356563782*t(x)^2+1.781477937*t(x)^3-1.821255978*t(x)
^4+1.330274429*t(x)^5); }

function g(x)
{ return (2*HAS(x)-1)*100; }

if (PCcycl<81) PCcycl=81;
if (PCcycl>99) PCcycl=99;

THcycl=1.3;
for (i=0.01;i<=1.3;i=i+0.01)
{
if ( g(i+1.3)>=PCcycl AND g(i+1.29)<PCcycl )
THcycl = THcycl + i;
else
THcycl = THcycl;
}

if (PChist<81) PChist=81;
if (PChist>99) PChist=99;

THhist=1.3;
for (i=0.01;i<=1.3;i=i+0.01)
{
if ( g(i+1.3)>=PChist AND g(i+1.29)<PChist )
THhist = THhist + i;
else
THhist = THhist;
}

CYCL = IIf(KPO>=0,UPcycle,DNcycle);
MNcycl = MA(KPO,CYCL);
SDcycl = SD(KPO,CYCL);
Vcycl1 = MNcycl + THcycl*SDcycl;
Vcycl2 = MNcycl - THcycl*SDcycl;
POcycl = IIf(KPO>0,Vcycl1,IIf(KPO<0,Vcycl2,0));

HIST = BarIndex()-maxLB+1;
MNhist = MA(KPO,HIST);
SDhist = SD(KPO,HIST);
Vhist1 = MNhist + THhist*SDhist;
Vhist2 = MNhist - THhist*SDhist;
POhist = IIf(KPO>0,Vhist1,IIf(KPO<0,Vhist2,0));

POmax = IIf(abs(POcycl)>abs(POhist),POcycl,POhist);
POmin = IIf(abs(POcycl)<abs(POhist),POcycl,POhist);

/* Plots */

GraphXSpace = 3;

Plot(POmax,"PeakOutMAX",colorRed,styleLine);
Plot(POmin,"PeakOutMIN",colorBlue,styleLine);

Col = IIf(abs(KPO)>=abs(POmax) AND Ref(abs(KPO),1)<Ref(abs
(POmax),1),colorViolet,IIf(abs(KPO)>=abs(POmin) AND Ref(abs(KPO),1)
<Ref(abs(POmin),1),colorPink,colorGreen));
Plot(KPO,"KPeakOsc",Col,styleHistogram|styleThick);

//Plot(UPcycle,"UPcycle",colorGreen,styleLine|styleDots);
//Plot(DNcycle,"DNcycle",colorRed,styleLine|styleDots);

/* code end */

Remarks:

First, as Byron mentioned the code posted earlier by Wayne is not 
looking for the optimum up/down cyclelength but uses Param to 
manually set different lookbacks. The code also sets one lookback 
for both up and down trends. This is definitely not in line with 
Kase: the power is in looping for the strongest up and strongest 
downtrend separately.

Further the PeakOsc there is smoothed with a 3-period WMA. I
don't 
know who initiated this but Kase indeed (in BridgeTrader) says:
"the 
PeakOscillator is the difference between KSDIup and KSDIdn with some 
smoothing added". Nowhere could I find how she implements this 
smoothing but I guess that is the WMA. To me it seemed somewhat 
irrational to top off so much statistical scrutiny with some 
arbitrary WMA with a fixed lookback. Also it turned out this WMA 
somehow interfered with the SD calculations for some very weird 
plots. Two reasons for not smoothing the KPO.

My code is partly a loop-version of Byron's, but in his code
there 
was one mistake that pretty sure was generated by a "mistake"
in the 
BridgeTrader article and also refers to point 6 of his earlier 
remarks (which I did not comprehend then but now I do): Kvol in his 
code has a fixed StDev period of 9 which is incorrect. Instead this 
period should run along with the lookback:

Kvol(n) = SD(log(Ref(C,-1)/C), n)

because, looking e.g. at KSDIup(n)

log(H/Ref(L,-n)) / (SD(log(Ref(C,-1)/C), n)*sqrt(n))

the numerator here measures how far this market went "up" (in
log) 
while the denominator measures exactly one standard deviation of the 
move this market should have made if it were a random process; 
that's why Kvol has to adjust to the lookback. 

If the oscillator > 2 then the market has moved more than 2
stdev's, 
which has a 5% chance of happening, while if > 3 chances are only 
0.3%, so in that case we can be more confident that traders 
are "pushing" this market out of randomness into trendiness.
However 
these %'s are only valid for very large samples and make less
sense 
when the sample size gets smaller. 

It's really like a coin toss 20 times and after 10 tosses
counting 9 
heads: something's wrong ("this coin is trending"). Is
it? Perhaps 
not and it's just a coincidence. And of course, counting 90 heads 
after 100 tosses gives just a bit more confidence than 9 heads out 
of 10 tosses.

Byron's point 3 referred to the ability to warn for peaks: if
things 
get too extreme that should be signaled by the PeakOut lines. Kase 
uses not a break of these lines (which in fact confirms a strong 
trend) but a pullback after an earlier break as a signal of a 
(temporary) pause or possible reversal. In the plot these are 
colored pink for POmin and violet for POmax.

In calculating POcycl and POhist (the max of which is POmax and the 
min is POmin) Kase uses respectively "the 98th percentile of the 
local distribution of the oscillator over the last 30 bars or so" 
("or so" is literally hers) and "the 90th percentile over
80 years 
of commodity history". 30-bars-or-so is not in my dictionary and
it 
seemed natural instead to measure the SD over exactly the length of 
the current strongest trend, up or down, as determined by dynamic 
CYCL variable. 

For POhist I think Kase somehow averaged all her historical data and 
uses this fixed number in her software but here I think we can both 
simplify and improve by measuring the 90th percentile for that 
particular market we are working on. Of course the more history is 
loaded the more reliable this measurement will be. It seems a good 
idea to increase this percentile especially when there is less 
history and the 90th gives too many signals. I enabled setting both 
percentiles (as well as the lookbacks) in the code to facilitate 
this and backtesting. I wondered why the normal distribution is not 
in the AFL library but since it isn't I had to clutter the code
with 
the Hastings approximation.

At the end of the code I also added a plot for UPcycle and DOWNcycle 
which display the max KSDI cyclelengths: how many bars to lookback 
for the strongest up and down trend at that moment. They give some 
further insight in the mechanics of this indicator (better plot 
these in a separate pane).

Look forward to any comments or ideas.

-treliff


--- In amibroker@xxxxxxxxxxxxxxx, "Byron Porter" <bporter@xxxx> 
wrote:
> Treliff and Owen - Thanks for the info on the Kase Book.
> Wayne - Thanks for the Kase code.  I have some different 
interpretations
> but I do not know if mine are correct.
> 
> Treliff,
> I have attached 3 afls to this response and sent a copy to your 
yahoo
> email in the hopes that you will be sure to get a copy - I think 
we are
> on different time zones so we may only get respond once a day - I 
live
> in Houston -6 GMT
> 
> 1. I have used the log versions and the 2 bar average of kase 
ideas in
> my afl
> 2. The non Log form is the Random Walk Index which is an Amibroker 
built
> in function see RWI, RWIHI, RWILO.  I was looking for the code to 
see
> how it was coded but have not been able to find it.  I think a 
small
> modification to RWI code would be the Kase indicator.  I'll bet it 
has
> the loop you are looking for. 
> 2. The Param approach is not my understanding to look back 
problem.  My
> understanding is that at each bar you look back 8 to 65 bars do the
> calcs and then pick the max.  I have implemented this without 
using a
> loop but if things become more complicated, a loop may be required 
and a
> cleaner code.
> 3. The think the look back is searching for the peaks for an 
uptrend and
> a trough for a down trend and the oscillator takes the difference
> between the two to determine which is controlling.  The bigger the
> difference the stronger the trend either up or down.  Is that what 
you
> are saying below?  Could you elaborate on your concern. I think 
Kase is
> looking for peak not trends.
> 
>      Kase now uses a loop, within a certain range of lookbacks (15-
100
> in 
>      Wayne's code I think), to find the strongest down-trend and 
the 
>      strongest up-trend, and takes the max to determine THE trend.
> Though 
>      a huge improvement over fixed-lookback indicators, I still 
hesitate
> 
>      because if the strongest downtrend is established as 2.8 
while 
>      looking back 98 bars, and the strongest uptrend as 2.7 
looking back
> 
>      15 bars, then this would be defined as a downtrend. Seems 
>      questionable to me.
> 
> 4. I see what you are saying about looping with a weighting 
system.  I
> am not a mathematician so I don't always know the proper 
statistical way
> to go about approaching a problem, but here is the way I see it.  
There
> are 2 things going on at the same time, 1) variation about the 
mean -
> the Brownian motion or the Random Walk and then 2) there is the 
trend.
> I think the goal is to try to separate the variation from the 
trend.
> Statistically, mathematically, how do we do this?
> 
> 5. One thing about Kases work that I have not run across is the 
use of
> volume.  It seems that we have a limited amount of information to 
work
> with - Open, high ,low ,close and we do get volume.  There is talk 
in
> the Kase reference document(www.fini.com/kase/k0.ntm) that talks 
about
> using ticks to create your bars during a day.  I guess I have been
> wondering how to use volume in this method.  I use Esignal for 
Forex
> data and they provide a volume but my understanding that it is not
> really volume but something like tick count which is as close as 
they
> could get to "volume" because there is no central place to really 
get
> the volume in the Forex market.
> 
> 6.  Another issue that I have been thinking about in the Forex 
market is
> that activity varies considerably during the 24 hr day.  At times 
when
> say the Asian and European markets are both open there is more
> volatility than when just the US market is open.  Should there be 
some
> way to account for time of day.  Should volatility be measure for 9
> periods back as suggested by Kase or should you take the 
volatility at
> the same time of day for say 9 days back.  Statistically would 
that help
> separate variation from trend.
> 
> 7. one of the things that I noticed in the code provided by Wayne 
was in
> the Kase DevStops- the look back period was dev1 was 30 and dev2 
was 10
> and dev3 was 21.  I think those were picked up from the Kase 
manual.  I
> think that L1=30 is the look back length for all the devs.  The L2 
= 10
> and L3 = 21 is to be used in 2 moving averages  that tell you when 
to
> change your plot of stops from long positions to short positions.  
What
> do you think?   Kase recommends 30 bars for intraday and 20 bars 
for
> daily, Is there a statistical reason for this.  It all gets back to
> "fixed look back" periods.
> 
> Thanks for the thought provoking information.
> Please look at my afls and see if there are any questionable
> interpretations of Kase ideas.
> 
> Byron
> 
> 
> -----Original Message-----
> From: treliff [mailto:treliff@x...] 
> Sent: Wednesday, March 10, 2004 12:51 AM
> To: amibroker@xxxxxxxxxxxxxxx
> Subject: [amibroker] Re: I need some loop-... / KASE indicators
> 
> 
> Byron, Kase's book is even less revealing than her articles when it
> comes to math and codes. I purchased it after reading the 
> articles but don't regret that in view of the value of her ideas. 
> The good thing is, her smoke and mirrors force you to really dig 
in 
> and fully understand the reasoning before even attempting to write 
a 
> code.
> 
> Sometimes she sounds pretty obnoxious, like when referring to "the
> out-moded MACD" (not to mention those silly moving
> avg's) but
> in my opinion she has a right to speak.
> 
> Re. her PeakOscillator (I did not study her Dev.Stop yet) it is 
> worth noting that it appears she has replaced her initial trend 
> measurement based on ATR, with one that uses what is called 
> Historical Volatility. Specifically where in previous articles 
(and 
> in the book) she uses e.g.
> 
> (C-Ref(C,-n)) / ATR*sqrt(n)
> 
> in later articles she uses
> 
> log(C/Ref(C,-n)) / StDev(log(C/Ref(C,-1),n)*sqrt(n)
> 
> (Note: in fact she uses H or L instead of C in the left side of 
the 
> equation and splits in an UP and DOWN index.)
> 
> I find the second approach much more interesting (but don't 
confuse 
> interesting with profitable:-). Wayne's code (thanks Wayne) seems 
to use
> the ATR approach, but that could probably be easily 
> converted. The programming is not my strongest side but at first 
> glance it seems this code uses Param in order to "loop".
> 
> Instead of focusing on code though I'd like to share some thoughts 
on
> the Kase approach. To recapitulate:
> 
> Using any bar as starting point and looking back n periods there 
is 
> this undeniable "n-period statistical trend" that is defined
> as the 
> 2nd formula above and measures how far the market has moved in 
> relation to its volatility: if this formula = 1 than the market 
> moved within exactly 1 standard deviation, which should happen 
about 
> 67% of the time etc. As a math-man, I find this a very, very 
strong 
> concept, by far the best when it comes to trend measurement. 
> 
> Kase now uses a loop, within a certain range of lookbacks (15-100 
in 
> Wayne's code I think), to find the strongest down-trend and the 
> strongest up-trend, and takes the max to determine THE trend. 
Though 
> a huge improvement over fixed-lookback indicators, I still 
hesitate 
> because if the strongest downtrend is established as 2.8 while 
> looking back 98 bars, and the strongest uptrend as 2.7 looking 
back 
> 15 bars, then this would be defined as a downtrend. Seems 
> questionable to me.
> 
> My thought therefore was to take all trends (the 15-bar trend, 16- 
bar
> trend etc) and weigh these in a sensible manner, which implies 
> preferably not with fixed weights, but also in some loop-style 
> manner and let the market speak. The code I needed help with was 
the 
> first step in this direction.
> 
> I am interested in any further thoughts, ideas and test results, 
> also re. the original KASE codes as initiated by Wayne.
> 
> Rgds,
> Treliff
> 
> 
> 
> Send BUG REPORTS to bugs@xxxx
> Send SUGGESTIONS to suggest@xxxx
> -----------------------------------------
> Post AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx 
> (Web page: http://groups.yahoo.com/group/amiquote/messages/)
> --------------------------------------------
> Check group FAQ at:
> http://groups.yahoo.com/group/amibroker/files/groupfaq.html 
> Yahoo! Groups Links



Send BUG REPORTS to bugs@xxxxxxxxxxxxx
Send SUGGESTIONS to suggest@xxxxxxxxxxxxx
-----------------------------------------
Post AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx 
(Web page: http://groups.yahoo.com/group/amiquote/messages/)
--------------------------------------------
Check group FAQ at: http://groups.yahoo.com/group/amibroker/files/groupfaq.html 
Yahoo! Groups Links

<*> To visit your group on the web, go to:
     http://groups.yahoo.com/group/amibroker/

<*> To unsubscribe from this group, send an email to:
     amibroker-unsubscribe@xxxxxxxxxxxxxxx

<*> Your use of Yahoo! Groups is subject to:
     http://docs.yahoo.com/info/terms/