Главная Софт Анализ данных MATLAB – используем обобщенное нормальное распределение
MATLAB – используем обобщенное нормальное распределение
23.04.2012 09:00

Одной из особенностью реальных финансовых данных являются т.н. «толстые хвосты». Распределение доходностей многих активов демонстрирует высокую концентрацию частот у центральных значений и в «хвостах». Такое поведение сильно отличается от того, что предполагается в рамках модели нормального распределения – стандартного статистического инструмента в классических финансах. Однако проблема более точного моделирования реальных ценовых движений довольно легко решается за счет обращения к более широкому классу распределений, в частности, к обобщенному нормальному. Все же это решение было бы почти бесполезным без его «компьютеризации». К счастью, ее легко можно осуществить, воспользовавшись возможностями Matlab, в чем мы и убедимся в этом уроке.


Обобщенное нормальное распределение

Обобщенное нормальное распределение, также известное под именем обобщенного экспоненциального может использоваться для моделирования широкого спектра вероятностных явлений. Оно объединяет в себе такие, казалось бы, разные законы как равномерный, нормальный, Лапласа и др. В отличие от обычного нормального распределения обобщенное характеризуется тремя параметрами: µ, σ, τ. Параметр «мю» отвечает за положение максимума плотности вероятности на горизонтальной оси, «сигма» – задает типичный размах колебаний относительно максимума, а «тау» – контролирует толщину хвостов. Обобщенное нормальное распределение следует применять для моделирования логдоходностей финансового актива. Более подробную информацию по этому распределению вы можете найти в книге Булашева или в нашем курсе лекций. Целью данного урока является только презентация полезных функций для системы Matlab.


Функции Matlab

Командой Q-trading.ru было разработано несколько Matlab-функций для обобщенного нормального распределения, в частности:

  • gndpdf() – плотность вероятности обобщенного нормального распределения

  • gndcdf() – кумулятивная функция обобщенного нормального распределения

  • gndinv() – квантильная функция (VaR) обобщенного нормального распределения

  • gndCVaR() – Conditional Value-at-Risk

  • gndfit() – оценка параметров обобщенного нормального распределения методом максимального правдоподобия

  • gndrnd() – случайные числа из обобщенного нормального распределения

  • gndstat() – среднее и дисперсия обобщенного нормального распределения (служебная)

  • k2t() – оценка параметра «тау» методом моментов

Кроме того, была разработана функция GND, позволяющая добавить обобщенное нормальное распределение в графический интерфейс подгонки Distribution Fitting Tool.

Все эти файлы вы можете скачать в конце урока. Для того чтобы все корректно работало их следует поместить в текущий рабочий каталог – по умолчанию это папка «MATLAB» в «Моих документах». Ознакомиться с самим кодом можно открыв их в редакторе функций Matlab.


Краткое описание функций

gndpdf(x, µ, σ, τ) рассчитывает значение плотности вероятности в точке x. Она удобна для визуального ознакомления с вероятностным законом. Наложив ее на гистограмму эмпирических частот, можно увидеть, насколько хорошо они приближаются теоретической кривой.

gndcdf(x, µ, σ, τ) позволяет найти вероятность того, что случайная величина x не превысит некоторое значение.

gndinv(p, µ, σ, τ) позволяет найти значение x соответствующее некоторому вероятностному уровню p – квантиль, т.е. решает задачу обратную gndcdf().

gndCVaR(p, µ, σ, τ) позволяет вычислить среднее значение случайной величины ниже некоторого порогового значения соответствующего той или иной вероятности p.

[PE, CI]=gndfit(x, p) рассчитывает значения оценок параметров методом максимального правдоподобия.

gndrnd(µ, σ, τ, n, m) генерирует случайные числа из обобщенного нормального распределения.


Пример: индекс ММВБ

