
本ページにはプロモーションが含まれています。
GMOコインFX APIを利用すると、ドル円やユーロドルなどのローソク足データをPythonから取得できます。
取得したデータをCSVに保存すれば、チャート分析やテクニカル指標の計算、FX自動売買Botのバックテストなどに活用が可能です。
しかし、初めてAPIを使う場合は、
- APIキーは必要なのか
- どのようにPythonからデータを取得するのか
- 通貨ペアや時間足はどこで変更するのか
- 取得したCSVはどこに保存されるのか
といった疑問を持つ方も多いのではないでしょうか。
そこで本記事では、GMOコインFXのPublic APIを利用して、指定した通貨ペア・時間足・期間のローソク足を取得し、CSVに保存する方法を紹介します。
そのまま利用できるPythonのサンプルコードも掲載しているため、APIを初めて利用する方でも、手順に沿って進めることでローソク足を取得できます。
ぜひ最後までご覧ください!
サンプルコードだけ確認したい方は、以下をクリックしてください。
↓ ↓ ↓ クリックすると開けます ↓ ↓ ↓
import certifi
import csv
import json
import ssl
import time
from datetime import date, datetime, timedelta, timezone
from pathlib import Path
from urllib.parse import urlencode
from urllib.request import Request, urlopen
# 使い方:
# 1. このファイルを GMO-API などの任意のフォルダに保存します。
# 2. 下の SYMBOL, INTERVAL, START_DATE, PRICE_TYPE を必要に応じて変更します。
# 3. PowerShellなどを開き、このファイルを保存したフォルダへ移動します。
# cd GMO-API
# 4. 次のコマンドを実行します。
# python fetch_gmo_candles.py
# 5. CSVは data/candles フォルダの下に保存されます。
# 例: data/candles/USD_JPY/15min_ASK.csv
# 6. APIは1リクエストごとに1秒待って実行します。
# 取得条件を変えたい場合は、ここを変更してください。
# SYMBOL: 取得する通貨ペアです。例: "USD_JPY", "EUR_USD", "EUR_JPY", "GBP_JPY", "AUD_USD"
# INTERVAL: ローソク足の時間足です。
# "1min", "5min", "10min", "15min", "30min", "1hour" は、GMO APIへ YYYYMMDD 形式で日付を渡します。
# "4hour", "8hour", "12hour", "1day", "1week", "1month" は、GMO APIへ YYYY 形式で年を渡します。
# START_DATE: 取得開始日です。この日から今日までのデータを取得します。
# PRICE_TYPE: 取得する価格種別です。今回は簡易的なサンプルとして "ASK" を使います。
# BID価格を取得したい場合は "BID" に変更してください。
# OUTPUT_DIR: CSVファイルを保存する親フォルダです。通常は変更しなくてOKです。
# OUTPUT_CSV_PATH: 実際の保存先です。例: data/candles/USD_JPY/15min_ASK.csv
SYMBOL = "USD_JPY"
INTERVAL = "15min"
START_DATE = date(2026, 1, 1)
PRICE_TYPE = "ASK"
OUTPUT_DIR = Path(__file__).resolve().parent / "data" / "candles"
OUTPUT_CSV_PATH = OUTPUT_DIR / SYMBOL / f"{INTERVAL}_{PRICE_TYPE}.csv"
# GMO FXのローソク足APIです。
BASE_URL = "https://forex-api.coin.z.com/public/v1/klines"
# GMO APIへ連続でアクセスしすぎないように、1回ごとに1秒待ちます。
REQUEST_INTERVAL_SECONDS = 1.0
# GMO APIで日付をYYYYMMDD形式で渡す時間足です。
DAILY_DATE_KEY_INTERVALS = ["1min", "5min", "10min", "15min", "30min", "1hour"]
# GMO APIで日付をYYYY形式で渡す時間足です。
YEAR_DATE_KEY_INTERVALS = ["4hour", "8hour", "12hour", "1day", "1week", "1month"]
# certifiが持っている証明書一覧を使って、HTTPS通信の証明書を検証します。
# Windows環境で CERTIFICATE_VERIFY_FAILED になる場合の対策です。
SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where())
# GMO APIの時刻はUTCのミリ秒で返るため、CSVにはJSTへ変換して保存します。
JST = timezone(timedelta(hours=9), name="JST")
# CSVに出力する列です。
CSV_COLUMNS = [
"timestamp_jst",
"open",
"high",
"low",
"close",
]
def make_gmo_date_keys(end_date):
"""INTERVALに合わせて、GMO APIへ渡すdateキーを作る。"""
if INTERVAL in DAILY_DATE_KEY_INTERVALS:
# 1時間足以下は、GMO APIへ "20260102" のような日付を1日ずつ渡します。
number_of_days = (end_date - START_DATE).days
return [
(START_DATE + timedelta(days=day_offset)).strftime("%Y%m%d")
for day_offset in range(number_of_days + 1)
]
if INTERVAL in YEAR_DATE_KEY_INTERVALS:
# 4時間足以上は、GMO APIへ "2026" のような年を渡します。
return [str(year) for year in range(START_DATE.year, end_date.year + 1)]
raise ValueError(f"Unsupported INTERVAL: {INTERVAL}")
def fetch_klines(date_key):
"""GMO FX APIから指定した価格種別のローソク足を取得する。"""
# 1秒待ってからAPIを呼び出します。
time.sleep(REQUEST_INTERVAL_SECONDS)
# APIに渡すパラメータを作ります。
# date_key は "20260102" または "2026" のような文字列です。
query = urlencode(
{
"symbol": SYMBOL,
"priceType": PRICE_TYPE,
"interval": INTERVAL,
"date": date_key,
}
)
# APIのURLを作り、User-Agentを付けてリクエストします。
request = Request(f"{BASE_URL}?{query}", headers={"User-Agent": "gmo-api-csv-fetcher/1.0"})
# GMO APIへアクセスして、返ってきたJSON文字列をPythonの辞書に変換します。
with urlopen(request, context=SSL_CONTEXT) as response:
payload = json.loads(response.read().decode("utf-8"))
# GMO APIのstatusが0以外なら、エラーとして止めます。
if int(payload.get("status", -1)) != 0:
raise RuntimeError(f"GMO FX API returned error: {payload}")
# payload["data"] にローソク足の配列が入っています。
# CSVに保存しやすい形へ変換して返します。
return normalize_rows(payload.get("data", []))
def normalize_rows(rows):
"""APIのレスポンスをCSVに保存しやすい形に変換する。"""
normalized = []
for row in rows:
# openTimeはUTCのミリ秒です。
# 例: 1704067200000 のような値を日時に変換します。
open_time_ms = int(row["openTime"])
timestamp_utc = datetime.fromtimestamp(open_time_ms / 1000, tz=timezone.utc)
timestamp_jst = timestamp_utc.astimezone(JST)
# CSVに必要な項目だけ取り出します。
normalized.append(
{
"timestamp_jst": timestamp_jst.isoformat(timespec="seconds"),
"open": row["open"],
"high": row["high"],
"low": row["low"],
"close": row["close"],
}
)
# 時刻順に並べて返します。
return sorted(normalized, key=lambda item: item["timestamp_jst"])
def filter_rows_by_period(rows, end_date):
"""取得開始日から終了日までのローソク足だけに絞る。"""
filtered_rows = []
for row in rows:
candle_date = datetime.fromisoformat(row["timestamp_jst"]).date()
if START_DATE <= candle_date <= end_date:
filtered_rows.append(row)
return filtered_rows
def write_csv(rows):
"""CSVに保存する。既存ファイルがある場合は上書きする。"""
# 保存先フォルダがなければ作ります。
# 例: data/candles/USD_JPY
OUTPUT_CSV_PATH.parent.mkdir(parents=True, exist_ok=True)
# "w" は上書き保存です。既存CSVがある場合は中身が置き換わります。
with OUTPUT_CSV_PATH.open("w", encoding="utf-8", newline="") as file:
writer = csv.DictWriter(file, fieldnames=CSV_COLUMNS)
writer.writeheader()
writer.writerows(rows)
def main():
# START_DATEから今日までを取得します。
# ※ 今日のデータには、形成途中のローソク足が含まれる場合があります。
end_date = datetime.now(JST).date()
# INTERVALに合わせて、GMO APIへ渡すdateキーを作ります。
# 例1: INTERVAL = "15min" なら ["20260101", "20260102", ...]
# 例2: INTERVAL = "4hour" なら ["2026"]
gmo_date_keys = make_gmo_date_keys(end_date)
print(f"Target date keys: {gmo_date_keys[0]} to {gmo_date_keys[-1]} ({len(gmo_date_keys)} requests)")
# すべての日付または年のローソク足を、このリストにまとめます。
all_rows = []
for date_key in gmo_date_keys:
print(
"Fetching "
f"symbol={SYMBOL} price_type={PRICE_TYPE} "
f"interval={INTERVAL} date={date_key}"
)
# 1日分または1年分のローソク足を取得し、まとめ用リストに追加します。
rows = fetch_klines(date_key)
all_rows.extend(rows)
print(f"Fetched {len(rows)} rows")
# 4hourや1dayは年単位で取得するため、START_DATEより前や今日より後の足が混ざる場合があります。
# 最後に指定期間だけに絞ってからCSVへ保存します。
all_rows = filter_rows_by_period(all_rows, end_date)
# 取得したすべてのローソク足をCSVに保存します。
write_csv(all_rows)
print(f"Saved {len(all_rows)} rows to {OUTPUT_CSV_PATH}")
# このファイルを直接実行したときだけ main() を動かします。
if __name__ == "__main__":
main()
GMOコインFX Public APIとは

