Разработка системы контроля exposure
Exposure — совокупная рыночная экспозиция портфеля: на какую сумму открыты позиции относительно капитала. Контроль exposure предотвращает перегрузку портфеля в одном направлении, одном активе или одном секторе.
Виды exposure
Gross exposure: сумма абсолютных значений всех позиций / капитал. При лонге $60k и шорте $40k: gross = $100k.
Net exposure: (лонги − шорты) / капитал. Чистая рыночная направленность. Нейтральный портфель: net = 0%.
Sector exposure: суммарная позиция в одном секторе (DeFi, Layer-1, memes, stablecoins).
Single asset exposure: доля одного актива в портфеле.
Система лимитов
@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 # symbol -> sector
def check_new_position(self, new_position, current_positions, capital):
violations = []
# Расчёт exposure после добавления новой позиции
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 # + for long, - for short
if abs(net) > self.limits.max_net_exposure:
violations.append(f"Net exposure {net:.0%} > limit")
# Single asset check
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 check
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
Реальное время мониторинг
Exposure пересчитывается при каждом изменении позиции или значительном изменении цен (>2%). Dashboard отображает:
- Текущий gross/net exposure
- Breakdown по секторам (pie chart)
- Топ-5 по размеру позиций
- Exposure trend за последние 24h
Delta-нейтральный мониторинг
Для стратегий, использующих spot + futures (hedge):
Portfolio delta = net экспозиция в USD. При хеджировании должна быть близка к 0. Hedge ratio monitoring: при изменении цены hedge ratio смещается, нужна ребалансировка.
Систему контроля exposure интегрируем как middleware перед каждым ордером — проверка до исполнения. Realtime dashboard + Telegram алерты при приближении к лимитам.







