概要
Pythonで為替データを表示するスクリプトです。ライブラリはbokehとplotlyで迷いましたが、ズームが適切に動いたbokehを採用しました。
ソースコード
import requests
import pandas as pd
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, CDSView, BooleanFilter, CrosshairTool
# パラメータ
symbol = 'USD_JPY'
priceType = 'ASK'
date = '20250613'
# APIリクエストの組み立て
endPoint = 'https://forex-api.coin.z.com/public'
path = f'/v1/klines?symbol={symbol}&priceType={priceType}&interval=1min&date={date}'
response = requests.get(endPoint + path)
data = response.json()['data']
# DataFrame変換
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(pd.to_numeric(df['openTime']), unit='ms', utc=True)
# タイムゾーン調整:UTC → JST(+9時間)
df['date'] = df['date'].dt.tz_convert('Asia/Tokyo').dt.tz_localize(None)
# 数値変換
df[['open', 'high', 'low', 'close']] = df[['open', 'high', 'low', 'close']].astype(float)
df['inc'] = df.close > df.open
df['dec'] = df.open > df.close
source = ColumnDataSource(df)
inc_view = CDSView(filter=BooleanFilter(df['inc'].tolist()))
dec_view = CDSView(filter=BooleanFilter(df['dec'].tolist()))
w = 40 * 1000 # ローソクの幅(ミリ秒)
# Box Zoom をデフォルトツールに設定
TOOLS = "box_zoom,pan,wheel_zoom,reset"
p = figure(
x_axis_type="datetime",
width=800,
height=400,
title=f"{symbol} Candlestick",
tools=TOOLS,
active_drag="box_zoom"
)
p.segment('date', 'high', 'date', 'low', color="black", source=source)
p.vbar('date', w, 'open', 'close', fill_color="#00FF00", line_color="#00DD00", source=source, view=inc_view)
p.vbar('date', w, 'close', 'open', fill_color="#FF0000", line_color="#DD0000", source=source, view=dec_view)
p.add_tools(CrosshairTool(dimensions="both"))
show(p)
実行結果

コメント