Господа, теор. цена обновляется в КВИКе раз в минуту, это очень долго. Есть ли в открытом доступе модуль на Луа или просто формула для её расчёта? Чтобы самому расчитывать теор. цену. Я не про формулу Б-Ш в гипотетическом виде, а именно реализация в КВИКе. Спасибо.
Поищите на сайте ммвб. Когда-то там находил. Но очень сомневаюсь, что Вы ее сможете запрограммировать. Сомневаюсь, что есть бесплатная прога. ------------------------ Ищущий да обрящет.
Николай Камынин написал: Но очень сомневаюсь, что Вы ее сможете запрограммировать.
Да ладно. Самое хитрое там - функция нормального распределения N(x). Но нам в помощь численные методы. Если интересна теория: 1. Hart, J.F. (1968). Computer Approximations. Наверно, наиболее цитируемая книга по численным методам. 2. Krishnamoorthy K. Handbook of Statistical Distributions with Applications (2006). Это, в частности, в области теории вероятностей. В ней надо смотреть раздел "10.10. Computing the Distribution Function".
Ну и код функции N(x) по этому методу, перенесенный на Луа. Точность 14 знаков этого приближения устроит?
Код
function NormCDF(x)
if type(x) ~= "number" then return end
local z = math.abs(x)
local p
if z < 7 then
p = math.exp(-z * z / 2) *
(((((((2.49338129315143e-02 * z + 0.604737992686704) * z + 6.81311678753268) * z +
46.0649519338751) * z + 202.102090717023) * z + 580.109897562909) * z +
1024.60809538334) * z + 913.167442114756) /
((((((((0.0625 * z + 1.51584331855598) * z + 17.1406995062578) * z +
116.979524577666) * z + 523.596091947383) * z + 1566.10462582845) * z +
3044.77121163622) * z + 3506.42059774909) * z + 1826.33488422951)
elseif z < 32 then
p = math.exp(-z * z / 2) / 2.506628274631 /
(z + 1 / (z + 2 / (z + 3 / (z + 4 / (z + 5 / (z + 6 / (z + 7)))))))
else
p = 0
end
return (x > 0) and (1 - p) or p
end
Не так страшно? С остальным в формулах Блэка-Шоулза наверно справитесь? Вот, например, расчет дельты колл опциона:
Код
function CallDelta(f, s, v, t)
return NormCDF((math.log(f / s) + v^2 * t / 2) / (v * t^0.5))
end
Николай Камынин написал: Но очень сомневаюсь, что Вы ее сможете запрограммировать.
Да ладно. Самое хитрое там - функция нормального распределения N(x). Но нам в помощь численные методы. Если интересна теория: 1. Hart, J.F. (1968). Computer Approximations. Наверно, наиболее цитируемая книга по численным методам. 2. Krishnamoorthy K. Handbook of Statistical Distributions with Applications (2006). Это, в частности, в области теории вероятностей. В ней надо смотреть раздел "10.10. Computing the Distribution Function".
Ну и код функции N(x) по этому методу, перенесенный на Луа. Точность 14 знаков этого приближения устроит?
Код
function NormCDF (x)
if type(x) ~ = "number" then return end
local z = math.abs (x)
local p
if z < 7 then
p = math.exp ( - z * z / 2 ) *
((((((( 2.49338129315143e-02 * z + 0.604737992686704 ) * z + 6.81311678753268 ) * z +
46.0649519338751 ) * z + 202.102090717023 ) * z + 580.109897562909 ) * z +
1024.60809538334 ) * z + 913.167442114756 ) /
(((((((( 0.0625 * z + 1.51584331855598 ) * z + 17.1406995062578 ) * z +
116.979524577666 ) * z + 523.596091947383 ) * z + 1566.10462582845 ) * z +
3044.77121163622 ) * z + 3506.42059774909 ) * z + 1826.33488422951 )
elseif z < 32 then
p = math.exp ( - z * z / 2 ) / 2.506628274631 /
(z + 1 / (z + 2 / (z + 3 / (z + 4 / (z + 5 / (z + 6 / (z + 7 )))))))
else
p = 0
end
return (x > 0 ) and ( 1 - p) or p
end
Не так страшно? С остальным в формулах Блэка-Шоулза наверно справитесь? Вот, например, расчет дельты колл опциона:
Код
function CallDelta (f, s, v, t)
return NormCDF(( math.log (f / s) + v^ 2 * t / 2 ) / (v * t^ 0.5 ))
end
Ну,ну... ------------------------------- "..не сумлевайтесь, милые: Коль что у вас не ладится — ну, там, не тот аффект, — Мы мигом к вам заявимся с лопатами и с вилами, Денёчек покумекаем — и выправим дефект!"
По приведенной выше методике биржи волатильность для каждого страйка оценивается с помощью параметрической кривой - "улыбки волатильности". Эта кривая - аналитическая модель с 5-ю параметрами (A, B, C, D, E). Про это и написано в методике непосредственно под приведенной выше таблицей:
"Параметры A, B, C, D, E, S устанавливаются таким образом, чтобы для каждого страйка опциона значение кривой волатильности для данного страйка было выше подразумеваемой волатильности лучшей заявки на покупку и одновременно ниже подразумеваемой волатильности лучшей заявки на продажу по опциону с данным страйком. Подбор указанных параметров кривой волатильности осуществляется один раз в одну минуту".
Таким образом, для решения задачи нужно брать лучшие биды и оффера в стаканах для каждого страйка и находить A, B, C, D, E так, чтобы кривая по этой формуле проходила указанным образом. Подбор этих параметров - класс математических задач, называемый "Curve fitting". Вот можно вкратце ознакомиться: https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%B1%D0%BB%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1... Там же есть список литературы.
Готовые алгоритмы и код дать не могу, так как это использовать не приходилось.
Из ваших ответов стало понятно как считать N. А как считать волатильность?
Ищите все на сайте ммвб, а не спрашивайте на форуме. Потому, что Вам надо не ссылки на математику для начинающих, а методики расчета на бирже и чтобы у Вас все совпала с биржей. Поэтому бесплатных решений нет, а написать решения может тот, кто не задает подобные вопросы и профессионально пишет софт. Успехов в изучении программирования.