李汶瑾
摘 要:本文基于數(shù)值分析軟件MATLAB采用層次聚類法對股票進(jìn)行分池,以便指導(dǎo)對強(qiáng)盈利能力對象的投資。通過獲取大智慧中的財(cái)務(wù)數(shù)據(jù),以深證A股為例驗(yàn)證了該方法的可行性和有效性。通過分析不同聚類數(shù)目的聚類結(jié)果簇層次結(jié)構(gòu)圖和簇間相似結(jié)構(gòu)圖,發(fā)現(xiàn)聚成8類時(shí)可以較好的對各類股票進(jìn)行區(qū)分。該分析方法對于建立量化投資模型具有較大的實(shí)用價(jià)值。
關(guān)鍵詞:層次聚類;股票分池;量化投資
一、引言
最近數(shù)十年,量化投資已經(jīng)成為全球資本市場發(fā)展的一個熱點(diǎn),成為繼基本面分析和技術(shù)面分析之后的又一主流方法。由于在運(yùn)用量化投資的過程中只利用公開數(shù)據(jù),通過數(shù)學(xué)建模挖掘出公開數(shù)據(jù)中的隱藏信息,從而使得杜絕內(nèi)幕消息、戰(zhàn)勝市場成為可能[1]。
聚類是數(shù)據(jù)分析和量化投資中的一個重要手段和方法論,通過聚類可以對大量的潛在投資對象進(jìn)行批量評估,從中篩選出盈利能力強(qiáng)的對象進(jìn)行投資。由于MATLAB具有強(qiáng)大的數(shù)據(jù)分析能力,近年來常被用于股票分析[2]和風(fēng)險(xiǎn)管理[3]等方面。其統(tǒng)計(jì)與機(jī)器學(xué)習(xí)工具箱可以方便地進(jìn)行聚類分析,因此可將其用于股票分池。
二、數(shù)據(jù)獲取
本文以深證A股為例介紹股票分池的方法,通過MATLAB可以從大智慧中獲取深證A股的最新財(cái)務(wù)數(shù)據(jù)。安裝大智慧后將財(cái)務(wù)數(shù)據(jù)下載到本地,然后運(yùn)行如下MATLAB程序?qū)⒃紨?shù)據(jù)導(dǎo)出為Excel格式:
%%將數(shù)據(jù)讀入matlab
file=′D:\\dzh365\\Download\\FIN\\full_sz.FIN′; %大智慧的安裝路徑‘D:\\dzh365
filesize=dir(file)
filesize=filesize.bytes
k=1847;%公司數(shù)目
fileid=fopen(file,′rb′);
fseek(fileid,8,′bof′);
for i=1:k
stkfin(i).code=sprintf(′%s′,fread(fileid,8, ′*char′));
fseek(fileid,4,′cof′);
a=fread(fileid,3,′int32′);
b=fread(fileid,48,′float32′);
stkfin(i).fin=[a;b];
fseek(fileid,8,′cof′);
end
fclose(fileid);
%%將數(shù)據(jù)轉(zhuǎn)化成excel形式
fValue=zeros(k,51);
for i=1:k
fCode(i,1)={stkfin(i).code};
fValue(i,1:51)=stkfin(i).fin′;
end
%將數(shù)據(jù)保存到excel
xlswrite(′StockFinanceA.xlsx′,fCode,′sheet1′,[′A2:A′ num2str(i+1)]);
xlswrite(′StockFinanceA.xlsx′,fValue,′sheet1′,[′B2:AZ′ num2str(i+1)]);
%% end
獲取的財(cái)務(wù)數(shù)據(jù)描述如表1所示。
三、聚類分池
表1從48個指標(biāo)(列號5-52)對股票的財(cái)務(wù)狀況進(jìn)行了描述,若轉(zhuǎn)化為數(shù)據(jù)點(diǎn)則為48維,人們無法直接對上千個股票的高維數(shù)據(jù)進(jìn)行觀察和判斷,因此需要通過聚類算法對數(shù)據(jù)進(jìn)行分析,發(fā)掘出現(xiàn)有數(shù)據(jù)中的隱藏信息,從而挑選出升值空間大的一類股票進(jìn)行投資。層次聚類是通過將數(shù)據(jù)集劃分為若干類并構(gòu)成一個對應(yīng)的樹以進(jìn)行聚類,根據(jù)層次形成的方向,層次聚類可以分為兩類:凝聚型聚類算法和分裂型聚類算法。凝聚型算法為自底而上的策略,首先將每個數(shù)據(jù)點(diǎn)作為一個單獨(dú)的簇,然后不斷合并它們構(gòu)成更大的簇,直到所有數(shù)據(jù)點(diǎn)都在同一個簇中,或者到達(dá)某個終止條件。分裂型算法則與凝聚型算法相反,將所有數(shù)據(jù)點(diǎn)歸于一個簇中,然后逐步細(xì)分為多個小簇。本文擬采用凝聚型算法,通過MATLAB統(tǒng)計(jì)與機(jī)器學(xué)習(xí)工具箱的內(nèi)置函數(shù)進(jìn)行編程,代碼如下:
%%讀取數(shù)據(jù)
clc, clear all, close all
X0= xlsread(′StockFinance.xlsx′,′Sheet1′,′E2:N1848′);
%%數(shù)據(jù)歸一化
[rn,cn]=size(X0);
X=zeros(rn,cn);
for k=1:cn
%基于均值方差的離群點(diǎn)數(shù)據(jù)歸一化
xm=mean(X0(:,k));
xs=std(X0(:,k));
for j=1:rn
if X0(j,k)>xm+2*xs
X(j,k)=1;
elseif X0(j,k) X(j,k)=0; else X(j,k)=(X0(j,k)-(xm-2*xs))/(4*xs); end end end xlswrite(′norm_data.xlsx′, X); %%層次聚類 numClust = 3; %假設(shè)聚成3類 dist_h = ′spearman′; link = ′weighted′; hidx = clusterdata(X, ′maxclust′, numClust, ′distance′ , dist_h, ′linkage′, link);
%繪制聚類效果圖
figure
F2=plot3(X(hidx==1,1), X(hidx==1,2),X(hidx==1,3),′r*′, …
X(hidx==2,1), X(hidx==2,2),X(hidx==2,3), ′bo′, …
X(hidx==3,1), X(hidx==3,2),X(hidx==3,3), ′kd′);
set(gca,′linewidth′,2);
grid on
set(F2,′linewidth′,2, ′MarkerSize′,8);
set(gca,′linewidth′,2);
xlabel(′每股收益′,′fontsize′,12);
ylabel(′每股凈資產(chǎn)′,′fontsize′,12);
zlabel(′凈資產(chǎn)收益率′,′fontsize′,12);
title(′層次聚類方法聚類結(jié)果′)
%評估各類別的相關(guān)程度
dist_metric_h = pdist(X,dist_h);
dd_h = squareform(dist_metric_h);
[~,idx]= sort(hidx);
dd_h = dd_h(idx,idx);
figure
imagesc(dd_h)
set(gca,′linewidth′,2);
xlabel(′數(shù)據(jù)點(diǎn)′, ′fontsize′,12)
ylabel(′數(shù)據(jù)點(diǎn)′, ′fontsize′,12)
title(′層次聚類結(jié)果相關(guān)程度圖′)
ylabel(colorbar,[′距離矩陣:′, dist_h])
axis square
%計(jì)算同型相關(guān)系數(shù)
Z = linkage(dist_metric_h,link);
cpcc = cophenet(Z,dist_metric_h);
disp(′同表象相關(guān)系數(shù):′)
disp(cpcc)
%層次結(jié)構(gòu)圖
set(0,′RecursionLimit′,5000)
figure
dendrogram(Z)
set(gca,′linewidth′,2);
set(0,′RecursionLimit′,500)
xlabel(′數(shù)據(jù)點(diǎn)′, ′fontsize′,12)
ylabel (′距離′, ′fontsize′,12)
title([′CPCC:′ sprintf(′%0.4f′,cpcc)])
運(yùn)行程序后得到同表象相關(guān)系數(shù)為0.4371,這個值描述了聚類樹信息和原數(shù)據(jù)距離之間的相關(guān)性,值越大越好。簇的層次結(jié)構(gòu)圖如圖1所示。
從圖1可見,聚成6類時(shí)距離跨度比較大,聚類效果可能較好。為驗(yàn)證這一點(diǎn),圖2比較了分別聚類為3類、5類、6類和8類時(shí)的簇間相似程度圖。可見聚為6類時(shí)各類別的輪廓更清晰和直觀,類間的區(qū)分更明顯。因此,選擇聚類數(shù)目為6類。
48個指標(biāo)對于聚類結(jié)果都會產(chǎn)生影響,但每個指標(biāo)的影響程度有差異。由于無法對超過三維的數(shù)據(jù)點(diǎn)在三維直角坐標(biāo)系中進(jìn)行作圖,因此下面只選取3個指標(biāo)做出聚類結(jié)果效果圖,以此觀察不同指標(biāo)在聚類中所起的作用大小。圖3和圖4為聚類效果圖,分別選取了不同的Z軸指標(biāo)。通過比較兩圖可以發(fā)現(xiàn),圖4中股東權(quán)益比的維度上可以產(chǎn)生更為顯著的分層,聚類的效果更清晰。
四、結(jié)論
本文基于MATLAB采集了大智慧深證A股的財(cái)務(wù)數(shù)據(jù),通過層次聚類對股票進(jìn)行分池,該算法可以清楚地提供股票的層級結(jié)構(gòu),對于指導(dǎo)中長線股票投資具有較大的參考價(jià)值。(作者單位:西南財(cái)經(jīng)大學(xué)會計(jì)學(xué)院)
參考文獻(xiàn):
[1] 卓金武,周英.量化投資——數(shù)據(jù)挖掘技術(shù)與實(shí)踐(MATLAB版)[M].北京:電子工業(yè)出版社,2015.
[2] 段新生.MATLAB股票股價(jià)模型研究[J].中國管理信息化,2007(10):78-81.
[3] 基于PCA-BP的PPP基礎(chǔ)設(shè)施項(xiàng)目風(fēng)險(xiǎn)評價(jià)研究[J].會計(jì)之友,2016(7):56-59.