子供が寝た後の夜11時〜1時、僕のドル円トレードタイムだった。
でも先月、ふとした疑問が浮かんだ。「この時間帯って、本当にトレードに向いてる?」
Pythonで時間帯別のボラティリティを可視化してみたら、答えが出た。東京時間のドル円はニューヨーク時間の半分以下のボラしかない。値動きが少ない時間帯に張り付いていた僕は、ただ疲れていただけだった。
時間帯別ボラティリティの可視化コード
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
# OANDA or GMO からの分足データを読み込む(例:1分足CSV)
df = pd.read_csv("usdjpy_1m.csv", parse_dates=["datetime"])
df = df.set_index("datetime").tz_localize("UTC").tz_convert("Asia/Tokyo")
# 1時間ごとのATR(High-Low)を計算
df["range"] = df["High"] - df["Low"]
hourly = df.groupby(df.index.hour)["range"].mean()
# プロット
fig, ax = plt.subplots(figsize=(12, 5))
colors = ["#ef4444" if h in range(22, 24) or h in range(0, 3)
else "#3b82f6" if h in range(8, 16)
else "#6b7280" for h in hourly.index]
ax.bar(hourly.index, hourly.values, color=colors)
ax.set_xlabel("時間帯(東京時間)")
ax.set_ylabel("平均レンジ(pips)")
ax.set_title("ドル円 時間帯別平均ボラティリティ")
ax.xaxis.set_major_formatter(mticker.FuncFormatter(lambda x, _: f"{int(x)}時"))
plt.tight_layout()
plt.savefig("usdjpy_vol_by_hour.png", dpi=150)
plt.show()
結果:ニューヨーク時間が圧倒的
実際に可視化すると一目瞭然だった。
- 東京時間(9〜15時): 平均8〜12pips/時間
- ロンドン時間(16〜22時): 平均15〜20pips/時間
- ニューヨーク時間(22〜翌3時): 平均20〜30pips/時間
僕が張り付いていた夜11時〜1時はボラが高い。ただし、これは「値動きが大きい=稼ぎやすい」とはイコールではない。
セッション別の勝率も計算してみた
# 時間帯ごとのシグナル勝率を集計
def get_session(hour):
if 9 <= hour < 15:
return "Tokyo"
elif 15 <= hour < 22:
return "London"
else:
return "NewYork"
trades = pd.read_csv("trades.csv", parse_dates=["entry_time"])
trades["session"] = trades["entry_time"].dt.hour.map(get_session)
trades["win"] = trades["pnl"] > 0
summary = trades.groupby("session").agg(
count=("win", "count"),
win_rate=("win", "mean"),
avg_pnl=("pnl", "mean")
)
print(summary)
僕の戦略(RSIリバーサル)はトレンドフォロー系と違って、ボラが高い時間帯より値動きが落ち着いた東京時間の方が勝率が高かった。理由はシンプルで、ノイズが少ない分だけシグナルの精度が上がるからだ。
まとめ
夜中に無理して起きてトレードするのをやめた。代わりに東京時間のシグナルを自動検知してLINE通知する仕組みを作って、あとは寝ることにした。
ボラが高い時間=儲かる時間ではない。自分の戦略がどの時間帯と相性がいいかは、このコードで10分もあれば確認できる。
次は製造業の決算発表時間帯と株のボラの関係を調べてみる予定だ。

