让相关性划分出群组
层次聚类从每对资产之间的距离开始。相关系数不是距离,但 dᵢⱼ=√(1/2(1-ρᵢⱼ)) 是:ρ=1 时为 0,ρ=0 时约为 0.71,ρ=-1 时为 1,并且满足三角不等式。squareform(d, checks=False) 把方阵变成 scipy.cluster.hierarchy.linkage(y, method='average') 所需的、含 n(n-1)/2 个距离的压缩列表。结果 Z 是一棵写成 n-1 行 [左, 右, 高度, 大小] 的树:每一步合并最近的两个组,两组之间的距离是其成员之间距离的平均。
有两个函数读取这棵树。hierarchy.leaves_list(Z) 给出叶子的顺序,相似的资产相邻,从而把相关矩阵重排成可见的块。hierarchy.fcluster(Z, k, criterion='maxclust') 把树切成至多 k 组,并为每个资产返回一个标签。对十二只股票和 ETF 在 1,500 天上的数据,完全不给行业信息,也会得到五组:科技(AAPL、MSFT、NVDA)、银行(JPM、BAC、GS)、能源(XOM、CVX)、医疗(JNJ、PFE)和债券(TLT、IEF)。hierarchy.cophenet(Z, y) 衡量树的忠实度:它把原始距离与树所隐含的距离做相关,这里为 0.96。接近 1 说明树是很好的概括,偏低则说明结构并不真正是层次的。
- 相关系数不是距离:用 √(1/2(1-ρ)),再用
squareform(..., checks=False)。 leaves_list排序,fcluster切分:前者给出相邻关系,后者给出分组。- 共表型相关系数接近 1 说明树保留了距离;相信分组之前先检查它。
实验:评分内容
- 相关距离15 分
- 平均连接树15 分
- 叶子顺序15 分
- 切分树20 分
- 共表型相关系数15 分
- 十二资产研究20 分