Hace tiempo estudié un algoritmo de inversión muy bueno, que operaba un gestor profesional de capitales. En este artículo voy a analizarlo con detalle.
Yo le llamo algoritmo «4dias». La idea es sencilla, como me gustan a mi: consiste en comprar acciones que hayan caido mucho: en concreto 4 barras seguidas. Y venderlas cuando suban dos barras seguidas.
Es decir, una operacion como esta:

Pero esta técnica hace beneficios muy rápido: en cuanto acumula dos barras alcistas, vende.
Además, como las compras y las ventas son al día siguiente de la señal, no hace falta estar demasiado pendiente: al final del día se comprueban las barras y se lanza la orden de compra o de venta para el día siguiente.
La venta rápida puede dar trabajo porque hacemos muchas compra ventas, pero tiene una ventaja: la probabilidad de acierto tiende a ser alta: el porcentaje de acierto estará en torno al 60% o más.
Claro que el ejemplo anterior es una operación de éxito, pero: ¿que pasa si el valor sigue bajando?. Veamos este otro ejemplo:
Un valor que ha subido muy fuerte, sufre una corrección. Compramos al cabo de 4 días, pero el valor sigue corrigiendo muchos días más hasta que por fin hace dos barras alcistas y se vende, acumulando fuertes pérdidas.De hecho, aunque el porcentaje de acierto tiende a ser alto, esta idea de vez en cuando sufre operaciones con unas pérdidas del 20%, 30%, 40% o más.
Solucionamos el problema de los Stops
Seguro que te has habrás dado cuenta, amigo trader, de una característica de este método: No tiene stops.
¿Cómo? ¿Sin stops? ¡Herejía!
En muchos libros de trading y páginas de bolsa se suele decir que es imprescindible operar con stops de pérdidas. Que no usar stops es sinónimo de arruinarse.
Sin embargo, esto es muy matizable. Depende del método. De hecho, cuando hablamos de acciones, el uso de «hard stops» suele perjudicar los sistemas.
El caso es que aqui no los usamos, y en su lugar usamos otro modo de bajar la volatilidad: comprar muchas acciones simultáneamente.
En concreto creamos una cartera de 10 acciones.
Así, aunque una acción pierda un 40%, realmente sería un 4% del total del capital, ya que invierte un décimo del total.
Ahora bien, si compramos de 10 acciones.. ¿cuáles?
Si en un día cualquiera encontramos 30 oportunidades de compra, 30 valores que han caído 4 días seguidos.. ¿cuales tendrán preferencia?
El ordenamiento de señales redundantes es muy importante al crear carteras. Lo lógico es que compremos acciones muy sobrevendidas.
Veamos el anterior ejemplo con el oscilador estocástico, que mide la sobreventa y sobrecompra:
La compra anterior, se lanzaba con un estocástico relativamente alto, es decir contra un valor que aún tenía margen de bajada. Si en vez de comprar tan arriba, esperamos a que el estocástico baje, la operación también hubiera fallado, pero con pérdidas mucho menores.Por tanto vamos a priorizar las acciones que además tengan un estocástico bajo. No será una condición de compra, sino que se priorizan las acciones de menor a mayor estocástico.
Resultados históricos
Resumo la configuración del algoritmo, y te muestro los resultados históricos:
- Universo de acciones: mercado norteamericano, acciones small caps entre 3 y 30 millones de dólares de negociación diaria, sin sesgo de supervivencia. Precio > 1$, para evitar las penny stocks
- Condicion de compra: valor que haya caido al menos 4 días seguidos
- Condición de venta: que el valor haya subido 2 días seguidos
- Prioridad de señales redundantes: las de estocástico más bajo
- Tamaño de cartera: hasta 10 acciones simultáneas
Pero lo peor es el horrible draw down, un 77% de pérdida en el peor momento. Un racha de pérdidas intolerable.
Eso si, acierta a menudo: casi 2 de cada 3 veces tiene éxito.
He modificado el algoritmo de inversion con un filtro que suelo utilizar mucho en mis sistemas: sólo comprar cuando el SP500 está por encima de su media de 200 días. Esta sería una 6ª condición, que se añade a las 5 anteriores.
Claro que al ser compra-ventas rápidas, he comprobado también la rentabilidad usando el filtro de la media de 100 días en vez de la de 200.
Los resultados son:

