fbpx

ROOT FINDING EN AMIBROKER Y EL ALGORITMO GOLDEN RATIO

Este artículo es cortesía de Oscar Cagigas de  www.onda4.com. Podéis suscribiros a todos sus informes desde http://www.onda4.com/informes.html   


Ayer vimos un fuerte giro intradiario en el SP500. De ganar un 1.7% en un momento de la sesión a perder un 1.30% al cierre pues estamos hablando de un giro del 3%. Este mercado es muy volátil y no sirve eso de comprar porque sube, ya que no hay continuidad de los movimientos y los giros son la norma y no la excepción.

Con un VIX a 30.75 y con unos Nuevos Mínimos del NYSE a 338 (ambos no mostrados) cualquier cosa es posible incluyendo que se pierdan los mínimos de febrero. Por esta razón en el informe del martes le comentaba que si uno quisiera intentar unos largos pues debería ser con un riesgo muy limitado y para eso tenemos los debit spread con opciones. Y también le recordaba que los precios son casi 100% aleatorios, sobre todo en índices…

Root finding

Hoy quiero contarle algo distinto, para cambiar, es un poco avanzado pero creo que le resultará interesante.

En ocasiones a la hora de programar sistemas de trading necesitamos encontrar el mínimo de una función o de una variable. El caso más típico sería encontrar la beta o factor de ajuste que hace que en una regresión lineal el error sea mínimo. Muchas aplicaciones de procesado de datos también requieren filtros que minimicen el error y maximicen la ganancia. También estaría lo que se denomina “programación lineal” que no tiene que ver con software sino con una aproximación matemática a resolver problemas que maximizan o minimizan resultados con múltiples variables y restricciones. En definitiva, de lo que quiero hablar hoy es de los algoritmos que encuentran máximos y mínimos. En la jerga matemática esto se llamaría encontrar raíces o “root finding” si lo busca en inglés. Y es que las raíces son las soluciones cuando la función se iguala a cero.

Este gráfico de debajo lo explica muy bien. La raíz de una función genérica f(x) son los valores de x tales que f(x) = 0. En otras palabras, los puntos donde la función cruza el cero. Debajo vemos una función con 3 raíces.

root of a generic funtion

En un principio podríamos pensar en utilizar el optimizador de Amibroker para esto, pero si se trata de pasos intermedios entonces necesitamos que el código calcule estos mínimos antes de seguir con el sistema. Volviendo al ejemplo de la regresión lineal pues necesitaríamos tener el valor de la beta que hace mínimo el error para calcular el beneficio. El optimizador de Amibroker podría optimizar el beneficio del sistema pero necesitaría que la beta ya estuviera optimizada en el código. Dicho de otra forma: necesitamos un valor óptimo de beta por cada barra y no un valor óptimo para todas las barras.

Se me ocurren otros dos casos típicos en los que se necesita encontrar raíces en trading y que seguramente le serán familiares. El primero es cuando queremos saber cuál es el precio al que tiene que cerrar mañana el mercado para que se crucen las medias de nuestro sistema. Esto requiere una búsqueda de raíces.

El segundo caso es si queremos saber la volatilidad implícita de una opción. Disponemos del modelo que calcula el precio en función de la volatilidad pero queremos utilizarlo al revés, así que probamos muchas volatilidades hasta que la diferencia entre el precio de la opción y el que está en el mercado son mínimos. De nuevo, esto es una búsqueda de raíces.

Como este es un problema común hay muchos algoritmos para solucionarlo. El más simple sería una “fuerza bruta” en la que probamos todos los valores y el que salga más bajo es el que sirve. Eso puede ser sencillo de hacer pero también puede ser computacionalmente inviable si va dentro de un bucle y nos bloquea el ordenador.

A continuación voy a contarle un algoritmo que se llama “Golden Ratio” y que tiene que ver con la sección aurea. Ya sabe, con los números de Fibonacci.



Primero calculamos la función en los puntos x1, x2 y x3. El valor de la función en estos puntos es f1,f2 y f3 respectivamente. Puesto que buscamos el mínimo y f2 es el valor más bajo está claro que vamos bien y que el mínimo tiene que estar entre x1 y x3.

Ahora probamos en x4

Si la función en x4 está más arriba que en f2 (f4a en la imagen) entonces es evidente que el mínimo que queremos encontrar se encuentra entre x1 y x4 y ya podemos acotar nuestra búsqueda.

Si por el contrario la función en x4 está más abajo que en f2 (f4b en la imagen) entonces el mínimo estará entre x2 y x3 con lo que también podemos acotar la búsqueda.

Como vemos, en cualquiera de los dos casos podremos establecer una nueva región de búsqueda más pequeña.

Cuando empecemos a calcular definiremos nosotros los valores x1 y x3 donde sabemos que la solución solo puede estar dentro. Por ejemplo, si la solución es la volatilidad implícita de un índice tipo SP500 entonces podemos buscar entre 0 y 50 porque sabemos que la solución ni puede ser negativa ni va a ser tan alta como 50.

Así que hay ahora hay que pensar en dónde situamos x4. Para que no tengamos la mala suerte de que salga mucho el intervalo grande y poco el pequeño lo mejor es hacer que los intervalos x1-x4 y x2-x3 sean iguales. En la imagen sería lo mismo que decir que a+c = b.

-Y dónde situamos x2?

Esa es la pregunta del millón. Se puede demostrar que si escogemos x2 de forma que la relación entre a y b sea de fibonacci (61.8% o 1.618%) entonces el intervalo se estrecha siempre lo mismo en cada paso y converge rápidamente a la solución. Interesante, verdad?

Si le interesa la demostración entonces puede verla en wikipedia:

