Model & Backtest

The HAL Model

The portfolio is composed of a basket of 7 currency pairs, and for each pairs, the same algorithm is replicated but the calibration could be different. Indeed, each market has its specificities and the model works well but it depends on the liquidity factors and the accuracy of the data. I voluntary made the choice to use very simple mechanism. Indeed, the algorithm determines the position and the direction to hold each day at the London closing (18h00) and return a fixed position for the next day.

The following equation summarises the tree based approach I have:

SignalFX = I1 * I2 * R1

I1 determines the configuration type. A result of 0, 1 or -1 implied respectively a neutral, long or short position.

I2 is a momentum indicator (It could return the same value as I1). It’s an aspect of the model that I can improve but it’s very complex.

R1 is the risk model; it could return only 0 or 1 value.

The overall model is based on 6 parameters, 2 for the configuration and 4 for the momentum plus 2 parameters for the risk model. I tried to minimize the number of parameters because of optimization issues.

Finally, from an investment perspective, I monitor the risk with a Value at Risk 99% over a horizon of 5 days.

The Backtest

In order to achieve a reliable and accurate backtest, I’ve selected several key indicators and I’ve built an Excel spreadsheet to test my assumptions.

I list below the key indicators and the optimization rule:

  • Net P&L : The profit and Lose results included transaction cost (maximise)
  • Trade Ratio: number of order made on a fixed frequency (target)
  • Hit Ratio: Number of positive P&L against negative (maximise)
  • Max Drawdown: Maximun lose recorded (minimise)

I will present in this section the backtest of the alpha engine on the EUR/USD pair only and then present the results of the overall portfolio.

The following table (1) show the results of the first run of the model without any optimisation, the results were not satisfactory. Indeed, the trade ratio was to high and the level of the gross P&L was not high enough to compensate positively the transaction costs. The first step of the optimisation was to reduce by 2 or 3 the trade ratio and the second step to optimise the model parameters to increase the Hit ratio and decrease the max drawdown. The second table (2) show the final results.

Table 1: Alpha Engine backtest without optimization

Table 2: Table 1: Alpha Engine backtest with optimization

Remark: When you build you model, you need to identify the impact of each parameters on the key indicators. This is essential to understand the model behavior.

So, What are the conclusion after the optimisation
  • decrease of the P&L (-50%)
  • Drop of the trade ratio from 61% to 11%
  • Increase of the Win ratio
  • Drop of the Max drawdown from -2 180 $ to -545 $
The next chart presents the track record from 2001 .
Chart 1: Track record for the EUR/USD pair (with optimization)
The final conclusion regarding the model is positive. The net performance over 10 years is equal to 159% ( circa 10% annualized) and a gross performance equal to 235% (circa 12.5% annualized). It reveal the importance of the transaction cost, very high circa 3% per year.
The final step was to combine several pairs to build a portfolio and add a risk model to reduce the volatility and the drawdown.
When I combine several currency pairs, I increase the trade ratio and the net P&L. Indeed, as each currency is treated separately, their combination gives the opportunity to benefit from their charateristics .
The following chart presents the global portfolio track record since 2001
I identified a good opportunity on the market to create a Risk indicator (with some modification). The only negative point was data are missing from 2001 to 2006. So I was not able to backtest the risk model over 10 years.
Finally,the results are very good. I show you the monthly perfomance table and the track record (It is not neccesary to explain the results “net performance of 66% annualized“):

%d bloggers like this: