Эффективность хеджирования измеряется не столько доходностью, сколько степенью снижения риска. Портфель может показывать нулевую или отрицательную доходность, но если волатильность снизилась на 70%, хедж работает. Задача алгоритмов оценки — количественно определить, насколько инструмент защиты выполняет свою функцию и оправдывает затраты на его поддержание.
Метрики эффективности хеджирования
Классические портфельные метрики (коэффициент Шарпа, максимальная просадка) не учитывают специфику хеджирования: цель не максимизация прибыли, а минимизация убытков при неблагоприятных сценариях. Для оценки хеджей применяются специализированные подходы: анализ коэффициента хеджирования (hedge ratio), тестирование на коинтеграцию, измерение базисного риска, сравнение VaR с хеджем и без. Эти методы позволяют выбрать оптимальный инструмент защиты и настроить параметры ребалансировки.
Hedge Ratio и динамическая корректировка
Коэффициент хеджирования Hedge ratio показывает пропорцию хеджирующего инструмента к защищаемой позиции. Классический расчет через OLS-регрессию доходностей делается следующим образом:
h = Cov(Rₛ, Rₕ) / Var(Rₕ)
где:
- Rₛ — доходность защищаемого актива;
- Rₕ — доходность хеджирующего инструмента;
- h — оптимальный hedge ratio.
Формула определяет количество единиц хеджа на единицу базового актива для минимизации дисперсии портфеля. Это хорошо интерпретируемая метрика, однако у нее есть некоторые ограничения.
Статический коэффициент хеджирования предполагает постоянную корреляцию между активами, что редко выполняется на практике. Корреляция меняется в зависимости от рыночного режима: в кризисы активы, считавшиеся некоррелированными, начинают двигаться синхронно.
Для учета изменения взаимосвязей применяют расчет динамического hedge ratio. Есть несколько подходов к его расчету:
- Через регрессию в скользящем окне (rolling window regression), окном в 60-252 дня;
- Через экспоненциально взвешенную регрессию, придающую больший вес недавним наблюдениям;
- Через фильтр Калмана для адаптивной оценки.
Частота пересчета зависит от волатильности: для валютных хеджей ежедневно, для товарных фьючерсов еженедельно.
Ошибка в расчетах коэффициента хеджирования приводит к переизбытку или недостатку защиты:
- Оверхедж (Over-hedging) увеличивает транзакционные издержки и ограничивает потенциал роста прибыли;
- Андерхедж (Under-hedging) оставляет портфель уязвимым к неблагоприятным движениям.
Оптимальность проверяется через дисперсию хеджированного портфеля: чем ниже, тем эффективнее подобрано соотношение.
Эффективность хеджирования (Hedge Effectiveness)
Метрика Hedge Effectiveness измеряет процент устраненного риска относительно исходной позиции. Рассчитывается по формуле:
HE = 1 — (Var(Rph) / Var(Rpu))
где:
- Var(Rph) — дисперсия доходности хеджированного портфеля;
- Var(Rpu) — дисперсия доходности незащищенного портфеля;
- HE — hedge effectiveness в диапазоне [0, 1].
Интерпретация:
- Если HE=1, то хедж полностью устраняет риск (идеальное хеджирование);
- Если HE=0, то хедж не снижает риск вовсе;
- Если HE<0, то хедж ухудшает риск-профиль (добавляет волатильность).
То есть, проще говоря, значение 0.85 означает устранение 85% риска. Коэффициент эффективности хеджирования выше 0.7 считается приемлемым для большинства стратегий, выше 0.9 — отличным результатом.
Данная метрика так же хорошо интерпретируема, однако не учитывает стоимость хеджирования, поэтому используется совместно с анализом затрат.
Для проверки стабильности коэффициента эффективности хеджирования применяется тестирование на отложенной выборке. Разделение данных: 70% для калибровки hedge ratio, 30% для проверки работоспособности на новых данных. Если на тестовой выборке эффективность хеджа падает более чем на 15-20%, стратегия нестабильна и требует пересмотра инструмента или параметров.
Альтернативный способ оценки — проведение анализа по подпериодам с разной волатильностью. Эффективное хеджирование должно демонстрировать наилучшие результаты в периоды повышенной турбулентности рынка, когда защита капитала особенно важна. Если значение метрики снижается именно в кризисные периоды, это сигнал к пересмотру стратегии хеджирования.
Базисный риск (Basis Risk)
Базис — это разница между ценой спот-актива и ценой хеджирующего инструмента. Для фьючерсного хеджа:
Basis = Sₜ — Fₜ
где:
- Sₜ — спот-цена актива в момент t;
- Fₜ — цена фьючерса в момент t.
Идеальное хеджирование предполагает, что базис сходится к нулю по мере истечения срока действия фьючерсного контракта. На практике это условие редко выполняется: базис подвержен колебаниям под влиянием сезонности, затрат на хранение и транспортировку, а также особенностей поставки. Именно эта изменчивость формирует остаточный риск хеджированной позиции.
Базисный риск обычно измеряется стандартным отклонением базиса за рассматриваемый период. Для товарных фьючерсов типичные значения составляют: нефть — 2–5%, сельскохозяйственные культуры — 5–10%, металлы — 1–3%. Чем выше волатильность базиса, тем менее предсказуем становится итоговый эффект хеджирования.
Временная структура базисов также оказывает существенное влияние на выбор фьючерсного контракта:
- В условиях contango (когда фьючерсная цена выше спот-цены) длинная позиция во фьючерсах несет убытки при каждом роллировании, так как новые контракты приобретаются дороже текущего уровня рынка;
- Напротив, при backwardation (спот дороже фьючерса) роллирование формирует положительный carry, что повышает доходность позиции. Учет этих эффектов особенно важен при хеджировании на длительном горизонте.
Снижение basis risk достигается выбором контракта с максимальной корреляцией к базовому активу, использованием кросс-хеджей только при отсутствии прямых инструментов, роллированием позиций за 5-10 дней до экспирации для избежания скачков ликвидности. Мониторинг исторической динамики базисов помогает предсказать периоды повышенного риска.
Статистические методы оценки
Коинтеграция и парный трейдинг
Коинтеграция показывает наличие долгосрочной равновесной связи между активами. Два актива коинтегрированы, если их линейная комбинация стационарна, даже если сами ряды нестационарны. Это ключевое условие для устойчивого хеджирования: кратковременные отклонения цен от равновесия затухают, возвращая портфель к целевому профилю риска.
Тест Энгла-Грейнджера проверяет коинтеграцию в два этапа:
- OLS-регрессия одного актива на другой для получения остатков;
- ADF-тест остатков на стационарность. Если p-value < 0.05, ряды коинтегрированы и подходят для хеджирования.
import yfinance as yf
import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller, coint
import matplotlib.pyplot as plt
pd.set_option('display.expand_frame_repr', False)
# Загружаем котировки Exxon Mobil и Chevron
start_date = '2023-09-30'
end_date = '2025-09-30'
xom_data = yf.download('XOM', start=start_date, end=end_date)
cvx_data = yf.download('CVX', start=start_date, end=end_date)
xom = xom_data['Close']
cvx = cvx_data['Close']
# Объединяем данные в один датафрейм
prices = pd.concat([xom, cvx], axis=1) # объединяем по датам
prices.columns = ['XOM', 'CVX']
prices = prices.dropna() # удаляем пропуски, если есть
print(prices.head())
# Тест на коинтеграцию
score, pvalue, _ = coint(prices['XOM'], prices['CVX']) # тест Юхана
print(f'Cointegration p-value: {pvalue:.4f}')
if pvalue > 0.05:
print("Высокий p-value — возможно, пара не коинтегрирована.\n")
# Расчет hedge ratio через OLS с константой
X = sm.add_constant(prices['CVX']) # добавляем константу для интерсепта
model = sm.OLS(prices['XOM'], X).fit()
intercept = model.params['const'] # интерсепт
hedge_ratio = model.params['CVX'] # коэффициент хеджирования β
# Расчет спреда и тест на стационарность
spread = prices['XOM'] - (intercept + hedge_ratio * prices['CVX']) # спред
adf_result = adfuller(spread) # тест Дики-Фуллера
# adf_result[0] — статистика, adf_result[1] — p-value
# Доходности и эффективность хеджирования
returns_xom = prices['XOM'].pct_change().dropna() # доходности XOM
returns_cvx = prices['CVX'].pct_change().dropna() # доходности CVX
hedged_returns = returns_xom - hedge_ratio * returns_cvx # доходность хеджированной позиции
# Дисперсии для вычисления Hedge Effectiveness
unhedged_var = returns_xom.var() # дисперсия без хеджа
hedged_var = hedged_returns.var() # дисперсия с хеджем
effectiveness = 1 - hedged_var / unhedged_var # эффективность хеджа
# Вывод результатов
print(f'Hedge ratio: {hedge_ratio:.4f}, Intercept: {intercept:.4f}')
print(f'ADF statistic: {adf_result[0]:.4f}, p-value: {adf_result[1]:.4f}')
print(f'Hedge Effectiveness: {effectiveness:.2%}')
# Визуализация спреда
plt.figure(figsize=(12,6))
plt.plot(spread, color='black', label='Spread (XOM - β·CVX)') # спред
plt.axhline(spread.mean(), color='gray', linestyle='--') # среднее
plt.axhline(spread.mean()+2*spread.std(), color='red', linestyle=':') # верхняя граница ±2σ
plt.axhline(spread.mean()-2*spread.std(), color='red', linestyle=':') # нижняя граница ±2σ
plt.legend()
plt.title('Spread and ±2σ bands')
plt.show()
Date XOM CVX
2023-10-02 107.814774 152.691666
2023-10-03 108.001266 153.049255
2023-10-04 103.963928 149.482727
2023-10-05 101.623566 150.271194
2023-10-06 99.926567 148.740067
Cointegration p-value: 0.5313
Высокий p-value — возможно, пара не коинтегрирована.
Hedge ratio: 0.5161, Intercept: 32.1354
ADF statistic: -1.9927, p-value: 0.2898
Hedge Effectiveness: 57.72%

