2017-10-19 96 views
0

所以这是我的问题。 我每天有2000股的回报数据,下面是它的小样本 (s1到s8,第1天到第15天)将相似数据分组以最大化组内相关性并最小化组间相关性

我会打电话给我的数据“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 

我需要一种方法将它们分组,以使组内相关性最大化,并且组间相关性被最小化。

因此,例如,我可以将它们成两组随机如下: (S1,S2,S3,S4)和(S5,S6,S7,S8) 问题是,一些股票可能相互关联,有些可能不相关。

所以我的解决办法是:

获得相关矩阵(假设皮尔森的方法正常工作)

cor_df <- cor(df) 

熔体(扁平化)相关列表按降序排列,并删除相关系数重复和行= 1(使用重塑库)

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"]),] 

然后,我编号扁平矩阵,删除重复项(偶数编号)和行与correlat离子系数= 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] 

在此之后,我与很好地订购相关系数的数据帧的每对以降序准备如下:

> 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 

(顺便说一句我不知道为什么行号是这样无序的...任何人都可以解释吗?)

从这里,我的直觉是对顶级配对具有最高相关系数0.49223783(s7,s8),他们必须在同一组。

所以从我的cor_df_ready数据帧,我选择了与“S7”包括所有对和提取的4股出现在列表的顶部(S7,S8,S2,S1),并将它们命名为组1

然后我从我的cor_df_ready中排除了包括(s7,s8,s2,s1)在内的所有行,并重复该过程以提出第二个组(s3,s4,s5,s6)。

在这个例子中,我不必重复这个过程,因为只剩下最后一组了。

然后,我得到每个组的相关矩阵,并加入每相关系数的总和:

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

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

然后我得到各组中的每一行的平均值,以及计算出的相关矩阵的总和对于这两个组的意思,并命名为cor_sum_mean。

最后,我计算:cor_sum_mean/cor_sum

的直觉是,组内被最大化相关性将最大化cor_sum其中基团之间的最小化的相关性也将最小化cor_sum_mean。

我想得到尽可能大的cor_sum(组内相关性)和尽可能小的cor_sum_mean(组内相关性)。

使用我的方法对整个数据,我分2000股成10组,我得到了什么是

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

我知道我能得到cor_sum_mean/cor_sum到0.000542(或更小),但我只是卡住了。

我搜索谷歌,stackoverflow,交叉验证,我得到的机器学习/时间序列聚类/分类可能是我正在寻找的答案的想法。

以下两个预发布的问题似乎是有益的,但我只是开始了解数据的科学,所以我有一个很难理解他们....

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

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

任何人都可以请解释或指导我在具体寻找什么?

这是一个很长的问题......感谢您的阅读!

回答

0

使用层次聚类。

通过平均关联,您可以优化平均相关性。