Archive of posts from June 2020
¿Qué es el quant trading?
Trading algorítmico, quant trading, bots, son conceptos que están cada día más de moda y aveces se usan de forma intercambiable, pero son considerablemente diferentes.
Si bien existen tantas definiciones de estos conceptos como autores, acá les presento una alternativa más, principalmente orientada a aquellas personas que vienen del trading y están comenzando a ver de que se trata.
Trading algorítmico
Veamos primero que significa algoritmo
para la Real Academia Española:
Conjunto ordenado y finito de operaciones que permite hallar la solución de un problema.
Una forma simple de ver a un algoritmo, es como una receta: si podemos enumerar ciertos pasos a realizar de forma no ambigua, cualquiera debería poder seguirlos y llegar siempre al mismo resultado.
Por ejemplo, esta es una receta de una estrategia de inversión de mentira:
- Todos los días cuando abre el mercado en Estados Unidos:
- Chequear la temperatura en Ciudad de Buenos Aires en el sitio web del Servicio Meteorológico Nacional.
- Si hacen 26 grados o más, ir long 100 acciones de Apple.
- Si hacen menos de 26 grados, ir short 100 acciones de Apple.
- 5 minutos antes de que cierre el mercado, cerramos la posición.
(Por las dudas, vale aclarar que esta estrategia es de mentira. No inviertan en esto).
Esa lista de pasos es nuestro algorimo. Se lo podemos dar a alguien que sepa cursar órdenes con un navegador o una terminal y (después de mirarnos muy raro y preguntarnos si estamos locos) va a poder ejecutarla.
Acabamos de hacer trading algorímico. Es manual, pero al ser un conjunto de pasos, no hay lugar para la ambiguedad o las decisiones sobre la marcha. Una de las grandes ventajas que tiene hacerlo de esta forma es que dejamos de lado las emociones y el criterio, y lo reemplazamos por un proceso determinístico.
Finalmente, a medida que vamos usando el algoritmo, lo vamos mejorando para remover la ambiguedad o adaptarlo a nuevas condiciones del mercado o a nuestro propio aprendizaje. Cada cambio genera una nueva receta (idealmente) mejor que la anterior.
Trading automático (bots)
Imaginemos ahora que, como esa estrategia, se nos ocurren varios algoritmos más que queremos operar en nuestro portafolio. Como seres humanos, tenemos una capacidad finita en cuanto a la cantidad de instrumentos que podemos seguir en una jornada de trading y la cantidad de órdenes que podemos ejecutar. Por otro lado, algún día podemos no estar en la computadora, no tener ganas, estar cansados o cualquier otro motivo. Ese día no hacemos trading, o lo hacemos sin toda la atención.
Automatizar la ejecución de dichas estrategias tiene varias ventajas:
- Una computadora puede analizar muchos más datos y seguir más instrumentos que un ser humano.
- Nosotros podríamos cometer muchos errores en la ejecución. La computadora hace lo que dice el algoritmo. Si hay un error en la implementación, se corrije y no vuelve a pasar.
- Se nos libera el tiempo para pensar en nuevas estrategias o hacer otra cosa.
Fuente: xkcd
No es necesario automatizar el 100% de una estrategia para obtener los beneficios. Algunas situaciones muy comunes son:
- La estrategia está automatizada, pero tenemos que acordarnos de ejecutar el programa cada día a un determinado horario y apagarlo después.
- Hay estrategias de mediano y largo plazo que se pueden implementar con un algoritmo automatizado que rebalancea cada semana o mes. El resultado del algoritmo es la composición ideal de un portafolio, pero somos nosotros los que ejecutamos manualmente las órdenes.
Finalmente, no importa el lenguaje de programación. De hecho, muchas estrategias pueden implementarse en Excel. También hay desarrolladores de software que se dedican exclusivamente a eso. Para alguien que está más orientado al mercado o al research, programar es muy conveniente, pero no es obligatorio.
Uno puede saber cambiar el “cuerito” de la canilla, pero para cambiar la cañería entera llama al plomero. Si tratamos el trading como un negocio, delegar la implementación puede ser muy beneficioso en términos de costos y de calidad.
Trading cuantitativo (quant)
Seguramente quien haya leido la estrategia que mencioné al principio debe pensar que estoy loco para operar eso, o que la estrategia no tiene fundamentos. Y tiene razón. Pero puse de ejemplo una estrategia obviamente ridícula para explicar un punto importante:
Se puede hacer trading algorítmico sin que la estrategia tenga fundamentos. Pero eso no significa que debamos hacerlo.
Y es en estos fundamentos donde entra el quant, que no se basa en los views o en la percepción, sino en los datos y en una metodología de investigación.
Para esto se comienza con una hipótesis, por ejemplo: Las monedas europeas tienen retornos positivos (en promedio) durante las horas de mercado de Estados Unidos y retornos negativos (en promedio) fuera de ese horario
. Luego se utilizan los datos para validarla o rechazarla.
Verificada la hipótesis, lo siguiente es confirmar si se puede tradear. Existen varios motivos por los cuales esto puede no ser posible: cuestiones técnicas, costos de transacción que eliminan el exceso de retorno, spreads que eliminan el exceso de retorno, falta de acceso a los instrumentos porque están en otro mercado, falta de liquidez de dichos instrumentos, …
Por más que los datos digan que una hipótesis se cumple, no significa que la podemos tradear.
A diferencia de otros métodos científicos, el trading cuantitativo no es exacto. Las series financieras de precios tienen más ruido que señal y las respuestas nunca son obvias. Así y todo, las decisiones que tomamos como quants están apoyadas en los datos y no son 100% discrecionales.
La metodología es lo que hace al quant. El objetivo es tener retornos positivos (en promedio) incluso cuando nuestras views están equivocadas.
Conclusiones
Si bien los términos suelen usarse en forma intercambiable, existen diferencias no menores que debemos considerar cuando hablamos de trading algorítmico, automático o cuantitativo.
Finalmente, si podemos obtener evidencia de que una estrategia de trading es (en promedio) ganadora y podemos estructurar la toma de decisiones, eliminamos la discreción para ejecutar trades y tenemos retornos positivos incluso cuando nuestros views están equivocados. Si logramos automatizar su ejecución, se nos libera más tiempo para obtener evidencia en nuevas estrategias.
Una vez que entramos en ese círculo, podemos diversificar nuestro portafolio de formas que serían imposibles utilizando solo trading manual.
Trading algorítmico en MATba-ROFEX con .Net - Parte 2
- Parte 1: Introducción, instrumentos negociados y datos históricos.
- Parte 2: Ordenes.
- Parte 3: Eventos y datos en tiempo real.
- Parte 4: Ejemplo de una estrategia de trading.
En la primera parte de esta serie presentamos Primary.Net y como acceder a la lista de instrumentos operados y sus datos históricos. En esta segunda parte, vamos a ver como operar con órdenes.
Identificando una orden
Las órdenes en Primary.Net están representadas por una jerarquía de tres clases:
OrderId
: Identifica a una orden.Order
: Contiene la información necesaria para ingresar una orden al mercado.OrderStatus
: Contiene el estado de una orden enviada al mercado.
Enviando una orden
Una orden en Primary.Net está representada por la clase Order
. Las propiedades básicas que tenemos que tener en cuenta son:
Instrument
: Sobre que instrumento queremos operar.Type
: Si es una orden al precio de mercado y a un precio específico.Side
: Orden de compra o de venta.Expiration
: El tiempo de vida de la orden.Quantity
: La cantidad de instrumentos a operar.
Una vez creada la orden, se envia con el método SubmitOrder
.
Por ejemplo, así se enviaría una orden de compra por 100 contratos del futuro de dolar con vencimiento en julio 2020 al precio de mercado:
var api = new Api(Api.DemoEndpoint);
await api.Login(Api.DemoUsername, Api.DemoPassword);
var order = new Order
{
Instrument = new Instrument { Market = "ROFX", Symbol = "DOJul20" },
Expiration = OrderExpiration.Day,
Quantity = 100,
Type = OrderType.Market
};
var orderId = await api.SubmitOrder(Api.DemoAccount, order);
Console.WriteLine($"{orderId.ClientId} / {orderId.Proprietary}");
La salida va mostrar el identificador de la orden, por ejemplo:
327697141000025 / PBCP
Si quisíeramos cursar una orden con un precio límite, simplemente hay que cambiar el tipo y poner el precio:
var order = new Order
{
Instrument = new Instrument { Market = "ROFX", Symbol = "DOJul20" },
Expiration = OrderExpiration.Day,
Quantity = 100,
Type = OrderType.Limit,
Price = 77.99m
};
Consultando el estado de una orden
Una vez enviada una orden, podemos consultar su estado utilizando el método GetOrderStatus
.
var orderStatus = await _api.GetOrderStatus(orderId);
Console.WriteLine($"{orderStatus.Status} / {orderStatus.StatusText}");
Si la orden fue correctamente cursada, se mostrará:
New / Aceptada
Si la orden fue rechazada, la propiedad StatusText
mostrará más información del motivo del rechazo, por ejemplo:
Rejected / Saldo insuficiente
Los estados posibles de la orden se encuentran en la enumeración Status
dentro del namespace Primary.Data.Orders
.
Ordenes iceberg
Para enviar una orden iceberg, hay tres propiedades que hay que tener en cuenta:
Iceberg
: Debe sertrue
para identificar esta orden como una orden iceberg.Quantity
: La cantidad real que queremos operar.DisplayQuantity
: La cantidad que queremos mostrar públicamente.
Una vez cursada la orden, podemos ver como se desarrolla la operación obteniendo la información de la orden con GetOrderStatus
y examinando las siguientes propiedades:
LastQuantity
: La última cantidad operada.CumulativeQuantity
: La cantidad operada desde que fue enviada la orden.LeavesQuantity
: La cantidad que queda por operar.
Conclusiones
Pudiendo cursar órdenes al mercado, ya tenemos lo básico para implementar una estrategia de trading. En la próxima parte de esta serie, vamos a ver como responder a eventos y datos en tiempo real.
Para conocer más acerca de la biblioteca, se puede acceder al repositorio de GitHub y a la documentación.
Programando Finanzas - Una guía de estudio
Aprendé programación orientada a finanzas, a tu ritmo y usando contenido online curado y organizado.
Te dedicás a finanzas y hace rato que venís mirando de costado el tema de programación, ya sea porque querés hacer tus propios bots de trading o porque querés procesar datos financieros y te está quedando chico el Excel.
¿No te gustaría que hubiera una carrera universitaria orientada a eso específicamente?
Acá no vas a recibir un título, pero sí vas a tener el material necesario para aprender Programación Orientada a Finanzas por tu cuenta y gratis.
El objetivo es usar solo recursos online y (en lo posible) gratis, cosa de no tener excusas.
Preguntas frecuentes
Antes de empezar, seteamos algunas expectativas.
¿Por qué se ve Python y no R o Julia?
Porque había que elegir uno y es con el que mejor me llevo. Sin embargo, estos tres lenguajes (y mucho más) son idóneos para la tarea. El lenguaje de programación es una herramienta. El objetivo no tiene que ser solo aprender Python, o R, o Julia, sino poder aprender los fundamentos utilizando cualquier lenguaje.
¿Por qué cursos online?
Los cursos online ofrecen muy buenas ventajas:
- Son desarrollados y dictados por docentes que se dedican al tema.
- La mayoría tiene una institución atrás que los avala y, si querés, podés pedir certificado.
- Hay miles de alumnos cursándolos a la vez, así que nunca falta gente a quien preguntarle o que se encontró con los mismos problemas que uno.
- Se actualizan y se corrigen constantemente.
Mi objetivo es ir eligiendo y organizando aquellos que ofrecen lo necesario para cada etapa de la carrera.
Hay material para meses de estudio. ¿Hay que hacer todos los cursos?
Para nada. Acá nadie vigila, ni corrige. Podés saltear y hacer los cursos como quieras. Es por eso que a cada uno intento ponerle una pequeña descripción que indique el nivel de conocimiento necesario y los objetivos principales.
Sin embargo, para hacer una comparación: ¿cuántos conocimientos de ingeniería se necesitan para…
- … construir un puente?
- … construir un edificio?
- … construir una casa?
- … cambiar una ventana?
- … aceitar la puerta que hace ruido?
El desarrollo de software es una disciplina que evoluciona constantemente y nunca se aprende completa. La profundidad va a depender de lo que cada persona quiera hacer.
Ahora sí. A aprender!
Contenido
Antes de empezar, ¿no sabés si la programación es para vos? Mirate este hilo de @JohnGalt_is_www.
Fundamentos de programación
-
Computational Thinking for Problem Solving: Todos dicen que hay que aprender Python, pero los lenguajes de programación son simplemente una herramienta. En este curso vas a aprender como encarar problemas para resolverlos utilizando programación. Y también vas a aprender Python.
-
Python Data Structures: Ya conocés las estructuras de control. Acá vas a empezar a trabajar con texto, listas, diccionarios y otras estructuras de datos.
-
(Opcional) Ejercicios de práctica: Si querés practicar más Python y no se te ocurren ejercicios, acá hay unos cuantos.
-
Getting Started with Github: Ya empezaste a programar tus proyectos y cada vez que querés hacer una copia de seguridad o compartirlo, creás un ZIP o subís el código a Dropbox. En este curso, vas a aprender lo básico de como los desarrolladores versionan y comparten código.
-
Python and Statistics for Financial Analysis: Ya sabés algo de programación y querés aprender un poco más, pero esta vez resolviendo problemas de finanzas.
-
(Optativa) Learning How to - Learn: Powerful mental tools to help you master tough subjects: No siempre tenemos el tiempo que nos gustaría para dedicarle a aprender programación (o cualquier otra cosa). En este curso vas a aprender recursos para optimizar tu estudio y aprendizaje de cualquier disciplina.
Visualización y análisis de datos
-
Introduction to Data Science in Python: Las finanzas cuantitativas son una aplicación de la ciencia de datos. En este curso vas a empezar a usar Pandas para operar con datos. Si sos fanático del Excel, vas a amar Pandas. Sino, también.
-
101 Pandas puzzles: Muchos ejercicios prácticos para aprender más Pandas. (Acá están las soluciones).
-
Applied Plotting, Charting & Data Representation in Python: En este curso vas a aprender a hacer todo tipo de gráficos: barras, series de tiempo, histogramas y más.
-
(Optativa) Using Python to Access Web Data: Si querés trabajar con datos que están en páginas o servicios web.
-
(Optativa) Using Databases with Python: Si querés trabajar con datos que están en una base de datos.
Matemática
- Python and Statistics for Financial Analysis: Estadística y Python aplicados a datos financieros. Este curso enseña como bajar a tierra conceptos como variables aleatorias, distribuciones, regresiones e incluso indicadores financieros.
¿Qué sigue?
Hasta este punto hay material para entretenerse varios meses. Igual voy a estar agregando más contenido y actualizando la guía, así que no dudes en suscribirte en RSS o Twitter para estar al tanto de las actualizaciones.
No duden en enviar sugerencias!
Actualizaciones
- 2020-03-23: Agregadas las preguntas frecuentes.
- 2020-09-20: Agregada la sección de matemática y “Python and Statistics for Financial Analysis”.
Trading algorítmico en MATba-ROFEX con .Net - Parte 1
- Parte 1: Introducción, instrumentos negociados y datos históricos.
- Parte 2: Ordenes.
- Parte 3: Eventos y datos en tiempo real.
- Parte 4: Ejemplo de una estrategia de trading.
Introducción
El mercado algorítmico argentino y ROFEX
En mercados altamente desarrollados, como el de Estados Unidos, el trading algorítmico viene creciendo exponencialmente en los últimos años. Su desarrollo ha sido notorio, desde 1995, cuando el trading fue oficialmente automatizado en el New York Stock Exchange, al 2017 cuando, según JP Morgan, el trading manual era solo del 10% en términos de volumen (Fuente: CNBC).
Hoy en día países menos desarrollados como Brasil o India, ya cuentan con mercados automáticos, pero en Argentina todavía hay varios desafíos por delante, entre ellos: la liquidez, la tecnología, la estructura de mercado, la legislación y el atractivo para inversores extranjeros están todavía lejos de sus pares. Algunos ejemplos incluyen: el impuesto a la renta financiera, la falta de instrumentos y de liquidez para shortear posiciones, como así también la falta de interfaces de programación para comunicarse con los brokers. Estos dos últimos hacen que el único mercado propicio para este tipo de implementaciones en Argentina, sea el mercado de futuros de ROFEX, quien cuenta con dicha infraestructura.
Interfaces de programación
Para poder realizar una automatización utilizando un lenguaje de programación, es necesario contar con una interfaz de programación (API por sus siglas en inglés). De la misma forma que un usuario se comunica con un sistema a través de una interfaz de usuario, un programa se comunica con otro a través de una interfaz de programación.
En noviembre de 2015, Primary, una empresa del grupo ROFEX, lanzó la primera interfaz de programación que permite automatizar la compra y venta de instrumentos de ROFEX, abriendo el camino para el desarrollo y ejecución de algoritmos de trading en dicho mercado.
Liquidez
Según los informes, “la operatoria de derivados financieros en MATba-ROFEX durante el primer semestre del 2019 superó todos los registros previos. En los primeros seis meses del año, se negociaron 137 millones de contratos, un 48% superior al primer semestre de 2018” (Fuente ROFEX).
ROFEX 20
El Índice de Acciones ROFEX 20 es un índice de retorno total, diseñado para medir el desempeño de una cartera integrada por las 20 acciones más líquidas en el mercado accionario local ponderadas por su capitalización bursátil. (Fuente: ROFEX20).
En Abril de 2018 la CNV aprobó el índice de acciones ROFEX20 (RFX20) y rápidamente se volvió uno de los productos más negociados de ROFEX, generando también una alternativa para quienes desean aplicar estrategias de trading algorítmico sobre un mercado derivado de acciones. De hecho, según los informes de ROFEX del primer semestre de 2019, “el total negociado de futuros y opciones del índice desde su listado alcanzó los 2,5 millones de contratos operados […] y se alcanzó un ratio promedio de 65% volumen operado en futuros y opciones en relación al volumen operado en el mercado spot”.
Primary + C# = Primary.Net
Primary.Net es una biblioteca para acceder a la API de Primary desde C#. Utiliza la API REST de Primary.
Al momento de escribir este artículo, se encuentra todavía en desarrollo (versión 0.1.1-alpha) y tiene soporte para:
- Lista de instrumentos operados.
- Datos históricos.
- Datos en tiempo real.
- Cursar órdenes.
- Información de órdenes en tiempo real.
El objetivo de esta serie es ir mostrando el uso de esta biblioteca, para poder hacer automatizaciones sobre el mercado de MATba-ROFEX.
Obtener un usuario de prueba
Para utilizar la API es necesario tener un usuario con quien autenticarnos. Nuestra ALyC nos va a proveer el usuario relacionado con nuestra cuenta comitente, pero no debemos hacer pruebas y desarrollar contra la cuenta que tiene dinero de verdad. Para estas etapas del proceso, se usa un usuario de prueba que opera con dinero ficticio, por eso se denomina paper trading.
El usuario de prueba se obtiene registrándose en reMarkets.
Para este artículo se asume que el usuario tiene experiencia en la creación de proyectos de C#, así que vamos directo a las particularidades.
Creación del proyecto
El paquete Primary.Net
se encuentra en Nuget.
Para que aparezca la versión actual de la biblioteca es necesario chequear que incluya los prereleases, ya que al momento de escribir este artículo, no hay todavía una versión release.
Autenticación
Para autenticarse en la API, hay que primero crear una instancia del objeto Api
con el endponint del entorno al que queremos conectarnos. Primary.Net provee dos constantes: DemoEndpoint
y ProductionEndpoint
, para conectarse a las instancias de paper trading y produccion respectivamente.
Luego se llama al método Login
utilizando como parámetros el usuario y el password.
var api = new Api(Api.DemoEndpoint);
await api.Login("user", "password");
Obteniendo los instrumentos negociados
Para obtener la lista de instrumentos negociados, se utiliza el método GetAllInstruments
, que devuelve un conjunto de Instrument
, donde se encuentran el mercado y el símbolo de cada uno.
var allIInstruments = await api.GetAllInstruments();
foreach (var instrument in allIInstruments)
{
Console.WriteLine($"{instrument.Market} / {instrument.Symbol}");
}
La salida va a ser algo como esto:
ROFX / SOJ.ROSMay20M
ROFX / SOJ.ROSMay20 290c
ROFX / PISO.MAI.ROSAbr20 161c
ROFX / TRI.ROS 12/01 19
ROFX / PISO.MAI.ROSAbr20 173c
ROFX / PISO.MAI.ROSAbr20 185c
ROFX / TRI.MINJul20
ROFX / MERV - XMEV - AY24C - CI
ROFX / MAI.ROSJul20 168c
ROFX / SOJ.ROSEne20 229p
ROFX / PISO.SOJ.ROSMay20 230p
ROFX / GIR.ROSMar20
ROFX / TRI.ROSMar20 189p
ROFX / DONov19
...
Filtrando los instrumentos de interés
Si quisiéramos filtrar por ejemplo, los futuros de dolar, podemos utilizar LINQ sobre dicha secuencia.
var dollarFutures = allIInstruments.Where( s => s.Symbol.StartsWith("DO") &&
!s.Symbol.StartsWith("DOP ")
);
foreach (var dollarFuture in dollarFutures)
{
Console.WriteLine($"{dollarFuture.Symbol}");
}
La salida de este ejemplo será algo como:
DONov19
DOMar20
DONov19 66.00c
DODic19
DOEne20A
DOJul20
DOMay20A
DONov19 68.00c
DOJun20A
DOJun20
DONov19 60.00p
DOAbr20
DOAgo20
...
Obteniendo los trades históricos de un instrumento
Finalmente, para obtener datos históricos de un instrumento, utilizamos el método GetHistoricalTrades
que devuelve una secuencia de Trade
con la información de cada operación realizada.
Los parámetros son: el instrumento y el intervalo de días para el cual queremos los datos.
var sampleInstrument = allIInstruments.First();
var threeDaysAgo = DateTime.Today.AddDays(-3);
foreach (var trade in await api.GetHistoricalTrades(sampleInstrument, threeDaysAgo, DateTime.Today))
{
Console.WriteLine($"{trade.DateTime.ToLocalTime()}: ${trade.Price} ({trade.Size})");
}
Como la API de Primary devuelve las fechas y horas en UTC, es necesario convertirlos a fecha/hora local.
La salida es:
11/19/2019 10:30:48 AM: $60.35 (6.0)
11/19/2019 10:32:10 AM: $60.351 (1.0)
11/19/2019 10:59:42 AM: $60.39 (1.0)
11/19/2019 11:31:06 AM: $60.45 (1.0)
11/19/2019 11:34:15 AM: $60.5 (1.0)
11/19/2019 11:35:45 AM: $60.5 (20.0)
11/19/2019 11:43:17 AM: $60.51 (1.0)
11/19/2019 11:43:49 AM: $60.51 (1.0)
11/19/2019 11:48:15 AM: $60.55 (10.0)
11/19/2019 11:48:15 AM: $60.55 (30.0)
11/19/2019 11:48:15 AM: $60.55 (13.0)
11/19/2019 11:48:15 AM: $60.55 (13.0)
11/19/2019 11:49:49 AM: $60.55 (7.0)
11/19/2019 11:49:49 AM: $60.55 (7.0)
11/19/2019 12:01:34 PM: $60.55 (7.0)
...
Conclusiones
Primary.Net provee una forma de acceder a la API de Primary y a los productos de MATba-ROFEX desde C#. Si bien la biblioteca se encuentra todavía en desarrollo, la funcionalidad existente permite que sea utilizada para los casos de uso más comunes.
En futuros artículos iremos desarrollando el resto de la funcionalidad disponible en la biblioteca y ejemplos de como utilizarla para implementar una estrategia de trading.
Pueden encontrar más información de la Primary API en su sitio oficial.
Para conocer más acerca de la biblioteca, se puede acceder al repositorio de GitHub y a la documentación.