Всем привет!
У опционных трейдеров очень часто возникает вопрос, как тестировать опционные стратегии? Попробую описать самый простой способ.
И так. Нам понадобится:
1.Excel (уменя Microsoft Office Excel 2003)
2.Данные с биржи РТС (
ftp://ftp.rts.ru/pub/FORTS/volat_coeff/) вфайле
ftp://ftp.rts.ru/pub/FORTS/volat_coeff/Volat_description.doc подробно описан формат данных.
3.Конвертор. Необходимо извлечь и обработать нужные нам данные.
Приступим.
Создаем на диске папку option (у меня она будет на диске h:\)
Скачиваем в неё файл
ftp://ftp.rts.ru/pub/FORTS/volat_coeff/201303.7z. В нем данные за март 2013 года. Распаковываем архив в эту же папку.
Открываем Excel. Создаем новый файл. Называем лист «1». Сохраняем его как Конвертор.xls. На листе «1» создаем кнопку и называем ее, например, Старт. Кнопка должна исполнить функцию StartSplitTextFile.
В ячейке A1 указываем путь к нужному файлу H:\optiom\201303.csv. В ячейке A2 указываем необходимый нам контракт RTS-3.13. Создаем лист «2» потом он нам пригодится.
Жмем кнопку старт и ждем (ждать придется долго, минуты 3). После работы конвертора будет создан файл 201303(1).csv. Открываем его в Excel. Выделяем столбцы D:K, жмем Ctrl+F, выбираем вкладку Заменить. Заменяем точку на запятую. Выделяем столбцы A:K, жмем Ctrl+C, переходим к файлу Конвертор.xls, выбираем лист «2», ячейку A1 и жмем Ctrl+V.
У нас получилось 5080 строк. А нам столько надо? Допустим нам нужны данные только каждый час. Удалим все лишнее. Создадим на листе «2» кнопку «1 час». Она оставит нам только нужные данные. (140 строк).
Все, данные готовы, можем писать тестер.
Создаем файл тестер.xls. Одну страничку называем «архив», вторую тест. В архив вставляем очищенные данные из файла конвертор.
Приступаем к самому интересному. Нам понадобятся формулы кривой улыбки биржи РТС, и формула расчета стоимости опциона.
Идем на сайт РТС за формулой.
1)
http://fs.rts.ru/files/5570
2)
http://fs.rts.ru/files/5562
Осталось самую малость, написать все это на VB.
Создаем функции Volat и OPrice. Первая будет рассчитывать текущую волатильность опциона, а вторая его цену.
Создаем кнопку старт, StepByStepи CheckBox. Пишем небольшой код и… Ура! Все работает.
Если нужно прогнать не сразу, а шаг за шагом, есть кнопка StepByStep. Ставим галочку рядом с кнопкой, жмем Старт, и дальше StepByStep.
Кстати расчет прошел за 3 секунды.
Кому интересно, пишите комментарии. Позднее, всем заинтересовавшимся скину ссылки на сами файлы.
Я перебил код на С++ и добавил дельта хедж…
www.fayloobmennik.net/2782957
не забудьте проверить антивирусом, я этим обменником файлов первый раз пользуюсь.
Но есть небольшие вопросы по коду
1. почему для нормального распределения использовалась приблизительная функция, а не готовая функция excel
2. код не совсем оптимален (сложное ветвление в зависимости от кола-пута, можно обойтись флажком (-1), определение премии — аналогично, и еще есть моменты)
Это сознательно, целью не задавались — оптимизировать?
потому как исправив эти не оптимальности — скорость расчетов возрастет, да и лаконичнее код будет
вот и все;), и не надо приблизительных аппроксимизирующих расчетов в код.
Да я тоже сам самоучка, и тоже начинал с бейсика, не в первом классе, постарше конечно, и т.к. я очень похожее с опционами в Excel-VBA делаю, поэтому вижу пути оптимизации;)
вот пройдёт экспир, погоняю — отпишу впечатления.
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
считает все за полсекунды
ну и в конце кода:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
оптимизировал как мог :)
Ссылка для скачивания
тестер yadi.sk/d/kD6BZdq041VUu
конвертор yadi.sk/d/nCoN64Th41VUe
Поделюсь чем знаю: когда я полез на РТС смотреть как они считают ГО, то на первый раз сломал мозг.
www.rts.ru/s846
Через некоторое время вернулся и ещё раз перечитал ибо без ГО никуда. Понял что есть клиентский модуль, но я не готов за него платить. И так раз 5 я перечитывал этот документ, пока не уловил главную идею: ГО это необходимая сумма, которая должна быть у клиента при максимальном движении БА за день. Эта цифра находится в таблицах РТС на сайте и составляет порядка макс_ход=9800 пт. За день есть 2 сессии, поэтому берётся 2*макс_ход. Естественно БА ходит и вверх и вниз. Так что у нас 2 сценария. Далее берём 3 сценария волатильности +15% -15% и 0. Теперь берём не менее 10 точек по профилю портфеля и делаем просчёт в этих точках в 2х3 сценариях (2 по БА и 3 по волатильности). находим точку наибольшего убытка и пол-дела сделано. Затем добавляем сумму премий по купленным опционам, добавляем константный риск на дальние проданные опционы и вот у нас подобие ГО. Не забывайте из пунктов перевести в рубли. Для оценки портфеля по крайней мере я это подобие успешно использую. Примечательно что такой подход методологически соответствует тому что делает РТС, но ключевым является риск проданных дальних опционов. От его учёта зависит точность совпадения вашего ГО с тем что насчитает биржа. Я себе этот риск увеличил, чтобы не получилось как в 2011г.
Единственно это всё у меня на С++, внутри моей проги и как отдельный модуль использовано быть не может.
На что я облизываюсь: это сайт option.ru. Они говорят что считают по алгоритмам очень близким к РТС, и это действительно так и выглядит — очень похожие значения выдаёт. Но попросить этот алгоритм я до сих пор стесняюсь. Может быть потому что пошлют… учить матчасть, а она уже мне поднадоела.
Надо обдумать…
Естественно, если у нас есть все данные, график фьюча, улыбка, волатильности, то ГО мы можем посчитать на любой этот момент. Берём все компоненты из того момента времени и считаем.
— У меня уточнение по сигме, которую считает формула улыбки РТС. Вы это значение/100, я видел, прямо подставляете в Блэка Шоулза? Возьмите текущую доску опционов и попробуйте получить таким образом транслируемые теоретические цены. Вы удивитесь, но этого не получится. У меня не получилось, проверьте пожалуйста, могу ошибаться но вопрос принципиальный.