Fuzzy Logic pt.3: Auto-generate model parameters
I often tire of reading these complicated academic papers that are filled with impossible jargon only to make my life harder. I have found that often times the difficult terminology only hides the simple concepts that lie behind.
So here I will use a difficult term myself, just to sound smarter than I am. In today's post I will implement a WFCMAESFISMICOPT( pronounced "woo-foo-smash-efis-mee-copt") model.
It stands for: A Walk-Forward Covariance-Matrix-Adaptation-Evolution-Strategy on a Fuzzy-Inference System On Multiple Instruments and A Custom Optimization Target. How is that for a title!
You think that's complicated? It's not. We 'll start with Matlab's standard ANFIS model to see where the idea comes from.
Matlab's Fuzzy Logic module includes what is called ANFIS or Adaptive Neuro-Fuzzy Inference Systems.
Now that sounds complicated too. Well it is, if you were to built it. But the concept behind it is simple.
An ANFIS system is a fuzzy model where the parameters are not set by an "expert" but are found using Neural Networks.
In a normal Fuzzy Model an "expert" is invited to give statements like
1. "I consider RSI to be Low when it is between 0 and 40. The closer to 0 the "Lower" it is".
2. "A Low RSI(3) gives a possible Buy signal".
read part 1 and part 2 of this article.
An ANFIS system needs no expert. Given a optimizing target (i.e.,profit), it comes up with both the membership functions and the rules. So in theory it can expose relationships that humans may not be able to see. One can argue, why not use Neural Networks directly? Anfis has the advantage that once we get the results, the results are translatable to Human understandable concepts like "Buy at Low RSI and Mid-month".
ANFIS models get bogged down at 5+ Inputs and the optimization target is usually tomorrow's return. Matlab's ANFIS cannot (without custom code) optimize for Profit% or CAR/MDD or Sharpe Ratio.
Now Amibroker (a Software for under $300) can do that. It may not have Neural Nets but has something possibly better for optimizing the parameters: the CMA-ES optimizer. And it's fast.
That means we can build the Fuzzy model in an Amibroker script and optimize all the parameters, using whatever optimizing target we want (i.e., the default CARMDD or our own custom). We can also run it on a portfolio of multiple instruments as well as Walk-Forward
it so that we know it has no "prior knowledge" built into it.
You may want to read part 1
and part 2
of this article.
Let's look at the TRIANGULAR memberships we build before. This basically says that
if RSI(3) is between 0 and 40 it is "Low". The close to 0 the lower it is.
if RSI(3) is between 10 and 90, its "Mid" where it's most "Mid" at RSI(3)=50
if RSI(3) is between 60 and 100, its "High". The closer to 100 the higher it is.
Here's the TRIMember function:
TRIMember(variable, leftBottom, MidHigh, RightBottom)
So these can be written as
SetMember( "rsi3", "Low", TRIMember( rsi3, 0, 0, 40 ) );
SetMember( "rsi3", "Neutral", TRIMember( rsi3, 10, 50, 90 ) );
SetMember( "rsi3", "High", TRIMember( rsi3, 60, 100, 100 ) );
* I am neither a programmer nor a fuzzy logic expert. The information given is to the best of my ability/knowledge and meant to un-intimidate and motivate self directed investors to use tools that proffesional Quants use. The information is not necessarily written with accuracy in mind but with practical usability for someone who trades.
or for that matter
SetMember( "rsi3", "Low", TRIMember( rsi3, a, a+b, a+b+c) );
SetMember( "rsi3", "Neutral", TRIMember( rsi3, d, d+e, d+e+f) );
SetMember( "rsi3", "High", TRIMember( rsi3, g, g+k, g+k+m) );
and as Amibroker users know we can do this:
We do have a practical problem here: Too many overlaping parameters. We can help a bit by using Membership Function with 2 parameters like Gaussian Membership Function and Sigmoid Membership function. Or we can forget about optimizing the membership functions and just optimize the rules.
That we will do in the next post:
How to uncover hidden relationships in the markets in under 5 minutes.