Python金融數(shù)據(jù)分析與挖掘(微課版) 課件 第10章 股票價(jià)格形態(tài)聚類(lèi)與收益分析_第1頁(yè)
Python金融數(shù)據(jù)分析與挖掘(微課版) 課件 第10章 股票價(jià)格形態(tài)聚類(lèi)與收益分析_第2頁(yè)
Python金融數(shù)據(jù)分析與挖掘(微課版) 課件 第10章 股票價(jià)格形態(tài)聚類(lèi)與收益分析_第3頁(yè)
Python金融數(shù)據(jù)分析與挖掘(微課版) 課件 第10章 股票價(jià)格形態(tài)聚類(lèi)與收益分析_第4頁(yè)
Python金融數(shù)據(jù)分析與挖掘(微課版) 課件 第10章 股票價(jià)格形態(tài)聚類(lèi)與收益分析_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第10章

股票價(jià)格形態(tài)聚類(lèi)與收益分析關(guān)鍵價(jià)格點(diǎn)概念及提取算法基于關(guān)鍵價(jià)格點(diǎn)的形態(tài)特征表示基于關(guān)鍵價(jià)格點(diǎn)的形態(tài)特征提取關(guān)鍵價(jià)格點(diǎn)概念及提取算法第10章

股票價(jià)格走勢(shì)主要由一些關(guān)鍵價(jià)格點(diǎn)構(gòu)成,因此我們選擇其關(guān)鍵的價(jià)格點(diǎn)作為聚類(lèi)特征即可。構(gòu)成的序列模式,值越大,xi成為關(guān)鍵點(diǎn)的可能性就越大。關(guān)鍵價(jià)格點(diǎn)提取算法如下:輸入:原始價(jià)格序列x=(x1,x2,……,xp),提取關(guān)鍵點(diǎn)個(gè)數(shù)num。輸出:關(guān)鍵價(jià)格點(diǎn)序列、對(duì)應(yīng)下標(biāo)序列。step1:對(duì)x2,…,x(p-1)按公式計(jì)算其與相鄰兩個(gè)價(jià)格點(diǎn)均值的絕對(duì)值大小,并按從大到小

進(jìn)行排序,取排名前num-2對(duì)應(yīng)的價(jià)格點(diǎn),記為L(zhǎng)1,對(duì)應(yīng)的下標(biāo)序列記為S1。step2:x1,xp對(duì)應(yīng)的價(jià)格點(diǎn)記為L(zhǎng)2,對(duì)應(yīng)的下標(biāo)序列記為S2。step3:記L=L1∪L2,S=S1∪S2,并按S從小到大進(jìn)行排序,則L即為關(guān)鍵價(jià)格點(diǎn)序列,

S即為對(duì)應(yīng)的下標(biāo)序列。關(guān)鍵價(jià)格點(diǎn)概念及提取算法第10章

defget_keydata(x,num):

importpandasaspd

importnumpyasnp

#計(jì)算x2,…,x(p-1)各點(diǎn)減去相鄰兩點(diǎn)平均值的絕對(duì)值

d=abs(x[1:len(x)-1].values-(x[0:len(x)-2].values+x[2:len(x)].values)/2)

#以d為值,對(duì)應(yīng)的下標(biāo)為index,構(gòu)建序列,并按降序排序

Sd=pd.Series(d,index=np.arange(1,len(x)-1)).sort_values(ascending=False)

L1=Sd[0:num-2]

L2=pd.Series([x[0],x[len(x)-1]],index=[0,len(x)-1])

L=L1.append(L2)

keydata=x[L.index].sort_index()

returnkeydata函數(shù)輸入?yún)?shù)為價(jià)格數(shù)組X、提取的關(guān)鍵點(diǎn)個(gè)數(shù)num,返回值為關(guān)鍵點(diǎn)序列(index為下標(biāo),value為對(duì)應(yīng)的關(guān)鍵價(jià)格點(diǎn))關(guān)鍵點(diǎn)提取算法函數(shù)如下(函數(shù)定義在df.py文件中)關(guān)鍵價(jià)格點(diǎn)概念及提取算法第10章

