2017-10-19 10 views
0

donc c'est mon problème. J'ai des données de retour quotidiennes de 2000 stocks, et en voici un petit échantillon (s1 à s8, jour1 à jour15)Regroupement des données similaires pour maximiser la corrélation intra-groupe et minimiser la corrélation inter-groupe

Je vais appeler mes données "df".

> df[1:15,1:8] 
      s1  s2   s3   s4  s5  s6  s7  s8 
1 -0.026410 -0.001030 -0.0027660 0.0126500 -0.030110 0.001476 -0.008271 -0.005299 
2 -0.018990 -0.013680 -0.0092050 -0.0008402 -0.002739 -0.014170 -0.006091 -0.011920 
3 0.004874 0.024140 -0.0002107 -0.0084770 -0.006825 -0.001448 -0.002724 -0.003132 
4 0.019300 -0.004649 0.0223400 0.0080200 -0.008197 -0.015270 0.004064 -0.008149 
5 0.010350 -0.010650 0.0087780 0.0059960 -0.001390 -0.006454 0.018990 0.002822 
6 0.028650 0.010490 0.0157200 -0.0004123 0.019750 -0.005902 0.004261 0.019110 
7 0.004203 -0.002682 -0.0099840 -0.0070060 -0.025670 -0.014550 -0.016700 -0.011580 
8 -0.042170 -0.019490 -0.0023140 -0.0083030 -0.018170 0.021160 -0.006864 -0.009438 
9 0.017250 0.026600 0.0031630 -0.0069090 0.035990 0.008429 0.001500 -0.011830 
10 -0.037400 -0.022370 0.0088460 0.0012690 -0.050820 -0.025300 -0.028040 -0.023790 
11 -0.091140 -0.018830 0.0052160 -0.0403000 0.001410 -0.007050 -0.024340 -0.013110 
12 -0.051620 0.004791 0.0336000 -0.0094320 -0.018320 -0.019490 -0.044080 -0.024020 
13 0.007711 0.002158 -0.0177400 0.0090470 -0.004346 -0.001562 -0.096030 0.015840 
14 0.041440 -0.001072 -0.0168400 0.0180300 -0.012980 -0.015280 0.059780 0.014730 
15 -0.042620 -0.025560 -0.0180200 -0.0115200 0.033320 -0.015150 -0.014580 -0.012710 

je besoin d'un moyen de les regrouper afin que la corrélation intra-groupe est maximisée et la corrélation inter-groupe est réduite au minimum.

Ainsi, par exemple, je peux les regrouper en deux groupes au hasard comme suit: (s1, s2, s3, s4) et (s5, s6, s7, s8) Le problème est, certains des les stocks peuvent être corrélés les uns avec les autres, et d'autres non.

Donc ma solution était de:

obtenir une matrice de corrélation (en supposant la méthode de Pearson fonctionne très bien)

cor_df <- cor(df) 

fusion (aplatir) la liste de corrélation dans l'ordre décroissant et supprimer les doublons et les lignes avec le coefficient de corrélation = 1 (utilisé reshape bibliothèque)

cor_df_melt <- melt(cor_df) 
names(cor_df_melt)[1] <- "x1" 
names(cor_df_melt)[2] <- "x2" 
names(cor_df_melt)[3] <- "corr" 
cor_df_ordered <- cor_df_melt[order(-cor_df_sample_melt["corr"]),] 

Ensuite, numérotés de la matrice aplatie, enlevé les doublons (celles numérotées paires et des rangées) avec corrélat coefficient ion = 1

cor_df_numbered <- cbind(row=c(1:nrow(cor_df_ordered)),cor_df_ordered) 
cor_df_ready <- cor_df_numbered[cor_df_numbered$row%%2==0&cor_df_numbered$corr%%2!=1,2:4] 

Après cela, ma trame de données avec des coefficients de corrélation bien ordonnées pour chaque paire dans l'ordre décroissant était prêt comme suit:

