【PCA】上证50主成分分析
上一篇文章,对PCA的理论基础做了介绍,本文讲一个实例,对上证50成分股进行主成分分析,然后对结果进行展示和说明。
一.获取成分股的历史价格
首先引入所需要的库。
然后通过tushare获取成分股的历史价格,需要注意的是,sz50是上证50指数的代码。获取指数是为了与主成分做对比分析。
第三步要对数据进行处理,如果某天有的股票无价格,则删除这天的数据,然后进行归一化,最后把指数单独拿出来。
二.进行主成分分析
分解成分的过程很简单,调用sklearn的PCA类进行fit即可。输出成分的个数为50,按照上文的结论,就应该是50,因为还没有降维,只是进行了坐标变换。接着输出前面10个成分的方差看看,可以看出,成分已经按照方差从大到小排好了顺序。
然后寻找占总方差比例超过95%的几个成分,经试验可知前8个成分的占总方差的比例刚好超过95%,所以可以确定前8个成分就是主成分。这样就可以将数据维度从50降为8了。
三.结果展示与分析
我们试试将50个成分股降为1维当做主成分指数,同原始指数进行对比一下,看看效果。其中黄色曲线是主成分指数,蓝色是原始指数,可以看出趋势是一样的。
再试一下将成分股降为5维,然后根据方差加权平均作为主成分指数,并同原始指数进行对比。可以看出,5维相对1维,拟合效果没有明显提升,好像还有些下降。
下面将不同时间段的拟合效果进行一下展示分析,使用了散点图和曲线图两种方式。为了在散点图中加入时间维度,需要对时间进行一个处理。
以下散点图的横坐标是降维1维主成分指数,纵坐标是原始指数,颜色是时间维度。
如果拟合效果好,则散点应该在直线x=y附近,偏离条直线越多,拟合效果越差。
红线是将散点做线性回归得到的,散点与红线的距离可体现两种指数之间关系是否紧密。
可以看出,从19年3月份之前的数据,同红线距离较近,之后的数据,距离较远。说明两种指数的紧密程度发生了变化。
再用曲线图画出两种指数的差值和时间的关系,横坐标是时间,纵坐标是差值。如果纵坐标接近0,则拟合较好,否则拟合较差。
可以看出,19年3月份前,差值在0附近稳定波动;从19年3月份开始,出现波动变大且不稳定,最后又趋于稳定。
看完1维指数,再看下5维指数。情况类似,只不过是在19年5月份以后,同x=y直线和回归直线的偏离都更大了,且偏离程度趋于稳定。说明主成分指数同原始指数的关系发生了变化。
19年5月份以后的点,已经可以算作离群点了,所以可以对其回归出一条新的曲线。
二者关系变化的原因,应该是19年5月份美国再次发动贸易战,影响到了我国股市。这导致50成分股的主成分发生了变化,可能加入了贸易战因素的主成分。但是又由于历史数据较多,导致这些新的成分权重过小,所以主成分指数和原始指数发生了一定偏离,二者关系不再那么紧密。(程序在:https://github.com/ququcai/PCA)
参考资料
[1] Yves Hilpsch. Python for Finance: Analyze Big Financial Data
往期回顾
【定价】二叉树(CRR)欧式/美式期权定价的原理及Python实现
知乎专栏:AI和金融模型
原创作品,未标明作者不得转载。