股票代碼為600000的股票2017年6月1日—2017年8月31日的收盤(pán)價(jià)數(shù)據(jù),提取10個(gè)關(guān)鍵點(diǎn),并在同一坐標(biāo)軸上繪制原始價(jià)格點(diǎn)與關(guān)鍵價(jià)格點(diǎn)擬合圖,importpandasaspdimportdfimportmatplotlib.pyplotaspltdata=pd.read_excel('DA.xlsx')I1=data['Trddt'].values>='2017-06-01'I2=data['Trddt'].values=<'2017-08-31'I=I1&I2data1=data.iloc[I,:]#提取代碼600000的收盤(pán)價(jià)dt=data1.loc[data1['Stkcd']==600000,['Clsprc']]['Clsprc']#收盤(pán)價(jià)序列的index重排,從0開(kāi)始dt=pd.Series(dt.values,index=range(len(dt)))keydata=df.get_keydata(dt,10)plt.plot(dt.index,dt.values)plt.plot(keydata.index,keydata.values,'r*--')關(guān)鍵價(jià)格點(diǎn)(keydata.values)為:[12.9212.5312.8613.7613.5513.4513.6713.4412.4712.71]對(duì)應(yīng)的下標(biāo)(keydata.index)為:[0,27,29,32,33,36,37,44,60,65]基于關(guān)鍵價(jià)格點(diǎn)的形態(tài)特征表示第10章

關(guān)鍵價(jià)格點(diǎn)的提取降低了維度,但是直接用價(jià)格點(diǎn)進(jìn)行聚類(lèi)還是存在較大的誤差,因此我們需要對(duì)關(guān)鍵價(jià)格點(diǎn)的走勢(shì)情況進(jìn)行特征化表示,采用兩個(gè)關(guān)鍵價(jià)格點(diǎn)之間連線(xiàn)的斜率確定其漲跌情況,即特征化表示為兩個(gè)關(guān)鍵點(diǎn)連線(xiàn)之間的夾角

的tan值:其中p1和p2分別表示前后兩個(gè)關(guān)鍵點(diǎn),x1和x2分別為關(guān)鍵點(diǎn)對(duì)應(yīng)的下標(biāo)。漲跌幅的劃分標(biāo)準(zhǔn)如下:上漲幅度大:

tan值>0.5上漲幅度較大:

tan值介于0.2~0.5上漲:

tan值介于0.1~0.2平緩:

tan值介于?0.1~0.1下跌:

tan值介于?0.2~?0.1下跌幅度較大:

tan值介于?0.5~?0.2下跌幅度大:

tan值<?0.5分別記為:7、6、5、4、3、2、1基于關(guān)鍵價(jià)格點(diǎn)的形態(tài)特征表示第10章

特征化表示函數(shù)如下(函數(shù)也定義在df.py文件中)defget_tz(keydata):

importnumpyasnp

y1=keydata.values[1:]

y2=keydata.values[0:-1]

x1=keydata.index[1:]

x2=keydata.index[0:-1]

#計(jì)算tan值

tan=list((y2-y1)/(x2-x1))

T=np.array(tan)

I7=T>0.5

i1=T>0.2

i2=T<=0.5

I6=i1&i2

i1=T>0.1

i2=T<=0.2

I5=i1&i2

i1=T>-0.1

i2=T<=0.1

I4=i1&i2i1=T>-0.2i2=T<=-0.1I3=i1&i2i1=T>=-0.5i2=T<=-0.2I2=i1&i2I1=T<-0.5T[I1]=1T[I2]=2T[I3]=3T[I4]=4T[I5]=5T[I6]=6T[I7]=7returnT函數(shù)輸入?yún)?shù)為關(guān)鍵點(diǎn)序列,返回結(jié)果為特征化數(shù)組:T=df.get_tz(keydata)print(T)可以看到,前面所示關(guān)鍵點(diǎn)價(jià)格走勢(shì)圖其特征化表示為:[4.5.6.2.4.6.4.4.4.]基于關(guān)鍵價(jià)格點(diǎn)的形態(tài)特征提取第10章

根據(jù)第8章中基于總體規(guī)模與投資效率指標(biāo)的綜合評(píng)價(jià)方法,獲取2016年排名前400的股票作為研究樣本,并提取其交易數(shù)據(jù)區(qū)間在2017年5月1日—2017年7月31日的股票關(guān)鍵價(jià)格點(diǎn)和形態(tài)特征。首先基于總體規(guī)模與投資效率指標(biāo)的綜合評(píng)價(jià)方法,獲取2016年排名前400的股票,包括其股票代碼和股票簡(jiǎn)稱(chēng)。importpandasaspdimportfundta=pd.read_excel('ddata.xlsx')r=fun.Fr(dta,'2016')c=r[0][0:400]cn=r[1][0:400]code=list(c.index)#將股票代碼轉(zhuǎn)化為列表的形式基于關(guān)鍵價(jià)格點(diǎn)的形態(tài)特征提取第10章

