Подразумеваемая волатильность

Страницы: 1
RSS
Подразумеваемая волатильность, Расчет подразумеваемой волатильности опционов
 
Буду признателен, если кто-то сможет поделиться кодом расчета подразумеваемой волатильности (по отдельному опциону или серии).
 
Может это подойдет?
Код
-- Функция для вычисления кумулятивной функции распределения нормального распределения (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%
Страницы: 1
Читают тему
Наверх