Temps de lecture : 12 minutes | Difficulté : Intermédiaire | Dernière mise à jour : Mai 2025

Étude de Cas : Comment ScaleFlow a Réduit ses Coûts d'Infrastructure de 83%

ScaleFlow, une scale-up fintech parisienne spécialisée dans les stratégies de trading algorithmique sur dérivés de cryptomonnaies, faisait face à un défi critique en 2025. L'équipe de data engineering, composée de 6 personnes, gérait un pipeline de données pour进行研究波动率策略(analyser les stratégies de volatilité) sur les options Bybit.

Le Contexte Métier

ScaleFlow développait des modèles quantitatifs exploitant les微型波动率套利(micro-volatility arbitrage) sur les options Bybit avec un volume de ticks journalier dépassant les 45 millions d'enregistrements. La précision temporelle était essentielle : chaque milliseconde comptait pour leur recherche sur la courbe de volatilité implicite.

Douleurs avec le Fournisseur Précédent

Pourquoi HolySheep

Après une évaluation de 3 fournisseurs, l'équipe ScaleFlow a choisi HolySheep AI pour plusieurs raisons décisives :

Étapes de Migration

Étape 1 : Configuration Initiale

La migration a commencé par la création du compte et l'obtention des identifiants API via le dashboard HolySheep. L'équipe a appréciél'interface简洁直观(clean and intuitive) qui ne nécessitait pas de configuration SSO complexe.

Étape 2 : Bascule base_url

Le changement le plus simple mais le plus impactant : remplacer l'ancienne URL de l'API par celle de HolySheep. L'équipe a utilisé une variable d'environnement pour faciliter les futures migrations.

Étape 3 : Rotation des Clés API

HolySheep permet la génération de clés API temporaires avec une validité configurable, éliminant les interruptions de service. La команды(équipe) a mis en place une rotation automatique via leur système CI/CD.

Étape 4 : Déploiement Canari

ScaleFlow a déployé la nouvelle intégration en parallèle pendant 2 semaines, comparant les flux de données en temps réel. Aucune divergence n'a été détectée, validant la conformité des données.

Métriques à 30 Jours Post-Migration

Métrique Avant HolySheep Après HolySheep Amélioration
Latence moyenne 420ms 180ms ↓ 57%
Coût mensuel flux données $4 200 $680 ↓ 84%
Temps d'intégration 3 semaines 4 jours ↓ 81%
Disponibilité 99,7% 99,95% ↑ 0,25%
Volume ticks/jour traité 38M 45M+ ↑ 18%

Architecture Technique : Connexion Tardis Bybit Options

Prérequis

Configuration de l'Environnement

# Installation des dépendances Python
pip install holy-sheep-sdk pandas asyncio aiohttp

Variables d'environnement (.env)

HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY HOLYSHEEP_BASE_URL=https://api.holysheep.ai/v1 TARDIS_EXCHANGE=bybit TARDIS_INSTRUMENT_TYPE=options TARDIS_MARKET=linear

Client Python Complet pour Tick Data

import os
import asyncio
import pandas as pd
from datetime import datetime, timedelta
from holy_sheep import HolySheepClient, DataStream

Configuration HolySheep — NOTRE ENDPOINT