Чтобы стало понятнее, рассмотрим практический пример. Давайте подгоним обобщенное нормальное распределения к дневным логдоходностям индекса ММВБ. Получив оценки параметров, мы узнаем, как работают функции, и какую информацию на выходе они дают. Возьмем историю значений индекса ММВБ с 22 сентября 1997 года по конец 2011. Сохраним эти данные в Workspace под именем micex. Изучаемые нами в этом уроке функции следует применять к логдоходностям, а не к «ценам» индекса или любого другого актива с вероятностно похожей динамикой. Какая ерунда получается, если использовать цены, можно убедиться, построив гистограмму уровней индекса при помощи функции hist(micex) или через графический интерфейс:


Гистограмма уровней


На картинке видно, что гистограмма уровней индекса имеет «шумовой» характер. Совсем другое дело – доходности. Их можно вычислить, воспользовавшись функцией x=price2ret(micex). Тем самым мы сохраняем их в памяти, обозначив как x, и потом легко можем обращаться к этому массиву данных. Далее, проследовав по меню Start/Toolboxes/Statistics/Distribution Fitting Tool, запустим графический интерфейс для подгонки распределений. В появившемся окошке выбираем File/Import Custom Distributions, отмечаем файл GND и нажимаем кнопку «Открыть». В списке доступных распределений должно появиться Generalized Normal*. Далее щелкаем по кнопке «Data…». Выбираем Data: x, нажимаем «Create Data Set» и закрываем это окно. В главном окне появится гистограмма доходностей по индексу ММВБ. На этот раз гистограмма демонстрирует четко проявляющуюся закономерность: максимальная концентрация частот наблюдается вблизи средних значений, минимальная – в хвостах, что согласуется со здравым смыслом, утверждающим, что 10% дневное движение цены – явление гораздо более редкое, чем, скажем, 1% движение.


Теперь мы можем создавать подгонки различных распределений и изучать их качество. Нажимаем «New Fit…». Выбираем Distribution: Generalized normal и щелкаем «Apply». Внизу в поле «Result» появятся следующие цифры:


Parameter Estimate

mu 0.00176186

sigma 0.0280496

tau 0.860847


Из этих данных можно увидеть, что индекс ММВБ демонстрировал очень маленькую дневную доходность ≈0.18% и довольно высокую волатильность ≈2.8%. Параметр тау характеризует толщину хвостов и свидетельствует о значительном отклонении от обычного нормального закона – для него τ=2.


Закроем окно и изучим точность подгонки визуально. Как видно из картинки, обобщенное нормальное распределение очень хорошо описывает реально наблюдавшийся разброс доходностей по индексу ММВБ. Для сравнения создадим новую подгонку – теперь уже для обычного нормального закона. Проделаем те же шаги, только выберем Distribution: Normal. На гистограмму будет наложена вторая, синяя линия нормального распределения. Очевидно, что даже наилучшим образом подогнанная эта кривая гораздо хуже моделирует реальные данные.


Гистограмма доходностей


Теперь, когда у нас есть оценки параметров, мы можем более содержательно поработать с функциями.

Примечание: Для получения этих оценок можно было и не прибегать к визуальному интерфейсу, а использовать функцию [PE, CI]=gndfit(x, p), где PE – вектор оценок параметров, CI – матрица доверительных интервалов, p – уровень доверительной вероятности – эту переменную можно пропустить, тогда по умолчанию будет принят 5% уровень. Конструкцию [PE, CI] также можно пропустить – в этом случае gndfit() просто возвратит значение оценок параметров без доверительных интервалов.

Плотность вероятности мы уже посмотрели в Distribution Fitting Tool, поэтому сразу обратимся к остальным функциям. Напр., можно задаться вопросом: какова вероятность индексу упасть более чем на 7% за день? Для этого используем:

gndcdf(log(1-0.07),0.00176186,0.0280496,0.860847).

Согласно нашей модели она составляет 1.31%. Значит, такие крупные обвалы цен не столь уж и редки. Для сравнения обычное нормальное распределение дает прогноз только 0.4%, т.е. оно значительно занижает риски сильных ценовых движений.

Едем дальше. Каким может быть худший день в году? Для этого нам надо найти квантиль соответствующий вероятностному уровню 1/250 (250 примерное количество торговых дней в году), т.е. это %убыток, вероятность превышения которого 0.004. Пишем в командной строке:

