Pregunta

Estoy seguro de que es un error obvio con mi lógica, pero parece que no puedo resolver lo que estoy haciendo mal. Simplemente, tengo una lista de códigos de seguridad, quiero calcular la correlación entre cada combinación de códigos de seguridad. Mi código es el siguiente:

private void crossCorr(ArrayList<String> codes, HashMap<String, Stock> stockMap){

    // iterate through the codes list and get all the cross correlations:

    Iterator<String> itr1 = codes.iterator();
    while(itr1.hasNext()){
        String code1 = itr1.next();
System.out.println("  -----  " +code1);
        Iterator<String> itr2 = codes.iterator();
        ArrayList<Double> corrs = new ArrayList<Double>();
        HashMap<String, Double> codeCorr = new HashMap<String, Double>();
        String code2="";
        double corr=-2;
        while(itr2.hasNext()){
            code2 = itr2.next();
            Maths calcs = new Maths();      
            corr = calcs.getCorrelation(stockMap.get(code1).getRorHistory(), stockMap.get(code2).getRorHistory());
            corrs.add(corr);    // we order this list and then use this ordered list
                                // to find the codes for the stocks with the highest
                                // correlation for any given stock
            codeCorr.put(code2, corr);
            System.out.println(code1+" - "+code2+" - Correlation is "+corr);
        }
        orderCorrs(6, codeCorr, corrs, code1);
    }

}

El resultado que obtengo es -

----- GOOG
GOOG - GOOG - La correlación es 1.0000000000000002
GOOG - YHOO - La correlación es 0.6986623807707519
GOOG - MSFT - La correlación es 0.7275411317567286
GOOG - CSCO - La correlación es 0.8122979333663799
GOOG - AAPL - La correlación es 0.8217785260604609
GOOG - ADBE - La correlación es 0.6102679356472099
GOOG - DISH - La correlación es 0.644852624453125
GOOG - NSOL - La correlación es 0.11600387177879072
GOOG - SBUX - La correlación es 0.6694306410719489
GOOG - PSFT - La correlación es -0.09921822861087544
GOOG - XOM - La correlación es 0.6728272039489009
GOOG - WMT - La correlación es 0.4004364090315347
GOOG - IBM - La correlación es 0.7559988282095168
GOOG - JPM - La correlación es 0.7085525367336528
GOOG - ADN - La correlación es 0.13628949379947575
GOOG - HPQ - La correlación es 0.7819350018750656
GOOG - KO - La correlación es 0.5700932682157461
GOOG - VZ - La correlación es 0.737881573641585
GOOG - INTC - La correlación es 0.7654127298771953
GOOG - SPY - La correlación es 0.8042488406758052
GOOG - PEP - La correlación es 0.6297924741882344
GOOG - WFC - La correlación es 0.5064491351161948
GOOG - ABT - La correlación es 0.238752389446595
GOOG - QCOM - La correlación es 0.726356709262025
GOOG - COP - La correlación es 0.570604981251932
GOOG - MCD - La correlación es 0.5434872575410538

Pero nunca consigo

YHOO - GOOG - La correlación es ... etc. etc.

Estoy seguro de que esto es un simple error y por alguna razón no lo estoy recogiendo.

Sé que estoy haciendo los cálculos de correlación dos veces, lo arreglaré una vez que haga que esta parte funcione según lo previsto.

Avíseme si necesito proporcionar más información.

¿Fue útil?

Solución

Una aplicación de prueba rápida que elimina las referencias al código que no conocemos funciona bien para mí.

¿Es posible que algo esté lanzando una excepción no verificada que no estás manejando? Si pudieras publicar un programa corto pero completo que demuestre el problema, eso sería de gran ayuda. Tome una copia de su proyecto completo y simplemente elimine los bits (por ejemplo, datos de codificación y valores de retorno) hasta que no pueda eliminar nada más sin que el problema desaparezca. En ese momento es posible que haya encontrado el problema por sí mismo, por supuesto.

Por cierto, si está utilizando Java 1.5 o superior, es más sencillo usar un bucle extendido que usar explícitamente un iterador. Lo harías:

for (String code1 : codes) {
    // ...
    for (String code2 : codes) {
        // ...
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top