Wealth-Lab Wiki

API ChartStyles Community Components Community Indicators IndexDefinitions Knowledge Base Misc Optimizers PosSizers Providers Standard Indicators TASC Traders Tips TASCIndicators Tutorial Videos Visualizers
RSS

Navigation


Quick Search
»
Advanced Search »


TASC 2017-08 | Artificial Intelligence For System Development (D’Errico & Trombetta)

RSS

Traders' Tip text

Since a framework that screens for all possible pattern combinations between several prices would be quite complex and lengthy for the purposes of article, we decided to confine ourselves to creating a simple system that implements just the "AI Pattern". Each elementary price rule comes with a set of numeric variables that can be optimized. Our objective is to provide a more realistic simulation of what could have been achieved with an optimized Strategy compared to the backtest results of an exhaustive optimization.

Image

Figure 1. The entry pattern is made up of three rules and an eight-day exit. Here’s how it worked on Deutsche Bank (DBK.DE) stock from September 2016 to March 2017.

To reproduce the method described by authors Domenico D’Errico & Giovanni Trombetta, Wealth-Lab users should install or update the "Genetic Optimizer" extension and employ it with the built-in Walk-Forward Optimization tool (WFO). In broad sense, the WFO in Wealth-Lab lets traders plug in any supported optimization method, such as Monte Carlo, Genetic Algorithm and more. The common parameters of genetic algorithm (selection, crossover and mutation methods, population and generation count, and the metric to optimize for) are configurable. This way, a Walk-Forward Optimization powered by genetic algorithm find a set of optimum lookback parameters for the elementary price rules by testing an In-Sample data interval and applies them to an Out-of-sample section of data.

Image

Figure 2. Results of an optimization of the system on DBK.DE stock data using genetic algorithm. The columns represent the optimizable parameters (entry lookback periods for the elementary price levels) as well as certain performance metrics.

Get the companion Strategy's C# code by downloading it right from Wealth-Lab's "Open Strategy" dialog.

Note: If you manaually copy/paste the code into the program, click on “References...” in the Editor and check “System.Core”.

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using System.Linq;

namespace WealthLab.Strategies { public class TASC201708 : WealthScript { private StrategyParameter paramLookback1; private StrategyParameter paramLookback2; private StrategyParameter paramLookback21; private StrategyParameter paramLookback3; private StrategyParameter paramLookback31; private StrategyParameter paramLookback32; private StrategyParameter paramExitAfter; private StrategyParameter paramGap; public TASC201708() { paramLookback1 = CreateParameter("AP bars",1,0,4,1); paramLookback2 = CreateParameter("MP1 bars",3,0,4,1); paramLookback3 = CreateParameter("MBP1 bars",0,0,4,1); paramLookback21 = CreateParameter("MP2 bars",2,0,4,1); paramLookback31 = CreateParameter("MBP2 bars",1,0,4,1); paramLookback32 = CreateParameter("MBP3 bars",2,0,4,1); paramExitAfter = CreateParameter("Exit after",8,1,20,1); paramGap = CreateParameter("Entry gap",0.08,0.01,1.0,0.01); } protected override void Execute() { var averagePrice = (Open+Close+High+Low)/4; var medPrice = AveragePrice.Series(Bars); var medBodyPrice = (Open+Close)/2; var barsAvgPrice = paramLookback1.ValueInt; var barsMedPrice = paramLookback2.ValueInt; var barsMedPrice2 = paramLookback2.ValueInt; var barsMedBodyPrice = paramLookback3.ValueInt; var barsMedBodyPrice2 = paramLookback31.ValueInt; var barsMedBodyPrice3 = paramLookback32.ValueInt; var bars2Exit = paramExitAfter.ValueInt; int[] lookback = new int[]{barsAvgPrice,barsMedPrice,barsMedPrice2, barsMedBodyPrice,barsMedBodyPrice2,barsMedBodyPrice3}; int startBar = lookback.Max() + 1; var sfasatura = -paramGap.Value; for(int bar = GetTradingLoopStartBar(startBar); bar < Bars.Count; bar++) { if (IsLastPositionActive) { /* Exit after N days */ Position p = LastPosition; if ( bar+1 - p.EntryBar >= bars2Exit ) SellAtMarket( bar+1, p, "Timed" ); } else { /* AI Pattern Generator */ if( (averagePrice[bar - barsAvgPrice] < medPrice[bar - barsMedPrice]) && (medBodyPrice[bar - barsMedBodyPrice] < medPrice[bar - barsMedPrice2]) && (medBodyPrice[bar - barsMedBodyPrice2] < medBodyPrice[bar - barsMedBodyPrice3]) ) { var entryLabel = string.Format("AP[{0}],MP1[{1}],MP2[{2}],MBP1[{3}],MBP2[{4}],MBP3[{5}]", barsAvgPrice, barsMedPrice, barsMedPrice2, barsMedBodyPrice, barsMedBodyPrice2, barsMedBodyPrice3 ); BuyAtLimit(bar+1, Low[bar] + sfasatura, entryLabel); } } } } } }

Eugene (Gene Geren)
Wealth-Lab team
www.wealth-lab.com

Important Disclaimer: The information provided by Wealth-Lab is strictly for informational purposes and is not to be construed as advice or solicitation to buy or sell any security.  The owner of Wealth-Lab.com assumes no liability resulting from the use of the material contained herein for investment purposes. By using this web site, you agree to the terms of this disclaimer and our Terms of Use.

Used under license from FMR Corp. Copyright 2008 FMR Corp. All rights reserved.


ScrewTurn Wiki. Some of the icons created by FamFamFam.