The Fisher Transform Oscillator

Indicators - one of the abused elements of trading. Many think they replace sound trading. Many use them without understanding them properly. Many blame them for their losses. The Fisher Transform is what we think is a very good indicator, but one has to know how it behaves. Edge cases matter.

The concept of an oscillator

Oscillators form a specific class of indicators that is used as an indicator of market direction or market movement strength or exposure. There are quite a lot of them, with the RSI – Relative Strength Index – being one of the most commonly used ones. The main definition of an oscillator is simple: is an indicator that is like a needle and oscillates normally between two different values, which often are 0 and 100 as extreme values. The RSI, for example, is such an indicator and gives the relative strength over a time period – a moving market will approach either 0 or 100 as up and down extremes, while a sideways market will stay around 50.

Most Oscillators have edge case problems

Most oscillators are pretty badly designed and show a serious lack of mathematical understanding. Both, from the original inventor as well as the user. The inventor, though, is often excused – most indicators are relatively old and designed to be simple. Something you can calculate with a desk calculator. Or excel (or rather: the older equivalent). Few indicators are designed by mathematicians with a sound statistical understanding and the assumption that a computer would not have a problem to run the formulas. The fisher transform formula is not totally easy to run as can be seen by the following code:

protected override void OnBarUpdate()
    double fishPrev;
    double tmpValuePrev;

    if (CurrentBar == 0) 
        fishPrev        = 0;
        tmpValuePrev    = 0;
        fishPrev        = Value[1];
        tmpValuePrev    = tmpSeries[1];

    double minLo = MIN(Input, Period)[0];
    double maxHi = MAX(Input, Period)[0];

    double num1 = maxHi - minLo;

    // Guard agains infinite numbers and div by zero
    num1 = (num1 < TickSize / 10 ? TickSize / 10 : num1);

    double tmpValue = 0.66 * ((Input[0] - minLo) / num1 - 0.5) + 0.67 * tmpValuePrev;

    if (tmpValue > 0.99)
        tmpValue = 0.999;
    if (tmpValue < -0.99) 
        tmpValue = -0.999;


    double fishValue = 0.5 * Math.Log((1 + tmpValue) / (1 - tmpValue)) + 0.5 * fishPrev;

This, sadly, leads to a really bad edge case problem – the value range is making the oscillator useless in extreme cases. When an indicator can only have values between 0 and 100 – what happens when it is approaching such a value? A long movement in one direction will “overstretch” an indicator such as the RSI – and the result will be that even a small drop in upward speed or a nearly invisible down movement gets a very violent reaction in the indicator. The old rule to activate an indicator signal once it goes over an edge values (like 80) and then back down is useless when a tiny movement triggers that.

The Fisher Transform Oscillator: no value limit and neutral at 0

enter image description here

The Fischer Transform Oscillator does not have this problem. Not only is it neutral at 0 – values above 0 indicate an upward movement, below 0 a downward movement. It also is not limited in the amount if can go off the 0. The value is a statistical standard deviation – and a move of 5 standard deviations will result in a +5 value. That means obviously that one cannot use an absolute retracement in value (like down to 0.8 after being over 1). A percentage movement will do nicely – so a value at 5 needs to go down to 4 to indicate a break in trend.

On the other hand, the Fisher Oscillator shows some very good behavior around trend changes. This is based on the application of sound statistical principles - an acceptance of the Gaussian distribution and the fat tail phenomenon that trading prices show during trends. In a "fat tail" scenario, outlying prices are appearing way above their normal percentage percentage - because prices are in a trend.

Indicators are just that – not trading strategies

Combining one or two Fisher Transform Oscillators with a trend line mechanism and a good trading logic (that determines good natural stops) is already a quite profitable strategy. The Fisher Transform Oscillator can also be used to filter trades – wait for it to trigger on a timeframe, then trade in the mean direction on a smaller timeframe. So for example wait for a +3, then once it goes down to +2.4 only trade short until the 0 mark is reached.

An indicator is never going to be a complete strategy and it is amazing how many beginning traders think that the trading is irrelevant as long as the proper indicator signals are followed. Statements like “all indicators lag” show a terrific ignorance towards the underlying mathematical model – a Moving Average for example does not lag (which would indicate a delay) but simply is not meant to reflect changes in direction in real time. Complaining about lag here is like complaining truck is slower than a sports car. Understanding the mathematical model and underlying compromises – especially in edge cases – is a very important step when working with any indicator. And an Indicator is just that.

The Fischer Transform Oscillator manages to avoid the limited range problem and as such is a lot easier to work with and not stretching out into meaningless edge of range numbers.

The Fisher Transform is part of most software packages.