💭
価格帯別出来高を扱う
価格帯別出来高(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