Open2

外国為替MLBot稼働にむけてAIが特徴量を生成するよ#2

P-HunterP-Hunter

あなたは優秀な外国為替クオンツトレーダーです。
UNIXタイムスタンプから祝日関連の特徴量を生成する
create_jp_holiday_features 関数を作成することがあなたのタスクです。
まずはタスク遂行にあたっての計画を立ててください。

ChatGPT o1-preview

外国為替取引における日本の祝日の分析:ステップバイステップガイド

外国為替(FX)のクオンツトレーダーとして、国の祝日が通貨の動きに与える影響を理解することは非常に重要です。祝日は市場の流動性の低下、ボラティリティの増加、さらには市場の休場につながり、これらすべてが取引戦略に影響を及ぼします。この記事では、日本の祝日に関連する特徴量を生成するためのPython関数について詳しく説明します。この関数は、特にUSD/JPY(米ドル/日本円)通貨ペアを扱う際に、取引モデルに統合することができます。

はじめに

日本円(JPY)は世界で最も取引されている通貨の一つです。日本の祝日は市場参加者の変化により、円の取引パターンに大きな影響を与える可能性があります。祝日に関連する特徴量をクオンツモデルに組み込むことで、市場の動きをより正確に予測し、取引戦略を強化することができます。

ここでは、以下の機能を持つcreate_jp_holiday_features関数を検討します:

  • 日本の祝日データをダウンロードします。
  • 次の祝日までの時間と前の祝日からの時間を計算します。
  • 特定のタイムスタンプが祝日かどうかを判定します。
  • これらの特徴量を、USD/JPYの1分間隔のデータセットに合わせてDataFrameとして生成します。

関数

def create_jp_holiday_features(api):
    import requests
    save_path = "/tmp/jp_holidays.csv"
    url = "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"
    with open(save_path, "wb") as f:
        f.write(requests.get(url).content)

    df = api.get_dataset("USDJPY_1MIN")
    jp_holidays = pd.read_csv(save_path, encoding="shift-jis")
    jp_holidays = pd.DataFrame(jp_holidays)
    jp_holidays.columns = ['date', 'holiday']
    
    # 日付を変換して新しい列に設定
    dates = pd.to_datetime(jp_holidays['date'])
    jp_holidays['_date'] = dates.dt.tz_localize('Asia/Tokyo')

    # UNIXTIMESTAPを入力として、祝日ならTrueを返す関数を作成
    def is_holiday(timestamp: int, jp_holidays: pd.DataFrame) -> bool:
        from datetime import datetime, timezone, timedelta
        dt = datetime.fromtimestamp(timestamp/1000, tz=timezone.utc)
        # +9時間して日本時間にする
        dt = dt + timedelta(hours=9)
        return dt.date() in jp_holidays['_date'].dt.date()

    #次の祝日までの秒数を計算する関数を作成
    def seconds_to_next_holiday(timestamp: int, jp_holidays: pd.DataFrame) -> int:
        from datetime import datetime, timezone, timedelta
        dt = datetime.fromtimestamp(timestamp/1000, tz=timezone.utc)
        dt = dt + timedelta(hours=9)
        next_holiday = jp_holidays[jp_holidays['_date'] > dt]['_date'].min()
        return (next_holiday - dt).total_seconds()
    # 前の祝日までの秒数を計算する関数を作成
    def seconds_to_previous_holiday(timestamp: int, jp_holidays: pd.DataFrame) -> int:
        from datetime import datetime, timezone, timedelta
        dt = datetime.fromtimestamp(timestamp/1000, tz=timezone.utc)
        dt = dt + timedelta(hours=9)
        previous_holiday = jp_holidays[jp_holidays['_date'] < dt]['_date'].max()
        return (dt - previous_holiday).total_seconds()
    
    jp_holiday_features = pd.DataFrame()
    jp_holiday_features['seconds_to_next_holiday_jp'] = df['timestamp'].apply(lambda x: seconds_to_next_holiday(x, jp_holidays))
    jp_holiday_features['seconds_to_previous_holiday_jp'] = df['timestamp'].apply(lambda x: seconds_to_previous_holiday(x, jp_holidays))
    jp_holiday_features['is_holiday_jp'] = df['timestamp'].apply(lambda x: is_holiday(x, jp_holidays))
    jp_holiday_features.index = df.index
    jp_holiday_features['timestamp'] = df['timestamp']
    return jp_holiday_features

関数の理解

それでは、関数を一歩ずつ解説していきます。

関数の概要

def create_jp_holiday_features(api):
    # 関数のコード...
    return jp_holiday_features
  • 目的:USD/JPYの1分データセットに合わせて、日本の祝日に関する特徴量を含むDataFrameを作成します。
  • 入力:USD/JPYのデータセットにアクセスするためのAPIオブジェクト(api)。
  • 出力:計算された祝日関連の特徴量を持つDataFrame(jp_holiday_features)。

ステップ1:ライブラリのインポートと祝日データのダウンロード

import requests
import pandas as pd
  • requests:HTTPリクエストを行い、祝日データをダウンロードします。
  • pandas:データの操作と分析のためのライブラリ。
save_path = "/tmp/jp_holidays.csv"
url = "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"
with open(save_path, "wb") as f:
    f.write(requests.get(url).content)
  • 祝日データのダウンロード:日本政府の公式サイトから最新の祝日リストをダウンロードし、ローカルに保存します。

ステップ2:データセットの読み込み

df = api.get_dataset("USDJPY_1MIN")
  • USD/JPYデータセット:提供されたAPIを使用して、USD/JPYの1分間隔のデータセットを取得します。