HOLYSHEEP_BASE_URL = os.getenv("HOLYSHEEP_BASE_URL", "https://api.holysheep.ai/v1") HOLYSHEEP_API_KEY = os.getenv("HOLYSHEEP_API_KEY") class BybitOptionsDataPipeline: """ Pipeline de données pour les options Bybit via HolySheep. Supporte les ticks en temps réel et le replay historique. """ def __init__(self, api_key: str): self.client = HolySheepClient( base_url=HOLYSHEEP_BASE_URL, api_key=api_key ) self.buffer = [] self.tick_count = 0 async def stream_realtime_ticks(self, symbol: str): """ Stream en temps réel des ticks d'options Bybit. Latence typique via HolySheep : <50ms """ stream = DataStream( exchange="bybit", instrument_type="options", symbol=symbol, data_type="tick" ) async for tick in self.client.stream(stream): self.tick_count += 1 self.buffer.append({ "timestamp": tick.timestamp, "symbol": tick.symbol, "price": tick.price, "size": tick.size, "bid": tick.bid, "ask": tick.ask, "iv": tick.implied_volatility, "delta": tick.delta, "gamma": tick.gamma }) # Flush toutes les 10000 ticks if self.tick_count % 10000 == 0: await self._flush_to_storage() async def fetch_historical_ticks( self, symbol: str, start: datetime, end: datetime ) -> pd.DataFrame: """ Récupère les ticks historiques pour backtesting. Granularité disponible : tick, 1s, 1m, 5m, 1h """ response = await self.client.get_historical_data( exchange="bybit", instrument_type="options", symbol=symbol, start=start.isoformat(), end=end.isoformat(), granularity="tick" ) df = pd.DataFrame([ { "timestamp": t["timestamp"], "price": t["price"], "size": t["size"], "iv": t.get("implied_volatility"), } for t in response.data ]) df["timestamp"] = pd.to_datetime(df["timestamp"]) return df.sort_values("timestamp") async def _flush_to_storage(self): """Flush le buffer vers le stockage temporaire.""" if self.buffer: df = pd.DataFrame(self.buffer) df.to_parquet( f"ticks_{datetime.now():%Y%m%d_%H%M%S}.parquet", engine="pyarrow", compression="snappy" ) print(f"Flushed {len(self.buffer)} ticks to storage") self.buffer.clear()

--- Exécution principale ---

async def main(): pipeline = BybitOptionsDataPipeline(HOLYSHEEP_API_KEY) # Exemple : récupérer 1 heure de ticks pour backtesting end_time = datetime.now() start_time = end_time - timedelta(hours=1) df = await pipeline.fetch_historical_ticks( symbol="BTC-25JUL25-95000-C", start=start_time, end=end_time ) print(f"Récupéré {len(df)} ticks") print(f"Latence moyenne traitement: {df['timestamp'].diff().mean()}") if __name__ == "__main__": asyncio.run(main())

Calcul de Volatilité Implicite en Temps Réel

import numpy as np
from scipy.stats import norm
from scipy.optimize import brentq

class VolatilityCalculator:
    """
    Calcul de volatilité implicite pour options Bybit.
    Implémente le modèle Black-Scholes avec dividendes continus.
    """
    
    def __init__(self, risk_free_rate: float = 0.05):
        self.r = risk_free_rate
    
    def black_scholes_price(
        self, 
        S: float,  # Prix spot
        K: float,  # Strike
        T: float,  # Temps jusqu'à expiration (en années)
        r: float,
        sigma: float,
        option_type: str = "call"
    ) -> float:
        """Prix Black-Scholes d'une option européenne."""
        d1 = (np.log(S/K) + (r + 0.5*sigma**2)*T) / (sigma*np.sqrt(T))
        d2 = d1 - sigma*np.sqrt(T)
        
        if option_type.lower() == "call":
            return S*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)
        else:
            return K*np.exp(-r*T)*norm.cdf(-d2) - S*norm.cdf(-d1)
    
    def implied_volatility(
        self,
        market_price: float,
        S: float, K: float, T: float,
        option_type: str = "call",
        tol: float = 1e-6
    ) -> float:
        """
        Calcule la volatilité implicite par résolution numérique.
        Utilise la méthode de Brent pour la convergence.
        """
        def objective(sigma):
            return self.black_scholes_price(
                S, K, T, self.r, sigma, option_type
            ) - market_price
        
        try:
            # Bornes réalistes : 5% à 500% de volatilité annualisée
            iv = brentq(objective, 0.05, 5.0, xtol=tol)
            return iv
        except ValueError:
            return np.nan
    
    def compute_volatility_smile(
        self,
        ticks_df: pd.DataFrame,
        spot_price: float
    ) -> pd.DataFrame:
        """
        Calcule le smile de volatilité pour une chaîne d'options.
        Retourne un DataFrame avec strikes, IV et grecs.
        """
        results = []
        expiry = ticks_df["expiry"].iloc[0]
        T = (expiry - datetime.now()).days / 365.0
        
        for _, row in ticks_df.iterrows():
            iv = self.implied_volatility(
                market_price=row["mark_price"],
                S=spot_price,
                K=row["strike"],
                T=T,
                option_type=row["type"]
            )
            
            results.append({
                "strike": row["strike"],
                "iv": iv,
                "delta": self._delta_approx(spot_price, row["strike"], T, iv),
                "gamma": self._gamma_approx(spot_price, row["strike"], T, iv)
            })
        
        return pd.DataFrame(results)
    
    def _delta_approx(self, S: float, K: float, T: float, sigma: float) -> float:
        """Approximation rapide du delta."""
        d1 = (np.log(S/K) + 0.5*sigma**2*T) / (sigma*np.sqrt(T))
        return norm.cdf(d1)
    
    def _gamma_approx(self, S: float, K: float, T: float, sigma: float) -> float:
        """Approximation rapide du gamma."""
        d1 = (np.log(S/K) + 0.5*sigma**2*T) / (sigma*np.sqrt(T))
        return norm.pdf(d1) / (S * sigma * np.sqrt(T))

