【火爐煉AI】機器學習045-對股票資料進行隱馬爾科夫建模

煉丹老頑童發表於2018-10-19

【火爐煉AI】機器學習045-對股票資料進行隱馬爾科夫建模

(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

股票資料是非常非常典型的時序資料,資料都是按照日期排列好,而且股價就是我們所能觀察到的觀測序列,而股價背後隱藏的變動機理就是我們難以看到的隱藏狀態和狀態轉移概率,所以完全可以用隱馬爾科夫對股票進行建模,並預測出股票後續的變動情況,如果在股票資料研究上有點突破,那麼,銀子就大把大把的到口袋中來。


1. 準備資料集

此處我用tushare提取某隻股票資料,然後用該股票的每日漲幅和成交量來建模,看看能預測出什麼結果。

# 1, 準備資料集,使用tushare來獲取股票資料
import tushare as ts
stock_df=ts.get_k_data('600123',start='2008-10-01',end='2018-10-01') # 獲取600123這隻股票的近十年資料
print(stock_df.info()) # 檢視沒有錯誤
print(stock_df.head())
複製程式碼

上面只是下載了600123這隻股票的最近十年的日資料,但是我們要得到的是收盤價的漲幅,所還需要對資料做進一步處理。

# 準備資料集,此次我們用兩個指標來計算HMM模型,股價漲幅和成交量
close=stock_df.close.values
feature1=100*np.diff(close)/close[:-1] # 股票漲幅的計算
print(close[:10])
print(feature1[:10]) # 檢視漲幅計算有沒問題
複製程式碼

-------------------------------------輸---------出--------------------------------

[6.775 6.291 6.045 5.899 5.361 5.436 5.299 4.994 4.494 4.598] [ -7.14391144 -3.91034812 -2.41521919 -9.12018986 1.39899273 -2.52023547 -5.75580298 -10.01201442 2.31419671 9.98260113]

--------------------------------------------完-------------------------------------

# 由於計算漲幅之後的序列比原來的收盤價序列少一個(最開始的股價沒法計算漲幅),故而需要減去一個
feature2=stock_df.volume.values[1:]
dataset_X=np.c_[feature1,feature2]
print(dataset_X[:5]) # 檢查沒錯
複製程式碼

2. 建立HMM模型

關於HMM模型,我已經在我前面的文章中進行了詳細的講解,請參考【火爐煉AI】機器學習044-建立隱馬爾科夫模型

# 建立HMM模型,並訓練
from hmmlearn.hmm import GaussianHMM
model=GaussianHMM(n_components=5,n_iter=1000) # 暫時假設該股票有5個隱含狀態
model.fit(dataset_X)
複製程式碼

在使用HMM模型建模之後,我們怎麼知道這個模型的好壞了?那麼就需要將其預測的結果和實際的結果進行比較,看看是否一致。

# 使用該模型檢視一下效果
N=500
samples,_=model.sample(N)
# 由於此處我使用漲幅作為第一個特徵,成交量作為第二個特徵進行建模,
# 故而得到的模型第一列就是預測的漲幅,第二列就是成交量
plt.plot(feature1[:N],c='red',label='Rise%') # 將實際漲幅和預測的漲幅繪製到一幅圖中方便比較
plt.plot(samples[:,0],c='blue',label='Predicted%')
plt.legend()
複製程式碼

股票漲幅的實際值和預測值

貌似匹配結果不怎麼樣,再來看看對於成交量的預測:

plt.plot(feature2[:N],c='red',label='volume')
plt.plot(samples[:,1],c='blue',label='Predicted')
plt.legend()
複製程式碼

股票成交量的實際值和預測值

這兩個結果都不怎麼樣,預測值和實際值都相差比較大,說明模型難以解決這個專案。我們換個角度來想,如果這麼簡單就能預測股票的走勢,那每個人都會從股市撈錢,最終股市只能關門了。讀者有興趣可以優化一下HMM模型的隱含狀態數,可能會得到比較好的匹配結果,但是也有可能發生過擬合,所以我覺得優化的用處不大。

########################小**********結###############################

1,此處只是簡單的做了一個用HMM模型來分析股票資料的例子,雖然實用價值不大,但可以給其他複雜的演算法提供一點思路。

**2,還是那句話,遠離股市,遠離傷害! **

#################################################################


注:本部分程式碼已經全部上傳到(我的github)上,歡迎下載。

參考資料:

1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯

相關文章