其次確定在2017年5月1日—2017年7月31日之間的交易所實(shí)際交易天數(shù)Mtd=pd.read_excel('交易日歷數(shù)據(jù)表.xlsx')I1=td['Clddt'].values>='2017-05-01'I2=td['Clddt'].values<='2017-07-31'I=I1&I2ddt=td.loc[I,['Clddt']]M=len(ddt)基于關(guān)鍵價(jià)格點(diǎn)的形態(tài)特征提取第10章

最后我們計(jì)算400只股票樣本的關(guān)鍵價(jià)格點(diǎn)數(shù)據(jù)和對(duì)應(yīng)的下標(biāo),并根據(jù)關(guān)鍵價(jià)格點(diǎn)和對(duì)應(yīng)下標(biāo)數(shù)據(jù)計(jì)算形態(tài)特征,這里需要說(shuō)明的是如果存在股票交易天數(shù)不足M天,則做剔除處理。最終得到股票形態(tài)特征數(shù)據(jù)Data、關(guān)鍵價(jià)格點(diǎn)數(shù)據(jù)KeyData、關(guān)鍵價(jià)格點(diǎn)數(shù)據(jù)對(duì)應(yīng)的序號(hào)KeyData_index。其中關(guān)鍵價(jià)格點(diǎn)數(shù)據(jù)KeyData已做極差化處理,即數(shù)據(jù)標(biāo)準(zhǔn)化為[0,1]之間。第10章

股票價(jià)格形態(tài)聚類(lèi)與收益分析K-最頻繁值聚類(lèi)算法基于K-最頻繁值聚類(lèi)算法的股票價(jià)格形態(tài)聚類(lèi)類(lèi)平均收益率的計(jì)算K-最頻繁值聚類(lèi)算法第10章

K-均值聚類(lèi)算法主要適用于數(shù)值特征數(shù)據(jù),而本章中提取的股票價(jià)格形態(tài)特征數(shù)據(jù)是經(jīng)過(guò)離散化的離散變量(名義變量),因此經(jīng)典的K-均值聚類(lèi)算法不再適用。本節(jié)借鑒K-均值聚類(lèi)算法的思想,給出K-最頻繁值聚類(lèi)算法,該算法與K-均值聚類(lèi)算法的不同之處主要體現(xiàn)在距離度量和類(lèi)中心的更新方法上,其中距離度量函數(shù)采用海明距離,類(lèi)中心的更新方法則選擇類(lèi)樣本特征向量分量出現(xiàn)最多的值(最頻繁值,經(jīng)典的K-均值聚類(lèi)算法采用的是平均值)作為類(lèi)中心特征向量的分量。K-最頻繁值聚類(lèi)算法第10章

輸入:特征數(shù)據(jù)集,聚類(lèi)個(gè)數(shù)K。輸出:特征數(shù)據(jù)集及其類(lèi)標(biāo)簽。Step1:隨機(jī)初始化K個(gè)聚類(lèi)中心,即K個(gè)類(lèi)中心向量。Step2:對(duì)每個(gè)樣本,計(jì)算其與各個(gè)類(lèi)中心向量的距離,并將該樣本指派給距離最小的類(lèi),

這里的距離采用海明距離,其計(jì)算公式如下:K-最頻繁值聚類(lèi)算法:Step3:更新每個(gè)類(lèi)的中心向量,更新的方法為取該類(lèi)所有樣本的特征向量的最頻繁值。Step4:直到各個(gè)類(lèi)的中心向量不再發(fā)生變化為止,并輸出類(lèi)標(biāo)簽。Python中沒(méi)有現(xiàn)成的函數(shù)可以調(diào)用,故本節(jié)給出其函數(shù)的具體定義。這里僅介紹基本結(jié)構(gòu)defK_mean(data,knum):#輸入:data--聚類(lèi)特征數(shù)據(jù)集,要求為數(shù)據(jù)結(jié)構(gòu)要求為numpy數(shù)值數(shù)組#輸入:knum--聚類(lèi)個(gè)數(shù)#返回值為類(lèi)別標(biāo)簽列基于K-最頻繁值聚類(lèi)算法的股票價(jià)格形態(tài)聚類(lèi)第10章

