【Pythonテクニカル分析】OBV(On Balance Volume)の計算と描画
OBVは過去の出来高の差し引きによって株価の動きをとらえるレシオ系の分析手法になります。
OBVの計算方法
- 基準日を決める。基準日のOBV=0とする
- 前日の株価と当日の株価を比較し、高い場合は当日の出来高を前日のOBVに加算する。逆に低い場合は当日のOBVから当日の出来高を前日のOBVから引く。株価が同じ場合は前日のOBV=当日のOBVとする
実装方法
OBVの計算の実現方法として、基準日のOBVを0としたうえで、前日と当日の株価を比較し、当日の出来高に正負をつけることにしました。そして、基準日からOBVを累積計算することでOBVを求めることにします。
データは日経平均を用い、基準日を30日前とします。
OBVのコード
# ライブラリの読み込み
import pandas_datareader as pdr
from datetime import datetime, timedelta
import pandas as pd
import matplotlib.pyplot as plt
# データ取得期間設定
current_date = datetime.now()
two_years_ago = current_date - timedelta(days=365) # 1年間を設定
formatted_date = two_years_ago.strftime("%Y-%m-%d")
df = pdr.DataReader('^NKX', 'stooq',start=formatted_date) # データの取得
df.sort_values('Date', inplace=True) # 日付順にソート
# 前日の終値を取得
df['Last_Close']=df['Close'].shift(1)
# 基準日をNとする
N = 30
base = df.tail(N).copy()
# 基準日の出来高を0にしておく
base.iloc[0]['Volume']=0
# OBV計算のための出来高の正負を計算
base.loc[base['Close'] >= base['Last_Close'], 'OBV_Dif'] = base['Volume']
base.loc[base['Close'] < base['Last_Close'], 'OBV_Dif'] = -base['Volume']
# 累積によりOBVを計算
base['OBV'] = base['OBV_Dif'].cumsum()
# 描画
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(base['OBV'], label='OBV')
ax1.legend()
ax2 = ax1.twinx()
ax2.plot(base['Close'], color='green', label='Close')
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1+h2, l1+l2, loc='upper left')
ax1.tick_params(axis="x", labelrotation=45)
描画結果
OBVの見方
OBVラインが上昇⇒買い方の勢いが蓄積⇒上昇期待
OBVラインが下降⇒買い方の勢いが減少⇒下落示唆