https://es.wikipedia.org/wiki/B%C3%BAsqueda_de_la_secci%C3%B3n_dorada

La solución puede tener la exactitud que queramos, y una vez alcanzada detenemos el cálculo. Por ejemplo, podríamos decir que se detenga el cálculo si el rango de búsqueda se vuelve menor de 0.00001.

RESUMIENDO: Este algoritmo de encontrar el mínimo de una función se llama Golden Ratio porque la relación entre los intervalos de búsqueda cumple el ratio dorado de Fibonacci. Si la función se encuentra entre 0 y 100 probaremos la función en los puntos: 0, 38.2, 61.8 y 100. El resultado más bajo nos dejará con un intervalo más pequeño donde repetiremos la prueba. Y así sucesivamente, hasta que la solución sea muy cercana a cero.


A continuación anexo la programación en Amibroker. A partir de ahora los nombres de las variables no se corresponden con la imagen anterior que explica el algoritmo.

En la fila 12 vemos que el algoritmo lo he convertido en una función que recibe los parámetros correspondientes a los extremos de la búsqueda.

En la fila 14 la variable gr es el golden ratio que se puede aproximar como (raíz(5) + 1) / 2 = 1.618

De la fila 15 a la 17 hacemos los intervalos proporcionales al golden ratio.

Y en la fila 19 comenzamos un bucle que va evaluar la función en los puntos ce y d (no puedo usar c porque es palabra reservada en Amibroker, es el cierre Close).

En la fila 35 vemos que la búsqueda termina cuando la diferencia entre a y b es tan pequeña como 1e-5.



Vamos a probarlo. Necesito una función. Por ejemplo me invento la siguiente:


Funcion


Hago un explore con Amibroker y el resultado es:

Explore

Veamos la solución exacta. Para encontrar el mínimo de esta función hay que derivar e igualar a cero (todavía me acuerdo, jejeje):

d/dx à 3(x-1)2+36x = 0 à 3x2+30x+3 = 0

Que se simplifica como x2 + 10x +1 = 0

Y que tiene como soluciones x=−5±2√6

x1 = -0.101020

x2 = -9.8989

La que nos interesa es la primera, la que hace el mínimo. La segunda hace un máximo.

Como vemos la solución de Amibroker solo tiene un error de 0.00006 respecto de la solución exacta y se consigue con 32 pasos del algoritmo. Una solución de fuerza bruta hubiera necesitado 167,000 pasos para encontrar la solución con la misma exactitud. Increíble, verdad?

El mínimo lo he buscado entre -10 y 10, ya que la función tiende a menos infinito por la izquierda. Debajo vemos el aspecto que tiene. El mínimo que toma esta función en [-10,10] es -1.1510 cuando x = -0.101020. Evidentemente esto de buscar mínimos se complica si la función se va a menos infinito.

Coordenadas

ANEXO. CÓDIGO AMIBROKER

// ------------------------------------------

// GOLDEN SECTION SEARCH

// OSCAR G. CAGIGAS

// 12 MARZO 2022

// ------------------------------------------

function example(x)

{

    return (x-1)^3 + 18*x^2;

}


function minimize( a, b ) 

{   

    gr = (sqrt(5) + 1) / 2;   //Golden Ratio

    ce = b - (b - a) / gr;

    d = a + (b - a) / gr;

    f_ce = f_d = 0;

    j = 1;

    do

    {                

             f_ce =         example(ce);        //insertar la función a minimizar (evaluada en ce)

             f_d =          example(d);                   //insertar la función a minimizar (evaluada en d)

            

             //Current element of the function

             bi = BarIndex();

             ai = SelectedValue( bi ) - bi[ 0 ];      //con esto encontramos el elemento actual del array

                               

             if (f_ce[ai] < f_d[ai])

                       b = d;

             else

                       a = ce;

        ce = b - (b - a) / gr;

        d = a + (b - a) / gr;

        j++;

    } while ( abs(b-a) > 1e-5 );

   

    return (b + a) / 2;   

}

Filter = Status("lastbarintest");

solution = minimize(-10,10);

AddColumn(solution,"solution",1.8);

AddColumn(j,"j",1);





MAS ARTICULOS DEL AUTOR

5 abril, 2022

blank

Oscar Cagigas

Óscar Cagigas es un trader titulado en Ingeniería de Telecomunicaciones por la Universidad de Cantabria, trabajó en empresas del sector de las telecomunicaciones como Ingeniero de Sistemas y Gerente de Ventas por todo el mundo, fue Director General responsable de inversiones en una Sociedad de Inversión de Capital variable.

En 2002 fundó el portal financiero Onda4.com, desde el cual sigue trabajando hasta hoy en día, autor de varios libros donde su libro “Teoría y práctica moderna de las Ondas de Elliott”, es un referente de todos los estudiosos de las “Ondas de Elliot” en castellano, también es colaborador del portal financiero RANKIA escribiendo en su blog.

Entre sus libros publicados tenemos:
Teoría y práctica moderna de las Ondas de Elliott (2003)
Trading con gestión de capital (2006)
Trading con sistemas automáticos (2007)
Estrategias y gestión de capital con acciones (2012)
Ha colaborado también para revistas especializados como:

Stocks & Commodities en los siguientes artículos: Stocks & Commodities V. 27:01 (19-22): The MEGAN Ratio.

Stocks & Commodities V. 27:4 (10-14): Winning Percentage Of A Trading System.

Stocks & Commodities V. 30:8 (22-30): Using Four Levels Of Risk Strategy.

Con respecto al desarrollo de software para trading, tiene en su haber la herramienta SIZER , que es una guía que a través de las reglas del Money Management donde nos recomienda nuestra exposición al mercado.