隠れマルコフモデルのレジーム検知を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()

最後に隠れマルコフモデルによって検知したレジームの可視化してみます。