--- Utilisation avec données HolySheep ---

async def analyze_volatility(): pipeline = BybitOptionsDataPipeline(HOLYSHEEP_API_KEY) calculator = VolatilityCalculator(risk_free_rate=0.05) # Récupération des ticks pour calcul d'IV df = await pipeline.fetch_historical_ticks( symbol="BTC-25JUL25-95000-C", start=datetime.now() - timedelta(hours=24), end=datetime.now() ) # Calcul de l'IV en temps réel spot_btc = 97500 # Prix spot BTC (exemple) for _, tick in df.iterrows(): iv = calculator.implied_volatility( market_price=tick["price"], S=spot_btc, K=95000, T=0.15, # ~55 jours jusqu'à expiration option_type="call" ) print(f"IV: {iv*100:.2f}% | Prix: {tick['price']}") if __name__ == "__main__": asyncio.run(analyze_volatility())

Pipeline de Recherche sur la Courbe de Volatilité

import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import asyncio
from holy_sheep import HolySheepClient

class VolatilityCurveResearch:
    """
    Recherche sur la courbe de volatilité implicite.
    Permet d'identifier les inefficiences pour stratégies de arbitrage.
    """
    
    def __init__(self, client: HolySheepClient):
        self.client = client
        self.vol_surface = {}
    
    async def build_term_structure(
        self,
        symbols: list[str],
        spot_price: float
    ) -> pd.DataFrame:
        """
        Construit la structure à terme de la volatilité.
        Analyse la skew par échéance.
        """
        term_structure = []
        
        for symbol in symbols:
            # Extraction des paramètres depuis le symbole
            # Format: BTC-25JUL25-95000-C
            expiry, strike, option_type = self._parse_symbol(symbol)
            days_to_expiry = (expiry - datetime.now()).days
            
            # Récupération des ticks via HolySheep
            df = await self._fetch_ticks(symbol, hours=24)
            
            if len(df) > 0:
                # Calcul des métriques de volatilité
                returns = df["price"].pct_change().dropna()
                realized_vol = returns.std() * np.sqrt(365 * 24 * 60)  # Annualisée
                
                # Volatilité implicite (si données de marché disponibles)
                implied_vol = self._estimate_iv(df, spot_price, strike, days_to_expiry)
                
                term_structure.append({
                    "symbol": symbol,
                    "expiry": expiry,
                    "days_to_expiry": days_to_expiry,
                    "strike": strike,
                    "moneyness": strike / spot_price,
                    "realized_vol": realized_vol,
                    "implied_vol": implied_vol,
                    "iv_rv_spread": implied_vol - realized_vol,
                    "option_type": option_type
                })
        
        return pd.DataFrame(term_structure).sort_values("days_to_expiry")
    
    async def detect_volatility_arbitrage(
        self,
        term_structure: pd.DataFrame,
        threshold: float = 0.05
    ) -> list[dict]:
        """
        Détecte les opportunités d'arbitrage sur la courbe de vol.
        Utilise le ratio IV/RV comme signal principal.
        """
        opportunities = []
        
        for _, row in term_structure.iterrows():
            spread = row["iv_rv_spread"]
            
            if abs(spread) > threshold:
                opportunities.append({
                    "symbol": row["symbol"],
                    "type": "OVERVALUED" if spread > 0 else "UNDERVALUED",
                    "spread": spread,
                    "confidence": self._calculate_confidence(row),
                    "action": "SELL_IV" if spread > 0 else "BUY_IV"
                })
        
        return opportunities
    
    async def backtest_strategy(
        self,
        symbols: list[str],
        start_date: datetime,
        end_date: datetime,
        initial_capital: float = 100000
    ) -> dict:
        """
        Backtest d'une stratégie basée sur le skew de volatilité.
        Retourne les métriques de performance (Sharpe, max drawdown, etc.)
        """
        trades = []
        capital = initial_capital
        pnl_history = [initial_capital]
        
        for symbol in symbols:
            # Téléchargement des données historiques
            df = await self._fetch_ticks(symbol, start=start_date, end=end_date)
            
            # Simulation des trades
            for i in range(1, len(df)):
                signal = self._generate_signal(df.iloc[:i])
                
                if signal["action"] != "HOLD":
                    entry_price = df.iloc[i]["price"]
                    exit_price = df.iloc[i+1]["price"] if i+1 < len(df) else entry_price
                    
                    pnl = self._calculate_pnl(
                        signal["action"],
                        entry_price,
                        exit_price,
                        capital * 0.1  # 10% de la position par trade
                    )
                    capital += pnl
                    pnl_history.append(capital)
                    
                    trades.append({
                        "timestamp": df.iloc[i]["timestamp"],
                        "symbol": symbol,
                        "action": signal["action"],
                        "entry": entry_price,
                        "exit": exit_price,
                        "pnl": pnl,
                        "capital": capital
                    })
        
        return {
            "final_capital": capital,
            "total_return": (capital - initial_capital) / initial_capital,
            "sharpe_ratio": self._sharpe_ratio(pnl_history),
            "max_drawdown": self._max_drawdown(pnl_history),
            "trade_count": len(trades),
            "win_rate": len([t for t in trades if t["pnl"] > 0]) / len(trades) if trades else 0,
            "trades": pd.DataFrame(trades)
        }
    
    def _parse_symbol(self, symbol: str) -> tuple[datetime, float, str]:
        """Parse un symbole d'option Bybit."""
        parts = symbol.split("-")
        expiry_str = parts[1] + "-" + parts[2]
        strike = float(parts[3])
        option_type = "call" if parts[4] == "C" else "put"
        expiry = datetime.strptime(expiry_str, "%d%b%y")
        return expiry, strike, option_type
    
    async def _fetch_ticks(
        self,
        symbol: str,
        start: datetime = None,
        end: datetime = None,
        hours: int = 24
    ) -> pd.DataFrame:
        """Récupère les ticks via l'API HolySheep."""
        if end is None:
            end = datetime.now()
        if start is None:
            start = end - timedelta(hours=hours)
        
        response = await self.client.get_historical_data(
            exchange="bybit",
            instrument_type="options",
            symbol=symbol,
            start=start.isoformat(),
            end=end.isoformat(),
            granularity="tick"
        )
        
        return pd.DataFrame(response.data)
    
    def _estimate_iv(
        self, 
        df: pd.DataFrame, 
        S: float, 
        K: float, 
        T: float
    ) -> float:
        """Estimation simple de l'IV à partir des ticks."""
        # Utilisation d'une approximation rapide
        if len(df) < 10:
            return np.nan
        
        returns = df["price"].pct_change().dropna()
        return returns.std() * np.sqrt(365)
    
    def _calculate_confidence(self, row: pd.Series) -> float:
        """Calcule le niveau de confiance du signal."""
        base_confidence = 0.5
        if row["days_to_expiry"] < 7:
            base_confidence += 0.2  # Échéance courte = plus de liquidité
        if abs(row["moneyness"] - 1.0) < 0.1:
            base_confidence += 0.2  # ATM = plus de liquidité
        return min(base_confidence, 1.0)
    
    def _generate_signal(self, df: pd.DataFrame) -> dict:
        """Génère un signal de trading basique."""
        if len(df) < 20:
            return {"action": "HOLD", "confidence": 0}
        
        recent_vol = df["price"].tail(20).std()
        mean_vol = df["price"].std()
        
        if recent_vol > mean_vol * 1.1:
            return {"action": "SELL", "confidence": 0.7}
        elif recent_vol < mean_vol * 0.9:
            return {"action": "BUY", "confidence": 0.7}
        
        return {"action": "HOLD", "confidence": 0}
    
    def _calculate_pnl(
        self, 
        action: str, 
        entry: float, 
        exit: float, 
        position_size: float
    ) -> float:
        """Calcule le PnL d'un trade."""
        if action == "BUY":
            return (exit - entry) / entry * position_size
        elif action == "SELL":
            return (entry - exit) / entry * position_size
        return 0
    
    def _sharpe_ratio(self, returns: list[float], risk_free: float = 0.05) -> float:
        """Calcule le ratio de Sharpe."""
        if len(returns) < 2:
            return 0
        returns_arr = np.diff(returns) / returns[:-1]
        excess_returns = returns_arr - risk_free / 252
        return np.mean(excess_returns) / np.std(excess_returns) * np.sqrt(252) if np.std(excess_returns) > 0 else 0
    
    def _max_drawdown(self, capital_history: list[float]) -> float:
        """Calcule le drawdown maximum."""
        capital_arr = np.array(capital_history)
        running_max = np.maximum.accumulate(capital_arr)
        drawdown = (capital_arr - running_max) / running_max
        return abs(np.min(drawdown))


