隠れマルコフモデルのレジーム検知をPythonで実践
隠れマルコフモデルとは?
隠れマルコフモデルは、観測されたデータから観測されていない情報を推測するための確率的モデルです。
今回はこの隠れマルコフモデルを使ってPythonでビットコインのレジーム検知を行って見たいと思います。
Pythonで実践
Pythonで隠れマルコフモデルを実践してみます。環境はGoogle Corabです。
インストール
隠れマルコフモデルの実践にはhmmlearnというライブラリを使用しますので、このライブラリをインストールします。
!pip install hmmlearn
インストールには下記の環境が必要になるため、注意してください。Google Corabでは全ての条件を満たしているため、特に問題なくインストールが出来ます。
Python >= 3.6
NumPy >= 1.10
scikit-learn >= 0.16
ライブラリの読み込み
import pandas as pd
import yfinance as yf
import numpy as np
from hmmlearn.hmm import GaussianHMM
データの準備
df = yf.download('BTC-JPY')
ビットコインのヒストリカルデータを取得します。
Yahoo Financeから取得しています。
df['Log'] = np.log(df['Close'])
df['Returns'] = df['Log'].pct_change()
df['Range'] = (df['High'] / df['Low']) - 1
df.dropna(inplace=True)
data = df[['Returns', 'Range']]
リターンなどを計算しておきます。
隠れマルコフモデルを作る
model = GaussianHMM(n_components=3, covariance_type='full')
model.fit(data)
隠れマルコフモデルを作り学習してみます。
レジームを予測してみる
states = model.predict(data)
predict()によって状態を推定します。
import plotly.express as px
fig = px.histogram(pd.Series(states), x=states)
fig.show()
状態の可視化を行って見ます。
レジームの可視化
import plotly.graph_objects as go
data = pd.DataFrame({'Close': df['Close'], 'State': states})
data['state1'] = data.apply(lambda x: x['Close'] if x['State'] == 0 else float('nan'), axis=1)
data['state2'] = data.apply(lambda x: x['Close'] if x['State'] == 1 else float('nan'), axis=1)
data['state3'] = data.apply(lambda x: x['Close'] if x['State'] == 2 else float('nan'), axis=1)
fig = go.Figure()
fig.add_trace(go.Scatter(y=data['state1'], mode='lines', name='State 1', line=dict(color='green')))
fig.add_trace(go.Scatter(y=data['state2'], mode='lines', name='State 2', line=dict(color='yellow')))
fig.add_trace(go.Scatter(y=data['state3'], mode='lines', name='State 3', line=dict(color='red')))
fig.show()
最後に隠れマルコフモデルによって検知したレジームの可視化してみます。