JForex - Calculando correlaciones

Foro dedicado a la plataforma de trading de divisas de Dukascopy en la que la programación de estrategias se realiza mediante Java.
Responder
Avatar de Usuario
mascara
Mensajes: 344
Registrado: 18 Oct 2007 23:15

JForex - Calculando correlaciones

Mensaje por mascara »

Hola,

El archivo que adjunto es un programa para JForex que calcula la correlación entre dos pares. No tengo ni idea de matemáticas ni estadísticas, así que he ido tirando de wikipedia y similares para enterarme de cómo era el cálculo. Espero que esté bien porque comparando con lo que sacan las webs:
http://es.investing.com/forex-tools/cal ... de-divisas
https://www.x-trader.net/herramientas/c ... forex.html
Muchas veces no coincide, aunque hay algún ejemplo que sí, por lo que imagino que es por diferencias en los precios, porque si el cálculo estuviera mal sería difícil que coincidiera ni un sólo caso ( supongo... ).

Total, Si alguien que sepa tiene tiempo/ganas/etc y lo prueba para confirmar que está bien o corregirme...
Pregunta: ¿Tiene sentido calcular la correlación de tres pares en lugar de dos ( tres o los que sean )? O eso siempre es de dos en dos??

Es que quiero ir haciendo/recopilando codigo reutilizable para hacer una librería.

Nota: Cuando se ejecuta, por ejemplo, con los parámetros por defecto que son EURUSD, GBPUSD, diario, 10 periodos, precio CLOSE. Saca esto:

13:16:11 Correlación: -0.7199
13:16:11 Desviaciones EUR/USD: 0.002903 - GBP/USD: 0.006079
13:16:11 Covarianza -0.000013
13:16:11 Medias EUR/USD: 1.3783 - GBP/USD: 1.6592
13:16:11 Vela 9. EUR/USD: 2014/04/02 02:00:00 1.3783 - GBP/USD: 2014/04/02 02:00:00 1.6642
13:16:11 Vela 8. EUR/USD: 2014/04/01 02:00:00 1.3793 - GBP/USD: 2014/04/01 02:00:00 1.6630
13:16:11 Vela 7. EUR/USD: 2014/03/31 02:00:00 1.3774 - GBP/USD: 2014/03/31 02:00:00 1.6664
13:16:11 Vela 6. EUR/USD: 2014/03/30 01:00:00 1.3753 - GBP/USD: 2014/03/30 01:00:00 1.6646
13:16:11 Vela 5. EUR/USD: 2014/03/28 01:00:00 1.3749 - GBP/USD: 2014/03/28 01:00:00 1.6636
13:16:11 Vela 4. EUR/USD: 2014/03/27 01:00:00 1.3741 - GBP/USD: 2014/03/27 01:00:00 1.6607
13:16:11 Vela 3. EUR/USD: 2014/03/26 01:00:00 1.3786 - GBP/USD: 2014/03/26 01:00:00 1.6578
13:16:11 Vela 2. EUR/USD: 2014/03/25 01:00:00 1.3820 - GBP/USD: 2014/03/25 01:00:00 1.6532
13:16:11 Vela 1. EUR/USD: 2014/03/24 01:00:00 1.3836 - GBP/USD: 2014/03/24 01:00:00 1.6497
13:16:11 Vela 0. EUR/USD: 2014/03/23 01:00:00 1.3797 - GBP/USD: 2014/03/23 01:00:00 1.6493

Una duda, si es diario, la primera vela a considerar sería la de hoy, aunque no haya terminado el día todavía, y por tanto la vela está en curso, o tendría que empezar en la vela de ayer??

Nota para el jefe: Es un rollo tener que cambiar la extensión del .java... si total el .java no puede hacer ninguna maldad por si mismo podrías cambiar esa restricción :-D

Gracias!
Adjuntos
correlacion.txt
cambia la extensión a .java
(5.25 KiB) Descargado 302 veces
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12781
Registrado: 06 Sep 2004 10:18
Contactar:

Re: JForex - Calculando correlaciones

Mensaje por X-Trader »