Рис. 1: Визуализация спреда между активами в пределах 2-х сигм. Наблюдается закономерность возврата к среднему (пунктирная линия), выход за пределы 2-х сигм (красная линия) был только дважды за последние два года
Данный код выполняет анализ парного хеджирования для акций ExxonMobil (XOM) и Chevron (CVX):
- Сначала загружаются исторические цены закрытия за выбранный период, после чего данные синхронизируются и объединяются в единый датафрейм;
- Далее проводится тест на коинтеграцию, чтобы проверить наличие долгосрочной статистической зависимости между ценами двух активов;
- Если зависимость существует, рассчитывается коэффициент хеджирования (hedge ratio) через регрессию OLS, который показывает, в каком соотношении следует комбинировать активы для минимизации риска;
- На основе этого коэффициента строится спред, проводится тест Дики-Фуллера на стационарность, а также рассчитывается эффективность хеджирования (Hedge Effectiveness) через сравнение дисперсий доходностей защищенной и незашищенной позиции;
- По завершению расчетов строится визуализация спреда с отметками среднего значения и границ ±2σ.
Интерпретация: Пара XOM–CVX показывает положительную эффективность хеджирования (57.7%), что позволяет снизить волатильность портфеля. Однако статистические тесты указывают на слабую коинтеграцию и нестационарность спреда (p-value > 0.05), поэтому эта стратегия не является полностью надежной для долгосрочного парного хеджирования. Она может работать временно, однако риск выхода спреда за пределы нормы остается высоким.
Данный пример кода позволяет количественно оценить эффективность стратегии хеджирования и понять риск остаточного спреда между активами. Расчет Hedge Effectiveness показывает, насколько стратегия реально уменьшает риск, а визуализация спреда с границами ±2σ позволяет наглядно увидеть моменты сильного отклонения и возвращения к среднему.
Фильтр Калмана для расчета динамического коэффициента хеджирования
Фильтр Калмана позволяет динамически адаптировать коэффициент хеджирования в реальном времени при изменении взаимосвязи между активами. Алгоритм рекурсивно обновляет оценки параметров на основе поступающих данных, что особенно важно в периоды структурных сдвигов на рынке.
В отличие от метода скользящего окна, фильтр Калмана использует байесовский подход: текущая оценка формируется как комбинация предыдущего состояния и нового наблюдения с весами, зависящими от их неопределенности.
Модель пространства состояний для hedge ratio рассчитывается по формулам:
βₜ = βₜ₋₁ + wₜ
yₜ = βₜ · xₜ + vₜ
где:
- βₜ — hedge ratio в момент t (скрытое состояние);
- yₜ, xₜ — доходности защищаемого актива и хеджа;
- wₜ, vₜ — шум процесса и измерений.
Первое уравнение описывает эволюцию hedge ratio как случайное блуждание. Второе связывает наблюдаемые доходности через текущий коэффициент хеджа. Фильтр Калмана последовательно оценивает βₜ, минимизируя среднеквадратичную ошибку прогноза.
!pip install pykalman --quiet
from pykalman import KalmanFilter
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Загрузка данных: Rio Tinto и BHP
start_date = '2023-09-30'
end_date = '2025-09-30'
rio = yf.download('RIO', start=start_date, end=end_date)['Close']
bhp = yf.download('BHP', start=start_date, end=end_date)['Close']
# Проверка на датафреймы
if isinstance(rio, pd.DataFrame):
rio = rio.iloc[:, 0]
if isinstance(bhp, pd.DataFrame):
bhp = bhp.iloc[:, 0]
# Объединяем данные и рассчитываем доходности
prices = pd.DataFrame({'RIO': rio, 'BHP': bhp}).dropna()
returns = prices.pct_change().dropna()
# Настройка Kalman Filter
# Преобразуем наблюдения в форму (n_timesteps, n_obs_dim, n_state_dim)
obs_matrix = returns['BHP'].values[:, np.newaxis, np.newaxis]
kf = KalmanFilter(
transition_matrices=[1], # модель состояния: hedge ratio меняется медленно
observation_matrices=obs_matrix, # наблюдение: доходность BHP
initial_state_mean=0, # начальное значение hedge ratio
initial_state_covariance=1, # неопределенность начального состояния
observation_covariance=1, # шум измерений
transition_covariance=0.01 # вариабельность hedge ratio
)
# Оценка динамического hedge ratio
state_means, state_covs = kf.filter(returns['RIO'].values)
hedge_ratios = pd.Series(state_means.flatten(), index=returns.index)
# Расчет хеджированных доходностей
hedged_returns = returns['RIO'] - hedge_ratios.shift(1) * returns['BHP']
hedged_returns = hedged_returns.dropna()
# Статический hedge ratio для сравнения
static_ratio = np.cov(returns['RIO'], returns['BHP'])[0, 1] / np.var(returns['BHP'])
static_hedged = returns['RIO'] - static_ratio * returns['BHP']
# Метрики эффективности
# Annualized volatility (%)
unhedged_vol = returns['RIO'].std() * np.sqrt(252) * 100
kalman_vol = hedged_returns.std() * np.sqrt(252) * 100
static_vol = static_hedged.std() * np.sqrt(252) * 100
print(f'Unhedged volatility: {unhedged_vol:.2f}%')
print(f'Kalman hedged volatility: {kalman_vol:.2f}%')
print(f'Static hedged volatility: {static_vol:.2f}%')
print(f'Kalman effectiveness: {(1 - (kalman_vol/unhedged_vol)**2):.2%}')
print(f'Static effectiveness: {(1 - (static_vol/unhedged_vol)**2):.2%}')
# Визуализация
fig, axes = plt.subplots(3, 1, figsize=(12, 10))
# Динамический hedge ratio
axes[0].plot(hedge_ratios.index, hedge_ratios,
label='Kalman Filter', color='black', linewidth=1.5)
axes[0].axhline(static_ratio, color='gray', linestyle='--',
linewidth=1.5, label=f'Static ratio: {static_ratio:.3f}')
axes[0].set_ylabel('Hedge Ratio')
axes[0].legend()
axes[0].grid(alpha=0.3)
# Кумулятивная волатильность
cumvol_unhedged = returns['RIO'].expanding().std() * np.sqrt(252) * 100
cumvol_kalman = hedged_returns.expanding().std() * np.sqrt(252) * 100
cumvol_static = static_hedged.expanding().std() * np.sqrt(252) * 100
axes[1].plot(cumvol_unhedged.index, cumvol_unhedged,
label='Unhedged', color='red', linewidth=1.5)
axes[1].plot(cumvol_kalman.index, cumvol_kalman,
label='Kalman hedged', color='black', linewidth=1.5)
axes[1].plot(cumvol_static.index, cumvol_static,
label='Static hedged', color='gray', linewidth=1.5, linestyle='--')
axes[1].set_ylabel('Annualized Volatility (%)')
axes[1].legend()
axes[1].grid(alpha=0.3)
# Скользящая корреляция
rolling_corr = returns['RIO'].rolling(60).corr(returns['BHP'])
axes[2].plot(rolling_corr.index, rolling_corr, color='black', linewidth=1)
axes[2].set_ylabel('60-day Rolling Correlation')
axes[2].set_xlabel('Date')
axes[2].grid(alpha=0.3)
plt.tight_layout()
plt.show()
Unhedged volatility: 23.79%
Kalman hedged volatility: 21.00%
Static hedged volatility: 10.91%
Kalman effectiveness: 22.06%
Static effectiveness: 78.96%

