因为刚刚学习完PCA的分析方法,感觉上貌似可以发觉很多股票市场的特征,于是动手试一试。
但愿不要把我的分析方法成为“降维打击”。
最后数据的分析部分有点仓促
欢迎批评指正。
PCA方法,是一种从多维数据中精炼提取主要成分的方法。具体说来,我希望找到行业指数涨跌,并使用近一年的月线数据进行描述,这是我们看到的是板块轮动在月线级别描述。但是,通过PCA的主要成分提取后,我们将看道一个(行业数I,M)的矩阵,该矩阵中或许会突出的显示某几个具体行业的关系,例如:银行版块与某个行业呈现负相关,等等。
import pandas as pd
import numpy as np
from jqdata import *
list_sw_inst = get_industries(name='sw_l1')
list_inst = get_all_securities(types=['index'], date=None)[223:234]
list_inst = list_inst.append(get_all_securities(types=['index'], date=None)[1:2])
inst_code = list_inst.index.values
df = history(16, unit='22d', field='close',security_list=inst_code)
df.columns = list_inst.display_name
df = df.pct_change().sort_index(ascending = False).dropna()*100
df
display_name | 中证能源 | 中证材料 | 中证工业 | 中证可选 | 中证消费 | 中证医药 | 中证金融 | 中证信息 | 中证电信 | 中证公用 | 中证民企 | A股指数 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2019-03-22 | 7.940004 | 13.439119 | 13.089791 | 10.265754 | 13.478864 | 17.350378 | 12.180055 | 21.469452 | 14.734399 | 7.489044 | 18.168224 | 12.432133 |
2019-02-20 | 7.800795 | 9.512191 | 8.238523 | 11.583730 | 18.140163 | 13.730463 | 11.199082 | 17.360354 | 11.798375 | 5.201886 | 10.048761 | 8.905820 |
2019-01-14 | -3.643331 | -3.287487 | -0.925635 | -0.162226 | -0.901618 | -12.894519 | -3.315761 | -2.821597 | 0.111133 | 1.124026 | -3.332875 | -2.251158 |
2018-12-11 | -5.709016 | -1.730581 | 2.832286 | -1.042596 | 4.011799 | -3.252002 | -0.415202 | 0.134072 | 0.092864 | 2.551563 | 1.062556 | -0.190332 |
2018-11-09 | -9.295204 | -8.602502 | -4.311614 | -6.732543 | -11.561922 | -4.820497 | 0.864218 | -3.204947 | -1.967537 | -4.248236 | -4.289541 | -4.659880 |
2018-10-10 | 9.325048 | -2.974908 | -0.945492 | -2.763233 | 0.667153 | -5.354084 | 0.221778 | -11.140349 | -11.445113 | -0.189866 | -4.756764 | 0.023827 |
2018-08-31 | 2.012526 | -6.390889 | -5.353774 | -9.054609 | -8.436062 | -5.961504 | 0.651820 | -3.980503 | 3.820148 | -4.553895 | -6.527609 | -3.520901 |
2018-08-01 | -0.567944 | 4.314367 | 0.741848 | -3.223587 | -2.141814 | -7.007006 | 4.003825 | -0.925219 | 7.150530 | 5.951640 | -2.755316 | 1.769409 |
2018-07-02 | -5.997144 | -8.421514 | -10.588715 | -7.135612 | -6.611597 | -5.967551 | -9.601337 | -8.656142 | -19.787739 | -7.929385 | -10.211807 | -8.750659 |
2018-05-30 | -0.761080 | -3.001733 | -3.844518 | 2.253995 | 7.800698 | 7.796943 | -4.844720 | -4.208956 | -4.276768 | 1.566122 | -1.956460 | -1.087756 |
2018-04-26 | -4.069942 | -2.051289 | -0.997040 | -6.065973 | -0.774984 | 2.235666 | -4.366490 | -0.269361 | -0.065271 | -4.676149 | 0.294770 | -2.470056 |
2018-03-23 | -4.362683 | -4.209144 | 0.417723 | -2.268276 | -4.021007 | 7.993376 | -3.343539 | 5.058767 | -2.154805 | 2.498916 | 2.173010 | -1.451096 |
2018-02-14 | -5.984156 | -3.452585 | -7.797266 | -4.583612 | -9.077741 | -6.922975 | -6.351672 | -8.531694 | -9.328090 | -6.268775 | -8.999347 | -6.199311 |
2018-01-15 | 8.810050 | 3.483354 | -1.393256 | 5.309426 | 10.857910 | 2.490353 | 5.525422 | -4.076279 | -6.861662 | -1.147644 | -1.257582 | 3.259069 |
2017-12-13 | -3.325115 | -3.734080 | -4.764252 | -4.941853 | -1.456863 | -2.433876 | 0.090588 | -6.821924 | -5.411441 | -2.880996 | -6.197114 | -4.198169 |
数据df表示各个板块在最近的12个月中的涨跌轮动情况,最右边一列附上整个A股指数的涨跌
#下面开始进行PCA分析
#首先计算协方差矩阵S,然后计算eigenvalue
S = df.cov().values
evalue,evactor = np.linalg.eigh(S)
ev = evalue / evalue.sum()
for i in range(12):
print(-i,ev[-i:].sum())
0 1.0 -1 0.7591959537535696 -2 0.8600023322742836 -3 0.9261398690298226 -4 0.952687316946254 -5 0.9662109208323336 -6 0.9779216733417028 -7 0.9851006305827936 -8 0.9919192332157581 -9 0.9971606934053021 -10 0.9995686073006775 -11 0.999928396324449
从输出数据我们发现, 后3个egenvalue就可以对数据进行92%的描述, 后4个数据就可以对数据进行95%的描述 我选择后4个数据。
usefulv = evactor[:,-4:].T
rdf = pd.DataFrame(usefulv,columns=df.columns)
(rdf*100).round(2)
display_name | 中证能源 | 中证材料 | 中证工业 | 中证可选 | 中证消费 | 中证医药 | 中证金融 | 中证信息 | 中证电信 | 中证公用 | 中证民企 | A股指数 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | -54.66 | 5.87 | 14.03 | 31.65 | 41.54 | -40.26 | -35.30 | -0.57 | -5.15 | 33.55 | 3.75 | -4.39 |
1 | -37.98 | -18.68 | -8.72 | 0.62 | -2.29 | 67.47 | -34.05 | 28.84 | -28.51 | -15.38 | 17.65 | -14.92 |
2 | 41.86 | 7.60 | -10.35 | 25.48 | 49.67 | 16.18 | -3.01 | -32.62 | -58.74 | -5.70 | -10.80 | 5.73 |
3 | 18.63 | 27.04 | 26.29 | 25.79 | 34.68 | 32.91 | 24.41 | 39.36 | 33.29 | 17.93 | 32.82 | 25.07 |
该数据的解读分4个部分,即数据的四行,分别代表小跌、大跌、小涨、大涨时各个板块的表现,可以发线一下几个特点:
本社区仅针对特定人员开放
查看需注册登录并通过风险意识测评
5秒后跳转登录页面...
移动端课程