请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  数理科学 帖子:3364712 新帖:0

分析近1年的板块联动关系——PCA降维分析

SCSDV_d发表于:5 月 10 日 08:30回复(1)

因为刚刚学习完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
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
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)
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
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个部分,即数据的四行,分别代表小跌、大跌、小涨、大涨时各个板块的表现,可以发线一下几个特点:

第一,消费板块跟给力,一直都强与大盘¶

第二,医药版块也不错,但是在大盘弱势的时候,也拖过大盘的后退¶

第三,能源版块基本在拖大盘的后退,只有大盘弱强势时,他就牛逼¶

第四,电信、信息版块波动很大!¶

全部回复

0/140

达人推荐

量化课程

    移动端课程