こんにちは、今日はバイナンス API で歴史ローソク足を取得する時、データが欠ける問題を解決する方法を、私の実践体験を交えてゆるっと紹介します✨

トレードの勉強や自動売買のバックテストをする時、過去のローソク足データは超重要ですよね。私も長年、バイナンス API を使ってデータを取得していますが、1 分足・5 分足の高頻度データや、長期間のデータを一気に取ろうとすると、途中で途切れたり、本数が足りなかったり… 何度も頭を悩ませました。

データが不完全だと、バックテストの結果が全然違っちゃうし、分析も無駄になっちゃうんです😭 今回は、私が実際に使っている確実にデータを揃える方法を、初心者さんでも分かりやすくまとめました!

なぜデータが欠けるの?

実はバイナンス API には **「1 回のリクエストで最大 1000 本まで」** というルールがあるんです!1 分足でも、1 時間足でも、日足でも、この制限は同じ。

  • 長い期間を一気に取得 → データが途中で切れる
  • 連続でリクエストしすぎ → 制限に引っかかって途切れる
  • 確認しないまま使う → 隠れた欠落に気づかない

これが、データ欠落の一番の原因なんですよ。

私が実践している 4 つの方法

難しい設定は一切なし、4 つのコツを守るだけで、データが完璧に揃います!

1. 時間を小分けにして取得する

長い期間を一気に取ろうとせず、1000 本以内になるように分割します。例:1 年分の 1 時間足 → 1 ヶ月ごとに分けて取得例:1 日分の 1 分足 → ループで少しずつ取得

2. タイムスタンプで時間を確認

各ローソク足にはopenTime(ミリ秒)という時間の目印があります。

  • 1 分足:60000 ミリ秒(毎分)
  • 5 分足:300000 ミリ秒(5 分ごと)

取得後に時間順に並べて、間隔がズレていたら欠落している証拠なので、すぐに再取得できます。

3. リクエストの間隔を少し空ける

連続で API にリクエストすると、制限に引っかかっちゃいます。0.2 秒だけ待つだけで、安定してデータが取れるようになりますよ✨

4. 最後に 3 つのチェックをする

取得したデータは、必ず確認してから使いましょう!

  1. 時間が途切れていないか
  2. 価格や出来高に空欄がないか
  3. データの本数が想定通りか

これで、データのミスを防げます。

すぐ使える Python コード

コピーして実行するだけで、自動でデータを取得して欠落を確認してくれます💻

import requests
import time
import pandas as pd

API_URL = "https://apis.alltick.co/stock/history-klines"
symbol = "BTCUSDT"
interval = "1m"
start_time = 1680000000000  # ミリ秒の開始時間
end_time = 1680100000000    # ミリ秒の終了時間

all_klines = []

# 分割して取得
while start_time < end_time:
    params = {
        "symbol": symbol,
        "interval": interval,
        "startTime": start_time,
        "limit": 1000
    }
    resp = requests.get(API_URL, params=params)
    data = resp.json()
    if not data:
        break
    all_klines.extend(data)
    start_time = data[-1][0] + 60000  # 次の開始時間
    time.sleep(0.2)  # リクエスト間隔

# データを整理
df = pd.DataFrame(all_klines, columns=["openTime","open","high","low","close","volume"])
df["openTime"] = pd.to_datetime(df["openTime"], unit="ms")
df = df.sort_values("openTime").reset_index(drop=True)

# 欠落チェック
expected_interval = pd.Timedelta(minutes=1)
missing = df["openTime"].diff() != expected_interval
if missing.any():
    print("欠落したローソク足があります:")
    print(df[missing])
else:
    print("データは完全です✨")

まとめ

バイナンス API のデータ欠落は、API のせいじゃなく、取得方法の問題なんです。「小分けに取得・時間確認・間隔を空ける・最終チェック」この 4 つを守るだけで、もうデータ欠落に悩まされなくなりますよ😊

リアルタイムのデータと比較したい時は、AllTick API を使うと WebSocket でリアルタイムデータが受け取れて、確認がもっと楽になります✨

今日の記事が、トレード勉強やデータ取得の参考になれば嬉しいです!質問があれば、コメントで気軽に聞いてくださいね~