隱馬爾科夫模型研究 stock 以及 lotto

2022-03-15 19:25:36 字數 3898 閱讀 5196

本文參考了這裡

由於資料是連續的,因此使用了高斯隱馬爾科夫模型:gaussianhmm

import tushare as ts

import pandas as pd

import numpy as np

from hmmlearn.hmm import gaussianhmm

from matplotlib import cm, pyplot as plt

import seaborn as sns

sns.set_style('white')

'''假定隱藏狀態數目為4,觀測狀態數目為2

'''# 1.準備 x

df = ts.get_hist_data('sh',start='2014-01-01',end='2017-07-27')[::-1] # 上證指數

close = np.log(df['close'])

low, high = np.log(df['low']), np.log(df['high'])

t = 5

x = pd.concat([close.diff(1), close.diff(t), high-low], axis=1)[t:] # 顯狀態時間序列(觀測得到)

# 2.擬合 hmm

model = gaussianhmm(n_components=6, covariance_type="diag", n_iter=1000).fit(x)

z = model.predict(x) # 隱狀態時間序列

# 3.畫圖看看

plt.figure(figsize=(12, 7))

for i in range(model.n_components):

mask = (z==i) # 注意這裡的z!!!

plt.plot_date(df.index[t:][mask], df['close'][t:][mask],'.',label=f'th hidden state',lw=1)

plt.legend()

plt.grid(1)

plt.show()

效果圖

解釋下面是對6種隱狀態的一種可能的解釋:【**對不上,文字來自這裡】

所以,這種方法本質上是一種 classification(分類) 或者 clustering(聚類)

import tushare as ts

import pandas as pd

import numpy as np

from hmmlearn.hmm import gaussianhmm

from matplotlib import cm, pyplot as plt

from matplotlib.widgets import multicursor

import seaborn as sns

sns.set_style('white')

import marksix_1

import talib as ta

'''假定隱藏狀態數目為6,觀測狀態數目為4

'''# 1.準備 x

lt = marksix_1.marksix()

lt.load_data(period=1000)

#series = lt.adapter(loc='0000001', zb_name='ptsx', args=(1,), tf_n=0)

m = 2

series = lt.adapter(loc='0000001', zb_name='mod', args=(m, lt.get_mod_list(m)), tf_n=0)

# 實時線

close = np.cumsum(series).astype(float)

# 低階資料

t1, t2, t3 = 5, 10, 20

ma1 = ta.ma(close, timeperiod=t1, matype=0)

std1 = ta.stddev(close, timeperiod=t1, nbdev=1)

ma2 = ta.ma(close, timeperiod=t2, matype=0)

std2 = ta.stddev(close, timeperiod=t2, nbdev=1)

ma3 = ta.ma(close, timeperiod=t3, matype=0)

std3 = ta.stddev(close, timeperiod=t3, nbdev=1)

# 轉換一

'''t = t3

x = pd.dataframe(, index=lt.df.index)[t:]

'''# 轉換二

t = t2

x = pd.dataframe(, index=lt.df.index)[t:]

#close = np.log(df['close'])

#low, high = np.log(df['low']), np.log(df['high'])

#t = 5

#x = pd.concat([close.diff(1), close.diff(t), high-low], axis=1)[t:] # 顯狀態時間序列(觀測得到)

# 2.擬合 hmm

model = gaussianhmm(n_components=6, covariance_type="diag", n_iter=1000).fit(x)

z = model.predict(x) # 隱狀態時間序列

# 3.畫圖看看

fig, axes = plt.subplots(2, 1, sharex=true)

ax1, ax2 = axes[0], axes[1]

show_period = 300

# 布林線

upperband, middleband, lowerband = ta.bbands(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)

axes[0].plot_date(lt.df.index[-show_period:], close[-show_period:], 'rd-', markersize = 3)

axes[0].plot_date(lt.df.index[-show_period:], upperband[-show_period:], 'y-')

axes[0].plot_date(lt.df.index[-show_period:], middleband[-show_period:], 'b-')

axes[0].plot_date(lt.df.index[-show_period:], lowerband[-show_period:], 'y-')

for i in range(model.n_components):

mask = (z[-show_period:]==i) # 注意這裡的z!!!

axes[1].plot_date(lt.df.index[-show_period:][mask], close[-show_period:][mask],'d',markersize=3,label=f'th hidden state',lw=1)

axes[1].legend()

axes[1].grid(1)

multi = multicursor(fig.canvas, (axes[0], axes[1]), color='b', lw=2)

plt.show()

效果圖

馬爾科夫模型與隱馬爾科夫模型

隨機過程 是隨時間而隨機變化的過程。又稱為隨機函式。馬爾科夫模型 vmm 它描述了一類重要的隨機過程。乙個系統有有限個狀態集s 隨時間推移,該系統將同某一狀態轉移到另一狀態。q s1,s2,sn 為一隨機變數序列,隨機變數取值為狀態集s中的乙個狀態,設時間t時狀態為qt。對系統的描述通常是給出當前時...

隱馬爾科夫模型

隱馬爾科夫 hiddenmarkov model 簡稱為hmm,hmm資料相當豐富,推薦參見 hmm學習最佳範例與崔曉源的部落格 一文,本文只對hmm進行簡要介紹,然後說明開源ghmm實現在linux環境的搭建,hmm的開源實現有眾多不同語言的實現。馬爾科夫模型 一階馬爾科夫模型假設為 1 t l時...

隱馬爾科夫模型

一 介紹 introduction 我們通常都習慣尋找乙個事物在一段時間裡的變化模式 規律 這些模式發生在很多領域,比如計算機中的指令序列,句子中的詞語順序和口語單詞的因素修咧等等,事實上任何領域中的一系列事件都有可能產生有用的模式。考慮乙個簡單的例子,有人試圖通過一片海藻推斷天氣 民間傳說告訴我們...