Розробка системи верифікованої торговельної історії
Верифікована торговельна історія вирішує проблему довіри: будь-хто може заявити про високу дохідність, але лише верифікована історія підтверджує результати реальними біржевими даними. Це фундамент для лідербордів, соціальної торгівлі та маркетплейсів стратегій.
Моделі верифікації
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 завантаження всієї історії"""
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 для всіх передач ключів.
- Мінімальне утримання — ключ живе в пам'яті лише під час завантаження, потім знищується.
- 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]" з індикацією актуальності.







