Введение

Когда утренние новости пугают биржевыми скачками, а аналитики спорят о судьбе энергоносителей, разработчики и дата-саентисты открывают не терминал новостей, а Jupyter Notebook. (Хотя признайтесь, первые три часа вы просто пытаетесь победить ошибку ModuleNotFoundError в свежесклонированном репозитории). В эпоху, когда алгоритмический трейдинг и логистические цепочки зависят от стабильности узких морских горловин, цена ошибки в прогнозе измеряется миллиардами долларов. Представьте, что вы пишете бэкенд для крупного сырьевого фонда, и вам нужно просчитать риски «черного лебедя» до того, как об этом напишет Bloomberg. Ормузский пролив — это кровеносная система мировой экономики и критическая точка на карте глобальной энергетической логистики. Соединяя Персидский залив с Оманским заливом, этот коридор шириной всего около 33 километров пропускает через себя примерно пятую часть всей потребляемой в мире нефти. Любые геополитические потрясения в регионе мгновенно отзываются скачками цен на сырье от Токио до Нью-Йорка.

Как дата-саентисты и инженеры данных, мы привыкли полагаться не на алармистские заголовки в СМИ, а на аналитику и симуляции. Что произойдет, если этот морской путь окажется полностью заблокирован? Сколько дней продержится глобальная экономика до исчерпания стратегических резервов, учитывая, что каждая неделя блокады создает дефицит примерно в 100 млн баррелей? Чтобы ответить на эти вопросы, я написал комплексную имитационную модель на Python, используя реальные исторические данные по танкерному трафику, пропускной способности трубопроводов и объемам мировой добычи.

В этой статье мы разберем архитектуру симулятора, изучим источники данных, посмотрим на код и проанализируем шокирующие результаты, которые показывает модель при сценариях полного закрытия пролива на 30, 60 и 90 дней.

Сбор данных и подготовка датасета

Любая надежная симуляция начинается с качественных данных. Для построения модели потребовалось объединить статистические отчеты Управления энергетической информации США (EIA), трекинговую информацию о движении супертанкеров (VLCC — Very Large Crude Carriers), а также экспертные оценки Фонда национальной энергетической безопасности.

Мы выделили четыре ключевых массива данных:

  • Суточный объем транзита: Через пролив проходит около 20.5–21 миллиона баррелей нефти и конденсата в сутки, а также значительные объемы СПГ.
  • Экспортеры и импортеры: Основной объем отправляют страны Персидского залива (Саудовская Аравия, Ирак, ОАЭ, Кувейт, Иран, Катар), а главные потребители — страны АТР (Китай, Индия, Япония, Южная Корея).
  • Альтернативная инфраструктура: Обходные нефтепроводы (East-West Pipeline в Саудовской Аравии, Habshan–Fujairah в ОАЭ), способные частично компенсировать выпавшие объемы.
  • Мировые запасы: Коммерческие и стратегические резервы стран ОЭСР и крупнейших независимых экономик.

Для загрузки и первичной обработки данных мы использовали стек pandas и numpy. Ниже представлен базовый фрагмент кода, инициализирующий структуру данных для симулятора (и да, код написан так, чтобы не падать с KeyError при первом удобном случае):

import numpy as np
import pandas as pd

class HormuzSimulator:
    def __init__(self, daily_volume_mln_bbl=20.5, strategic_reserves_mln_bbl=1500):
        self.daily_volume = daily_volume_mln_bbl
        self.reserves = strategic_reserves_mln_bbl
        self.bypass_capacity = 6.5  // суммарная пропускная способность обходных труб
        
    def simulate_blockade(self, days):
        deficit_history = []
        current_reserves = self.reserves
        
        for day in range(1, days + 1):
            unmet_demand = (self.daily_volume - self.bypass_capacity)
            current_reserves -= unmet_demand
            deficit_history.append({
                'day': day,
                'unmet_demand_mln_bbl': unmet_demand,
                'remaining_reserves': max(0, current_reserves)
            })
            
        return pd.DataFrame(deficit_history)

// Инициали