クオンツトレードや高頻度取引(HFT)の戦略開発において、歴史的な板情報(L2 オーダーブック)は極めて重要なデータソースです。本稿では、Tardis.dev から Binance Futures の L2 オーダーブックデータを取得し、Python でバックテスト環境を構築する実践的な手順を解説します。さらに、データ取得後の分析やシグナル生成において HolySheep AI を活用したコスト最適化の手法も紹介します。
Tardis.dev の特徴と Binance Futures データ概要
Tardis.dev は、CryptoCompare チームが提供するプロフェッショナルな加密货币市場データプラットフォームです。リアルタイムストリーミングから歴史的データまで、幅広い金融データ products を提供します。Binance Futures の L2 オーダーブックデータは、ミリ秒単位のビッド・アスク価格と取引量を記録した高粒度の市場データであり、マーケットメイク戦略や流動性分析に最適です。
対応データタイプ
- L2 オーダーブック:ビッド/アスクの価格レベルとサイズ(Orderbook snapshots & updates)
- L3 オーダーブック:板の更新イベント(Individual order updates)
- 約定履歴:全 約定のタイムスタンプ、数量、 стороны(Taker/Maker)
- Kline/チャ太郎:1分〜1ヶ月足のオープン、高値、安値、終値
Binance Futures データ仕様
| 項目 | 仕様 |
|---|---|
| シンボル | BTCUSDT, ETHUSDT, BNBUSDT 等 |
| 時間精度 | ミリ秒(ms) |
| snapshot 間隔 | 100ms / 1s / 1min(プランによる) |
| 保存期間 | ライトプラン: 1年、 Pro+: 無制限 |
| プロトコル | WebSocket ストリーミング / REST API |
プロジェクト環境構築
必要なライブラリ
# requirements.txt
pandas>=2.0.0
numpy>=1.24.0
matplotlib>=3.7.0
tardis-dev-client>=1.0.0
requests>=2.31.0
asyncio-httpx>=0.25.0
# 仮想環境作成とセットアップ
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
プロジェクト構造
project/
├── config/
│ └── settings.py
├── data/
│ ├── raw/
│ └── processed/
├── src/
│ ├── data_fetcher.py
│ ├── backtester.py
│ └── analyzer.py
├── notebooks/
│ └── analysis.ipynb
├── requirements.txt
└── main.py
Tardis.dev からのデータ取得
設定ファイル構成
# config/settings.py
import os
Tardis.dev 設定
TARDIS_API_KEY = os.getenv("TARDIS_API_KEY", "your_tardis_api_key")
TARDIS_WS_URL = "wss://api.tardis.dev/v1/stream"
Binance Futures 設定
SYMBOL = "BTCUSDT"
EXCHANGE = "binance-futures"
DATA_TYPE = "orderbook_snapshot" # L2 板データ
データ取得期間(2026年4月の高変動期間)
START_DATE = "2026-04-15"
END_DATE = "2026-04-20"
出力パス
DATA_OUTPUT_DIR = "./data/raw"
os.makedirs(DATA_OUTPUT_DIR, exist_ok=True)
Tardis.dev REST API でのデータダウンロード
# src/data_fetcher.py
import requests
import pandas as pd
from pathlib import Path
from datetime import datetime, timedelta
import time
import json
class TardisDataFetcher:
"""Tardis.dev API から市場データを取得"""
BASE_URL = "https://api.tardis.dev/v1"
def __init__(self, api_key: str):
self.api_key = api_key
self.session = requests.Session()
self.session.headers.update({
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
})
def fetch_orderbook_snapshots(
self,
exchange: str,
symbol: str,
start_date: str,
end_date: str,
base_path: str = "./data/raw"
) -> pd.DataFrame:
"""
L2 オーダーブック snapshot データを取得
Parameters:
-----------
exchange : str
取引所識別子(例: "binance-futures")
symbol : str
シンボル(例: "BTCUSDT")
start_date, end_date : str
取得期間(YYYY-MM-DD 形式)
"""
url = f"{self.BASE_URL}/historical/{exchange}/{symbol}/orderbook_snapshots"
# ページネーション対応:1日ずつ取得
all_data = []
current_date = datetime.strptime(start_date, "%Y-%m-%d")
end_dt = datetime.strptime(end_date, "%Y-%m-%d")
while current_date <= end_dt:
next_day = current_date + timedelta(days=1)
params = {
"from": current_date.isoformat(),
"to": next_day.isoformat(),
"limit": 10000 # API レート制限に合わせて調整
}
print(f"Fetching {current_date.date()}...")
try:
response = self.session.get(url, params=params, timeout=60)
response.raise_for_status()
data = response.json()
if data.get("data"):
all_data.extend(data["data"])
# API レート制限対応(1秒wait)
time.sleep(1)
except requests.exceptions.RequestException as e:
print(f"Error fetching {current_date.date()}: {e}")
# バックオフして再試行
time.sleep(5)
continue
current_date = next_day
# DataFrame に変換
df = pd.DataFrame(all_data)
if not df.empty:
df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms")
df = df.sort_values("timestamp").reset_index(drop=True)
# 保存
output_file = Path(base_path) / f"{symbol}_{start_date}_{end_date}_orderbook.parquet"
df.to_parquet(output_file)
print(f"Saved {len(df)} records to {output_file}")
return df
def fetch_trades(
self,
exchange: str,
symbol: str,
start_date: str,
end_date: str
) -> pd.DataFrame:
"""約定履歴を取得"""
url = f"{self.BASE_URL}/historical/{exchange}/{symbol}/trades"
all_trades = []
current_date = datetime.strptime(start_date, "%Y-%m-%d")
end_dt = datetime.strptime(end_date, "%Y-%m-%d")
while current_date <= end_dt:
next_day = current_date + timedelta(days=1)
params = {
"from": current_date.isoformat(),
"to": next_day.isoformat(),
"limit": 50000
}
try:
response = self.session.get(url, params=params, timeout=60)
response.raise_for_status()
data = response.json()
if data.get("data"):
all_trades.extend(data["data"])
time.sleep(1)
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
time.sleep(5)
continue
current_date = next_day
df = pd.DataFrame(all_trades)
if not df.empty:
df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms")
df = df.sort_values("timestamp").reset_index(drop=True)
return df
使用例
if __name__ == "__main__":
from config.settings import (
TARDIS_API_KEY, EXCHANGE, SYMBOL,
START_DATE, END_DATE, DATA_OUTPUT_DIR
)
fetcher = TardisDataFetcher(TARDIS_API_KEY)
# L2 オーダーブックデータを取得
orderbook_df = fetcher.fetch_orderbook_snapshots(
exchange=EXCHANGE,
symbol=SYMBOL,
start_date=START_DATE,
end_date=END_DATE,
base_path=DATA_OUTPUT_DIR
)
# 約定履歴も取得
trades_df = fetcher.fetch_trades(
exchange=EXCHANGE,
symbol=SYMBOL,
start_date=START_DATE,
end_date=END_DATE
)
Python バックテストエンジン構築
高頻度バックテスター実装
# src/backtester.py
import pandas as pd
import numpy as np
from dataclasses import dataclass
from typing import Optional, Callable, Dict, List
from datetime import datetime
from pathlib import Path
@dataclass
class Order:
"""注文クラス"""
timestamp: pd.Timestamp
symbol: str
side: str # "buy" or "sell"
price: float
size: float
order_type: str = "limit"
@dataclass
class Position:
"""持仓情報"""
size: float # 正=ロング、負=ショート
entry_price: float
unrealized_pnl: float = 0.0
@property
def is_long(self) -> bool:
return self.size > 0
@property
def is_short(self) -> bool:
return self.size < 0
class HighFrequencyBacktester:
"""
高頻度板データ対応バックテストエンジン
- ミリ秒精度のタイムスタンプ対応
- Maker/Taker 手数料計算
- スリッページモデル
"""
def __init__(
self,
initial_capital: float = 100_000,
maker_fee: float = 0.0002,
taker_fee: float = 0.0004,
slippage_bps: float = 1.0, # basis points
latency_ms: int = 50 # シグナル生成から執行までの遅延
):
self.initial_capital = initial_capital
self.maker_fee = maker_fee
self.taker_fee = taker_fee
self.slippage_bps = slippage_bps
self.latency_ms = latency_ms
# 状態変数
self.capital = initial_capital
self.position: Optional[Position] = None
self.trades: List[Dict] = []
self.equity_curve: List[Dict] = []
# 統計
self.total_pnl = 0.0
self.total_trades = 0
self.winning_trades = 0
self.losing_trades = 0
def apply_slippage(self, price: float, side: str) -> float:
"""スリッページを適用"""
multiplier = 1 + (self.slippage_bps / 10000)
if side == "buy":
return price * multiplier
else:
return price / multiplier
def execute_order(
self,
timestamp: pd.Timestamp,
symbol: str,
side: str,
price: float,
size: float,
is_maker: bool = False
) -> Dict:
"""注文執行"""
exec_price = self.apply_slippage(price, side)
# 手数料計算
fee_rate = self.maker_fee if is_maker else self.taker_fee
fee = exec_price * size * fee_rate
trade = {
"timestamp": timestamp,
"symbol": symbol,
"side": side,
"price": exec_price,
"size": size,
"fee": fee,
"is_maker": is_maker
}
if side == "buy":
cost = exec_price * size + fee
self.capital -= cost
if self.position is None:
self.position = Position(
size=size,
entry_price=exec_price
)
else:
# 平均エントリー価格計算
total_size = self.position.size + size
avg_price = (
self.position.size * self.position.entry_price +
size * exec_price
) / total_size
self.position = Position(
size=total_size,
entry_price=avg_price
)
else: # sell
proceeds = exec_price * size - fee
self.capital += proceeds
if self.position is not None:
pnl = (exec_price - self.position.entry_price) * self.position.size
self.total_pnl += pnl
if pnl > 0:
self.winning_trades += 1
else:
self.losing_trades += 1
self.position = None
self.trades.append(trade)
self.total_trades += 1
return trade
def calculate_unrealized_pnl(self, current_price: float) -> float:
"""評価損益計算"""
if self.position is None:
return 0.0
return (current_price - self.position.entry_price) * self.position.size
def run_backtest(
self,
orderbook_df: pd.DataFrame,
trades_df: pd.DataFrame,
strategy_func: Callable
) -> pd.DataFrame:
"""
バックテスト実行
Parameters:
-----------
orderbook_df : DataFrame
L2 オーダーブック snapshot データ
trades_df : DataFrame
約定履歴データ
strategy_func : callable
戦略関数(シグナル生成ロジック)
"""
print(f"Starting backtest with {len(orderbook_df)} orderbook snapshots")
# 時間をキーとした 병합
orderbook_df = orderbook_df.set_index("timestamp").sort_index()
trades_df = trades_df.set_index("timestamp").sort_index()
# シグナル生成と执行
signals = strategy_func(orderbook_df, trades_df)
for idx, signal in signals.iterrows():
if pd.isna(signal.get("action")):
continue
# 延迟適用
exec_time = idx + pd.Timedelta(milliseconds=self.latency_ms)
# 約定価格取得(延迟後の板から)
if exec_time in orderbook_df.index:
exec_row = orderbook_df.loc[exec_time]
best_bid = exec_row.get("bids", [[0, 0]])[0][0]
best_ask = exec_row.get("asks", [[0, 0]])[0][0]
exec_price = best_ask if signal["action"] == "buy" else best_bid
self.execute_order(
timestamp=exec_time,
symbol=signal["symbol"],
side=signal["action"],
price=exec_price,
size=signal.get("size", 1.0),
is_maker=signal.get("is_maker", False)
)
# 權益記録
if not orderbook_df.empty:
latest_price = orderbook_df.iloc[
orderbook_df.index.get_loc(exec_time) - 1
].get("asks", [[0]])[0][0]
self.equity_curve.append({
"timestamp": exec_time,
"capital": self.capital,
"position_value": self.calculate_unrealized_pnl(latest_price),
"total_equity": self.capital + self.calculate_unrealized_pnl(latest_price)
})
return self.get_results()
def get_results(self) -> Dict:
"""バックテスト結果取得"""
equity_df = pd.DataFrame(self.equity_curve)
if equity_df.empty:
return {"error": "No trades executed"}
# パフォーマンス指標計算
equity_df["returns"] = equity_df["total_equity"].pct_change()
total_return = (equity_df["total_equity"].iloc[-1] / self.initial_capital - 1) * 100
sharpe_ratio = equity_df["returns"].mean() / equity_df["returns"].std() * np.sqrt(252 * 24 * 60) if equity_df["returns"].std() > 0 else 0
max_drawdown = ((equity_df["total_equity"].cummax() - equity_df["total_equity"]) / equity_df["total_equity"].cummax()).max() * 100
win_rate = self.winning_trades / self.total_trades * 100 if self.total_trades > 0 else 0
return {
"total_return_pct": total_return,
"sharpe_ratio": sharpe_ratio,
"max_drawdown_pct": max_drawdown,
"total_trades": self.total_trades,
"winning_trades": self.winning_trades,
"losing_trades": self.losing_trades,
"win_rate_pct": win_rate,
"final_capital": self.capital,
"equity_curve": equity_df
}
サンプル戦略:板失衡アービトラージ
# src/strategies.py
import pandas as pd
import numpy as np
def orderbook_imbalance_strategy(
orderbook_df: pd.DataFrame,
trades_df: pd.DataFrame,
symbol: str = "BTCUSDT",
imbalance_threshold: float = 0.15,
window_seconds: int = 60
) -> pd.DataFrame:
"""
オーダーブック失衡戦略
理論: ビッドサイドとアスクサイドの取引量失衡が閾値を超えた場合、
価格は失衡方向に動く可能性が高い
Parameters:
-----------
orderbook_df : DataFrame
L2 オーダーブック snapshot
trades_df : DataFrame
約定履歴
imbalance_threshold : float
失衡判定閾値(0.0-1.0)
window_seconds : int
失衡計算時間窓(秒)
"""
signals = []
# 失衡計算
for timestamp in orderbook_df.index:
row = orderbook_df.loc[timestamp]
# bids と asks は [[price, size], ...] 形式
bids = row.get("bids", [])
asks = row.get("asks", [])
if not bids or not asks:
continue
# トップ10レベルの合計サイズ
bid_volume = sum([b[1] for b in bids[:10]])
ask_volume = sum([a[1] for a in asks[:10]])
# 失衡度計算(-1〜+1)
total_volume = bid_volume + ask_volume
if total_volume == 0:
continue
imbalance = (bid_volume - ask_volume) / total_volume
# シグナル判定
if imbalance > imbalance_threshold:
signal = {
"timestamp": timestamp,
"symbol": symbol,
"action": "buy",
"imbalance": imbalance,
"confidence": abs(imbalance),
"is_maker": True
}
signals.append(signal)
elif imbalance < -imbalance_threshold:
signal = {
"timestamp": timestamp,
"symbol": symbol,
"action": "sell",
"imbalance": imbalance,
"confidence": abs(imbalance),
"is_maker": True
}
signals.append(signal)
return pd.DataFrame(signals)
def volume_weighted_midprice_strategy(
orderbook_df: pd.DataFrame,
trades_df: pd.DataFrame,
symbol: str = "BTCUSDT",
vwap_deviation_threshold: float = 0.001,
lookback_minutes: int = 5
) -> pd.DataFrame:
"""
VWAP逸脱戦略
約定履歴から VWAP を計算し、板のミッドプライスが
VWAP から一定以上乖離した場合にエントリー
"""
signals = []
# 約定履歴を VWAP 計算用に変換
trades_df = trades_df.copy()
for timestamp in orderbook_df.index:
# 過去N分間の約定を取得
lookback_start = timestamp - pd.Timedelta(minutes=lookback_minutes)
recent_trades = trades_df[
(trades_df.index >= lookback_start) &
(trades_df.index <= timestamp)
]
if len(recent_trades) < 10:
continue
# VWAP 計算
vwap = (
(recent_trades["price"] * recent_trades["size"]).sum() /
recent_trades["size"].sum()
)
# 板的ミッドプライス
row = orderbook_df.loc[timestamp]
best_bid = row.get("bids", [[0]])[0][0]
best_ask = row.get("asks", [[0]])[0][0]
mid_price = (best_bid + best_ask) / 2
# 乖離度
deviation = (mid_price - vwap) / vwap
# シグナル判定
if deviation > vwap_deviation_threshold:
signals.append({
"timestamp": timestamp,
"symbol": symbol,
"action": "sell", # 価格はVWAPに回帰すると予想
"size": 0.1,
"deviation": deviation,
"is_maker": True
})
elif deviation < -vwap_deviation_threshold:
signals.append({
"timestamp": timestamp,
"symbol": symbol,
"action": "buy",
"size": 0.1,
"deviation": deviation,
"is_maker": True
})
return pd.DataFrame(signals)
main.py での使用例
if __name__ == "__main__":
import pyarrow.parquet as pq
from src.backtester import HighFrequencyBacktester
from src.strategies import orderbook_imbalance_strategy
# データ読込
orderbook_df = pd.read_parquet("./data/raw/BTCUSDT_2026-04-15_2026-04-20_orderbook.parquet")
trades_df = pd.read_parquet("./data/raw/BTCUSDT_2026-04-15_2026-04-20_trades.parquet")
# シグナル生成
signals = orderbook_imbalance_strategy(
orderbook_df=orderbook_df,
trades_df=trades_df,
imbalance_threshold=0.15
)
print(f"Generated {len(signals)} signals")
# バックテスト実行
backtester = HighFrequencyBacktester(
initial_capital=100_000,
maker_fee=0.0002,
taker_fee=0.0004,
slippage_bps=2.0,
latency_ms=50
)
results = backtester.run_backtest(
orderbook_df=orderbook_df,
trades_df=trades_df,
strategy_func=orderbook_imbalance_strategy
)
print(f"Total Return: {results['total_return_pct']:.2f}%")
print(f"Sharpe Ratio: {results['sharpe_ratio']:.2f}")
print(f"Max Drawdown: {results['max_drawdown_pct']:.2f}%")
print(f"Win Rate: {results['win_rate_pct']:.1f}%")
HolySheep AI を活用したシグナル分析高速化
バックテストで生成されたシグナルや市場データを分析する際、Large Language Model(LLM)を活用することで、パターンの自動検出やリスク評価を高速化できます。HolySheep AI は業界最安水準の出力コストと¥1=$1の為替レートを提供しており、量化戦略の研究開発コストを大幅に削減できます。
API 設定
# config/holy_sheep_client.py
import os
from typing import Optional, List, Dict
import json
HolySheep AI 設定
2026年出力価格($ / Million Tokens)
HOLY_SHEEP_MODELS = {
"gpt-4.1": {"input": 2.0, "output": 8.0, "provider": "openai"},
"claude-sonnet-4.5": {"input": 3.0, "output": 15.0, "provider": "anthropic"},
"gemini-2.5-flash": {"input": 0.40, "output": 2.50, "provider": "google"},
"deepseek-v3.2": {"input": 0.14, "output": 0.42, "provider": "deepseek"}
}
class HolySheepClient:
"""
HolySheep AI API クライアント
base_url: https://api.holysheep.ai/v1
"""
BASE_URL = "https://api.holysheep.ai/v1"
def __init__(self, api_key: str):
self.api_key = api_key
self.default_model = "deepseek-v3.2" # 最も安いモデル
def chat_completion(
self,
messages: List[Dict[str, str]],
model: Optional[str] = None,
temperature: float = 0.7,
max_tokens: int = 2048
) -> Dict:
"""
チャット補完リクエスト
Parameters:
-----------
messages : list
[{"role": "user", "content": "..."}, ...]
model : str
モデル名(デフォルト: deepseek-v3.2)
temperature : float
生成の多様性(0.0-2.0)
max_tokens : int
最大出力トークン数
"""
import requests
url = f"{self.BASE_URL}/chat/completions"
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
payload = {
"model": model or self.default_model,
"messages": messages,
"temperature": temperature,
"max_tokens": max_tokens
}
response = requests.post(url, headers=headers, json=payload, timeout=60)
response.raise_for_status()
return response.json()
def analyze_backtest_results(
self,
results: Dict,
equity_curve_path: Optional[str] = None
) -> str:
"""
バックテスト結果を LLM で分析
戦略の改善点を自動提案
"""
prompt = f"""
あなたは量化取引のシニアアナリストです。以下のバックテスト結果を 分析し、改善提案をしてください。
【バックテスト結果サマリー】
- 総リタン: {results.get('total_return_pct', 0):.2f}%
- シャープレシオ: {results.get('sharpe_ratio', 0):.2f}
- 最大ドローダウン: {results.get('max_drawdown_pct', 0):.2f}%
- 総取引数: {results.get('total_trades', 0)}
- 勝率: {results.get('win_rate_pct', 0):.1f}%
- 利益取引: {results.get('winning_trades', 0)}
- 損失取引: {results.get('losing_trades', 0)}
分析項目:
1. リスク・リターン特性の評価
2. 戦略の強みと弱み
3. 具体的な改善提案(3つ以上)
4. 次のステップの推奨
日本語で詳細に回答してください。
"""
messages = [{"role": "user", "content": prompt}]
response = self.chat_completion(messages, model="deepseek-v3.2")
return response["choices"][0]["message"]["content"]
def generate_trading_signals_summary(
self,
signals_df,
market_context: Dict
) -> str:
"""
シグナルサマリー生成
市場の文脈を考慮したシグナルの解釈を生成
"""
signals_summary = signals_df.describe().to_string() if not signals_df.empty else "データなし"
prompt = f"""
市場データ分析のコンテキスト:
{json.dumps(market_context, ensure_ascii=False, indent=2)}
シグナル統計:
{signals_summary}
このシグナル群の市場解釈とリスク評価をしてください。
"""
messages = [{"role": "user", "content": prompt}]
response = self.chat_completion(messages, model="gemini-2.5-flash")
return response["choices"][0]["message"]["content"]
使用例
if __name__ == "__main__":
# HolySheep AI クライアント初期化
client = HolySheepClient(api_key=os.getenv("HOLY_SHEEP_API_KEY"))
# バックテスト結果分析
sample_results = {
"total_return_pct": 12.5,
"sharpe_ratio": 1.8,
"max_drawdown_pct": 3.2,
"total_trades": 156,
"winning_trades": 98,
"losing_trades": 58,
"win_rate_pct": 62.8
}
analysis = client.analyze_backtest_results(sample_results)
print("=== 戦略分析 ===")
print(analysis)
月間1000万トークン活用のコスト最適化
量化戦略の研究開発では、大量のプロンプト処理が必要ですが、モデル選択を最適化することでコストを大幅に削減できます。以下は2026年5月時点の主要モデルの料金比較です。
| モデル | Provider | Input ($/MTok) | Output ($/MTok) | 月間1000万Token総コスト | DeepSeek比 |
|---|---|---|---|---|---|
| Claude Sonnet 4.5 | Anthropic | $3.00 | $15.00 | $150.00 | 35.7x |
| GPT-4.1 | OpenAI | $2.00 | $8.00 | $80.00 | 19.0x |
| Gemini 2.5 Flash | $0.40 | $2.50 | $25.00 | 5.95x | |
| DeepSeek V3.2 | DeepSeek | $0.14 | $0.42 | $4.20 | 基準 |
※ 月間コスト試算条件:Input 70%(700万Token)、Output 30%(300万Token)
HolySheep の為替レート優位性
| 比較項目 | 公式為替レート | HolySheep ¥1=$1 | 節約率 |
|---|---|---|---|
| DeepSeek V3.2 Output 10M | ¥42 × 7.3 = ¥306.6 | $4.20(¥4.20相当) | 98.6%節約 |
| Gemini 2.5 Flash 10M | $25 × 7.3 = ¥182.5 | $25.00(¥25.00相当) | 86%節約 |
| GPT-4.1 10M | $80 × 7.3 = ¥584 | $80.00(¥80.00相当) | 86%節約 |
向いている人・向いていない人
向いている人
- クオンツ投資家:歴史的板データを活用したマーケットメイクやアービトラージ戦略を研究中
- _quant_(量化開発者):Python での高頻度バックテスト環境を構築したい
- データエンジニア:Tardis.dev のデータを他の戦略に再利用したい
- AI駆動トレーダー:LLMを活用した市場分析を低コストで実現したい
向いていない人
- 初心者トレーダー:板データの理解やプログラミング基礎がない場合
、大幅な学習コストが必要 - 低頻度投資家:日足ベースのシンプルな戦略で十分な場合、過剰な技術選定
- 即時実運用希望者:バックテストから本番環境移行には追加のシステム構築が必要
価格とROI
Tardis.dev コスト
| プラン | 月額料金 | 特徴 | に向いている人 |
|---|---|---|---|
| Free Trial | $0 | 7日間、制限付き | 試用・評価 |
| Developer | $49/月 | 1 Exchange、1年分データ | 個人開発 |
関連リソース関連記事 |