AI-оптимізація DeFi портфеля в мобільних додатках
DeFi портфель складається з позицій у кількох протоколах: ліквідність у Uniswap v3, стейкинг у Lido, кредитування у Aave, yield farming у Convex. Кожна позиція забезпечує відмінні повернення, ризики та умови. Оптимізація знаходить розподіл активів, який максимізує повернення за заданого рівня ризику.
Архітектура: читання з блокчейна
Web3 провайдери та агрегатори даних
Прямі RPC-виклики до контрактів протоколів повільні та вимагають знання кожного ABI. Агрегатори спрощують процес:
- DefiLlama API — TVL, APY для сотень протоколів, безплатно
- The Graph — GraphQL запити до підграфів протоколів (Uniswap, Aave, Compound)
- Moralis / Alchemy — залишки гаманця, історія транзакцій, розшифровані події
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 позиції через 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 або експлойтом.
Ключові ризики:
Ризик смарт-контракту — уразливості коду. Індикатори: наявність аудиту (Certik, Trail of Bits, OpenZeppelin), свіжість аудиту, серйозність знайдених проблем.
Impermanent loss (IL) у AMM позиціях — втрата вартості порівняно з простим утриманням, коли змінюються співвідношення цін токенів. Для 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, IL ≈ -20%.
Ризик ліквідності — неможливість виходу з позицій без значного проковзування. Позиції > 1% TVL протоколу стикаються з цією проблемою.
Ризик маніпуляції оракулом — протоколи, що використовують застарілі або маніпульовані цінові оракули, вразливі до 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, # ризик 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 (вище = нижчий ризик), оцінку аудиту, вік протоколу, історію експлойтів. Кореляція між DeFi протоколами висока під час подій на рівні ринку (всі падають разом), але нижча в нормальних умовах.
Автоматична ребалансування
Коли умови змінюються (APY падає на 20%+, протокол втрачає 30% TVL, новий аудит знаходить критичні проблеми), система пропонує ребалансування.
Ребалансування в DeFi супроводжується комісіями за газ та проковзуванням. Оптимізатор повинен перевірити: вигода від перерозподілу > вартість газу + проковзування.
struct RebalanceProposal {
let currentAllocation: [ProtocolPosition]
let proposedAllocation: [ProtocolPosition]
let estimatedGasCost: Decimal // у USD
let expectedYieldImprovement: Double // APY дельта
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/тощо
presentWalletConnectURI(uri.absoluteString)
}
}
WalletConnect v2 підтримується всіма основними гаманцями (MetaMask, Rainbow, Coinbase Wallet). Приватні ключі ніколи не залишають гаманець користувача.
Моніторинг позицій у реальному часі
Push-сповіщення для важливих подій:
- APY падає на 15%+ → пропозиція ребалансування
- TVL протоколу падає на 30% за 24 години → alert ризику
- Позиція Uniswap v3 вийшла з діапазону → IL прискорюється
Моніторьте через WebSocket до Alchemy (eth_subscribe для релевантних подій контракту) або серверні планові завдання з опитуванням.
Огляд процесу
Визначте підтримувані протоколи та ланцюги. Побудуйте дата-конвеєр (DefiLlama, The Graph, on-chain). Розробіть модель скорингу ризиків протоколів. Побудуйте оптимізатор портфеля з обмеженнями. Інтегруйте WalletConnect для мобіля. UI: відображайте поточні позиції, пропозиції ребалансування, моніторинг ризиків.
Оцінки часових рамок
Дашборд тільки для читання з поточними позиціями та базовим скорингом: 2–3 тижні. Повна система з оптимізатором, автоматичними alertами та WalletConnect інтеграцією: 4–8 тижнів.