GMOコインFX APIは、プログラムから外国為替FXの価格情報を取得したり、注文を実行したりできるサービスです。
GMOコインFX APIには、Public APIとPrivate APIの2種類があります。
- Public API:現在価格、取扱通貨ペア、ローソク足などの取得
- Private API:注文、建玉、口座情報などの取得・操作
今回使用するのは、ローソク足を取得できるPublic APIです。
APIキーを発行する必要がないため、Pythonから比較的簡単に利用できます。
この記事では、指定した通貨ペア・時間足・期間のローソク足を取得し、CSVファイルに保存する方法を紹介します。
GMOコインFX APIでローソク足を取得してCSVに保存する3ステップ

ここからは、Pythonスクリプトを使ってGMOコインFX APIからローソク足を取得し、CSVファイルに保存する方法を紹介します。
今回使用するのは認証不要のPublic APIなので、APIキーを発行する必要はありません。
スクリプトを準備して取得条件を設定すれば、指定した通貨ペアのローソク足を取得できます。
GMO API からスクリプトを利用してローソク足を取得する方法は、以下の3ステップです。
- 実行環境とスクリプトを準備する
- 取得する通貨ペアや時間足を設定する
- スクリプトを実行してCSVを確認する
1つずつ詳しく見ていきましょう。
ステップ1:実行環境とスクリプトを準備する
最初に、スクリプトを実行するための環境を準備します。
今回のスクリプトを実行するには、パソコンにPythonがインストールされている必要があります。
PowerShellを開き、以下のコマンドを実行してください。
python --version
Pythonのバージョンが表示されれば、インストールされています。
コマンドが実行できない場合は、Python公式サイトからPythonをインストールしてください。
続いて、今回のスクリプトで使用する「certifi」をインストールします。
python -m pip install certifi
certifiは、PythonからHTTPS通信を行う際に使用する証明書を提供するライブラリです。
今回のコードでは、Windows環境で発生することがあるSSL証明書エラーへの対策として使用しています。
次に、任意の場所へ「GMO-APIなどのフォルダ」を作成します。
その中に以下のファイルを作成してください。
fetch_gmo_candles.py
作成したファイルへ、以下のPythonコードをコピーして保存します。
↓ ↓ ↓ クリックすると開けます ↓ ↓ ↓
import certifi
import csv
import json
import ssl
import time
from datetime import date, datetime, timedelta, timezone
from pathlib import Path
from urllib.parse import urlencode
from urllib.request import Request, urlopen
# 使い方:
# 1. このファイルを GMO-API などの任意のフォルダに保存します。
# 2. 下の SYMBOL, INTERVAL, START_DATE, PRICE_TYPE を必要に応じて変更します。
# 3. PowerShellなどを開き、このファイルを保存したフォルダへ移動します。
# cd GMO-API
# 4. 次のコマンドを実行します。
# python fetch_gmo_candles.py
# 5. CSVは data/candles フォルダの下に保存されます。
# 例: data/candles/USD_JPY/15min_ASK.csv
# 6. APIは1リクエストごとに1秒待って実行します。
# 取得条件を変えたい場合は、ここを変更してください。
# SYMBOL: 取得する通貨ペアです。例: "USD_JPY", "EUR_USD", "EUR_JPY", "GBP_JPY", "AUD_USD"
# INTERVAL: ローソク足の時間足です。
# "1min", "5min", "10min", "15min", "30min", "1hour" は、GMO APIへ YYYYMMDD 形式で日付を渡します。
# "4hour", "8hour", "12hour", "1day", "1week", "1month" は、GMO APIへ YYYY 形式で年を渡します。
# START_DATE: 取得開始日です。この日から今日までのデータを取得します。
# PRICE_TYPE: 取得する価格種別です。今回は簡易的なサンプルとして "ASK" を使います。
# BID価格を取得したい場合は "BID" に変更してください。
# OUTPUT_DIR: CSVファイルを保存する親フォルダです。通常は変更しなくてOKです。
# OUTPUT_CSV_PATH: 実際の保存先です。例: data/candles/USD_JPY/15min_ASK.csv
SYMBOL = "USD_JPY"
INTERVAL = "15min"
START_DATE = date(2026, 1, 1)
PRICE_TYPE = "ASK"
OUTPUT_DIR = Path(__file__).resolve().parent / "data" / "candles"
OUTPUT_CSV_PATH = OUTPUT_DIR / SYMBOL / f"{INTERVAL}_{PRICE_TYPE}.csv"
# GMO FXのローソク足APIです。
BASE_URL = "https://forex-api.coin.z.com/public/v1/klines"
# GMO APIへ連続でアクセスしすぎないように、1回ごとに1秒待ちます。
REQUEST_INTERVAL_SECONDS = 1.0
# GMO APIで日付をYYYYMMDD形式で渡す時間足です。
DAILY_DATE_KEY_INTERVALS = ["1min", "5min", "10min", "15min", "30min", "1hour"]
# GMO APIで日付をYYYY形式で渡す時間足です。
YEAR_DATE_KEY_INTERVALS = ["4hour", "8hour", "12hour", "1day", "1week", "1month"]
# certifiが持っている証明書一覧を使って、HTTPS通信の証明書を検証します。
# Windows環境で CERTIFICATE_VERIFY_FAILED になる場合の対策です。
SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where())
# GMO APIの時刻はUTCのミリ秒で返るため、CSVにはJSTへ変換して保存します。
JST = timezone(timedelta(hours=9), name="JST")
# CSVに出力する列です。
CSV_COLUMNS = [
"timestamp_jst",
"open",
"high",
"low",
"close",
]
def make_gmo_date_keys(end_date):
"""INTERVALに合わせて、GMO APIへ渡すdateキーを作る。"""
if INTERVAL in DAILY_DATE_KEY_INTERVALS:
# 1時間足以下は、GMO APIへ "20260102" のような日付を1日ずつ渡します。
number_of_days = (end_date - START_DATE).days
return [
(START_DATE + timedelta(days=day_offset)).strftime("%Y%m%d")
for day_offset in range(number_of_days + 1)
]
if INTERVAL in YEAR_DATE_KEY_INTERVALS:
# 4時間足以上は、GMO APIへ "2026" のような年を渡します。
return [str(year) for year in range(START_DATE.year, end_date.year + 1)]
raise ValueError(f"Unsupported INTERVAL: {INTERVAL}")
def fetch_klines(date_key):
"""GMO FX APIから指定した価格種別のローソク足を取得する。"""
# 1秒待ってからAPIを呼び出します。
time.sleep(REQUEST_INTERVAL_SECONDS)
# APIに渡すパラメータを作ります。
# date_key は "20260102" または "2026" のような文字列です。
query = urlencode(
{
"symbol": SYMBOL,
"priceType": PRICE_TYPE,
"interval": INTERVAL,
"date": date_key,
}
)
# APIのURLを作り、User-Agentを付けてリクエストします。
request = Request(f"{BASE_URL}?{query}", headers={"User-Agent": "gmo-api-csv-fetcher/1.0"})
# GMO APIへアクセスして、返ってきたJSON文字列をPythonの辞書に変換します。
with urlopen(request, context=SSL_CONTEXT) as response:
payload = json.loads(response.read().decode("utf-8"))
# GMO APIのstatusが0以外なら、エラーとして止めます。
if int(payload.get("status", -1)) != 0:
raise RuntimeError(f"GMO FX API returned error: {payload}")
# payload["data"] にローソク足の配列が入っています。
# CSVに保存しやすい形へ変換して返します。
return normalize_rows(payload.get("data", []))
def normalize_rows(rows):
"""APIのレスポンスをCSVに保存しやすい形に変換する。"""
normalized = []
for row in rows:
# openTimeはUTCのミリ秒です。
# 例: 1704067200000 のような値を日時に変換します。
open_time_ms = int(row["openTime"])
timestamp_utc = datetime.fromtimestamp(open_time_ms / 1000, tz=timezone.utc)
timestamp_jst = timestamp_utc.astimezone(JST)
# CSVに必要な項目だけ取り出します。
normalized.append(
{
"timestamp_jst": timestamp_jst.isoformat(timespec="seconds"),
"open": row["open"],
"high": row["high"],
"low": row["low"],
"close": row["close"],
}
)
# 時刻順に並べて返します。
return sorted(normalized, key=lambda item: item["timestamp_jst"])
def filter_rows_by_period(rows, end_date):
"""取得開始日から終了日までのローソク足だけに絞る。"""
filtered_rows = []
for row in rows:
candle_date = datetime.fromisoformat(row["timestamp_jst"]).date()
if START_DATE <= candle_date <= end_date:
filtered_rows.append(row)
return filtered_rows
def write_csv(rows):
"""CSVに保存する。既存ファイルがある場合は上書きする。"""
# 保存先フォルダがなければ作ります。
# 例: data/candles/USD_JPY
OUTPUT_CSV_PATH.parent.mkdir(parents=True, exist_ok=True)
# "w" は上書き保存です。既存CSVがある場合は中身が置き換わります。
with OUTPUT_CSV_PATH.open("w", encoding="utf-8", newline="") as file:
writer = csv.DictWriter(file, fieldnames=CSV_COLUMNS)
writer.writeheader()
writer.writerows(rows)
def main():
# START_DATEから今日までを取得します。
# ※ 今日のデータには、形成途中のローソク足が含まれる場合があります。
end_date = datetime.now(JST).date()
# INTERVALに合わせて、GMO APIへ渡すdateキーを作ります。
# 例1: INTERVAL = "15min" なら ["20260101", "20260102", ...]
# 例2: INTERVAL = "4hour" なら ["2026"]
gmo_date_keys = make_gmo_date_keys(end_date)
print(f"Target date keys: {gmo_date_keys[0]} to {gmo_date_keys[-1]} ({len(gmo_date_keys)} requests)")
# すべての日付または年のローソク足を、このリストにまとめます。
all_rows = []
for date_key in gmo_date_keys:
print(
"Fetching "
f"symbol={SYMBOL} price_type={PRICE_TYPE} "
f"interval={INTERVAL} date={date_key}"
)
# 1日分または1年分のローソク足を取得し、まとめ用リストに追加します。
rows = fetch_klines(date_key)
all_rows.extend(rows)
print(f"Fetched {len(rows)} rows")
# 4hourや1dayは年単位で取得するため、START_DATEより前や今日より後の足が混ざる場合があります。
# 最後に指定期間だけに絞ってからCSVへ保存します。
all_rows = filter_rows_by_period(all_rows, end_date)
# 取得したすべてのローソク足をCSVに保存します。
write_csv(all_rows)
print(f"Saved {len(all_rows)} rows to {OUTPUT_CSV_PATH}")
# このファイルを直接実行したときだけ main() を動かします。
if __name__ == "__main__":
main()
フォルダの構成は、以下のようになります。
GMO-API/
└─ fetch_gmo_candles.py
CSVの保存先となるdata/candlesフォルダは、スクリプトの実行時に自動で作成されるため、事前に作成する必要はありません。
ステップ2:取得する通貨ペアや時間足を設定する
スクリプトを実行する前に、取得するローソク足の条件を設定します。
コードの上部にある以下の4項目を、取得したいデータに合わせて変更してください。
SYMBOL = "USD_JPY"
INTERVAL = "1hour"
START_DATE = date(2026, 1, 1)
PRICE_TYPE = "ASK"
それぞれの設定内容は、以下のとおりです。
| 設定項目 | 内容 | 設定例 |
|---|---|---|
SYMBOL | 取得する通貨ペア | "USD_JPY" |
INTERVAL | 取得する時間足 | "1hour" |
START_DATE | 取得を開始する日 | date(2026, 1, 1) |
PRICE_TYPE | ASKまたはBID | "ASK" |
例えば、ユーロドルの15分足を2026年4月1日から取得する場合は、以下のように変更します。
SYMBOL = "EUR_USD"
INTERVAL = "15min"
START_DATE = date(2026, 4, 1)
PRICE_TYPE = "ASK"
今回のスクリプトでは、以下の時間足などを指定できます。
- 1min
- 15min
- 1hour
- 4hour
- 1day
- 1week
必要な時間足のデータを取得してください。
また、今回の初期設定ではASKのローソク足を取得します。
BIDを取得したい場合は、以下のように変更してください。
PRICE_TYPE = "BID"
ステップ3:スクリプトを実行してCSVを確認する
設定が完了したら、PowerShellからスクリプトを実行しましょう。
まず、PowerShellを開き、fetch_gmo_candles.pyを保存したフォルダへ移動します。
cd GMO-API
保存場所によっては、フォルダのパスを指定してください。
cd "C:\Users\ユーザー名\Documents\GMO-API"
フォルダへ移動したら、以下のコマンドを実行します。
python fetch_gmo_candles.py
実行中は、以下のように取得対象の日付や取得件数がPowerShellに表示されます。