mascara escribió:Pregunta: ¿Tiene sentido calcular la correlación de tres pares en lugar de dos ( tres o los que sean )? O eso siempre es de dos en dos??
No se puede calcular la correlación entre tres pares, al menos con el coeficiente de correlación de Pearson, ya que está pensado para dos variables basándose en su covarianza.
mascara escribió:Una duda, si es diario, la primera vela a considerar sería la de hoy, aunque no haya terminado el día todavía, y por tanto la vela está en curso, o tendría que empezar en la vela de ayer??
Normalmente se cogen velas cerradas, de lo contrario los movimientos intradía del precio pueden afectar al calculo. Resumiendo, mejor coge datos hasta el día anterior.
mascara escribió:Nota para el jefe: Es un rollo tener que cambiar la extensión del .java... si total el .java no puede hacer ninguna maldad por si mismo podrías cambiar esa restricción :-D
Pues la verdad es que no es por nada en particular (manías supongo...), normalmente si es código lo habitual en este tipo de foros es coger todo el código, pegarlo y ponerle una etiqueta Code usando el editor del foro ;)

Saludos,
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Avatar de Usuario
mascara
Mensajes: 344
Registrado: 18 Oct 2007 23:15

Re: JForex - Calculando correlaciones

Mensaje por mascara »

X-Trader escribió:
mascara escribió:Pregunta: ¿Tiene sentido calcular la correlación de tres pares en lugar de dos ( tres o los que sean )? O eso siempre es de dos en dos??
No se puede calcular la correlación entre tres pares, al menos con el coeficiente de correlación de Pearson, ya que está pensado para dos variables basándose en su covarianza.
mascara escribió:Una duda, si es diario, la primera vela a considerar sería la de hoy, aunque no haya terminado el día todavía, y por tanto la vela está en curso, o tendría que empezar en la vela de ayer??
Normalmente se cogen velas cerradas, de lo contrario los movimientos intradía del precio pueden afectar al calculo. Resumiendo, mejor coge datos hasta el día anterior.
mascara escribió:Nota para el jefe: Es un rollo tener que cambiar la extensión del .java... si total el .java no puede hacer ninguna maldad por si mismo podrías cambiar esa restricción :-D
Pues la verdad es que no es por nada en particular (manías supongo...), normalmente si es código lo habitual en este tipo de foros es coger todo el código, pegarlo y ponerle una etiqueta Code usando el editor del foro ;)

Saludos,
X-Trader
Gracias, ya corregí eso. Así queda la última versión buena:

Código: Seleccionar todo

//Cálculo de correlación entre dos pares
//Ref.:
//http://www.vitutor.com/estadistica/bi/coeficiente_correlacion.html
//http://www.vitutor.com/estadistica/bi/covarianza.html
//
package jforex;

import java.util.*;