利用K-最頻繁值聚類(lèi)算法對(duì)股票價(jià)格形態(tài)進(jìn)行聚類(lèi),輸入為股票形態(tài)特征數(shù)據(jù)集Data,輸出為每個(gè)股票代碼的聚類(lèi)結(jié)果.為了后續(xù)使用的方便,對(duì)形態(tài)特征數(shù)據(jù)Data、關(guān)鍵價(jià)格點(diǎn)數(shù)據(jù)KeyData、關(guān)鍵點(diǎn)價(jià)格數(shù)據(jù)對(duì)應(yīng)的序號(hào)數(shù)據(jù)KeyData_index,都在數(shù)據(jù)集的最后加上一列,即聚類(lèi)結(jié)果列。添加聚類(lèi)結(jié)果列后,數(shù)據(jù)集分別記為:Data_c、KeyData_c、KeyData_index_cimportkmean#導(dǎo)入自定義的K最頻繁值聚類(lèi)算法c=kmean.K_mean(Data[:,1:],20)#調(diào)用K最頻繁值聚類(lèi)算法,聚為20個(gè)類(lèi),并返回結(jié)果cKeyData_c=np.hstack((KeyData,c.reshape(len(c),1)))KeyData_index_c=np.hstack((KeyData_index,c.reshape(len(c),1)))Data_c=np.hstack((Data,c.reshape(len(c),1))類(lèi)平均收益率的計(jì)算第10章

根據(jù)聚類(lèi)結(jié)果,對(duì)每一類(lèi)股票計(jì)算該類(lèi)股票的平均收益率,持有期為2017年8月1日—2017年8月31日,即考察未來(lái)一個(gè)月的平均收益率。也就是說(shuō),這種形態(tài)出現(xiàn)之后,未來(lái)一個(gè)月的市場(chǎng)表現(xiàn)如何。第10章

股票價(jià)格形態(tài)聚類(lèi)與收益分析函數(shù)定義及使用方法訓(xùn)練樣本與預(yù)測(cè)樣本的構(gòu)建量化投資策略設(shè)計(jì)函數(shù)定義及使用方法第10章

將以上介紹的股票價(jià)格形態(tài)特征提取定義為函數(shù)FR1defFR1(DA,t_trd1,t_trd2,num):

#輸入:

#DA--2017年股票交易數(shù)據(jù)

#t_trd1--聚類(lèi)數(shù)據(jù)區(qū)間開(kāi)始日期

#t_trd2--聚類(lèi)數(shù)據(jù)區(qū)間結(jié)束日期

#num--基于總體規(guī)模與投資效率指標(biāo)的綜合評(píng)價(jià)方法提取樣本個(gè)數(shù)

#輸出:

#Data--形態(tài)特征數(shù)據(jù)

#KeyData--關(guān)鍵價(jià)格點(diǎn)數(shù)據(jù)

#KeyData_index--關(guān)鍵價(jià)格點(diǎn)對(duì)應(yīng)序號(hào)函數(shù)定義及使用方法第10章

將以上介紹的形態(tài)特征聚類(lèi)與收益率計(jì)算定義為函數(shù)FR2defFR2(DA,Data,KeyData,KeyData_index,s_trd1,s_trd2,class_num):

#輸入:

#DA--2017年股票交易數(shù)據(jù)

#Data--形態(tài)特征數(shù)據(jù)

#KeyData--關(guān)鍵價(jià)格點(diǎn)數(shù)據(jù)

#KeyData_index--關(guān)鍵價(jià)格點(diǎn)對(duì)應(yīng)序號(hào)

#s_trd1--收益率計(jì)算持有期開(kāi)始日期

#s_trd2--收益率計(jì)算持有期結(jié)束日期

#class_num--聚類(lèi)個(gè)數(shù)

#輸出:

#Data_c--形態(tài)特征數(shù)據(jù)+聚類(lèi)結(jié)果列

#KeyData_c--關(guān)鍵價(jià)格點(diǎn)數(shù)據(jù)+聚類(lèi)結(jié)果列

#KeyData_index_c--關(guān)鍵價(jià)格點(diǎn)對(duì)應(yīng)序號(hào)+聚類(lèi)結(jié)果列

#D--每只股票代碼、所屬聚類(lèi)類(lèi)別、收益率組成的數(shù)據(jù)框

#list_cr--每類(lèi)股票的總收益訓(xùn)練樣本與預(yù)測(cè)樣本的構(gòu)建第10章

選用2017年5月1日—2017年7月31日和2017年6月1日—2017年8月31日兩個(gè)計(jì)算周期的交易數(shù)據(jù)提取股票價(jià)格形態(tài)特征進(jìn)行聚類(lèi),并分別以2017年8月1日—2017年8月31日和2017年9月1日—2017年9月30日兩個(gè)持有期計(jì)算每個(gè)類(lèi)別的平均收益率,如果類(lèi)平均收益率排名前5,則該類(lèi)中所有股票記為+1類(lèi),否則記為?1類(lèi),并以此構(gòu)建訓(xùn)練樣本。importpandasaspdDA=pd.read_excel('DA.xlsx')R1=FR1(DA,'2017-05-01','2017-07-31',400)R2=FR2(DA,R1[0],R1[1],R1[2],'2017-08-01','2017-08-31',20)dt1=R2[0]

