Загрузка данных


Напиши Python-модуль для расчёта цены и «греков» бинарного колл-опциона (cash-or-nothing) по модели Блэка-Шоулза.
Опцион с выплатой 1, если цена базового актива в момент экспирации выше страйка, иначе 0.

Функция должна называться `bs_binary(S, K, T, sigma, r=0)`.
- `S` (float) – текущая цена базового актива.
- `K` (float) – страйк.
- `T` (float) – время до экспирации в годах (например, 5 минут ≈ 5/(365*24*60)).
- `sigma` (float) – годовая волатильность в десятичных долях (0.8 = 80%).
- `r` (float) – безрисковая ставка, по умолчанию 0.

Функция должна возвращать кортеж/словарь из пяти значений:
- `price` – теоретическая цена опциона.
- `delta` – изменение цены на 1 единицу изменения S.
- `gamma` – изменение дельты на 1 единицу изменения S.
- `theta` – изменение цены за 1 год (можно привести к секундам отдельно, но здесь выдай в годовом выражении).
- `vega` – изменение цены на 1% (0.01) изменения волатильности.

Используй стандартные формулы для цифрового опциона:
d1 = (ln(S/K) + (r + sigma**2/2)*T) / (sigma*sqrt(T))
d2 = d1 - sigma*sqrt(T)

price = exp(-r*T) * N(d2)   (обычно r≈0, тогда price ≈ N(d2))
delta = exp(-r*T) * N'(d2) / (S * sigma * sqrt(T))
gamma = -exp(-r*T) * N'(d2) * d1 / (S**2 * sigma * sqrt(T))
theta = -exp(-r*T) * ( S * N'(d2) * sigma / (2*sqrt(T)) - r*N(d2) )   (по времени; знак соответствует уменьшению T)
vega = exp(-r*T) * S * N'(d2) * sqrt(T)

где N'(x) = (1/sqrt(2*pi)) * exp(-x**2/2) – плотность нормального распределения.
N(x) – кумулятивная функция нормального распределения (можно использовать math.erfc или scipy.stats.norm.cdf).

Обработай особые случаи:
- если T <= 0, то price = 1.0 если S > K, иначе 0.0; delta=gamma=theta=vega=0.
- если S <= 0 или sigma <= 0, верни None или пробрось исключение.
- если sigma*sqrt(T) слишком мало (менее 1e-10), обработай через предельные значения (можно не углубляться, просто ограничить снизу знаменатель).

Желательно добавить вторую функцию `bs_binary_implied_volatility(market_price, S, K, T, r=0)`, которая находит вменённую волатильность бинарного опциона методом бисекции.

Зависимости: numpy/scipy можно, но если хочешь без внешних библиотек – используй math.erfc для N(x): N(x) = 0.5 * math.erfc(-x / math.sqrt(2)).

Код должен быть чистым, с комментариями и примерами использования.