The Search For Profits - Part 3

The two previous articles showed how an ordinary trading strategy could be made to do more. Not by optimizing its parameters, lookback periods, indicators, or assessing some added fundamental data. No. You could simply ask the trading strategy to do more of what it did. Thereby generating more profits.

Evidently, wanting higher returns will entail higher risks. But that is why we do simulations in the first place. It is to find out how our trading strategies would behaved when faced with some market data over extended periods of time.

I usually backtest for longer than the 6-year trading interval seen here. There is a simple reason for it, there was no prior data. Nonetheless, the simulation still covered 2,222 days. It should be long enough to show some statistical significance. Giving the ability to make averages of the data, and have portfolio metrics.

For the added profit, metrics varied only slightly. Some not even statistically significant since such small variations could be attributed to noise. Howevre, the profits were there, much higher than what the added risk might have suggested.

Any trading strategy can be said to have for equation:

$$ A(t) = A(0) + n \cdot u \cdot \overline{PT}$$

It is kind of a trading strategy signature. This strategy does this and that, and here are its metrics. What is proposed in my book is to take the above equation and slightly transform it into: $$ A(t) = A(0) + (1+g)^t \cdot n \cdot u \cdot \overline{PT}$$

It might appear as a minor modification. But it is far from than that. It implies that one could, and can have an impact on the output of a trading strategy by enhancing its trading procedures.

Evidently, if you have $g=0$, the above forumula reverts back the first one given.

Part two showed how much impact could be attributed to a change in the $g$ variable ($\Delta g = 1.5\%$). It raise profits by \$ $16,476,532$. It did put some value on a unique and controllable variable.

After having done the simulation in Part two, one might consider that the modified trading strategy had a new signature of its own:

$$ A(t) = A(0) + n \cdot u \cdot \overline{PT}$$

And now, it too could also be enhanced with a little boost in $g$. Which would again generate:

$$ A(t) = A(0) + (1+g)^t \cdot n \cdot u \cdot \overline{PT}$$

This is what this new simulation is all about. A further increase of $g$. This time going for ($\Delta g = 2.0\%$). This will be added to the already enhanced version presented in Part two. It should raise the portfolio's output again.

Problem Reduction

This reduces the portfolio management problem considerably since whatever you intend to do trading will be reflected in those three portfolio metrics. This means that from the stock selection process to the trade selection process, whatever you do, if it does not have an impact on: $n \cdot u \cdot \overline{PT}$, it is just cosmetics. And, technically, of no monetary value.

You have to design your trading strategy to maximize $n \cdot u \cdot \overline{PT}$ under your own individual constraints, whatever they may be. One of the biggest constraints could be viewed in $A(0)$ the initial trading capital. I will try to say it politely: putting peanuts to work will only generate peanuts.

My unsolicited advice is: make the game worthwhile.

Ante up and get sufficient capital to at least respect your trading strategy. I have seen people put \$ $2k$, \$ $10k$, or \$ $20k$ on testing this strategy. Sure, they would make money, what a waste. But, if you have to, it is still a matter of choice. Note, that using a small stake, not only limits potential profits, it also increases gaming risks.

Test Results

This $2.0\%$ increase in $g$ is on top of what was used in the strategy presented in the previous article (Part 2). This new simulation will produce even more. There were no change to the trading strategy, except for this request to push for more. Increasing the pressure by: $\Delta g = 2.0\%$.

Here is the backtest:

In [1]:
# Get backtest object
bt = get_backtest('5896b26199f4335e19fa404d')

# Create all tear sheets
bt.create_full_tear_sheet()
100% Time: 0:00:02|###########################################################|
Entire data start date: 2011-01-03
Entire data end date: 2017-02-02


Backtest Months: 72
Performance statistics Backtest
annual_return 1.26
annual_volatility 0.48
sharpe_ratio 1.92
calmar_ratio 4.21
stability_of_timeseries 0.98
max_drawdown -0.30
omega_ratio 1.41
sortino_ratio 3.00
skew 0.14
kurtosis 3.08
tail_ratio 1.14
common_sense_ratio 2.58
information_ratio 0.11
alpha 0.87
beta 0.52
Worst Drawdown Periods net drawdown in % peak date valley date recovery date duration
0 29.80 2016-10-24 2016-11-14 2017-01-23 66
1 24.89 2015-02-02 2015-03-11 2015-04-14 52
2 20.02 2013-08-05 2013-10-15 2013-12-20 100
3 19.72 2016-04-01 2016-05-18 2016-07-01 66
4 19.67 2013-05-02 2013-06-24 2013-07-11 51

[-0.057 -0.11 ]
/usr/local/lib/python2.7/dist-packages/numpy/lib/function_base.py:3834: RuntimeWarning: Invalid value encountered in percentile
  RuntimeWarning)
Stress Events mean min max
US downgrade/European Debt Crisis 2.22% -13.56% 16.35%
Fukushima 0.24% -3.79% 4.97%
EZB IR Event 0.04% -7.43% 8.38%
Apr14 0.75% -8.14% 4.61%
Oct14 0.52% -5.12% 5.13%
Fall2015 -0.05% -10.13% 6.91%
Recovery 0.51% -13.56% 16.35%
New Normal 0.30% -12.69% 15.51%