jueves, 20 de febrero de 2020

ESTACIONALIDAD en Amibroker

Es verdad que el precio del Crudo WTI sube de primavera a verano y luego cae en otoño?

Contestar a esta pregunta con Amibroker es tan sencillo como sumar los precios de la misma fecha exacta de los últimos 15 años y mostrarlo gráficamente. También podemos repetirlo para los últimos 5 años y comparar, para ver si el patrón estacional aún se mantiene.

Debajo vemos un ejemplo precisamente con el Crudo WTI. Su estacionalidad es clara. Tiende a subir hasta el verano y luego corrige. La tendencia más evidente es la caída del último trimestre del año. Esto se aprecia al ver que las líneas van muy juntas, revelando así un patrón bien claro.

La línea negra vertical es la misma fecha de hoy (20 de febrero) pero del año pasado. Esto nos permite ver el patrón estacional que se puede esperar en los próximos meses. Situando el marcador vertical en verano vemos que un contrato de Crudo gana 6000 dólares desde finales de febrero hasta el 2 de julio (media de 15 años). Y en los últimos 5 años el promedio de ganancias sería de 4000 dólares.



La estacionalidad es un promedio, así que no espere que funcione cada año. Pero algo hay, es una especie de "brisa de fondo" que tiene una cierta influencia sobre los precios de las materias primas. Las cosechas, los stocks de almacenaje, el frío invierno.... son muchos los factores que afectan a las materias primas y por tanto estas tienen implícito un componente estacional. A continuación comparto el código que le permite visualizarlo.


CÓDIGO AMIBROKER

//-----------------------------------------------------------
// INDICADOR DE ESTACIONALIDAD
// BASADO EN: http://boards.fool.com/amibroker-seasonality-
// and-nh-nl-code-28623658.aspx?sort=postdate
// OSCAR G. CAGIGAS
// 20 feb 2020
//-----------------------------------------------------------

days = 252;  //días de trading que tiene un año

//PROMEDIO DE 5 AÑOS
ac5y = ( Ref(C,-days*5)+Ref(C,-days*4)+Ref(C,-days*3)+Ref(C,-days*2)+Ref(C,-days) )/5;

//PROMEDIO DE 15 AÑOS
ac15y = 
(Ref(C,-days*15)+Ref(C,-days*14)+Ref(C,-days*13)+Ref(C,-days*12)+Ref(C,-days*11)+
Ref(C,-days*10)+Ref(C,-days*9)+Ref(C,-days*8)+Ref(C,-days*7)+Ref(C,-days*6)+
Ref(C,-days*5)+Ref(C,-days*4)+Ref(C,-days*3)+Ref(C,-days*2)+Ref(C,-days))/15;


//SELECCIÓN DE HISTÓRICO
FiveYear = ParamToggle("5YrPlot", "No | Yes", 1); 
FifteenYear = ParamToggle("15YrPlot", "No | Yes", 1); 

//PINTAR LÍNEAS
if( FiveYear ) 
{
Plot(ac5y, "5yr", colorRed, styleOwnScale|styleThick);
}
if( FifteenYear ) 
{
Plot(ac15y, "15yr", colorBlack, styleOwnScale|styleThick);
}

//MARCADOR VERTICAL EN LA MISMA FECHA DE OTROS AÑOS
Line1 = Cum( 1 ) == LastValue( Cum( 1 ) ) - days;
Line2 = Cum( 1 ) == LastValue( Cum( 1 ) ) - days*2;
Line3 = Cum( 1 ) == LastValue( Cum( 1 ) ) - days*3;
Line4 = Cum( 1 ) == LastValue( Cum( 1 ) ) - days*4;
Line5 = Cum( 1 ) == LastValue( Cum( 1 ) ) - days*5;
Plot( Line1, "Line is ( " + WriteVal( days, 1 ) + " ) bars back", colorBlack, styleHistogram | styleThick | styleOwnScale );
Plot( Line2, "", colorBlack, styleHistogram | styleThick | styleOwnScale );
Plot( Line3, "", colorBlack, styleHistogram | styleThick | styleOwnScale );
Plot( Line4, "", colorBlack, styleHistogram | styleThick | styleOwnScale );
Plot( Line5, "", colorBlack, styleHistogram | styleThick | styleOwnScale );

