Розробка системи VAR (Value at Risk) для криптопортфелю

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Розробка системи VAR (Value at Risk) для криптопортфелю
Складний
~5 днів
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1288
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1122
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    589
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    859

Розроблення системи VaR (Value at Risk) для крипто-портфеля

Value at Risk (VaR) — статистична оцінка максимального збитку портфеля за певний часовий горизонт з заданою ймовірністю. «VaR 95% на 1 день = $5,000» означає: з ймовірністю 95% однодневний збиток не перевищить $5,000 (і з ймовірністю 5% перевищить).

Методи розрахунку VaR

Historical Simulation VaR — найпоширеніший та найінтуїтивніший:

import numpy as np
import pandas as pd
from scipy import stats

class HistoricalVaR:
    def __init__(self, confidence_level=0.95, lookback_days=252):
        self.confidence = confidence_level
        self.lookback = lookback_days
    
    def calculate(self, portfolio_value, positions, price_history):
        """
        portfolio_value: поточна вартість портфеля
        positions: {symbol: qty}
        price_history: DataFrame з цінами за lookback_days
        """
        # Розраховуємо історичні повернення портфеля
        portfolio_returns = []
        for i in range(1, len(price_history)):
            daily_pnl = 0
            for symbol, qty in positions.items():
                if symbol in price_history.columns:
                    prev_price = price_history[symbol].iloc[i-1]
                    curr_price = price_history[symbol].iloc[i]
                    daily_pnl += qty * (curr_price - prev_price)
            portfolio_returns.append(daily_pnl / portfolio_value)
        
        portfolio_returns = np.array(portfolio_returns)
        
        # VaR = перцентиль збитків
        var_pct = np.percentile(portfolio_returns, (1 - self.confidence) * 100)
        var_usd = abs(var_pct) * portfolio_value
        
        return {
            'var_pct': var_pct,
            'var_usd': var_usd,
            'confidence': self.confidence,
            'horizon_days': 1
        }

Параметричний (Variance-Covariance) VaR:

def parametric_var(positions, prices, cov_matrix, confidence=0.95, horizon=1):
    weights = np.array([positions[s] * prices[s] for s in positions.keys()])
    portfolio_value = weights.sum()
    weights_pct = weights / portfolio_value
    
    # Дисперсія портфеля
    portfolio_variance = weights_pct @ cov_matrix @ weights_pct
    portfolio_std = np.sqrt(portfolio_variance * horizon)
    
    # Нормальний розподіл: z-score для рівня довіри
    z_score = stats.norm.ppf(1 - confidence)
    var_pct = z_score * portfolio_std
    var_usd = abs(var_pct) * portfolio_value
    
    return var_usd

Monte Carlo VaR — найточніший для крипто-портфелів (враховує fat tails):

def monte_carlo_var(portfolio_value, returns_history, n_simulations=10000, 
                    confidence=0.95, horizon=1):
    mean = returns_history.mean()
    std = returns_history.std()
    
    # Симулюємо N сценаріїв
    simulated_returns = np.random.normal(mean, std, (n_simulations, horizon))
    simulated_pnl = portfolio_value * simulated_returns.sum(axis=1)
    
    var = np.percentile(simulated_pnl, (1 - confidence) * 100)
    return abs(var)

CVaR (Conditional Value at Risk / Expected Shortfall)

CVaR — середній збиток у найгірших (1 - confidence)% сценаріїв. Краще за VaR для описання хвостового ризику:

def calculate_cvar(returns, portfolio_value, confidence=0.95):
    var_threshold = np.percentile(returns, (1 - confidence) * 100)
    tail_returns = returns[returns <= var_threshold]
    cvar_pct = tail_returns.mean()
    return abs(cvar_pct) * portfolio_value

Проблема Fat Tails у крипто

Крипто-ринок має значно більш важкі «хвости» розподілу повернень порівняно з нормальним розподілом. Параметричний VaR на основі нормального розподілу значно недооцінює ризик.

Розв'язання:

Student's t-distribution: краще описує fat tails. Додаємо параметр degrees of freedom:

from scipy.stats import t

def t_distribution_var(mean, std, df, confidence=0.95):
    t_score = t.ppf(1 - confidence, df)
    return abs(mean + std * t_score)

Історичний розподіл + EVT (Extreme Value Theory): для хвостів використовуємо узагальнене розподіл Парето.

GARCH-VaR: враховує кластеризацію волатильності — високовелика волатильність слідує за високовеликою волатильністю.

Бектестування VaR (Kupiec Test)

Перевіряємо: як часто реальні збитки перевищували передбачений VaR?

def kupiec_test(var_predictions, actual_returns, confidence=0.95):
    """
    Якщо VaR 95% — порушення повинні виникати у 5% випадків
    """
    violations = actual_returns < -var_predictions
    n_violations = violations.sum()
    n_total = len(actual_returns)
    expected_violations = n_total * (1 - confidence)
    
    # Біноміальний тест
    p_value = stats.binom_test(n_violations, n_total, 1 - confidence)
    
    return {
        'n_violations': n_violations,
        'expected_violations': expected_violations,
        'violation_rate': n_violations / n_total,
        'p_value': p_value,
        'model_valid': p_value > 0.05
    }

VaR на кількох горизонтах

VaR масштабується з горизонтом за квадратним корінь часу (для нормального розподілу):

VaR(n днів) = VaR(1 день) × √n

Для крипто-портфеля розраховуємо VaR для кількох горизонтів:

Горизонт Застосування
1 день Щоденний моніторинг ризику
7 днів Тижневий звіт
30 днів Стрес-тестування

Компонентний VaR

Маржинальний VaR: внесок кожної позиції у сукупний VaR портфеля. Визначає позиції, які додають найбільше ризику.

def component_var(positions, cov_matrix, portfolio_var):
    """Внесок кожної позиції у загальний VaR"""
    weights = np.array(list(positions.values()))
    weights_pct = weights / weights.sum()
    
    # Маржинальний внесок
    marginal = cov_matrix @ weights_pct / portfolio_var
    component = weights_pct * marginal
    
    return dict(zip(positions.keys(), component))

Панель приладів та звітність

Моніторинг VaR у реальному часі: пересчет при кожній зміні позиції або щотижня з кочуванням коваріаційною матрицею.

Щоденний звіт VaR:

  • Поточний 1-денний VaR (95% та 99%)
  • CVaR (Expected Shortfall)
  • Розбивка VaR за активами
  • Бектестування: порушення за останні 30 днів

Сигналізація: якщо поточний VaR перевищує ліміт (наприклад, VaR 99% > 5% капіталу) → сигналізація Telegram.

Розробляємо систему VaR з історичним, параметричним та Monte Carlo методами, коригуванням fat-tail, модулем бектестування (Kupiec test) та щоденною звітністю.