取得期間が長い場合は、処理の完了まで時間がかかります。
今回のスクリプトでは、APIへ短時間に連続してアクセスしないよう、1リクエストごとに1秒待ってから処理を行います。
処理が完了すると、以下のように保存件数とCSVの保存先が表示されます。

CSVは、以下のようなフォルダ構成で保存されます。
GMO-API/
├─ fetch_gmo_candles.py
└─ data/
└─ candles/
└─ USD_JPY/
└─ 1hour_ASK.csv
CSVには、ローソク足の日時・始値・高値・安値・終値が保存されます。
| 列名 | 内容 |
|---|---|
timestamp_jst | ローソク足の日時(日本時間) |
open | 始値 |
high | 高値 |
low | 安値 |
close | 終値 |
※ 今回のスクリプトは今日までのデータを取得するため、実行した時間によっては、形成途中のローソク足が含まれる場合があります。
スクリプトを利用する際の注意点

今回のスクリプトは、GMOコインFX APIからローソク足を簡単に取得できるように作成しています。
ただし、実行する際はいくつか注意点があります。
主な注意点は以下の3つです。
- 短時間に何度も実行しない
- 同じCSVファイルは上書きされる
- 土日や休場日はデータが取得できない場合がある
1つずつ詳しく見ていきましょう。
1. 短時間に何度も実行しない
私が、GMOコインFXの公式ドキュメントを見た限りでは、今回使用するPublic APIのローソク足取得について、「1秒間に何回まで」といった具体的なアクセス上限は記載されていません。
ただし、システム全体が高負荷になった場合や、APIの利用方法がシステムへ負荷をかけていると判断された場合には、APIの利用が制限される可能性があります。
そのため、短時間に大量のリクエストを送ったり、同じスクリプトを複数のPowerShellから同時に実行したりすることは避けましょう。
今回のスクリプトでは、安全を考えてAPIを呼び出す前に1秒待機するよう設定しています。
REQUEST_INTERVAL_SECONDS = 1.0
この1秒間隔は、GMOコインが定めたPublic APIの公式上限ではなく、APIへ連続してアクセスしすぎないためにスクリプト側で設けた待機時間です。
取得期間が長い場合はリクエスト数も増えるため、処理の完了まで時間がかかります。
実行中は同じスクリプトを重ねて起動せず、完了してから再実行してください。
2. 同じCSVファイルは上書きされる
今回のスクリプトは、取得したデータを既存のCSVへ追記するのではなく、毎回上書きして保存します。
保存先は、通貨ペア・時間足・価格種別によって決まります。
data/candles/USD_JPY/1hour_ASK.csv
同じ設定でスクリプトを再実行すると、同じ保存先のCSVファイルが新しい取得結果に置き換わります。
既存のCSVを残しておきたい場合は、スクリプトを実行する前にファイルを別の場所へコピーするか、ファイル名を変更して保存してください。
3. 土日や休場日はデータが取得できない場合がある
外国為替市場が動いていない土日や休場日には、APIからローソク足が返されず、取得件数が0件になる場合があります。
実行中に次のように表示されても、必ずしもスクリプトのエラーではありません。
Fetched 0 rows
スクリプトは0件の日があっても処理を続け、取得できた日付のローソク足をまとめてCSVへ保存します。
また、今回のスクリプトは今日までのデータを取得するため、実行する時間によっては形成途中のローソク足が含まれる場合があります。
GMOコインFX APIに関するよくある質問