Рис. 2: Динамическое хеджирование с фильтром Калмана. Верхняя панель: эволюция hedge ratio — Kalman-оценка адаптируется к рыночным условиям, статический ratio остается постоянным. Средняя панель: сравнение адаптивного подхода со статическим хеджем. Нижняя панель: 60-дневная скользящая корреляция между активами демонстрирует нестабильность, обосновывающую применение динамического hedge ratio
Данный код реализует динамическое хеджирование с использованием фильтра Калмана для пары акций горнодобывающих компаний RIO и BHP:
- На основе доходностей этих акций строится Kalman Filter, который рекурсивно оценивает динамический коэффициент хеджирования (hedge ratio), адаптируясь к изменяющейся взаимосвязи между активами;
- Для сравнения рассчитывается также статический hedge ratio через классический метод ковариации;
- Далее вычисляются волатильности для незашищенной позиции, позиции с динамическим Kalman-хеджем и статического хеджа, а также эффективность хеджирования (Hedge Effectiveness);
- В конце код строит три графика: эволюцию hedge ratio, кумулятивную волатильность и 60-дневную скользящую корреляцию между активами, что позволяет визуально оценить работу стратегии.
Результаты показывают, что динамический Kalman-hedge снижает волатильность RIO с 23.79% до 21.00%, что подтверждает его способность адаптироваться к изменениям на рынке. Статический хедж оказался более эффективным в данном периоде (волатильность снизилась до 10.91%, эффективность 78.96%), что объясняется устойчивой долгосрочной взаимосвязью между активами в рассматриваемый период.
Динамическое хеджирование с фильтром Калмана полезно в ситуациях, когда рыночные условия быстро меняются, например при структурных сдвигах, изменении цен на сырье или нестабильной макроэкономической среде. Даже если в конкретный период статический хедж оказался эффективнее, фильтр Калмана обеспечивает гибкость и адаптивность стратегии, снижая риск при неожиданных изменениях взаимосвязи между активами.
Регрессия в скользящем окне (Rolling Window regression)
Rolling Window оценивает hedge ratio на скользящем окне фиксированной длины, регулярно обновляя параметры по мере поступления новых данных. Этот подход проще в реализации и интерпретации по сравнению с Kalman Filter и хорошо работает при плавных изменениях корреляции между активами, когда отсутствуют резкие структурные сдвиги на рынке.
Выбор длины окна определяет баланс между чувствительностью и стабильностью:
- Короткое окно (20-40 дней) быстро реагирует на изменения, но создает шум в оценках hedge ratio;
- Длинное окно (180-252 дня) дает стабильные оценки, но запаздывает при структурных изменениях рынка.
По моему опыту для большинства задач оптимально выбирать окно в диапазоне 60-120 дней.
Экспоненциально взвешенная регрессия (EWMA) придает больший вес более свежим наблюдениям, не отбрасывая при этом старые данные полностью. Параметр decay задает скорость «забывания» информации и обычно выбирается в диапазоне 0.94–0.97 для ежедневных рядов. Такой подход объединяет адаптивность коротких окон с устойчивостью длинных, обеспечивая более плавные и стабильные оценки hedge ratio при изменении рыночных условий.
Интересно отметить, что эффективность выбранного подхода к хеджу сильно зависит от рыночных режимов:
- В трендовых рынках все подходы (статический хедж, Rolling Window и Kalman Filter) демонстрируют схожие результаты, так как корреляция между активами стабильна;
- В периоды высокой волатильности динамические методы, такие как Kalman Filter и короткие скользящие окна, показывают преимущество, быстро адаптируясь к изменениям взаимосвязи и снижая риск;
- При боковом движении рынка, напротив, длинные окна или EWMA обеспечивают более стабильные hedge ratio, сокращая число корректировок и, соответственно, транзакционные издержки.
Таким образом, выбор подхода должен учитывать текущий рыночный режим, балансируя между адаптивностью и стабильностью.
Риск-ориентированные подходы
Value-at-Risk (VaR) hedged vs unhedged
VaR измеряет максимальный ожидаемый убыток за период при заданном уровне доверия. Сравнение VaR хеджированного и незащищенного портфеля количественно показывает эффект защиты в денежном выражении. Для оценки хеджа используется VaR(95%) или VaR(99%) с горизонтом 1-10 дней в зависимости от ликвидности позиции.
Параметрический VaR предполагает нормальное распределение доходностей:
VaR = μ — z · σ · √t
где:
- μ — ожидаемая доходность портфеля;
- z — квантиль стандартного нормального распределения (1.65 для 95%, 2.33 для 99%);
- σ — волатильность дневных доходностей;
- t — горизонт в днях.
Формула работает для небольших изменений и умеренной волатильности. В периоды стресса распределение имеет тяжелые хвосты, параметрический VaR недооценивает риск. Альтернатива — исторический VaR через квантили эмпирического распределения, либо симуляции Монте-Карло с учетом нелинейностей.
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# Загрузка данных: EUR/USD спот и фьючерс
start_date = '2023-09-30'
end_date = '2025-09-30'
# FXE - ETF на EUR/USD
fxe = yf.download('FXE', start=start_date, end=end_date)['Close']
if isinstance(fxe, pd.DataFrame):
fxe = fxe.iloc[:, 0]
returns = fxe.pct_change().dropna()
# Параметры портфеля
position_size = 1_000_000 # USD
confidence_level = 0.95
z_score = stats.norm.ppf(1 - confidence_level)
# Незащищенная позиция
unhedged_var = position_size * z_score * returns.std()
print(f'Unhedged VaR(95%): ${abs(unhedged_var):,.0f}')
# Хеджированная позиция (простой хедж с ratio=1)
# Предполагаем hedge через фьючерс с корреляцией 0.98
hedge_correlation = 0.98
hedged_vol = returns.std() * np.sqrt(1 - hedge_correlation**2)
hedged_var = position_size * z_score * hedged_vol
print(f'Hedged VaR(95%): ${abs(hedged_var):,.0f}')
print(f'VaR reduction: ${abs(unhedged_var - hedged_var):,.0f} ({(1-hedged_vol/returns.std()):.1%})')
# Исторический VaR для сравнения
historical_var_unhedged = position_size * np.percentile(returns, (1-confidence_level)*100)
print(f'\nHistorical VaR(95%) unhedged: ${abs(historical_var_unhedged):,.0f}')
# Monte Carlo VaR (10000 симуляций)
n_simulations = 10000
simulated_returns = np.random.normal(returns.mean(), returns.std(), n_simulations)
mc_var_unhedged = position_size * np.percentile(simulated_returns, (1-confidence_level)*100)
print(f'Monte Carlo VaR(95%) unhedged: ${abs(mc_var_unhedged):,.0f}')
# Визуализация распределения доходностей
fig, axes = plt.subplots(2, 1, figsize=(12, 8))
# Гистограмма с VaR
axes[0].hist(returns * position_size, bins=50, color='gray',
alpha=0.7, edgecolor='black', linewidth=0.5)
axes[0].axvline(unhedged_var, color='red', linestyle='--',
linewidth=2, label=f'VaR(95%): ${abs(unhedged_var):,.0f}')
axes[0].axvline(hedged_var, color='black', linestyle='--',
linewidth=2, label=f'Hedged VaR: ${abs(hedged_var):,.0f}')
axes[0].set_xlabel('Daily P&L (USD)')
axes[0].set_ylabel('Frequency')
axes[0].legend()
axes[0].grid(alpha=0.3)
# Q-Q plot для проверки нормальности
stats.probplot(returns, dist="norm", plot=axes[1])
axes[1].get_lines()[0].set_color('black')
axes[1].get_lines()[0].set_markersize(3)
axes[1].get_lines()[1].set_color('red')
axes[1].set_title('Q-Q Plot: проверка нормальности распределения')
axes[1].grid(alpha=0.3)
plt.tight_layout()
plt.show()
# Backtesting VaR: подсчет нарушений
violations_unhedged = (returns * position_size < unhedged_var).sum()
expected_violations = len(returns) * (1 - confidence_level)
print(f'\nVaR violations: {violations_unhedged} (expected: {expected_violations:.1f})')
print(f'Violation rate: {violations_unhedged/len(returns):.2%} (expected: {1-confidence_level:.2%})')
Unhedged VaR(95%): $7,678
Hedged VaR(95%): $1,528
VaR reduction: $6,150 (80.1%)
Historical VaR(95%) unhedged: $6,596
Monte Carlo VaR(95%) unhedged: $7,732
VaR violations: 17 (expected: 25.0)
Violation rate: 3.41% (expected: 5.00%)

