Реализация AI-оптимизации DeFi-портфеля в мобильном приложении
DeFi-портфель — это позиции в разных протоколах: ликвидность в Uniswap v3, стейкинг в Lido, lending в Aave, yield farming в Convex. Каждая позиция имеет свою доходность, риски и условия. Оптимизация — поиск аллокации, максимизирующей доходность при заданном уровне риска.
Архитектура: что читаем из блокчейна
Web3 провайдеры и агрегаторы данных
Прямые RPC-вызовы к контрактам протоколов — медленно и требуют знания каждого ABI. Агрегаторы упрощают задачу:
- DefiLlama API — TVL, APY для сотен протоколов, бесплатно
- The Graph — GraphQL запросы к субграфам протоколов (Uniswap, Aave, Compound)
- Moralis / Alchemy — балансы кошелька, история транзакций, decoded events
import requests
class DeFiDataProvider:
def get_protocol_yields(self, protocols: list[str]) -> dict:
# DefiLlama yields API
response = requests.get("https://yields.llama.fi/pools")
all_pools = response.json()["data"]
filtered = [
pool for pool in all_pools
if pool["project"] in protocols
and pool["tvlUsd"] > 1_000_000 # минимальный TVL $1M
and pool["apy"] is not None
and pool["apy"] > 0
]
return {pool["pool"]: pool for pool in filtered}
def get_wallet_positions(self, wallet_address: str, chain: str) -> list[dict]:
# Alchemy DeFi positions через Enhanced APIs
response = requests.post(
f"https://{chain}.g.alchemy.com/v2/{ALCHEMY_KEY}",
json={
"id": 1,
"jsonrpc": "2.0",
"method": "alchemy_getTokenBalances",
"params": [wallet_address]
}
)
return response.json()["result"]["tokenBalances"]
The Graph для исторических данных Uniswap v3 позиций:
query GetPositions($owner: String!) {
positions(where: { owner: $owner, liquidity_gt: "0" }) {
id
pool { token0 { symbol } token1 { symbol } feeTier }
liquidity
depositedToken0
depositedToken1
collectedFeesToken0
collectedFeesToken1
}
}
Риски DeFi: что модель должна учитывать
Оптимизация только по APY — ошибка. 100% APY на неизвестном протоколе с TVL $50k и непроверенным контрактом — это почти гарантированный rug pull или эксплойт.
Ключевые риски:
Smart contract risk — уязвимости в коде. Прокси: есть ли audit (Certik, Trail of Bits, OpenZeppelin), когда последний, насколько критичные находки.
Impermanent loss (IL) для AMM-позиций — потеря стоимости по сравнению с простым holding при изменении соотношения цен токенов. Для Uniswap v3 с концентрированной ликвидностью IL может быть очень большим при выходе цены за установленный диапазон.
def calculate_impermanent_loss(price_ratio_change: float) -> float:
"""
price_ratio_change: текущее соотношение цен / начальное
Возвращает IL как долю от держания
"""
k = price_ratio_change
il = 2 * (k**0.5) / (1 + k) - 1
return il # отрицательное число = потеря
При price_ratio_change = 2 (цена одного токена удвоилась) IL ≈ -5.7%. При price_ratio_change = 4 — уже -20%.
Liquidity risk — невозможность выйти из позиции без большого slippage. Для позиций > 1% TVL протокола — проблема.
Oracle manipulation risk — протоколы использующие устаревшие или манипулируемые ценовые оракулы уязвимы к flash loan атакам.
Модель оптимизации портфеля
Классический Modern Portfolio Theory (MPT) адаптируем под DeFi. Задача: найти веса w для каждой позиции, максимизирующие Sharpe Ratio при заданных ограничениях:
import numpy as np
from scipy.optimize import minimize
class DeFiPortfolioOptimizer:
def optimize(
self,
expected_returns: np.ndarray, # APY для каждого протокола
risk_scores: np.ndarray, # risk 0-1 для каждого
correlation_matrix: np.ndarray,
max_protocol_weight: float = 0.40,
max_risk_score: float = 0.60
) -> np.ndarray:
n = len(expected_returns)
def neg_sharpe(weights):
portfolio_return = np.dot(weights, expected_returns)
portfolio_risk = np.dot(weights, risk_scores)
portfolio_vol = np.sqrt(weights @ correlation_matrix @ weights)
sharpe = (portfolio_return - 0.03) / (portfolio_vol + 1e-6)
# Штраф за высокий риск
risk_penalty = max(0, portfolio_risk - max_risk_score) * 10
return -sharpe + risk_penalty
constraints = [
{"type": "eq", "fun": lambda w: np.sum(w) - 1}, # сумма весов = 1
]
bounds = [(0.0, max_protocol_weight)] * n
result = minimize(
neg_sharpe,
x0=np.ones(n) / n,
method="SLSQP",
bounds=bounds,
constraints=constraints
)
return result.x
risk_scores — агрегат из: TVL (больше = ниже риск), audit score, возраст протокола, история эксплойтов. Корреляция между DeFi-протоколами высокая при market-wide событиях (все падают вместе), но ниже в нормальных условиях.
Автоматическая ребалансировка
При изменении условий (APY упал на 20%+, протокол потерял 30% TVL, новый аудит выявил критику) — система предлагает ребалансировку.
Ребалансировка в DeFi — это транзакции с gas fees. Оптимизатор должен учитывать: выгода от перекладки > стоимость газа + slippage.
struct RebalanceProposal {
let currentAllocation: [ProtocolPosition]
let proposedAllocation: [ProtocolPosition]
let estimatedGasCost: Decimal // в USD
let expectedYieldImprovement: Double // APY delta
let breakEvenDays: Int // когда окупится газ
let warnings: [RiskWarning]
}
breakEvenDays = gasCost / (annualYieldImprovement / 365). Если breakEven > 30 дней — ребалансировка нецелесообразна.
Web3 интеграция в мобильном приложении
Для просмотра позиций — только чтение, Web3 провайдер не нужен. Для исполнения транзакций ребалансировки — нужен WalletConnect v2:
import WalletConnectSign
class WalletConnectManager {
func connectWallet() async throws {
let uri = try await Sign.instance.connect(
requiredNamespaces: [
"eip155": ProposalNamespace(
chains: [Blockchain("eip155:1")!],
methods: ["eth_sendTransaction", "eth_sign"],
events: ["accountsChanged", "chainChanged"]
)
]
)
// Показываем QR-код или deep link для MetaMask/Rainbow/etc
presentWalletConnectURI(uri.absoluteString)
}
}
WalletConnect v2 поддерживается всеми major кошельками (MetaMask, Rainbow, Coinbase Wallet). Приватные ключи никогда не покидают кошелёк пользователя.
Мониторинг позиций в реальном времени
Push-уведомления при важных событиях:
- APY снизился на 15%+ → предложение ребалансировки
- TVL протокола упал на 30% за 24ч → risk alert
- Позиция в Uniswap v3 вышла за диапазон (out-of-range) → IL активируется
Мониторинг через WebSocket к Alchemy (eth_subscribe на события нужных контрактов) или через scheduled Jobs на сервере с polling.
Процесс работы
Определение поддерживаемых протоколов и цепей. Разработка data pipeline (DefiLlama, The Graph, on-chain). Модель скоринга рисков протоколов. Оптимизатор портфеля с ограничениями. WalletConnect интеграция для мобиля. UI: текущие позиции, предложения ребалансировки, мониторинг рисков.
Ориентиры по срокам
Read-only дашборд с текущими позициями и базовым scoring — 2–3 недели. Полная система с оптимизатором, автоматическими алертами и WalletConnect интеграцией — 4–8 недель.