--- Exécution de la recherche ---

async def main_research(): client = HolySheepClient( base_url="https://api.holysheep.ai/v1", api_key=HOLYSHEEP_API_KEY ) research = VolatilityCurveResearch(client) # Liste des symboles d'options BTC symbols = [ "BTC-25JUL25-90000-C", "BTC-25JUL25-95000-C", "BTC-25JUL25-100000-C", "BTC-25AUG25-95000-C", "BTC-25AUG25-100000-C" ] # Construction de la structure à terme spot_price = 97500 # Prix spot BTC term_structure = await research.build_term_structure(symbols, spot_price) print("=== Term Structure de Volatilité ===") print(term_structure.to_string()) # Détection d'opportunités opportunities = await research.detect_volatility_arbitrage( term_structure, threshold=0.05 ) print(f"\n=== Opportunités Détectées ({len(opportunities)}) ===") for opp in opportunities: print(f"{opp['symbol']}: {opp['type']} | Spread: {opp['spread']*100:.2f}% | Action: {opp['action']}") if __name__ == "__main__": asyncio.run(main_research())

Pour qui / Pour qui ce n'est pas fait

✅ Idéal pour HolySheep + Tardis Bybit Options ❌ Moins adapté sans adaptations
Data engineers en fintech/crypto qui ont besoin de ticks haute fréquence pour du backtesting ou du trading algorithmique. Développeursweb classiques cherchant uniquement des API LLM textuelles (autres solutions existent).
Chercheurs en finance quantitative travaillant sur les stratégies de volatilité, arbitrage de smile, ou pricing d'options. Commerces traditionnels n'ayant pas de besoins en données financières temps réel.
Prop traders et hedge funds qui optimisent chaque milliseconde de latence et chaque centime de coût. Étudiants cherchant des données gratuits pour des projets académiques (existence de datasets publics).
Scale-ups SaaS en gestion d'actifs qui doivent réduire leurs coûts d'infrastructure data de manière significative. Traders discrets nécessitant une infrastructure on-premise complète (nécessite VPN/dédiée setup).

