MATBa-ROFEX

  • 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).

Operatoria derivados financieros

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”.

Volumen nocional futuro vs. 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.

Primary.Net 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.