📅

Google Cloud Calendar APIを使ってトレーディングバックテストタイミングを閲覧

に公開

はじめに

私は株式取引システムを運用していますが、高頻度もあれば低頻度(手動)もあります。手動の場合、時々忘れてしまうんですよね、発注作業を。
よっては中システム側で取引タイミングをYAML出力し、Googleカレンダーに定期同期させてスマホで見るという運用をしております。

本記事では、このシステムのアーキテクチャを少しご紹介させていただきます。

alt text
※イメージです

システムの特徴

このシステムは以下のような特徴があります。

  • YAMLでイベント管理: 発注指示のプログラムが複数ある場合を想定し、フォーマットを揃えることで汎用的にする
  • 常駐型同期: Dockerコンテナとしてサーバ常駐し、1分ごとに自動同期
  • 全件入れ替え: 既存イベントを削除してからYAMLの内容で再作成(常に一致を保証)。バックテストで取引タイミングがガラッと変わるときもあったりしますしね
  • 複数カレンダー対応: 一つのコンテナで複数のカレンダーを同期可能

システムアーキテクチャ

システムの全体像は以下の通りです。

同期の流れ

  1. 起動時: サービスアカウント鍵を環境変数に設定
  2. 1分ごと:
    • 設定ファイル(calendars.yaml)を読み込み
    • 各カレンダーについて:
      • 既存の全イベントを削除
      • YAMLファイルからイベントを読み込み
      • Google Calendar APIで新規作成
  3. ファイル監視: YAMLファイルが更新されれば、次の同期サイクルで反映

イベント定義

YAMLで取引タイミングを定義します。

metadata:
  calendar_name: sample_strategy
  timezone: Asia/Tokyo

events:
  # 個別の取引タイミング
  - summary: sample BUY Signal
    description: "価格: 42,350円, 強度: High"
    start: 2025-11-10T09:30:00+09:00
    end: 2025-11-10T10:00:00+09:00

  - summary: sample SELL Signal
    description: "価格: 43,120円, 強度: Medium"
    start: 2025-11-10T14:15:00+09:00
    end: 2025-11-10T14:45:00+09:00

  # 繰り返しの定期チェック
  - summary: 市場チェック
    start: 2025-11-11T09:00:00+09:00
    end: 2025-11-11T09:15:00+09:00
    recurrence:
      - RRULE:FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR

  # 終日イベント(決算発表日など)
  - summary: 決算発表日 - 取引注意
    all_day: true
    start_date: 2025-11-15
    end_date: 2025-11-16

サポートしているフィールド:

  • 基本情報: summary(必須)、description
  • 日時: start/end(ISO-8601形式)、all_day(終日の場合)
  • 繰り返し: recurrence(RRULE配列)
  • リマインダー: reminders(デフォルトまたはカスタム)

YAMLファイルを編集すると、次回の同期サイクル(最大1分後)で自動的にカレンダーに反映されます。

実際の使用例

ケース1: sample戦略の取引タイミング

バックテストで算出したsample戦略の取引タイミングをYAMLで出力し、カレンダーに自動反映させています。

- summary: sample BUY Signal
  description: "価格: 42,350円, 強度: High"
  start: 2025-11-10T09:30:00+09:00
  end: 2025-11-10T10:00:00+09:00

- summary: sample SELL Signal
  description: "価格: 43,120円, 強度: Medium"
  start: 2025-11-10T14:15:00+09:00
  end: 2025-11-10T14:45:00+09:00

バッチ処理でsample.yamlを生成すると、1分以内にGoogleカレンダーに反映されます。スマートフォンで取引タイミングを視覚的に確認できるので、発注忘れがなくなりました。

ケース2: 経済指標発表の通知

重要な経済指標の発表タイミングもYAMLで管理しています。

- summary: 米雇用統計発表
  description: "取引注意 - ボラティリティ上昇"
  start: 2025-11-08T22:30:00+09:00
  end: 2025-11-08T23:00:00+09:00
  reminders:
    use_default: false
    overrides:
      - method: popup
        minutes: 30

ケース3: 定期的な市場チェック

毎朝の市場チェックを繰り返しイベントで設定しています。

- summary: 市場チェック
  start: 2025-11-11T09:00:00+09:00
  end: 2025-11-11T09:15:00+09:00
  recurrence:
    - RRULE:FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR  # 平日のみ

マルチカレンダー同期

複数の戦略や銘柄ごとにカレンダーを分けて管理できます。

# config/calendars.yaml
calendars:
  - name: Sample Strategy
    calendar_id: "sample-calendar@group.calendar.google.com"
    events_file: "sample.yaml"
    clear_existing: true

  - name: Momentum Strategy
    calendar_id: "momentum-calendar@group.calendar.google.com"
    events_file: "momentum.yaml"
    clear_existing: true

それぞれのYAMLファイルを編集すれば、対応するカレンダーに反映されます。戦略ごとにカレンダーを色分けしておくと、スマートフォンで見やすくなります。

まとめ

YAMLファイルでGoogleカレンダーの予定を管理することで、以下のような利点があります。

  • プログラム連携: バックテスト結果や取引シグナルを自動でカレンダーに反映
  • 発注忘れ防止: スマートフォンで取引タイミングを視覚的に確認できる
  • 常駐同期: ファイルを更新すれば自動的にカレンダーに反映
  • 複数戦略対応: 戦略ごとにカレンダーを分けて管理可能

特に、手動発注が必要な低頻度取引の場合、カレンダー通知があると発注忘れがなくなるので便利です。

Discussion