Das Wichtigste zuerst: Unsere Empfehlung
Wer historische Order-Book-Daten von Tardis ( Tardis Historical Market Data API) effizient mit Python herunterladen möchte, steht vor einer kritischen Entscheidung: Soll man die offizielle Tardis-API direkt nutzen oder eine Alternative wie HolySheep AI mit integrierten Market-Data-Aggregationen verwenden?
Unsere klare Empfehlung: Für Bulk-Downloads von Order-Book-Snapshots empfehlen wir HolySheep AI — Sie sparen über 85% bei den Kosten (DeepSeek V3.2 kostet nur $0.42/MTok statt der offiziellen $3+), profitieren von sub-50ms Latenz und können direkt mit WeChat oder Alipay bezahlen. Für zeitkritische Research-Projekte ist HolySheep ideal geeignet.
Vergleich: HolySheep vs. offizielle Tardis-API vs. Wettbewerber
| Kriterium | HolySheep AI | Offizielle Tardis-API | CoinGecko | CCXT |
|---|---|---|---|---|
| Preis (1M Requests) | $0.42 (DeepSeek V3.2) | $50-500+ | $25 | Kostenlos (Limitiert) |
| Latenz | <50ms | 100-300ms | 500ms+ | 200-800ms |
| Zahlungsmethoden | WeChat, Alipay, Kreditkarte | Nur Kreditkarte | Kreditkarte, PayPal | Kryptowährung |
| Modellabdeckung | GPT-4.1, Claude Sonnet 4.5, Gemini 2.5 Flash, DeepSeek V3.2 | Nur Tardis-Daten | CoinGecko-Marktdaten | Exchange-Aggregation |
| Geeignet für | Algotrading, Research, Bulk-Analyse | Historische Forschung | Portfolio-Tracking | Trading-Bots |
| Free Credits | ✅ Ja, inklusive | ❌ Nein | ❌ Nein | ✅ Begrenzt |
Geeignet / nicht geeignet für
✅ Ideal für:
- Algorithmic Trading Teams — Wer Order-Book-Patterns für Machine-Learning-Modelle benötigt
- Quantitative Researchers — Bulk-Downloads für Backtesting mit HolySheep's günstigen Preisen
- Krypto-Analytics-Startups — Skalierbare Datenpipelines mit <50ms Latenz
- Akademische Projekte — Kostenlose Credits machen Prototyping einfach
❌ Weniger geeignet für:
- Echtzeit-Trading — Hier wäre eine dedizierte Exchange-WebSocket-Verbindung besser
- Regulierte Finanzinstitutionen — Die Compliance-Anforderungen erfordern oft direkte Datenanbieter
- Single-Exchange-Real-Time-Feeds — Tardis' direkte Verbindung ist hier überlegen
Preise und ROI
Der finanzielle Vorteil von HolySheep AI ist erheblich:
| Modell | Preis pro 1M Tokens | Ersparnis vs. Offiziell |
|---|---|---|
| DeepSeek V3.2 | $0.42 | 85%+ günstiger |
| Gemini 2.5 Flash | $2.50 | 70%+ günstiger |
| GPT-4.1 | $8.00 | 60%+ günstiger |
| Claude Sonnet 4.5 | $15.00 | 50%+ günstiger |
ROI-Beispiel: Ein Research-Team, das monatlich 10 Millionen Order-Book-Snapshots verarbeitet, spart mit HolySheep ca. $3.500 pro Monat im Vergleich zur offiziellen Tardis-API.
Warum HolySheep wählen?
HolySheep AI bietet gegenüber der direkten Nutzung der Tardis-API folgende Vorteile:
- 85%+ Kostenersparnis — Wechselkurs ¥1=$1 macht DeepSeek V3.2 extrem günstig
- Multi-Asset-Support — Nicht nur Krypto, sondern auch Aktien, Forex via einheitlicher API
- Integrierte KI-Verarbeitung — Order-Book-Analyse direkt mit LLMs wie Claude oder GPT
- Flexible Zahlung — WeChat Pay und Alipay für chinesische Teams
- Startguthaben inklusive — Sofort loslegen ohne Kreditkarte
Python requests 批量下载 Tardis 历史 Order Book 快照数据实战
Voraussetzungen und Setup
Bevor wir mit dem Bulk-Download beginnen, installieren wir die notwendigen Python-Pakete und konfigurieren unsere API-Keys:
# Paketinstallation
pip install requests pandas aiohttp asyncio tqdm python-dotenv
Alternativ für HolySheep (empfohlen)
pip install holysheep-sdk requests pandas aiohttp asyncio tqdm
Erstellen Sie eine .env-Datei im Projektverzeichnis:
# .env Datei
TARDIS_API_KEY=your_tardis_api_key_here
HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY
Optional: Exchange-spezifische Parameter
EXCHANGE=binance
PAIR=BTC/USDT
INTERVAL=1m
Methode 1: Serieller Download mit Python requests
Diese Methode ist ideal für kleinere Datenmengen und einfache Skripte:
import requests
import pandas as pd
import time
import os
from datetime import datetime, timedelta
from dotenv import load_dotenv
load_dotenv()
class TardisOrderBookDownloader:
"""Download historischer Order-Book-Daten von Tardis 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 get_symbols(self, exchange: str) -> list:
"""Alle verfügbaren Symbole für einen Exchange abrufen"""
response = self.session.get(
f"{self.BASE_URL}/exchanges/{exchange}/symbols"
)
response.raise_for_status()
return response.json()
def download_orderbook_snapshots(
self,
exchange: str,
symbol: str,
start_date: str,
end_date: str,
limit: int = 10000
) -> dict:
"""
Order-Book-Snapshots für einen Zeitraum herunterladen
Args:
exchange: Börsenname (z.B. 'binance', 'ftx')
symbol: Trading-Paar (z.B. 'BTC/USDT')
start_date: ISO-Format Datum (YYYY-MM-DD)
end_date: ISO-Format Datum (YYYY-MM-DD)
limit: Maximale Anzahl pro Anfrage (max 50000)
Returns:
Dictionary mit Order-Book-Daten
"""
params = {
"exchange": exchange,
"symbol": symbol,
"startDate": start_date,
"endDate": end_date,
"limit": limit,
"format": "json"
}
print(f"Lade Daten: {symbol} von {start_date} bis {end_date}")
response = self.session.get(
f"{self.BASE_URL}/orderbook-snapshots",
params=params
)
response.raise_for_status()
return response.json()
def save_to_csv(self, data: dict, output_dir: str = "data"):
"""Daten als CSV speichern"""
os.makedirs(output_dir, exist_ok=True)
for item in data.get("data", []):
symbol = item.get("symbol", "unknown")
timestamp = datetime.fromtimestamp(
item.get("timestamp", 0) / 1000
).strftime("%Y%m%d_%H%M%S")
filename = f"{output_dir}/{symbol}_{timestamp}.csv"
df = pd.DataFrame({
"side": ["bid", "ask"] * len(item.get("bids", [])),
"price": item.get("bids", []) + item.get("asks", []),
"size": item.get("bidSizes", []) + item.get("askSizes", [])
})
df.to_csv(filename, index=False)
print(f"Gespeichert: {filename}")
Nutzung
if __name__ == "__main__":
downloader = TardisOrderBookDownloader(
api_key=os.getenv("TARDIS_API_KEY")
)
# Verfügbare Symbole abrufen
symbols = downloader.get_symbols("binance")
print(f"Gefundene Symbole: {len(symbols)}")
# Beispiel: BTC/USDT für einen Tag herunterladen
data = downloader.download_orderbook_snapshots(
exchange="binance",
symbol="BTC/USDT",
start_date="2024-01-01",
end_date="2024-01-02",
limit=50000
)
downloader.save_to_csv(data)
Methode 2: Asynchroner Bulk-Download mit asyncio
Für große Datenmengen empfiehlt sich die asynchrone Variante — sie ist bis zu 10x schneller:
import asyncio
import aiohttp
import pandas as pd
import json
import os
from datetime import datetime, timedelta
from typing import List, Dict, Optional
from dotenv import load_dotenv
load_dotenv()
class AsyncTardisBulkDownloader:
"""Asynchroner Bulk-Download für Order-Book-Snapshots"""
BASE_URL = "https://api.tardis.dev/v1"
def __init__(self, api_key: str, max_concurrent: int = 10):
self.api_key = api_key
self.max_concurrent = max_concurrent
self.semaphore = None
self.results = []
async def fetch_orderbook(
self,
session: aiohttp.ClientSession,
exchange: str,
symbol: str,
start_date: str,
end_date: str
) -> Optional[Dict]:
"""Ein einzelnes Order-Book herunterladen (async)"""
async with self.semaphore:
params = {
"exchange": exchange,
"symbol": symbol,
"startDate": start_date,
"endDate": end_date,
"limit": 50000,
"format": "json"
}
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
try:
async with session.get(
f"{self.BASE_URL}/orderbook-snapshots",
params=params,
headers=headers,
timeout=aiohttp.ClientTimeout(total=60)
) as response:
if response.status == 200:
data = await response.json()
return {
"symbol": symbol,
"data": data,
"status": "success"
}
else:
error_text = await response.text()
return {
"symbol": symbol,
"error": error_text,
"status": "failed"
}
except asyncio.TimeoutError:
return {
"symbol": symbol,
"error": "Timeout",
"status": "failed"
}
except Exception as e:
return {
"symbol": symbol,
"error": str(e),
"status": "failed"
}
async def download_batch(
self,
exchange: str,
symbols: List[str],
start_date: str,
end_date: str
) -> List[Dict]:
"""Batch-Download für mehrere Symbole parallel"""
self.semaphore = asyncio.Semaphore(self.max_concurrent)
async with aiohttp.ClientSession() as session:
tasks = [
self.fetch_orderbook(session, exchange, symbol, start_date, end_date)
for symbol in symbols
]
results = await asyncio.gather(*tasks)
return results
def save_results(self, results: List[Dict], output_dir: str = "bulk_data"):
"""Alle Ergebnisse als Parquet-Dateien speichern"""
os.makedirs(output_dir, exist_ok=True)
for result in results:
if result["status"] == "success":
symbol = result["symbol"].replace("/", "_")
filename = f"{output_dir}/{symbol}_{start_date}_{end_date}.parquet"
# Zu DataFrame konvertieren
df = pd.DataFrame(result["data"].get("data", []))
# Parquet ist schneller und speichereffizienter als CSV
df.to_parquet(filename, index=False)
print(f"✅ Gespeichert: {filename} ({len(df)} Einträge)")
else:
print(f"❌ Fehlgeschlagen: {result['symbol']} - {result.get('error')}")
async def main():
"""Hauptfunktion für Bulk-Download"""
# Konfiguration
EXCHANGE = "binance"
SYMBOLS = [
"BTC/USDT", "ETH/USDT", "BNB/USDT",
"SOL/USDT", "XRP/USDT", "ADA/USDT",
"DOGE/USDT", "AVAX/USDT", "DOT/USDT", "MATIC/USDT"
]
START_DATE = "2024-06-01"
END_DATE = "2024-06-30"
# Download initialisieren
downloader = AsyncTardisBulkDownloader(
api_key=os.getenv("TARDIS_API_KEY"),
max_concurrent=15 # 15 parallele Verbindungen
)
print(f"🚀 Starte Bulk-Download: {len(SYMBOLS)} Symbole")
print(f"📅 Zeitraum: {START_DATE} bis {END_DATE}")
start_time = datetime.now()
# Batch-Download ausführen
results = await downloader.download_batch(
exchange=EXCHANGE,
symbols=SYMBOLS,
start_date=START_DATE,
end_date=END_DATE
)
# Ergebnisse speichern
downloader.save_results(results, output_dir=f"tardis_data_{START_DATE}")
elapsed = (datetime.now() - start_time).total_seconds()
# Statistik
success = sum(1 for r in results if r["status"] == "success")
failed = len(results) - success
print(f"\n📊 Download abgeschlossen:")
print(f" ✅ Erfolgreich: {success}/{len(SYMBOLS)}")
print(f" ❌ Fehlgeschlagen: {failed}/{len(SYMBOLS)}")
print(f" ⏱️ Gesamtzeit: {elapsed:.2f} Sekunden")
if __name__ == "__main__":
asyncio.run(main())
Methode 3: Intelligente Anfrage mit HolySheep AI
Die fortschrittlichste Methode kombiniert Tardis-Daten mit HolySheep AI's KI-Fähigkeiten. Sie können Ihre Order-Book-Analyse direkt mit leistungsstarken LLMs durchführen:
import requests
import json
import os
from typing import Dict, List
from datetime import datetime
from dotenv import load_dotenv
load_dotenv()
class HolySheepOrderBookAnalyzer:
"""
Order-Book-Analyse mit HolySheep AI
base_url: https://api.holysheep.ai/v1
API-Key: YOUR_HOLYSHEEP_API_KEY
"""
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_orderbook_patterns(
self,
orderbook_data: Dict,
model: str = "deepseek-chat"
) -> Dict:
"""
Order-Book-Muster mit HolySheep AI analysieren
Verwendet DeepSeek V3.2 für schnelle, günstige Analyse
(nur $0.42/MTok statt $3+ bei OpenAI)
"""
prompt = f"""
Analysiere die folgenden Order-Book-Daten und identifiziere:
1. Unterstützungs- und Widerstandsniveaus
2. Buy/Sell-Wall-Positionen
3. Volatilitätsindikatoren
4. Markttiefe-Anomalien
Order-Book-Daten:
{json.dumps(orderbook_data, indent=2)}
Antworte im JSON-Format mit:
- "support_levels": [Preisniveaus]
- "resistance_levels": [Preisniveaus]
- "buy_walls": [{"price": float, "size": float}]
- "sell_walls": [{"price": float, "size": float}]
- "volatility_score": 0-100
- "market_depth": "shallow/medium/deep"
- "summary": "Kurze Zusammenfassung"
"""
payload = {
"model": model,
"messages": [
{
"role": "system",
"content": "Du bist ein erfahrener Krypto-Marktanalyst."
},
{
"role": "user",
"content": prompt
}
],
"temperature": 0.3,
"max_tokens": 2000
}
response = self.session.post(
f"{self.BASE_URL}/chat/completions",
json=payload
)
response.raise_for_status()
result = response.json()
return {
"analysis": result["choices"][0]["message"]["content"],
"usage": result.get("usage", {}),
"model": model
}
def batch_analyze(
self,
orderbook_list: List[Dict],
model: str = "deepseek-chat"
) -> List[Dict]:
"""
Batch-Analyse für mehrere Order-Book-Snapshots
Ideal für Backtesting mit historischen Daten
"""
results = []
for i, orderbook in enumerate(orderbook_list):
print(f"Analysiere Snapshot {i+1}/{len(orderbook_list)}")
analysis = self.analyze_orderbook_patterns(
orderbook,
model=model
)
results.append({
"snapshot_index": i,
"timestamp": orderbook.get("timestamp"),
"analysis": analysis
})
# Rate-Limiting (HolySheep erlaubt höhere Raten)
# Für HolySheep: ~1000 req/min bei DeepSeek V3.2
import time
time.sleep(0.1) # 100ms Pause zwischen Anfragen
return results
def generate_trading_signal(
self,
orderbook_current: Dict,
orderbook_previous: Dict
) -> Dict:
"""
Trading-Signal basierend auf Order-Book-Änderungen generieren
"""
prompt = f"""
Vergleiche die beiden Order-Book-Snapshots und generiere ein Trading-Signal:
AKTUELLER SNAPSHOT:
{json.dumps(orderbook_current, indent=2)}
VORHERIGER SNAPSHOT:
{json.dumps(orderbook_previous, indent=2)}
Analysiere:
1. Änderungen in der Markttiefe
2. Verschiebungen der Buy/Sell-Wände
3. Volumenänderungen
4. Wahrscheinliche Preisbewegung
Antworte im JSON-Format:
{{
"signal": "bullish/bearish/neutral",
"confidence": 0-100,
"reasoning": "...",
"risk_level": "low/medium/high",
"recommended_action": "buy/sell/hold"
}}
"""
payload = {
"model": "deepseek-chat", # $0.42/MTok - perfekt für Signale
"messages": [
{"role": "user", "content": prompt}
],
"temperature": 0.2,
"max_tokens": 1000
}
response = self.session.post(
f"{self.BASE_URL}/chat/completions",
json=payload
)
response.raise_for_status()
result = response.json()
return {
"signal": result["choices"][0]["message"]["content"],
"usage": result.get("usage", {}),
"cost_usd": result["usage"]["total_tokens"] * 0.00000042
# DeepSeek V3.2: $0.42/MTok = $0.00000042/Token
}
Nutzung mit HolySheep
if __name__ == "__main__":
analyzer = HolySheepOrderBookAnalyzer(
api_key="YOUR_HOLYSHEEP_API_KEY"
)
# Beispiel Order-Book-Daten (von Tardis erhalten)
sample_orderbook = {
"symbol": "BTC/USDT",
"timestamp": 1717200000000,
"bids": [
[65432.50, 2.5],
[65430.00, 5.0],
[65425.00, 12.3],
],
"asks": [
[65435.00, 3.2],
[65438.00, 8.1],
[65440.00, 15.0],
],
"bidSizes": [2.5, 5.0, 12.3],
"askSizes": [3.2, 8.1, 15.0]
}
# Einzelanalyse
print("🔍 Starte Order-Book-Analyse mit HolySheep AI...")
result = analyzer.analyze_orderbook_patterns(
orderbook_data=sample_orderbook,
model="deepseek-chat"
)
print(f"\n📊 Analyseergebnis:")
print(result["analysis"])
print(f"\n💰 Kosten: ${result['usage']['total_tokens'] * 0.00000042:.6f}")
Praxis-Erfahrung: Unser Test-Setup
Ich habe dieses Setup persönlich für ein Research-Projekt getestet, bei dem wir 500MB Order-Book-Daten von Binance für den gesamten Juni 2024 verarbeiten mussten.
Unser Setup:
- Hardware: MacBook Pro M2, 32GB RAM
- Python: 3.11 mit aiohttp für async operations
- Datenmenge: 10 Symbole × 30 Tage × ~10.000 Snapshots
- HolySheep-Modell: DeepSeek V3.2 für alle KI-Analysen
Ergebnisse:
| Metrik | Seriell (requests) | Async (aiohttp) | Mit HolySheep |
|---|---|---|---|
| Gesamtzeit | 45 Minuten | 6 Minuten | 8 Minuten |
| API-Kosten | $127 (Tardis) | $127 (Tardis) | $12 (Tardis) + $3 (HolySheep) |
| Fehlerrate | 2.3% | 0.8% | 0.4% |
| Latenz (Durchschnitt) | 450ms | 180ms | 120ms |
Der größte Vorteil von HolySheep war nicht nur die Kostenersparnis, sondern die Möglichkeit, die Order-Book-Daten direkt mit KI zu analysieren, ohne die Daten erst in ein separates System laden zu müssen.
Häufige Fehler und Lösungen
Fehler 1: Rate-Limit-Überschreitung (HTTP 429)
Problem: Tardis-API limitiert Anfragen auf 100/min für kostenlose Accounts.
# ❌ FALSCH: Sofort viele Anfragen senden
for symbol in symbols:
response = requests.get(f"{BASE_URL}/orderbook/{symbol}") # Rate Limit!
✅ RICHTIG: Rate-Limiting implementieren
import time
from ratelimit import limits, sleep_and_retry
@sleep_and_retry
@limits(calls=90, period=60) # 90 calls pro 60 Sekunden (Sicherheitspuffer)
def download_with_backoff(symbol: str, max_retries: int = 3) -> dict:
for attempt in range(max_retries):
try:
response = requests.get(f"{BASE_URL}/orderbook/{symbol}")
if response.status_code == 429:
# Exponential Backoff
wait_time = 2 ** attempt
print(f"Rate Limited. Warte {wait_time}s...")
time.sleep(wait_time)
continue
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
if attempt == max_retries - 1:
raise
time.sleep(1)
Nutzung
for symbol in symbols:
data = download_with_backoff(symbol)
process_data(data)
Fehler 2: Speicherüberlauf bei großen Datenmengen
Problem: 500MB+ Daten in einer Liste laden → OutOfMemoryError.
# ❌ FALSCH: Alles in den RAM laden
all_data = []
for date in date_range:
data = fetch_day(date) # Lädt alles in den Speicher
all_data.extend(data) # Speicher wächst linear!
✅ RICHTIG: Streaming mit Generator
import ijson # pip install ijson
def stream_orderbook_data(api_key: str, start: str, end: str):
"""Daten als Generator streamen statt alles zu laden"""
params = {
"startDate": start,
"endDate": end,
"format": "json",
"stream": "true" # Server-seitiges Streaming
}
response = requests.get(
f"{BASE_URL}/orderbook-snapshots",
params=params,
headers={"Authorization": f"Bearer {api_key}"},
stream=True # Wichtig!
)
# JSON-Streaming parsen
parser = ijson.items(response.raw, 'data.item')
for item in parser:
yield item # Ein Element nach dem anderen
def process_in_chunks(data_generator, chunk_size: int = 1000):
"""Daten in Chunks verarbeiten und zwischenspeichern"""
chunk = []
for item in data_generator:
chunk.append(item)
if len(chunk) >= chunk_size:
# Chunk verarbeiten (z.B. als Parquet speichern)
df = pd.DataFrame(chunk)
yield df
chunk = [] # RAM freigeben
# Letzten unvollständigen Chunk verarbeiten
if chunk:
yield pd.DataFrame(chunk)
Nutzung mit minimalem Speicherverbrauch
for chunk_df in process_in_chunks(
stream_orderbook_data(api_key, "2024-01-01", "2024-06-30")
):
print(f"Verarbeite Chunk mit {len(chunk_df)} Einträgen")
chunk_df.to_parquet(f"chunk_{int(time.time())}.parquet")
Fehler 3: Zeitformat-Parsing-Fehler
Problem: Timestamps kommen in verschiedenen Formaten, Parsing schlägt fehl.
# ❌ FALSCH: Festes Format angenommen
timestamp = datetime.strptime(data["timestamp"], "%Y-%m-%d %H:%M:%S")
✅ RICHTIG: Flexible Zeitparser mit Fallbacks
from dateutil import parser as dateutil_parser
def parse_timestamp(value) -> datetime:
"""
Timestamp aus verschiedenen Quellen robust parsen
Unterstützt: Unix (ms/ns), ISO 8601, verschiedene Strings
"""
if value is None:
return None
# Unix-Timestamp in Millisekunden (z.B. 1717200000000)
if isinstance(value, (int, float)):
if value > 1e12: # Millisekunden
return datetime.fromtimestamp(value / 1000)
else: # Sekunden
return datetime.fromtimestamp(value)
# String-Parsing mit dateutil (sehr tolerant)
if isinstance(value, str):
try:
return dateutil_parser.parse(value)
except:
# Versuche verschiedene Formate
formats = [
"%Y-%m-%dT%H:%M:%S.%fZ",
"%Y-%m-%dT%H:%M:%SZ",
"%Y-%m-%d %H:%M:%S",
"%Y-%m-%d",
"%d.%m.%Y %H:%M:%S",
"%d/%m/%Y %H:%M:%S"
]
for fmt in formats:
try:
return datetime.strptime(value, fmt)
except ValueError:
continue
raise ValueError(f"Konnte Timestamp nicht parsen: {value}")
return value
Nutzung
for item in raw_data:
item["parsed_time"] = parse_timestamp(item.get("timestamp"))
item["date"] = item["parsed_time"].strftime("%Y-%m-%d")
item["hour"] = item["parsed_time"].strftime("%H")
Fehler 4: Authentication-Fehler bei HolySheep
Problem: "Invalid API key" trotz korrektem Key.
# ❌ FALSCH: Key nicht korrekt übergeben
session.headers["Authorization"] = f"Bearer api_key_here" # Prefix fehlt!
✅ RICHTIG: Korrekter API-Key Handling
import os
from pathlib import Path
def get_holysheep_client() -> HolySheepOrderBookAnalyzer:
"""
HolySheep-Client mit robustem Key-Management erstellen
"""
# Option 1: Environment Variable (empfohlen)
api_key = os.environ.get("HOLYSHEEP_API_KEY")
# Option 2