Исследование Доходности Опционных Стратегий: Какая нужна Историческая волатильность для подсчета Implied Volatility (Подразумеваемой Волатильности) в Библиотеке RQuantLib?


Цель: понять какие параметры влияют на доходность опционных стратегий в бектестах исследуемых стратегий. События одни и теже, а доходность разная, причем на порядок. Навскидку это:
1) Изменение цены базового актива (акции) с момента входа и до момента выхода
2) Время между входом и выходом
3) Величина премии опциона на входе. Чем выше премия при «длинной» стратегии, тем ниже общая доходность и наоборот для продажи опционов.
Так вот, если первые две легко посчитать, третья вызывает трудности и единственный параметр который приходит в голову это подразумеваемая волатильность (IV). Она влияет на цену опционов напрямую.

Вопрос к ищущим ), прогерам, опционщикам.
Для оценки опционов предлагаю посмотреть эту библиотеку quantlib.org/index.shtml. Подходит даже для ексел в виде Addin. Так что даже не программисты могут им пользоваться.
R, java и питон — само собой.

Подсчитать IV (Подразумеваемую Волатильность) из формулы Блэка Шоулза или другой модели, имея лишь цену опциона и цену базового актива, всегда представляет определенную трудность и неточность. Будет время, накатаю статью по этому поводу. Нужна серия итераций. Сначала считаем IV -> затем подставляем в формулу и получаем цену опциона -> сравниваем полученную цену опциона с изначальной -> повторяем процесс снова.
Всегда будет погрешность, причем небольшая для опционов возле денег, и намного больше для опционов вне денег.

Как раз таки опционы вне денег, нас и интересуют в текущих стратегиях.

Итак формула из RQuantLib. Я буду использовать здесь язык R + R-studio, но можно брать любой язык или ексел.
AmericanOption(type, underlying, strike,
dividendYield, riskFreeRate, maturity, volatility,
timeSteps=150, gridPoints=149, engine=«BaroneAdesiWhaley») — функция возвращает цену опциона и его греки.

Аргументы:
type A string with one of the values call or put
underlying Current price of the underlying stock
strike Strike price of the option
dividendYield Continuous dividend yield (as a fraction) of the stock
riskFreeRate Risk-free rate
maturity Time to maturity (in fractional years)
volatility Volatility of the underlying stock

Так вот трудность вызывает последний аргумент volatility — волатильность акции. Понятно что это будет историческая волатильность, но вопрос: какая? 30, 60, 90 дневная???
Пока ответ не нашел, потому требуется помощь.
Ответив на этот вопрос, мы сможем применить формулу подсчета волатильности опционов и сравнить ее в каждом конкретном бектесте между собой чтобы понять закономерности.

AmericanOptionImpliedVolatility(type, value,
underlying, strike,dividendYield, riskFreeRate, maturity, volatility,
timeSteps=150, gridPoints=151)

Интересно что в документации cran.r-project.org/web/packages/RQuantLib/RQuantLib.pdf волатильность обзывается как Initial guess (догадка, предположение) for the volatility of the underlying stock.

Затем можно провести регрессивный анализ всех переменных чтобы увидеть общую картину.

Фишки, инвестиционные идеи, сигналы и рекомендации!

Хотите получать бесплатные видеокурсы, материалы и участвовать в закрытых вебинарах?

Тогда подписывайтесь на рассылку и получайте доступ!

Комментарии

www.inside-r.org/packages/cran/RND/docs/compute.implied.volatility еще одна библиотека. Тестовый вариант у меня выдал ошибку
Error in uniroot(f, lower = lower, upper = upper, maxiter = 5000):
f() values at end points not of opposite sign
ИМХО, Если в формуле число дней до экспирации, то и волатильность должна быть дневная.
И чтобы мозг от этой концепции не разорвало, предлагаю вычислять её делением на квадратный корень из количества искомых периодов в годовой волатильности :)
Скорее годовая (annualized) как тут пишут stats.stackexchange.com/questions/14810/how-to-calculate-stock-volatility-in
И вот сразу готовый год. Потестил на SPY выдало HV=15.40424%
startDate='2015-01-01'

library(tseries)
data < — get.hist.quote('SPY', start = startDate)
price < — data$Close
ret < — log(lag(price)) — log(price)
vol < — sd(ret) * sqrt(250) * 100 # волатильность выраженная в %
Верно, годовая. Но даже если нет прямой формулы расчета, можно применить рекурсию с половинным уточнением. HV не нужна.
Запускай первую итерацию с IV=100
if calculatedPRICE > realPRICE
IV=IV/2
elseif calculatedPRICE < realPRICE
IV=IV*2
elseif calculatedPRICE == realPRICE
break
только в каждом цикле округлять цену до центов
очень быстрый расчет будет
Вообще ты прав, зачем париться и вычислять по всем временным рядам))) Лучше на два делить или умножать пока не придешь к нужным данным.

Может пригодиться...
Я пока разбирался, между делом R скрипт нашел годовой давности, который нам наш квант делал, но он почему то не работает. Может R обновился. Не было времени разбираться, я нашел лучший пакет TTR на любой вкус:

Считает любую историческую волатильность: по закрытию, rogers, parkinson, garman

Код рабочий, можете использовать в R-Studio:
#2 Variantlibrary(tseries)library(TTR)#library(volatility)startDate='2015-01-01'data <- get.hist.quote('SPY', start = startDate)ohlc <- merge(data$Open, data$High, data$Low, data$Close)colnames(ohlc)[which(colnames(ohlc) == 'data$Open')] = "Open"colnames(ohlc)[which(colnames(ohlc) == 'data$High')] = "High"colnames(ohlc)[which(colnames(ohlc) == 'data$Low')] = "Low"colnames(ohlc)[which(colnames(ohlc) == 'data$Close')] = "Close"#ohlc <- ttrc[,c("Open","High","Low","Close")]vClose <- volatility(ohlc, n = 30, calc = "close", N = 260, mean0 = FALSE)vClose0 <- volatility(ohlc, calc="close", mean0=TRUE)vGK <- volatility(ohlc, calc="garman")vParkinson <- volatility(ohlc, calc="parkinson")vRS <- volatility(ohlc, calc="rogers")
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.