Расчет и отрисовка Gamma Exposure (GEX) в Pine Script v5

Расчет и отрисовка Gamma Exposure (GEX) в Pine Script v5 НАЛОГИ, ИП и САМОЗАНЯТОСТЬ
Пошаговое руководство по расчету и визуализации уровней Gamma Exposure (GEX) на графике TradingView с использованием формулы Блэка-Шоулза в Pine Script v5.
Суть: Скрипт рассчитывает Gamma Exposure (GEX) для заданных опционных уровней на основе формулы Блэка-Шоулза прямо в TradingView, позволяя визуализировать ключевые зоны поддержки и сопротивления маркет-мейкеров.

Исходный код

Гамма-экспозиция (GEX) — важнейший показатель для понимания механики современного рынка. Маркет-мейкеры, продающие опционы ритейл-трейдерам, вынуждены динамически хеджировать свои позиции базовым активом. Когда цена приближается к крупным опционным уровням, объемы этого хеджирования резко возрастают, что приводит к стабилизации цены (при положительной гамме) или к ускорению тренда (при отрицательной гамме).

Для точного расчета GEX нам необходимо вычислить классическую Гамму опциона по модели Блэка-Шоулза для каждого уровня страйка, а затем взвесить ее на открытый интерес (Open Interest) и знак позиции. Ниже представлен готовый скрипт на Pine Script v5, реализующий этот математический аппарат.

//@version=5
indicator('Gamma Exposure (GEX) Levels', overlay=true)

// Black-Scholes Gamma Calculation
gammaBS(float S, float K, float t, float sigma, float r) =>
    if t <= 0 or sigma <= 0 or S <= 0 or K <= 0
        0.0
    else
        float d1 = (math.log(S / K) + (r + math.pow(sigma, 2) / 2.0) * t) / (sigma * math.sqrt(t))
        float n_prime = math.exp(-math.pow(d1, 2) / 2.0) / math.sqrt(2.0 * math.pi)
        float gamma = n_prime / (S * sigma * math.sqrt(t))
        gamma

// Inputs
float dte = input.float(7.0, 'Days to Expiration (DTE)') / 365.0
float r = input.float(0.05, 'Risk-Free Rate (r)')

// Option Levels Configuration
strike_1 = input.float(400.0, 'Strike 1')
oi_call_1 = input.float(5000.0, 'OI Call 1')
oi_put_1 = input.float(3000.0, 'OI Put 1')
iv_1 = input.float(0.20, 'IV 1')

strike_2 = input.float(410.0, 'Strike 2')
oi_call_2 = input.float(8000.0, 'OI Call 2')
oi_put_2 = input.float(2000.0, 'OI Put 2')
iv_2 = input.float(0.18, 'IV 2')

strike_3 = input.float(390.0, 'Strike 3')
oi_call_3 = input.float(1000.0, 'OI Call 3')
oi_put_3 = input.float(9000.0, 'OI Put 3')
iv_3 = input.float(0.22, 'IV 3')

// Spot Price
float S = close

// Arrays for dynamic processing
var float[] strikes = array.new_float(3)
var float[] oi_calls = array.new_float(3)
var float[] oi_puts = array.new_float(3)
var float[] ivs = array.new_float(3)

if barstate.isfirst
    array.set(strikes, 0, strike_1)
    array.set(strikes, 1, strike_2)
    array.set(strikes, 2, strike_3)
    
    array.set(oi_calls, 0, oi_call_1)
    array.set(oi_calls, 1, oi_call_2)
    array.set(oi_calls, 2, oi_call_3)
    
    array.set(oi_puts, 0, oi_put_1)
    array.set(oi_puts, 1, oi_put_2)
    array.set(oi_puts, 2, oi_put_3)
    
    array.set(ivs, 0, iv_1)
    array.set(ivs, 1, iv_2)
    array.set(ivs, 2, iv_3)

// Lines and labels arrays for rendering
var line[] lines = array.new_line(3)
var label[] labels = array.new_label(3)

if barstate.islast
    // Clean up previous drawings
    for i = 0 to array.size(lines) - 1
        line.delete(array.get(lines, i))
        label.delete(array.get(labels, i))
        
    for i = 0 to 2
        float k = array.get(strikes, i)
        float oic = array.get(oi_calls, i)
        float oip = array.get(oi_puts, i)
        float iv = array.get(ivs, i)
        
        float g = gammaBS(S, k, dte, iv, r)
        // GEX = (OI_Call - OI_Put) * Gamma * Spot * 100
        float gex = (oic - oip) * g * S * 100.0
        
        color level_color = gex >= 0 ? color.green : color.red
        
        line l = line.new(x1=bar_index - 30, y1=k, x2=bar_index, y2=k, color=level_color, width=2, style=line.style_dashed)
        label lb = label.new(x=bar_index, y=k, text='Strike ' + str.tostring(k) + ' | GEX: ' + str.tostring(gex / 1000000.0, '#.##') + 'M', color=color.new(color.black, 100), textcolor=level_color, style=label.style_label_left)
        
        array.set(lines, i, l)
        array.set(labels, i, lb)

Разбор параметров

Для корректной работы скрипта и интерпретации результатов важно понимать назначение ключевых переменных и функций:

  • gammaBS(): Пользовательская функция, вычисляющая классическую Гамму опциона. Она использует логарифмическое распределение и плотность стандартного нормального распределения для нахождения чувствительности дельты к изменению цены базового актива.
  • dte: Время до экспирации опционной серии (Days to Expiration), выраженное в долях года. Ввод параметров осуществляется в днях, после чего скрипт автоматически делит значение на 365.
  • r: Безрисковая процентная ставка (Risk-Free Rate), необходимая для дисконтирования в модели Блэка-Шоулза.
  • strike_1 / strike_2 / strike_3: Ценовые уровни (страйки) опционов, на которых зафиксирован крупный открытый интерес.
  • oi_call_1 / oi_put_1: Открытый интерес (Open Interest) для Call и Put опционов соответственно. Разница между ними определяет результирующий знак экспозиции маркет-мейкеров.
  • iv_1: Подразумеваемая волатильность (Implied Volatility) для конкретного страйка, критически влияющая на ширину распределения Гаммы.

Для более точных расчетов внутри текущего тика (особенно при быстром изменении спот-цены) рекомендуем ознакомиться со статьей Pine Script v5: Использование varip для точных расчетов внутри текущего бара.

Как запустить

Чтобы развернуть индикатор на графике TradingView, выполните следующие шаги:

1. Откройте веб-терминал TradingView и выберите интересующий вас актив (например, SPY или QQQ).

2. В нижней панели откройте вкладку Pine Editor.

3. Скопируйте исходный код, представленный выше, и вставьте его в редактор, заменив стандартный шаблон.

4. Нажмите кнопку Add to Chart (Добавить на график).

5. Откройте настройки индикатора и введите актуальные данные по опционным уровням (страйки, OI и IV), которые можно получить из опционной доски (Option Chain) вашего брокера или аналитического ресурса.

Если вы планируете использовать уровни GEX в качестве триггеров для пробойных стратегий в начале торговой сессии, изучите материал Реализация стратегии ORB с учетом таймзон в Pine Script v5.

Для построения более сложных арбитражных моделей и анализа спредов между спотом и опционными уровнями полезно изучить Индикатор TVWAP Spread в Pine Script v5: Арбитраж в TradingView.

Оцените статью
FinFluct