jueves, 4 de junio de 2020

EL SISTEMA "AGORERO"

El sistema "Agorero" opera el SP500 abriendo posiciones cortas cuando hay las siguientes señales bajistas:
  • Baja volatilidad
  • Nuevos mínimos del NYSE marcando peligro
  • Divergencias bajistas con la línea ascenso-descenso
En las simulación alcanza un 94% de aciertos aunque se trata de resultados optimizados. Este sistema se presentó por primera vez en el informe del 4 de noviembre de 2017 que se anexa a continuación:


Si está interesado en sistemas de trading le recomendamos la suscripción al servicio de Informes Onda4 donde se publicó este sistema (entre muchos). A continuación mostramos la curva de capital resultante de la optimización y que aparece en el informe:



















A continuación se incluye el código del sistema AGORERO. Como de costumbre el sistema incluye un dimensionamiento basado en el modelo de volatilidad de Robert Carver que se puede encontrar en su libro "Systematic Trading" y cuyo código Amibroker se encuentra en este Blog. 

Hay que tener en cuenta que este código del sistema Agorero utiliza los ticker de IQFeed para coger los datos de los Nuevos Mínimos del NYSE (FINL.Z) y también carga los datos de la línea Ascenso-Descenso (IIAA.Z y IIAD.Z respectivamente). 

También llama al include "futuros.afl" que tiene los multiplicadores de los futuros y datos adicionales como el tick y el número de decimales. El include se puede encontrar en otras entradas de este blog utilizando el buscador.

ADVERTENCIA:  Este es un sistema optimizado que se proporciona para fines didácticos y que no se recomienda operar en trading real. Salvo excepciones abrir posiciones cortas en los índices suele salir mal debido a su sesgo alcista de largo plazo.

//--------------------------------------
// SISTEMA AGORERO (SP500 SOLO CORTO)
// OSCAR G. CAGIGAS - 28/10/2017
//--------------------------------------

//-------VARIABLES OPTMIZABLES---------------
nstop = 6;
OptimizerSetEngine("spso");
per = Optimize("per",16,6,16,2);
len = Optimize("len",12,3,20,2);
salida = Optimize("salida",18,5,20,2);
volatTH = Optimize("VolatTH",0.8,0.5,0.8,0.1);


//------------------MONEY MANAGEMENT-----------------------------------------

//PARAMETROS DE GESTION DE CAPITAL
Eq = 100000;
tavol = 0.20;  //target volatility %
idm = 2; //instrument diversification multiplier
iw = 0.25;  //instrument weight

//CAPITAL INICIAL Y COMISIONES//  
SetOption( "initialequity", 100000 ); // starting capital     
SetOption("PriceBoundChecking",1);  
SetOption("CommissionMode", 2);  
SetOption("commissionamount",10);  //COMISIÓN INDIVIDUAL (ENTRADA O SALIDA)  
SetOption("WarningLevel", 1 );   
  
//DIMENSIONAMIENTO//   
#include <futuros.afl>   
decim = 1 + dec/10; //decimales correctos
    