GMOコインFX Public APIは無料で利用できますか?
今回利用するローソク足取得のPublic APIについて、GMOコインの公式ドキュメントには利用料金やAPI手数料の記載はありません。
私も実際にPublic APIを利用してローソク足を取得していますが、現時点で料金は発生していません。
そのため、現在は無料で利用できると考えてよいでしょう。
ただし、今後の仕様変更によって利用条件や料金体系が変更される可能性があります。
利用する際は、GMOコインの公式APIドキュメントで最新情報を確認してください。
GMOコインの口座は必要ですか?
今回使用するPublic APIでローソク足を取得するだけであれば、GMOコインの口座やAPIキーは必要ありません。
GMOコインFX APIには、認証不要のPublic APIと、APIキーによる認証が必要なPrivate APIがあります。
口座開設とAPIキーの発行が必要になるのは、注文や建玉の取得など、Private APIの機能を利用する場合です。
過去何年分のローソク足を取得できますか?
取得できる期間は、指定する時間足によって異なります。
1分足・5分足・10分足・15分足・30分足・1時間足は、2023年10月28日以降の日付を指定できます。
そのため、2026年8月時点では、約2年9か月分のデータを取得できます。
4時間足・8時間足・12時間足・日足・週足・月足は、通貨ペアごとの取扱開始年以降の指定が可能です。
取得できる期間は通貨ペアによって異なるため、正確な開始時期はGMOコインFX APIの取扱銘柄情報を確認してください。
まとめ

今回は、GMOコインFXのPublic APIを利用して、ローソク足を取得し、CSVファイルへ保存する方法を紹介しました。
Public APIはAPIキーなしで利用できるため、Pythonから比較的簡単に価格データの取得が可能です。
スクリプト内のSYMBOL、INTERVAL、START_DATE、PRICE_TYPEを変更すれば、取得する通貨ペアや時間足、期間、価格種別を切り替えられます。
また、取得したCSVには、日時・始値・高値・安値・終値が保存されます。
これらのデータは、チャートの作成やテクニカル指標の計算、FX自動売買Botのバックテストなどに活用が可能です。
今回のコードは、ローソク足を簡単に取得するためのサンプルです。
実際に利用する際は、APIへ短時間に何度もアクセスしないことや、同じCSVが上書きされることにも注意してください。