Numpy攻略:確定穩態
阿新 • • 發佈:2018-12-05
馬爾可夫鏈:被用來描述至少有兩個狀態的系統,指數學中具有馬爾可夫性質的離散事件隨機過程。該過程中,在給定當前知識或資訊的情況下,過去(即當前以前的歷史狀態)對於預測將來(即當前以後的未來狀態)是無關的。此類系統t時刻的狀態僅取決於t-1時刻的狀態。
穩態:在未來某個時刻之後或者從理論上講經過無限長時間之後,馬爾可夫鏈系統的狀態將不再改變,這個狀態被稱為穩態。
隨機矩陣包含了狀態之間轉移的概率,把隨機矩陣A應用於穩態,狀態將保持不變,用數學符號表示如下:
Ax=x
具體步驟:
1.獲取一年的資料:使用Matplotlib函式
[新的mpl_finance中沒有quotes_historical_yahoo,因此需要安裝fix_yahoo_finance安裝命令:pip install fix_yahoo_finance]
雅虎資料需要通過pandas_datareader獲取,
https://blog.csdn.net/huang_susan/article/details/806556282.選取收價盤
3.確定狀態陣列
用sign函式,當Numpy的sign函式的輸入引數為負值,正值和0時,其返回結果分別為-1,1,0
4.初始化隨機矩陣:使用zeros函式,對隨機矩陣進行初始化
5.選取每一種符號對應的起始索引狀態:使用where函式選取索引的起始索引。
6.平滑處理和隨機矩陣
加法平滑:在轉換次數上加一個常數,從而避免出現概率為0的情況。
7.特徵值和特徵向量
Numpy中的linalg模組和eig函式:返回一個特徵值陣列和一個特徵向量陣列。
完整的程式碼如下圖:
import fix_yahoo_finance as yf import pandas_datareader as web from datetime import date yf.pdr_override() import numpy import sys #sys:負責python與直譯器的互動。 #sys.argv():實現程式外部向程式內部傳遞引數,指令碼的名稱是sys.argv[0]表示列表的第一列引數 #sys.exit():直譯器自動退出 if len(sys.argv)!=3: print("Usage Python %s SYMBOL k"%(sys.argv[0]) ) print("For instance python %s AAPL 1"%(sys.argv[0])) sys.exit() #datetimie:日期時間函式 today=date.today() start=(today.year-1,today.month,today.day) quotes=web.get_data_yahoo(sys.argv[1],start,today) close=[q[4] for q in quotes] #diff函式:計算離散分差,預設計算一階分差 #sign函式:返回陣列的符號 states=numpy.sign(numpy.diff(close)) NDIM=3 #numpy中的zeros函式:返回給定形狀和型別的新陣列,用0填充 SM=numpy.zeros((NDIM,NDIM)) signs=[-1,0,1] k=int(sys.argv[2]) for i in range(len(signs)): #從特定符號對應的狀態開始轉換 start_indices=numpy.where(states[:-1]==signs[i])[0] N=len(start_indices)+k*NDIM #跳過總轉換次數為0的情況 if N==0: continue #獲取結束狀態的狀態值 end_values=states[start_indices+1] for j in range(len(signs)): #特定型別轉換髮生的次數 occurrence=len(end_values[end_values==signs[j]]) SM[i][j]=(occurrence+k)/float(N) print(SM) #eig:返回陣列的特徵值的特徵向量 eig_out=numpy.linalg.eig(SM) print(eig_out) idx_vec=numpy.where(numpy.abs(eig_out[0]-1)<0.1) print("Index eigenvalue 1",idx_vec) x=eig_out[1][:idx_vec].flatten() print("Steady state vector",x) print("check",numpy.dot(SM))