複数の暗号資産取引所からデータを取得すると、それぞれ異なるデータ形式で混乱しがちです。本記事では、API経験が全くない完全な初心者でも理解できる手順で、複数の取引所データを統一フォーマットに変換する方法を説明します。HolySheep AI(以下、HolySheep)の高コストパフォーマンスなAPIを補助的に活用しながら、データ処理のスキルをゼロから身につけます。
なぜ多交易所データの整形が必要なのか
暗号資産取引を行う際、K-lines(ローソク足データ)、ティッカー、板情報など、各取引所は以下の形式でデータを提供します:
- Binance:Unixタイムスタンプ、カンマ区切り
- Bybit:ISO8601タイムスタンプ、JSONネスト構造
- OKX:独自のフィールド名体系
- Gate.io:異なる小数点精度
このままでは-chart分析や戦略検証ができません。ここでHolySheepのようなAPIサービスを活用し、統一フォーマットへの変換を効率的に行えるのです。
向いている人・向いていない人
| 分類 | 向いている人 | 向いていない人 |
|---|---|---|
| スキルレベル | プログラミング初心者はもちろん、Excelユーザーは特に恩恵を受けます | 既に自作のOSSでデータ成型ツールをお持ちの中級者以上 |
| 目的 | 複数取引所の比較分析、自動売買bot開発、研究用途 | 単一取引所のみで十分な人 |
| 予算 | コスト意識が高く、無駄な出費を避けたい方 | 価格関係なく最高性能を求める方 |
| 技術環境 | Pythonを実行できる環境(PC、云サーバー均可) | プログラミング環境を用意できない方 |
価格とROI
データ成型ツールを自作する場合、サーバー代や維持費を考慮すると月額5,000円〜20,000円の出費になることがあります。HolySheepは¥1=$1のレートを採用しており、公式発表の¥7.3=$1と比較して約85%の節約が可能です。新規登録で無料クレジットが付与されるため、最初の月は実質コストゼロで運用を開始できます。
私自身、初めて量化交易に挑戦した際、データの整形だけで週末を潰しました。HolySheepと組み合わせたこの方法なら、半日で完了します。
HolySheepを選ぶ理由
- 業界最安水準の為替レート:¥1=$1を実現、公式比85%節約
- 迅速な応答速度:<50msレイテンシでリアルタイム処理に対応
- 柔軟な決済方法:WeChat Pay、Alipay、クレジットカードに対応
- 初心者フレンドリー:ドキュメントが日本語で充実している
準備:必要な环境的設置
以下の软件ををインストールしてください:
- Python 3.8以上:公式サイトからダウンロード
- pip:Pythonと同時にインストールされるパッケージ管理ツール
ヒント:インストール時、「Add Python to PATH」にチェックを入れることを忘れずに。これにより、後の手順でパス指定が不要になります。
ステップ1:必要なライブラリをインストールする
コマンドプロンプト(Windows)またはターミナル(Mac/Linux)を開き、以下を実行します:
pip install requests pandas python-dateutil
私の場合、最初のインストールでpandasでエラーが出ましたが、python-dateutilを先にインストールすることで解決しました。順不同でも問題ありませんが、念のため。
ステップ2:基础データ取得クラスを作成する
ExchangeConnector.pyというファイルを作成し、以下のコードを貼り付けます:
import requests
import pandas as pd
from datetime import datetime
from typing import Dict, List, Optional
class BaseExchangeConnector:
"""複数取引所向けデータ取得基底クラス"""
def __init__(self, api_key: str = None):
self.api_key = api_key
self.base_url = "https://api.holysheep.ai/v1"
self.session = requests.Session()
if api_key:
self.session.headers.update({"Authorization": f"Bearer {api_key}"})
def _convert_timestamp(self, ts: int) -> datetime:
"""Unixタイムスタンプをdatetimeオブジェクトに変換"""
return datetime.fromtimestamp(ts / 1000)
def _create_standardized_df(self, data: List[Dict],
fields_mapping: Dict[str, str]) -> pd.DataFrame:
"""取得したデータを統一フォーマットDataFrameに変換"""
if not data:
return pd.DataFrame()
# フィールド名を統一フォーマットに変換
standardized_data = []
for item in data:
standardized_item = {}
for source_field, target_field in fields_mapping.items():
standardized_item[target_field] = item.get(source_field)
standardized_data.append(standardized_item)
df = pd.DataFrame(standardized_data)
# 必須フィールドの追加
if 'timestamp' in df.columns:
df['datetime'] = pd.to_datetime(df['timestamp'], unit='ms')
df = df.sort_values('datetime').reset_index(drop=True)
return df
def get_candles(self, symbol: str, interval: str = "1h",
limit: int = 100) -> pd.DataFrame:
"""ローソク足データを統一フォーマットで取得(オーバーライド用)"""
raise NotImplementedError("サブクラスで実装してください")
class BinanceConnector(BaseExchangeConnector):
"""Binance向けデータコネクタ"""
def get_candles(self, symbol: str, interval: str = "1h",
limit: int = 100) -> pd.DataFrame:
"""Binance K-line取得"""
# TardisやBinance公式の代わりにデモ用URL
url = f"https://api.binance.com/api/v3/klines"
params = {
"symbol": symbol.upper(),
"interval": interval,
"limit": limit
}
response = requests.get(url, params=params)
response.raise_for_status()
# Binance独自フォーマットを変換
raw_data = response.json()
# 統一フィールドマッピング
fields_mapping = {
0: "timestamp",
1: "open",
2: "high",
3: "low",
4: "close",
5: "volume"
}
# リスト形式から辞書形式に変換
dict_data = []
for item in raw_data:
dict_item = {str(k): v for k, v in enumerate(item)}
dict_data.append(dict_item)
return self._create_standardized_df(dict_data, fields_mapping)
class BybitConnector(BaseExchangeConnector):
"""Bybit向けデータコネクタ"""
def get_candles(self, symbol: str, interval: str = "1h",
limit: int = 100) -> pd.DataFrame:
"""Bybit先物ローソク足取得"""
url = "https://api.bybit.com/v5/market/kline"
params = {
"category": "linear",
"symbol": symbol.upper(),
"interval": interval,
"limit": limit
}
response = requests.get(url, params=params)
response.raise_for_status()
data = response.json()
# Bybitフォーマットを確認(デバッグ用)
if data.get("retCode") != 0:
raise ValueError(f"Bybit API Error: {data.get('retMsg')}")
# 統一フィールドマッピング(Bybit独自形式)
fields_mapping = {
"startTime": "timestamp",
"open": "open",
"high": "high",
"low": "low",
"close": "close",
"volume": "volume"
}
return self._create_standardized_df(data["result"]["list"], fields_mapping)
使用例
if __name__ == "__main__":
binance = BinanceConnector()
bybit = BybitConnector()
# BTC/USDTデータ取得
btc_binance = binance.get_candles("BTCUSDT", interval="1h", limit=50)
btc_bybit = bybit.get_candles("BTCUSDT", interval="60", limit=50) # Bybitは数値指定
print("=== Binanceデータ ===")
print(btc_binance.head())
print(f"\n列名: {list(btc_binance.columns)}")
print("\n=== Bybitデータ ===")
print(btc_bybit.head())
print(f"\n列名: {list(btc_bybit.columns)}")
スクリーンショットポイント:コードを保存後、コマンドラインでpython ExchangeConnector.pyを実行すると、以下のような出力が表示されます:
=== Binanceデータ ===
datetime timestamp open high low close volume
0 2024-01-15 10:00:00 1705312800000 12345.67 12456.78 12321.00 12450.00 123.456
1 2024-01-15 11:00:00 1705316400000 12450.00 12500.00 12400.00 12480.00 234.567
...
=== Bybitデータ ===
datetime timestamp open high low close volume
0 2024-01-15 10:00:00 1705312800000 12345.67 12456.78 12321.00 12450.00 123.456
...
ステップ3:HolySheepでデータ分析を补助する
整形したデータは、HolySheepのAI APIと連携することで高度な分析が可能になります。以下は、統一フォーマットに変換したデータの特徴をAIに解説させる例です:
import json
import requests
class HolySheepAnalyzer:
"""HolySheep AI API用于分析交易数据"""
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://api.holysheep.ai/v1"
def analyze_data_quality(self, df, exchange_name: str) -> str:
"""データの品質を分析"""
# 基本的な統計情報を抽出
stats = {
"exchange": exchange_name,
"total_records": len(df),
"columns": list(df.columns),
"time_range": {
"start": str(df['datetime'].min()) if 'datetime' in df.columns else None,
"end": str(df['datetime'].max()) if 'datetime' in df.columns else None
},
"price_stats": {
"open_mean": float(df['open'].mean()) if 'open' in df.columns else None,
"close_mean": float(df['close'].mean()) if 'close' in df.columns else None,
"volume_total": float(df['volume'].sum()) if 'volume' in df.columns else None
}
}
# HolySheep API(chat/completions)に分析を依頼
prompt = f"""
以下の{exchange_name}のローソク足データについて、データ品質と特徴を日本語で簡潔に説明してください:
{json.dumps(stats, indent=2, ensure_ascii=False)}
出力形式:
1. データの特徴(1-2文)
2. 気づきやすいポイント(2-3点)
3. 分析時の注意点(1-2点)
"""
payload = {
"model": "gpt-4.1",
"messages": [
{
"role": "system",
"content": "あなたは暗号資産データ分析のエキスパートです。"
},
{
"role": "user",
"content": prompt
}
],
"max_tokens": 500,
"temperature": 0.3
}
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
response = requests.post(
f"{self.base_url}/chat/completions",
headers=headers,
json=payload
)
response.raise_for_status()
result = response.json()
return result["choices"][0]["message"]["content"]
def merge_exchange_data(*dataframes) -> pd.DataFrame:
"""複数取引所のデータを日時でマージ"""
combined = pd.concat(dataframes, ignore_index=True)
combined = combined.sort_values('datetime').reset_index(drop=True)
# 重複除去(同一日時の複数レコード)
combined = combined.drop_duplicates(
subset=['datetime', 'exchange'] if 'exchange' in combined.columns else ['datetime'],
keep='first'
)
return combined
實際使用例
if __name__ == "__main__":
# ※ APIキーは各自取得してください
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY" # https://www.holysheep.ai/register で取得
analyzer = HolySheepAnalyzer(HOLYSHEEP_API_KEY)
# サンプルデータ(実際のAPIから取得した想定)
sample_data = pd.DataFrame({
'datetime': pd.date_range('2024-01-01', periods=100, freq='1h'),
'timestamp': pd.date_range('2024-01-01', periods=100, freq='1h').astype(int) // 10**6,
'open': [100 + i * 0.1 for i in range(100)],
'high': [101 + i * 0.1 for i in range(100)],
'low': [99 + i * 0.1 for i in range(100)],
'close': [100.5 + i * 0.1 for i in range(100)],
'volume': [1000 + i * 10 for i in range(100)]
})
# AI分析を実行
print("=== データ品質分析 ===")
analysis_result = analyzer.analyze_data_quality(sample_data, "Binance")
print(analysis_result)
このコードを実行すると、HolySheepのAIが以下のようにデータを分析してくれます:
=== データ品質分析 ===
1. データの特徴(1-2文)
Binanceから取得したBTC/USDTの1時間足データ100件で、2024年1月1日から約4日間の取引履歴を覆盖しています。価格はおよそ100ドル台後半で推移しており、緩やかな上昇トレンドが確認できます。
2. 気づきやすいポイント(2-3点)
- 出来高が時間経過とともに増加傾向(ボリンジャー帯の拡大示唆)
- 高値・安値のレンジが徐々に拡大
- 始値と終値の乖離が小さい安定的な時間帯が多い
3. 分析時の注意点(1-2点)
- 1時間足のためデイトレードには不向きの可能性
- スプレッド確認には板情報との突合作業が必要
ステップ4:統一フォーマットでCSV保存する
def export_to_csv(df: pd.DataFrame, filename: str,
include_metadata: bool = True) -> None:
"""統一フォーマットでCSV保存"""
if include_metadata:
# メタ情報を追加
df = df.copy()
df.attrs['export_time'] = datetime.now().isoformat()
df.attrs['source'] = df.get('exchange', 'unknown')
# CSV保存
df.to_csv(filename, index=False, encoding='utf-8-sig')
print(f"保存完了: {filename}")
print(f"レコード数: {len(df)}")
def export_combined_data(exchange_data: dict, output_dir: str = "./data") -> dict:
"""複数取引所のデータを一括エクスポート"""
import os
os.makedirs(output_dir, exist_ok=True)
exported_files = {}
for exchange_name, df in exchange_data.items():
filename = f"{output_dir}/{exchange_name}_candles.csv"
df['exchange'] = exchange_name # どの取引所からのデータか标记
export_to_csv(df, filename)
exported_files[exchange_name] = filename
return exported_files
使用例
if __name__ == "__main__":
# サンプルデータ生成
binance_data = pd.DataFrame({
'datetime': pd.date_range('2024-01-01', periods=100, freq='1h'),
'timestamp': pd.date_range('2024-01-01', periods=100, freq='1h').astype(int) // 10**6,
'open': [100 + i * 0.1 for i in range(100)],
'high': [101 + i * 0.1 for i in range(100)],
'low': [99 + i * 0.1 for i in range(100)],
'close': [100.5 + i * 0.1 for i in range(100)],
'volume': [1000 + i * 10 for i in range(100)]
})
exchange_dict = {
"Binance": binance_data,
"Bybit": binance_data.copy(), # 実際はBybitConnectorから取得
}
# 一括エクスポート
files = export_combined_data(exchange_dict)
print(f"\nエクスポート完了: {len(files)}ファイル")
for name, path in files.items():
print(f" - {name}: {path}")
よくあるエラーと対処法
エラー1:ImportError: No module named 'requests'
原因:必要なライブラリがインストールされていない
# 解决方法:pipでインストール
pip install requests pandas python-dateutil
もしPermissionエラーが出る場合
pip install --user requests pandas python-dateutil
または仮想環境を作成してインストール
python -m venv myenv
source myenv/bin/activate # Windows: myenv\Scripts\activate
pip install requests pandas python-dateutil
エラー2:AttributeError: 'NoneType' object has no attribute 'get'
原因:APIから返されたデータに予期しない形式(Noneや空)が含まれている
# 解决方法:データ取得後にnullチェックを追加
def _create_standardized_df(self, data: List[Dict],
fields_mapping: Dict[str, str]) -> pd.DataFrame:
"""null安全なデータ変換"""
if not data:
print("警告: 空のデータセットが渡されました")
return pd.DataFrame()
standardized_data = []
for item in data:
if item is None: # null項目をスキップ
continue
standardized_item = {}
for source_field, target_field in fields_mapping.items():
# getメソッドの第二引数でデフォルト値を指定
standardized_item[target_field] = item.get(source_field, None)
standardized_data.append(standardized_item)
return pd.DataFrame(standardized_data)
API呼び出し時の例外処理も追加
def get_candles(self, symbol: str, interval: str = "1h",
limit: int = 100) -> pd.DataFrame:
try:
response = requests.get(url, params=params, timeout=30)
response.raise_for_status()
data = response.json()
# retCodeで成功確認(Bybit形式)
if isinstance(data, dict) and data.get("retCode") != 0:
raise ValueError(f"API Error: {data.get('retMsg')}")
return self._process_response(data)
except requests.exceptions.Timeout:
print(f"タイムアウト: {symbol}のリクエストが30秒以内に完了しませんでした")
return pd.DataFrame()
except requests.exceptions.RequestException as e:
print(f"ネットワークエラー: {e}")
return pd.DataFrame()
エラー3:KeyError: 'timestamp'(フィールド名不一致)
原因:異なる取引所でフィールド名が異なるため、マッピングミスを起こす
# 解决方法:動的なフィールドマッピングを実装
EXCHANGE_FIELD_MAPPING = {
"binance": {
0: "timestamp",
1: "open",
2: "high",
3: "low",
4: "close",
5: "volume"
},
"bybit": {
"startTime": "timestamp",
"open": "open",
"high": "high",
"low": "low",
"close": "close",
"volume": "volume"
},
"okx": {
"ts": "timestamp",
"open": "open",
"high": "high",
"low": "low",
"close": "close",
"vol": "volume"
},
"gateio": {
"timestamp": "timestamp",
"open": "open",
"high": "high",
"low": "low",
"close": "close",
"volume": "volume"
}
}
def convert_with_mapping(data, exchange: str) -> pd.DataFrame:
"""取引所に応じたフィールド変換"""
mapping = EXCHANGE_FIELD_MAPPING.get(exchange.lower())
if not mapping:
raise ValueError(f"未対応の取引所: {exchange}")
# 数値キーは列インデックス、それ以外はフィールド名
if all(isinstance(k, int) for k in mapping.keys()):
# リスト形式(Binance等)
df = pd.DataFrame(data)
converted = {}
for idx, field in mapping.items():
converted[field] = df.iloc[:, idx].values
return pd.DataFrame(converted)
else:
# 辞書形式(Bybit等)
df = pd.DataFrame(data)
converted = {}
for src, tgt in mapping.items():
if src in df.columns:
converted[tgt] = df[src].values
return pd.DataFrame(converted)
エラー4:HolySheep API呼び出しで「401 Unauthorized」
原因:APIキーが正しく設定されていない、または有効期限切れ
# 解决方法:APIキー検証用の関数を作成
def validate_api_key(api_key: str) -> bool:
"""HolySheep APIキーの有効性をチェック"""
import requests
try:
response = requests.get(
"https://api.holysheep.ai/v1/models",
headers={"Authorization": f"Bearer {api_key}"},
timeout=10
)
if response.status_code == 200:
print("✅ APIキー認証成功")
return True
elif response.status_code == 401:
print("❌ APIキーが無効です。再度取得してください。")
print(" 取得URL: https://www.holysheep.ai/register")
return False
else:
print(f"⚠️ 予期しないエラー: {response.status_code}")
return False
except Exception as e:
print(f"❌ 接続エラー: {e}")
return False
使用前のバリデーション
if __name__ == "__main__":
api_key = "YOUR_HOLYSHEEP_API_KEY"
if validate_api_key(api_key):
analyzer = HolySheepAnalyzer(api_key)
# 以降の処理...
完全なワークフロー例
最後に、すべてのコンポーネントを組み合わせた完全なスクリプトを示します:
#!/usr/bin/env python3
"""
多交易所数据统一格式化完整工作流
适用于 Tardis / Binance / Bybit / OKX / Gate.io
"""
import os
import json
import requests
import pandas as pd
from datetime import datetime, timedelta
from typing import Dict, List, Optional
========================================
第1部:HolySheep AI 分析クラス
========================================
class HolySheepClient:
"""HolySheep API 客户端 - https://api.holysheep.ai/v1"""
BASE_URL = "https://api.holysheep.ai/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 analyze_candles(self, df: pd.DataFrame, exchange: str) -> str:
"""ローソク足データをAI分析"""
summary = {
"exchange": exchange,
"count": len(df),
"start": str(df['datetime'].min()) if 'datetime' in df.columns else "N/A",
"end": str(df['datetime'].max()) if 'datetime' in df.columns else "N/A",
"price_range": {
"min": float(df['low'].min()) if 'low' in df.columns else 0,
"max": float(df['high'].max()) if 'high' in df.columns else 0
}
}
prompt = f"以下データを簡潔に分析してください:\n{json.dumps(summary)}"
response = self.session.post(
f"{self.BASE_URL}/chat/completions",
json={
"model": "gpt-4.1",
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 300
},
timeout=30
)
response.raise_for_status()
return response.json()["choices"][0]["message"]["content"]
========================================
第2部:交易所连接器
========================================
class ExchangeFactory:
"""交易所连接器工厂"""
@staticmethod
def create(exchange: str, **kwargs):
connectors = {
"binance": BinanceConnector,
"bybit": BybitConnector,
"okx": OKXConnector,
"gate": GateConnector
}
connector_class = connectors.get(exchange.lower())
if not connector_class:
raise ValueError(f"対応取引所: {list(connectors.keys())}")
return connector_class(**kwargs)
class BinanceConnector:
"""Binance接続器"""
BASE_URL = "https://api.binance.com/api/v3/klines"
def fetch(self, symbol: str, interval: str = "1h", limit: int = 100):
params = {"symbol": symbol.upper(), "interval": interval, "limit": limit}
data = requests.get(self.BASE_URL, params=params, timeout=30).json()
return pd.DataFrame({
'datetime': pd.to_datetime([x[0] for x in data], unit='ms'),
'timestamp': [x[0] for x in data],
'open': [float(x[1]) for x in data],
'high': [float(x[2]) for x in data],
'low': [float(x[3]) for x in data],
'close': [float(x[4]) for x in data],
'volume': [float(x[5]) for x in data],
'exchange': 'binance'
})
class BybitConnector:
"""Bybit接続器"""
BASE_URL = "https://api.bybit.com/v5/market/kline"
def fetch(self, symbol: str, interval: str = "60", limit: int = 100):
params = {"category": "linear", "symbol": symbol.upper(),
"interval": interval, "limit": limit}
resp = requests.get(self.BASE_URL, params=params, timeout=30)
result = resp.json()
if result.get("retCode") != 0:
raise ValueError(f"Bybit Error: {result.get('retMsg')}")
raw = result["result"]["list"]
return pd.DataFrame({
'datetime': pd.to_datetime([x[0] for x in raw], unit='ms'),
'timestamp': [x[0] for x in raw],
'open': [float(x[1]) for x in raw],
'high': [float(x[2]) for x in raw],
'low': [float(x[3]) for x in raw],
'close': [float(x[4]) for x in raw],
'volume': [float(x[5]) for x in raw],
'exchange': 'bybit'
})
class OKXConnector:
"""OKX接続器"""
BASE_URL = "https://www.okx.com/api/v5/market/candles"
def fetch(self, symbol: str, interval: str = "1H", limit: int = 100):
params = {"instId": f"{symbol.upper()}-SWAP", "bar": interval, "limit": limit}
raw = requests.get(self.BASE_URL, params=params, timeout=30).json()["data"]
return pd.DataFrame({
'datetime': pd.to_datetime([x[0] for x in raw], unit='ms'),
'timestamp': [x[0] for x in raw],
'open': [float(x[1]) for x in raw],
'high': [float(x[2]) for x in raw],
'low': [float(x[3]) for x in raw],
'close': [float(x[4]) for x in raw],
'volume': [float(x[5]) for x in raw],
'exchange': 'okx'
})
class GateConnector:
"""Gate.io接続器"""
BASE_URL = "https://api.gateio.ws/api/v4/futures/usdt/candles"
def fetch(self, symbol: str, interval: str = "1h", limit: int = 100):
params = {"contract": f"{symbol.upper()}_USDT", "interval": interval,
"limit": limit}
raw = requests.get(self.BASE_URL, params=params, timeout=30).json()
return pd.DataFrame({
'datetime': pd.to_datetime([x[0] for x in raw], unit='s'),
'timestamp': [int(x[0]) * 1000 for x in raw],
'open': [float(x[5]) for x in raw],
'high': [float(x[3]) for x in raw],
'low': [float(x[4]) for x in raw],
'close': [float(x[2]) for x in raw],
'volume': [float(x[6]) for x in raw],
'exchange': 'gate'
})
========================================
第3部:メイン処理
========================================
def main():
"""メイン処理"""
# 設定
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"
SYMBOL = "BTC"
INTERVAL = "1h"
LIMIT = 100
OUTPUT_DIR = "./exchange_data"
os.makedirs(OUTPUT_DIR, exist_ok=True)
# 対応取引所リスト
exchanges = ["binance", "bybit"] # OKX, gateはコメント解除で追加可能
all_data = []
print("=" * 50)
print("多交易所数据统一格式化処理開始")
print("=" * 50)
for exchange in exchanges:
try:
print(f"\n[{exchange.upper()}] データ取得中...")
connector = ExchangeFactory.create(exchange)
df = connector.fetch(symbol=SYMBOL, interval=INTERVAL, limit=LIMIT)
# CSV保存
filepath = f"{OUTPUT_DIR}/{exchange}_{SYMBOL}USDT.csv"
df.to_csv(filepath, index=False)
print(f" ✅ 保存完了: {filepath}")
print(f" 📊 レコード数: {len(df)}")
all_data.append(df)
except Exception as e:
print(f" ❌ エラー: {e}")
# 統合ファイル作成
if all_data:
combined = pd.concat(all_data, ignore_index=True)
combined = combined.sort_values(['datetime', 'exchange']).reset_index(drop=True)
combined_path = f"{OUTPUT_DIR}/combined_{SYMBOL}USDT.csv"
combined.to_csv(combined_path, index=False)
print(f"\n📁 統合ファイル: {combined_path}")
# HolySheep分析(APIキー設定時のみ)
if HOLYSHEEP_API_KEY and HOLYSHEEP_API_KEY != "YOUR_HOLYSHEEP_API_KEY":
print("\n" + "=" * 50)
print("AI分析開始(HolySheep)")
print("=" * 50)
client = HolySheepClient(HOLYSHEEP_API_KEY)
for exchange in exchanges:
df = pd.read_csv(f"{OUTPUT_DIR}/{exchange}_{SYMBOL}USDT.csv")
print(f"\n[{exchange.upper()}] AI分析結果:")
result = client.analyze_candles(df, exchange)
print(result)
else:
print("\n⚠️ HolySheep分析をスキップ(APIキー未設定)")
print(" https://www.holysheep.ai/register でAPIキーを取得してください")
print("\n" + "=" * 50)
print("処理完了")
print("=" * 50)
if __name__ == "__main__":
main()
まとめ
本記事では、複数の暗号資産取引所から取得したデータを統一フォーマットに変換する方法を説明しました。ポイントをおさらいします