【火爐煉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著,陶俊傑,陳小莉譯