martes, 17 de julio de 2018

CALENDAR SPREADS en Amibroker. Y el modelo de Carver.

Un calendar Spread es comprar y abrir cortos en el mismo mercado pero distintos vencimientos. En la imagen más abajo vemos un calendar spread entre el maíz de Diciembre (comprado) y el maíz de septiembre (en corto).

El código que se anexa pinta el spread. Pero hay que tener cargados los tickers que en este ejemplo serían @CZ18 para el maíz de diciembre y @CU18 para el de septiembre.

Cuántos contratos operar? Se ha incluido una gestión de capital según el modelo de Robert Carver (del libro "Systematic Trading") en que operamos el número exacto de contratos que produce una volatilidad objetivo. En el código se ha establecido una volatilidad anualizada objetivo del 5% para toda la cartera, lo que significan 313 dólares diarios en una cuenta de 100.000 dólares.

Se asume que esto se opera con más posiciones, así que hemos establecido un ajuste por diversificación (IDM en el modelo de Robert Carver) de 2.0. Se han asumido cinco posiciones así que el peso del Calendar spread sería del 20%. Cuando todo esto se tiene en cuenta (además de la desviación estándar de los cierres y de que el multiplicador del maíz es 50) resulta que el número de contratos de spread que se operarían son 7.

Operar 7 contratos del Spread produce una volatilidad anualizada del 5% en una cuenta de 100.000 dólares. 



Haciendo la cuenta al revés se entiende mejor:

La desviación estándar del spread es de 18.68 dólares diarios. Si hacemos 7 contratos entonces es 130.8 dólares en total. Esa es la volatilidad diaria.

Como habrá más posiciones en la cartera hay que ajustar por la diversificación (la diversificación reduce la volatilidad). El factor de ajuste por diversificación es 2.0, así que la volatilidad que añadirá este spread a la cartera será de 65.4 dólares diarios.

Si la cartera tuviera 5 posiciones como esta cada una contribuirá con 65.4 dólares, así que en total serían 65.4x5 = 327 dólares. Esa es la volatilidad diaria de la cartera conjunta.

327 dólares diarios es una volatilidad anualizada de 327xraiz(256) = 5.232 dólares anuales. Eso es un 5.23% de volatilidad anualizada. El objetivo.

Este modelo de volatilidad es muy preciso, y no solo sirve para spreads. Sirve para futuros e incluso opciones. 




CÓDIGO

----------------------------------------------------------------------------------------------------------------
//-------------------------------- 
// CALENDAR SPREAD  
// Oscar G. Cagigas  
// 5 MAYO 2018 
//---------------------------------

//RELLENAR AQUÍ CÓDIGOS Y MULTIPLICADORES
mercado = "@C";  //sin la letra ni el año
mes1 = "Z"; anyo1 = "18"; mul1 = 50;
mes2 = "U"; anyo2 = "18"; mul2 = 50;

//MONEY MANAGEMENT 
//********************************************************************************************************************
Eq = 100000;
//********************************************************************************************************************

//PARAMETROS DEL FRAMEWORK DE CARVER (ver libro Systematic Trading)
tavol = 0.05; //target volatility en ttp1  
idm = 2; //instrument diversification multiplier 
iw = 0.2;  //PESO EN LA CARTERA DE ESTE SISTEMA

//CAPITAL INICIAL Y COMISIONES//  
SetOption( "initialequity", 100000 ); // starting capital     
SetOption("PriceBoundChecking",1);  
SetOption("CommissionMode", 2);  
SetOption("commissionamount",50);  //COMISIÓN INDIVIDUAL (ENTRADA O SALIDA)  
SetOption("WarningLevel", 1 );    

//CONSTRUIR LOS TICKERS
symbol1 = mercado + mes1 + anyo1;
symbol2 = mercado + mes2 + anyo2;

//CARGAMOS DATOS DEL SEGUNDO MERCADO
SetForeign( Symbol2 );
C2 = C; 
H2 = H;
L2 = L;
O2 = O;
V2 = V;
RestorePriceArrays();

//MERCADO PRINCIPAL (SYMBOL1)
SetForeign( Symbol1 );

//DETALLES DEL MERCADO PRINCIPAL, FECHAS, ETC
SetChartOptions(0,chartShowDates);     
Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", 
O, H, L, C, SelectedValue( ROC( C, 1 ) ) );       

//poner el marcador vertical donde queramos saber el ratio
if (SelectedValue(C) ) r1 = (C2*mul2)/(C*mul1);

//LA DIFERENCIA O SPREAD LA LLAMAMOS "A"//
r = 1; //En calendar spreads en ratio siempre es 1.0
A = C*mul1*r-C2*mul2;

//DESVIACION STANDARD EXPONENCIAL (Carver)    
desv_carver = sqrt( EMA( ( A-Ref(A,-1) )^2, 36 ) ) ;    
  
//----NÚMERO DE FUTUROS EN BASE AL FORECAST ANTERIOR, VOLATILIDAD Y EQUITY----    
dvt = Eq * tavol / 16; //daily volatility target    
ivv = desv_carver; //instrument value volatility  (en Spreads ya incluye el Pointvalue)  
vs = Nz(dvt / ivv);  //volatility scalar    
pos = vs * iw * idm;  //forecast de 10 siempre  
numfut = round(pos);  //el número de contratos    
MarginDeposit = 1; PositionSize = NumFut;    

