Разработка системы верифицированной торговой истории
Верифицированная торговая история решает проблему доверия: любой может заявить о высокой доходности, но только верифицированная история подтверждает результаты реальными биржевыми данными. Это фундамент для лидербордов, социального трейдинга и маркетплейсов стратегий.
Модели верификации
Exchange API Verification — пользователь предоставляет read-only API ключ, система загружает историю ордеров и сделок напрямую с биржи. Наиболее надёжный метод.
OAuth-based Verification — некоторые биржи (Coinbase) поддерживают OAuth. Пользователь авторизует доступ без предоставления API ключей.
Proof of Address — пользователь подписывает сообщение приватным ключом кошелька, подтверждая владение адресом. Для on-chain стратегий.
Реализация API-верификации
class TradingHistoryVerifier:
SUPPORTED_EXCHANGES = ['binance', 'bybit', 'okx', 'kraken', 'coinbase']
async def verify(
self,
user_id: str,
exchange: str,
api_key: str,
api_secret: str,
) -> VerificationResult:
# 1. Проверяем что ключ read-only
permissions = await self.check_key_permissions(exchange, api_key, api_secret)
if permissions.can_trade or permissions.can_withdraw:
raise SecurityError("API key must be read-only")
# 2. Загружаем историю за последние 180 дней
client = ExchangeClientFactory.create(exchange, api_key, api_secret)
trades = await self.download_trade_history(client, days=180)
orders = await self.download_order_history(client, days=180)
# 3. Рассчитываем метрики
metrics = calculate_verified_metrics(trades, orders)
# 4. Сохраняем с подтверждением верификации
record = VerifiedHistory(
user_id=user_id,
exchange=exchange,
verified_at=datetime.utcnow(),
period_start=datetime.utcnow() - timedelta(days=180),
period_end=datetime.utcnow(),
trade_count=len(trades),
metrics=metrics,
# Храним только метрики, не сам API ключ
)
await self.repo.save(record)
# 5. Отзываем или помечаем API ключ как использованный
# (ключ не сохраняем в БД!)
return VerificationResult(success=True, metrics=metrics)
async def download_trade_history(self, client, days: int) -> list[Trade]:
"""Paginated download всей истории"""
all_trades = []
since = int((datetime.now() - timedelta(days=days)).timestamp() * 1000)
while True:
batch = await client.fetch_my_trades(limit=1000, since=since)
if not batch:
break
all_trades.extend(batch)
since = batch[-1]['timestamp'] + 1
await asyncio.sleep(0.5) # rate limit
return all_trades
Безопасность API ключей
API ключи пользователей — крайне чувствительные данные. Даже read-only ключ раскрывает торговую активность пользователя. Правила работы с ключами:
- Никогда не хранить API ключи в базе данных. Используем только для разовой загрузки истории.
- Шифрование в transit — TLS для всех передач ключей.
- Minimal retention — ключ живёт в памяти только время загрузки, затем уничтожается.
- Audit log — запись о факте верификации без деталей ключа.
Альтернатива: пользователь загружает CSV-экспорт торговой истории (большинство бирж поддерживают). Менее удобно, но не требует передачи ключей.
Публичный proof
Верифицированная история может быть опционально публичной. Пользователь выбирает что показывать: только метрики (Sharpe, drawdown, win rate) или полную историю ордеров. Система генерирует tamper-proof ссылку:
def generate_public_proof_url(verification_id: str, secret: str) -> str:
"""Генерирует URL с HMAC для верификации подлинности"""
sig = hmac.new(secret.encode(), verification_id.encode(), hashlib.sha256).hexdigest()[:16]
return f"https://platform.com/proof/{verification_id}?sig={sig}"
По этой ссылке любой может проверить результаты трейдера, при этом трейдер контролирует что именно раскрывать.
Периодическое обновление
Верификация не одноразовая — история обновляется. Пользователь может переверифицировать аккаунт каждый месяц, предоставляя свежий временный ключ или CSV-файл. Система показывает "verified as of [date]" с индикацией актуальности.