//GRÁFICO DE FONDO CON EL MERCADO ORIGINAL
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() ); 


//CARGAR LOS MULTIPLICADORES 
//http://onda4com.blogspot.com/2018/09/los-multiplicadores-de-los-futuros.html
#include <futuros.afl>

//RENDIMIENTO SOBRE EL GRÁFICO
if (SelectedValue(C))
{
rendto5 = ( SelectedValue(ac5y)-ValueWhen(line1,ac5y) ) * PointValue;
rendto15 = ( SelectedValue(ac15y)-ValueWhen(line1,ac15y) ) * PointValue;
i = SelectedValue( BarIndex() );
maxy = Status("axismaxy");
miny = Status("axisminy");
y1 = 0.90 * (maxy - miny) + miny;
y2 = 0.85 * (maxy - miny) + miny;
text1 = "RENTAB(5y) = " + "$"+WriteVal(Nz(rendto5),1.0);
PlotText( text1, i,  y1, colorWhite, colorRed );
text2 = "RENTAB(15y) = " + "$"+WriteVal(Nz(rendto15),1.0);
PlotText( text2, i,  y2, colorWhite, colorBlack );
}




7 comentarios:

  1. Óscar, es posible modificar el indicador para poder utilizarlo en cualquier activo?. Indices, acciones y materias primas?.
    Adjunto otro código pero algo falla. No busco un sistema sólo indicador que vea la estacionalidad por periodos para utilizarlo con opciones haciendo time spreads

    _SECTION_BEGIN("estacionalidad");
    years = Param("Years", 3, 1, 25, 1);
    newYear = Year() != Ref(Year(), 1);
    avgROC = 0;
    // Create dynamic variables for each year (excluding current)
    for (y = 1; y <= years; y++)
    {
    initialValue = IIf(newYear, ValueWhen(newYear, Close, y),ValueWhen(newYear, Close, y + 1));
    barValue = Ref(Close, -252 * y);
    runningROC = (barValue / initialValue);
    VarSet("Year" + y, runningROC);
    avgROC += runningROC;
    }

    avgROC /= years;

    Plot(avgROC*ValueWhen(newYear, Close), "Avg. "+years, colorDarkBlue, styleLine);// | styleThick | styleOwnScale);
    _SECTION_END();

    ResponderEliminar
    Respuestas
    1. El código llama a un #include donde están los multiplicadores de los futuros. Es una instrucción "switch". Al final hay que poner un valor por defecto. Si ponemos 1.0 entonces el resto de mercados que no estén en el switch les pondrá multiplicador 1 así que funcionará también con acciones.

      Eliminar
    2. Óscar, que esto se complica para mí! Cuando meto multiplicador del sp500 pongo
      //SP500_IDX , ticker de mi base de datos
      case "SP500_IDX": mul=1; tick =1; dec = 1; break;

      Pero no puedo dejar abierto para seleccionar el ticker sobre el grafico?
      Y termino el multiplicador con:

      default: mul = 1; tick = 1; dec = 1; break;
      }

      //ASIGNAMOS A LOS NOMBRES RESERVADOS
      PointValue = mul; TickSize = tick;

      Eliminar
    3. El ticker que tengas en pantalla es justo el que que está utilizando Amibroker en la variable Name()

      Eliminar
  2. Sé que hay una manera de pinchar en el gráfico y poner el inicio y fin del estudio de estacionalidad y me plotea la rentabilidad en ese tramo.
    Saludos

    ResponderEliminar
    Respuestas
    1. Para eso hay que usar la función "selectedvalue"

      Eliminar
    2. Selecvalue y meter parámetros de inicio y fin? Lo buscaré en el manual de Ami.
      Saludos
      Luis

      Eliminar

ENTRADAS POPULARES