Рабочий код LUA для QUIK по расчету теор цены опциона на Мосбирже

Код взял с сайта bot4sale.ru/ Спасибо автору за публикацию. Дублирую здесь с некоторыми комментами. Публикую как есть, за ошибки отвественности нет, не является рекомендацией! LUA код считает цену опциона по формуле Блэка–Шоулза. function cnd(x) -- taylor series coefficients local a1, a2, a3, a4, a5 = 0.31938153, -0.356563782, 1.781477937,-1.821255978, 1.330274429 local l = math.abs(x) local k = 1.0 / (1.0 + 0.2316419 * l) local w = 1.0 - 1.0 / math.sqrt(2 * math.pi) * math.exp(-l * l / 2) * (a1 * k + a2 * k * k + a3 * (k^3) + a4 * (k^4) + a5 * (k^5)) if x < 0 then w = 1.0 - w end return w end -- The Black-Scholes option valuation function -- is_call: true for call, false for put -- s: current price -- x: strike price -- t: time -- r: interest rate -- v: volatility function black_scholes(is_call, s, x, t, r, v) local d1 = (math.log(s / x) + (r + v * v / 2.0) * t) / (v * math.sqrt(t)) local d2 = d1 - v * math.sqrt(t) if is_call then return s * cnd(d1) - x * math.exp(-r * t) * cnd(d2) else return x * math.exp(-r * t) * cnd(-d2) - s * cnd(-d1) end end Проверено вчера на путах сишки. Расчет совпал с табличными значениями «теор цена» на июньских, сентярьских, декабрьских досках опционов. Сделал вынужденные изменения в оригинальном коде:math.pow(k, 3) — не воспринимается компилятором LUA 5.4, заменил на (k^3) и т.д. t — задается в годах! Т.е. сначала расчитываем количество дней до экспиры, потом делим на 365. r — устанавливал 0.001, почему-то этот коэффициент оказался для путов не релевантным. v — задается дробным значением, деленным на 100. Т.е. 0.2 для волы 20%, 0.3 для 30% и т.д.По сути: v — заданная волатильность, основной параметр на котором можно строить своих роботовs — цена базового контракта (фьючерса), получаю через функцию getParamEx(«SPBFUT», «Si**», «last»).param_value В-общем, если полезно — лайкните.

Мар 15, 2025 - 09:44
 0
Рабочий код LUA для QUIK по расчету теор цены опциона на Мосбирже
Код взял с сайта bot4sale.ru/

Спасибо автору за публикацию. Дублирую здесь с некоторыми комментами.
Публикую как есть, за ошибки отвественности нет, не является рекомендацией!

LUA код считает цену опциона по формуле БлэкаШоулза.

function cnd(x)

-- taylor series coefficients
   local a1, a2, a3, a4, a5 = 0.31938153, -0.356563782, 1.781477937,-1.821255978, 1.330274429
   local l = math.abs(x)
   local k = 1.0 / (1.0 + 0.2316419 * l)
   local w = 1.0 - 1.0 / math.sqrt(2 * math.pi) * math.exp(-l * l / 2) * (a1 * k + a2 * k * k + a3 * (k^3) + a4 * (k^4) + a5 * (k^5))
   if x < 0 then w = 1.0 - w end
   return w
end

-- The Black-Scholes option valuation function
-- is_call: true for call, false for put
-- s: current price
-- x: strike price
-- t: time
-- r: interest rate
-- v: volatility
function black_scholes(is_call, s, x, t, r, v)
   local d1 = (math.log(s / x) + (r + v * v / 2.0) * t) / (v * math.sqrt(t))
   local d2 = d1 - v * math.sqrt(t)
   if is_call then
      return s * cnd(d1) - x * math.exp(-r * t) * cnd(d2)
   else
      return x * math.exp(-r * t) * cnd(-d2) - s * cnd(-d1)
   end
end
Проверено вчера на путах сишки. Расчет совпал с табличными значениями «теор цена» на июньских, сентярьских, декабрьских досках опционов.

Сделал вынужденные изменения в оригинальном коде:
math.pow(k, 3) — не воспринимается компилятором LUA 5.4, заменил на (k^3) и т.д.

t — задается в годах! Т.е. сначала расчитываем количество дней до экспиры, потом делим на 365.
r — устанавливал 0.001, почему-то этот коэффициент оказался для путов не релевантным.
v — задается дробным значением, деленным на 100. Т.е. 0.2 для волы 20%, 0.3 для 30% и т.д.
По сути: v — заданная волатильность, основной параметр на котором можно строить своих роботов
s — цена базового контракта (фьючерса), получаю через функцию getParamEx(«SPBFUT», «Si**», «last»).param_value

В-общем, если полезно — лайкните.