Vemos que en este caso la media de 200 días, que es muy lenta, no mejora el algoritmo de inversion: gana menos que antes, y la racha de pérdidas apenas se reduce.
En cambio, la rápida media de 100 días si mejora la rentabilidad, hasta el 11%, batiendo claramente al mercado. Pero su racha de pérdidas, el 42% sigue siendo excesiva
El problema de usar medias como filtro es que la idea de comprar acciones que llevan varios días cayendo es intrínsecamente volátil.
Una acción que se deploma con fuerza, puede rebotar mucho, sí, pero es una acción peligrosa.
Asi que se me ha ocurrido : ¿Y si añadimos otra condición, relacionada con la volatilidad?
Si solo compramos acciones de baja volatilidad, probablemente disminuyan las rachas de pérdidas.
La volatilidad se suele obtener con el oscilador ATR, de 14 o 15 días. Pero puesto que el ATR devuelve una cifra proporcional al precio, no podemos comparar entre distintas acciones:
El ATR de un valor caro, como es Apple, parece mayor que el de uno de menor precio. Pero es que esas cifras no se pueden comparar.Asi que en vez de usar el valor abosulto del ATR, uso el ATR dividido entre el precio de cierre. Es decir, en el gráfico anterior, la volatilidad de Apple sería 3,5 / 220= 0,015.
Y la de NEO, sería 0,7 / 22= 0,03. Este ultimo valor sería más volátil que Apple, pese a su menor ATR.
Es decir, añado la condición de que la volatilidad, medida como ATR(15) / cierre sea menor que 0,2.
Los resultados:
Sin embargo, tras obtener este resultado, aún estaba pensativo con el tema de las medias.
Otro problema de usar un filtro con el SP500, al margen de la volatilidad, es que puede haber acciones que estén cayendo con mucha fuerza pese a que el mercado no esté bajista.
Por tanto, parece lógico añadir el filtro de la media de 100 días tanto al índice general como a la propia acción. Debería mejorar resultados.
Asi que he vuelto a la mesa de diseño para añadir la condición. O mejor dicho, para sustituir la anterior.
Resultados finales
Con tantas pruebas seguro que estás hecho un lío, asi que resumo esta última versión del algoritmo:
- Universo de acciones: mercado norteamericano, acciones small caps entre 3 y 30 millones de dólares de negociación diaria, sin sesgo de supervivencia. Precio > 1$, para evitar las penny stocks
- Condicion de compra: valor que haya caido al menos 4 días seguidos, el SP500 sea mayor que su media 100 y la acción sea mayor que su media 100
- Condición de venta: que el valor haya subido 2 días seguidos, o pierda su media100, o el SP500 pierda su media 100
- Prioridad de señales redundantes: las de estocástico más bajo
- Tamaño de cartera: hasta 10 acciones simultáneas
¡Bien! El resultado mejora de nuevo, hasta el 14,5%. Aunque la peor racha de pérdidas sigue igual.
Viendo los últimos 16 años, este algoritmo de inversion gana 12 años y pierde 4. Es normal, ningún método gana absolutamente todos los años.
Es una idea que tiene buena pinta. Pero..
¿Esto es realmente operable?
El problema que tienen todos los métodos estudiados en función de su histórico es que tienden a estar sobreoptimizados.
Hablando con más claridad: en el futuro dan mucha menor rentabilidad que los resultados teóricos. O incluso pérdidas.
Para evitar la sobreoptimización, hay que evitar «la karraka del ordenador»: poner al software a buscar los valores óptimos de las medias o de los días. Cosa que no he hecho, porque no he valorado muchos valores ni volatilidades, sólo he probado lo que me ha parecido lógico.
Y también hay que evitar que haya demasiadas condiciones de compra o de venta. En esto caso, son tres.
Y comprobar que los resultados históricos son un histórico muy largo: en este caso 16 años, que es un período bastante aceptable.
Sin embargo, es probable que el algoritmo esté un poco sobreoptimizado. Las estadísticas de Montecarlo devuelven esta curva de percentiles de rentabilidad anual:

