Combining Technical Indicators Into One.
Creating an Indicator from Many Other Weighted Technical Indicators.
What if we create an equally-weighted technical indicator from 8 different other indicators? Can that give us an edge? Can it improve the quality of signals? In this article, we will combine 8 different technical indicators into one giant oscillator.
As it would be too long to introduce each indicator on its own, the reader is encouraged to have a look at previous article where each indicator is presented on its own in detail alongside its Python code. This article focuses more on how to combine them together into what we can call a global technical indicator.
I have just released a new book after the success of my previous one “The Book of Trading Strategies”. It features advanced trend-following indicators and strategies with a GitHub page dedicated to the continuously updated code. Also, this book features the original colors after having optimized for printing costs. If you feel that this interests you, feel free to visit the below Amazon link, or if you prefer to buy the PDF version, you could contact me on LinkedIn.
Choosing the Ingredients
The 8 different indicators will have an equal weight of 12.5% inside the global technical indicator (GTI) which will be bounded by values from 0 to 100 with values close to 100 signaling a bearish reversal and values close to 0 signaling a bullish reversal. Let us take a look at how it would resemble first before giving the intuition of how it is constructed.
The ingredients for the GTI are as follows:
A 21-period RSI: The RSI is a popular contrarian indicator bounded between 0 and 100 with usually 30 as the oversold level and 70 as the overbought level.
A 21-period stochastic oscillator: The stochastic is another popular contrarian oscillator bounded between 0 and 100 with usually 15 as the oversold level and 85 as the overbought level.
A 21-period normalized rate of change: The ROC is simply the return of the price since a selected period in the past. We will see how to normalize values later in the article.
A 55-period modified normalized Fisher transform: The original Fisher transform is a modification of the market price to make it more normal. The modified one is a version I use to incorporate highs and lows. It is theoretically bounded between -3.80 and +3.80 with intermediate levels at -2.00 and 2.00. The full details on this indicator can be found in a previous article.
A 21-period momentum indicator: The momentum indicator divides the current closing price by a previous closing price from a selected lookback period.
A 21-period moving average contrarian indicator: The MACI is a normalized moving average indicator that seeks to find reversal points. The full details on this indicator can be found in a previous article.
The Fibonacci timing pattern: This is a pattern I have presented in a previous article. It is based on timing and price and uses the Fibonacci sequence to detect reversal points.
All of the above indicators have been discussed extensively in my previous articles, If you would like to know more about them, feel free to go through my profile and select the one you would like to discover more.
How to Normalize and Weigh Values
We have 8 indicators that we want to turn into just one technical indicator. For simplicity, we will give each indicator an equal weight of 12.5%. The way we will do this is normalizing the indicators that need normalization, multiplying them later by 12.5% (their weight), and finally, adding the pieces together. Here is a quick summary of what we will do:
The RSI is already normalized and therefore no transformation is needed. We can simply multiply its values by 12.5%. As an example, if the RSI is showing a value of 100, then multiplying it by 12.5% will give a reading of 12.5 which is the maximum value of a weighted component in the GTI. This pushes the GTI up to approach a bearish zone.
The stochastic oscillator is already normalized and therefore no transformation is needed. We can simply multiply its values by 12.5%. As an example, if the Stochastic is showing a value of 0, then multiplying it by 12.5% will give a reading of 0 which is the minimum value of a weighted component in the Global Technical Index. This pulls the GTI down to approach a bullish zone.
The rate of change indicator needs to be normalized with values between 0 and 100 and then, we can simply multiply its values by 12.5%.
The momentum indicator needs to be normalized with values between 0 and 100 and then, we can simply multiply its values by 12.5%. The normalization function is shown below.
The modified Fisher transform needs to be normalized with values between 0 and 100 and then, we can simply multiply its values by 12.5%. The normalization function is shown below.
The MACI is already normalized and therefore no transformation is needed. We can simply multiply its values by 12.5%.
The normalized index is actually the function itself and can be seen as a high-low index with a selected lookback period, therefore, we will simply multiply by 12.5% to get its weight.
The Fibonacci timing pattern: As it is composed of values from -8 to +8 with -8 as a bullish timing signal and +8 as a bearish timing signal, we can simply create gradual values from 0 to 100 with 6.25 for every step. For example, -8 becomes 0, -3 becomes 31.25, 0 becomes 50, +7 becomes 93.75, and +8 becomes 100.
Let us quickly discuss how we normalize values between 0 and 100 before we proceed to understand more the GTI.
This great technique allows us to trap the values between 0 and 1 (or 0 and 100 if we wish to multiply by 100). The concept revolves around subtracting the minimum value in a certain lookback period from the current value and dividing by the maximum value in the same lookback period minus the minimum value (the same in the nominator).
We can try to code this formula in python. The below function normalizes a given time series of the OHLC type:
def adder(data, times): for i in range(1, times + 1): new = np.zeros((len(data), 1), dtype = float) data = np.append(data, new, axis = 1)
def deleter(data, index, times): for i in range(1, times + 1): data = np.delete(data, index, axis = 1)
return data def jump(data, jump): data = data[jump:, ] return data
def normalized_index(data, lookback, close, where): data = adder(data, 1) for i in range(len(data)): try: data[i, where] = (data[i, close] - min(data[i - lookback + 1:i + 1, close])) / (max(data[i - lookback + 1:i + 1, close]) - min(data[i - lookback + 1:i + 1, close])) except ValueError: pass data[:, where] = data[:, where] * 100 data = jump(data, lookback)
The Global Technical Index
The GTI is a combination of the 8 above indicators normalized on a scale of 0 to 100. Therefore, the GTI will show bearish signals as it approaches 100 and will show bullish signals as it approaches 0.
We can create the following standard rules for the GTI:
Whenever the GTI exits the 10 oversold area, a bullish signal is generated.
Whenever the GTI exits the 90 overbought area, a bearish signal is generated.
def signal(data, gti_column, buy, sell): data = adder(data, 10) for i in range(len(data)): try: if data[i, gti_column] > 10 and data[i - 1, gti_column] < 10: data[i, buy] = 1 elif data[i, gti_column] < 90 and data[i - 1, gti_column] > 90: data[i, sell] = -1 except IndexError:
pass return data
The GTI will probably not be delivering a lot more than what the individual indicators do on their own. Especially with the back-testing results that are neither better nor worse than the individual results.
I have chosen not to waste your time by presenting underperforming results but this does not mean that there is no value in the GTI. Further research can be done to analyze it. In the meantime, we can also use the divergence method on this indicator as shown in the below plot:
As financial traders or analysts, we are all aware of divergences:
When prices are making higher highs while the indicator is making lower highs, it is called a bearish divergence, and the market might stall.
When prices are making lower lows while the indicator is making higher lows, it is called a bullish divergence, and the market might show some upside potential.
If you are also interested by more technical indicators and strategies, then my book might interest you:
Remember to always do your back-tests. You should always believe that other people are wrong. My indicators and style of trading may work for me but maybe not for you.
I am a firm believer of not spoon-feeding. I have learnt by doing and not by copying. You should get the idea, the function, the intuition, the conditions of the strategy, and then elaborate (an even better) one yourself so that you back-test and improve it before deciding to take it live or to eliminate it. My choice of not providing specific Back-testing results should lead the reader to explore more herself the strategy and work on it more.
To sum up, are the strategies I provide realistic? Yes, but only by optimizing the environment (robust algorithm, low costs, honest broker, proper risk management, and order management). Are the strategies provided only for the sole use of trading? No, it is to stimulate brainstorming and getting more trading ideas as we are all sick of hearing about an oversold RSI as a reason to go short or a resistance being surpassed as a reason to go long. I am trying to introduce a new field called Objective Technical Analysis where we use hard data to judge our techniques rather than rely on outdated classical methods.