exp(gndinv(0.004,0.00176186,0.0280496,0.860847))-1.

В итоге получаем худший день года – обвал более чем на 9.48%.

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

exp(gndCVaR(0.004,0.00176186,0.0280496,0.860847))-1.

Ответ: 11.62%.

Примечание: Несмотря на то, что обобщенное нормальное распределение предназначено для моделирования логдоходностей, его можно без труда приспособить и для обычных доходностей, c которыми мы реально и сталкиваемся при торговле, используя преобразования log() и exp(), что мы и проделали выше.


Нам осталось рассмотреть только функцию для генерации случайных чисел. gndrnd(µ, σ, τ, n, 1) генерирует случайный вектор из n чисел, извлеченных из обобщенного нормального распределения. Для тренировки вы можете сгенерировать, напр., n=10000 выборочных значений, а потом через gndfit() оценить теоретические параметры, которые были заданы при генерации. Эти цифры должны быть очень близкими.

Мы рассмотрели все функции. Оставшиеся gndstat() и k2t() имеют служебное значение – на них ссылаются другие функции. В частности, они используются для работы в визуальном интерфейсе подгонки (файл GND) и в gndfit(), поэтому все изученные нами выше функции должны храниться в одной рабочей директории Matlab – Current Folder. Функция k2t() рассчитывает параметр «тау» через показатель эксцесса выборочных данных и может использоваться при оценке параметров обобщенного нормального распределения методом моментов. Если для вычисления эксцесса вы используете матлабовскую функцию kurtosis(), то прежде чем подставить ее значение в k2t() из него следует вычесть 3, т.е. подставлять надо excess kurtosis.


Итоги

В этом уроке мы узнали как моделировать доходности финансовых активов при помощи обобщенного нормального распределения. Обобщенное нормальное распределение является весьма гибкой вероятностной моделью, позволяющей учитывать такие рыночные реалии как «толстые хвосты» и повышенную концентрацию частот у центра. Хотя это распределение не входит в стандартный набор Matlab, его легко можно интегрировать в систему при помощи пользовательских функций, что мы успешно и проделали. В дальнейшем вы можете свободно использовать эти функции для моделирования доходностей тех активов, которые вас интересуют, контроля рисков и т.п.



© q-trader

[обсудить на форуме]


Вложения:
ФайлОписаниеРазмер файлаЗагрузки
Скачать файл (gnd.rar)gnd.rarФункции для работы с обобщенным нормальным распределением1 Kb1867
Скачать файл (micex1997-2011.xls)micex1997-2011.xlsИндекс ММВБ 1997-201174 Kb3225
 

Добавить комментарий


Защитный код
Обновить



© 2010–2012. Все права защищены.
Копирование материалов, размещенных на сайте, разрешается только с рабочей ссылкой на источник.



| О проекте |  Правовая информация |
|  Напишите нам |  Карта сайта |



  

 Новости
главные новости экономики и финансовых рынков: события, мнения, прогнозы.

 Статьи
материалы по теханализу, фундаментальному анализу, управлению капиталом (манименеджмент) и др.

 Рынки
фондовый, валютный, товарный рынки: исторические обзоры, динамика, доходность, корреляции.

 Калькуляторы
xls-калькуляторы для оптимизации размера и структуры торговой позиции; опционные калькуляторы.

 Софт
торговые терминалы, программы для теханализа, оптимизации систем и др.: статьи, обзоры, видеоуроки.

 Архив котировок
индексы, валюты, сырье: многолетние истории котировок в форматах .xls и .txt.

 Индикаторы
ºSiX – индикатор настроения рынка на основе расчета соотношения количества опционных контрактов put и call.

 Библиотека
собрание книг, которые рекомендуется прочесть каждому трейдеру в первую очередь.

 Словарь
толкование основных экономических, финансовых терминов, трейдерский сленг.

 Форум
обсуждение материалов сайта и любых вопросов трейдинга и инвестирования.