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
Gracias!
JForex - Calculando correlaciones
JForex - Calculando correlaciones
- Adjuntos
-
- correlacion.txt
- cambia la extensión a .java
- (5.25 KiB) Descargado 311 veces
Re: JForex - Calculando correlaciones
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ó: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??
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ó: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??
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 foromascara 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
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."
Re: JForex - Calculando correlaciones
Gracias, ya corregí eso. Así queda la última versión buena:X-Trader escribió: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ó: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??
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ó: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??
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 foromascara 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
Saludos,
X-Trader
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
Gracias mascara, ya lo he descargado.
Buen aporte!!
Buen aporte!!
I have not failed. I've just found 10,000 ways that won't work - Thomas A. Edison
Sigueme en Twitter: @INtrader_
Sigueme en Twitter: @INtrader_
Re: JForex - Calculando correlaciones
Por nada! También me beneficio yo con las correccionesINtrader escribió:Gracias mascara, ya lo he descargado.
Buen aporte!!
P.D.: La versión buena es la que está copiada, no la descargable...
Re: JForex - Calculando correlaciones
Gracias D.
A mi me interesa bastante. Le hecho una ojeada el finde con tiempo
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!