Trading Rules from Statistical Grouping 
of Indicators
A 
while back I started thinking about the mathematical characteristics of neural 
networks. One of their key characteristics is that they use a complex, nonlinear 
function to capture patterns in the market that are not obvious with more 
conventional methods. The nonlinear function combines a set of inputs, typically 
based on indicators (e.g., moving averages, stochastics, momentum, and so on), 
into a single output that ranges from -1 to +1. To use this output in trading, 
we can look for long entries when the function output is above +0.5 and for 
short entries when the function output is below -0.5. 
Transforming the multiple inputs into a single output is a continuous, nonlinear 
function. Trying to fit this single continuous function to different sets of 
market conditions simultaneously so that the network properly assigns bullish 
conditions to output values greater than 0.5 and bearish conditions to output 
values less than -0.5 is quite challenging, to say the least. In my experience 
there are many different sets of conditions that set up profitable long trades 
and many other sets of conditions that set up profitable short trades. Perhaps 
it's asking too much of a single continuous function to somehow weave a twisted 
path among disparate sets of market conditions.
This 
led me to wonder if the neural network approach could be adapted to 
"discrete"-value functions. In other words, rather than using a continuous 
function, the function would have a small number of values, perhaps each one 
corresponding to a different set of market conditions. One way to approach this 
is by grouping the data into "bins," similar to the method I used in the article 
on Dynamic Portfolio 
Selection.
As an example, suppose 
we have the following set of five indicators:
   I1 = C - C[1]
   I2 = C - C[3]
   I3 = C - AMA
   I4 = AMA - Average(C, 30)
   I5 = TrueRange - 
Average(TrueRange, 30)
where C is the closing 
price of the current bar, C[1] is the close one bar ago, C[3] is the close three 
bars ago, AMA is an adaptive moving average based on a variable speed 
exponential moving average, as calculated by the TradeStation built-in function 
AdaptiveMovAvg(C, 20, 2, 40), Average(C, 30) is the simple moving average of the 
last 30 closing prices, TrueRange is the true range of the current bar, and 
Average(TrueRange, 30) is the simple moving average of the true range over the 
last 30 bars.
If we determine the 
minimum and maximum values for these indicators over our data set, we can scale 
the indicators so that they lie in the range -1 to +1, denoted [-1, +1]. For 
example, to scale I1 into this range, we can write:
   I1scale = 