import com.dukascopy.api.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class correlacion implements IStrategy {
    enum Precios { OPEN, CLOSE, HIGH, LOW };

    @Configurable("Par 1")      public Instrument eInst1 = Instrument.EURUSD;
    @Configurable("Par 2")      public Instrument eInst2 = Instrument.GBPUSD;
    @Configurable("Periodo")    public Period ePeriodo = Period.DAILY;
    @Configurable("Intervalos") public int eIntervalos = 10;
    @Configurable("OfferSide")  public OfferSide eOfferSide = OfferSide.BID;
    @Configurable("Filter")     public Filter eFilter = Filter.WEEKENDS;
    @Configurable("Precio")     public Precios ePrecio = Precios.CLOSE;
    private IEngine engine;
    private IConsole console;
    private IHistory history;
    private IContext context;
    private IIndicators indicators;
    private IUserInterface userInterface;
    DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");   
     
    public void onStart(IContext context) throws JFException {
        this.engine = context.getEngine();
        this.console = context.getConsole();
        this.history = context.getHistory();
        this.context = context;
        this.indicators = context.getIndicators();
        this.userInterface = context.getUserInterface();
        
        Calendar cal = Calendar.getInstance();
        double[] medias = new double[2];
        double[] desviaciones = new double[2];        
        double[] precios = new double[2];
        double covarianza = 0;
        double correlacion = 0;
        List<List<IBar>> barras = new ArrayList();
      
        barras.add( history.getBars(eInst1, ePeriodo, eOfferSide, eFilter, eIntervalos+1, history.getBarStart(ePeriodo, cal.getTimeInMillis()), 0) );
        barras.add( history.getBars(eInst2, ePeriodo, eOfferSide, eFilter, eIntervalos+1, history.getBarStart(ePeriodo, cal.getTimeInMillis()), 0) );
        //borramos la última vela, ya que será la vela en curso y sólo queremos velas cerradas
        //(hemos cogido una vela de mas (eIntervalos+1) porque es más fácil así que calcular
        //el tiempo desde el que queremos empezar ya que habría que restar a history.getBarStart X milisegundos según el periodo usado...
        barras.get(0).remove(barras.get(0).size()-1);
        barras.get(1).remove(barras.get(1).size()-1);
          
        if (barras.get(0).size() != barras.get(1).size()){
            console.getErr().println("Error número de barras distintos");
            context.stop();  
        }
        if (barras.get(0).size() != eIntervalos){
            console.getErr().println("Error número de barras");
            context.stop();  
        }
        
        for(int i = 0;i<barras.get(0).size(); i++){
           switch(ePrecio){
           case OPEN:  precios[0] = barras.get(0).get(i).getOpen();
                       precios[1] = barras.get(1).get(i).getOpen();
                       break;
           case CLOSE: precios[0] = barras.get(0).get(i).getClose();
                       precios[1] = barras.get(1).get(i).getClose();
                       break;
           case HIGH:  precios[0] = barras.get(0).get(i).getHigh();
                       precios[1] = barras.get(1).get(i).getHigh();
                       break;
           case LOW:   precios[0] = barras.get(0).get(i).getLow();
                       precios[1] = barras.get(1).get(i).getLow();
                       break;
           }                                                                  
            console.getOut().println(String.format("Vela %s. %s: %s %.4f - %s: %s %.4f",i+1, 
                                                   eInst1.toString(), dateFormat.format(barras.get(0).get(i).getTime()), precios[0], 
                                                   eInst2.toString(), dateFormat.format(barras.get(1).get(i).getTime()), precios[1]));
            medias[0]       += precios[0];
            medias[1]       += precios[1];
            covarianza      += ( precios[0] * precios[1] );
            desviaciones[0] += ( precios[0] * precios[0] );
            desviaciones[1] += ( precios[1] * precios[1] );
        }
        medias[0] = medias[0] / barras.get(0).size();
        medias[1] = medias[1] / barras.get(1).size();
        covarianza = ( covarianza/barras.get(0).size() ) - ( medias[0] * medias[1] );
       
        console.getOut().println(String.format("Medias %s: %.4f - %s: %.4f", eInst1.toString(), medias[0], eInst2.toString(), medias[1]));
        console.getOut().println(String.format("Covarianza  %f" ,covarianza));
        
        desviaciones[0] = Math.sqrt( ( desviaciones[0]/barras.get(0).size() ) - (medias[0]*medias[0]) );
        desviaciones[1] = Math.sqrt( ( desviaciones[1]/barras.get(1).size() ) - (medias[1]*medias[1]) );
        
        console.getOut().println(String.format("Desviaciones %s: %f - %s: %f", eInst1.toString(), desviaciones[0], eInst2.toString(), desviaciones[1]));
        
        correlacion = covarianza / ( desviaciones[0] * desviaciones[1] );
         
        console.getOut().println(String.format("Correlación: %.4f", correlacion)); 
        
        context.stop();  
    }

    public void onAccount(IAccount account) throws JFException {
    }

    public void onMessage(IMessage message) throws JFException {
    }

    public void onStop() throws JFException {
    }

    public void onTick(Instrument instrument, ITick tick) throws JFException {
    }
    
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
        
        
    }
}
Avatar de Usuario
INtrader
Mensajes: 419
Registrado: 05 Nov 2009 13:54
Contactar:

Re: JForex - Calculando correlaciones

Mensaje por INtrader »

Gracias mascara, ya lo he descargado.

Buen aporte!!
I have not failed. I've just found 10,000 ways that won't work - Thomas A. Edison
Sigueme en Twitter: @INtrader_ :smt006
Avatar de Usuario
mascara
Mensajes: 344
Registrado: 18 Oct 2007 23:15

Re: JForex - Calculando correlaciones

Mensaje por mascara »

INtrader escribió:Gracias mascara, ya lo he descargado.

Buen aporte!!
Por nada! También me beneficio yo con las correcciones :-D :-D

P.D.: La versión buena es la que está copiada, no la descargable...

Avatar de Usuario
daykoku
Mensajes: 438
Registrado: 28 Dic 2010 21:20
Ubicación: Tenerife

Re: JForex - Calculando correlaciones

Mensaje por daykoku »

Gracias D.

A mi me interesa bastante. Le hecho una ojeada el finde con tiempo
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “JForex”