Tarification et ROI

Comparatif des Coûts avec HolySheep vs. Alternative Directe

Composante Prix HolySheep (2026) Prix Marché Standard Économie
Flux tick data Bybit Options $2.50 / 1M tokens équivalent $15-20 / 1M tokens 85%+
Latence moyenne < 50ms 150-500ms Meilleur
Crédits gratuits inscription $25 offerts $0 Inclus
Support WeChat/Alipay ✅ Oui ❌ Non Accessibilité
Coût mensuel ScaleFlow (exemple) $680 $4 200 ↓ $3 520/mois

Calcul du ROI pour ScaleFlow

# Impact financier annuel pour ScaleFlow

COUT_MENSUEL_HOLYSHEEP = 680  # $
COUT_MENSUEL_PRECEDENT = 4200  # $

ECONOMIE_MENSUELLE = COUT_MENSUEL_PRECEDENT - COUT_MENSUEL_HOLYSHEEP
ECONOMIE_ANNUELLE = ECONOMIE_MENSUELLE * 12

ROI_MIGRATION = (ECONOMIE_ANNUELLE / 2000) * 100  # Coût migration estimé ~$2000

print(f"Économie mensuelle: ${ECONOMIE_MENSUELLE:,}")
print(f"Économie annuelle: ${ECONOMIE_ANNUELLE:,}")
print(f"ROI sur migration: {ROI_MIGRATION:,.0f}%")  # 1,980%