Рис. 3: Анализ Value-at-Risk для валютной позиции. Верхняя панель: распределение дневной прибыли/убытка с отметками VaR для хеджированной и незащищенной позиции — хедж сдвигает критический уровень убытков ближе к нулю. Нижняя панель: Q-Q plot демонстрирует отклонение эмпирического распределения от нормального в хвостах, что обосновывает использование исторического или Monte Carlo VaR вместо параметрического в периоды стресса
Код рассчитывает VaR для валютной позиции с использованием трех методов: параметрического, исторического и Monte Carlo. Сравнение показывает влияние хеджирования на максимальный ожидаемый убыток. Q-Q plot проверяет предположение о нормальности распределения — важное для корректности параметрического VaR. Бэктестинг подсчитывает фактические нарушения VaR-лимита: если их больше ожидаемых, модель недооценивает риск и требует калибровки.
Интерпретация результатов:
- Незащищенная позиция: VaR(95%) = $7,678 → риск потерь в пределах 95% доверительного уровня достаточно высок;
- Хеджированная позиция: VaR(95%) = $1,528, что показывает снижение риска на 80% при использовании фьючерсного хеджа с высокой корреляцией;
- Historical VaR и Monte Carlo VaR близки к теоретическому, подтверждая корректность расчетов и предположение о нормальности распределения доходностей;
- Q-Q plot показывает, что распределение доходностей FXE близко к нормальному, без сильных выбросов;
- Backtesting: количество нарушений VaR (17 против ожидаемых 25) меньше, чем прогнозировалось, violation rate 3.41% ниже 5%, что говорит о консервативной оценке риска.
Пример выше демонстрирует эффективность валютного хеджа через фьючерс, позволяя снизить риск крупной позиции более чем на 80%. Сравнение нескольких подходов VaR (классический, исторический, Monte Carlo) помогает проверить устойчивость оценки риска и выявить возможные несоответствия.
Условный VaR или Expected Shortfall
Expected Shortfall (ES) оценивает средний убыток в тех случаях, когда потери превышают заданный VaR-порог. В отличие от классического VaR, который ограничивается лишь границей риска, ES учитывает величину потерь в хвосте распределения. Эта метрика особенно важна для анализа наихудших возможных сценариев и используется в рамках Basel III как ключевая мера рыночного риска.
Формула расчета:
ES = E[Loss | Loss > VaR]
ES всегда больше VaR при том же уровне доверия. Для нормального распределения связь аналитическая, для эмпирических данных ES рассчитывается как среднее по наблюдениям за VaR-порогом. Например, VaR(95%) = $50,000, ES(95%) = $67,000 означает, что в 5% худших случаев средний убыток $67,000.
Условный VaR обладает свойством когерентности, показатель корректно учитывает эффект диверсификации и концентрацию хвостовых рисков. Для хеджирующих стратегий ES показывает эффективность защиты в экстремальных сценариях. Хедж может снижать VaR на 60%, но ES только на 40%, если оставляет портфель уязвимым к редким, но катастрофическим событиям. Тестирование на исторических кризисах (2008, 2020, 2022) выявляет такие слабости до их реализации.
Анализ просадок (Drawdown Analysis)
Максимальная просадка (Maximum Drawdown, MDD) измеряет наибольшее падение капитала от локального пика до следующего минимума за рассматриваемый период. Для хеджированных стратегий MDD показывает, насколько эффективно защита сохраняет капитал в длительных стрессовых периодах, когда отдельные дневные VaR-метрики не отражают кумулятивный эффект убытков и накопление риска.
Формула расчета максимальной просадки:
MDD = min((Wₜ — max(W₀:ₜ)) / max(W₀:ₜ))
где:
Wₜ — капитал в момент t;
max(W₀:ₜ) — максимальный капитал до момента t.
Еще один важный показатель — это Drawdown Duration. Это показатель времени, необходимого портфелю для восстановления после достижения локального пика. Он дополняет информацию о максимальной просадке (MDD), показывая не только величину убытка, но и продолжительность стрессового периода.
Например, портфель с MDD 15%, восстановившийся за 2 месяца, может быть предпочтительнее портфеля с MDD 12%, но восстановившегося за 8 месяцев, поскольку короткая просадка снижает психологическое давление на инвестора и уменьшает риск досрочного выхода из позиции. Длительные просадки повышают вероятность ошибок в управлении капиталом, увеличивают финансовый и эмоциональный стресс и могут негативно влиять на стратегическую дисциплину.
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Загрузка данных: портфель акций + SPY для хеджа
start_date = '2023-09-30'
end_date = '2025-09-30'
# Создаем портфель из non-tech акций
portfolio_tickers = ['WMT', 'DUK', 'JNJ']
spy = yf.download('SPY', start=start_date, end=end_date)['Close']
if isinstance(spy, pd.DataFrame):
spy = spy.iloc[:, 0]
portfolio_data = {}
for ticker in portfolio_tickers:
data = yf.download(ticker, start=start_date, end=end_date)['Close']
if isinstance(data, pd.DataFrame):
data = data.iloc[:, 0]
portfolio_data[ticker] = data
portfolio_prices = pd.DataFrame(portfolio_data)
portfolio_prices['SPY'] = spy
portfolio_prices = portfolio_prices.dropna()
# Равновзвешенный портфель
portfolio_returns = portfolio_prices[portfolio_tickers].pct_change().mean(axis=1)
spy_returns = portfolio_prices['SPY'].pct_change()
# Бета портфеля к SPY для hedge ratio
covariance = np.cov(portfolio_returns[1:], spy_returns[1:])[0, 1]
market_variance = np.var(spy_returns[1:])
beta = covariance / market_variance
print(f'Portfolio beta: {beta:.3f}')
# Кумулятивные доходности
cum_returns_unhedged = (1 + portfolio_returns).cumprod()
hedged_returns = portfolio_returns - beta * spy_returns
cum_returns_hedged = (1 + hedged_returns).cumprod()
# Расчет drawdown
def calculate_drawdown(cum_returns):
running_max = cum_returns.expanding().max()
drawdown = (cum_returns - running_max) / running_max
return drawdown
dd_unhedged = calculate_drawdown(cum_returns_unhedged)
dd_hedged = calculate_drawdown(cum_returns_hedged)
# Метрики
max_dd_unhedged = dd_unhedged.min()
max_dd_hedged = dd_hedged.min()
# Длительность просадки
def drawdown_duration(drawdown):
is_dd = drawdown < 0 dd_groups = (is_dd != is_dd.shift()).cumsum() dd_periods = drawdown[is_dd].groupby(dd_groups[is_dd]).apply(len) return dd_periods.max() if len(dd_periods) > 0 else 0
max_duration_unhedged = drawdown_duration(dd_unhedged)
max_duration_hedged = drawdown_duration(dd_hedged)
print(f'\nUnhedged MDD: {max_dd_unhedged:.2%}, Duration: {max_duration_unhedged} days')
print(f'Hedged MDD: {max_dd_hedged:.2%}, Duration: {max_duration_hedged} days')
print(f'MDD improvement: {(1 - abs(max_dd_hedged)/abs(max_dd_unhedged)):.1%}')
# Визуализация
fig, axes = plt.subplots(2, 1, figsize=(12, 8))
# Кумулятивная доходность
axes[0].plot(cum_returns_unhedged.index, (cum_returns_unhedged - 1) * 100,
label='Unhedged Portfolio', color='red', linewidth=1.5)
axes[0].plot(cum_returns_hedged.index, (cum_returns_hedged - 1) * 100,
label='Beta-Hedged Portfolio', color='black', linewidth=1.5)
axes[0].set_ylabel('Cumulative Return (%)')
axes[0].legend()
axes[0].grid(alpha=0.3)
# Drawdown
axes[1].fill_between(dd_unhedged.index, dd_unhedged * 100, 0,
color='red', alpha=0.3, label='Unhedged DD')
axes[1].fill_between(dd_hedged.index, dd_hedged * 100, 0,
color='black', alpha=0.3, label='Hedged DD')
axes[1].set_ylabel('Drawdown (%)')
axes[1].set_xlabel('Date')
axes[1].legend()
axes[1].grid(alpha=0.3)
plt.tight_layout()
plt.show()
# Дополнительные риск-метрики
unhedged_vol = portfolio_returns.std() * np.sqrt(252) * 100
hedged_vol = hedged_returns.std() * np.sqrt(252) * 100
unhedged_sharpe = portfolio_returns.mean() / portfolio_returns.std() * np.sqrt(252)
hedged_sharpe = hedged_returns.mean() / hedged_returns.std() * np.sqrt(252)
print(f'\nAnnualized volatility - Unhedged: {unhedged_vol:.2f}%, Hedged: {hedged_vol:.2f}%')
print(f'Sharpe Ratio - Unhedged: {unhedged_sharpe:.3f}, Hedged: {hedged_sharpe:.3f}')
Portfolio beta: 0.212
Unhedged MDD: -9.49%, Duration: 95 days
Hedged MDD: -6.64%, Duration: 69 days
MDD improvement: 30.0%
Annualized volatility - Unhedged: 13.01%, Hedged: 12.54%
Sharpe Ratio - Unhedged: 1.873, Hedged: 1.523

