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!