💭

価格帯別出来高を扱う

2022/09/25に公開

価格帯別出来高(VPR:volume price range)とは

以下のような価格帯ごとの出来高で横バー

上記の図の引用元と詳しい説明はここを参照

plotの方法

以下をjupyter notebookで実行する

import numpy as np
import pandas as pd
import holoviews as hv
import hvplot.pandas
from holoviews import opts
hv.extension('bokeh')

opts.defaults(opts.Curve(tools=['hover']), opts.Overlay(width=600, legend_position='right'))

df = pd.read_csv('y_df.csv') # ここでohlcvのデータを読み込む
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df[['date', 'open', 'high', 'low', 'close', 'volume']]


# buyとsellのトレンドに分ける
df['trand'] = None
df.loc[df['open'] <= df['close'], 'trand']  = 'up'
df.loc[df['open'] > df['close'], 'trand']  = 'down'

up_df = df[df['trand']=='up']
down_df = df[df['trand']=='down']
bins = 100

_, x_range = np.histogram(df['close'], weights=df['volume'], bins=50)
hist_range = (x_range.min(), x_range.max())
up_value, up_x_range = np.histogram(up_df['close'], range=hist_range, weights=up_df['volume'], bins=bins)
down_value, down_x_range = np.histogram(down_df['close'], range=hist_range, weights=down_df['volume'], bins=bins)

options_dict = {
    'Histogram':
    {
        'yaxis':None,
    },
}

hist = hv.Histogram((up_value, up_x_range), label='up').options(options_dict).opts(invert_axes=True)\
    * hv.Histogram((down_value, down_x_range), label='down').options(options_dict).opts(invert_axes=True)
hist = hist.opts(width=300)
ohlcv = df.hvplot.ohlc(neg_color='indianred', pos_color='chartreuse', line_color='gray', bar_width=0.9).opts(width=600, show_grid=True)

# plot
ohlcv + hist


拡大すると

binsを大きさを調整すると横棒の分厚さを調整できます

ポイント

  • npのhistgramでヒストグラムを計算
    value, x_range = np.histogram(df['close'], weights=df['volume'], bins=bins)

  • holoviewsとhvplotを使ってプロットしているため、マウスでぐりぐり動かせる (htmlで保存するとjupyterを落としたあとでも図の拡大縮小ができて便利)

追記
shared_axis=Trueにしても何故かy軸が共有されなかったため、もしやり方が分かる人がいたらコメントいただけるとありがたいです・

Discussion