PureBytes Links
Trading Reference Links
|
Hi Eric,
Just a quick, off-the-cuff answer, without ploughing through all
those formulas and not reading the TASC article.....
The signals should be exactly the same before and after the
normalisation. As you note, this is easy to do for cyclical
indicators. You must first try and get the indicator to cross
zero whenever you enter or exit a strategy. Say you have a
moving average crossover strategy, where you use say
Mov(C,10,S) <> Mov(C,50,S)
It is easy to get this to cut through zero in stead, simply do
Mov(C,10,S) - Mov(C,50,S)
and you have something that signals a buy when it moves above
zero and vise versa. We have not altered the signal actually,
we just moved it down and centered it around the zero line -
called a locality transformation.
This thing still has an unbounded range, so next we need to
scale it. First, let us call the new signal S, so that
S = Mov(C,10,S) - Mov(C,50,S)
Note that we can multiply S with ANY positive value, or scale
it with any factor, and the result will still cross zero at the
same time that S would. So if we transform it to
T = a . S
with a > 0 then T will also cross zero at the same time that S
does and vise versa. As an example, suppose we have S = -1, 0, 1
and a = 10, then T = -10, 0, 10 and you can see that they are
similar - we are just zooming in or out with a. Please, you have
to grasp this, as this implies that the signals are not altered
by the standardisation process!
Now, how do we choose a? This is on a case by case basis. We
could use, in this example, a = 1 / C, so that
T = S / C
We calculate the signal as a percentage of the most recent close
and this is often used. Another way is to calculate a = 1 / Std(S)
so that
T = S / Std( S )
and we express it as a ratio to its standard deviation. Then we
have the added advantage that if T exceeds 2, we know it is severe,
and similarly for T below -2 (if you know about the +/- 2 standard
deviations bit from stats).
In both cases, a varied over time. We can also use a constant a,
which is where we use the series history. We could use
a = Max(Abs(S)), so that
T = S / Max(Abs(S))
Note that S will never exceed Max(Abs(S)), the maximum value in
history, so that T will always be between -1 and +1.
When we transform, we try to get everything between -1 and +1, but
we are more concerned with keeping the original information intact,
ie they must cross zero at the same time. If you have any series,
you can just use the tanh function to ensure it will be mapped to
somewhere between -1 and +1, so this is easy to enforce - but it
makes more sense to use a percentage or standard deviation or some
other meaningful thing.
Sometimes it can be tricky. Let us say you use the RSI, and you
want to sell when it cuts below 70 and buy when it cuts above 30.
This is difficult because it does not cut through zero, nor through
a single value. So let us do it bit by bit. First the short part.
If we define
Ss = - ( RSI(14) < 70 ) * ( Ref(RSI(14),-1) >= 70 )
we get a -1 value every time we have to short. Similarly, we define
Sl = + ( RSI(14) > 30 ) * ( Ref(RSI(14),-1) <= 30 )
and we get a +1 every time we have to go long. Now, we need to
combine all of this into a single indicator, so we do
S = Ss + Sl
but the problem is that this thing has just zeros and a +1 or -1
only on the day we enter and not thereafter. So we fix it as follows
S = Ss + Sl + ( Ss = 0 ) * ( Sl = 0 ) * Ref(S,-1)
Note that we use Ss or Sl, unless they both are zero, then we use
Ref(S,-1)
This series has the drawback that it only takes on a +1 or -1 or 0,
there is nothing inbetween. So if we need something that also gives
us an indication of how much 'fat' there is in the system, we
add the following:
Vs = RSI(14) - 70
Vl = RSI(14) - 30
Here, Vs (value short) is always negative while we are short, since
we are short if the RSI is below 70. Similarly, Vl is positive if
we are long since the RSI is then above 30. So if we define a new
signal,
T = Vs * ( S < 0 ) + Vl * ( S > 0 )
we get a signal that takes on a value Vs when we are short and Vl
when we are long. When we enter a say short position, Vs will be
very small, and as the ticker drops and the RSI moves away from 70,
the signal value will increase. So the larger the signal value,
the closer we are to exit! The smaller the value, the more bearish
we are (or bullish if we are long). Note this! If we want to change
it, so that we want to have a large signal when we just enter and
have it diminish as the trade works in our favour, do something like
Vs = 30 - RSI(14)
Vl = 70 - RSI(14)
Here, when we enter short, the RSI is just below 70 and Vs is almost
-40. As the RSI drops down, it gets closer to 30 and Vs falls as
well. Now we also have to watch, since if the RSI reaches 30, we
are still short, but Vs becomes positive. We can use this to our
advantage, by exiting at 30 (and at 70 for a long strategy). So we
define
T = min(0,Vs) * ( S < 0 ) + max(0,Vl) * ( S > 0 )
and we have a new indicator that gets smaller the closer we get to
exit, which happens at 30 and 70. The signal itself will be somewhere
between -40 and +40, so we can do
Tfin = T / 40
to get something between -1 and +1.
Finally, I did not test any of these, just typed away, so please
let me know if you find any bugs in them! And be aware that they
may have plenty.
Regards
MG Ferreira
TsaTsa EOD Programmer and trading model builder
http://tsatsaeod.ferra4models.com
http://www.ferra4models.com
--- In equismetastock@xxxxxxxxxxxxxxx, chichungchoi <no_reply@xxxx> wrote:
>
>
> Hi MG Ferreira:
>
> In selecting indicators, should I evaluate indicators' performance
> based on their buy and sell signals before normalizating them? or
> should I normalize indicators before evaluating their performance?
> if this is the case, could you please tell me how to evaluate them
> after normalization? since indicators' original buy and sell signals
> are disappeared.
>
> On the other hand, oscillators are bounded within a limited range,
> and they are easy to normalize them. However, some momentum
> indicators are not bounded within range, I have no idea how to
> normalize them, do you have any example to show please?
>
> There are some example from the article "Normalization" from TASC
> ======================================
> CQG FORMULAS
> Simple moving average oscillator
> Osc_N1: Osc(@,Sim,4,Sim,8)/MA(@,Sim,8)
>
> METASTOCK FORMULAS
> I get no idea how to interpret the Osc_N1 format, so I assume as
> following
> Mov(C,4,S)/Mov(C,50,S)-1
> ======================================
> CQG FORMULAS
> Simple moving average oscillator normalized to standard deviation
> Osc_N2a: Osc(@,Sim,4,Sim,8)/STDDEV(@,8)
>
> METASTOCK FORMULAS
> Mov(C,4,S)/STDEV(C,8) ???
> ======================================
> CQG FORMULAS
> Simple moving average oscillator normalized to its own historical
> range
> Osc_N3: PCR(Osc(@,Sim,4,Sim,8),200)
>
> METASTOCK FORMULAS
> ???
> ======================================
>
> Thank you
> Eric
------------------------ Yahoo! Groups Sponsor --------------------~-->
What would our lives be like without music, dance, and theater?
Donate or volunteer in the arts today at Network for Good!
http://us.click.yahoo.com/Tcy2bD/SOnJAA/cosFAA/BefplB/TM
--------------------------------------------------------------------~->
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/equismetastock/
<*> To unsubscribe from this group, send an email to:
equismetastock-unsubscribe@xxxxxxxxxxxxxxx
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
|