・約3分で読めます

Python + REST API で FX 自動売買を始める最小構成


PRXサーバー国内シェアNo.1のレンタルサーバー。高速・安定・サポート充実で初心者にもおすすめ。
Xサーバー 公式サイト →

はじめに

FX 自動売買 Bot は「難しそう」と思われがちですが、最小構成なら Python ファイル 1 つ + 無料 API で動きます。

この記事では、GMOコイン外国為替 FX の REST API を使い、最小限のコードで自動売買の仕組みを構築する方法を解説します。

注意: この記事は教育目的です。実際のトレードは自己責任で行ってください。

必要なもの

項目 内容 コスト
Python 3.10 以上 無料
GMOコイン口座 外国為替FX有効化済み 無料
API キー GMOコイン管理画面で発行 無料
ライブラリ requests, pandas, ta-lib or pandas-ta 無料

GMOコインの口座開設はこちら — 口座開設から外国為替FX有効化まで解説しています。

Bot開発者向け口座選び: Python対応!API公開済みFX・暗号資産おすすめ取引所比較 — APIの仕様・ccxt対応・デモ口座有無を比較しています。

アーキテクチャ(最小構成)

fx-bot-minimal/
├── main.py           # メインスクリプト(これだけで動く)
├── .env              # API キー(Git にコミットしない)
└── requirements.txt  # 依存ライブラリ

最小構成のポイントは「1 ファイルで完結」すること。データベースもフレームワークも不要です。

Step 1: API 認証

GMOコイン API は HMAC-SHA256 による署名認証を使います。

import hashlib
import hmac
import time
import requests
from urllib.parse import urlencode

API_KEY = "YOUR_API_KEY"
API_SECRET = "YOUR_API_SECRET"
BASE_URL = "https://forex-api.coin.z.com"

def get_headers(method: str, path: str, body: str = "") -> dict:
    timestamp = str(int(time.time() * 1000))
    text = timestamp + method + path + body
    sign = hmac.new(
        API_SECRET.encode(),
        text.encode(),
        hashlib.sha256
    ).hexdigest()
    return {
        "API-KEY": API_KEY,
        "API-TIMESTAMP": timestamp,
        "API-SIGN": sign,
    }

実際の運用では .env ファイルに API キーを格納し、python-dotenv で読み込みましょう。キーをコードにハードコードするのは厳禁です。

Step 2: ローソク足データの取得

def get_candles(symbol: str = "USD_JPY", interval: str = "1hour", count: int = 100):
    path = "/public/v1/klines"
    params = {"symbol": symbol, "interval": interval, "count": count}
    url = f"{BASE_URL}{path}?{urlencode(params)}"
    res = requests.get(url)
    res.raise_for_status()
    data = res.json()["data"]
    return data

公開 API なので認証不要。interval には 1min, 5min, 15min, 1hour, 4hour, 1day などが指定できます。

Step 3: テクニカル指標の計算

移動平均線(EMA)とRSIを計算します。pandas-ta を使えば 1 行で計算できます。

import pandas as pd
import pandas_ta as ta

def calc_indicators(candles: list) -> pd.DataFrame:
    df = pd.DataFrame(candles)
    df["close"] = df["close"].astype(float)

    # EMA(短期: 9, 長期: 21)
    df["ema_short"] = ta.ema(df["close"], length=9)
    df["ema_long"] = ta.ema(df["close"], length=21)

    # RSI(14期間)
    df["rsi"] = ta.rsi(df["close"], length=14)

    return df

Step 4: 売買シグナルの判定

最もシンプルなトレンドフォロー戦略: EMA のゴールデンクロス/デッドクロスで売買します。

def get_signal(df: pd.DataFrame) -> str:
    latest = df.iloc[-1]
    prev = df.iloc[-2]

    # RSI フィルター: 過熱時はエントリーしない
    if latest["rsi"] > 70 or latest["rsi"] < 30:
        return "HOLD"

    # ゴールデンクロス: 短期EMAが長期EMAを上抜け
    if prev["ema_short"] <= prev["ema_long"] and latest["ema_short"] > latest["ema_long"]:
        return "BUY"

    # デッドクロス: 短期EMAが長期EMAを下抜け
    if prev["ema_short"] >= prev["ema_long"] and latest["ema_short"] < latest["ema_long"]:
        return "SELL"

    return "HOLD"

Step 5: 注文の発行

def place_order(side: str, symbol: str = "USD_JPY", size: str = "1000"):
    path = "/private/v1/order"
    body = {
        "symbol": symbol,
        "side": side,
        "executionType": "MARKET",
        "size": size,
    }
    import json
    body_str = json.dumps(body)
    headers = get_headers("POST", path, body_str)
    headers["Content-Type"] = "application/json"
    res = requests.post(f"{BASE_URL}{path}", headers=headers, data=body_str)
    res.raise_for_status()
    return res.json()

最小取引単位は 1,000 通貨。USD/JPY なら約 6,000 円の証拠金で始められます(レバレッジ 25 倍の場合)。

Step 6: メインループ

import time

def main():
    print("FX Bot 起動")
    while True:
        try:
            candles = get_candles()
            df = calc_indicators(candles)
            signal = get_signal(df)
            print(f"Signal: {signal}")

            if signal in ("BUY", "SELL"):
                result = place_order(signal)
                print(f"Order: {result}")

        except Exception as e:
            print(f"Error: {e}")

        # 1時間足なら1時間待つ
        time.sleep(3600)

if __name__ == "__main__":
    main()

この最小構成の限界

最小構成は「動くことの確認」が目的です。実運用には以下が必要です。

機能 最小構成 実運用
ポジション管理 なし 保有中の重複注文防止
ストップロス なし 必須(最大損失の制限)
ログ記録 print のみ ファイル/DB に永続化
エラー通知 なし LINE/Slack 通知
デプロイ ローカル実行 サーバー 24 時間稼働

本格的な Bot 構築の全工程は Claude Code で FX 自動売買 Bot を作った話 で解説しています。 24 時間稼働の方法は Oracle Cloud Always Free で FX Bot を無料運用する方法 を参照してください。

リスク管理の重要性

自動売買は便利ですが、リスク管理なしの Bot は口座を壊します。最低限、以下を実装してください。

  1. ストップロス: 1 トレードの最大損失を資金の 1〜2% に制限
  2. 1 日の最大損失: 日次で -3% に達したら自動停止
  3. ポジションサイズ: 資金に対して過大なロットを取らない

ドローダウン管理の詳細は FX Bot のドローダウン管理と自動停止の仕組み で解説しています。

まとめ

Python + REST API で FX 自動売買を始める最小構成を紹介しました。

  1. API 認証: HMAC-SHA256 署名
  2. データ取得: ローソク足を REST API で取得
  3. 指標計算: pandas-ta で EMA + RSI
  4. シグナル判定: ゴールデンクロス / デッドクロス
  5. 注文発行: MARKET 注文を POST

まずは デモ環境やごく小さなロット で動作確認し、リスク管理を十分に実装してから実運用に移行しましょう。

口座開設から運用までの一気通貫ガイドは PythonでFX自動売買Botを作る入門ガイド にまとめています。

コードを動かすために必要なもの

この記事のスクリプトを実行するには、GMOコインのFX口座とAPIキーが必要です。口座開設は無料、維持費もかかりません。

GMOコイン 無料口座開設はこちら →

関連記事

※ 当記事のリンクにはアフィリエイトリンクを含む場合があります。口座開設の費用には影響しません。