Рис. 4: Анализ просадок портфеля с бета-хеджем. Верхняя панель: кумулятивная доходность демонстрирует сглаживание волатильности хеджированного портфеля относительно незащищенного. Нижняя панель: динамика просадок — хедж существенно снижает глубину и длительность drawdown в периоды рыночных коррекций. Затененные области показывают величину просадки в процентах от предыдущего максимума
На представленном примере мы проанализировали эффективность бета-хеджа портфеля из акций WMT, DUK и JNJ относительно индекса SPY. Рассчитанный коэффициент бета (~0.212) показывает, что для нейтрализации систематического риска достаточно относительно небольшой короткой позиции по SPY. Графики кумулятивной доходности демонстрируют, что хедж сглаживает колебания портфеля, уменьшая глубину просадок (MDD) и сокращая длительность восстановления в периоды рыночных коррекций.
При этом снижение волатильности после хеджа минимальное (с 13.01% до 12.54%), а Sharpe Ratio падает с 1.873 до 1.523, что отражает компромисс: уменьшение риска сопровождается ограничением потенциальной доходности, особенно для портфеля с низкой бета. То есть хедж в данном случае смягчает просадки, однако слабо влияет на общий риск портфеля.
Сравнение методов хеджирования
Сравнительная таблица методов:
| Метод | Преимущества | Недостатки | Рекомендуемые рыночные условия |
| Статический хедж | Прост в расчете и интерпретации; минимальные транзакционные издержки | Не учитывает изменения корреляции; риск неактуальных hedge ratio | Стабильные трендовые рынки, долгосрочные стратегии |
| Rolling Window Regression | Адаптивен к изменениям корреляции; легко реализуется | Шум при коротких окнах; запаздывание при длинных окнах | Умеренно волатильные рынки, постепенные структурные изменения |
| Exponential Weighted Regression (EWMA) | Учитывает недавние изменения, сглаживает шум; баланс адаптивности и стабильности | Подбор параметра decay требует эксперимента; чувствителен к экстремальным событиям | Рынки с умеренной изменчивостью, когда нужны плавные корректировки |
| Kalman Filter | Адаптивное хеджирование в реальном времени; учитывает структурные сдвиги | Сложнее в реализации и интерпретации; чувствителен к настройке шумов | Высокая волатильность, быстрые рыночные изменения, структурные кризисы |
Каждый метод имеет свои сильные и слабые стороны, поэтому выбор зависит от того, что важнее в конкретной стратегии: стабильность и простота расчетов или быстрая адаптация к изменяющимся рыночным условиям.
Иногда подходы комбинируют. Например, используют статический хедж для долгосрочных позиций и EWMA или Kalman Filter для активов с высокой волатильностью, чтобы оперативно реагировать на рыночные колебания.
Ошибки и ловушки в хеджировании
Хеджирование — мощный инструмент управления риском, но его эффективность зависит от правильной настройки и учета рыночных условий. На практике встречаются следующие ошибки и подводные камни:
Игнорирование стоимости хеджа
Хедж всегда связан с издержками: комиссии брокеров, спреды, ролловеры фьючерсов и пр. Иногда снижение риска на 5–10% обходится дороже, чем потенциальные убытки от движения рынка. Поэтому перед внедрением стратегии важно оценить соотношение затрат и пользы:
- Когда хедж оправдан: высокая волатильность, значительные потери в стрессовых сценариях, стратегическая необходимость сохранения капитала;
- Когда хедж не оправдан: низкая волатильность, маленькая доля актива в портфеле, слишком высокая стоимость хеджирования относительно предполагаемого снижения риска.
Недооценка базисного риска
Базис — разница между ценой спот-актива и хеджирующего инструмента — может непредсказуемо меняться под влиянием сезонности, ликвидности и рыночных шоков. Пренебрежение этим фактором приводит к остаточному риску, который снижает фактическую эффективность хеджа.
Неправильный выбор метода и частоты пересчета
Метод хеджирования и частота обновления hedge ratio должны соответствовать рыночной волатильности и характеру актива. Например, ежедневное пересчитывание валютного хеджа на спокойных рынках не дает преимущества и увеличивает транзакционные издержки, в то же время редкое обновление в периоды кризиса может оставить портфель уязвимым.
Слепое доверие историческим данным
Использование прошлых корреляций и дисперсий без учета изменения рыночного режима может ввести в заблуждение. История показывает, что активы, некоррелированные в нормальные периоды, часто начинают двигаться синхронно при кризисе. Поэтому важно проводить стресс-тестирование и анализ подпериодов.
Вывод: перед внедрением любой хедж-стратегии, стоит всегда оценивать:
- Стоимость хеджа и баланс с уменьшением риска;
- Волатильность базиса и его исторические экстремумы;
- Адаптивность метода хеджирования к изменению корреляций;
- Чувствительность стратегии к стрессовым событиям.
Заключение
В данной статье мы рассмотрели ключевые алгоритмы хеджирующих стратегий и методы их оценки: от классического статического хеджа до динамических методов с фильтром Калмана, от оценки показателя Hedge Effectiveness до анализа Value-at-Risk и просадок.
Каждая из этих методик дает конкретные количественные показатели, которые помогают:
- Понять, насколько выбранная защита действительно снижает риск;
- Оценить, оправданы ли издержки хеджа;
- Адаптироваться к меняющимся рыночным условиям и предсказывать возможные сценарии убытков.
Правильно построенная хедж-стратегия — это баланс между защитой капитала и потенциальной доходностью. Она не устраняет полностью риск, но делает управление портфелем осознанным и прогнозируемым, минимизируя сюрпризы для инвестора.