Bokehで為替チャートを表示する(Python)

概要

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)

実行結果

コメント

タイトルとURLをコピーしました