(2 * I1 - (SfMax1 + SfMin1))/(SfMax1 - SfMin1)
where SfMax1 and SfMin1 
are the maximum and minimum values, respectively, of I1.
Now that the indicators 
all produce values in the range [-1, +1], we can group them into bins based on 
their values. Suppose we divide the range into the following four bins: [-1, 
-0.5], (-0.5, 0], (0, +0.5], (+0.5, 1]. So, if an indicator is greater than or 
equal to -1 and less than or equal to -0.5, it lies in bin #1, [-1, -0.5]. If 
the indicator is greater than -0.5 and less than or equal to zero, it lies in 
bin #2, (-0.5, 0]. Values greater than zero and less than or equal to 0.5 lie in 
bin #3, (0, +0.5]. Finally, if an indicator is greater than 0.5 and less than or 
equal to 1, it lies in bin #4, (+0.5, 1]. 
The basic idea of this 
approach is to evaluate the five indicators on the bar prior to each trade we 
want to take. To keep things simple for illustrative purposes, I'll assume the 
trades enter on the day's open and exit at the close on the same day. Provided 
we're using intraday data, this means we want to evaluate the indicators on the 
last bar of each day in preparation for entering on the next day's open. 
When we evaluate the 
indicators, we'll determine into which bin each one falls. We'll keep track of 
the bins for each indicator for each trade. We'll also keep track of the 
profit/loss amount for each trade. At the end, we'll find the combination of 
bins that produced the greatest net profit. For example, it might turn out that 
when the five indicators were in bins 3, 1, 2, 1, and 4, respectively, we 
obtained the most profit buying on the open (i.e., going long). By taking the 
negative value of the profit/loss amounts, we can use the same data to find the 
best bin combination for going short on the open.
Notice that the number 
of possible bin combinations is the number of bins raised to the power of the 
number of indicators, or 4^5 = 1024 combinations in our example. It will turn 
out that only a relatively small number of these combinations contain more than 
one trade. We want to focus on the combinations that contain a reasonably large 
number of trades so the results will be more significant.
I wrote a strategy in 
TradeStation called StatBins1 to perform the calculations. This strategy can be 
downloaded from my web site on the
free downloads page. Instructions for applying 
the strategy are provided in the lengthy comment at the top of the strategy 
code.
After finding the 
scaling factors, I ran StatBins1 on 60 minute bars of the e-mini Russell 2000 
futures over the past five years, ending 12/15/2006, with a lookback length of 
50. The strategy produced the following results, which were written to the 
TradeStation Print Log:
StatBins1...
  Total Number of Simulated Trades = 1239
  Combo      Total Long P/L       No. Trades
   22         4550.00          7
   23         -1390.00          3
   27         -510.00          4
   66         -1100.00          2
   70         1170.00          32
   71         -2570.00          5
   82         530.00          2
   86         2810.00          97
   87         -5860.00          41
   90         -14130.00          46
   91         480.00          82
   102         -5160.00          28
   103         1520.00          14
   106         -8890.00          60
   107         -2650.00          133
   111         -3830.00          10
   123         -840.00          8
   127         -580.00          3
   134         -690.00          21
   135         3800.00          6
   139         2170.00          2
   146         -2100.00          2
   150         6420.00          76
   151         6210.00          34
   154         2280.00          38
   155         8000.00          46
   166         3220.00          26
   167         3000.00          15
   170         -4710.00          81
   171         -10100.00          158
   186         300.00          2
   187         990.00          14
   234         1810.00          10
   235         1330.00          14
   326         -630.00          10
   342         -1920.00          14
   343         660.00          3
   346         160.00          3
   347         680.00          6
   363         1320.00          10
   367         -830.00          2
   386         220.00          3
   390         1370.00          5
   406         -1060.00          9
   410         1140.00          2
   411         1470.00          7
   422         1090.00          2
   426         2120.00          3
   427         -920.00          14
   491         1520.00          3
 
  Bins (0 - 3): [-1, -.5] (-.5, 0] (0, .5] (.5, 1]
  Maximum Profit/Loss, Long: 8000.00
  Bins:   2  2  1  2  0
  Number of trades: 46
 
  Maximum Profit/Loss, Short: 14130.00
  Bins:   1  2  1  1  0
  Number of trades: 46 
The 
first part of the output is a table of bin combinations, with the combinations 
numbered from 1 to 1024.The table lists the net profit and number of trades for 
bin combinations with more than one trade. Combinations with positive net profit 
amounts represent net profitable long trades, whereas negative amounts represent 
net profitable short trades. Following the table, the combination with the 
greatest net profit is shown for both long and short trades. For example, the 
best bin combination for long trades was when indicator I1 was in bin 2, 
indicator I2 was in bin 2, indicator I3 was in bin 1, indicator I4 was in bin 2, 
and indicator I5 was in bin 0 (the bins are numbered from 0 to 3 in the 
strategy).
To 
see more detailed performance results for the optimal bin combinations, 
theStatBins1 strategy can optionally be run as a system by entering the optimal 
bin numbers as inputs to the strategy and setting the input "TradeIt" to TRUE. 
When this is done, StatBins1 uses the indicators and bin numbers to take trades 
when the indicators lie in the specified bins. Trades are entered at the open 
and exited at the close. No stop is used.
With 
$25 per round turn deducted for slippage and commissions, StatBins1 produced the 
following results on a one-contract basis using the optimal bin combinations 
shown above:
Net Profit: $19,830
Profit Factor: 2.28
Number of Trades: 92
Percent Profitable: 63.0%
Average Trade: $215
Ave Win/Ave Loss: 1.34
Worst-case Intraday 
Drawdown: -$3,040
The 
equity curve is shown below in Fig. 1.
 
Figure 1. 
StatBins1 optimal trading results on ER2, 60 min, five years ending 12/15/06, 
with $25 trading costs.
Although in the example 
presented here, the indicator bins were used as the sole trade entry 
criterion, it's probably better to combine this approach with other entry and 
exit techniques. For example, the StatBins1 code could be modified to track the 
bins prior to entering trades on a breakout or using other criteria. In that 
way, the indicator bin values would serve as a filter for the primary entry 
technique. More sophisticated exit techniques could be added as well.
Also note that the 
results shown above are in-sample, optimized results. Using the bin values that 
generate the greatest net profit is optimization. Out-of-sample testing and 
real-time tracking are always a good idea before committing real money to any 
new trading approach.