-- Функция для вычисления кумулятивной функции распределения нормального распределения (N(x))
function norm_cdf(x)
local t = 1 / (1 + 0.2316419 * math.abs(x))
local d = 0.3989422804014337 * math.exp(-0.5 * x * x)
local prob = d * t * (0.319381530 + t * (-0.356563782 + t * (1.781477937 + t * (-1.821255978 + t * 1.330274429) )))
if x >= 0 then
return 1 - prob
else
return prob
end
end
-- Основная функция для расчета цены опциона по модели Блэка-Шоулза
function black_scholes_call_price(S, K, T, r, sigma)
local d1 = (math.log(S / K) + (r + 0.5 * sigma * sigma) * T) / (sigma * math.sqrt(T))
local d2 = d1 - sigma * math.sqrt(T)
return S * norm_cdf(d1) - K * math.exp(-r * T) * norm_cdf(d2)
end
-- Функция для нахождения подразумеваемой волатильности
function implied_volatility(S, K, T, r, market_price)
local low = 0.0001
local high = 2.0
local tolerance = 0.0001
local sigma = (low + high) / 2
local price = black_scholes_call_price(S, K, T, r, sigma)
-- Итерационный метод поиска
while math.abs(price - market_price) > tolerance do
if price < market_price then
low = sigma
else
high = sigma
end
sigma = (low + high) / 2
price = black_scholes_call_price(S, K, T, r, sigma)
end
return sigma
end
-- Для примера использования
local S = 100 -- Текущая цена актива
local K = 100 -- Цена исполнения
local T = 30 / 365 -- Время до экспирации (в годах)
local r = 0.05 -- Безрисковая процентная ставка (5%)
local market_price = 5 -- Рыночная цена опциона call
local iv = implied_volatility(S, K, T, r, market_price)
print(string.format("Подразумеваемая волатильность: %.4f", iv * 100))
-- Функция для вычисления кумулятивной функции распределения нормального распределения (N(x))
function norm_cdf(x)
local t = 1 / (1 + 0.2316419 * math.abs(x))
local d = 0.3989422804014337 * math.exp(-0.5 * x * x)
local prob = d * t * (0.319381530 + t * (-0.356563782 + t * (1.781477937 + t * (-1.821255978 + t * 1.330274429)))))
if x >= 0 then
return 1 - prob
else
return prob
end
end
-- Основная функция для расчета цены опциона по модели Блэка-Шоулза
function black_scholes_call_price(S, K, T, r, sigma)
local d1 = (math.log(S / K) + (r + 0.5 * sigma * sigma) * T) / (sigma * math.sqrt(T))
local d2 = d1 - sigma * math.sqrt(T)
return S * norm_cdf(d1) - K * math.exp(-r * T) * norm_cdf(d2)
end
-- Функция для нахождения подразумеваемой волатильности для одного опциона
function implied_volatility(S, K, T, r, market_price)
local low = 0.0001
local high = 2.0
local tolerance = 0.0001
local sigma = (low + high) / 2
local price = black_scholes_call_price(S, K, T, r, sigma)
-- Итерационный метод поиска
while math.abs(price - market_price) > tolerance do
if price < market_price then
low = sigma
else
high = sigma
end
sigma = (low + high) / 2
price = black_scholes_call_price(S, K, T, r, sigma)
end
return sigma
end
-- Функция для нахождения подразумеваемых волатильностей для серии опционов
function implied_volatilities_for_series(S, r, options)
local ivs = {}
for i, option in ipairs(options) do
local iv = implied_volatility(S, option.K, option.T, r, option.market_price)
table.insert(ivs, {K = option.K, T = option.T, implied_volatility = iv})
end
return ivs
end
-- Пример использования
local S = 100 -- Текущая цена актива
local r = 0.05 -- Безрисковая процентная ставка (5%)
-- Список опционов с параметрами: Цена исполнения (K), Время до экспирации (T в годах), Рыночная цена опциона (market_price)
local options = {
{K = 95, T = 30 / 365, market_price = 6},
{K = 100, T = 30 / 365, market_price = 5},
{K = 105, T = 30 / 365, market_price = 3.5},
{K = 110, T = 60 / 365, market_price = 4.5}
}
-- Вычисляем подразумеваемую волатильность для каждого опциона
local ivs = implied_volatilities_for_series(S, r, options)
-- Выводим результаты
for _, iv in ipairs(ivs) do
print(string.format("Цена исполнения: %.2f, Время до экспирации: %.2f лет, Подразумеваемая волатильность: %.4f%%",
iv.K, iv.T, iv.implied_volatility * 100))
end
Код
Что получилось:
Подразумеваемая волатильность: 42.0108
Цена исполнения: 95.00, Время до экспирации: 0.08 лет, Подразумеваемая волатильность: 21.5971%
Цена исполнения: 100.00, Время до экспирации: 0.08 лет, Подразумеваемая волатильность: 42.0108%
Цена исполнения: 105.00, Время до экспирации: 0.08 лет, Подразумеваемая волатильность: 46.9254%
Цена исполнения: 110.00, Время до экспирации: 0.16 лет, Подразумеваемая волатильность: 48.9867%