//DESVIACION STANDARD EXPONENCIAL    
desv_carver = sqrt( EMA( ( C-Ref(C,-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 * PointValue; //instrument value volatility    
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;    


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


//++++++++++ SISTEMA DE TRADING +++++++++++++

//solo cortos//
Buy = Sell = 0;

//DEFINICIONES//
volat = StDev(log(C/Ref(C,-1)),10)/StDev(log(C/Ref(C,-1)),100);
bajaVolat = volat < volatTH;
lineaAD = MA( Foreign("IIAA.Z","C") - Foreign("IIAD.Z","C"),20);
divergAD = LinRegSlope(C,per) > 0 AND LinRegSlope(lineaAD,per) < 0;

//new Lows NYSE
SetForeign("FINL.Z"); 
peligro = Sum( C > 40, 5)  >= 5;
RestorePriceArrays();

//sistema//
Short = setupb = bajaVolat AND divergAD AND peligro;
Cover = StochK(len,1) < salida;

//PANIC STOP//
STOP = Nz(nstop * desv_carver);   
ApplyStop(stopTypeLoss,stopModePoint, STOP,1,0);
Equity(1,0);

//remove excesive signals// 
Buy = ExRem(Buy,Sell OR short); 
Sell = ExRem(Sell,Buy); 
Short = ExRem(Short,Cover OR buy);
Cover = ExRem(Cover,Short);

largo = Flip(Buy,Sell);
corto = Flip(Short,Cover);

//SALIDA GRAFICA//
Color = IIf(setupb,colorBlue,0);
Plot(C,"PRICE",color,styleBar|styleThick, Null, Null, 0,0,1);    
PlotShapes(IIf(Buy,shapeUpArrow,shapeNone),colorGreen,0,L,-15);    
PlotShapes(IIf(Buy,shapehollowCircle,shapeNone),colorGreen,0,BuyPrice,0);    
PlotShapes(IIf(Sell AND NOT Corto,shapeDownArrow,shapeNone),colorRed,0,H,-15);    
PlotShapes(IIf(Sell AND NOT Corto,shapeHollowCircle,shapeNone),colorRed,0,SellPrice,0);    
PlotShapes(IIf(Short,shapeDownArrow,shapeNone),colorBrown,0,H,-15);    
PlotShapes(IIf(Short,shapeHollowCircle,shapeNone),colorBrown,0,ShortPrice,0);    
PlotShapes(IIf(Cover AND NOT Largo,shapeUpArrow,shapeNone),colorDarkGreen,0,L,-15);    
PlotShapes(IIf(Cover AND NOT Largo,shapeHollowCircle,shapeNone),colorDarkGreen,0,CoverPrice,0);    
   
//PLOTTEXT//    
dist = ATR(10);     
for( i = 0; i < BarCount; i++ )     
{     
if( Buy[i] ) PlotText( "Long "+NumToStr(ValueWhen(Buy[i],BuyPrice[i]),1.2), i, L[ i ]-dist[i], colorGreen );     
if( Sell[i] AND NOT Short[i]) PlotText( "Exit " + NumToStr(ValueWhen(Sell[i],SellPrice[i]),1.2), i, H[ i ]+dist[i], colorRed );     
if( Short[i] ) PlotText( "Short "+NumToStr(ValueWhen(Short[i],ShortPrice[i]),1.2), i, H[ i ]+dist[i], colorBrown );     
if( Cover[i] AND NOT Buy[i]) PlotText( "Cover " + NumToStr(ValueWhen(Cover[i],CoverPrice[i]),1.2), i, L[ i ]-dist[i], colorBlack );     
}     
    
//CHART//    
color = colorLightBlue;
Plot(C,"Last",color,styleBar|styleThick,Null,Null,0,0,1);     
stopprice = ValueWhen(Short,ShortPrice+stop);   
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 ) ) )       
+"\n"+ FullName()+"\n"+EncodeColor(colorBlue)+"SIST SP500"        
+"\n"+EncodeColor(colorGrey40)+"STDEV = "+WriteVal(desv_carver,1.6)+" Pts ; x"   + WriteVal(PointValue,1.0)
+"\n"+EncodeColor(colorRed)+"VOLAT = $"+WriteVal(ivv,1.2)   
+"\n"+ EncodeColor(colorRed)+"SL = " + WriteVal(stopprice,1.2)     
+" ; RISK = "+WriteVal(IIf(largo, C-stopprice,stopprice-C)*PointValue*NumFut,1.0);


//NOMBRE DEL SISTEMA EN GRANDE//
GfxSetOverlayMode(1);
GfxSelectFont("Tahoma", Status("pxheight")/16 );
GfxSetTextAlign( 6 );// center alignment
GfxSetTextColor( ColorRGB( 200, 200, 200 ) );
GfxSetBkMode(1); // transparent
GfxTextOut( "SP", Status("pxwidth")/24, Status("pxheight")/2.6 );







3 comentarios:

  1. Muchas gracias D. Oscar, de nuevo nos sorprende, no solo con su generosidad al abrir el conocimiento a los traders retail, sino tambien de sus contenidos de una calidad inmensa y de una fuente inagotable de enseñanzas que nos hace abrir nuestras mentes y buscar el objetivo de ser UN TRADER en mayusculas como usted ha conseguido ser a lo largo de todos estos años.

    ResponderEliminar
  2. Muchas gracias por este comentario tan amable. Saludos

    ResponderEliminar
  3. Con permiso del maestro propongo mi versión, muy diferente pq no utilizo las mismas condiciones de entrada, y lo utilizo en ETF's inversos cuando el DAX hace un cruce bajista. En este caso la salida es mejorable pq depende del numero de barras desde la entrada. sólo así consigo un retorno periódico, sin ganar mucho. La caída de marzo de 2020 no la consigo enganchar bien, pero como digo casi cada año consigo una operación, casi todas con beneficios, número de ganadores del 80%.

    Los ETF's utilizados son 2INVE, DES2, DBPD y BX4. En XBRMIB no funciona tan bien, me imagino que la bolsa italiana va descorrelacionada con el DAX, que es desde donde se toma la señal.

    //--------------------------------------
    // SISTEMA AGORERO modificado (tomado como base para ser utilizado en para DBPD, ETF inverso del DAX)
    // Las variables que nos dan la señal son un cruce bajista del DAX y la volatilidad, según la desviación estandar, superior a 1.
    // // OSCAR G. CAGIGAS - 28/10/2017 //
    //--------------------------------------

    //-------VARIABLES OPTMIZABLES---------------
    //variables para las condiciones de compra
    vv = 1;//Optimize("vv",1,1,3,0.1);
    la = 135;//Optimize("la",90,50,200,5);//135
    sa = 25;//Optimize("sa",20,5,45,5);//25
    //variables para las condiciones de la salida
    BSB = 1;//Optimize("BSB",1,1,22,1);//Bars Since Buy
    SL = 15;//Optimize("SL",10,1,15,1);//Stop Loss

    //CAPITAL INICIAL//
    SetOption( "initialequity", 50000 ); // starting capital

    //++++++++++ SISTEMA DE TRADING +++++++++++++

    // Primera condicion, DaxBajista.
    DAX=Foreign("DAX","C");
    DB = Cross(MA(DAX,la),MA(DAX,sa));

    //Segunda condición, volatilidad mayor de un nivel predefinido.
    volat = StDev(log(C/Ref(C,-1)),10)/StDev(log(C/Ref(C,-1)),100);

    RestorePriceArrays();

    //sistema//

    Buy = volat>vv AND DB;


    Sell = BarsSince(Buy) == BSB;

    ApplyStop (0,1, SL,1,False, 0);

    //remove excesive signals//

    Buy = ExRem(Buy,Sell);
    Sell = ExRem(Sell,Buy);


    ResponderEliminar

ENTRADAS POPULARES