Pero esto no implica que el algoritmo de inversion no sea operable. Le pasa como a todas las ideas, no es infalible. Pero puede ser una buena manera de invertir en acciones, quizá no de un modo sistemático como hace el algoritmo, pero sí combinando con otros condicionantes técnicos.
algunas posibilidades son:
- sólo operar en momentos bursátiles muy tranquilos
- Usar acciones que estén muy cerca de soportes relevantes
- Trabajar sobre acciones de fuertes fundamentales
- O con valores que tengan una larga mecha por debajo en el último dia
- Cuando el propio indice de referencia esté sobre un soporte claro
- ( . . .)
La idea, que además no es mía sino que es utilizada por gestores profesionales, es digna, en mi opinión, de tener en cuenta y probarla.
Para ayudarte a ello, he creado un pequeño screener para Prorealtime, que puedes descargarlo desde aqui. El fichero que descargues no se puede abrir, debes importarlo desde Prorealtime.
Debes ejecutar el screener cuando el SP500 (o el indice de referencia del mercado en el que operes) esté por encima de su media 100. Y las acciones que te devuelva merecen ser valoradas como posible entrada.
En fin, espero que estas ideas te inspiren. Y si encuentras alguna operación de compra interesante, cuentalo en los comentarios..
Buenos dias y saludos, el screener se debe utilizar por debajo o por encima de la media de 100, en el penúltimo parrafo has puesto por debajo.
Enhorabuena por todos tus artículos.
Gracias! Ya lo he corregido 🙂
Hola Gonzaga, muy interesante el artículo. Sólo una curiosidad que me ha llamado la atención: porque al incorporar condiciones tienes más operaciones? Es decir, empezamos con 6445, incorporamos la media de 100 y pasa a 4842 operaciones, pero al añadir otra condición adicional, la de la volatilidad, volvemos a tener 6576 operaciones, y finalmente, el último sistema acaba con 6580 operaciones. Mi sentido común me dice que a mayor número de condiciones, menor número de operaciones. Se me escapa algo? Muchas gracias por todo, sigue siendo muy interesante. Saludos!
Si, es un tema curioso.
Ten en cuenta que pequeñas diferencias en una algoritmo generan compra venta de acciones completamente distintas.
Aunque tener mas restricciones parece que deberia implicar menos compras, el cambio de la formula hace que el promedio de barras con posiciones abiertas cambie mucho, a la baja. (quiza deberia haber mostrado ese dato)
Al bajar el promedio de días abiertos, aumentan las oportunidades de compra ventas, y aumenta el número de operaciones.
De todos modos repasaré las cifras, porque podría ser que haya un error, estos temas no son triviales de analizar..
Un saludo!
Muy buenas!
Excelente idea. Esta semana santa me picaré el código en python para hacer mi propio backtesting.
Me surgen un par de dudas:
Realizas muchas operaciones al usar velas diarias. Has probado con velas semanales?
Has probado a usar el VIX para decidir si entras o sales de los mercados?
Y por último, cuando dices que da un 16% de media anual, te refieres siempre a reinvirtiendo las ganancias de cada año? O cada año partes de cero?
Muchas gracias y excelente trabajo
Hola!
No, no he probado velas semanales, aunque intuyo que los resultados serán peores. Si me da un día de estos lo pruebo.
Tampoco he probado el VIX, aunque lo he probado con otros sistemas y en general el VIX, que es brutalmente volatil, no me suele dar buen resultado como filtro de volatilidad.
La rentabilidad anual la considero siempre con reinversion de resultados. Y con comisiones, y sin considerar los dividendos..
Que tal es el Phyton para hacer backtests? Y de donde sacas los datos?
Un saludo!
Hola de nuevo Gonzaga,
Te acabo de enviar un mail dando más detalle al respecto, pero por contestar a tus «fans», te contesto a tus preguntas por aquí.
Python es un lenguaje de programación muy útil, también para mercados financieros. El backtesting lo tengo programado yo y es bastante fiel a la realidad. Los datos los extraigo automáticamente con Python de la web de Yahoo Finance.
Un saludo
Anda, sin usar ningún graficador de cotizaciones tipo AMIBROKER ó PRT? «Sólo» con un código en PYTHON?Pero sobre alguna plataforma, no? Un excell por lo menos o algo…Qué pasada!!!!Me gusta mucho la programación aunque me he quedado en el Visual basic para macros de EXCELL y en megafórmulas…Puedes contar más, Alberto?
Hola Rafa,
Yo uso frecuentemente Python y R (dos lenguajes de programación). Con ellos me puedo descargar directamente la cotización a un dataframe (a memoria) y con ello calcular precios de entrada y salida en base a la estrategia que defina. Entiendo que todo esto te pueda parecer un mundo, pero hay mucha información en la red. Con permiso de Gonzaga, te paso este curso de Python aplicado al trading cuantitativo https://www.datacamp.com/community/tutorials/finance-python-trading
Con Python o R se pueden hacer una cantidad de cosas increíbles. Solo hace falta tener una buena estrategia y ganas de programarla.
Saludos
Buenas Alberto, estoy haciendo un codigo en python sobre este algoritmo y tengo ciertas dudas que no se si me podrias aclarar o incluso compartir tu codigo para echarle un vistazo.
Las dos ideas que se me han ocurrido para realizar el algoritmo son:
1. Bucles anidados para sacar todas las caidas del precio y luego que estas sean mis datos para hacer un modelo de ML en el cual me filtre las señales, dado que no siempre funcionara con una caida de 4 dias si no que a lo mejor puede ser con solo 3 o incluso mas de 4 dias consecutivos de caidas.
2. La segunda idea es plotear los datos y clasificarlos manualmente todas las caidas que haya para el modelo de ML, este no es el mas idoneo dado que un modelo supervisado a traves de la clasificacion que yo haga.
Me gustaria saber tu opinion acerca de esto, asi como la de Slowinver.
Muchas gracias a los dos, Ignacio
Ensayo el sistema con el NYSE, y me sorprendo que solo dos accs. cumplen con las condiciones de 4 barras rojas; repaso y me doy cuenta que tengo puestas barras Heikin-Ashi, será por esto? pongo Candlestick y de los 10 valores que me saca 7 cumplen, y 3 no, de éstos últimos les falta una barra.
No se si es fallo mio o del sistema.
Hola Angel,
El modo de visualizacion de las velas no afecta al screener que he adjuntado; lo que pasa que puede confundir al comprobar visualmente.
Si no usas Heiken Ashi, en efecto hay 10 valores, y todos cumplen las condiciones.
Probablemente te estará confundiendo el color de las velas. Ten en cuenta que en PRT las velas verdes son aquellas que cierran por encima de su apertura; pero nosotros buscamos velas que han caido desde el día anterior. Por ejemplo, veo CISN a fecha de hoy: hace tres días tuvo una vela verde, pero realmente bajó respecto al día anterior, que es lo que a nosotros nos interesa.
A veces los graficadores confunden más que ayudar..
Un saludo!
Buenas noches GONZAGA:
¿Por qué eliges para el backtesting solo acciones small caps? En tal caso, ¿por qué usar el SP500 y no, por ejemplo, otro índice más correlacionado con estas acciones como el RUSSELL2000?
Cuando dices que haces el backtesting SIN SESGO de supervivencia, ¿te refieres a que tu base de datos contiene esas acciones que han desaparecido a lo largo de los años o al revés, que solo contiene las acciones que actualmente están en vigor? ¿Y qué proveedores de datos para AMIBROKER son capaces de suministrar esta información (cotizaciones de valores desaparecidos)?
Para Alberto: Muchas gracias por la informacion sobre Python!! 🙂
Para Rafa: no, el sistema testea todo el mercado norteamericano, no solo Russell..
Y en efecto, incluyo acciones ya desaparecidas. Esto es muy importante porque si solo usas acciones que existen hoy en día, evitas testear los chicharros que han quebrado o han desaparecido por lo que sea, con lo que los resultados se distorsionan fuertemente al alza, no son realistas
Yo uso la base de datos de pago Norgate Data, que permite evitar este problema.
Un saludo!
Hola Gonzaga,
Creo que tienes una errata cuando dices:
Es decir, añado la condición de que la volatilidad, medida como ATR(15) / cierre sea menor que 0,2.
Muy pocos valores van a tener una volatilidad del 20% (0,2). ¿No debería ser un 0,02?
Un saludo
Hola Alberto,
No, está bien: un 20%.
Ten en cuenta que se analiza un mercado gigantesco, de small caps americanas. Y aparecen suficientes oportunidades de compra venta..
Un saludo!
Hola Gonzaga.
Hay algo que no me encaja.
Este es un sistema de reversión a la media, y los sistemas de reversión a la media obtienen peores resultados en los periodos de baja volatilidad. En cambio en las posibles mejoras indicas: «sólo operar en momentos bursátiles muy tranquilos», es decir volatilidad baja.
¿Podrías explicarlo?
Gracias, y un saludo.