私は普段、暗号資産のクォンツ戦略をティックレベルで検証する仕事をしています。バックテストの精度は「どのデータ系列を選ぶか」と「どのフィールドを保持するか」で8割決まると断言しても過言ではありません。本記事では Binance の aggTrades と trades (raw) の差分、現場で詰まりやすいフィールド選定、そして LLM を併用した高速フィールド抽出ワークフローを紹介します。後半は HolySheep AI を実機レビューし、比較表と ROI まで算出しました。今すぐ登録して無料クレジットを獲得できます。
aggTrades と raw trades の根本的な違い
Binance Spot 公式 API が公開するティック系エンドポイントは大きく2系統あります。/api/v3/aggTrades は「同一価格・同一 taker 方向の連続約定を集約した合成レコード」、/api/v3/trades は「1約定=1レコード」の生ログです。
| 観点 | aggTrades | raw trades (/trades) |
|---|---|---|
| 1レコードの意味 | 集約約定(同一条件の合算) | 個別約定1件 |
| 主要フィールド | a, p, q, f, l, T, m, M | id, price, qty, quoteQty, time, isBuyerMaker |
| レコード間隔 | 長い(集約分を含む) | 短い(ms単位) |
| レート制限 | weight=1〜20 | weight=1〜25 |
| 過去遡及範囲 | 数年分(公式アーカイブ) | 直近〜数日が中心 |
| 推奨用途 | OHLC再構築、ボリューム分析、TWAP | 板近傍の瞬間挙動、HFT検証 |
フィールド選定の実践ガイド
私がバックテストで実際に保存しているのは、次の最小フィールドセットです。
- aggTrades:
a(aggregateTradeId),p(price),q(quantity),T(timestamp ms),m(isBuyerMaker) - raw trades:
id,price,qty,time,isBuyerMaker
それぞれで不要になるのが f/l (First/Last tradeId) と M (Ignore) です。これらは約定束ねのためのメタ情報で、ティック集計では冗長になります。
コード1: aggTrades のフィールド抽出
import requests, pandas as pd
BASE = "https://api.binance.com"
SYMBOL = "BTCUSDT"
START, END = 1700000000000, 1700086400000 # 1日分
def fetch_aggtrades(symbol, start, end):
out, cursor = [], start
while cursor < end:
r = requests.get(f"{BASE}/api/v3/aggTrades", params={
"symbol": symbol,
"startTime": cursor,
"endTime": end,
"limit": 1000,
}, timeout=10)
r.raise_for_status()
batch = r.json()
if not batch: break
out.extend(batch)
cursor = batch[-1]["T"] + 1
return out
rows = fetch_aggtrades(SYMBOL, START, END)
必要フィールドのみ抽出(不要な f, l, M を捨てる)
df = pd.DataFrame(rows)[["a", "p", "q", "T", "m"]]
df.columns = ["agg_id", "price", "qty", "ts_ms", "is_buyer_maker"]
df.to_parquet("btcusdt_agg_20231114.parquet")
print(f"rows={len(df):,} size={df.memory_usage(deep=True).sum()/1e6:.1f}MB")
コード2: raw trades のフィールド抽出
import requests, pandas as pd
BASE = "https://api.binance.com"
SYMBOL = "BTCUSDT"
def fetch_raw_trades(symbol, limit=1000):
r = requests.get(f"{BASE}/api/v3/trades", params={
"symbol": symbol, "limit": limit
}, timeout=10)
r.raise_for_status()
return r.json()
raw = fetch_raw_trades(SYMBOL, limit=1000)
df = pd.DataFrame(raw)[["id", "price", "qty", "time", "isBuyerMaker"]]
df.rename(columns={"time": "ts_ms", "isBuyerMaker": "is_buyer_maker"}, inplace=True)
df["price"] = df["price"].astype(float)
df["qty"] = df["qty"].astype(float)
print(df.head())
コード3: HolySheep AI で「差分フィールド解説」を生成
import os, requests, json
API_KEY = os.environ["YOUR_HOLYSHEEP_API_KEY"]
BASE_URL = "https://api.holysheep.ai/v1"
prompt =