ステップ3:祝日データの読み込みと準備

jp_holidays = pd.read_csv(save_path, encoding="shift-jis")
jp_holidays.columns = ['date', 'holiday']
  • CSVの読み込み:祝日データをDataFrameにロードします。
  • エンコーディング:日本語のテキストは「shift-jis」エンコーディングを使用します。
  • 列名の変更:使いやすいように列名を簡略化します。

ステップ4:日付とタイムゾーンの変換

dates = pd.to_datetime(jp_holidays['date'])
jp_holidays['_date'] = dates.dt.tz_localize('Asia/Tokyo')
  • 日付の変換:'date'列をdatetimeオブジェクトに変換します。
  • タイムゾーンの設定:日付に『Asia/Tokyo』のタイムゾーンを割り当てます。

ステップ5:ヘルパー関数の定義

1. 祝日かどうかのチェック

def is_holiday(timestamp: int, jp_holidays: pd.DataFrame) -> bool:
    from datetime import datetime, timezone, timedelta
    dt = datetime.fromtimestamp(timestamp/1000, tz=timezone.utc)
    dt = dt + timedelta(hours=9)
    return dt.date() in jp_holidays['_date'].dt.date()
  • 目的:特定のタイムスタンプが日本の祝日かどうかを判定します。
  • タイムスタンプの変換:UNIXタイムスタンプ(ミリ秒単位)をUTCのdatetimeオブジェクトに変換し、日本標準時(UTC+9)に調整します。
  • 祝日のチェック:タイムスタンプの日付部分と祝日リストの日付を比較します。

2. 次の祝日までの時間

def seconds_to_next_holiday(timestamp: int, jp_holidays: pd.DataFrame) -> int:
    # 同様の変換
    next_holiday = jp_holidays[jp_holidays['_date'] > dt]['_date'].min()
    return (next_holiday - dt).total_seconds()
  • 目的:タイムスタンプから次の日本の祝日までの秒数を計算します。
  • 次の祝日の検索:現在の日時より後の祝日をフィルタリングし、最も近いものを選択します。
  • 時間差の計算:現在の時刻と次の祝日との間の総秒数を計算します。

3. 前の祝日からの時間

def seconds_to_previous_holiday(timestamp: int, jp_holidays: pd.DataFrame) -> int:
    # 同様の変換
    previous_holiday = jp_holidays[jp_holidays['_date'] < dt]['_date'].max()
    return (dt - previous_holiday).total_seconds()
  • 目的:前の日本の祝日からタイムスタンプまでの秒数を計算します。
  • 前の祝日の検索:現在の日時より前の祝日をフィルタリングし、最も近いものを選択します。

ステップ6:祝日特徴量の生成

jp_holiday_features = pd.DataFrame()
  • DataFrameの初期化:特徴量を保存するための空のDataFrameを作成します。

特徴量の計算

jp_holiday_features['seconds_to_next_holiday_jp'] = df['timestamp'].apply(lambda x: seconds_to_next_holiday(x, jp_holidays))
jp_holiday_features['seconds_to_previous_holiday_jp'] = df['timestamp'].apply(lambda x: seconds_to_previous_holiday(x, jp_holidays))
jp_holiday_features['is_holiday_jp'] = df['timestamp'].apply(lambda x: is_holiday(x, jp_holidays))
  • 関数の適用:USD/JPYデータセットの各タイムスタンプについて、以下を計算します:
    • 次の祝日までの秒数:次の祝日までの時間。
    • 前の祝日からの秒数:前の祝日からの時間。
    • 祝日かどうか:タイムスタンプが祝日かどうか。

インデックスとタイムスタンプの調整

jp_holiday_features.index = df.index
jp_holiday_features['timestamp'] = df['timestamp']
  • インデックスの調整:特徴量が元のデータセットと一致するようにします。
  • タイムスタンプの追加:参照のためにタイムスタンプを特徴量のDataFrameに追加します。

ステップ7:特徴量の返却

return jp_holiday_features
  • 出力:計算された祝日特徴量を含むDataFrameを返します。

実用的な応用

これらの特徴量が有用な理由

  • 市場休場の認識:祝日による市場の休場を知ることで、実行されない注文を出すのを防ぎます。
  • 流動性の予測:祝日は市場参加者の減少につながり、流動性やスプレッドに影響を与えます。
  • ボラティリティの予測:祝日の前後の期間は、異なるボラティリティパターンを示す可能性があります。
  • 戦略的なタイミング:祝日への接近度に基づいて取引戦略を調整することで、エントリーポイントとエグジットポイントを最適化できます。

モデルへの特徴量の統合

  • データ準備jp_holiday_features DataFrameをUSD/JPYデータセットとマージします。
  • 特徴量エンジニアリング:祝日特徴量を価格変動を予測する機械学習モデルの入力として使用します。
  • バックテスト:過去のデータを分析し、祝日の前後で市場がどのように動いたかを確認し、それに応じて戦略を調整します。

結論

日本の祝日情報をFX取引モデルに組み込むことで、USD/JPYペアに特有の市場動態に関する貴重な洞察を得ることができます。create_jp_holiday_features関数はこのプロセスを自動化し、クオンツ分析を強化するための重要な特徴量を提供します。

国の祝日と通貨の動きの相互作用を理解することは、FX取引の重要な側面です。取引の旅を進めるにつれて、このような細かなデータをモデルに継続的に統合し、ダイナミックなFX市場で一歩先を行きましょう。

P-HunterP-Hunter

10年分以上の1分足データを処理するとさすがに重い。改善して。
それと外国の祝日も追加してみて。