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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第10章

股票價格形態聚類與收益分析關鍵價格點概念及提取算法基于關鍵價格點的形態特征表示基于關鍵價格點的形態特征提取關鍵價格點概念及提取算法第10章

股票價格走勢主要由一些關鍵價格點構成,因此我們選擇其關鍵的價格點作為聚類特征即可。構成的序列模式,值越大,xi成為關鍵點的可能性就越大。關鍵價格點提取算法如下:輸入:原始價格序列x=(x1,x2,……,xp),提取關鍵點個數num。輸出:關鍵價格點序列、對應下標序列。step1:對x2,…,x(p-1)按公式計算其與相鄰兩個價格點均值的絕對值大小,并按從大到小

進行排序,取排名前num-2對應的價格點,記為L1,對應的下標序列記為S1。step2:x1,xp對應的價格點記為L2,對應的下標序列記為S2。step3:記L=L1∪L2,S=S1∪S2,并按S從小到大進行排序,則L即為關鍵價格點序列,

S即為對應的下標序列。關鍵價格點概念及提取算法第10章

defget_keydata(x,num):

importpandasaspd

importnumpyasnp

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

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

#以d為值,對應的下標為index,構建序列,并按降序排序

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函數輸入參數為價格數組X、提取的關鍵點個數num,返回值為關鍵點序列(index為下標,value為對應的關鍵價格點)關鍵點提取算法函數如下(函數定義在df.py文件中)關鍵價格點概念及提取算法第10章

股票代碼為600000的股票2017年6月1日—2017年8月31日的收盤價數據,提取10個關鍵點,并在同一坐標軸上繪制原始價格點與關鍵價格點擬合圖,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的收盤價dt=data1.loc[data1['Stkcd']==600000,['Clsprc']]['Clsprc']#收盤價序列的index重排,從0開始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*--')關鍵價格點(keydata.values)為:[12.9212.5312.8613.7613.5513.4513.6713.4412.4712.71]對應的下標(keydata.index)為:[0,27,29,32,33,36,37,44,60,65]基于關鍵價格點的形態特征表示第10章

關鍵價格點的提取降低了維度,但是直接用價格點進行聚類還是存在較大的誤差,因此我們需要對關鍵價格點的走勢情況進行特征化表示,采用兩個關鍵價格點之間連線的斜率確定其漲跌情況,即特征化表示為兩個關鍵點連線之間的夾角

的tan值:其中p1和p2分別表示前后兩個關鍵點,x1和x2分別為關鍵點對應的下標。漲跌幅的劃分標準如下:上漲幅度大:

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基于關鍵價格點的形態特征表示第10章

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

importnumpyasnp

y1=keydata.values[1:]

y2=keydata.values[0:-1]

x1=keydata.index[1:]

x2=keydata.index[0:-1]

#計算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函數輸入參數為關鍵點序列,返回結果為特征化數組:T=df.get_tz(keydata)print(T)可以看到,前面所示關鍵點價格走勢圖其特征化表示為:[4.5.6.2.4.6.4.4.4.]基于關鍵價格點的形態特征提取第10章

根據第8章中基于總體規模與投資效率指標的綜合評價方法,獲取2016年排名前400的股票作為研究樣本,并提取其交易數據區間在2017年5月1日—2017年7月31日的股票關鍵價格點和形態特征。首先基于總體規模與投資效率指標的綜合評價方法,獲取2016年排名前400的股票,包括其股票代碼和股票簡稱。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)#將股票代碼轉化為列表的形式基于關鍵價格點的形態特征提取第10章

