Розроблення системи контролю експозиції
Експозиція — сукупна ринкова експозиція портфеля: на яку суму відкриті позиції відносно капіталу. Контроль експозиції запобігає перегрузці портфеля в одному напрямку, одному активі або одному секторі.
Типи експозиції
Брутто експозиція: сума абсолютних значень усіх позицій / капітал. При лонге $60k та шорте $40k: брутто = $100k.
Нетто експозиція: (лонги − шорти) / капітал. Чистий ринковий напрямок. Нейтральний портфель: нетто = 0%.
Експозиція сектора: сукупна позиція в одному секторі (DeFi, Layer-1, memes, stablecoins).
Експозиція окремого активу: частка одного активу в портфелі.
Система лімітів
@dataclass
class ExposureLimits:
max_gross_exposure: float = 2.0 # 200% (з плечем)
max_net_exposure: float = 0.80 # 80% нетто в одну сторону
max_single_asset: float = 0.20 # 20% в одному активі
max_sector: float = 0.40 # 40% в одному секторі
max_correlated_group: float = 0.35 # 35% в висококорельованих активах
class ExposureController:
def __init__(self, limits: ExposureLimits, sector_map: dict):
self.limits = limits
self.sector_map = sector_map # символ -> сектор
def check_new_position(self, new_position, current_positions, capital):
violations = []
# Розраховуємо експозицію після добавлення нової позиції
all_positions = current_positions + [new_position]
gross = sum(abs(p.value) for p in all_positions) / capital
if gross > self.limits.max_gross_exposure:
violations.append(f"Gross exposure {gross:.0%} > limit {self.limits.max_gross_exposure:.0%}")
net = sum(p.value for p in all_positions) / capital # + для лонга, - для шорта
if abs(net) > self.limits.max_net_exposure:
violations.append(f"Net exposure {net:.0%} > limit")
# Перевірка окремого активу
asset_exposure = sum(
abs(p.value) for p in all_positions
if p.symbol == new_position.symbol
) / capital
if asset_exposure > self.limits.max_single_asset:
violations.append(f"Single asset {new_position.symbol}: {asset_exposure:.0%}")
# Перевірка сектора
sector = self.sector_map.get(new_position.symbol, 'other')
sector_exposure = sum(
abs(p.value) for p in all_positions
if self.sector_map.get(p.symbol) == sector
) / capital
if sector_exposure > self.limits.max_sector:
violations.append(f"Sector {sector}: {sector_exposure:.0%}")
return len(violations) == 0, violations
Моніторинг у реальному часі
Експозиція пересчитується при кожній зміні позиції або значній зміні ціни (>2%). Панель приладів показує:
- Поточну брутто/нетто експозицію
- Розбивку за секторами (діаграма круга)
- Top-5 найбільших позицій
- Тренд експозиції за останні 24 години
Моніторинг дельта-нейтралу
Для стратегій з використанням spot + futures (хеджування):
Дельта портфеля = нетто експозиція в USD. При хеджуванні повинна бути близька до 0. Моніторинг коефіцієнта хеджування: при зміні ціни коефіцієнт хеджування зміщується, потрібна ребалансування.
Інтегруємо контроль експозиції як проміжне ПЗ перед кожним ордером — перевірка перед виконанням. Панель приладів у реальному часі + сигналізація Telegram при наближенні до лімітів.