Temps de retour sur investissement

JOURS_RECUPERATION = 2000 / ECONOMIE_MENSUELLE # ~0.5 mois

Avec une économie annuelle de $42 240 et un ROI dépassant les 1 900%, l'investissement dans l'intégration HolySheep s'amortit en moins de 2 jours.

Pourquoi Choisir HolySheep

  1. Latence ultra-faible : Moyenne de 42ms contre 420ms avec les autres fournisseurs, critique pour le trading haute fréquence.
  2. Économie massive : Taux préférentiel ¥1 = $1 avec support WeChat/Alipay, réduction de 85% sur les coûts de données.
  3. Crédits gratuits généreux : $25 dès l'inscription pour tester sans risque avant de s'engager.
  4. SDK multi-langages : Python, Node.js, Go avec exemples prêts à l'emploi pour data pipelines.
  5. Documentation francophone : Guides détaillés, tutoriels vidéo, et support technique réactif.
  6. Flexibilité de paiement : Pas uniquement USD, accepts Alipay/WeChat pour les équipes asiatiques.

Erreurs Courantes et Solutions

Erreur 1 : Timezone Mismatch sur les Timestamps

Symptôme : Les ticks retrieved ne correspondent pas aux données attendues. Un décalage de plusieurs heures apparaît dans les analyses de volatilité.

# ❌ ERREUR : Ignorer le timezone
df = await pipeline.fetch_historical_ticks(symbol, start, end)
df["timestamp"] = pd.to_datetime(df["timestamp"])  # UTC implicite

✅ SOLUTION : Normaliser explicitement

from pytz import timezone def normalize_timestamp(ts_str: str, target_tz: str = "Europe/Paris") -> pd.Timestamp: """Normalise les timestamps avec gestion explicite du timezone.""" # HolySheep retourne en ISO 8601 avec timezone UTC ts = pd.to_datetime(ts_str, utc=True) # Conversion vers le timezone cible pour analyse locale return ts.tz_convert(target_tz) df["timestamp_local"] = df["timestamp"].apply(normalize_timestamp) df.set_index("timestamp_local", inplace=True)

Vérification

assert df.index.tz is not None, "Timezone must be set" print(f"Plage de données: {df.index.min()} → {df.index.max()}")

Erreur 2 : Rate Limiting Ignoré

Symptôme : Erreur 429 après quelques requêtes réussi, perte de données critiques pendant le backtesting.

# ❌ ERREUR : Pas de gestion du rate limiting
for symbol in symbols:
    df = await pipeline.fetch_historical_ticks(symbol, start, end)
    # 50+ symbols = 429 après 20 requêtes

✅ SOLUTION : Implémenter backoff exponentiel et batch requests

import asyncio from tenacity import retry, stop_after_attempt, wait_exponential class RateLimitedClient: """Client avec gestion intelligente du rate limiting.""" def __init__(self, client: HolySheepClient, max_rpm: int = 100): self.client = client self.max_rpm = max_rpm self.semaphore = asyncio.Semaphore(max_rpm // 10) self.request_times = [] async def throttled_request(self, func, *args, **kwargs): """Exécute une requête avec limitation de débit.""" async with self.semaphore: # Rate limiting: max 100 req/min now = asyncio.get_event_loop().time() self.request_times = [t for t in self.request_times if now - t < 60] if len(self.request_times) >= self.max_rpm: wait_time = 60 - (now - self.request_times[0]) await asyncio.sleep(wait_time) self.request_times.append(now) return await func(*args, **kwargs) async def batch_fetch(self, symbols: list[str], start, end) -> dict: """Récupère plusieurs symboles en parallèle avec rate limiting.""" tasks = [ self.throttled_request( self.client.get_historical_data, exchange="bybit", instrument_type="options", symbol=sym, start=start.isoformat(), end=end.isoformat(), granularity="tick" ) for sym in symbols ] results = await asyncio.gather(*tasks, return_exceptions=True) return {sym: r for sym, r in zip(symbols, results) if not isinstance(r, Exception)}

Utilisation

client = HolyShe