Capítulo 1. Python y el trading algorítmico
Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com
En Goldman [Sachs], el número de personas dedicadas a la negociación de acciones ha descendido de un máximo de 600 en 2000 a sólo dos en la actualidad.1
El Economista
Este capítulo proporciona información de fondo y una visión general de los temas tratados en este libro. Aunque Python para el trading algorítmico es un nicho en la intersección de la programación Python y las finanzas, se trata de un nicho en rápido crecimiento que toca temas tan diversos como la implementación de Python, el análisis financiero interactivo, el aprendizaje automático y profundo, la programación orientada a objetos, la comunicación por socket, la visualización de datos en streaming y las plataformas de trading.
Para refrescar rápidamente temas importantes de Python, lee primero el Apéndice A.
Python para Finanzas
El lenguaje de programación Python se originó en 1991 con la primera publicación por parte de Guido van Rossum de una versión etiquetada como 0.9.0. En 1994 le siguió la versión 1.0. Sin embargo, Python tardó casi dos décadas en establecerse como un importante lenguaje de programación y plataforma tecnológica en el sector financiero. Por supuesto, hubo adoptantes tempranos, principalmente fondos de cobertura, pero la adopción generalizada probablemente no comenzó hasta alrededor de 2011.
Un obstáculo importante para la adopción de Python en el sector financiero ha sido el hecho de que la versión por defecto de Python, denominada CPython, es un lenguaje interpretado de alto nivel. Los algoritmos numéricos en general, y los financieros en particular, se implementan muy a menudo basándose en estructuras de bucles (anidados). Mientras que los lenguajes compilados de bajo nivel, como C o C++, son realmente rápidos ejecutando dichos bucles, Python, que se basa en la interpretación en lugar de en la compilación, suele ser bastante lento al hacerlo. Como consecuencia, el Python puro resultó ser demasiado lento para muchas aplicaciones financieras del mundo real, como la valoración de opciones o la gestión de riesgos.
Python frente al pseudocódigo
Aunque Python nunca se dirigió específicamente a las comunidades científica y financiera, a muchas personas de estos campos les gustó la belleza y concisión de su sintaxis. No hace mucho, se solía considerar una buena tradición explicar un algoritmo (financiero) y, al mismo tiempo, presentar algo de pseudocódigo como paso intermedio hacia su correcta implementación tecnológica. Muchos pensaban que, con Python, el paso del pseudocódigo ya no sería necesario. Y se demostró que en su mayoría estaban en lo cierto.
Considera, por ejemplo, la discretización de Euler del movimiento browniano geométrico, como en la Ecuación 1-1.
Ecuación 1-1. Discretización de Euler del movimiento browniano geométrico
Durante décadas, el lenguaje de marcado y el compilador LaTeX han sido la norma de oro para crear documentos científicos que contengan fórmulas matemáticas. En muchos aspectos, la sintaxis Latex es similar o ya se parece al pseudocódigo cuando, por ejemplo, se exponen ecuaciones, como en la Ecuación 1-1. En este caso concreto, la versión Latex tiene este aspecto:
S_T = S_0 \exp((r - 0.5 \sigma^2) T + \sigma z \sqrt{T})
En Python, esto se traduce en un código ejecutable, dadas las respectivas definiciones de las variables, que también es muy parecido a la fórmula financiera, así como a la representación Latex:
S_T
=
S_0
*
exp
((
r
-
0.5
*
sigma
**
2
)
*
T
+
sigma
*
z
*
sqrt
(
T
))
Sin embargo, sigue existiendo el problema de la velocidad. Dicha ecuación en diferencias, como aproximación numérica de la respectiva ecuación diferencial estocástica, se utiliza generalmente para fijar el precio de los derivados mediante la simulación de Montecarlo o para realizar análisis y gestión de riesgos basados en la simulación.2 Estas tareas, a su vez, pueden requerir millones de simulaciones que deben terminarse a su debido tiempo, a menudo casi en tiempo real o, al menos, casi en tiempo real. Python, como lenguaje de programación interpretado de alto nivel, nunca se diseñó para ser lo suficientemente rápido como para abordar tareas tan exigentes desde el punto de vista computacional.
NumPy y la vectorización
En 2006, Travis Oliphant publicó la versión 1.0 del paquete PythonNumPy
. NumPy
significa Python numérico, lo que sugiere que se dirige a escenarios que son numéricamente exigentes. El intérprete básico de Python intenta ser lo más general posible en muchas áreas, lo que a menudo conlleva bastante sobrecarga en tiempo de ejecución.3 NumPy
Por otro lado, el programa Python utiliza la especialización como enfoque principalpara evitar la sobrecarga y ser tan bueno y rápido como sea posible en determinadosescenarios de aplicación.
La clase principal de NumPy
es el objeto array regular, llamado objeto ndarray
para array n-dimensional. Es inmutable, lo que significa que no puede modificarse su tamaño, y sólo puede albergar un único tipo de datos, denominado dtype
. Esta especialización permite implementar código conciso y rápido. Un enfoque central en este contexto es la vectorización. Básicamente, este enfoque evita los bucles en el nivel Python y delega los bucles en el código especializado NumPy
, generalmente implementado en C y, por tanto, bastante rápido.
Considera la simulación de 1.000.000 de valores de fin de periodo según la Ecuación 1-1 con Python puro. La mayor parte del código siguiente es un bucle for
con 1.000.000 de iteraciones:
In
[
1
]
:
%
%
time
import
random
from
math
import
exp
,
sqrt
S0
=
100
r
=
0.05
T
=
1.0
sigma
=
0.2
values
=
[
]
for
_
in
range
(
1000000
)
:
ST
=
S0
*
exp
(
(
r
-
0.5
*
sigma
*
*
2
)
*
T
+
sigma
*
random
.
gauss
(
0
,
1
)
*
sqrt
(
T
)
)
values
.
append
(
ST
)
CPU
times
:
user
1.13
s
,
sys
:
21.7
ms
,
total
:
1.15
s
Wall
time
:
1.15
s
El nivel inicial del índice.
La tasa corta constante.
El horizonte temporal en fracciones de año.
El factor de volatilidad constante.
Un objeto
list
vacío para recoger los valores simulados.El bucle principal
for
.La simulación de un único valor de fin de periodo.
Añade el valor simulado al objeto
list
.
Con NumPy
, puedes evitar completamente los bucles a nivel de Python mediante el uso de la vectorización. El código es mucho más conciso, más legible y más rápido por un factor de aproximadamente ocho:
In
[
2
]
:
%
%
time
import
numpy
as
np
S0
=
100
r
=
0.05
T
=
1.0
sigma
=
0.2
ST
=
S0
*
np
.
exp
(
(
r
-
0.5
*
sigma
*
*
2
)
*
T
+
sigma
*
np
.
random
.
standard_normal
(
1000000
)
*
np
.
sqrt
(
T
)
)
CPU
times
:
user
375
ms
,
sys
:
82.6
ms
,
total
:
458
ms
Wall
time
:
160
ms
La vectorización es un concepto poderoso para escribir código conciso, fácil de leer y de mantener en finanzas y comercio algorítmico. Con NumPy
, el código vectorizado no sólo hace que el código sea más conciso, sino que también puede acelerar considerablemente la ejecución del código (por un factor de aproximadamente ocho en la simulación Monte Carlo, por ejemplo).
Se puede decir con seguridad que NumPy
ha contribuido significativamente al éxito de Python en la ciencia y las finanzas. Muchos otros paquetes populares de Python de la llamada pila científica de Python se basan en NumPy
como estructura de datos eficiente y eficaz para almacenar y manejar datos numéricos. De hecho, NumPy
es una consecuencia del proyecto del paquete SciPy
, que proporciona una gran cantidad de funciones que se necesitan con frecuencia en la ciencia. El proyecto SciPy
reconoció la necesidad de una estructura de datos numéricos más potente yconsolidó proyectos antiguos como Numeric
y NumArray
en este ámbito en uno nuevo y unificador en forma de NumPy
.
En la negociación algorítmica, una simulación de Montecarlo puede no ser el caso de uso más importante para un lenguaje de programación. Sin embargo, si entras en el espacio de la negociación algorítmica, la gestión de grandes conjuntos de datos de series temporales financieras es un caso de uso muy importante. Piensa en el backtesting de estrategias de negociación (intradía) o en el procesamiento de flujos de datos de ticks durante las horas de negociación. Aquí es donde entra en juego el paquete de análisis de datospandas
.
pandas y la clase DataFrame
El desarrollo de pandas
comenzó en 2008 por Wes McKinney, que entonces trabajaba en AQR Capital Management, un gran fondo de cobertura que opera en Greenwich, Connecticut. Como para cualquier otro fondo de cobertura, trabajar con datos de series temporales es de suma importancia para AQR Capital Management, pero por aquel entonces Python no ofrecía ningún tipo de soporte atractivo para este tipo de datos. La idea de Wes era crear un paquete que imitara las capacidades del lenguaje estadístico R(http://r-project.org) en este ámbito. Esto se refleja, por ejemplo, en el nombre de la clase principal DataFrame
, cuya contrapartida en R se llama data.frame
. Al no considerarse lo suficientemente cercano al negocio principal de la gestión monetaria, AQR Capital Management abrió el proyecto pandas
en 2009, lo que marca el comienzo de una importante historia de éxito en el análisis financiero y de datos basado en el código abierto.
En parte debido a pandas
, Python se ha convertido en una fuerza importante en el análisis de datos y financiero. Muchas personas que adoptan Python, procedentes de otros lenguajes diversos, citanpandas
como una de las principales razones de su decisión. En combinación con fuentes de datos abiertas como Quandl, pandas
permite incluso a los estudiantes hacer sofisticados análisis financieros con las barreras de entrada más bajas que nunca: basta un ordenador portátil normal con conexión a Internet.
Supongamos que un operador algorítmico está interesado en operar con Bitcoin, la criptomoneda con mayor capitalización bursátil. Un primer paso podría ser recuperar datos sobre el tipo de cambio histórico en USD. Utilizando los datos de Quandl y pandas
, esta tarea se realiza en menos de un minuto. La Figura 1-1 muestra el gráfico resultante del siguiente código Python, que consta (omitiendo algunas parametrizaciones relacionadas con el estilo de trazado) de sólo cuatro líneas. Aunque pandas
no se importa explícitamente, el paquete envoltorio Python de Quandl devuelve por defecto un objeto DataFrame
que se utiliza para añadir una media móvil simple (SMA) de 100 días a , así como para visualizar los datos brutos junto ala SMA:
In
[
3
]
:
%
matplotlib
inline
from
pylab
import
mpl
,
plt
plt
.
style
.
use
(
'
seaborn
'
)
mpl
.
rcParams
[
'
savefig.dpi
'
]
=
300
mpl
.
rcParams
[
'
font.family
'
]
=
'
serif
'
In
[
4
]
:
import
configparser
c
=
configparser
.
ConfigParser
(
)
c
.
read
(
'
../pyalgo.cfg
'
)
Out
[
4
]
:
[
'
../pyalgo.cfg
'
]
In
[
5
]
:
import
quandl
as
q
q
.
ApiConfig
.
api_key
=
c
[
'
quandl
'
]
[
'
api_key
'
]
d
=
q
.
get
(
'
BCHAIN/MKPRU
'
)
d
[
'
SMA
'
]
=
d
[
'
Value
'
]
.
rolling
(
100
)
.
mean
(
)
d
.
loc
[
'
2013-1-1
'
:
]
.
plot
(
title
=
'
BTC/USD exchange rate
'
,
figsize
=
(
10
,
6
)
)
;
Importa y configura el paquete de trazado.
Importa el módulo
configparser
y lee las credenciales.Importa el paquete envoltorio Python de Quandl y proporciona la clave API.
Recupera los datos diarios del tipo de cambio del Bitcoin y devuelve un objeto
pandas
DataFrame
con una sola columna.Calcula la SMA de 100 días de forma vectorizada.
Selecciona los datos a partir del 1 de enero de 2013 y los traza.
Obviamente, NumPy
y pandas
contribuyen de forma mensurable al éxito de Python en las finanzas. Sin embargo, el ecosistema Python tiene mucho más que ofrecer en forma de paquetes Python adicionales que resuelven problemas más bien fundamentales y a veces especializados. Este libro hará uso de paquetes para la recuperación y almacenamiento de datos (por ejemplo, PyTables
, TsTables
, SQLite
) y para el aprendizaje automático y profundo (por ejemplo, scikit-learn
, TensorFlow
), por nombrar sólo dos categorías. Por el camino, también implementaremos clases y módulos que harán más eficiente cualquier proyecto de negociación algorítmica. Sin embargo, los principales paquetes utilizados en todo momento serán NumPy
ypandas
.
Mientras que NumPy
proporciona la estructura de datos básica para almacenar datos numéricos y trabajar con ellos, pandas
aporta potentes capacidades de gestión de series temporales. También hace un gran trabajo envolviendo funcionalidades de otros paquetes en una API fácil de usar. El ejemplo del Bitcoin que acabamos de describir muestra que basta una llamada a un método de un objeto DataFrame
para generar un gráfico con dos series temporales financieras visualizadas. Al igual que NumPy
, pandas
permite un código bastante conciso y vectorizado que, además, suele ejecutarse bastante rápido debido al uso intensivo de código compilado bajo el capó.
Negociación algorítmica
El término negociación algorítmica no tiene una definición única ni universal. En un nivel bastante básico, se refiere a la negociación de instrumentos financieros basada en algún algoritmo formal. Un algoritmo es un conjunto de operaciones (matemáticas, técnicas) que deben realizarse en una secuencia determinada para lograr un objetivo concreto. Por ejemplo, existen algoritmos matemáticos para resolver un cubo de Rubik.4 Un algoritmo de este tipo puede resolver el problema en cuestión mediante un procedimiento paso a paso, a menudo perfecto. Otro ejemplo son los algoritmos para encontrar la raíz o raíces de una ecuación, si es que existen. En ese sentido, el objetivo de un algoritmo matemático suele estar bien especificado y a menudo se espera una solución óptima.
Pero, ¿qué ocurre con el objetivo de los algoritmos de negociación financiera? Esta pregunta no es tan fácil de responder en general. Puede ayudar dar un paso atrás por un momento y considerar los motivos generales del trading. En Dorn et al. (2008) escriben:
Negociar en los mercados financieros es una actividad económica importante. Las operaciones son necesarias para entrar y salir del mercado, para poner dinero en efectivo que no se necesita y para volver a convertirlo en efectivo cuando se quiere. También son necesarias para mover dinero dentro del mercado, intercambiar un activo por otro, gestionar el riesgo y explotar la información sobre futuros movimientos de precios.
La opinión expresada aquí es de naturaleza más técnica que económica, centrándose principalmente en el proceso en sí y sólo en parte en por qué las personas inician operaciones en primer lugar. A nuestros efectos, una lista no exhaustiva de los motivos de negociación financiera de las personas e instituciones financieras que gestionan dinero propio o ajeno incluye lossiguientes:
- Negociación beta
-
Ganar primas de riesgo de mercado invirtiendo, por ejemplo, en fondos cotizados (ETF) que replican el rendimiento del S&P 500.
- Generación alfa
-
Ganar primas de riesgo independientes del mercado, por ejemplo, vendiendo en corto acciones cotizadas en el S&P 500 o ETF sobre el S&P 500.
- Cobertura estática
-
Cubrirse contra los riesgos del mercado comprando, por ejemplo, opciones de venta fuera de dinero sobre el S&P 500.
- Cobertura dinámica
-
Cobertura frente a los riesgos de mercado que afectan a las opciones sobre el S&P 500, por ejemplo, negociando dinámicamente futuros sobre el S&P 500 e instrumentos adecuados de efectivo, del mercado monetario o de tipos.
- Gestión de activos y pasivos
-
Negociar acciones del S&P 500 y ETFs para poder cubrir las obligaciones derivadas, por ejemplo, de suscribir pólizas de seguro de vida.
- Creación de mercados
-
Proporcionando, por ejemplo, liquidez a las opciones sobre el S&P 500 mediante la compra y venta de opciones a diferentes precios de compra y venta.
Todos estos tipos de operaciones pueden llevarse a cabo mediante un enfoque discrecional,con operadoreshumanos que toman decisiones principalmente por su cuenta, así como basándose en algoritmos que apoyan al operador humano o incluso lo sustituyen por completo en el proceso detoma de decisiones. En este contexto, la informatización de la negociación financiera desempeña, por supuesto, un papel importante. Mientras que en los inicios de la negociación financiera, la negociación en parqué con un gran grupo de personas gritándose unas a otras ("open outcry") era la única forma de ejecutar las operaciones, la informatización y la llegada de Internet y las tecnologías web han revolucionado la negociación en la industria financiera. La cita que figura al principio de este capítulo lo ilustra de forma impresionante en cuanto al número de personas dedicadas activamente a la negociación de acciones en Goldman Sachs en 2000 y en 2016. Es una tendencia que se preveía hace 25 años, como señalan Solomon y Corso (1991):
Los ordenadores han revolucionado el comercio de valores y el mercado bursátil se encuentra actualmente en medio de una transformación dinámica. Está claro que el mercado del futuro no se parecerá a los mercados del pasado.
La tecnología ha hecho posible que la información sobre los precios de las acciones se envíe a todo el mundo en cuestión de segundos. En la actualidad, los ordenadores dirigen las órdenes y ejecutan pequeñas operaciones directamente desde el terminal de la empresa de corretaje a la bolsa. Los ordenadores enlazan ahora varias bolsas de valores, una práctica que está ayudando a crear un mercado mundial único para la negociación de valores. Las continuas mejoras de la tecnología harán posible la ejecución de operaciones a escala mundial mediante sistemas de negociación electrónica.
Curiosamente, uno de los algoritmos más antiguos y más utilizados se encuentra en la cobertura dinámica de las opciones. Ya con la publicación de los artículos seminales sobre la fijación de precios de las opciones europeas de Black y Scholes (1973) y Merton (1973), el algoritmo, denominado cobertura delta, estuvo disponible mucho antes incluso de que comenzara la negociación informática y electrónica. La cobertura delta como algoritmo de negociación muestra cómo cubrir todos los riesgos del mercado en un mundo simplificado, perfecto y de modelo continuo. En el mundo real, con costes de transacción, negociación discreta, mercados imperfectamente líquidos y otras fricciones ("imperfecciones"), el algoritmo ha demostrado, quizá sorprendentemente, su utilidad y robustez. Puede que no permita cubrir perfectamente los riesgos de mercado que afectan a las opciones, pero es útil para acercarse al ideal y, por tanto, se sigue utilizando a gran escala en la industria financiera.5
Este libro se centra en la negociación algorítmica en el contexto de las estrategias generadoras de alfa. Aunque existen definiciones más sofisticadas de alfa, a efectos de este libro, el alfa se considera la diferencia entre la rentabilidad de una estrategia de negociación durante un periodo de tiempo y la rentabilidad del índice de referencia (acción única, índice, criptomoneda, etc.). Por ejemplo, si el S&P 500 rinde un 10% en 2018 y una estrategia algorítmica rinde un 12%, entonces el alfa es de +2% puntos. Si la estrategia rinde un 7%, entonces el alfa es de -3% puntos. En general, estas cifras no se ajustan al riesgo, y otras características del riesgo, como la reducción máxima (periodo), suelen considerarse de segundo orden de importancia, si es que tienen alguna.
Este libro se centra en las estrategias generadoras de alfa, o estrategias que intentan generar rendimientos positivos (por encima de un índice de referencia) independientemente del rendimiento del mercado. El alfa se define en este libro (de la forma más sencilla) como el exceso de rentabilidad de una estrategia sobre la rentabilidad del instrumento financiero de referencia.
Hay otros ámbitos en los que los algoritmos relacionados con el comercio desempeñan un papel importante. Uno de ellos es el espacio de la negociación de alta frecuencia (HFT), donde la velocidad suele ser la disciplina en la que compiten los operadores.6 Los motivos de la HFT son diversos, pero la creación de mercado y la generación de alfa probablemente desempeñen un papel destacado. Otro es la ejecución de operaciones, donde se despliegan algoritmos para ejecutar de forma óptima determinadas operaciones no estándar. Los motivos en este ámbito podrían incluir la ejecución (al mejor precio posible) de grandes órdenes o la ejecución de una orden con el menor impacto posible en el mercado y los precios. Un motivo más sutil podría ser disfrazar una orden ejecutándola en varias bolsas diferentes.
Queda por abordar una cuestión importante: ¿tiene alguna ventaja utilizar algoritmos para operar en lugar de la investigación, la experiencia y la discreción humanas? Esta pregunta difícilmente puede responderse de forma general. Sin duda, hay operadores y gestores de carteras humanos que han ganado, de media, más que su índice de referencia para los inversores durante periodos de tiempo más largos. El ejemplo supremo a este respecto es Warren Buffett. Por otra parte, los análisis estadísticos demuestran que la mayoría de los gestores de carteras activos rara vez baten sistemáticamente los índices de referencia correspondientes. Refiriéndose al año 2015, Adam Shell escribe:
El año pasado, por ejemplo, cuando el índice de 500 acciones de Standard & Poor's registró un mísero rendimiento total del 1,4% con dividendos incluidos, el 66% de los fondos de acciones de grandes empresas "gestionados activamente" obtuvieron rendimientos inferiores a los del índice... Las perspectivas a más largo plazo son igual de sombrías, ya que el 84% de los fondos de acciones de gran capitalización generaron rendimientos inferiores a los del S&P 500 en el último periodo de cinco años y el 82% se quedaron cortos en los últimos 10 años, según el estudio.7
En un estudio empírico publicado en diciembre de 2016, Harvey et al. escriben:
Analizamos y contrastamos el rendimiento de los fondos de cobertura discrecionales y sistemáticos. Los fondos sistemáticos utilizan estrategias basadas en reglas, con escasa o nula intervención diaria por parte de los humanos.... Descubrimos que, durante el periodo 1996-2014, los gestores sistemáticos de renta variable obtienen peores resultados que sus homólogos discrecionales en términos de rendimientos no ajustados (brutos), pero que tras ajustar la exposición a factores de riesgo bien conocidos, el rendimiento ajustado al riesgo es similar. En el caso de la macroeconomía, los fondos sistemáticos superan a los discrecionales, tanto en términos no ajustados como ajustados al riesgo.
La Tabla 1-0 reproduce las principales conclusiones cuantitativas del estudio de Harvey et al. (2016).8 En la tabla, los factores incluyen los tradicionales (renta variable, renta fija, etc.), los dinámicos (valor, impulso, etc.) y la volatilidad (compra de puts y calls at-the-money). El ratio de valoración de la rentabilidad ajustada divide el alfa por la volatilidad de la rentabilidad ajustada. Para más detalles y antecedentes, consulta el estudio original.
Los resultados del estudio ilustran que los macrofondos de cobertura sistemáticos ("algorítmicos") obtienen los mejores resultados como categoría, tanto en términos no ajustados como ajustados al riesgo. Generan un alfa anualizado de 4,85% puntos durante el periodo estudiado. Se trata de fondos de alto riesgo que aplican estrategias que suelen ser globales, de activos cruzados y que a menudo implican elementos políticos y macroeconómicos. Los fondos de cobertura sistemáticos de renta variable sólo superan a sus homólogos discrecionales en función de la relación de valoración de la rentabilidad ajustada (0,35 frente a 0,25).
|
Macro sistemática |
Macro discrecional |
Renta variable sistemática |
Capital discrecional |
---|---|---|---|---|
Retorno medio |
5.01% | 2.86% | 2.88% | 4.09% |
Rendimiento atribuido a los factores |
0.15% | 1.28% | 1.77% | 2.86% |
Rendimiento medio adjunto (alfa) |
4.85% | 1.57% | 1.11% | 1.22% |
Volatilidad del rendimiento adjunto |
0.93% | 5.10% | 3.18% | 4.79% |
Ratio de valoración del rendimiento adjunto |
0.44 | 0.31 | 0.35 | 0.25 |
En comparación con el S&P 500, el rendimiento global de los fondos de cobertura fue bastante magro en el año 2017. Mientras que el índice S&P 500 rindió un 21,8%, los hedge funds sólo devolvieron un 8,5% a los inversores (véase este artículo en Investopedia). Esto ilustra lo difícil que es, incluso con presupuestos multimillonarios para investigación y tecnología, generar alfa.
Python para el trading algorítmico
Python se utiliza en muchos rincones de la industria financiera, pero se ha hecho especialmente popular en el espacio de la negociación algorítmica. Hay algunas buenas razones para ello:
- Capacidad de análisis de datos
-
Uno de los principales requisitos de todo proyecto de negociación algorítmica es la capacidad de gestionar y procesar datos financieros con eficacia. Python, en combinación con paquetes como
NumPy
ypandas
, facilita la vida en este sentido a todo operador algorítmico más que la mayoría de los demás lenguajes de programación. - Manejo de API modernas
-
Las plataformas modernas de negociación online, como las de FXCM y Oanda, ofrecen interfaces de programación de aplicaciones (API) RESTful y API socket (streaming) para acceder a datos históricos y en directo. Python es, en general, muy adecuado para interactuar eficazmente con dichas API.
- Paquetes dedicados
-
Además de los paquetes estándar de análisis de datos, existen múltiples paquetes dedicados al espacio de la negociación algorítmica, tales como
PyAlgoTrade
yZipline
para el backtesting de estrategias de negociación yPyfolio
para realizar análisis de carteras y riesgos. - Paquetes patrocinados por vendedores
-
Cada vez más proveedores de este espacio publican paquetes Python de código abierto para facilitar el acceso a sus ofertas. Entre ellos se encuentran plataformas de negociación en línea como Oanda, así como los principales proveedores de datos como Bloomberg y Refinitiv.
- Plataformas dedicadas
-
Quantopian, por ejemplo, ofrece un entorno estandarizado de backtesting como plataforma basada en la Web, donde el lenguaje elegido es Python y donde la gente puede intercambiar ideas con otras personas de ideas afines a través de diferentes funciones de red social. Desde su fundación hasta 2020, Quantopian ha atraído a más de 300.000 usuarios.
- Adopción por parte de compradores y vendedores
-
Cada vez más actores institucionales han adoptado Python para agilizar los esfuerzos de desarrollo en sus departamentos de negociación. Esto, a su vez, requiere cada vez más personal que domine Python, lo que hace que aprender Python sea unainversión que merece la pena.
- Educación, formación y libros
-
Los requisitos previos para la adopción generalizada de una tecnología o lenguaje de programación son la educación académica y profesional y los programas de formación en combinación con libros especializados y otros recursos. El ecosistema Python ha experimentado recientemente un enorme crecimiento en este tipo de ofertas, educando y formando a cada vez más personas en el uso de Python para las finanzas. Cabe esperar que esto refuerce la tendencia de adopción de Python en el espacio de la negociación algorítmica.
En resumen, se puede decir con bastante seguridad que Python ya desempeña un papel importante en la negociación algorítmica y parece tener un fuerte impulso para ser aún más importante en el futuro. Por tanto, es una buena elección para cualquiera que intente introducirse en este espacio, ya sea como ambicioso operador "minorista" o como profesional empleado por una importante institución financiera dedicada a la negociación sistemática.
Enfoque y requisitos previos
Este libro se centra en Python como lenguaje de programación para la negociación algorítmica. El libro asume que el lector ya tiene cierta experiencia con Python y los paquetes populares de Python utilizados para el análisis de datos. Buenos libros introductorios son, por ejemplo, Hilpisch (2018), McKinney (2017) y VanderPlas (2016), todos los cuales pueden consultarse para construir una base sólida en Python para el análisis de datos y las finanzas. También se espera que el lector tenga cierta experiencia con las herramientas típicas utilizadas para la analítica interactiva con Python, como IPython
, a la que VanderPlas (2016) también proporciona una introducción.
Este libro presenta y explica el código Python que se aplica a los temas que nos ocupan, como el backtesting de estrategias de trading o el trabajo con datos de streaming. No puede proporcionar una introducción exhaustiva a todos los paquetes utilizados en diferentes lugares. Intenta, sin embargo, destacar aquellas capacidades de los paquetes que son centrales para la exposición (como la vectorización con NumPy
).
El libro tampoco puede ofrecer una introducción exhaustiva y una visión general de todos los aspectos financieros y operativos relevantes para la negociación algorítmica. En su lugar, el enfoque se centra en el uso de Python para construir la infraestructura necesaria para los sistemas automatizados de negociación algorítmica. Por supuesto, la mayoría de los ejemplos utilizados proceden del ámbito de la negociación algorítmica. Sin embargo, cuando se trata, por ejemplo, de estrategias de impulso o de reversión a la media, se utilizan más o menos simplemente, sin proporcionar verificación (estadística) ni una discusión en profundidad de sus complejidades. Siempre que se considera oportuno, se dan referencias que remiten al lector a fuentes que abordan cuestiones que han quedado abiertas durante la exposición.
En definitiva, este libro está escrito para lectores que tienen cierta experiencia tanto con Python como con el trading (algorítmico). Para ese tipo de lector, el libro es una guía práctica para la creación de sistemas de trading automatizados utilizando Python y paquetes adicionales.
Este libro utiliza una serie de enfoques de programación en Python (por ejemplo, la programación orientada a objetos) y paquetes (por ejemplo, scikit-learn
) que no pueden explicarse en detalle. Se centra en la aplicación de estos enfoques y paquetes a diferentes pasos de un proceso de negociación algorítmica. Por tanto, se recomienda que quienes aún no tengan suficiente experiencia en Python (para finanzas) consulten adicionalmente textos más introductorios de Python.
Estrategias de negociación
A lo largo de este libro, se utilizan como ejemplo cuatro estrategias de negociación algorítmica diferentes. Se presentan brevemente en las secciones siguientes y con más detalleen el Capítulo 4. Todas estas estrategias de negociación pueden clasificarse comoestrategias debúsqueda de alfaprincipalmente , ya que su objetivo principal es generar rendimientos positivos, superiores a los del mercado, independientemente de la dirección de éste. Los ejemplos canónicos a lo largo del libro, cuando se trata de instrumentos financieros negociados, son un índice bursátil, una sola acción o una criptodivisa (denominada en una moneda fiduciaria). El libro no cubre las estrategias que implican varios instrumentos financieros al mismo tiempo (estrategias de negociación por pares, estrategias basadas en cestas, etc.). También cubre sólo estrategias cuyas señales de negociación se derivan de datos de series temporales financieras estructuradas y no, por ejemplo, de fuentes de datos no estructuradas como noticias o feeds de redes sociales. De este modo, los debates y las implementaciones en Python son concisos y más fáciles de entender, en consonancia con el enfoque (comentado anteriormente) de centrarse en Python para la negociación algorítmica.9
El resto de este capítulo ofrece una rápida visión general de las cuatro estrategias de negociación utilizadas en este libro.
Medias móviles simples
El primer tipo de estrategia de negociación se basa en las medias móviles simples (SMA) para generar señales de negociación y posicionamientos en el mercado. Estas estrategias de negociación han sido popularizadas por los llamados analistas técnicos o chartistas. La idea básica es que una SMA a más corto plazo con un valor más alto que una SMA a más largo plazo señala una posición larga en el mercado y el escenario opuesto señala una posición neutral o corta en el mercado.
Impulso
La idea básica de las estrategias de impulso es que se supone que un instrumento financiero se comportará de acuerdo con su rendimiento reciente durante un tiempo adicional. Por ejemplo, cuando un índice bursátil ha tenido un rendimiento negativo de media en los últimos cinco días, se supone que su rendimiento también será negativo mañana.
Reversión media
En las estrategias de reversión a la media, se supone que un instrumento financiero vuelve a algún nivel medio o de tendencia si actualmente está lo suficientemente lejos de dicho nivel. Por ejemplo, supongamos que una acción cotiza 10 USD por debajo de su nivel SMA de 200 días de 100. Entonces se espera que el precio de la acción vuelva a su nivel de SMA en algún momento cercano.
Aprendizaje automático y profundo
Con los algoritmos de aprendizaje automático y profundo, generalmente se adopta un enfoque más de caja negra para predecir los movimientos del mercado. Por simplicidad y reproducibilidad, los ejemplos de este libro se basan principalmente en observaciones históricas de rentabilidad como características para entrenar algoritmos de aprendizaje automático y profundo para predecir los movimientos del mercado bursátil.
Este libro no presenta el trading algorítmico de forma sistemática. Dado que se centra en la aplicación de Python en este fascinante campo, los lectores que no estén familiarizados con el trading algorítmico deberán consultar recursos dedicados al tema, algunos de los cuales se citan en este capítulo y en los siguientes. Pero ten en cuenta que el mundo de la negociación algorítmica en general es reservado y que casi todos los que tienen éxito son naturalmente reacios a compartir sus secretos para proteger sus fuentes de éxito (es decir, su alfa).
Conclusiones
Python ya es una fuerza en las finanzas en general y va camino de convertirse en una fuerza importante en el trading algorítmico. Hay una serie de buenas razones para utilizar Python para el trading algorítmico, entre ellas el potente ecosistema de paquetes que permite un análisis eficaz de los datos o el manejo de API modernas. También hay una serie de buenas razones para aprender Python para la negociación algorítmica, entre las que destaca el hecho de que algunas de las mayores instituciones de compra y venta hacen un uso intensivo de Python en sus operaciones de negociación y buscan constantemente profesionales experimentados en Python.
Este libro se centra en la aplicación de Python a las distintas disciplinas del trading algorítmico, como el backtesting de estrategias de trading o la interacción con plataformas de trading online. No puede sustituir a una introducción exhaustiva al propio Python ni al trading en general. Sin embargo, combina sistemáticamente estos dos fascinantes mundos para proporcionar una valiosa fuente para la generación de alfa en los competitivos mercados financieros y de criptomonedas actuales.
Referencias y otros recursos
Libros y artículos citados en este capítulo:
1 "Demasiado calamar para fracasar". The Economist, 29 de octubre de 2016.
2 Para más detalles, véase Hilpisch (2018, cap. 12).
3 Por ejemplo, los objetos list
no sólo son mutables, lo que significa que pueden cambiar de tamaño, sino que también pueden contener casi cualquier otro tipo de objeto Python, como int
, float
, tuple
o los propios objetos list
.
4 Ver Las matemáticas del cubo de Rubik o Algoritmos para resolver el cubo de Rubik.
5 Véase en Hilpisch (2015) un análisis detallado de las estrategias de cobertura delta para opciones europeas y americanas utilizando Python.
6 Véase el libro de Lewis (2015) para una introducción no técnica a la HFT.
7 Fuente: "El 66% de los gestores de fondos no pueden igualar los resultados del S&P". USA Today, 14 de marzo de 2016.
8 Rendimiento anualizado (por encima del tipo de interés a corto plazo) y medidas de riesgo para categorías de fondos de cobertura que comprenden un total de 9.000 fondos de cobertura durante el periodo comprendido entre junio de 1996 y diciembre de 2014.
9 Véase el libro de Kissel (2013) para una visión general de los temas relacionados con la negociación algorítmica, el libro de Chan (2013) para un análisis en profundidad de las estrategias de impulso y de reversión a la media, o el libro de Narang (2013) para una cobertura de la negociación cuantitativa y HFT en general.
Get Python para el trading algorítmico now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.