使用Python - PCA分析進(jìn)行金融數(shù)據(jù)分析
1.pandas的一個(gè)技巧
apply() 和applymap()是DataFrame數(shù)據(jù)類型的函數(shù),map()是Series數(shù)據(jù)類型的函數(shù)。apply()的操作目標(biāo)DataFrame的一列或許一行數(shù)據(jù), applymap()是element-wise的,作用于每個(gè)DataFrame的每個(gè)數(shù)據(jù)。 map()也是element-wise的,對Series中的每個(gè)數(shù)據(jù)調(diào)用一次函數(shù)。
2.PCA分解德國DAX30指數(shù)
DAX30指數(shù)有三十個(gè)股票,聽起來不多的樣子,其實(shí)還是挺多的,我們很有必要對其進(jìn)行主成分分析,然后找出最重要的幾個(gè)股票。想必PCA的原理大家應(yīng)該都是知道,說白了就是在一個(gè)回歸中找到影響最大的那幾個(gè),當(dāng)然,數(shù)學(xué)原理就涉及矩陣分解,什么SVD呀。
先上點(diǎn)代碼
- import?pandas?as?pd
- import?pandas.io.data?as?web
- import?numpy?as?np
- np.random.seed(1000)
- import?scipy.stats?as?scs
- import?statsmodels.api?as?sm
- import?matplotlib?as?mpl
- import?matplotlib.pyplot?as?plt
- from?sklearn.decomposition?import?KernelPCA#導(dǎo)入機(jī)器學(xué)習(xí)的PCA包
- symbols?=?['ADS.DE','ALV.DE','BAS.DE','BAYN.DE','BEI.DE','BMW.DE','CBK.DE','CON.DE','DAI.DE',
- ????????????'DB1.DE','DBK.DE','DPW.DE','DTE.DE','EOAN.DE','FME.DE','FRE.DE','HEI.DE','HEN3.DE',
- ????????????'IFX.DE','LHA.DE','LIN.DE','LXS.DE','MRK.DE','MUV2.DE','RWE.DE','SAP.DE','SDF.DE',
- ????????????'SIE.DE','TKA.DE','VOW3.DE','^GDAXI']#DAX30指數(shù)各個(gè)股票的代碼以及德國30指數(shù)代碼,共31個(gè)數(shù)據(jù)列
- data?=?pd.DataFrame()
- for?sym?in?symbols:#獲取數(shù)據(jù)
- ????data[sym]?=?web.DataReader(sym,data_source?=?'yahoo')['Close']
- data?=?data.dropna()#丟棄缺失數(shù)據(jù)
- dax?=?pd.DataFrame(data.pop('^GDAXI'))#將指數(shù)數(shù)據(jù)單獨(dú)拿出來,采用pop在獲取的時(shí)候已經(jīng)從原來的地方刪除了這一列數(shù)據(jù)了
- scale_function?=?lambda?x:(x-x.mean())/x.std()
- pca?=?KernelPCA().fit(data.apply(scale_function))#這里用到了apply函數(shù)。做PCA前,我們要對數(shù)據(jù)做標(biāo)準(zhǔn)化
- get_we?=?lambda?x:x/x.sum()
- print?get_we(pca.lambdas_)[:10]
這樣,你就可以看到前十個(gè)股票對DAX30指數(shù)的貢獻(xiàn)量了。
- pca?=?KernelPCA(n_components?=?1).fit(data.apply(scale_function))
- dax['PCA_1']?=pca.transform(data)
- dax.apply(scale_function).plot(figsize?=?(8,4))
- pca?=?KernelPCA(n_components?=?5).fit(data.apply(scale_function))
- weights?=?get_we(pca.lambdas_)
- dax['PCA_5']?=np.dot(pca.transform(data),weights)

這里,我們采用只用第一個(gè)成分去擬合以及前五個(gè)成分去擬合,發(fā)現(xiàn)效果好的出奇。這樣我們就做到了降維的工作了。我們再來展開看一下PCA的效果。
- plt.figure(figsize?=?(8,4))
- plt.scatter(dax['PCA_5'],dax['^GDAXI'],color?=?'r')
這里,我們把PCA后的值與原始值進(jìn)行散點(diǎn)圖的繪制,

咱們看到,全體效果還是不錯(cuò)的,但是很顯然,兩頭和中心老是有點(diǎn)疑問,所以,假如咱們要進(jìn)步,咱們能夠在中心分段進(jìn)行PCA,這樣的話,效果應(yīng)該會更加好。