I’m a big fan of AmiBroker, particularly the speed and flexibility it provides for backtesting trading strategies. However, one thing that is not particularly straightforward in AmiBroker is combining multiple strategies into a single system. Many quantitative (a.k.a. systematic) traders, myself included, use more than one strategy to help smooth their portfolio returns. The idea is that when one strategy is underperforming or is in a drawdown, other strategies can “pick up the slack” and minimize the pain. This works best when the individual strategy returns are not highly correlated.
If you’re trading your portfolio from a single brokerage account, then the most accurate way to model trading multiple strategies is to build all the logic into a single backtest. Before we can even start down that path, we would need to decide how the strategies would coexist in live trading. Some questions to consider include:
- Will you allocate a portion of your portfolio equity to each strategy, or will all strategies use a common pool of equity?
- If allocating fixed percentages, will there be a periodic rebalancing? For example, if Strategy A is allocated 75% of equity and Strategy B is allocated 25%, then at the end of the month/quarter/year will you allocate 75% of the current equity for Strategy A or will it continue to use the compounded balance that it started with?
- If operating from a common pool, will you try to ensure that one strategy does not dominate?
- Will the strategies operate independently, or will trades opened by one affect the behavior of the other? For example, assume that Strategy A opens a long position in AAPL on Monday. If Strategy B signals a long entry on Wednesday, do you buy additional shares or skip the trade? What if B signals a short entry?
- What if both strategies signal an entry on the same day: does one have priority over the other?
- Will the exit for a position be dependent on the strategy that triggered the entry? If allowing multiple concurrent entries from different strategies, how will this complicate the exits?
All of the issues above can handled via AmiBroker’s Custom Backtest (CBT) interface along with liberal use of static variables. However, it won’t be a trivial exercise.
An Easier Way
Another approach, although imperfect, is to simply combine the equity curves of the two strategies. At a high level, this is quite straightforward:
- Save the equity curve for each strategy as an artificial ticker symbol in your AmiBroker database.
- Run a new back test in which you “buy” each equity curve as if it were a tradeable instrument. The “position size” for each trade corresponds to the portion of your equity that you allocate to each strategy.
- To rebalance your portfolio based on the target allocations, simply sell all positions and then buy them again at the appropriate position sizes, or you can get fancy and scale in and out to adjust the position sizes.
The advantages of combining equity curves in this way are:
- The implementation is quite easy and can probably be done in a very reusable way. For example, in each of the base strategies that you’ll be combining you could add something as simple as this to the end of a high-level CBT: flags = atcFlagDefaults + atcFlagEnableInPortfolio;
AddToComposite(bo.EquityArray, “~eqStrategyA”, “C”, flags);
- AmiBroker will be able to accurately determine CAR, Max Drawdown, and other portfolio metrics for the combined system. With a little work, you can also report the correlation of the returns of the base strategies.
Of course, any shortcut will come with some disadvantages as well, including:
- Each strategy must be assigned an equity allocation. I have not yet come up with a good way to implement the “shared pool” model described above when combining equity curves.
- There will be no trade-specific metrics like number of trades, win rate, average % P/L, etc. because we lost that granularity when we saved only the equity curve.
- No special handling of overlapping trades for the same symbol.
- Any “rebalancing” that you do assumes that you can simply shift a portion of your equity from one strategy to another without penalty, even though in live trading you would incur commissions as you closed and reopened the individual positions to reflect the new equity allocations.
I recently built my own Equity Combo utility to combine two equity curves. Why only two at a time? Because rather than just combining one equity curve for Strategy A with one for Strategy B, I wanted to start by running optimizations on both strategies, saving an equity curve for each variation produced by the optimization run. My Equity Combo utility then allows me to examine all possible combinations of a Strategy A equity curve with a Strategy B equity curve, reporting the following metrics for each combination:
- Max Drawdown
- Annual Volatility of Returns
- Correlation with SPX
- Correlation between A and B
- Sharpe Ratio
- % of Months with Positive Return
- % of Months with Negative Return
Notice that all my metrics can be determined from the individual and/or combined equity curves, without any knowledge of individual trades. You would surely have your own list of metrics that are of interest.
My utility also allows me to specify the percentage of equity allocated to A and B, as well as the rebalance frequency (Never, Daily, Weekly, Monthly, Quarterly, Annually). And finally, it can save each of the combined equity curves so that I can combine one or more of them with yet another base strategy (Strategy C) to find the total effect of adding new strategies to my portfolio.
The best part? The entire utility is only about 800 lines of AFL code, even with ample comments, blank lines for readability, etc. If you’re interested in learning more, please feel free to contact me or review the latest User Manual.