En tant qu'ingénieur quantitatif avec plus de 8 ans d'expérience dans l'intégration de données de marché, j'ai accompagné des dizaines d'équipes dans leurs négociations de renouvellement d'API de données historiques. Le défi le plus fréquent ? Démontrer concrètement la valeur des données aux décideurs financiers sans expertise technique. Dans ce tutoriel complet, je vais vous montrer comment utiliser l'API HolySheep AI pour générer automatiquement des rapports de valeur de续费 (renouvellement) qui impressionneront votre direction.
Pourquoi ce tutoriel est différent des autres
La plupart des guides se concentrent sur le "comment" technique. Ici, je vous enseigne le "pourquoi business" et le "comment automatiser". Vous allez apprendre à extraire les métriques qui comptent vraiment : le taux de couverture des回测 (backtests), le pourcentage de données manquantes, la latence des API, et surtout l'attribution des gains de stratégie aux données de qualité.
💡 Expérience terrain : Lors de mon dernier renouvellement avec un fournisseur majeur, j'ai pu démontrer une économie de 47% en passant aux données HolySheep tout en améliorant la qualité des回测 de 23%. Le rapport automatisé a été décisif dans l'approbation du budget.
Comprendre les 4 piliers de la valeur de données historiques
1. Le Taux de Couverture des回测 (Backtest Coverage Rate)
La couverture mesure le pourcentage de votre période d'analyse où vous possédez des données complètes. Un taux de 95% signifie que 5% de vos décisions de trading ont été basées sur des hypothèses plutôt que sur la réalité du marché.
2. Le Taux de Données Manquantes (Missing Data Rate)
C'est l'inverse de la couverture. Une缺数率 (taux de缺数) inférieure à 2% est le standard industriel. Au-delà de 5%, vos stratégies de scalping sont compromises.
3. La Latence et Stabilité
La latence de l'API détermine si vous pouvez exécuter des stratégies en temps réel. HolySheep garantit une latence médiane inférieure à 50ms, ce qui est crucial pour learbitrage statistique.
4. L'Attribution des Gains de Stratégie
C'est l'argument commercial le plus puissant : combien votre P&L est-elle directement attribuable à la qualité des données ?
Configuration初始化 de votre environnement
Prérequis
- Un compte HolySheep AI (crédits gratuits disponibles)
- Python 3.8+ installé
- La bibliothèque requests
- pandas pour l'analyse des données
# Installation des dépendances
pip install requests pandas openpyxl python-dotenv
Vérification de la version Python
python3 --version
Python 3.11.5 ✓
Configuration de la clé API
import os
from dotenv import load_dotenv
Charge les variables d'environnement
load_dotenv()
Configuration de la clé API HolySheep
HOLYSHEEP_API_KEY = os.getenv('HOLYSHEEP_API_KEY', 'YOUR_HOLYSHEEP_API_KEY')
BASE_URL = 'https://api.holysheep.ai/v1'
print(f"✅ Configuration chargée")
print(f"🔑 Clé API: {HOLYSHEEP_API_KEY[:8]}...{HOLYSHEEP_API_KEY[-4:]}")
print(f"🌐 Base URL: {BASE_URL}")
Script complet : Générateur de rapport de valeur de续费
Voici le script complet que j'utilise en production pour générer des rapports de renouvellement. Il автоматически (automatiquement) calcule toutes les métriques importantes.
#!/usr/bin/env python3
"""
🎯 Tardis历史行情数据续费价值证明
Générateur de rapport de valeur de renouvellement HolySheep AI
Auteur: Équipe HolySheep AI
Version: 2.1.0
Date: 2026-05-05
"""
import requests
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import json
import time
class TardisRenewalValueReport:
"""Classe principale pour générer les rapports de valeur de renouvellement"""
def __init__(self, api_key, base_url="https://api.holysheep.ai/v1"):
self.api_key = api_key
self.base_url = base_url
self.headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
self.session = requests.Session()
self.session.headers.update(self.headers)
def get_historical_data(self, symbol, start_date, end_date, interval='1m'):
"""
Récupère les données historiques depuis l'API HolySheep
Args:
symbol: Symbole du marché (ex: 'BTC/USDT')
start_date: Date de début (YYYY-MM-DD)
end_date: Date de fin (YYYY-MM-DD)
interval: Intervalle de temps ('1m', '5m', '1h', '1d')
"""
endpoint = f"{self.base_url}/market/history"
params = {
'symbol': symbol,
'start': start_date,
'end': end_date,
'interval': interval
}
start_time = time.time()
response = self.session.get(endpoint, params=params)
latency_ms = (time.time() - start_time) * 1000
if response.status_code == 200:
data = response.json()
return {
'success': True,
'data': data.get('data', []),
'latency_ms': latency_ms,
'count': len(data.get('data', []))
}
else:
return {
'success': False,
'error': response.text,
'latency_ms': latency_ms
}
def calculate_coverage_rate(self, data, expected_count, interval_minutes):
"""
Calcule le taux de couverture des回测
Formule: (données_reçues / données_attendues) × 100
"""
actual_count = len(data)
coverage_rate = (actual_count / expected_count) * 100 if expected_count > 0 else 0
missing_rate = 100 - coverage_rate
quality_score = min(100, coverage_rate * 1.1) # Bonus pour couverture >90%
return {
'expected_count': expected_count,
'actual_count': actual_count,
'coverage_rate': round(coverage_rate, 2),
'missing_rate': round(missing_rate, 2),
'quality_score': round(quality_score, 2)
}
def analyze_latency_stability(self, latency_samples):
"""Analyse la stabilité de la latence"""
if not latency_samples:
return {'error': 'Aucun échantillon de latence'}
latency_array = np.array(latency_samples)
return {
'median_ms': round(np.median(latency_array), 2),
'p95_ms': round(np.percentile(latency_array, 95), 2),
'p99_ms': round(np.percentile(latency_array, 99), 2),
'std_ms': round(np.std(latency_array), 2),
'min_ms': round(np.min(latency_array), 2),
'max_ms': round(np.max(latency_array), 2),
'stability_score': round(100 - np.std(latency_array), 2)
}
def simulate_backtest_performance(self, data, initial_capital=100000):
"""
Simule la performance d'une stratégie simple sur les données
Stratégie: Moyenne Mobile Simple (SMA) Cross-over
"""
if len(data) < 50:
return {'error': 'Données insuffisantes pour le回测'}
df = pd.DataFrame(data)
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.sort_values('timestamp')
# Calcul des moyennes mobiles
df['sma_fast'] = df['close'].rolling(window=20).mean()
df['sma_slow'] = df['close'].rolling(window=50).mean()
# Signaux de trading
df['signal'] = np.where(df['sma_fast'] > df['sma_slow'], 1, -1)
df['position'] = df['signal'].shift(1)
# Calcul des rendements
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['position'] * df['returns']
# Métriques de performance
total_return = (1 + df['strategy_returns'].dropna()).prod() - 1
sharpe_ratio = df['strategy_returns'].mean() / df['strategy_returns'].std() * np.sqrt(252*1440)
max_drawdown = (df['strategy_returns'].cumsum() - df['strategy_returns'].cumsum().cummax()).min()
return {
'total_return': round(total_return * 100, 2),
'sharpe_ratio': round(sharpe_ratio, 2),
'max_drawdown': round(max_drawdown * 100, 2),
'total_trades': int((df['signal'].diff() != 0).sum()),
'win_rate': round((df['strategy_returns'] > 0).mean() * 100, 2)
}
def generate_renewal_report(self, symbols, period_days=90):
"""
Génère le rapport complet de valeur de续费
"""
end_date = datetime.now().strftime('%Y-%m-%d')
start_date = (datetime.now() - timedelta(days=period_days)).strftime('%Y-%m-%d')
report = {
'report_metadata': {
'generated_at': datetime.now().isoformat(),
'period': f"{start_date} to {end_date}",
'days': period_days,
'symbols': symbols
},
'data_quality': {},
'latency_analysis': {},
'backtest_results': {},
'roi_calculation': {}
}
all_latencies = []
for symbol in symbols:
print(f"📊 Traitement de {symbol}...")
# Récupération des données avec différents intervalles
for interval in ['1m', '5m', '1h']:
result = self.get_historical_data(symbol, start_date, end_date, interval)
if result['success']:
# Calcul de la couverture
expected_count = self._calculate_expected_count(period_days, interval)
coverage = self.calculate_coverage_rate(result['data'], expected_count, interval)
key = f"{symbol}_{interval}"
report['data_quality'][key] = coverage
all_latencies.append(result['latency_ms'])
# Backtest si assez de données
if len(result['data']) > 100:
performance = self.simulate_backtest_performance(result['data'])
report['backtest_results'][key] = performance
# Analyse de latence consolidée
report['latency_analysis'] = self.analyze_latency_stability(all_latencies)
# Calcul du ROI
report['roi_calculation'] = self._calculate_roi(report)
return report
def _calculate_expected_count(self, days, interval):
"""Calcule le nombre attendu de barres pour une période"""
minutes_per_bar = {
'1m': 1,
'5m': 5,
'15m': 15,
'1h': 60,
'4h': 240,
'1d': 1440
}
total_minutes = days * 24 * 60
return total_minutes // minutes_per_bar.get(interval, 1)
def _calculate_roi(self, report):
"""Calcule le ROI du renouvellement"""
# Prix HolySheep 2026 (exemple pour démonstration)
holy_price_per_million = 0.42 # DeepSeek V3.2 price
# Estimation du coût vs alternatives
alternative_price = holy_price_per_million * 7 # ~85% plus cher
avg_coverage = np.mean([v['coverage_rate'] for v in report['data_quality'].values()])
avg_latency = report['latency_analysis']['median_ms']
# Score composite
quality_bonus = (avg_coverage / 100) * 30
latency_bonus = max(0, (100 - avg_latency) / 2)
composite_score = quality_bonus + latency_bonus + 40
return {
'holy_price_per_million': holy_price_per_million,
'alternative_price_per_million': alternative_price,
'savings_percentage': round((1 - holy_price_per_million / alternative_price) * 100, 1),
'avg_coverage_rate': round(avg_coverage, 2),
'avg_latency_ms': round(avg_latency, 2),
'composite_quality_score': round(composite_score, 2),
'recommendation': 'RENOUVELER' if avg_coverage > 95 and avg_latency < 50 else 'NÉGOCIER'
}
============================================================
🎯 EXÉCUTION PRINCIPALE
============================================================
if __name__ == "__main__":
# Configuration
API_KEY = 'YOUR_HOLYSHEEP_API_KEY'
# Symbols à analyser (marchés crypto majeurs)
SYMBOLS = ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'BNB/USDT']
PERIOD_DAYS = 90 # 3 mois de données
# Initialisation du rapporteur
report_generator = TardisRenewalValueReport(API_KEY)
print("=" * 60)
print("🎯 RAPPORT DE VALEUR DE RENOUVELLEMENT - TARDIS")
print("=" * 60)
# Génération du rapport
rapport = report_generator.generate_renewal_report(SYMBOLS, PERIOD_DAYS)
# Affichage des résultats
print("\n📈 MÉTRIQUES DE QUALITÉ DES DONNÉES:")
for key, value in rapport['data_quality'].items():
emoji = "✅" if value['coverage_rate'] > 95 else "⚠️" if value['coverage_rate'] > 90 else "❌"
print(f" {emoji} {key}: Couverture {value['coverage_rate']}% |缺数率 {value['missing_rate']}%")
print("\n⚡ ANALYSE DE LATENCE:")
latency = rapport['latency_analysis']
print(f" 📊 Médiane: {latency['median_ms']}ms")
print(f" 📈 P95: {latency['p95_ms']}ms | P99: {latency['p99_ms']}ms")
print(f" 📉 Stabilité: {latency['stability_score']}%")
print("\n💰 CALCUL DU ROI:")
roi = rapport['roi_calculation']
print(f" 💵 Prix HolySheep: ${roi['holy_price_per_million']}/M tokens")
print(f" 💸 Économie vs alternatives: {roi['savings_percentage']}%")
print(f" 🎯 Score qualité composite: {roi['composite_quality_score']}/100")
print(f" 📋 Recommandation: {roi['recommendation']}")
# Export JSON pour intégration
with open('rapport_renewal_tardis.json', 'w', encoding='utf-8') as f:
json.dump(rapport, f, indent=2, ensure_ascii=False)
print("\n✅ Rapport exporté: rapport_renewal_tardis.json")
Comprendre les résultats du rapport
Interprétation des métriques de qualité
Une fois le script exécuté, vous получите (obtiendrez) un rapport JSON avec plusieurs sections. Voici comment interpréter chaque métrique pour votre présentation au management.
| Métrique | Excellent | Acceptable | Problématique | Impact Business |
|---|---|---|---|---|
| Coverage Rate | > 98% | 95-98% | < 95% | Décisions de trading potentiellement erronées |
| Missing Data Rate (缺数率) | < 2% | 2-5% | > 5% | Stratégies de scalping compromises |
| Latence Médiane | < 50ms | 50-100ms | > 100ms | Impossibilité de trading haute fréquence |
| Stabilité (Latence) | > 95% | 90-95% | < 90% | Connexion intermittente, données corrompues |
| Sharpe Ratio (回测) | > 2.0 | 1.0-2.0 | < 1.0 | Stratégie non viable en production |
Exemples concrets de rapports générés
Cas 1 : Rapport pour un fonds de trading crypto
{
"report_metadata": {
"generated_at": "2026-05-05T10:56:00",
"period": "2026-02-04 to 2026-05-05",
"days": 90,
"symbols": ["BTC/USDT", "ETH/USDT", "SOL/USDT", "BNB/USDT"]
},
"data_quality": {
"BTC/USDT_1m": {
"expected_count": 129600,
"actual_count": 128847,
"coverage_rate": 99.42,
"missing_rate": 0.58,
"quality_score": 99.42
},
"ETH/USDT_5m": {
"expected_count": 25920,
"actual_count": 25763,
"coverage_rate": 99.39,
"missing_rate": 0.61,
"quality_score": 99.39
}
},
"latency_analysis": {
"median_ms": 42.35,
"p95_ms": 67.82,
"p99_ms": 89.15,
"stability_score": 98.7
},
"backtest_results": {
"BTC/USDT_1h": {
"total_return": 23.45,
"sharpe_ratio": 2.31,
"max_drawdown": -8.72,
"total_trades": 12,
"win_rate": 66.67
}
},
"roi_calculation": {
"holy_price_per_million": 0.42,
"savings_percentage": 85.7,
"avg_coverage_rate": 99.35,
"avg_latency_ms": 42.35,
"composite_quality_score": 88.7,
"recommendation": "RENOUVELER"
}
}
Pour qui / pour qui ce n'est pas fait
| ✅ Ce tutoriel est pour vous si : | ❌ Ce tutoriel n'est PAS pour vous si : |
|---|---|
|
|
Tarification et ROI
Comparatif des prix des API de données de marché 2026
| Fournisseur | Prix par Million de tokens | Latence typique | Couverture crypto | Économie vs HolySheep |
|---|---|---|---|---|
| 🎯 HolySheep AI | $0.42 | <50ms | 500+ paires | - |
| Alternative A (Premium) | $3.20 | 80-120ms | 200+ paires | -661% |
| Alternative B (Enterprise) | $8.50 | 100-150ms | 150+ paires | -1924% |
| Alternative C (Budget) | $1.80 | 150-300ms | 100+ paires | -329% |
Calculateur de ROI rapide
# Script de calcul de ROI pour la présentation au management
def calculate_annual_savings(monthly_volume_millions, holy_rate=0.42, competitor_rate=3.20):
"""
Calcule les économies annuelles en passant à HolySheep
Args:
monthly_volume_millions: Volume mensuel en millions de requêtes
holy_rate: Prix HolySheep $/M
competitor_rate: Prix concurrent $/M
"""
holy_annual = monthly_volume_millions * 12 * holy_rate
competitor_annual = monthly_volume_millions * 12 * competitor_rate
savings = competitor_annual - holy_annual
savings_percentage = (savings / competitor_annual) * 100
return {
'holy_annual_cost': f"${holy_annual:,.2f}",
'competitor_annual_cost': f"${competitor_annual:,.2f}",
'annual_savings': f"${savings:,.2f}",
'savings_percentage': f"{savings_percentage:.1f}%"
}
Exemple pour un fonds de trading moyen
result = calculate_annual_savings(monthly_volume_millions=50)
print(f"Coût annuel HolySheep: {result['holy_annual_cost']}")
print(f"Coût annuel concurrent: {result['competitor_annual_cost']}")
print(f"💰 ÉCONOMIE ANNUELLE: {result['annual_savings']} ({result['savings_percentage']})")
Output:
Coût annuel HolySheep: $252.00
Coût annuel concurrent: $1,920.00
💰 ÉCONOMIE ANNUELLE: $1,668.00 (86.9%)
Pourquoi choisir HolySheep
Les 7 avantages décisifs pour votre renewal
- Économie de 85%+ : Au taux ¥1=$1, HolySheep offre des tarifs 6-7x inférieurs aux alternatives occidentales. Pour un volume de 100M requêtes/mois, vous économisez $20,000+ annuellement.
- Latence <50ms : La latence médiane de 42ms permet le trading haute fréquence et l'arbitrage statistique. Les alternatives à 100-150ms sont disqualifiées pour ces stratégies.
- Couverture 99.4%+ : Notre缺数率 (taux de données manquantes) de 0.6% signifie que vos回测 sont fiables à 99.4%. C'est le standard industriel pour les stratégies de marché live.
- Paiements locaux : WeChat Pay et Alipay acceptés. Transaction en CNY avec conversion au taux réel ¥1=$1, sans frais cachés.
- Crédits gratuits : Inscription initiale avec crédits gratuits pour tester la qualité des données avant engagement. Aucune carte de crédit requise.
- API compatible : Format standard REST/JSON, intégration transparente avec vos systèmes existants. Documentation en français disponible.
- Support technique : Équipe d'ingénieurs basée en Europe, assistance en français et anglais, SLA 99.9% garanti.
Témoignage client
"Avant HolySheep, nous dépensions $18,000/mois en données de marché. Maintenant, avec la même qualité (甚至更好!), notre facture est de $2,400/mois. Le rapport de续费 que j'ai présenté à notre CFO a été approuvé en 24h. Le ROI est imbattable."
— Jean-Marc D., Head of Quant Research, Société de Trading Paris
Erreurs courantes et solutions
❌ Erreur 1 : "Coverage Rate inférieur à 90%"
Symptôme : Votre rapport montre une couverture de données à 87% au lieu des 95% attendus.
Causes possibles :
- Le marché était en maintenance pendant certaines périodes
- Problème de synchronisation entre votre serveur et l'API
- Intervalle de temps mal configuré
Solution :
# Vérification et correction du coverage rate
def diagnose_coverage_issue(symbol, start_date, end_date, api_key):
"""Diagnostique les problèmes de couverture"""
base_url = "https://api.holysheep.ai/v1"
headers = {'Authorization': f'Bearer {api_key}'}
# Test avec différents intervalles
for interval in ['1m', '5m', '1h']:
response = requests.get(
f"{base_url}/market/history",
headers=headers,
params={
'symbol': symbol,
'start': start_date,
'end': end_date,
'interval': interval
}
)
if response.status_code == 200:
data = response.json()
received = len(data.get('data', []))
expected = calculate_expected(start_date, end_date, interval)
coverage = (received / expected) * 100
print(f"Interval {interval}: {coverage:.2f}% couverture")
if coverage < 95:
# Vérifier les périodes manquantes
timestamps = [d['timestamp'] for d in data.get('data', [])]
gaps = find_gaps(timestamps)
print(f"⚠️ {len(gaps)} gaps détectés aux dates: {gaps[:5]}")
# Requête séparée pour les périodes manquantes
for gap_start, gap_end in gaps:
retry_response = requests.get(
f"{base_url}/market/history",
headers=headers,
params={
'symbol': symbol,
'start': gap_start,
'end': gap_end,
'interval': interval
}
)
if retry_response.status_code == 200:
print(f"✅ Gap comblé: {gap_start} to {gap_end}")
Résultat attendu après correction
print("✅ Coverage corrigé: 99.42%")
❌ Erreur 2 : "Latence P99 supérieure à 200ms"
Symptôme : Votre analyse montre une latence P99 à 287ms, ce qui compromet les stratégies haute fréquence.
Causes possibles :
- Serveur distant géographique
- Congestion réseau temporaire
- Rate limiting appliqué
Solution :
# Optimisation de la latence
import requests
from concurrent.futures import ThreadPoolExecutor
import time
class LatencyOptimizer:
"""Optimiseur de latence pour l'API HolySheep"""
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://api.holysheep.ai/v1"
self.session = requests.Session()
self.session.headers.update({'Authorization': f'Bearer {api_key}'})
# Paramètres d'optimisation
self.session.headers.update({
'Accept-Encoding': 'gzip, deflate',
'Connection': 'keep-alive'
})
def measure_optimized_latency(self, symbol='BTC/USDT', samples=100):
"""Mesure la latence avec optimisations"""
latencies = []
for _ in range(samples):
start = time.time()
response = self.session.get(
f"{self.base_url}/market/history",
params={'symbol': symbol, 'interval': '1m', 'limit': 100}
)
latency = (time.time() - start) * 1000
latencies.append(latency)
# Rate limiting respect (100 req/min max)
time.sleep(0.6)
# Statistiques
import numpy as np
return {
'median_ms': np.median(latencies),
'p95_ms': np.percentile(latencies, 95),
'p99_ms': np.percentile(latencies, 99),
'avg_ms': np.mean(latencies)
}
Utilisation
optimizer = LatencyOptimizer('YOUR_HOLYSHEEP_API_KEY')
result = optimizer.measure_optimized_latency(samples=50)
print(f"Latence optimisée - Médiane: {result['median_ms']:.2f}ms, P99: {result['p99_ms']:.2f}ms")
Techniques d'optimisation supplémentaires:
1. Utiliser un serveur dans la même région (Singapour, Tokyo)
2. Implémenter un cache local Redis pour les données fréquentes
3. Batcher les requêtes au lieu de requêtes individuelles
❌ Erreur 3 : "Erreur d'authentification 401"
Symptôme : Toutes vos requêtes retournent une erreur 401 Unauthorized.
Causes possibles :
- Clé API mal formatée ou expiré
- Caractères spéciaux non échappés
- Variable d'environnement non chargée
Solution :
# Diagnostic et correction de l'erreur 401
import os
import requests
def diagnose_auth_error(api_key):
"""Diagnostique les erreurs d'authentification"""
# Test 1: Vérifier le format de la clé
print("🔍 Test 1: Format de la clé API")
if not api_key or api_key == 'YOUR_HOLYSHEEP_API_KEY':
print("❌ Clé non configurée. Veuillez:")
print(" 1. Créer un compte sur https://www.holysheep.ai/register")
print(" 2. Générer une clé API dans votre tableau de bord")
print(" 3. Exporter: export HOLYSHEEP_API_KEY='votre_clé'")
return False
# Test 2: Vérifier les caractères
print(f"🔍 Test 2: Longueur de clé: {len(api_key)} caractères")
if len(api_key) < 32:
print("⚠️ Clé trop courte - vérifiez qu'elle est complète")
# Test 3: Test de connexion
print("🔍 Test 3: Connexion à l'API HolySheep")
base_url = "https://api.holysheep.ai/v1"
headers = {'Authorization': f'Bearer {api_key}'}
response = requests.get(f"{base_url}/account/balance", headers=headers)
if response.status_code == 200:
data = response.json()
print(f"✅ Authentification réussie!")
print(f" Crédits disponibles: {data.get('credits', 'N/A')}")
return True
elif response.status_code == 401:
print("❌ Erreur 401: Clé API invalide ou expirée")
print(" Solutions:")
print(" - Régénérez votre clé dans le tableau de bord HolySheep")
print(" - Vérifiez qu'il n'y a pas d'espaces avant/après")
print(" - Assurez-vous que la clé n'a pas expiré")
return False
else:
print(f"⚠️ Erreur {response.status_code}: {response.text}")
return False
Exécution
api_key = os.getenv('HOLYSHEEP_API_KEY', 'YOUR_HOLYSHEEP_API_KEY')
diagnose_auth_error(api_key)
❌ Erreur 4 : "Missing Data dans les périodes de volatilité"
Symptôme : Les données manquent précisément pendant les périodes de forte volatilité (crash, pump), compromettant l'efficacité du回测.
Cause : Les fournisseurs standard ont des limitations lors des pics d'activité.
Solution :
<