其次確定在2017年5月1日—2017年7月31日之間的交易所實際交易天數Mtd=pd.read_excel('交易日歷數據表.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)基于關鍵價格點的形態特征提取第10章

最后我們計算400只股票樣本的關鍵價格點數據和對應的下標,并根據關鍵價格點和對應下標數據計算形態特征,這里需要說明的是如果存在股票交易天數不足M天,則做剔除處理。最終得到股票形態特征數據Data、關鍵價格點數據KeyData、關鍵價格點數據對應的序號KeyData_index。其中關鍵價格點數據KeyData已做極差化處理,即數據標準化為[0,1]之間。第10章

股票價格形態聚類與收益分析K-最頻繁值聚類算法基于K-最頻繁值聚類算法的股票價格形態聚類類平均收益率的計算K-最頻繁值聚類算法第10章

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

輸入:特征數據集,聚類個數K。輸出:特征數據集及其類標簽。Step1:隨機初始化K個聚類中心,即K個類中心向量。Step2:對每個樣本,計算其與各個類中心向量的距離,并將該樣本指派給距離最小的類,

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

利用K-最頻繁值聚類算法對股票價格形態進行聚類,輸入為股票形態特征數據集Data,輸出為每個股票代碼的聚類結果.為了后續使用的方便,對形態特征數據Data、關鍵價格點數據KeyData、關鍵點價格數據對應的序號數據KeyData_index,都在數據集的最后加上一列,即聚類結果列。添加聚類結果列后,數據集分別記為:Data_c、KeyData_c、KeyData_index_cimportkmean#導入自定義的K最頻繁值聚類算法c=kmean.K_mean(Data[:,1:],20)#調用K最頻繁值聚類算法,聚為20個類,并返回結果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))類平均收益率的計算第10章

根據聚類結果,對每一類股票計算該類股票的平均收益率,持有期為2017年8月1日—2017年8月31日,即考察未來一個月的平均收益率。也就是說,這種形態出現之后,未來一個月的市場表現如何。第10章

股票價格形態聚類與收益分析函數定義及使用方法訓練樣本與預測樣本的構建量化投資策略設計函數定義及使用方法第10章

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

#輸入:

#DA--2017年股票交易數據

#t_trd1--聚類數據區間開始日期

#t_trd2--聚類數據區間結束日期

#num--基于總體規模與投資效率指標的綜合評價方法提取樣本個數

#輸出:

#Data--形態特征數據

#KeyData--關鍵價格點數據

#KeyData_index--關鍵價格點對應序號函數定義及使用方法第10章

將以上介紹的形態特征聚類與收益率計算定義為函數FR2defFR2(DA,Data,KeyData,KeyData_index,s_trd1,s_trd2,class_num):

#輸入:

#DA--2017年股票交易數據

#Data--形態特征數據

#KeyData--關鍵價格點數據

#KeyData_index--關鍵價格點對應序號

#s_trd1--收益率計算持有期開始日期

#s_trd2--收益率計算持有期結束日期

#class_num--聚類個數

#輸出:

#Data_c--形態特征數據+聚類結果列

#KeyData_c--關鍵價格點數據+聚類結果列

#KeyData_index_c--關鍵價格點對應序號+聚類結果列

#D--每只股票代碼、所屬聚類類別、收益率組成的數據框

#list_cr--每類股票的總收益訓練樣本與預測樣本的構建第10章

選用2017年5月1日—2017年7月31日和2017年6月1日—2017年8月31日兩個計算周期的交易數據提取股票價格形態特征進行聚類,并分別以2017年8月1日—2017年8月31日和2017年9月1日—2017年9月30日兩個持有期計算每個類別的平均收益率,如果類平均收益率排名前5,則該類中所有股票記為+1類,否則記為?1類,并以此構建訓練樣本。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日的股票價格形態特征數據+聚類結果列cr1=pd.Series(R2[4])#對應每類的平均收益率crr=cr1.sort_values(ascending=False)#對類平均收益率序列cr1按降序排序cr=list(crr.index)

#取對應的類編號(排序后的數據)foriinrange(len(crr)):

#類平均收益率排名前5的類中所有股票標記為1

ifi<5:

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

#(聚類結果列變為因變量+1)dt1[dt1[:,len(dt1[0,:])-1]!=1,len(dt1[0,:])-1]=-1

#(聚類結果列變為因變量-1)訓練樣本與預測樣本的構建第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日的股票價格形態特征數據+聚類結果列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

#(聚類結果列變為因變量+1)dt2[dt2[:,len(dt2[0,:])-1]!=1,len(dt2[0,:])-1]=-1

#(聚類結果列變為因變量-1)#構造訓練樣本importnumpyasnpdt=np.vstack((dt2,dt1))x=dt[:,1:-1]#訓練樣本的Xy=dt[:,len(dt[0,:])-1]#訓練樣本的Y訓練樣本與預測樣本的構建第10章

對于預測樣本,選用的是2017年7月1日—2017年9月30日的交易數據計算形態特征,這里調用前面定義的FR1函數來實現。#預測樣本的構建R1=FR1(DA,'2017-07-01','2017-09-30',400)dt3=R1[0]x1=dt3[:,1:]#交易數據為2017年7月1日~2017年9月30日的股票價格形態特征數據量化投資策略設計第10章

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

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

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

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

溫馨提示

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

評論

0/150

提交評論