開発者なら誰でも悩む為替データ取得の問題を、実践的なコード付きでまとめました。戦略を作ることや画面を作ることよりも、安定したデータをいかに楽に取得するかが、一番大変なポイントです。

リアルタイムのレートと、過去の K ラインデータの両方を取得しようとすると、API が複数あってフォーマットがバラバラ、アクセス制限も違う…… すぐに不具合が出てしまいます。特に、戦略システムやグラフ表示にデータを安定的に渡す場面では、遅延や切断が大きなストレスになります。


為替 API を選ぶときに重視する 3 つのポイント

私は無料の公開 API から有料の専用サービスまで多くを試しました。無料 API は遅延が大きく、アクセス制限が厳しい。有料サービスは安定しているけど、認証やフォーマット調整が手間です。

最終的に、以下の 3 点を重視して選ぶようになりました。

  • リアルタイム性(遅延が少ない)
  • 過去データの充実度
  • API の使いやすさ(WebSocket / REST 対応)

使う前には必ず小さなテストを行い、WebSocket・REST に対応しているかサンプルコードが豊富かを確認すると、開発の手間が大幅に減らせます。


リアルタイム為替レートの取得(WebSocket)

トレードシステムにはリアルタイム性が不可欠です。ポーリング(定期的に取得)よりも、WebSocketによるプッシュ通知のほうが安定して高速です。

ここでは AllTick API を使った実用コードを紹介します。

import websocket
import json

def on_message(ws, message):
    data = json.loads(message)
    print("リアルタイムデータ:", data)

def on_open(ws):
    subscribe = {
        "type": "subscribe",
        "symbols": ["EURUSD", "USDJPY"]
    }
    ws.send(json.dumps(subscribe))

ws = websocket.WebSocketApp(
    "wss://api.alltick.co/ws/forex",
    on_message=on_message,
    on_open=on_open
)
ws.run_forever()

これだけで、EURUSD や USDJPY のティックデータをリアルタイムで取得可能。実際の運用では、切断時の自動再接続エラーログの記録を追加すると、より安定します。


過去データの取得と処理

リアルタイムだけでなく、過去の K ラインデータも戦略の検証(バックテスト)には必須です。日足や時間足で取得し、キャッシュして使うと効率的です。

同じく AllTick API を使ったコードはこちら。

import requests
import pandas as pd

# EURUSD 過去データ取得
url = "https://apis.alltick.co/ws/forex/history"
params = {
    "symbol": "EURUSD",
    "start": "2025-04-01",
    "end": "2026-04-01",
    "interval": "1d"
}

resp = requests.get(url, params=params).json()
df = pd.DataFrame(resp['data'])
print(df.head())

取得したデータはそのまま pandas で扱えるため、分析やバックテストがスムーズです。期間を分けて取得してから結合すると、大きなデータも安全に取得できます。


データのキャッシュと保存(実践運用)

データを取得したあとは、キャッシュアーカイブの 2 段階で管理するのがおすすめです。

  • キャッシュ:Redis やメモリに数時間分を保存 → リアルタイム表示や計算に使用
  • アーカイブ:月単位・年単位で CSV やデータベースに保存 → 後から分析・再検証

リアルタイムデータと過去データを役割分担して管理すると、システムが分かりやすくなり、トラブルシューティングも楽になります。


開発を通して感じたこと

実際に使い続けて分かったのは、機能の多さより「安定性」と「メンテナンスのしやすさ」が重要だということ。どんなに高機能でも、切断が多かったりフォーマットが不安定だと、開発コストが倍になります。

私のプロジェクトでは、リアルタイムデータ + 過去データが 1 つの API で完結するスタイルが、一番使いやすく、戦略開発もバックテストもスムーズに進められています。

プロジェクトの目的に合ったデータ取得方法を見つけることが、開発の効率を大きく変えてくれます。