> cor_df_ready 
    x1 x2  corr 
63 s7 s8 0.49223783 
57 s1 s8 0.42518667 
50 s2 s7 0.42369762 
49 s1 s7 0.40824283 
58 s2 s8 0.40395569 
42 s2 s6 0.40394894 
54 s6 s7 0.39408677 
62 s6 s8 0.38536734 
34 s2 s5 0.36882709 
53 s5 s7 0.36066870 
45 s5 s6 0.35734278 
59 s3 s8 0.34295713 
51 s3 s7 0.34163733 
61 s5 s8 0.33264868 
9 s1 s2 0.32812763 
41 s1 s6 0.31221715 
18 s2 s3 0.30692909 
43 s3 s6 0.29390325 
33 s1 s5 0.28845243 
35 s3 s5 0.27859972 
17 s1 s3 0.25039209 
52 s4 s7 0.12989487 
60 s4 s8 0.12095196 
25 s1 s4 0.10902471 
26 s2 s4 0.09471694 
44 s4 s6 0.08039435 
36 s4 s5 0.06957264 
27 s3 s4 0.06027389 

(j'ai BTW aucune idée pourquoi le numéro de ligne De là, mon intuition était pour la paire supérieure avec le coefficient de corrélation 0.49223783 le plus élevé (s7, s8), ils devaient être dans le même groupe.

donc de mon cadre de données cor_df_ready, j'ai choisi toutes les paires avec « s7 » inclus et extrait les 4 titres qui apparaissent en haut de la liste (s7, s8, s2, s1) et leur donna le nom de groupe 1.

J'ai ensuite exclu toutes les lignes, y compris (s7, s8, s2, s1) de mon cor_df_ready, et répété le processus pour arriver au deuxième groupe (s3, s4, s5, s6).

bien dans cet exemple je n'ai pas eu à répéter le processus car il n'y avait qu'un dernier ensemble restant.

Ensuite, je suis la matrice de corrélation pour chaque groupe et ajouté à la somme de tous les coefficients de corrélation:

group1_cor <- cor(group1) 
group2_cor <- cor(group2) 

cor_sum <- sum(group1_cor) + sum(group2_cor) 

je suis la moyenne de chaque ligne de chaque groupe, et calcule la somme de la matrice de corrélation pour les deux moyens de groupe, et l'a appelé cor_sum_mean.

Enfin, je calculé pour: cor_sum_mean/cor_sum

L'intuition était, la corrélation maximisée au sein du groupe maximiserait cor_sum où la corrélation réduite au minimum entre les groupes atténuerait également cor_sum_mean. Je veux obtenir le plus grand cor_sum possible (corrélation intra-groupe) et aussi petit cor_sum_mean que possible (corrélation intra-groupe).

En utilisant ma méthode pour l'ensemble des données, je divise 2000 actions en 10 groupes et ce que je suis arrivé était

#cor_sum = 131923.1 
#cor_sum_mean = 83.1731 
#cor_sum_mean/cor_sum = 0.0006305 

Je sais que je peux obtenir le cor_sum_mean/cor_sum jusqu'à 0,000542 (ou encore plus petit), mais Je suis simplement coincé. J'ai cherché google, stackoverflow, crossvalidated, et je commençais à croire que l'apprentissage automatique/la classification/classification des séries chronologiques pourrait être la réponse que je recherche.

Les deux questions pré-affichées suivantes semblaient utiles, mais je ne commence à apprendre la science des données, donc je vais avoir du mal à les comprendre ....

https://stats.stackexchange.com/questions/9475/time-series-clustering/19042#19042

https://stats.stackexchange.com/questions/3238/time-series-clustering-in-r

Quelqu'un peut-il s'il vous plaît expliquer ou me dire ce qu'il faut rechercher en particulier?

C'était une longue question ... Merci d'avoir lu!

Répondre

0

Utilisez la classification hiérarchique.

Avec la liaison moyenne, vous optimisez la corrélation moyenne.