#2017年5月1日至2017年7月31日的股票價(jià)格形態(tài)特征數(shù)據(jù)+聚類(lèi)結(jié)果列cr1=pd.Series(R2[4])#對(duì)應(yīng)每類(lèi)的平均收益率crr=cr1.sort_values(ascending=False)#對(duì)類(lèi)平均收益率序列cr1按降序排序cr=list(crr.index)

#取對(duì)應(yīng)的類(lèi)編號(hào)(排序后的數(shù)據(jù))foriinrange(len(crr)):

#類(lèi)平均收益率排名前5的類(lèi)中所有股票標(biāo)記為1

ifi<5:

dt1[dt1[:,len(dt1[0,:])-1]==cr[i],len(dt1[0,:])-1]=1

#(聚類(lèi)結(jié)果列變?yōu)橐蜃兞?1)dt1[dt1[:,len(dt1[0,:])-1]!=1,len(dt1[0,:])-1]=-1

#(聚類(lèi)結(jié)果列變?yōu)橐蜃兞?1)訓(xùn)練樣本與預(yù)測(cè)樣本的構(gòu)建第10章

R1=FR1(DA,'2017-06-01','2017-08-31',400)R2=FR2(DA,R1[0],R1[1],R1[2],'2017-09-01','2017-09-30',20)dt2=R2[0]

#2017年6月1日至2017年8月31日的股票價(jià)格形態(tài)特征數(shù)據(jù)+聚類(lèi)結(jié)果列cr2=pd.Series(R2[4])crr=cr2.sort_values(ascending=False)cr=list(crr.index)foriinrange(len(crr)):ifi<5:dt2[dt2[:,len(dt2[0,:])-1]==cr[i],len(dt2[0,:])-1]=1

#(聚類(lèi)結(jié)果列變?yōu)橐蜃兞?1)dt2[dt2[:,len(dt2[0,:])-1]!=1,len(dt2[0,:])-1]=-1

#(聚類(lèi)結(jié)果列變?yōu)橐蜃兞?1)#構(gòu)造訓(xùn)練樣本importnumpyasnpdt=np.vstack((dt2,dt1))x=dt[:,1:-1]#訓(xùn)練樣本的Xy=dt[:,len(dt[0,:])-1]#訓(xùn)練樣本的Y訓(xùn)練樣本與預(yù)測(cè)樣本的構(gòu)建第10章

對(duì)于預(yù)測(cè)樣本,選用的是2017年7月1日—2017年9月30日的交易數(shù)據(jù)計(jì)算形態(tài)特征,這里調(diào)用前面定義的FR1函數(shù)來(lái)實(shí)現(xiàn)。#預(yù)測(cè)樣本的構(gòu)建R1=FR1(DA,'2017-07-01','2017-09-30',400)dt3=R1[0]x1=dt3[:,1:]#交易數(shù)據(jù)為2017年7月1日~2017年9月30日的股票價(jià)格形態(tài)特征數(shù)據(jù)量化投資策略設(shè)計(jì)第10章

根據(jù)前面構(gòu)建的訓(xùn)練樣本和預(yù)測(cè)樣本,利用支持向量機(jī)模型進(jìn)行訓(xùn)練和預(yù)測(cè),如果預(yù)測(cè)結(jié)果為+1,表示該只股票在未來(lái)一個(gè)月內(nèi)可能獲得比較好的收益,對(duì)該只股票以持有期為2017年10月1日—2017年10月31日進(jìn)行計(jì)算投資收益率(期初收盤(pán)價(jià)買(mǎi)入,期末收盤(pán)價(jià)賣(mài)出),最終將所有預(yù)測(cè)結(jié)果為+1的股票收益率求和,即得到投資策略的總收益率,并以同期的滬深300指數(shù)收益率作為基準(zhǔn)進(jìn)行比較。fromsklearnimportsvmclf=svm.SVC()clf.fit(x,y)res=clf.predict(x1)#支持向量機(jī)預(yù)測(cè)結(jié)果code=dt3[res==1,0]list_r=[]#預(yù)定義列表,用于存放預(yù)測(cè)結(jié)果為+1的股票收益率list_code=[]#預(yù)定義列表,用于存放預(yù)測(cè)結(jié)果為+1的股票代碼foriinrange(len(code)):

I1=DA['Trddt'].values>='2017-10-01'

I2=DA['Trddt'].values<='2017-10-31'

I3=DA['Stkcd'].values==c

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論