Página 1 de 1

JForex - Calculando correlaciones

Publicado: 02 Abr 2014 15:36
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!

Re: JForex - Calculando correlaciones

Publicado: 02 Abr 2014 16:09
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

Re: JForex - Calculando correlaciones

Publicado: 02 Abr 2014 16:47
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 {
        
        
    }
}

Re: JForex - Calculando correlaciones

Publicado: 03 Abr 2014 17:02
por INtrader
Gracias mascara, ya lo he descargado.

Buen aporte!!

Re: JForex - Calculando correlaciones

Publicado: 03 Abr 2014 20:12
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...

Re: JForex - Calculando correlaciones

Publicado: 03 Abr 2014 21:48
por daykoku
Gracias D.

A mi me interesa bastante. Le hecho una ojeada el finde con tiempo