Pythonでドル円のセッション別ボラティリティを可視化したら、夜中の取引を諦めた話

Python実装・コード

最近、寝不足が祟って夜中の取引で連敗していました。。。「夜は値動きが激しい」とよく言いますが、実際どれくらいなのか自分で測ってみないと納得できないタチなので、Pythonで可視化したらちょっと意外な結果でした。

なぜ僕がセッション別ボラを調べたか

僕は普段、日本株とFXのドル円を触っていて、子供を寝かしつけた後の22時〜0時くらいが「ようやくチャート見られる時間」でした。ところがこの時間帯、エントリーすると思った方向と逆に走ることが多くて、なんでだろうと思っていたわけです。

「ロンドン勢が動いているから」程度の知識はありましたが、Tokyo、London、New Yorkのセッション別に値動きの大きさを数字で比べたら、夜の取引方針を見直す材料になるんじゃないかと考えました。

セッション別ボラティリティの定義

今回はシンプルに、各セッションの「1時間あたりの平均値幅(High − Low)」を計算します。セッションの時間帯は次のとおり(JST基準)。

  • Tokyoセッション:9時〜15時
  • Londonセッション:16時〜0時
  • New Yorkセッション:22時〜翌6時(一部重複あり)

厳密には重複期間がありますが、今回は「主にどのセッションが動かしているか」を雑に見たいので、ざっくり区切ります。

実装コード

import yfinance as yf
import pandas as pd

df = yf.download("JPY=X", period="60d", interval="1h", progress=False)
df = df.tz_localize("UTC").tz_convert("Asia/Tokyo")
df["hour"]  = df.index.hour
df["range"] = df["High"] - df["Low"]

def session(h):
    if 9 <= h < 15:  return "Tokyo"
    if 16 <= h < 22: return "London"
    if 22 <= h or h < 6: return "NewYork"
    return "Other"

df["session"] = df["hour"].apply(session)
summary = df.groupby("session")["range"].agg(["mean", "std", "count"])
print(summary.sort_values("mean", ascending=False))

結果と気づき

過去60日間の平均値幅をセッション別に見たら、こんな感じでした(あくまで僕の環境での値)。

  • New York:約0.71円/時間
  • London:約0.58円/時間
  • Tokyo:約0.32円/時間

つまりNY時間はTokyoの2倍以上動いています。僕が「思った方向と逆に走る」と感じていたのは、単純に値幅が大きいので逆行幅も大きく、メンタル的にやられていただけだと気づきました。。。

あと、Londonセッションは「方向感のあるトレンド」が出やすく、NYセッションは「上下に振り回される」傾向が強かったです。これは別途、終値ベースの方向性を集計すれば数字で出せます。

まとめ:夜中の取引は値幅の小さい時間に絞ることにした

結論として、僕はNYセッションの本気時間(23時〜2時)はノーポジで様子見、ロンドン入りの16時〜18時だけ短時間集中するスタイルに変えました。寝不足リスクと値幅リスクのバランスを取った形です。

個人的には、もう少しサンプル期間を伸ばして季節性も見てみたいと思っています。同じように「夜の取引で勝てない。。。」と悩んでいる方は、まず自分のチャートで値幅を可視化してみるのはいかがでしょうか。

関連サービス

この記事で紹介した手法を実際に試す際におすすめのサービスです。

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