curso superior en programaciÓn de autÓmatas · contenidos teóricos y recomendaciones que se...
TRANSCRIPT
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
CURSO SUPERIOR EN
PROGRAMACIÓN DE
AUTÓMATAS
Con la finalidad de facilitar la asimilación de los contenidos del curso consideramos de su
interés facilitarle los iconos propuestos para este fin:
Este icono se utilizará para realizar preguntas que ayuden a reflexionar
sobre determinadas situaciones o para realizar preguntas que ayuden a
introducir conceptos.
Este icono se utilizará para resumir aquellos conceptos clave que los
participantes deben recordar por su importancia.
Este icono pretende alertar de conceptos que frecuentemente no son tenidos
en cuenta por la gran masa inversora.
Este icono servirá para poner ejemplos que, de un modo más amigable,
permitan reflejar casos prácticos.
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
TEMA 9- ESTRATEGIA CON
INDICADORES
1. Introducción.
2. Descripción detallada de la estrategia a implementar.
3. Implementación de la estrategia mediante NinjaTrader.
4. Optimización de la estrategia:
5. Backtest de la estrategia.
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
TEMA 9- ESTRATEGIA CON
INDICADORES
1 Introducción.
Este caso práctico corresponde a una serie prácticas de desarrollo de
estrategias automatizadas que tiene por objeto enseñar al alumno a
implementar sus propias estrategias, sirviéndose de los ejemplos,
contenidos teóricos y recomendaciones que se exponen en esta sección.
Puesto que esta es la primera práctica, y se asume que se parte de cero, se
expondrán, además de los contenidos propios de la práctica, referencias a
otras partes del Master, así como de otros cursos y másteres del Instituto
IBT, que aquí serán resumidos para un mejor seguimiento de esta práctica
y de las posteriores.
La implementación de una estrategia de forma automática consta de las
siguientes etapas:
En primer lugar, describir lo más detalladamente posible una
estrategia, usando para ello reglas sencillas que sean relativamente
fáciles de implementar, debido a que a medida que se disminuye la
capacidad de síntesis de una regla, mayor será su dificultad para
programarla.
Traducir a código, o hacer uso del builder asistente, para realizar la
traducción (Strategy Wizard en el caso de usarse NinjaTrader),
como se vio en el video, dichas reglas, de ahí la necesidad de que
sean reglas concretas.
Realizar tantas optimizaciones, acompañadas de posteriores
backtest, hasta obtener los resultados deseados, o modificar las
reglas, si no se llegan a ellos.
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
El builder (Strategy Wizard) aporta una aproximación a la construcción de
estrategias, ofreciendo la posibilidad de que personas que no posean
conocimientos de programación puedan implementar sus estrategias.
Esa es su principal ventaja, sin embargo, a la larga resulta insuficiente
para realizar estrategias complejas, debido a su escaso margen de
maniobra. Por lo que si el alumno se quiere orientar a implementar
estrategias de mayor magnitud a medio plazo, es recomendable que
adquiera las habilidades de la programación en código.
Esta primera práctica se ha realizado tanto mediante el asistente Strategy
Wizard como mediante código, para que al alumno le resulte más fácil e
interpretable asociar de qué forma se trabaja en ambos ámbitos. Las
posteriores, debido a su complejidad se han realizado mediante código,
pues su implementación a través del asistente no es posible.
Una de las razones de que en el Instituto IBT se recomiende el uso de
NinjaTrader, es debido a que, además de las facilidades que ofrece para
realizar backtests y optimizaciones de estrategias, su lenguaje de
programación está basado en C# (C Sharp), uno de los lenguajes de
programación más universales que existe actualmente.
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
2 Descripción detallada de la estrategia a
implementar.
Modelo:
En primer lugar hay que describir el modelo que se va a implementar en
NinjaTrader de la forma más detallada posible, reduciéndolo a una serie
de reglas que se van a aplicar al cumplirse una serie de condiciones. En
este caso se trata de un modelo tendencial que se aplicará en casos en que
el precio se mueva de manera sostenida en el tiempo, y para ello se van a
usar los indicadores RSI, CCI y ATR.
Parámetros:
Los parámetros son variables que la aplicación usa para establecer las
condiciones y las acciones que se ejecutan al cumplirse éstas. Las variables
pueden cambiarse y optimizarse de manera posterior de la
implementación, pudiendo modificarse a la hora de realizar un backtest y
una optimización.
En este caso los parámetros son PeriodoCCI y PeriodoRSI, ATRMenor y
ATRMayor.
Filtros:
El filtro es una de las partes más importantes de un sistema, pues una
incorrecta selección de lo valores usados o una mala interpretación del
entorno de mercado en el que se encuentran dichos valores puede hacer
que una estrategia con sólidas bases no obtenga los resultados deseados.
En esta ocasión se han elegido dos filtros, uno por selección de valores y
otro por selección de entornos de mercado, el primero realizado eligiendo
las 50 empresas con mayor capitalización del NASDAQ. El NASDAQ es el
índice en el que cotizan las empresas tecnológicas de EE.UU., y presenta
ciertas características especiales que hacen a las empresas que lo
componen idóneas para estrategias como la que aquí se expone. En este
caso las características a las que se hace referencia son una alta liquidez,
además de una alta volatilidad, a pesar de ser empresas con una alta
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
capitalización, debido a ser empresas tecnológicas. Otro factor que
beneficia al uso de esta estrategia es el escaso ruido que estas tienen en
comparación con su alta volatilidad.
Posteriormente se ha realizado un backtest usando todas las empresas del
NASDAQ 100, para poner en comparación la importancia de usar un
correcto filtro de valores.
Con el segundo filtro se ha querido poner de manifiesto la necesidad de
aplicar en cada entorno de mercado una estrategia que esté diseñada para
tal caso. Dado que esta es una estrategia tendencial, se ha de aplicar
únicamente en el caso de que el valor de indicios de que se encuentra en
tal situación, permaneciendo fiera del mercado cuando lo esté. Tras la
implementación de la estrategia se han realizado varios backtest para
comparar los resultados en función de los entornos de mercado.
Reglas de entrada:
Para realizar las entradas se requerirá que se cumplan las siguientes
condiciones:
Largas:
El ATR de 10 velas mayor que la media móvil del ATR de 10 velas de
los últimos 50 registros, el ATR en un periodo corto (ATRMenor) es
mayor que en un periodo largo (ATRMayor), el CCI de un periodo,
definido por el parámetro PeriodoCCI, sea menor de 100 y el RSI de
un periodo, definido por el parámetro PeriodoRSI, es mayor de 60.
Cortas:
El ATR de 10 velas mayor que la media móvil del ATR de 10 velas de
los últimos 50 registros, el ATR en un periodo corto (ATRMenor) es
mayor que en un periodo largo (ATRMayor), el CCI de un periodo,
definido por el parámetro PeriodoCCI, sea mayor de -100 y el RSI de
un periodo, definido por el parámetro PeriodoRSI, es menor de 40.
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
Reglas de salida:
Largas:
Se cerrará una operación larga una vez el CCI de un periodo,
definido por el parámetro PeriodoCCI, sea mayor de 100.
Cortas:
Se cerrará una operación larga una vez el CCI de un periodo,
definido por el parámetro PeriodoCCI, sea menor de -100.
Stop loss y target:
Tanto el stop loss (stop de pérdidas) como el target (objetivo de cada
operación) se establecerán en función del porcentaje del precio. Su
valor cambiará en función del backtest posterior.
Una operación se cerrará, bien porque se cumplen las reglas de
salida, o bien porque se ha alcanzado el stop loss o el target, lo que
suceda antes en el tiempo.
El stop loss se ha establecido en el 0,3% del valor del precio y el
traget en el 0,9% de éste.
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
3 Implementación de la estrategia mediante
NinjaTrader.
Una vez establecidas las características del modelo a implementar se pasa
a Strategy Wizard para implementarlo.
Este paso se puede realizar de forma asistida, tal y como se muestra en el
video de uso de Strategy Wizard (en el que se expone precisamente esta
estrategia), o mediante la construcción del código, seleccionando “Unlock
code” en la parte inferior de la ventana de Strategy Wizard. A
continuación se muestra el código usado para la implementación.
Todas las estrategias que se generen con Strategy Wizard tienen la
siguiente estructura:
Una primera zona en la que se situan unas declaraciones y
sentencias que la plataforma genera de manera automatica, y en la
que solo se puede modificar el nombre de la estrategia y la
descripcion (opcional) de la misma.
Una segunda zona en la que se encuentran inicializada las variables
que se usan en la estrategia, que pueden ser modificadas y/o
añadidas por el usuario. Tambien se encuentran en esta zona, de
manera optativa, la definicion de caracteristicas que afectan a todo
el programa como el establecimiento de los stop loss y targets por
defecto.
Una tercera zona en la que se encuentra el nucleo de la estrategia en
si, es decir, donde se encuentran las condiciones que se evaluan en
cada vela y las acciones a aplicar si se cumplen dichas condiciones.
Por ultimo una zona en la que se han de declarar las variables a usar,
y que han de coincidir con las variables que se encuentran en la
segunda zona.
El funcionamiento de las estrategias implementadas en NinjaTrader a
traves de Strategy Wizard esta basado en un funcionamiento cíclico de
automata, es decir, las condiciones que se encuentran en la tercera zona se
ejecutan de manera cíclica en cada vela que aparece en la ventana chart.
Por lo que cualquier variable que se defina en esta zona se sobreescribira
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
en la siguiente vela. Para que una variable no se sobreescriba y conserve
su valor una vez ha terimando la vela ha de declararse e unicializarse en la
segunda y cuarta zona. En definitiva, ninja trader evalua cada una de las
condiciones en cada vela y ejecuta las acciones que se encuentran en el
interior de cada condicion, como si cada condicion fuese un interruptor
que diese permiso o no a la ejecutarse las acciones que estan en su interior
en cada vela.
En el apartado Help del menu se encuntra toda la informacion relativa a
las funiones que se pueden usar, tales como el ATR, el volumen, los
precios de apretura, cierre, maximo, minimo, etc.
A continuacion se muestra el codigo usado para generar la estrategia que
se expone en esta práctica.
Esta primera parte del codigo la genera NinjaTrader de manera
automatica, y no se debe modificar, a escepcion de la descripcion y el
nombre de la estrategia.
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
En la segunda zona se encuentran las inicializaciones de las variables,
en las que se muestran, dependiendo de cada tipo, con el formato que
les otorga NinjaTrader. Si se desea cambiar el valor inicial de alguna
variable, este es el lugar en el que hacerlo.
#region Using declarations
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Xml.Serialization;
using NinjaTrader.Cbi;
using NinjaTrader.Data;
using NinjaTrader.Indicator;
using NinjaTrader.Gui.Chart;
using NinjaTrader.Strategy;
#endregion
// This namespace holds all strategies and is required. Do not
change it.
namespace NinjaTrader.Strategy
{
/// <summary>
/// Enter the description of your strategy here
/// </summary>
[Description("Tendencial basado en los indicadores RSI, CCI y
ATR sin gestión de la salida")]
public class TendencialIndicadores : Strategy
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
En la tercera zona es donde se encuentran las reglas del modelo. Está
establecido de manera que al cumplirse una condición, en este ejemplo
un if()se ejecutará la acción que se encuentra ente corchetes {}.
{
#region Variables
// Wizard generated variables
private double aTRMenor = 0.000;//Default setting for ATRMenor
private double aTRMayor = 0.000;//Default setting for ATRMayor
private double periodoCCI = 0.000; // Default setting for
PeriodoCCI
private double periodoRSI = 0.000; // Default setting for
PeriodoRSI
private int cien = 100; // Default setting for Cien
private int sesenta = 60; // Default setting for Sesenta
private int menosCien = -100; // Default setting for MenosCien
private int cuarenta = 40; // Default setting for Cuarenta
// User defined variables (add user defined variables below)
#endregion
/// <summary>
/// This method is used to configure the strategy and is called
once before any strategy method is called.
/// </summary>
protected override void Initialize()
{
SetProfitTarget("", CalculationMode.Percent, 0.009);
SetStopLoss("", CalculationMode.Percent, 0.003, false);
CalculateOnBarClose = true;
}
/// <summary>
/// Called on each bar update event (incoming tick)
/// </summary>
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
Por ultimo aparecen representadas las variables que forman parte del
programa, cualquier variable que se quiera usar es necesario definirla
en esta zona. Las variables tienen que coincidir en tipo y nombre con
las que se encuentran en la zona de inicialización
protected override void OnBarUpdate()
{
// Condición entrada larga
if (VOL()[0] > SMA(VOL(), 10)[0]
&& CCI((int) (PeriodoCCI))[0] < Cien
&& RSI((int) (PeriodoRSI), 3).Avg[0] > Sesenta
&& ATR((int) (ATRMenor))[0] > ATR((int) (ATRMayor))[0]
&& ATR(10)[0] < SMA(ATR(10), 50)[0])
{
EnterLong(100, "");
}
// Condición entrada corta
if (ATR(10)[0] < SMA(ATR(10), 50)[0]
&& VOL()[0] > SMA(VOL(), 10)[0]
&& CCI((int) (PeriodoCCI))[0] > MenosCien
&& RSI((int) (PeriodoRSI), 3).Avg[0] < Cuarenta
&& ATR((int) (ATRMayor))[0] > ATR((int) (ATRMayor))[0])
{
EnterShort(100, "");
}
// Condición salida corta
if (CCI((int) (PeriodoCCI))[0] < MenosCien)
{
ExitShort("Salida Corta CCI", "");
}
// Condición salida larga
if (CCI((int) (PeriodoCCI))[0] > Cien)
{
ExitLong("Salida Larga CCI", "");
}
}
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
#region Properties
[Description("")]
[GridCategory("Parameters")]
public double ATRMenor
{
get { return aTRMenor; }
set { aTRMenor = Math.Max(0, value); }
}
[Description("")]
[GridCategory("Parameters")]
public double ATRMayor
{
get { return aTRMayor; }
set { aTRMayor = Math.Max(0, value); }
}
[Description("")]
[GridCategory("Parameters")]
public double PeriodoCCI
{
get { return periodoCCI; }
set { periodoCCI = Math.Max(0, value); }
}
[Description("")]
[GridCategory("Parameters")]
public double PeriodoRSI
{
get { return periodoRSI; }
set { periodoRSI = Math.Max(0, value); }
}
[Description("")]
[GridCategory("Parameters")]
public int Cien
{
get { return cien; }
set { cien = Math.Max(0, value); }
}
[Description("")]
[GridCategory("Parameters")]
public int Sesenta
{
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
Una vez definida, implementada y compilada la estrategia, y si no hay
ningún fallo de síntesis, la plataforma dará el visto bueno, estando todo
listo para evaluar la estrategia con el histórico de un instrumento.
[Description("")]
[GridCategory("Parameters")]
public int Sesenta
{
get { return sesenta; }
set { sesenta = Math.Max(0, value); }
}
[Description("")]
[GridCategory("Parameters")]
public int MenosCien
{
get { return menosCien; }
set { menosCien = Math.Max(-200, value); }
}
[Description("")]
[GridCategory("Parameters")]
public int Cuarenta
{
get { return cuarenta; }
set { cuarenta = Math.Max(0, value); }
}
#endregion
}
}
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
4 Optimización de la estrategia.
Una vez se ha realizado la implementación se pasa a optimizar la
estrategia. La forma de realizar una optimización correcta es establecerla
sobre una muestra en un periodo de tiempo determinado, llamada
muestra in-sample, y después comprobar los resultados de la estrategia,
con la optimización de parámetros obtenida, sobre la misma muestra,
pero en otro periodo de tiempo distinto, llamada muestra out-sample,
para comprobar si la estrategia obtiene unos resultados solidos al cambiar
de periodo.
Puesto que en esta práctica se han elegido las 50 empresas con mayor
capitalización del NASDAQ, a continuación se muestra la evolución del
NASDAQ desde 2009 hasta la actualidad, para poder expresar mejor el
concepto de entorno de mercado y la necesidad de tenerlo en cuenta a la
hora de aplicar una estrategia.
Evolución del NASDAQ. Fuente: es.finance.yahoo.com.
Se puede aprecia como en 2013 y 2014 el índice se encontraba en una
tendencia alcista, mientras que en 2015 lo hacía en un techo.
La optimización de parámetros se ha realizado sobre 2013.
Obteniéndose los siguientes resultados:
ATRMenor = 11.
ATRMayor = 23.
PeriodoCCI = 40.
PeriodoRSI = 11.
En este caso la muestra in-sample es el el periodo comprendido entre el
1/1/2013 y el 1/1/2014.
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
5 Backtest de la estrategia:
Para realizar un backtest se accede a Strategy Analizer, en el Menú New,
como se vio en este módulo. Una vez en la ventana Strategy Analizer se
hace clic con el botón derecho sobre un sobre un elemento o lista de
elemento se selecciona Backtest, se seleccionan las características
deseadas y se hace clic sobre Run backtest.
En esta práctica se han realizado tres backtest para poner de relieve el
necesario uso de un filtro.
En el primer backtest se ha basado sobre el filtro del entorno de mercado.
En primer lugar se ha realizado un backtest sobre el periodo comprendido
entre el 1/1/2014 y el 1/1/2015, que al igual que el periodo usado para la
optimización se encuentra en estado tendencial, obteniéndose los
siguientes resultados, de los que se extrae principalmente: una fiabilidad
del 76 % y un profit factor de 3,56.
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
En siguiente backtest se ha realizado sobre el periodo comprendido entre
el 171/2015 y el 1/1/2016, en el que como se ve en la imagen de la
evolución del NASDAQ, el índice se encuentra sobre un techo. En este caso
los resultados no han sido tan buenos como en el anterior backtest,
obteniéndose una fiabilidad del 57 % y un profit factor de 1.05, lo que
expresa claramente la necesidad de aplicar la estrategia únicamente
cuando el mercado se encuentra en la situación para la que ha sido creada.
Para comprobar en qué situación encuentra el mercado se puede
establecer un filtro automático dentro de la propia estrategia, añadiendo
por ejemplo que para realizar la entrada la media móvil mensual de 25
periodos ha de estar por encima de la media móvil mensual de 100 o 200
periodos, en el caso de una estrategia tendencial alcista, o usar otros
indicadores manuales, basados por ejemplo, en indicadores
fundamentales, que indique manualmente cuando activar la estrategia y
cuando mantenerla desactivada.
T.+34 902 992 933 [email protected] www.institutoibt.com ©2013 Instituto IBT
El tercer backtest se basa en el filtro de selección de valores. Para ello se va a
realizar sobre el periodo entre 1/1/2014 y 1/1/2015, como en el primer backtest,
con la diferencia de que en esta ocasión se va a usar para ello todas las empresas
del NASDAQ 100. Los resultados que se han obtenido han sido una fiabilidad del
61% y un profit factor de 1,13. Frente al 76% de fiabilidad y el profit factor de
3,56 obtenido en el mismo periodo si se aplica el filtro de selección de valores,
quedando comprobada la necesidad de su uso.