//********************************************************************************************************************


//PARAMETROS DE COLOR Y ESTILO CONFIGURABLES
Color = ParamColor( "Color", colorDefault );
Style = ParamStyle( "Style", styleLine, maskPrice );

//PINTAR EL SPREAD COMO NOMINAL1*RATIO - NOMINAL2
PlotOHLC( O*mul1*r-O2*mul2, H*mul1*r-H2*mul2, L*mul1*r-L2*mul2, C*mul1*r-C2*mul2, 
"\n" + EncodeColor(colorRed) + "(" + Name()+" - "+Symbol2 + ") spread" , Color, style );
Title = Title + "\n" + EncodeColor(colorblack) + Name() + " = " + C + "; " + symbol2 + " = " + C2
+ "\n" + EncodeColor(colorGrey50) + "Mul = " + mul1 + "; " + "Mul2 = " + mul2  
+ "\n" + EncodeColor(colorblue) + "ratio = " + r1 
+ "\n" + EncodeColor(colorgreen) + "Ratio fijo = " + r
+ "\n" + EncodeColor(colorgreen) + "StDev = " +  desv_carver + "$"
+"\n"+EncodeColor(colorGrey40)+"Ref = " + WriteVal(Eq,1.0)  
+"\n"+"daily volat target = " + WriteVal(dvt,1.0)   
+"\n"+"volat scalar = " + WriteVal(vs,1.2)   
+"\n"+"inst weight = " + WriteVal(100*iw,1.0) +" %"  
+"\n"+"pos = " + WriteVal(pos,1.2) 
+"\n"+EncodeColor(colorBlue)+"NumFut = " + WriteVal(numfut,1.0) ;


//NOMBRE DEL SISTEMA EN GRANDE//
GfxSetOverlayMode(1);
GfxSelectFont("Tahoma", Status("pxheight")/22 );  //tamaño (inv)
GfxSetTextAlign( 6 );// center alignment
GfxSetTextColor( ColorRGB( 200, 200, 200 ) );
GfxSetBkMode(1); // transparent
GfxTextOut( StrRight(mercado,2) + "(" + mes1 + "/" + mes2 + ")", Status("pxwidth")/8, Status("pxheight")/2 );
//izquierda (inv) y alto.

----------------------------------------------------------------------------------------------------------------

6 comentarios:

  1. Estimado D. Oscar, antes de nada agradecerles su gran contribucion a la comunidad de trader retail, que tanto ha aportado al trading algoritmico. Por otro lado me gustaria preguntarle como afectaria a esta estrategia: el contango y backwardation de los contratos de futuros, en este caso el maiz y en caso que le afectase que solucion se podria adoptar. Gracias por su atencion.

    ResponderEliminar
  2. Hola Javier. Normalmente las materias primas almacenables suelen estar en contango porque el almacenaje tiene un coste. Por eso normalmente el contrato más lejano es más caro que el cercano. Si los precios no fluctuaran al final el contrato lejano iría bajando de precio hasta llegar al nivel del cercano. Así que se podría vender el lejano y comprar el cercano y beneficiarse del paso del tiempo. Eso es lo que llaman Carry y es una de las estrategias de largo plazo que utilizan algunos gestores. Sin embargo, estos spreads como el que muestro son estacionales y normalmente van contra el Carry; es decir, compran el lejano (en este caso diciembre) y venden el cercano (en este caso septiembre), y están basados en la evolución estacional del propio spread. Según yo lo entiendo aquí el contango o backwardation no afecta o si lo hace ya está incluido en el efecto estacional.

    ResponderEliminar
  3. Gracias por su excelente explicacion.
    Siempre es un placer escuchar sus argumentos tan didacticos.

    ResponderEliminar
  4. Buenos días, me pregunto porque no se incluye la volatilidad de cada
    contrato a la hora de calcular el ratio del spread. Sobre todo para spreads que
    no sean calendar por ejemplo oro/platino.

    ahora mismo tenemos
    r = (C2*mul2)/(C*mul1);
    según esta fórmula tendríamos más o menos 2 contratos de platino por cada 1 de oro,
    pero ¿qué sucede si el platino es el doble de volátil que el oro?
    ¿sería una posición direccional con platino? ¿no funcionaría el spread?

    no podríamos hacer algo como
    r = (desv_carver2*mul2)/(desv_carver1*mul1);

    el spread seguiría siendo A = C*mul1*r-C2*mul2; lo que cambiaríamos sería la
    forma de calcular 'r'

    ¿Puede ser que no se incluya la volatilidad de las patas porque no se podría
    comprobar la estacionalidad de un spread a través de varios años?

    Muchas gracias.

    ResponderEliminar
  5. Efectivamente la volatilidad de cada contrato debe tenerse en cuenta. Si se fija hay un comentario que pone que en calendar spreads el ratio siempre es 1.0. Aquí no hay problema ya que los multiplicadores son los mismos y la volatilidad es equivalente por ser el mismo mercado. Digamos que esta es una versión simplificada solo para calendar spreads.

    Pero si hacemos Oro/Platino entonces tenemos que fijar un ratio (p.e. 2.0) que sale del cociente de nominales, aunque puede ser elegido por el usuario en función de las necesidades de que el spread esté muy compensado o no. Esto lo veremos más adelante cuando publique un código para spreads intermercados.

    ResponderEliminar

ENTRADAS POPULARES