Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Contenido
Resumen. ...................................................................................................................................................... 5
Abstract........................................................................................................................................................ 6
Introducción. ............................................................................................................................................... 7
Planteamiento del problema. ..................................................................................................................... 8
Objetivo general. ....................................................................................................................................... 13
Objetivo específico. ................................................................................................................................... 13
Justificación. .............................................................................................................................................. 14
Marco Referencial. .................................................................................................................................... 17
Antecedentes. ......................................................................................................................................... 17
Marco Teórico. ...................................................................................................................................... 21
Marco Conceptual................................................................................................................................. 24
CAPITULO 1. Estrategias de trading para la paridad EUR/USD a través de la optimización del
indicador Ichimoku Kinko Hyo e implementación de trading Algorítmico. ....................................... 29
Estrategia de trading. ........................................................................................................................... 31
Resultados. ............................................................................................................................................. 35
Propuesta de modelo Backtesting. ........................................................................................................... 38
Implementación de modelo a Python. ................................................................................................. 38
Cálculo del indicador técnico Ichimoku Kinko Hyo......................................................................... 40
Función de posición. .......................................................................................................................... 49
Función cierre .................................................................................................................................... 51
Función apertura. .............................................................................................................................. 53
Función de resultados. ....................................................................................................................... 54
Función agregar y escribir archivo.csv ............................................................................................. 55
Resultados. ............................................................................................................................................. 56
CAPITULO 2 Optimización de estrategias de inversión...................................................................... 61
Propuesta inicial nuevas estrategias de inversión. ............................................................................. 61
Aperturas. ........................................................................................................................................... 62
Cierres................................................................................................................................................. 66
Resultados de las estrategias planteadas. ............................................................................................ 72
Resultados finales. ................................................................................................................................. 84
Activo Funcional ....................................................................................................................................... 87
4
Resumen.
marco de tiempo 15, 60, 240 minutos, obteniendo la configuración óptima para cada componente
del indicador técnico Ichimoku Kinko Hyo. Se presenta además un prototipo de interconexión
Abstract.
This research proposes a Backtesting model in the Python programming language that allows to
evaluate the performance of 30 proposed strategies for the EUR / USD parity in the time frame
15, 60, 240 minutes, obtaining the optimal configuration for each component of the Ichimoku
technical indicator Kinko Hyo. It also presents a prototype of interconnection between this
Introducción.
programación Python que permite validar y actualizar los resultados obtenidos en estudios
anteriores.
inversiones para la paridad EUR/USD con el indicador técnico Ichimoku Kinko Hyo teniendo
como filtro el lugar donde se produce el cruce entre los dos componente principales de este.
rentabilidades esperadas para cada uno de ellos y por último, la desventaja de los operadores
ejecución.
Se han desarrollado proyectos que dan alguna visión de respuesta a estos problemas.
trading discrecionales” (del Rio Miño, 2015), concluyen que diversos factores emocionales como
aumento de situación de riesgo operativos y por tanto en la utilidad obtenida por el trader.
en las negociaciones de diferentes activos, tales como acciones y futuros en donde de acuerdo a
estudio como “High-Frequency trading-New Realities for Traders, Markets and Regulators”, se
estima que más del 60% de las operaciones se realizan a través de este tipo de trading y 40% en
el caso del mercado de divisas (Maureen , Lopéz de Prado, & Easley, 2013); evidentemente este
9
toma de decisión y es así como dentro del proceso de investigación se abordan el estudio de
Ichimoku Kinko Hyo e implementación del trading Algorítmico” del ingeniero David Balaguera
que dan como resultado la configuración óptima de los parámetros para el indicador Ichimoku
Kinko Hyo, que permite la creación de una estrategia para la paridad Euro/Dólar, adicionalmente
Metatrader 4.0.
Como consecuencia a los resultados positivos que arrojo la estrategia bajo las
indicador técnico Ichimoku Kinko Hyo que no han sido objeto de estudio, dar continuidad al
utilizar otro tipo de lenguaje que permita conservar la privacidad de las señales de apertura
(Mercado, Pending orders), las señales de cierre (Stop loss, Trailing stop, Take profit) y la
cantidad (Lotes) con la que se debe ingresar al mercado, estas son variables claves que se deben
Python, que es considerado el segundo más utilizado en los mercados (Piatetsky, 2013), esto
debido a las ventajas que ofrece como; la facilidad en la taxonomía de su lenguaje, además
brinda múltiples mecanismo para poder aprender sin dificultad la programación de este, y es una
negociación Trader Workstation (TWS) como el medio por el cual se implementó la conexión
con el lenguaje de programación Python. Esta plataforma, ofrece otras ventajas competitivas
tales como: amplia variabilidad del portafolio de activos (acciones, divisas, índices,
Latencia.
Lenta ejecución
tendencia Ichimoku Kinko Hyo en la paridad EUR/USD en los marcos de tiempo de 15, 60 y 240
minutos, teniendo en cuenta los tres diferentes estados de la línea Kinjun Sen y la Tenkan Sen
Objetivo general.
indicador de tendencia Ichimoku Kinko Hyo en la paridad EUR/USD en los marcos de tiempo de
15 minutos, una hora y cuatro horas, en los tres diferentes estados en donde se puede presentar el
cruce de la Kinjun Sen y la Tenkan Sen respecto a la Kumo e implementar un programa que
Trader Workstation.
Objetivo específico.
2. Optimizar el algoritmo teniendo como referencia la posición del cruce de las líneas
Kinjun Sen y la Tenkan Sen respecto a la Kumo en el indicador técnico Ichimoku Kinko
Hyo.
Justificación.
La innovación y la tecnología es la clave para desarrollar los mercados financieros, pues han
logrado con éxito una transformación hacia mercados globales que tengan la capacidad de poder
operar más allá de los límites geográficos sin necesidad realizar inversiones físicas (Sánchez
Anteriormente, la manera por medio del cual se tomaban las decisiones para invertir en
directamente al mercado electrónico y las operaciones se calzan sin la intervención directa del
ser humano, esto producto del trading algorítmico. Los algoritmos pueden predecir más rápido y
con más precisión dónde se puede ganar dinero en los mercados cambiantes y completos como lo
crear metodologías de inversión que aporten agilidad, seguridad y confianza, para dar inicio a
nuevas oportunidades en los mercados financieros, no solo para realizar operaciones sino
Se hace necesario realizar esta investigación puesto que será la solución a las
una necesidad de profundo cambio y la perdida de varios escenarios óptimos de inversión en los
mercados financieros.
Méndez A. con el cual se define los criterios para desarrollar el proyecto con base en las
siguientes premisas:
a la reunión de material bibliográfico que permite robustecer el marco teórico y los conocimiento
previos que se tienen de los temas claves de la investigación. Adicionalmente, el proyecto aborda
abordado desde lo experimental, el cual es definido como el conjunto de procesos que se deben
16
llevar a cabo para cumplir con los objetivos planteados y dar así una respuesta oportuna al
Recolección de información: se llevó a través del uso de fuentes primarias para diseño de
los resultados arrojados de los procesos de Backtesting; y fuentes secundarias tales como libros,
Successful Algorithmic Trading (Halls Moore, 2015), documentos, Guia Trader Workstation.
(Interactive Brokers, s.f) , tesis (Balaguera Mesa, Estrategias de trading para la paridad
EUR/USD a través de la optimización del indicador Ichimoku Kinko Hyo e implementación del
Marco Referencial.
Antecedentes.
El estudio técnico de los mercados financieros surge a partir de las premisas expuestas por
Charles Dow en las décadas finales del siglo XIX, (Loaiza Palacios, 2007) cuya estructura
tomaba como base la descripción del comportamiento del mercado a partir de las gráficas de
cierre diario, lo cual implicaba que no tratara de prever comportamientos futuros si no por el
contrario, su intención era establecer una serie de patrones que se repetirían a partir de su
tendencia.
tecnologías, el análisis técnico ha venido incorporando nuevas herramientas que mejoran los
trading algorítmico.
posible movimiento del mercado y por ende la futura tendencia sus precios, dejando de lado las
influencias emocionales que pueda tener el trader / inversionista, optimizando las decisiones de
mercado de valores coreano, se ha encontrado que este tipo de negociación reduce los niveles de
este estudio afirmando que en las bolsas de valores en las cuales son manejadas por
comunicaciones electrónicas sin intervención humana aumenta la calidad del mercado financiero
También se han realizado estudios en los cuales se pone a prueba una de los bolsa más
grandes del mundo como lo es la de New York con la implementación de trading algorítmico, y
los resultados respaldan los hallazgos encontrados en otras investigaciones, las cuales afirman
que hay un aumento en la liquidez y además una mejor capacidad de proveer información acerca
para la negoción de los valores financieros y la mitigación de muchos factores por los cuales se
ven afectados los participantes del mercado; está es abordada desde varios puntos; en primer
lugar, la aversión del riesgo que está interpretada como los momentos por los cuales debe pasar
19
un inversor cuando quiere realizar una operación de mercado pero este no cuenta de inmediato
con las disponibilidad del total de los activos que el inversionista desea adquirir, por tanto esta
pueda generar y el riesgo de mercado por la ejecución lenta. En segundo lugar, se postula un
comercio adaptado a la apreciación de precios, es decir, cómo los grandes inversores de mercado
negociar, la apreciación de precios en las primeras horas de negociación indica las grandes
posiciones netas que se están ejecutando y por consiguiente se genera este impulso de precios;
con estas ideas se plantea un modelo matemático y algorítmico que busca la reducción de los
costos totales de negociación y mitigue los riesgos a los cuales se está expuesto al momento de
invertir; con este tipo de investigación se propone ser más exigente con la función que tiene el
trading algorítmico pues no es solo que ejecute gran cantidad de ordenes sino que a su vez
beneficie al inversor con la reducción de factores que podrían llegar a impactar de manera
Adicionalmente, se han realizado modelos matemáticos de media varianza que pueden ser
incorporados a ciertas estrategias de inversión, que busca encontrar un equilibrio en el costo del
inversor cuando la ejecución rápida de sus órdenes contra el riesgo de volatilidad por la
ejecución lenta. Aplicando este modelo se reduce el riesgo que se genera por la aceleración de la
ejecución de los órdenes cuando el precio se mueve a favor del comerciante, y así encontrar el
precio de entrada más rentable por medio del trading algorítmico (Almgren & Lorenz, 2007).
20
Por otro lado, hay investigaciones como “Moore's law versus Murphy's Law: Algorithmic
trading and its discontents”, donde se reconoce que los mercados financieros hoy en día están
consecuencia a ellos los beneficios para los participantes del mercados son evidentes en cuanto a
la rapidez de las ejecuciones de las operaciones, entre otras; pero se advierte que puede llegar a
tener problemas pues no es algo que se encuentre regulado y se propone la “Regla Financiera
2.0”, que consiste básicamente en crear mecanismos que ayuden a la regulación de los mercados
automatizado, pues se cree que esto aportaría más confianza y seguridad a los inversores al
Marco Teórico.
En esta sección se pretende mencionar los documentos que tuvieron más relevancia para el
El Ichimoku Kinko Hyo es un indicador con gran acogida por quienes a diario interactúan
en los mercados de valores, debido a su versatilidad, pues permite definir niveles de soportes,
resistencias, así como también identificar cambios de tendencia y con esto señales de entrada o
commodities, opciones y futuros; pero ya que este es un indicador de tendencia se ajustara mejor
a los mercados que estén caracterizados por esto (Admiral Markets AS, s.f)
principio ser compleja, esto como consecuencia a la cantidad de parámetros que lo compone y el
significado de cada uno de ellos, para el manejo parcial de este, se tiene como guía el libro
“Trading with Ichimoku cloud. The Essential Guide to Ichimoku Kinko Hyo Technical
Analysis” (Patel, 2010) que no solo aporta una amplia descripción sobre el manejo de cada
componente del indicador, sino que adicionalmente brinda herramientas para el desarrollo de
Backtesting eficiente, esto es útil en esta investigación para comprobar si basados en los
comportamientos históricos de este indicador y bajo los filtros propuestos en secciones pasadas,
22
amplio contenido en el análisis luego de obtener los resultados del Backtesting y cómo poder
Por otro lado, la principal investigación que será tomada como referencia será la
del indicador Ichimoku Kinko Hyo e implementación del trading Algorítmico.” (Balaguera
Mesa, Estrategias de trading para la paridad EUR/USD a través de la optimización del indicador
Ichimoku Kinko Hyo e implementación del trading algoritmico., 2015) En la cual como se ha
configuración óptima arrojada por el algoritmo. Se tomó para este proyecto el modelo realizado
en esta investigación y esto permitirá poder comparar los resultados conseguidos por el
investigador Ricardo Balaguera, frente a los que se obtendrán en el presente estudio y poder
determinar si los nuevos filtros establecidos fueron ideales para continuar con el proceso de
Algorithmic Trading” (Halls Moore, 2015), el cual brinda una guía sobre la introducción al
23
trading algorítmico, conceptos sobre sistemas de trading y como poder implementar un sistema
Además, para el desarrollo de esta se tuvo como referencia una guía online ofrecida
programación como lo es, C#, Java, Visual Basic, C++ y por último Python (Interactive Brokers,
s.f).
24
Marco Conceptual.
desarrollo de la investigación.
estrategias de cada inversor en un lenguaje de programación, de tal forma que las operaciones se
realizaran de manera automática siempre y cuando exista una conexión con los mercados
financieros.
Por otro lado, es importante entender que cuando se habla de plataforma de negociación
se hace referencia a un lugar no físico por medio del cual se ejecutan las operaciones de compra
y venta de un activo financiero, y suministra en tiempo real los precios de los valores que se
desean negocia.
programación por medio del cual se pretende realizar la interconexión con la plataforma de
Por otra parte, los indicadores técnicos, son herramientas que se utilizan para el análisis
esta última categoría se encuentra un indicador el Ichimoku Kinko Hyo el cual sirve para
determinar la tendencia del mercado, posibles niveles de soportes y resistencias que generan
Tenkan-Sen muestra el valor medio del precio durante el primer periodo de tiempo, se
determina como la suma del máximo y el mínimo durante este tiempo divida por dos.
Tenkan Sen
Figura 1. Tenkan Sen: se puede evidenciar la línea Tenkan Sen. Fuente: Metatrader 4.0 (2017)
Kinjun-Sen muestra el valor medio del precio durante el segundo periodo de tiempo.
Tenkan Sen
Kinjun Sen
26
Figura 2. Kinjun Sen: Se puede evidenciar construcción de las líneas Tenkan Sen y Kinjun Sen.
Senkou Span A muestra la mitad de la distancia entre dos líneas anteriores, que esta
Senkou Span B muestra el valor medio del precio durante el tercer periodo de tiempo que
Tenkan Sen
Kinjun Sen
Senkou Span B
Senkou Span A
Figura 3. Senkou Span A - Senkou Span B: Se puede evidenciar construcción de las líneas
Tenkan Sen, Kinjun Sen, Senkou Span A, Senkou Span B. Fuente: Metatrader 4.0 (2017)
Chikou Span muestra el precio de cierre de la vela actual que está desplazada hacia atrás
al valor del segundo período de tiempo. La distancia entre las líneas Senkou en el gráfico
se raya en otro color y se llama "nube". Si el precio se encuentra entre estas dos líneas, se
considera que al mercado le falta tendencia y entonces los bordes de la nube forman los
Chikou Span
Tenkan Sen
Kinjun Sen
Senkou Span B
Senkou Span A
Figura 4. Indicador Técnico Ichimoku Kinko Hyo: se puede evidenciar todos los componentes
Cuando se habla de Backtesting se hace referencia a un proceso mediante el cual se estudia una
estrategia de inversión antes de emplearla oficialmente para operar en el mercado, esto permitirá
cierre, confirmación, Take profit, Stop Limit, Trailing stop, cantidad de lotes, con las cuales un
inversionista debería ingresar al mercado, con el fin de tener un máximo rendimiento frente a un
CAPITULO 1.
Estrategias de trading para la paridad EUR/USD a través de la optimización del indicador
Ichimoku Kinko Hyo e implementación de trading Algorítmico.
Python, que permite validar y actualizar los resultados obtenidos en el estudio principal de
referencia. Esta investigación tuvo como objetivo principal, poder evaluar la eficiencia,
Ichimoku Kinko Hyo en la paridad Euro/ Dólar en los marcos de tiempo de 15, 60 y 240
trading para la paridad EUR/USD a través de la optimización del indicador Ichimoku Kinko Hyo
modelo en Visual Basic, que permite hacer un número de combinaciones posibles para cada uno
de los parámetros del indicador técnico dependiendo de los rangos asignados para el estudio, y
que a su vez por cada configuración realizada genera un nuevo archivo con información
calculada acerca de los componentes del indicador (Tenkan Sen, Kinjun Sen, Senkou Span A,
Senkou Span B), posición de mercado con base a la estrategia de inversión, cierre y apertura de
Hoja "PRECIOS"
Calculo del Ichimoku Kinko
Rango de parametros. Hyo.
Tenkan Sen, Kinjun Sen, Tenkan Sen, Kinjun Sen, Senkou
Senkou Span B, Span B, Adelantamiento de Nube
Figura 5. Diagrama del modelo. Se puede observar en el gráfico la manera mediante la cual
realiza los procedimientos el archivo al ser ejecutado, para su correcta ejecución se requiere de la
ubicación de tres archivos y los parámetros asignados, de esta forma se podrá utilizar esta
información para crear un nuevo archivo resultante con los cálculos antes mencionados, a su vez
los resultados obtenidos servirá para complementar el archivo principal. Fuente: Creación propia
(2017).
Estas últimas cifras obtenidas al final de cada archivo resultantes, son recopiladas
general sobre el desempeño que ha tenido la estrategia por cada configuración realizada dentro
del rango de datos dados por el usuario, esto brinda la facilidad al operador para el análisis de las
cifras y así poder tomar una dedición sobre la configuración con la cual se ajusta más el
comportamiento del mercado se ajusta a la estrategia programada, para esto es necesario poner la
configuración de los parámetros óptimos que arroja el análisis de los resultados del programa
Estrategia de trading.
dos parámetros del indicador técnico, por la línea Kinjun Sen; la confirmación de entrada se dará
con el comportamiento del precio. Se presenta señal de compra, cuando la línea Kinjun Sen
rompe la línea superior de la nube hacia arriba, se tomará posición con la apertura de la vela que
se encuentre por encima de la misma, en caso de que el precio sea inferior al Kumo se deberá
esperar hasta que este se ubique sobre la nube (Véase Figura 4).
32
Figura 6. Señal de compra. Es evidente el rompimiento que hace Kinjun Sen a la nube. Fuente:
a ubicar debajo del Kumo, haciendo un rompimiento hacia abajo y dando señales de una posición
de venta, pero dado que la apertura aún no se ubica debajo de la nube no se confirma esta señal.
La señal de venta se presenta, cuando la Kinjun Sen atraviesa la parte inferior de la nube
y la apertura de la vela se encuentra también bajo el Kumo (Véase Figura 5). De igual manera se
puede presentar lateralidad en el comportamiento de la Kinjun Sen y será necesario esperar a que
Figura 7. Señal de Venta. Se realiza el rompimiento de la nube la Kinjun Sen, dando una señal
Para abrir cualquier tipo de posición larga o corta, es necesario esperar la confirmación de la
misma, que consiste en una nueva apertura de vela por encima o debajo de la nube
Apertura
Cierre
34
el primer recuadro color rojo se encuentra el precio sobre la nube y adicionalmente se encuentra
recuadros verde y azul al finalizar la imagen se puede apreciar cómo entra el precio a la nube
dando una señal de cierre de posición y cómo en la siguiente vela hace su ingreso la Kinjun Sen
Es importante resaltar que la estrategia de trading se encuentra diseñada para que solo se
encuentre una posición abierta a la vez, puesto que el cierre de alguna de estas puedes
operación de compra, la señal se presentará en el momento que la Kinjun Sen sea mayor que la
nube compuesta por la Senkou Span A y Senkou Span B, la confirmación en este caso será la
primer vela cuya apertura sea mayor que el Kumo, la apertura de la posición será entonces
cuando el open de la primera vela se haya presentado de igual forma sobre la nube y a su vez se
cuando la Kinjun Sen se encuentre dentro del Kumo y exista una apertura dentro de la nube.
35
Para el caso de una operación de venta, la señal ocurrirá cuando la Kinjun Sen es menor
al Kumo, se confirma cuando la apertura de la vela se encuentra por debajo de la nube, y se abre
la operación cuando la apertura de la primera vela es menor a la Senkou Span A y Senkou Span
B, por supuesto luego de haber sido evaluada la señal y la confirmación, el cierre será el mismo
Resultados.
Se realizó una comparación de resultados obtenidos por la configuración por defecto de los
parámetros del indicador técnico Ichimoku Kinko Hyo (los valores que tiene predeterminados el
indicador para cada uno de sus componentes) y la configuración propuesta (nuevos valores
sugeridos para cada componente del indicador) por el modelo, tomando las siguientes cifras:
Parametros
Configuración Configuración
Componente
por defecto propuesta.
Tenkan Sen 9 8
Kinjun Sen 26 22
Adelantamiento 26 22
Senkou Span B 52 44
Nota: Se ven reflejado los valores propuestos y traídos por defecto. Fuente: Creación propia
(2017).
36
Al evaluar estos parámetros y en los marcos de tiempo de 15,60 y 240 minutos, se puede afirmar
que fue más rentable la configuración propuesta para todos los marcos de tiempo, dejando como
resultado 4145.2, 12153.9 y 16169.2 respectivamente, mientras que en la configuración que trae
por defecto el indicador el resultado de rentabilidad fue de 2542.8 para el marco de tiempo de 15
Se realizó además un mapa de calor para cada marco de tiempo y poder evidenciar las
zonas en las cuales se producía una mayor acumulación de rentabilidad, así como también los
máximos trades alcanzados por configuración, mayor rendimiento promedio evaluando en cada
mapa los parámetros Senkou Span B y el adelantamiento de la nube, también se tuvo en cuenta el
análisis del comportamiento del promedio frente a los máximos registrados por configuración.
con el parámetro de la Senkou Span B se observó que se generan la mejor zona óptima para el
máximos en cualquier configuración del Senkou Span B, los periodos de la Kinjun Sen se deben
es oportuno poder aumentar la velocidad de ejecución, pues esto permitirá que sean evaluados
múltiples escenarios del mercado en el menor tiempo posible, y de esta manera aprovechar
El modelo propuesto, realizará el cálculo del indicador técnico Ichimoku Kinko Hyo, de acuerdo
combinaciones posibles y procederá a calcular cada uno de los componentes del indicador
técnico, con base a esto indicará la posición que debe tomar teniendo inicialmente la estrategia
apertura y cierre de posiciones, para finalmente concluir con los resultados obtenidos del estudio
tales como: Resultado total, número de trade positivos y negativos posiciones cortas, número de
trade positivos y negativos posiciones largas, total de trade, eficiencia, trade máximo y mínimo,
para luego almacenarlos en un nuevo archivo “.csv”, el cual será generado al finalizar la
ejecución completa por activo, esto permite el análisis conjunto de las cifras producto de cada
combinación.
principal que es el encargado de llamar a cada una de ellas y de esta manera ejecutar el modelo
más rápido. La metodología por la cual se realiza lectura de la información en Python es por
Es importante resaltar que antes de ejecutar el programa, se debe tener en la misma carpeta o
directorio donde está almacenado este, un archivo “.csv”, con la información histórica que se
desea analizar, y suministrar el nombre exacto de este al programa para que pueda compilar de
manera satisfactoria. El orden que deben tener los datos dentro de este archivo es: la fecha, la
hora, open, high low, close y volumen, tal como se muestra en la siguiente:
40
Figura 9. Formato de presentación archivo entrante. Se puede observar el orden que debe
encontrará en los anexos del presente documento (Anexo A). Para poder explicarlo de manera
más clara se dividirá en seis categorías: Cálculo del indicador técnico Ichimoku Kinko Hyo,
Para dar a conocer de manera más clara el funcionamiento del modelo, se plantea un diagrama de
flujo (Figura 7), en el cual se muestra el proceso de ejecución interna de la primera parte del
modelo propuesto, empezando por recorrer una función que lee el archivo, luego haciendo el
Def Leer_archivo.
archivocsv.
Def spana.
Def Chikou.
par_tenkan,
archivocsv, par_ade.
par_kinjun,par_ade.
lista_chikou [ ] lista_spana [ ]
Figura 10. Diagrama de flujo cálculo del indicador técnico Ichimoku Kinko Hyo. Se observa
el orden de ejecución de la primera sección del programa. Fuente: Creación propia (2017).
Es pertinente volver a resaltar que antes de ejecutar el programa de Python se debe contar
en el mismo directorio con un archivo “.csv” que contenga la información histórica de la paridad
separador decimal “,” (Signo de puntuación coma) y como separador de miles “.” (Signo de
puntuación punto), deberá abrir el archivo “.csv” en un bloc de notas y reemplazar en primer
lugar las “,” (Signo de puntuación coma) por “.”(Signo de puntuación punto), y en segundo lugar
42
los “;”(Signo de puntuación punto y coma) por “,” (Signo de puntuación coma); esto con el fin
de que el Python pueda reconocer la información del archivo correctamente y pueda compilar.
En la parte final del programa de Python, se encontrará el menú principal que como se
mencionaba en secciones anteriores es el lugar en donde se invocan las funciones creadas, esto
para aportar agilidad al ejecutarse; la primera sentencia que se encontrara allí será:
Así pues, se está invocando la función “Leer_archivo”, pero a su vez esta exige que se
ingrese el nombre del documento para poder ejecutarse, es entonces en la línea verde, donde
debe ponerse el nombre del archivo en el cual se encuentra almacenado el histórico de precios.
La parte azul, representa el nombre que se le asigna a lo retornado por la función que se invoca.
def Leer_archivo(csv_file):
return datalist
Las funciones en Python se identificaran porque inician con “def”, expresión que se usa
para crearlas en este lenguaje de programación. El texto anterior simboliza de manera general la
43
función “Leer_archivo” y como se puede apreciar exige una entrada, que es demarcada de color
verde, es entonces cuando el nombre del archivo ingresado en el menú principal será lo necesario
para poder compilar la función y retornar lo que se denomina “archivocsv”. Para poder
desarrollar esta función fue necesario acudir a la guía desarrollada por Python para facilitar la
Antes de ser ejecutado el programa, el usuario deberá asignar el rango para cada uno de
los parámetros, dentro del código de Python el lugar donde se define esto, es a continuación
donde se enuncia la función que se explicó anteriormente, allí se encontraran ocho variables
k=Kinjun Sen, a=Adelantamiento de la nube, b=Senkou Span B), y la variable posterior significa
inicio o fin; es decir, “ti” significa el parámetro con el cual desea iniciar el rango de
configuraciones posibles para la Tenkan Sen, y “tf” el parámetro con el cual finalizará; y así para
Para asignar de manera correcta los parámetros es necesario tener en cuenta lo siguiente,
en el lenguaje de programación Python al definir un rango, este no tiene en cuenta el último valor
suministrado, por ejemplo: si se desea que las configuraciones de la Kinjun Sen inicien en dos y
finalice en cinco, entonces el valor se debe asignar a “ki”=2 y a “kf”=6, para que de esta manera
44
el programa pueda establecer el rango para la Kinjun Sen desde dos hasta cinco; así para la
listas y un ciclo que realiza el número de combinaciones posibles teniendo como referencias los
datos suministrados, luego de esto se observa la creación de unas variables que son necesarias
función es realizar el cálculo del indicador técnico para cada configuración posible, dentro de
este se encuentra la lectura de las listas en donde están almacenadas cada combinación posible,
para extraer un elemento a la vez de cada una de ellas, luego de esto una creación de lista, cuyo
objetivo será almacenar cada resultado producto del análisis por configuración. Posterior a esto
se continúa con el proceso de invocación de funciones que hacen posible el cálculo del indicador
Después de leer el archivo, se remitirá a sentencia del menú principal, en la que se invoca
la función “tenkan” que realiza el cálculo del componente Tenkan Sen del indicador técnico
ahora utilizado en la función tenkan para realizar su cálculo y retorna unos valores almacenados
Ahora la función “tenkan”, recorrerá el archivocsv y abstraerá los valores de High y Low
parámetro para este componente y realizará el cálculo, finalmente retornara los valores
calculados por el función, “par_tenkan”, nombre asignado al valor dado por el usuario,
“total_high” y “total_low”, listas en donde se guardan los valores extraídos del archivo principal
Para invocar la función que realizará el cálculo de la línea Kinjun Sen, en el menú
lista_kinjun, par_kinjun=kinjun(archivocsv,total_high,total_low)
en este caso, para extraer información necesaria para el cálculo, así como también ingresan las
def kinjun(lista_precios,total_high,total_low):
return lista_kinjun,par_kinjun
Sen, la manera mediante la cual se procesa esta instrucción es teniendo como entrada lo
luego de que recibe la información el programa preguntará al usuario un valor para el parámetro
resultado de cada operación en “lista_kinjun” que será lo retornado por la función junto al
nube o la línea Senkou Span A, esta función “spana” se retroalimenta de “lista_tenkan” que fue
lista_spana,par_ade=spana(lista_tenkan,lista_kinjun,par_kinjun)
El cálculo de cada valor de la línea Senkou Span A, se realiza teniendo en cuenta los
del parámetro de adelantamiento por el usuario, para poder realizar las operaciones, cada valor
siendo este uno de los valores devueltos junto a la variable en la que fue almacenado el
def spana(lista_tenkan,lista_kinjun,par_kinjun):
Para invocar la siguiente función que dará como resultado una lista con datos producto
del cálculo de la línea Senkou Span B, la sentencia de código en el método principal del
programa será.
lista_spanb,par_spanb=spanb(par_ade,archivocsv,total_high,total_low)
Como se ha explicado antes, lo que se encuentra dentro del paréntesis hace referencia a lo
que necesita la función para poder ejecutarse, para este caso en concreto, los valores o listas
La ejecución de esta función tiene la misma lógica que ha tenido las explicadas
anteriormente, se nutre de unos valores que deben ingresar y que para hacer más fácil la
cálculo que simultáneamente con su desarrollo ira agregando en una nueva lista (“lista_spanb”)
para luego ser retornada por la función, junto a “par_spanb” variable que guarda el valor del
La sección del programa de Python que fue creada para el cálculo del componente
Chikou Span o también denominada línea del precio retardado, se retroalimentará del archivo
denominado en este caso “par_ade”, que fue la variable devuelta en la función “spana”, si bien
en esta nueva función se hace los procedimientos para toda la lista de datos y a su vez van siendo
almacenados en una lista denominada “chikou”, este función no retornara ningún valor. (Anexo
chikou(archivocsv,par_ade)
Con los seis procedimientos explicados anteriormente se completa el cálculo de cada uno
de los componentes del indicador técnico Ichimoku Kinko Hyo, es pertinente recordar que a esta
etapa de ejecución del programa, los valores calculados para cada uno de estos están
almacenados en diferentes listas y que serán utilizadas en funciones posteriores para poder
realizar el Backtesting.
Función de posición.
El objetivo de este apartado es explicar la manera mediante la cual se identifica la posición que
se debe tomar, sea corta o larga, dependiendo del comportamiento del mercado en cada
momento. Para que la explicación sea más grafica se presenta a continuación un diagrama de
Def posicion_lc.
archivocsv,par_tenkan,
par_kinjun,lista_spana,
lista_spanb.
O,SA,SB,K
,posicion SI CORTO
LARGO
posicion [ ]
NO
""
En el método principal la sentencia por medio del cual invoca esta función es:
se han explicado anteriormente, y los valores que devolverá esta función en concreto serán los
demarcados de azul.
51
de información referente a los datos de fecha, Open y Close de la base de datos inicialmente
información histórica dentro del archivo evaluando las condiciones dadas para poder dictaminar
si la posición es larga o corta, si se cumple alguna de las condiciones que se tiene para
para almacenar esta información, si no se cumple ninguna de los escenarios enviará a la lista un
posición vacía, simbolizado en Python como “ ”. Finalmente se retornará la lista en la que fue
almacenado esta información, y dos métodos de almacenamiento extraídos del archivo principal.
def posicion_lc(lista_precios,lista_kinjun,lista_spana,lista_spanb):
return total_open, total_close, posicion
Es importante resaltar que las condiciones utilizadas en los ciclos del código de esta
función tienen como objetivo definir las posiciones de mercado teniendo como referencia la
Kinjun Sen.
Función cierre
Informar cuándo debe ser el cierre de las posiciones de acuerdo algunos comportamientos del
precisamente el objetivo por el cual se ha creado esta función, en el diagrama que se presenta a
Def cierre_lc.
archivocsv,
lista_kinjun,lista_spana,
lista_spanb,posicion.
O,SA,SB,K,
posicion SI CIERRE LARGO,
CIERRE CORTO
cierre [ ]
NO
""
La lógica mediante la cual fue creada esta función es similar a la utilizada por
la base de datos, así como de “lista_kinjun”, “lista_spana”, “lista_spanb”, “posicion”; todos estos
son valores que han sido devueltos en funciones del programa anteriormente; posterior al
reconocimiento de esta información se comienza a hacer un ciclo de validación, para luego entrar
en los condicionales que permitirán concluir si debe haber cierre de posición, si se llega a
“cierre” y la cual será el retorno de esta función. (Anexo H). La sentencia dentro del método
cierre=cierre_lc(total_open,lista_kinjun,lista_spana,lista_spanb,posicion)
Función apertura.
Esta función tiene como objetivo principal concluir la apertura luego de la señal y confirmación
return apertura
Lo anterior simboliza que los requerimientos para la ejecución de está son los mismos
con los que se ha venido trabajando, el proceso de compilación de esta función se hace por
medio de un ciclo for que es el encargado de recorrer cada una de las listas que se encontraban
dentro de los requisitos, posteriormente pasa a los condicionales que con base a la información
en caso de no cumplir ninguna el valor devuelto será “ ” lo que significa vacío. Cada uno de los
Función de resultados.
Para medir el desempeño que ha tenido la estrategia, se hace necesario la creación de una nueva
“posicion”, se hace el primer cálculo que es el resultado total de la estrategia, la manera mediante
la cual se llega a este resultado es restando en posiciones cortas el open de la apertura con el
open del cierre, y para posiciones largas el open del cierre y el open de la apertura.
Por otro lado, se realiza también el conteo de trades positivos y negativos tanto para
posiciones cortas y largas, la lógica empleada en este caso es contar los mayores o menores a
cero. En cuanto a la eficiencia, se debe finalmente sumar los trades positivos en ambas
posiciones y dividirlo sobre el total de trades realizados y multiplicarlo por 100 para tener el
resultado en forma de porcentaje, es este uno de los cálculos más importantes pues de acuerdo al
cortos, para finalmente sacar un promedio total de trades. Estos son los valores calculados en
esta función y que son esenciales para realizar el análisis y de esta manera poder deducir si el
nuevo archivo .csv que no solo contenga la base de datos histórica sino que además incluya el
cálculo de cada uno de los componente del indicador técnico Ichimoku Kinko Hyo, e
un archivo que guarda el resumen de cada configuración posible, con sus resultados arrojados.
(Anexo K)
Para desarrollar la función cuyo objetivo es escribir el archivo “.csv”, se tuvo como guía
el documento creado por Python para facilitar la comprensión del lenguaje. (Python Software
Foundation., 2017)
56
Resultados.
Es pertinente recordar los periodos históricos para cada marco de tiempo, en los cuales se
Tabla 2:
Nota: Se observa los valores arrojados por el nuevo modelo por cada configuración. Fuente:
periodicidad, en este caso 15 minutos, de igual manera con los valores que se encuentran hacia
abajo por la misma columna de este, en segundo lugar se evidencia los parámetros por medio del
cual se realizó el análisis; con el fin de corroborar los resultados de la investigación principal de
referencia fueron utilizados los mismos para este estudio, seguido de resultado total, número de
trades positivos y negativos para posiciones cortas y largas, total trades, eficiencia, máximo y
Cada uno de estos valores fue contrastado por los obtenidos en el modelo de Visual Basic
de la investigación principal de referencia, y es pertinente afirmar que todos los resultados son
iguales. Con el fin de cumplir a cabalidad lo propuesto, se expone a continuación los resultados
arrojados al actualizar la base de datos para la misma paridad en los mismos marcos de tiempo, y
Tabla 3.
Nota: Se puede evidenciar los nuevos resultados obtenidos con la actualización de bases de
Al realizar la actualización de las bases de datos se encuentra entonces que para el marco
de tiempo de 15 minutos, cuya base de datos es alrededor de dos años y medio, fue más eficiente
la configuración que trae por defecto el indicador que la propuesta en la investigación principal
rentabilidad, fue más rentable la configuración propuesta con un resultado de 4.684 frente a los
parámetros por defecto del indicador que tan solo registraron 4.397.
diez años, la configuración propuesta fue más eficiente con un 39.81% frente al valor de los
59
parámetros por defecto del indicador cuyo porcentaje fue de tan solo 39.02%, a su vez la primera
Por otro lado al analizar el marco de tiempo de 240 minutos, la mejor eficiencia se
encuentra con la configuración por defecto del indicador técnico Ichimoku Kinko Hyo con un
porcentaje de 41.73% frente a la propuesta que es de tan solo 40.43%, aunque esta última arrojó
un mejor resultado en comparación con la otra, dejando así un valor de 10.041 y 9647
respectivamente.
rompimiento del Kinjun Sen respecto a la nube, fue aumentando su eficiencia al incrementarse el
240 minutos, si bien el mejor resultado se ubicó en el marco de tiempo 60 minutos, al evaluar la
estrategia no es confiable del todo este valor pues pudo estar concentrado principalmente por una
repita, por tal motivo la búsqueda de nuevos comportamientos dentro del mercado que puedan
el nuevo modelo Backtesting no solo validó los datos en un tiempo inferior obtenidos bajo otro
lenguaje de programación (VBA), sino que además permite actualizar las bases de datos, como
consecuencia es posible tener al día las cifras que miden el desempeño de esa estrategia en cada
CAPITULO 2
Optimización de estrategias de inversión.
evaluando escenarios y comportamientos del indicador Ichimoku Kinko Hyo que no fueron
posibles abordar en esa investigación, pero que sin duda podría simbolizar un aumento en el
estrategias de inversión para la paridad EUR/USD y analizar los resultados obtenidos en cada
una.
Sen y Tenkan Sen, respecto al estado de la Kumo (sobre, en medio y debajo), pero en el
el nuevo filtro relacionado con la distancia del precio y la nube, con el fin de contemplar nuevas
oportunidades de mercado.
Se proponen cinco entradas diferentes, todas relacionadas con el estado del Kumo y seis
cierres distintos, para combinarlos posteriormente y hacer de cada una de estas una nueva
Aperturas.
Para una apertura de posición larga el corte de la Tenkan Sen con respecto a la Kinjun Sen se
presenta de forma ascendente, y en la parte superior del Kumo. Caso contrario ocurrirá cuando la
posición sea corta, pues el cruce de las dos líneas principales deberá ser de manera descendente
Figura 13. Primera propuesta de apertura larga: Se evidencia el cruce de las líneas sobre la
nube, resaltado con el círculo rojo para apertura posición larga y posición corta. Fuente:
Metatrader (2017).
El corte de la Tenkan Sen con la línea Kinjun Sen con dirección ascendente indica una posición
larga, y este debe ser en medio del Kumo; la apertura de la posición corta se dará cuando la
Figura 14 Segunda propuesta de apertura larga: Se evidencia el cruce de las líneas en medio
de la nube resaltado con el círculo rojo para apertura posición larga y posición corta. Fuente:
Metatrader (2017).
64
Para la apertura de una posición larga, el cruce de la línea Tenkan Sen y la línea Kinjun Sen debe
ser con dirección arriba, este debe realizarse en la parte inferior de la nube; para una posición
corte, el cruce de estas dos líneas (Tenkan Sen y Kinjun Sen) se debe realizar con dirección
abajo.
Figura 15. Tercera propuesta de apertura larga: Se evidencia el cruce de las líneas debajo del
Kumo, resaltado con el círculo rojo para apertura posición larga y posición corta. Fuente:
Metatrader (2017).
Cruce Tenkan Sen y Kinjun Sen y el precio (open) mayor a 50 pips con respecto a la
nube.
Para la apertura de una posición bajo este propuesta es necesario cumplir dos requisitos, el
primero hace referencia al cruce de la Tenkan Sen respecto a la Kinjun Sen de forma ascendente
65
y en la parte inferior del Kumo, el segundo, debe existir una distancia mayor a 50 pips entre el
precio (Open) y la nube, para marcar apertura larga. El cruce entre estas dos líneas (Tenkan Sen
y Kinjun Sen) se debe realizar de forma descendente para la apertura posición corta, y en la parte
LARGO
CORTO
Figura 16. Cuarta propuesta de apertura larga: Se evidencia el cruce de las líneas debajo del
Kumo, resaltado con el círculo rojo para apertura posición larga con una distancia mayor a 50
pips; para la apertura de la posición corta, se observa el cruce de las líneas de forma descendente
Cruce Tenkan Sen y Kinjun Sen y el precio (open) menor a 50 pips con respecto a la
nube.
66
El planteamiento de esta apertura larga consiste en el cruce sobre la nube de la Tenkan Sen
respecto a la Kinjun Sen con dirección ascendente, además, una distancia que no sea superior a
50 pips entre en precio (open) y el Kumo. Para una apertura corta, es necesario que el cruce de
LARGO
CORTO
Figura 17. Quinta propuesta de apertura larga: Se evidencia el cruce de las líneas sobre la
nube, se simboliza con el círculo rojo, también es posible observar que la distancia del precio
(open) y el Kumo es inferior a 50 pips, dando con esto aviso de una apertura larga. El cruce de
las líneas (Tenkan Sen y Kinjun Sen) por debajo de la nube, señala apertura de una posición
Cierres.
67
Luego de confirmar cualquier apertura de las descritas la sección anterior, se proponen seis
cierres diferentes, para consolidar varias estrategias de inversión, con el fin de evaluar nuevos
Si la apertura fue larga, entonces el cruce de la Tenkan Sen y la Kinjun Sen debe realizarse de
manera descendente sin importar el lugar en donde se produzca en relación con el Kumo.Para el
cierre de una posición corta, es necesario que el cruce de la Tenkan Sen este en dirección
Figura 18. Primer propuesta de cierre largo. Se evidencia el corte de la Tenkan Sen hacia
abajo respecto a la Kinjun Sen, señalando cierre de posición larga. Además, el cruce hacia arriba
de la Tenkan Sen con la Kinjun Sen, señalando cierre corto Fuente: Metatrader (2017)
68
Tanto para posiciones largas o cortas este cierre será igual en ambos escenarios, el cual consiste
en cerrar la posición abierta, cuando ingrese a la nube el precio (Close) y la Kinjun Sen.
Figura 19. Segunda propuesta de cierre corto o largo. Se observa que el precio ingresa
primero a la nube, para después ingresar la Kinjun Sen y anunciar el cierre de posición. Fuente:
Metatrader (2017).
Cuando el precio Close se ubique en la parte inferior del Kumo y a su vez la Kinjun Sen se
ubique en medio de la nube, marcará cierre para cualquier posición, ya sea corta o larga.
69
Figura 20. Tercera propuesta de cierre cortó o largo. Se observa que el precio ingresa
primero a la nube, para después ingresar la Kinjun Sen y anunciar el cierre de posición. Fuente:
Metatrader (2017).
En el instante donde la Kinjun Sen se ubique encima del Kumo y a su vez el precio (Close) se
encuentra debajo de la nube, será entonces el momento de cerrar la posición abierta, ya sea corta
o larga.
70
Figura 21. Cuarta propuesta de cierre corto o largo. Se puede evidenciar la ubicación del
precio Close debajo de la nube y la línea Kinjun Sen sobre la nube, indicando así el cierre corto o
El cierre bajo esta propuesta, se hará cuando el precio (Close) se ubique por debajo de la línea
Figura 22. Quinta propuesta de cierre corto o largo. Se puede evidenciar la ubicación de la
Kinjun Sen debajo de la nube y el precio (Close) a la vez debajo de la Kinjun Sen representada
en la gráfica como la línea roja, afirmando con esto el cierre de la posición abierta. Fuente:
Metatrader (2017).
La línea Kinjun Sen debe situarse en la parte inferior de la Kumo, y el precio (Close) debe
ubicarse en medio de estas estas dos, de esta manera se afirma un cierre para cualquier posición
abierta.
72
Figura 23. Sexta propuesta de cierre largo o corto. Se observa como la Kinjun Sen está
situada debajo de la nube y que además el precio (Close) está en medio de la Kumo y la Kinjun.
Luego de haber explicado previamente las cinco opciones de apertura y las seis de cierre, se
plantea realiza la combinación entre ellas para obtener un total de treinta nuevas estrategias, que
serán puestas a prueba para poder encontrar las más eficientes en el mercado.
Cada una de las estrategias estudiada con las siguientes bases de:
Los rangos utilizados durante este estudio para cada uno de los componentes del indicador
técnico Ichimoku Kinko Hyo fueron: Tenkan Sen desde 8 hasta 9, Kinjun Sen inicia en 23 y
finaliza en 30, Senkou Span A comienza en 3 termina en 11 y por último el Senkou Span B se
1440, cada una de estas fue ejecutada en cada base de datos y analizados los resultados
provenientes de este proceso, para así poder establecer la mejor configuración de cada parámetro
en las estrategias establecida previamente. Para todos los casos la esperanza matemática fue
Estrategia 1. Apertura: Cruce sobre la nube entra la Tenkan Sen y Kinjun Sen. Cierre:
Con un resultado de 5007.4 pips y una eficiencia de 40.19%, el marco de tiempo que mejor se
desempeñó en esta estrategia fue 60 minutos, con una configuración de: 9 Tenkan Sen, 23
Estrategia 2. Apertura: Cruce sobre la nube entra la Tenkan Sen y Kinjun Sen. Cierre:
El marco de tiempo en el cual se pudo evidenciar el mejor desempeño fue 60 minutos, con la
configuración para cada componente del indicador técnico Ichimoku Kinko Hyo así, Tenkan Sen
9, Kinjun Sen 26, Senkou Span A 11 y Senkou Span B 43; con un resultados de 6049.7 pips y
Estrategia 3. Apertura: Cruce sobre la nube entra la Tenkan Sen y Kinjun Sen. Cierre:
La configuración óptima para esta estrategia es, para la Tenkan Sen un parámetro de 8, Kinjun
Sen 29, Adelantamiento 11 y Senkou Span B 52, en el marco de tiempo de 60 minutos, dando
con esta un resultado de 4.833 pips, junto a una eficiencia del 52.74%, lo que quiere decir que de
la totalidad de operaciones abiertas bajo esta estrategia fueron positivas o generaron rentabilidad
este porcentaje.
Estrategia 4. Apertura: Cruce sobre la nube entra la Tenkan Sen y Kinjun Sen. Cierre:
El resultado obtenido en el mejor escenario bajo esta estrategia fue de 7.541 pips con una
desempeño fue de 8,25,7,47 para la Tenkan Sen, Kinjun Sen, Adelantamiento y Senkou Span B
sucesivamente.
Estrategia 5. Apertura: Cruce sobre la nube entra la Tenkan Sen y Kinjun Sen. Cierre:
Con una eficiencia del 53,92% y un resultado de 5.091 pips, obtenido por el marco de tiempo de
60 minutos, y con unos parámetros de 8 para la Tenkan Sen, 25 Kinjun Sen, 9 Adelantamiento y
Estrategia 6. Apertura: Cruce sobre la nube entra la Tenkan Sen y Kinjun Sen. Cierre:
En el marco de tiempo de 240 minutos fue posible observar el mejor desempeño de esta
estrategia con una configuración de parámetros del indicador técnico Ichimoku Kinko Hyo de 9
para la Tenkan Sen, 27 para la Kinjun Sen, 4 de adelantamiento de la nube y 43 para Senkou
Span B, como consecuencia un resultado de 6.631 pips con una eficiencia del 54,83%.
76
Estrategia 7. Apertura: Cruce Tenkan Sen y Kinjun Sen en medio de la nube. Cierre:
minutos, se encontró el escenario óptimo para esta estrategia, con un configuración para la
Tenkan Sen de 8, Kinjun Sen 28, Senkou Span A 11 y Senkou Span B 52.
Estrategia 8. Apertura: Cruce Tenkan Sen y Kinjun Sen en medio de la nube. Cierre:
estrategia, el cual dejo como resultado 10.450 pips junto a una eficiencia de 50.27%, los
paramentos utilizados para esto fueron: 9, 28, 10, 48 para la Tenkan Sen, Kinjun Sen, Senkou
Estrategia 9. Apertura: Cruce Tenkan Sen y Kinjun Sen en medio de la nube. Cierre:
La configuración de parámetros para la Tenkan Sen de 8, Kinjun Sen de 28, Senkou Span A de
11 y Senkou Span B 51, se presentó el mejor escenario para esta estrategia, dejando como
Estrategia 10. Apertura: Cruce Tenkan Sen y Kinjun Sen en medio de la nube. Cierre:
El resultado para esta estrategia en el escenario óptimo fue de 11.282 pips junto a una eficiencia
de 54.4%, en el marco de tiempo de 60 minutos, las configuraciones para cada parámetro del
indicador técnico fueron: Tenkan Sen 8, Kinjun Sen 28, Adelantamiento 11, Senkou Span B 50.
Estrategia 11. Apertura: Cruce Tenkan Sen y Kinjun Sen en medio de la nube. Cierre:
Con una configuración para la Tenkan Sen 8, Kinjun Sen 28, Senkou Span A 10 y Senkou Span
B 52, con un marco de tiempo de 60 minutos, se evidencio un entorno óptimo para esta estrategia
Estrategia 12. Apertura: Cruce Tenkan Sen y Kinjun Sen en medio de la nube. Cierre:
Con un resultado de 11.070 pips junto a una eficiencia de 49,30% , en el marco de tiempo de 60
minutos, y con una configuración de parámetros para los componentes del indicador técnico
Ichimoku Kinko Hyo de 9,28,10,52 para la Tenkan Sen, Kinjun Sen, Senkou Span A y Senkou
Span B respectivamente.
78
Estrategia 13. Apertura: Cruce Tenkan Sen y Kinjun Sen debajo de la nube.
Cierre: Cruce entra la Tenkan Sen y Kinjun Sen en cualquier lugar.
La configuración optima de las parámetros Tenkan Sen, Kinjun Sen, Senkou Span A y Senkou
Span B, y con el marco de tiempo de 240 minutos, fue el escenario óptimo para esta estrategia de
inversión cuyo resultado obtenido fue de 5.400 pips con una eficiencia de 42,02%.
Estrategia 14. Apertura: Cruce Tenkan Sen y Kinjun Sen debajo de la nube.
Cierre: Ingreso a la nube de la Kinjun Sen y precio (Close).
La eficiencia óptima para esta estrategia de inversión fue de 50.86 %, con un resultado de 5.890
Estrategia 15. Apertura: Cruce Tenkan Sen y Kinjun Sen debajo de la nube. Cierre:
La configuración bajo la cual se dio el mejor desempeño de esta estrategia de inversión fue,
Tenkan Sen 8, Kinjun Sen 30, Senkou Span A 5 y Senkou Span B 50, para obtener de esta
Estrategia 16. Apertura: Cruce Tenkan Sen y Kinjun Sen debajo de la nube. Cierre:
inversión con un resultado de 5.568 pips frente a la eficiencia de 51.37%, con las siguiente
configuración: Tenkan Sen 8, Kinjun Sen 30, Adelantamiento de la nube 8 y Senkou Span B 45.
Estrategia 17. Apertura: Cruce Tenkan Sen y Kinjun Sen debajo de la nube. Cierre:
El resultado que dejo el escenario con el mejor desempeño de esta estrategia es 6.191 pips con
Tenkan Sen, Kinjun Sen, Senkou Span A, Senkou Span B de 8,29,7,52 respectivamente.
Estrategia 18. Apertura: Cruce Tenkan Sen y Kinjun Sen debajo de la nube. Cierre:
El mejor desempeño de esta estrategia es bajo el marco de tiempo de 240 minutos, con una
configuración de Tenkan Sen 8, Kinjun Sen 26, Adelantamiento 8 y Senkou Span B 44, dejando
Estrategia 19. Apertura: Cruce Tenkan Sen y Kinjun Sen y el precio (open) mayor a 50
pips con respecto a la nube. Cierre: Cruce entra la Tenkan Sen y Kinjun Sen en cualquier lugar.
En el marco de tiempo de 240 minutos y con una configuración de 8, 26, 8,44 para la Tenkan
Sen, Kinjun Sen, Senkou Span A y Senkou Span B sucesivamente, se observó el mejor
desempeño de esta estrategia, obtenido como resultado 1.617 pips con una eficiencia del 77.77%.
Estrategia 20. Apertura: Cruce Tenkan Sen y Kinjun Sen y el precio (open) mayor a 50
pips con respecto a la nube. Cierre: Ingreso a la nube de la Kinjun Sen y precio (Close).
el marco de tiempo 60 minutos, con el parámetro para la Tenkan Sen de 8, Kinjun Sen 26,
Estrategia 21. Apertura: Cruce Tenkan Sen y Kinjun Sen y el precio (open) mayor a 50
pips con respecto a la nube. Cierre: Precio (Close) debajo de la nube y Kinjun Sen en medio de
la nube.
81
desempeño de esta estrategia, pues se obtuvo un resultado de 1.410 pips con una eficiencia del
70%, tras una configuración de parámetros del indicador de 9 Tenkan Sen, 23 Kinjun Sen, 10
Estrategia 22. Apertura: Cruce Tenkan Sen y Kinjun Sen y el precio (open) mayor a 50
pips con respecto a la nube. Cierre: Kinjun Sen encima de la nube y el precio (Close) debajo de
la nube.
Con una eficiencia del 82.35% y con un resultado de 2.907 pips en el marco de tiempo de 240
minutos fue registrado el mejor desempeño de esta estrategia, con la siguiente configuración:
Estrategia 23. Apertura: Cruce Tenkan Sen y Kinjun Sen y el precio (open) mayor a 50
pips con respecto a la nube. Cierre: Kinjun Sen debajo de la nube y el precio (Close) inferior a
Kinjun Sen.
La configuración de parámetros del indicador técnico Ichimoku Kinko Hyo con la cual fue
posible obtener el mejor desempeño de esta estrategia es, para la línea Tenkan Sen 9, Kinjun Sen
82
23, Senkou Span A 9 y Senkou Span B 50, tras un resultado de 2.870 pips con una eficiencia del
84%.
Estrategia 24. Apertura: Cruce Tenkan Sen y Kinjun Sen y el precio (open) mayor a 50
pips con respecto a la nube. Cierre: Kinjun Sen debajo de la nube y el precio (Close) en medio
de estas dos.
El mejor desempeño de esta estrategia fue evidenciado al obtener una eficiencia del 84.61%, y
un resultado de 3.664 pips, con un marco de tiempo de 240 minutos, tras una configuración del
indicador técnico Ichimoku Kinko Hyo de 9 para la Tenkan Sen, 23 Kinjun Sen, 10 Senkou Span
A y 47 Senkou Span B.
Estrategia 25. Apertura: Cruce Tenkan Sen y Kinjun Sen y el precio (open) menor a 50
pips con respecto a la nube. Cierre: Cruce entra la Tenkan Sen y Kinjun Sen en cualquier lugar.
Estrategia 26. Apertura: Cruce Tenkan Sen y Kinjun Sen y el precio (open) menor a 50
pips con respecto a la nube. Cierre: Ingreso a la nube de la Kinjun Sen y precio (Close).
83
El escenario optimo en esta estrategia fue encontrando con la siguiente configuración de los
parámetros del indicador técnico, 8,24,3,43 para la Tenkan Sen, Kinjun Sen, Senkou Span A y
Senkou Span B respectivamente, con un resultado de 5.626 pips y una eficiencia de 57.02%.
Estrategia 27. Apertura: Cruce Tenkan Sen y Kinjun Sen y el precio (open) menor a 50
pips con respecto a la nube. Cierre: Precio (Close) debajo de la nube y Kinjun Sen en medio de
la nube.
Con una eficiencia del 60.19% y con un resultado de 4.334 pips, en el marco de tiempo de 240
minutos y con la configuración de la Tenkan Sen de 8, Kinjun Sen 26, Senkou Span A 3 y
Estrategia 28. Apertura: Cruce Tenkan Sen y Kinjun Sen y el precio (open) menor a 50
pips con respecto a la nube. Cierre: Kinjun Sen encima de la nube y el precio (Close) debajo de
la nube.
El mejor escenario en el cual el desempeño de esta estrategia fue optimo, un marco de tiempo de
240 minutos, con un resultado de 6.645 pips y una eficiencia de 66.07%, con una configuración
Estrategia 29. Apertura: Cruce Tenkan Sen y Kinjun Sen y el precio (open) menor a 50
pips con respecto a la nube. Cierre: Kinjun Sen debajo de la nube y el precio (Close) inferior a
Kinjun Sen.
El resultado para esta estrategia en el escenario optimo fue de 4.652 pips con una eficiencia de
65.13%,en un marco de tiempo de 240 minutos, tras una configuración de la Tenkan Sen de 8, 29
Estrategia 30. Apertura: Cruce Tenkan Sen y Kinjun Sen y el precio (open) menor a 50
pips con respecto a la nube. Cierre: Kinjun Sen debajo de la nube y el precio (Close) en medio
de estas dos.
Tras una configuración de parámetros de 8, 23, 4, 45 para la Tenkan Sen, Kinjun Sen, Senkou
Span A y Senkou Span B respectivamente, se evidenció el mejor desempeño para esta estrategia
con un resultado de 7.000 pips y una eficiencia de 61%, en un marco de tiempo de 240 minutos.
Resultados finales.
De acuerdo al planteamiento de estrategias realizado en este trabajo, cuyo fin era descubrir
nuevas escenarios idóneos para invertir y luego de exponer los resultados, es importante destacar
que debido al modelo Backtesting creado en el lenguaje de programación Python, fue posible
85
Ichimoku Kinko Hyo que permitiría a la vez descubrir el mejor desempeño para cada momento
estudiado.
aumentando a medida que incrementa el marco de tiempo, es decir para este caso puntual, las
seguido de 60 minutos con el restante, para los rangos de datos previamente definidos.
Se pudo obtener eficiencias para todas las estrategias superiores al 40%, y la máxima
encontrada fue de 84.61% con la estrategia número 24 (Apertura: Cruce Tenkan Sen y Kinjun
Sen y el precio (Open) mayor a 50 pips con respecto a la nube. Cierre: Kinjun Sen debajo de la
nube y el precio (Close) en medio de estas dos.), cuya configuración óptima para el indicador
técnico era: Tenkan Sen 9, Kinjun Sen 23, Adelantamiento de la nube 10, Senkou Span B 47,
estas cifras reflejan que si bien algunas estrategias tuvieron un mejor desempeño frente a otras,
En cuanto a la rentabilidad, se obtuvo un punto máximo de 11.282 pips, con la estrategia número
10 (Apertura: Cruce Tenkan Sen y Kinjun Sen en medio de la nube. Cierre: Kinjun Sen encima
de la nube y el precio (Close) debajo de la nube.), cuya configuración óptima encontrada para
cada componente del indicador técnico Ichimoku Kinko Hyo fue: Tenkan Sen 8, Kinjun Sen 28,
Teniendo como filtro de apertura el estado de la nube respecto al cruce de la Kinjun Sen y
Tenkan Sen, y la distancia que hay entre la nube respecto al cruce es posible afirmar basado en
Si bien los resultados obtenidos fueron positivos, es necesario seguir con el proceso de
optimización, para poder definir un valor para los Stop Loss, Take Profit, Cantidad de inversión
(Lotes), este proceso es posible realizar de manera oportuna con la metodología ARISTOS.
87
Activo Funcional
En vista de los resultados positivos y los alcances que se han visto del nuevo modelo
histórico de precios de los activos deseados por el usuario y su posterior análisis por el modelo
archivo “.csv” otorgadas por el usuario, para luego continuar con el procedimiento acostumbrado
que da como resultado el cálculo del indicador técnico Ichimoku Kinko Hyo.
El objetivo principal de cada una de estas nuevas propuestas será analizar los resultados
suministrados, para cada uno el algoritmo elaborará un documento con formato “.csv” en el que
se encontraran almacenados los resultados obtenidos (resultado total, numero de trades positivos
y negativos para posiciones cortas y largas, total trades, eficiencia, máximo y mínimo, promedio
concluirá arrojando el activo más eficiente dentro de los indicados por el usuario junto a su
configuración, y generar un nuevo archivo “.csv” con los cálculos del indicador técnico
La información será descargada automáticamente por el algoritmo del portal web Google
Finance, y debido a los alcances de esta página en cuanto a precios históricos solo podrán ser
descargadas acciones.
El usuario debe indicar al programa los activos a analizar, para esto se ha creado una lista,
en la cual se debe escribir el nemotécnico utilizado en las bolsas y con el cual se encuentra en
páginas web que brindan información fundamental y técnica de cada uno de estos, por ejemplo:
GOOGLE FINANCE.
Esta lista encabeza el método principal y debe contar como mínimo con el nombre de un
activo que se desea analizar, cada nemotécnico de ir en medio de comillas (“ ”) y separado uno
del otro por comas (,) a continuación un ejemplo de cómo registrar los valores en este medio de
almacenamiento.
ACCI =["GOOG","AAPL","MSFT"]
89
En la sentencia anterior se quiso dar a entender cómo se debía rellenar la lista en caso de
que los activos a analizar fueran estas tres acciones, empezando por GOOGLE, seguido de
definirse la fecha desde la cual se debe descargar la información, el formato de esta variable es:
año, mes, día; para los meses y días que solo tengan un digito, no se debe anteponer el número
cero, pues esto podría generar un error dentro del código; es decir, si se desea descargar
variable “fin”, creada para definir el límite del descargue de la información, por defecto hasta el
activo exigido por el usuario, y generar con esta información un nuevo archivo “.csv” en donde
El código para realizar esta función fue tomado de portal web (David, 2017) , si bien el
video es explícito en que el medio por el cual se realiza la descarga de información es Yahoo
90
Finance, no es posible realizarlo por este método como consecuencia a que la URL a la cual se
direccionan los paquetes que por defecto trae instalado Python, se encuentra fuera de servicio.
Como consecuencia, se decide cambiar la librería para poder hacer efectivo el proceso, en
decir el cambio que se debe hacer es cambiar “yahoo” por “google” (The PyData Development
Team, 2015).
El usuario debe tener en cuenta antes de ejecutar el programa, definir los parámetros de
cada uno de los componentes del indicador técnico Ichimoku Kinko Hyo, a partir de este
anteriores.
En esta nueva propuesta, el usuario debe suministrar al programa el nombre de los archivos en
los cuales se encuentra la información que se desee procesar, para esto se ha creado una lista
llamada “ACTIVO”, allí solo debe estar el nombre del archivo(s), sin extensión alguna, es decir
sin “.csv”, cada uno en medio de comillas (“ ”) y separado por comas (,), como por ejemplo:
91
ACTIVO =["EURUSD15","EURUSD60","EURUSD240"]
expresado en secciones anterior, no cumplir con este orden puede causar que depure el programa.
De igual manera el usuario debe asignar el rango de datos para cada componente del indicador
técnico Ichimoku Kinko Hyo, para así cumplir a cabalidad con los requisitos del programa.
la misma, es decir la conclusión del activo que mejor se adecuo a la estrategia programada, en
términos de eficiencia, para este se generará un archivo “.csv” con la información acerca del
cálculo del indicador técnico bajo los parámetros óptimos. Adicionalmente, por cada activo
El uso oportuno de estos programas puede aportar sin duda, rapidez en los tiempos de
análisis y estudio de una estrategia de inversión, pues es una herramienta que proporciona
CAPITULO 3.
Interconexión plataforma de negociación Trader Workstation y lenguaje de programación
Python.
Trader Workstation, para obtener información histórica, tiempo real y realizar envió de órdenes
de mercado; las razones por las cuales se propone este tipo de conexión es principalmente,
mitigar el riesgo operativo proveniente de los operadores del mercado, asociados a la posición
que se pueda tomar (corta o larga), la cantidad (Lotes) del activo de inversión, el establecimiento
de niveles de cierres para las operaciones abierta, entre otros, que sin duda pueden desencadenar
en pérdidas económicas; adicionalmente poder combatir la ejecución lenta del calce y envió de
Métodos de conexión.
Para poder establecer la conexión, fue necesario remitirse al libro “Succesfull Algorithmic
Trading” (Halls Moore, 2015), el cual aportó de manera específica los conceptos claves para
poder entender la metodología del enlace entre la plataforma de negociación Trader Workstation
ejecutar el código que este propone, los resultados no fueron satisfactorios, se desconoce el
Se encuentra entonces un sitio web cuya propuesta es un código de conexión para envió
de ordenes desde Python al API de Interactive Brokers (QuantStart, s.f), el cual al ejecutarlo fue
El código comienza con la definición de dos funciones, cuyo objetivo es comunicar los
errores que se presenten al intentar enviar cualquier solicitud al servidor “error_handler” y la otra
permite recibir la respuesta por parte de este “reply_handler”, esta última retorna un mensaje
activo en el cual se desea invertir, la clasificación que tiene este dentro del mercado (divisas,
acciones, bonos, commodities, etc.), el enrutador por el cual va ir dirigida la orden, esto cambia
dependiendo el tipo de activo en el que se desea invertir, y finalmente la moneda con la que se
realizará la operación.
orden si es a mercado entonces “MKT”, al límite de mercado “LMT”, stop limit “STP LMT”,
94
trading stop “TRAIL” entre otras, estas opciones fueron encontradas en la guía que proporciona
Interactive Brokers (Interactive Brokers, s.f), también se define dentro de esta función la
cantidad que se desea adquirir y se aclara además si es la posición de compra “BUY” o de venta
“SELL”.
la ejecución adecuada.
El método principal inicia con la sentencia que permite crear la conexión directa con el
entorno de negociación, esto se hace invocando una librería que trae Python, además se debe
diligenciar el portal al cual está conectado la plataforma y el clienteId ambos suministrados por
la API, además para poder ejecutar el código satisfactoriamente es necesario activar algunas
funciones dentro de los ajustes de la configuración global de la plataforma, la ruta que debe
Figura 24. Configuración API. Se puede observar las configuraciones previas necesarias para
Lo encerrado en la gráfica anterior de color amarillo son las funciones que se deben
activar para el funcionamiento adecuado del código, lo color amarillo es el puerto al cual está
conectada la plataforma y que será necesario suministrar al código para hacer efectiva la
conexión, por último lo enmarcado de color verde es el número que debe asignar el usuario para
llama a las funciones creadas para la comunicación de errores y respuestas con el servidor,
adicionalmente aparece una variable “order_id”, esta debe aumentar en una unidad cada vez que
se ejecute una operación, seguirá entonces la sentencia en la cual se debe especificar los
requisitos de la función “create_contract”, para luego indicar el tipo de orden, cantidad y moneda
en la que se desea realizar la operación, finalmente se envía la orden por medio de la función
“placeOrder” que trae por defecto la librera en Python y luego se procede a desconectarse.
(Anexo M).
Es importante mencionar que la versión Python que se debe usar para la ejecución
satisfactoria de este código es la 2.7, puesto que las librerías utilizadas vienen en esa versión, no
ejecutarla en esta desencadenaría en la depuración del código, la razón es que las versiones más
recientes de este lenguaje unieron paquetes y los nombraron de manera distinta, y en la versión
Trader WorkStation debe estar abierta y con conexión al momento de ejecutar el código.
97
Se pretende a continuación mostrar la salida que deja el programa luego de ejecutarse el código
Divisas.
Figura 25. Ejecución compra paridad GBP/USD. Se evidencia que tras ejecutar el código, la
confirmación de orden llega instantáneamente asegurando que se ha abierto una nueva posición.
Acciones.
Se propone abrir una posición de venta de 100 unidades de la acción APPLE, con la moneda
dólar. En la parte inferior derecha de la siguiente imagen se muestra una ventana emergente que
Figura 26. Confirmación posición acciones AAPL. Se observa la confirmación del envió de la
orden desde el lenguaje de programación al API de Interactive Brokers. Fuente: Spyder (2017).
99
Commodities.
este caso el oro (XAUUSD) una posición de compra de 100 unidades. La confirmación de la
Figura 27. Confirmación orden XAUUSD. Se puede apreciar la interfaz del lenguaje de
Bonos.
100
Se presenta enseguida un ejemplo de envió de orden para United Stated Treasury, y cuyo
Figura 28. Confirmación orden de bonos. Se puede apreciar la manera en la cual se hace la
Luego del envió de cada una de estas órdenes, si se desea se puede reafirmar la apertura
izquierda.
101
Figura 29. Verificación en la plataforma de las órdenes abiertas. Nótese la parte inferior
derecha de la imagen se encuentra cada una de las operaciones realizadas desde el lenguaje de
programación Python.
Información Histórica.
Para poder obtener la información histórica, fue necesario tener como plantilla un código
postulado en un foro virtual de programadores (Fundamental Data Using IbPy, 2017) y se ajustó
con lo explicado en la guía práctica suministrada por Interactive Brokers (Interactive Brokers,
s.f).
102
suministrando los mismo datos que en la sección anterior, posterior a esto hace el llamada de la
función que imprime los errores o procedimientos que están siendo ejecutados con el servidor, la
es fecha, open, high, low, close, volumen, y a la vez llamando al método de librería “message”
que hace posible poder obtener esta información, para luego realizar la conexión.
El paso siguiente será especificar el activo , su clasificación y enrutador, con base a los
ejemplo dados en la sección anterior, del cual se desea obtener dicha información, para luego
poder invocar la función “reqHistoricalData”, en la cual se especiará cuando tiempo atrás desea
la información en segundos (“S”),días (“D”), semanas (“W”), meses (“M”) o años (“Y”), el
marco de tiempo o tamaño de la vela que puede ser por segundos ( “1 secs”, “5 secs”, “10 secs”,
“15 secs”, “30 secs”), minutos (“1 min”, “2 mins”, “3 min”, “5 mins”, “10 mins”, “15 mins”, “20
mins”, “30 mins”), horas (“1 hour”, “2 hours” , “3 hours”, “4 hours” , “8 hours”), días (“1 day”) ,
semanas (“1 week”) y meses (“1 month”), y finalmente el tipo de información histórica ya se
“TRADES”, “MIDPOINT”, “BID”, “ASK” entre otros, finalmente de desconecta del servidor.
(Anexo N). Es necesario que el usuario se remita a la guía pues allí encontrará información más
detallada que no es pertinente aclarar en este documento, pues no es pertinente con el centro de
Figura 30. Ejecución información histórica. Se puede evidenciar la salida señalada por el
cuadro rojo, luego de la ejecución del código simbolizado por el cuadro azul. Fuente: Spyder
(2017).
solicitaba la información histórica de una semana atrás con un marco de tiempo de cuatro horas
para la paridad EUR/USD, la salida de este código se ve reflejado en la parte inferior derecha de
la imagen, es evidente como el primer valor que muestras es la fechas, seguido de la hora, open,
Con el fin de obtener la información en tiempo real del activo deseado, fue nuevamente
necesario acoger la propuesta realizada en el foro virtual como malla (Fundamental Data Using
IbPy, 2017), y a partir de esta empezar a estructurarlo. Fue necesario principalmente la guía
virtual de código para Trader Workstation (Interactive Brokers, s.f), la cual referenció la librería
que se debía usar y las condiciones que esta llevaría; dentro de la búsqueda de información que
permitiera obtener los precios en tiempo real, fue oportuno encontrar otra propuesta de código,
que ayudo a encontrar la metodología para la impresión de los precios negociados en tiempo real
Dentro del método principal de este código, se encuentra la primer sentencia que hace
alusión a la conexión con la plataforma, al igual que se hizo en secciones anteriores, es necesario
asignado, en segundo lugar se invocó la función “error_handler” cuyo objetivo es retornar los
errores o el estado de solicitudes al servidor, de igual manera en la siguiente sentencia del código
pero poder ejecutar esta función es necesario el uso de otra librería y dos funciones en
con el API.
105
Para poder obtener los datos de tiempo real es necesario especificar el activo del cual se
requiere esta información, para esto se ha definido las siguientes cinco líneas. Luego de esto se
invoca la función que permite solicitar a la plataforma de negociación los precios de mercado
deseada por el usuario van dentro de un paréntesis; el primer espacio para rellenar hace
almacenada la información del activo del cual se desea saber, en el tercer espacio se especifica
que puntualmente el dato que se desea saber, para el ejemplo que se dará en seguida se escogió
(“221”) pues este hace referencia a los precios de mercado, para ver más opciones acerca de esta
función consultar la guía ( Guía TWS- reqMktData). Finalmente se procede a desconectarse del
API.
106
Figura 31. Recepción datos tiempo real. Se observa en la parte inferior derecha en el recuadro
En el gráfico anterior se puede evidencia la salida que tuvo la ejecución el código, donde se
De esta manera se logra una conexión verídica entre el lenguaje de programación Python
y la plataforma de negociación Trader Workstation, que permite hacer frente a las problemáticas
inicialmente enunciadas.
107
Conclusiones.
validar los resultados obtenidos en la investigación principal de referencia y actualizar las bases
de datos, con el fin de poder analizar los nuevos resultados arrojados, donde se pudo evidenciar
que de acuerdo a la dinámica del mercado las estrategias de inversión pueden ajustarse o no a
La ejecución del modelo Backtesting permite tener resultados en un menor tiempo, con
apertura de procesos simultáneos, y un rango amplio de configuración para cada componente del
indicador técnico Ichimoku Kinko Hyo, lo que se transforma en nuevas herramientas para el
escenarios diferentes cuyo filtro de apertura era el estado del cruce de la Tenkan Sen y Kinjun
Sen respecto a la Kumo, en donde se pudo evidenciar que a medida que aumenta el marco de
Para todos los casos evaluados los resultados fueron positivos y se evidenció una
eficiencia máxima de 84.51%, lo que permite concluir que el desempeño aumentó como
consecuencia al estado de la Kumo como filtro de apertura, y de acuerdo a los cierres propuestos.
Por otro lado, los lenguajes de programación son nuevos escenarios que deben ser
abordados desde el ámbito académico y personal, pues pueden convertirse en un aliado eficaz
para cualquier inversionista o persona; al ajustar Python como la fuente de desarrollo de esta
investigación, deja abierta una puerta llena de oportunidades donde los ingenieros financieros,
cada proceso; esto fue evidenciado con la interconexión entre la plataforma de negociación
Anexos.
def tenkan(lista_precios,par_tenkan):
return lista_kinjun,par_kinjun
112
def spana(lista_tenkan,lista_kinjun,par_kinjun,par_ade):
lista_spana[i+par_kinjun+par_ade-1]=Decimal(total_spana) # se
agregan los valores de la kinjun a una lista
i=i+1 # contador
def spanb(par_ade,total_high,total_low,par_spanb):
for a, b in zip(total_high,total_low) :
spanb= Decimal(max(high))+Decimal(min(low))
total_spanb= Decimal(spanb/2)
lista_spanb[i+par_spanb+par_ade-1]=Decimal(total_spanb) # se
agregan los valores de la kinjun a una lista
i=i+1#contador
total_close=[] ### se crea una lista con donde seran guardados los
valores high
chikou=[]
for posicion in lista_precios: ## mediante un ciclo se recorre la lista
chikou.append(total_close[par_ade:])
115
def posicion_lc(lista_precios,lista_kinjun,lista_spana,lista_spanb):
total_fecha=[] ### se crea una lista con donde seran guardados los
valores open
total_open=[] ### se crea una lista con donde seran guardados los valores
open
total_close=[] ### se crea una lista con donde seran guardados los
valores low
for f,o,c,k,a,b in
zip(total_fecha,total_open,total_close,lista_kinjun,lista_spana,lista_spanb):
# se crea un for por medio del cual se va a recorrer las listas de fecha,
open, kinjun … etc. para poder determinar la posicion que se debe tomar
(largo o corta), según corresponda.
if total_fecha [i] != " " and total_open [i]!= " " and lista_kinjun
[i] != "" and lista_spanb [i]!= " ": #condición inicial para seguir el ciclo
es que hayan valores la posicion de la fila
#si cumple la condición anterior entonces se abre un nuevo if
que es donde se determinara la posicion siempre y cuando se cumplan una serie
de condiciones, SI SE CUMPLE LAS CONDICIONES en esta primer parte entonces
tendremos que la posicion es LARGA
if ((Decimal(total_open [i]) > Decimal(lista_spana [i])) and
(Decimal(total_open [i]) > Decimal(lista_spanb [i])) and
(Decimal(lista_kinjun [i]) > Decimal(lista_spana [i])) and
(Decimal(lista_kinjun [i]) > Decimal(lista_spanb [i]))) or \
((str(posicion [i-1]) == "LARGO") and (Decimal(total_open
[i])< Decimal(lista_spana [i])) and (Decimal(total_open [i]) <
Decimal(lista_spanb [i])) and (Decimal(lista_kinjun[i]) > Decimal(lista_spana
[i])) and (Decimal(lista_kinjun [i]) > Decimal(lista_spanb[i]))) or \
((str(posicion [i-1]) == "LARGO") and (Decimal(total_open
[i])>= Decimal(lista_spana [i])) and (Decimal(total_open [i]) <=
Decimal(lista_spanb [i])) and (Decimal(lista_kinjun[i])> Decimal(lista_spana
[i])) and (Decimal(lista_kinjun [i]) > Decimal(lista_spanb[i]))) or \
((str(posicion [i-1]) == "LARGO") and (Decimal(total_open
[i])<= Decimal(lista_spana [i])) and (Decimal(total_open [i]) >=
Decimal(lista_spanb [i])) and (Decimal(lista_kinjun[i]) > Decimal(lista_spana
[i])) and (Decimal(lista_kinjun [i]) > Decimal(lista_spanb[i]))) or \
((str(posicion [i-1]) == "LARGO") and (Decimal(total_open
116
i=i+1#contador
if lista_kinjun [i] != " " and lista_spana [i] != " " and lista_spanb
[i] != " " : ## condición inicial que los valores de la lista en la posicion
i sean diferente a vacío
ciclo
elif ((str(posicion [i-1])=="LARGO") and (Decimal(total_open
[i]) >= Decimal(lista_spana [i])) and (Decimal (total_open [i])<=
Decimal(lista_spanb [i])) and (Decimal (lista_kinjun [i]) >=
Decimal(lista_spana [i])) and (Decimal (lista_kinjun [i]) <=
Decimal(lista_spanb [i]))) or \
((str(posicion [i-1])=="LARGO") and (Decimal(total_open
[i]) <= Decimal(lista_spana [i])) and (Decimal (total_open [i])>=
Decimal(lista_spanb [i])) and (Decimal (lista_kinjun [i]) <=
Decimal(lista_spana [i])) and (Decimal (lista_kinjun [i]) >=
Decimal(lista_spanb [i]))) or \
((str(posicion [i-1])=="LARGO") and (Decimal(total_open
[i]) < Decimal(lista_spana [i])) and (Decimal (total_open [i])<
Decimal(lista_spanb [i])) and (Decimal (lista_kinjun [i]) >=
Decimal(lista_spana [i])) and (Decimal (lista_kinjun [i]) <=
Decimal(lista_spanb [i]))) or \
((str(posicion [i-1])=="LARGO") and (Decimal(total_open
[i]) < Decimal(lista_spana [i])) and (Decimal (total_open [i])<
Decimal(lista_spanb [i])) and (Decimal (lista_kinjun [i]) <=
Decimal(lista_spana [i])) and (Decimal (lista_kinjun [i]) >=
Decimal(lista_spanb [i]))) or \
((str(posicion [i-1])=="LARGO") and (Decimal(total_open
[i]) >= Decimal(lista_spana [i])) and (Decimal (total_open [i])<=
Decimal(lista_spanb [i])) and (Decimal (lista_kinjun [i]) <
Decimal(lista_spana [i])) and (Decimal (lista_kinjun [i]) <
Decimal(lista_spanb [i]))) or \
((str(posicion [i-1])=="LARGO") and (Decimal(total_open
[i]) <= Decimal(lista_spana [i])) and (Decimal (total_open [i])>=
Decimal(lista_spanb [i])) and (Decimal (lista_kinjun [i]) <
Decimal(lista_spana [i])) and (Decimal (lista_kinjun [i]) <
Decimal(lista_spanb [i]))):
cierre.append("CIERRE LARGO")## si se cumple alguna de
las condiciones de esta parte del ciclo entonces será CIERRE LARGO y se
agregara a la lista cierre
## si no se cumple la primera y la segunda condición entonces
pasara aquí
elif ((str(posicion [i-1])=="LARGO") and (str(posicion
[i])=="CORTO")):
cierre.append("CIERRE LARGO") ##si se cumple la condición
de esta parte del ciclo , entonces será CIERRE LARGO
## si no se cumple la primer o la segunda o la tercera
entonces pasara aquí
elif ((str(posicion [i-1])=="CORTO") and (str(posicion
[i])=="LARGO")):
cierre.append("CIERRE CORTO")##si se cumple la condición
de esta parte del ciclo entonces será CIERRE CORTO
#si no se cumplió ninguna de las condiciones anteriores
entonces entra aquí
else:
cierre.append(" ") ## se agrega el resultado a la lista
else:
cierre.append(" ")
## si no se cumplió la condición inicial que permitía entrar a los
otros ciclo entonces pasara acá
else:
cierre.append(" ") # se agrega " " (vacío) a la lista cierre
119
i=i+1 # contador
return cierre
120
#condición inicial del ciclo que consiste en que los valores de las
listas en la posicion i sean diferentes a vacío
if lista_tenkan [i] != "" and lista_kinjun [i] != "" and lista_spana
[i] != "" and lista_spanb [i] != "" :
# si se cumple la condición inicial pasan aquí
if ((posicion[i-1]==" ") and ((posicion [i])=="LARGO")) or
(((posicion[i-1]=="CORTO")) and ((posicion [i])=="LARGO")):
apertura.append("APERTURA LARGO") # se agrega APERTURA LARGO
pues cumplió con las condiciones del ciclo
return apertura
121
def pips
(total_open,total_close,cierre,apertura,posicion,par_tenkan,par_kinjun,par_ad
e,par_spanb,k,eficiencia,mayor,par_optimo):
## CORTOOOO
###CREO LAS LISTAN ES LAS QUE se almacenara los open y close de las
posiciones cortas
oac =[] #OAC = OPEN-APERTURA-CORTO
ccc =[] #CCC = CLOSE-CIERRE-CORTO
## LARGOOO
oal =[] #OAC = OPEN-APERTURA-LARGO
ccl =[] #CCC = CLOSE-CIERRE-LARGO
APERTURA LARGO
i=i+1
print("TRADE POSITIVOS POSICIONES CORTAS :", tpc)
print("TRADE NEGATIVOS POSICIONES CORTAS :", tnc)
resumen.append(tpc)
resumen.append(tnc)
##### TRADE POSITIVOS-NEGATIVOS POSICION LARGA
tpl=0
tnl=0
i=0
for a in rentlong: ## creo un ciclo para recorrer las lista de
rentabilidad corto para sacar trades positivos y negativos de la posicion
123
largo
if rentlong [i] >= 0:
tpl=tpl+1
i=i+1
print("TRADE POSTIVOS POSICIONES LARGAS :", tpl)
print("TRADE NEGATIVOS POSICIONES LARGAS :", tnl)
resumen.append(tpl)
resumen.append(tnl)
###### TOTAL TRADE
promc= sum(rentshort)/len(rentshort)
proml= sum(rentlong)/len(rentlong)
prom= ((promc+proml)/2) ##promedio de todos los trade
print("PROMEDIO TRADE :", prom)
124
resumen.append(prom)
return eficiencia,par_optimo,mayor,resumen
125
i=0
w=0
## se crea el ciclo mediante el cual se recorre la lista para ser
agregadas al archivo principal.
for p,t,k,a,b,p,c,a in zip(lista_precios,lista_tenkan,lista_kinjun,
lista_spana,lista_spanb,posicion,cierre,apertura):
lista_precios[i].append(lista_tenkan[w])
lista_precios[i].append(lista_kinjun[w])
lista_precios[i].append(lista_spana[w])
lista_precios[i].append(lista_spanb[w])
lista_precios[i].append(posicion[w])
lista_precios[i].append(cierre[w])
lista_precios[i].append(apertura[w])
i=i+1 #contador
w=w+1 #contador
return lista_precios
def EscribirCSV(archivo_csv,lista_precios):
def get_data(symbol,start_date,end_date):
### INVOCO LA LIBRERIA, SIMBOLO, ESPECIFICO QUE ES DE YAHOO, FECHA EN QUE
INCIA Y TERMINA.
dat=data.DataReader(symbol, "google", start_date, end_date)
return dat
## SE CREA UN FOR QUE RECORRE LA LISTA DE ACCI Y GENERA UN ARCHIVO CSV CON EL
NOMBRE DE CADA ACCION
for ticker in ACCI:
DF=get_data(ticker,comienzo, fin)# INVOCO LA FUNCIÓN
## se crean estas listas para almacenar también la información y usarlas
para el procedimiento del resto del código
total_fecha=[]
total_fecha2=[]
total_open=[]
total_high=[]
total_low=[]
total_close=[]
def error_handler(msg):
# Función para capturar los errores
print ("Server Error: %s" % msg)
def reply_handler(msg):
# Función para recibir la respuesta por parte del servidor en relación a
los errores o a la ejecución de las ordenes.
print ("Server Response: %s, %s" % (msg.typeName, msg))
contract = Contract()
contract.m_symbol = symbol
contract.m_secType = sec_type
contract.m_exchange = exch
contract.m_primaryExch = prim_exch
contract.m_currency = curr
return contract
order = Order()
order.m_orderType = order_type
order.m_totalQuantity = quantity
order.m_action = action
return order
## Este es el método principal y por el medio del cual se llamara cada una de
las anteriores funciones.
if __name__ == "__main__":
## es aquí en esta sentencia donde se debe poner el puerto y el cliente
Id dado en los ajustes de la plataforma
tws_conn = Connection.create(port=7497, clientId=889)
## Se establece la conexión
tws_conn.connect()
## Se invoca la función para ver los errores o la información proveniente
del servidor
tws_conn.register(error_handler, 'Error')
tws_conn.registerAll(reply_handler)
## Se asigna uno a la order_id.
order_id =1
## se crea la variable “contract” con el fin de que almacene la
información de la función “créate_contract”, se observa como además se
establece que el activo a negociar será la divisa GBPUSD cuyo clasificación
128
def historicalData_handler(msg):
print ([msg.reqId, msg.date, msg.open, msg.high,msg.low, msg.close])
def error_handler(msg):
print(msg)
c = Contract()
c.m_symbol = 'EUR'
c.m_secType = 'CASH'
c.m_exchange = "IDEALPRO"
c.m_currency = "USD"
tws.disconnect()
130
def realData_handler(msg):
# Función que imprime los valores solicitados
inside_mkt_bid = ''
inside_mkt_ask = ''
## se pone como condicional el field. 1 significa el precio BID y 2 el
precio ASK
if msg.field == 1:
inside_mkt_bid = msg.price
## Para facilidad en el comprensión de la salida del código re
antepone la palabra "BID"
print 'bid', inside_mkt_bid
elif msg.field == 2:
inside_mkt_ask = msg.price
## Para facilidad en el comprensión de la salida del código re
antepone la palabra "ASK"
print 'ask', inside_mkt_ask
#print ([msg.tickerId,msg.price])
def error_handler(msg):
## Función que imprimir los errores o proceso de solicitud con la
plataforma
print(msg)
Bibliografía
Admiral Markets AS. (s.f). Obtenido de Opere en Forex con estrategias de Ichimoku:
old.admiralmarkets.es/downloads/es/Opere_en_Forex_con_Estrategias_de_Ichimoku.pdf
Almgren, R., & Lorenz, J. (2007). Adaptive Arrival Price. Algorithmic Trading III.
Balaguera Mesa, D. R. (2015). Estrategias de trading para la paridad EUR/USD a través de la optimización
del indicador Ichimoku Kinko Hyo e implementación de trading Algoritmico. Bogotá.
Balaguera Mesa, D. R. (2015). Estrategias de trading para la paridad EUR/USD a través de la optimización
del indicador Ichimoku Kinko Hyo e implementación del trading algoritmico.
British Broadcasting Corporation (BBC). (06 de Febrero de 2016). Obtenido de Algoritmos, las reglas
secretas de la vida moderna.:
www.bbc.com/mundo/noticias/2016/02/160202_algoritmos_dirigen_vidas_finde_dv
David. (06 de Abril de 2017). Download Price Data From Yahoo API with Python and Use in Build Alpha.
Obtenido de https://www.youtube.com/watch?v=oBRxaibNiaY
del Rio Miño, J. (Junio de 2015). Analisis y comparativa de sistemas automaticos de trading frente al
trading discrecional. Madrid, España.
Hendershott, T., Jones, C., & Menkveld, A. (2011). Does Algorithmic Trading Improve Liquidity?
Kirilenko, A., & Lo, A. (2013). Moore's law versus Murphy's Law: Algorithmic trading and its discontents.
The Journal of Economic Perspectives.
Loaiza Palacios, D. (2007). Sistemas de analisís técnico para activos de renta variable. Medellín,
Colombia.
Lorenz, J. (2008). Optimal Trading Algorithms: Portfolio Transactions, Multiperiod Portfolio Selection,
and Competitive Online Search.
Maureen , O., Lopéz de Prado, M., & Easley, D. (2013). High-Frequency trading-New Realities for Traders,
Markets and Regulators.
132
Patel, M. (2010). Wiley Trading: Trading with Ichimoku Clouds: The Essential Guide to Ichimoku Kinko
Hyo Technical Analysis. Hoboken, US:Wiley.
Python Software Foundation. (2017). CSV File Reading and Writing. Obtenido de
https://docs.python.org/3.5/library/csv.html
QuantStart. (s.f). Using Python, IBPy and the Interactive Brokers API to Automate Trades. Obtenido de
https://www.quantstart.com/articles/using-python-ibpy-and-the-interactive-brokers-api-to-
automate-trades
Sánchez Silva, M., & Díaz Mondragón, M. (06 de Julio de 2007). La innovación tecnológica y los mercados
bursatiles. Noticias Financieras.
Seo, J., & Chai, S. (2013). The role of tragorithmic trading systems on stock market efficiency.
Stackoverflow. (s,f). ibpy: extract API responses for multiple contracts. Obtenido de
https://stackoverflow.com/questions/30130319/ibpy-extract-api-responses-for-multiple-
contracts
The PyData Development Team. (2015). Remote Data Access. Obtenido de http://pandas-
datareader.readthedocs.io/en/latest/remote_data.html#remote-data-google