This post is trying to present a process to determine your bliss function, as a follow-up to the previous post introducing the bliss function concept.
Well, “building” your bliss function is a bit like making up your own recipe: you first have to choose the main ingredients (return, variance, risk, etc.) and mix them in a way that makes sense and in the right proportions. Most great chefs perfect their recipes through trial and error. The process can equally be applied to the bliss function.
Please note that my bliss function recipe is not finished. I am merely floating the idea of how I am planning to establish my bliss equation. Please feel free to comment if you have any comments on super ingredients you know about: at the Au.Tra.Sy restaurant, everybody can help in the cuisine!
Main ingredients and proportions
First, you have to decide what will be in your recipe. The base ingredients will probably be return, variance and risk. These can be declined in several flavours which you must choose. In the previous bliss function post, we looked at the following comparison of 2 different systems:
This led us to conclude that neither CAGR nor MAR were a good performance and variance measure on their own. From that observation came the idea of using:
ln(CAGR + 1) x MAR
We then added some more ingredients to complete the recipe such as:
Bliss = ln(CAGR + 1) x MAR - 0.5 x ME - 0.1 x TimeInMkt%
This would be our base recipe. The process here is just to use common sense (based on your preferences) to build a tentative bliss function equation
tinkering with ingredients and proportions
This is the stage where great recipes are made!
If you set out to invent a dish, you’ll pick up the ingredients that you want to use and mix them with common sense (as we have done above). However, your first attempt will surely need some adjustments (that chocolate cake never turns perfect the first time!)
Test your equation on any system equity curve and stats that you can put your hands on. Use your back-testing software output, real-life fund performance reports, or just make them up: you just want some data to run your equation on.
You should have some ideas of which systems you prefer naturally. Your mission is simply to run the equation on all these systems and make sure that the bliss function ranks them as per your natural preferences. If it does not, you need to tinker with the recipe/equation.
What caused the divergence between the function output and your natural choice? How can you adjust the formula to rectify this? You’ll probably have to change some coefficients, add some smoothing functions, add a minor ingredient, add some extra logic, etc.
The downside: it is a long, on-going process, maybe a process that does not appear very scientific: but we are not trying to find a universal truth here – rather your own truth. And unless you can formulate it right off the bat, you have no alternative but trial and error
An extra ingredient: robustness
That could be chef Jez Liberty’s signature ingredient – that makes people love or hate that recipe…
What we want to measure here is how the system is robust. We’ve seen that there are multiple ways to define and measure robustness. For this, let’s concentrate on robustness to slight parameter variation. The process would be three-fold (assuming you are already happy with one robustness-less bliss function equation):
- Run a backtest of your system with different parameter values
- Calculate the bliss value for each of the sub-system/parameter value generated in your backtest
- Establish a robustness score for each sub-system/parameter value based on the variance of its own bliss value compared to the bliss values of its neigbouring parameter values
A picture will illustrate this more clearly. Imagine that the following is a chart of our bliss values (for each parameter value tested):
The 16th parameter value produces the best bliss value, but its neighbouring values are pretty low: its robustness score would penalise it. On the other hand, parameter #11 seems fairly close to its four closest neighbours and it should get a positive score.
One robustness coefficient (Rob), calculated for each parameter value, could be:
Rob = sd(all) / sd(param,n_neigh)
sd(param,neigh) would be the standard deviation of the bliss values across the parameter observed and its n neighbours (e.g. n=4 would consider a group of 5 bliss values)
sd(all) would be the standard deviation across all parameters
The new robust bliss value would be adjusted by Rob such as:
Blissnew = Blissold x Rob
Of course you would have to tinker with this Rob formula, possibly change the formula a fair bit. But this gives you a base to start working with and test against sample backtest results.
one main problem
That robustness measure is only good intra-system, for taking into account which parameter sets are more robust.
This does not allow to compare multiple systems from a robustness point of view. But for this, you just have to start the same thought process again: how do you want to measure robustness for a given system and compare it against another one?
A starting point might be to apply some variations to the trading systems, maybe a 10% variation on the parameter values, a bit of light price “scrambling” (i.e. update your price series by adding 0.1% to the close), etc. Measure the variance of the bliss values across these variations for different systems and update the bliss value by this variance score.
the proof in the pudding?
At the end of the day, the bliss function is trying to aggregate many aspects of a trading system (performance, variance, risk, robustness, etc.) into one single value. The concept is attractive but the recipe might fail to capture all the subtleties of the ingredients.
Imagine mixing together a banoffee pie with ratatouille nicoise, an entrecote, some Maroilles cheese and a Corn and Clam Chowder all rinsed down with some Kaoliang… An extreme comparison, you may say but you get the idea (ps: try some of these dishes – individually – they are very nice!)