Guía de uso de Matlab en el desarrollo de modelos de volatilidad Óscar H. Moratto Guía de uso de Matlab en el desarrollo de modelos de volatilidad Óscar H. Moratto Guía de uso de Matlab en el desarrollo de modelos de volatilidad Moratto, H. Óscar Guía de uso de MatLab en el desarrollo de modelos de volatilidad / Óscar H. Moratto; editado por Eduardo Norman Acevedo. -- Bogotá: Editorial Politécnico Grancolombiano, 2011. 155 p.; ¿? cm. Incluye bibliografía e índice. ISBN: 978-958-8721-03-3 ISBN Digital: 978-958-8721-04-0 1. MATLAB (LENGUAJE DE PROGRAMACIÓN DE COMPUTADORES) -- GUÍAS. 2. ANÁLISIS NÚMERICO -- PROCESAMIENTO DE DATOS POR COMPUTADOR -- GUIAS. 3. MATLAB -- GRAFICOS POR COMPUTADOR -- GUÍAS. 4. VOLATILIDAD -- MATLAB (LENGUAJE DE PROGRAMACIÓN DE COMPUTADORES) -- GUÍAS. I. Tít. II. Moratto, H. Óscar. III. Norman Acevedo, Eduardo, ed. 005.262 cd. 21 ed. Biblioteca María Cristina Niño de Michelsen Institución Universitaria Politécnico Grancolombiano. © Politécnico Grancolombiano Institución Universitaria Miembro de American University System ISBN: 978-958-8721-03-3 ISBN DIGITAL: 978-958-8721-04-0 Editorial Politécnico Grancolombiano Calle 57 No. 3 – 00 Este Bloque A Primer piso PBX: 3 46 88 00 ext. 808 www.poligran.edu.co/editorial Noviembre de 2011 Bogotá, Colombia Fundación Politécnico Grancolombiano Institución Universitaria Facultad de Ingeniería y Ciencias Básicas Pablo Michelsen Niño Rector Rafael García Gómez Decano Facultad de Mercadeo, Comunicación y Artes Eduardo Norman Acevedo Director editorial David Ricciulli Coordinador editorial npg comunicaciones npg.comunicaciones@gmail.com Corrección de estilo Taller de edición - rocca S.a. Diseño y armada electrónica Ana María Salcedo Aguilar Magda Lucia Quiñones Franco Finalización de artes PENDIENTE Impresión y encuadernación Impreso y hecho en Colombia Printed in Colombia La Editorial del Politécnico Grancolombiano pertenece a la Asociación de Editoriales Universitarias de Colombia, ASEUC. El contenido de esta publicación se puede citar o reproducir con propósitos académicos siempre y cuando se de cuenta de la fuente o procedencia. Las opiniones expresadas es responsabilidad exclusiva del autor. Nota del autor Este texto describe cómo implementar por medio de MatLab® modelos de volatilidad. La audiencia objetivo son estudiantes y profesores que requieran para sus actividades académicas o profesional, el uso de modelos de volatilidad y no tengan conocimiento profundo de MatLab®. Personas que hayan utilizado herramientas tales como GAUSS, R, RATS y SPSS, les será útil hacer la transición a MatLab, primordialmente por dos razones: i. es una herramienta con grandes capacidades matemáticas y algoritmos numéricos; ii. Provee una batería de Toolboxes –conjunto de funciones agrupadas lógicamente según su objetivo primario– que hacen que la labor de diseño de modelos sea mucho más rápida y eficiente. Cabe anotar que esta guía ha sido desarrollada bajo la versión 7.8 de MatLab. ÓSCAR MORATTO Índice Capítulo 1 13 Capítulo 2 19 Capítulo 3 31 Capítulo 4 59 Capítulo 5 69 Capítulo 6 77 Capítulo 7 95 Introducción a MatLab, se hace una breve presentación del entorno de desarrollo de MatLab, sus ventanas y principales características. Matemáticas Escalares, Operadores y Variables, se presenta la forma de manipulación básica de escalares, sus operadores aritméticos y la creación de variables. Vectores, Matrices y Arreglos, se muestra cómo se pueden realizar operaciones básicas con matrices y vectores, su declaración y manipulación. Gráficos en MatLab, se incluye una breve descripción a cerca de la realización de gráficos bidimensionales en Matlab. Manejo de archivos en MatLab, se explica cómo exportar e importar archivos de datos y de código fuente. Fundamentos de programación en MatLab, se presenta los principios fundamentales de programación, las estructuras de selección y de iteración, y su implementación en MatLab. Modelamiento de volatilidad en MatLab, se enfoca en la implementación de diversos modelos de volatilidad a través de MatLab. Capítulo 1 Introducción a MatLab Introducción a MatLab MatLab® (Matrix Laboratory) es un ambiente computacional desarrollado por la empresa MathWorks (www.mathworks.com) que permite cálculos numéricos y visualización de datos. Inicialmente fue creado en los años 70 por Cleve Moler, como una herramienta de apoyo didáctico para sus estudiantes. Provee diferentes funciones matemáticas para álgebra lineal, estadística, análisis de Fourier, optimización, integración numérica, entre otras. Es ampliamente usado para realizar diseños de control, análisis numérico, procesamiento de imágenes, matemáticas y finanzas. Ejecución de MatLab En Windows, haga doble click en el ícono de MatLab en el escritorio o seleccione MatLab del listado de programas de inicio (Figura 1 - Ejecución de MatLab). Figura 1. Ejecución de MatLab 13 Guía de uso de Matlab en el desarrollo de modelos de volatilidad El escritorio de MatLab El escritorio de MatLab está compuesto por las siguientes partes (véase Figura 2): 1. Ventana de Comandos (Command Window): para digitar comandos o datos, adicionalmente, muestra los resultados de las operaciones o instrucciones. 2. Ventana de Historia de Comandos (Command History Window): Muestra el historial de comandos o datos ejecutados previamente, a menos que sean borrados específicamente. Para ejecutar cualquier comando en el historial de comandos, haga doble click sobre él. 3. Botón de inicio (Start Button). Funciona de forma similar al botón de inicio de windows, en el sentido que permite acceder a diversas funciones y características de MatLab. 4. Ventana de documentos (Documents Window) –que incluye el Editor (M-File Editor) / Debugger y el Editor de Arreglos (Array Editor): Crea y edita scripts de comandos denominados M-files, con el objetivo de no digitar la totalidad de comandos cada vez que se desee utilizar MatLab. El editor es un software de edición de texto programado con varias características y colores, dependiendo del tipo de acción que se programe. Por ejemplo, los comentarios se colocan en verde, las variables y números, en negro; palabras reservadas del sistema, en azul, etc. De esta forma, es más fácil la identificación de errores sintácticos. 5. Ventana de Figuras (Figures Window): Despliega las gráficas y figuras creadas en respuesta a comandos. 6. Workspace Browser. En esta ventana, se presentan las variables definidas en el momento. Si se hace doble click sobre un ítem, el Workspace Browser permite ver y editar el valor de dicha variable. El contenido de esta ventana puede listarse con el comando whos 7. Buscador de ayuda (Help Browser). Para buscar ayuda, respecto a comandos o funcionalidades. 8. Path Browser. MatLab viene con un número amplio de archivos M-files en diversos directorios, éstos componen los denominados Toolboxes. Cuando MatLab encuentra un nombre, verifica primero el dato para determinar si es el nombre de una variable. Luego, busca el mismo nombre dentro del directorio actual bajo el nombre: M-file. Finalmente busca M-file dentro de los directorios del path de búsqueda. Si alguna de las variables definidas tiene el 14 Capítulo 1 / Introducción a MatLab mismo nombre que un M-file o que una palabra reservada del sistema, dicha palabra reservada o M-file no son accesibles. El path de búsqueda puede ser modificado (seleccionar Desktop Tools → Path). Figura 2. Escritorio de MatLab Al iniciar la ejecución de MatLab, la ventana de comandos es la ventana activa. A medida que los comandos son ejecutados, las ventanas apropiadas automáticamente aparecerán. Obtención de ayuda Existen diversas formas de obtener ayuda en MatLab: 1. 2. Presionar tecla F1 o seleccionar el ícono [?] del toolbar, el cual despliega la ventana de ayuda (Help Window). Utilizar el comando help en la ventana de comandos, seguidamente help despliega todos los temas de ayuda, así: • help tema: provee ayuda para el tema específico • help comando: provee ayuda para el comando específico 15 Guía de uso de Matlab en el desarrollo de modelos de volatilidad • help help: provee información sobre cómo utilizar el comando help. • helpwin: es una ayuda on-line, ventana separada de la navegación. Presionar F1. • helpdesk: documentación en hipertexto. Equivale a presionar F1. • demo: ejecuta demostraciones • intro: presenta una introducción interactiva a MatLab. Interrumpir y terminar MatLab Si por alguna circunstancia se desea interrumpir o finalizar la ejecución de alguna instrucción, (p.e., un ciclo que no termina), pueden usarse los comandos que se exponen a continuación: • • • Ctrl-C (teclas Ctrl y C simultáneamente ^C): interrumpe (aborta) el procesamiento, pero no cierra MatLab. quit : finaliza MatLab. exit : finaliza MatLab. Comandos varios Clc: limpia el contenido de la ventana de comandos. Clf: limpia el contenido de la ventana de figuras. 16 Capítulo 2 Matemáticas Escalares, Operadores y Variables Matemáticas Escalares, Operadores y Variables En este capítulo, se presentan los fundamentos para la realización de operaciones matemáticas a través de MatLab. Matemáticas Escalares Las matemáticas escalares involucran operaciones de variables con un único valor (valores unidimensionales). El comando básico de MatLab es la expresión matemática que debe cumplir con las siguientes propiedades: • • Ser un constructo matemático que tiene un valor o un set de valores Construida a partir de números, operadores y/o variables. Para evaluar la expresión, se debe presionar la tecla Enter Números MatLab representa los números de dos formas: de punto fijo y punto flotante. Punto Fijo: forma decimal, con punto decimal opcional. Por ejemplo: 3.2114 -152 0.00014 Punto Flotante: en notación científica, representando m x 10e. Por ejemplo: 2.7823 x 105 se representa como 2.7823e5 Esta representación se denomina como punto flotante dado que el punto decimal puede moverse. El número tiene dos partes: 19 Guía de uso de Matlab en el desarrollo de modelos de volatilidad • Número decimal (con o sin signo), con el punto decimal opcional (2.7823 en el ejemplo anterior) Exponente e, el cual es un número entero (con o sin signo) (5 en el ejemplo anterior). • Generalmente, la notación científica es más sencilla para representar números muy grandes o muy pequeños (por ejemplo, es más fácil representar 0.0000000002 como 2e-10). Operadores Para evaluar una expresión, se utilizan los operadores, los cuales operan sobre operandos. En la Tabla 1. Operadores Numéricos, se presentan los operadores básicos de MatLab. Tabla 1. Operadores Numéricos Forma algebráica Representación en MatLab Ejemplo Adición a+b a + b 6+8 Substracción a-b a – b 12.45-3.14 Multiplicación axb a * b 0.089*2.74 División (derecha) a÷b a / b 4/2 División (izquierda) b÷a a \ b 8\52 ab a ^ b 3^3 Operación Exponenciación Precedencia de operadores Dado que se pueden combinar múltiples operaciones matemáticas en una misma instrucción, existen reglas para la evaluación de dichas operaciones: 1. 2. 3. 20 Paréntesis: siendo los internos, los primeros en evaluarse. Exponenciación (^): de izquierda a derecha Multiplicación (*) y división (/ ó \) con igual precedencia: de izquierda a derecha. Capítulo 2 / Matemáticas Escalares, Operadores y Variables 4. Adición (+) y substracción (–) con igual precedencia: de izquierda a derecha. Variables y declaración de asignación Una variable es un nombre simbólico dado a una cantidad o valor desconocido que puede cambiar, no solo en el tiempo sino en el contexto bajo el cual la variable es usada. Se busca entonces utilizar el nombre de la variable de forma independiente del valor que tome, es decir, como representación de dicho valor. Las reglas para la definición de variables en MatLab son las siguientes: 1. 2. 3. 4. Debe iniciar por una letra Su nombre solo puede contener las letras [a, z], dígitos [0, 9] y/o el caracter underscore (_). Puede tener la longitud que se desee pero MatLab solo reconoce los primeros 31 caracteres. Es sensible a mayúsculas y minúsculas. Por esto: Prueba, pRueba, PRUEBA representan en MatLab variables diferentes. Declaración de asignación Por medio de esta instrucción se asigna o reasigna valor a una variable. En MatLab, la asignación se hace por medio del operador igual (=); es decir, los valores ubicados a la derecha del operador de asignación se asignan a la variable ubicada a la izquierda de dicho operador. Generalizando, se pueden dar dos tipos de asignaciones: • • variable = número variable = número MatLab Workspace Las variables creadas en la ventana de comandos o en un M-file residen en el workspace, el cual retiene sus valores con el fin de que puedan ser utilizadas posteriormente en otras expresiones. Así por ejemplo la expresión y = x + 8; exige que previamente se haya asignado un valor a la variable x. 21 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Redefinición de variables Una variable puede ser redefinida simplemente ejecutando una nueva instrucción de asignación que involucre dicha variable. Cabe anotar que a diferencia de una hoja de cálculo, en MatLab modificar una variable que tiene relación con otra en su asignación, no cambia en cascada el valor de la variable encadenada, solo a través de una redefinición de la variable se puede actualizar el valor de la misma. Variables especiales Existen un grupo de variables predefinidas en MatLab. Estas son: ans: nombre de la variable default. Si se escribe una expresión y ésta no se asigna a ninguna variable, MatLab automáticamente asigna el valor a la variable ans. pi: razón entre la circunferencia del círculo y su diámetro. π = 3.1415926… eps: cantidad más pequeña por la cual dos números pueden diferir. Inf ó inf: infinito (p.e., 1/0) NaN ó nan: no numérico (not-a-number) (p.e., 0/0) date: fecha actual flops: conteo de número de operaciones de punto flotante realmax: número de punto flotante de mayor valor que posee MatLab realmin: número de punto flotante de menor valor que posee MatLab Comandos que involucran variables who: es la lista de los nombres de las variables definidas whos: es la lista de los nombres y tamaños de las variables definidas. 22 Capítulo 2 / Matemáticas Escalares, Operadores y Variables clear: limpia todas las variables clear var: limpia la variable var Puntuación y comentarios Utilizar un punto y coma (;) al final de una línea de comandos, suprime su resultado e impide que se muestre en la ventana de comandos, pero su ejecución se realiza normalmente. Se pueden usar comas, y puntos y comas en una misma línea, con el objeto de desplegar los resultados en la ventana de comandos y suprimir los puntos y comas. Para crear comentarios, se utiliza el signo (%) al comienzo del comentario, de tal forma que el texto ubicado a su derecha sea ignorado por MatLab. En los archivos M-file, los comentarios son de color verde. Tres puntos seguidos (. . .) al final de un comando indica que el comando continúa en la siguiente línea. Ejemplo 1. Uso de puntuación y comentarios >> a = 36 a = 36 >> b b = 90 >> b = a + c + d b = 94 >> a=32, c =18; d=40; % múltiples comandos a = 32 >> b = a + c + d; >> costo = a*0.12 + c*0.18 + d*0.08; >> costo_promedio = costo/… % continuación del comando b costo_promedio = 0.1142 23 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Operaciones matemáticas básicas MatLab soporta diversas funciones matemáticas. Las funciones matemáticas elementales son (para una lista más completa, digite el comando help elfun): Tabla 2. Funciones matemáticas elementales abs(x) Valor absoluto |x| sign(x) Retorna -1 si x < 0; 0 si x = 0 y 1 si x > 0 exp(x) Exponencial ex log(x) Logaritmo natural ln x log10(x) Logaritmo en base 10 log10 x sqrt(x) Raíz cuadrada √x Para información detallada de éstas funciones o cualquier otra, como se expuso previamente, se puede utilizar la función help. Por ejemplo: >> help sqrt SQRT Square root. SQRT(X) is the square root of the elements of X. Complex results are produced if X is not positive. See also SQRTM. Ejemplo 2. Uso de funciones matemáticas Suponga que se desea evaluar la siguiente expresión: Cuando x es igual a: 24 Capítulo 2 / Matemáticas Escalares, Operadores y Variables >> x = sqrt(2)/2 x = 0.7071 >> y = exp(-(x^2)/2)/sqrt(2*pi) y = 0.3107 Opciones de presentación Existen diversas formas de desplegar o presentar el valor de una variable. La forma más sencilla es colocar, en la ventana de comandos, el nombre de la variable; de esta forma, el nombre se repetirá y su valor se desplegará en la siguiente línea. Opciones para presentación de números • Enteros: se despliegan como enteros mientras contengan 9 o menos dígitos. Para 10 o más dígitos, se despliegan en notación científica. Por ejemplo: >> x = 5 x = 5 • Punto fijo corto: el default se usa para presentar los números decimales con cuatro (4) dígitos a la derecha del punto decimal y hasta tres (3) dígitos a la izquierda del punto decimal. Se conoce como el formato short. Por ejemplo: >> 610./12. ans = 50.8333 • Punto flotante corto: se usa cuando el resultado tiene más de tres (3) dígitos a la izquierda del punto decimal, se presenta en notación científica, bajo el cual, un valor se expresa como un número entre uno (1) y diez (10) multiplicado por una potencia de diez (10). Por ejemplo: >> 61000./12. ans = 5.0833e+003 25 Guía de uso de Matlab en el desarrollo de modelos de volatilidad La forma como se presenta el valor puede cambiarse especificando un formato numérico diferente en la opción Preferencias, del menú Archivo o digitando la palabra reservada FORMAT en la línea de comandos. Ejemplo 3. Efecto de selección de múltiples formatos numéricos >> razon = 610./12 razon = 50.8333 Tabla 3. Formatos numéricos diferentes Comando de MatLab Variable razon Comentarios format short 50.8333 4 dígitos decimales format long 50.83333333333334 14 dígitos decimales format short e format long e format short g format long g 4 dígitos decimales más exponente 14 dígitos decimales más 5.083333333333334e+001 exponente Mejor entre format short 50.8333 o format short e Mejor entre format long 5.083333333333334e+001 o format long e 5.0833e+001 format bank 50.83 2 dígitos decimales format + + Positivo, negativo o cero Mostrar valores y texto Existen tres (3) formas de mostrar valores y texto en MatLab 1. 26 Desde la línea de comandos: se escribe el nombre de la variable sin punto y coma; al final, puede usarse en combinación con una instrucción de asignación. Capítulo 2 / Matemáticas Escalares, Operadores y Variables 2. Usando el comando disp. Existen dos formas de utilizar el comando disp.: a. disp(variable): muestra el valor de la variable sin mostrar el nombre de la variable. b. disp(string): muestra el string, quitando las comillas sencillas de ella y mostrando los caracteres entre comillas. Una cadena de caracteres (string) es un grupo de caracteres enmarcados entre comillas sencillas (‘). Por ejemplo: >> temp=78; >> disp(temp); disp(‘Grados F’) 78 Grados F 3. Usando los comandos fprintf o sprintf. Estas funciones tienen un comportamiento similar a la función fprint del lenguaje de programación C. La función fprintf sirve para formatear la salida en un archivo o en la ventana de comandos, mientras que la función sprintf es utilizada para formatear la salida a otra cadena de caracteres. Los ejemplos que se den serán sobre la función fprintf, pero su uso es extensible a la función sprintf. Existen varias versiones de estas dos funciones, sin embargo, la más usada es la siguiente: fprintf(formato, A) formato: consiste en una cadena de caracteres entre comillas sencillas que describe el formato de los campos de salida. Dentro del formato se puede incluir: Tabla 4. Formatos de campos de salida • w.d%f • Muestra los resultados como de punto fijo o notación decimal, • w.d%e • • w.d%E • • w.d%g • con un ancho de w caracteres (incluyendo el punto decimal y el signo negativo de tener), con d decimales. Por ejemplo, %4.0f presenta hasta cuatro dígitos sin decimales. Muestra los resultados usando notación científica. Por ejemplo, 3.141593e+00 Igual que el w.d%e, pero en mayúsculas. Por ejemplo, 3.141593E+0 Muestra los resultados en la versión más compacta de w.d%e o w.d%f. 27 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Los especificadores w.d son opcionales. El formato previo puede complementarse con las siguientes acciones: Tabla 5. Acciones complementarias dentro del formato '-' Justificar a la izquierda. Por ejemplo %-5.2f '+' Imprime el signo positivo o negativo. Por ejemplo %+5.2f ' ' Inserta un espacio antes del valor. Por ejemplo % 5.2f '0' Llena con ceros a la izquierda. Por ejemplo, %05.2f A su vez, pueden incluirse caracteres de escape: Tabla 6. Caracteres de escape 28 Caracter Descripción Caracter Descripción '' Comillas sencillas %% Carácter porcentaje \\ Backslash \t Tab horizontal \n Nueva línea \v Tab vertical Capítulo 3 Vectores, Matrices y Arreglos Vectores, Matrices y Arreglos La variable básica en MatLab es el arreglo. Por arreglo se entiende una variable que representa más de un valor. Cada valor del arreglo se denomina elemento del arreglo. En realidad, las variables numéricas corresponden a arreglos de 1 x 1. Los vectores columnas son arreglos de n x 1 (donde n es el número de filas) y los vectores fila arreglos de 1 x n (donde n es el número de columnas). Adicionalmente, MatLab tiene la capacidad de manipular arreglos multidimensionales; por ejemplo, un arreglo bidimensional puede ser de m x n (donde m es el número de filas y m el número de columnas). En la Figura 3. Ejemplos de arreglos, se muestra gráficamente la diferencia entre los vectores fila, columna y matrices multidimensionales. Los arreglos proveen una forma eficiente de almacenar y manipular datos que pueden agregarse en un mismo conjunto de información. Figura 3. Ejemplos de arreglos Vector fila (1 x n) Vector columna (n x 1) Vector bidimensional (m x n) Suponga, por ejemplo, que se debe evaluar la función y = cos(x) cuando x ε [0,π]. Debido a que existe un número infinito de puntos entre cero (0) y π, se debe escoger un conjunto de puntos para evaluar la función. Si se toman los valores de x del conjunto x = 0.1 * π, 0.2π, ···π, se puede construir una lista o arreglo de valores tanto para x como para y (véase Tabla 7. Ejemplo de valores posibles de Arreglo). En este caso, tanto x como y se considerarían arreglos fila, donde cada uno tiene una (1) fila y once (11) columnas para almacenar valores. 31 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Tabla 7. Ejemplo de valores posibles de Arreglo x 0 0.1π 0.2π 0.3π 0.4π 0.5π 0.6π y 1.00 0.95 0.81 0.59 0.31 0.00 -0.31 -0.59 -0.81 -0.95 -1.00 0.7π 0.8π 0.9π π Declaración de arreglos Existen diversas formas de crear arreglos en MatLab. Declaración por lista explícita Una de las más comunes es la creación por medio de una lista explícita. Los elementos de una misma fila se digitan encerrados entre llaves ([ ]) y se encuentran separados por espacios o comas. Para el ejemplo que hemos planteado en este Capítulo, el vector x se declararía como: >> x=[0 .1*pi .2*pi .3*pi .4*pi .5*pi .6*pi .7*pi .8*pi .9*pi pi] x = Columns 1 through 7 0 0.3142 0.6283 0.9425 1.2566 1.5708 1.8850 Columns 8 through 11 2.1991 2.5133 2.8274 3.1416 De esta forma, se crea un arreglo fila de once (11) columnas o un arreglo de 1 x 11. Para generar una nueva fila, se coloca un punto y coma ( ; )al final del último elemento de cada fila, con excepción de la última fila. Por ejemplo: 32 Capítulo 3 / Vectores, Matrices y Arreglos Ejemplo 4. Creación de arreglos por lista explícita >> z=[1; 2; 3; 0] % Vector columna de (4 x 1) z = 1 2 3 4 >> k=[1,2,3;4,5,6] % matriz de (2 x 3) k = 1 2 3 4 5 6 Declaración a partir de otro arreglo Algunas veces, la utilización de la lista explícita para la creación de un arreglo puede ser algo engorroso; por lo cual, MatLab provee alternativas para la creación de arreglos. Un arreglo puede usarse como base para la creación de otro arreglo. Por uso de funciones sobre arreglos Las distintas funciones matemáticas generalmente pueden aplicarse a arreglos, para obtener un vector de resultados. Así para el ejemplo que nos compete, se puede observar: >> y=cos(x) y = Columns 1 through 7 0 0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 Columns 8 through 11 0.8090 0.5878 0.3090 0.0000 Declaración por operador puntos El formato de esta notación es el siguiente: (inicio: incremento: fin) 33 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Genera un arreglo cuyo primer valor es inicio, aumenta en incremento y llega hasta que sea menor o igual a fin. Cualquiera de los tres componentes puede ser número de punto flotante. Así, por ejemplo, para generar el arreglo x sobre el que se ha venido trabajando, se puede usar: >> x=(0:0.1:1)*pi x = Columns 1 through 7 0 0.3142 0.6283 0.9425 1.2566 1.5708 1.8850 Columns 8 through 11 2.1991 2.5133 2.8274 3.1416 No necesariamente la secuencia llega exactamente hasta el valor final, por ejemplo: >> z = 0:2:9 z = 0 2 4 6 8 Si se omite el argumento de incremento, se utiliza el incremento default de uno (1). Si se utiliza esta versión, solo pueden usarse como inicio y fin, valores enteros: >> z = 0:5 z = 0 1 2 3 4 5 Declaración por Linspace Esta función de MatLab genera un vector con valores incrementales uniformes, a diferencia que el operador ( : ), no especifica el incremento, sino el número de valores deseados. La función se define de la siguiente forma: linspace (inicio, fin, número) El incremento es calculado internamente según la siguiente expresión: 34 Capítulo 3 / Vectores, Matrices y Arreglos Por ejemplo, para generar el arreglo x del ejemplo, se utilizaría la siguiente expresión: >> x=linspace(0,pi,11) x = Columns 1 through 7 0 0.3142 0.6283 0.9425 1.2566 1.5708 1.8850 Columns 8 through 11 2.1991 2.5133 2.8274 3.1416 Declaración por Logspace Esta función crea un vector uniformemente espaciado de forma logarítmica. La sintaxis es la siguiente: logspace(exponenteinicial,exponentefinal,número) Por ejemplo, para crear un vector que comience en 100 y termine en 102 = 100 que tenga 11 valores, utilice logspace como se muestra a continuación: >> logspace(0,2,11) ans = Columns 1 through 7 1.1189 1.5849 2.5119 3.9811 6.3096 10.0000 15.8489 Columns 8 through 11 25.1189 39.8107 63.0957 100.0000 35 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Declaración por combinación Un arreglo puede declararse usando otro arreglo previamente creado, así: >> x=(0:0.1:1)*pi; >> z = [x pi*1.1] Creación de vectores especiales MatLab provee funciones para la creación de vectores con ciertas características. Vector de números aleatorios uniformemente distribuidos Por medio de la función rand, se construyen vectores con números pseudoaletorios uniformemente distribuidos en el intervalo abierto (0,1): Tabla 8. Uso de la función rand Forma de uso Descripción rand(n) Crea una matriz de (n x n) con números pseudoaletorios rand(m, n) Crea una matriz de (m x n) con números pseudoaletorios rand(m, n, p, …) Crea una matriz de (m x n x p x …) con números pseudoaletorios Vector de números aleatorios normalmente distribuidos: Por medio de la función randn se construyen vectores con números pseudoaletorios normalmente distribuidos, es decir, que siguen una distribución normal estándar N(0,1): Tabla 9. Uso de la función randn Forma de uso randn(n) randn(m, n) randn(m, n, p, …) 36 Descripción Crea una matriz de (n x n) con números pseudoaletorios Crea una matriz de (m x n) con números pseudoaletorios Crea una matriz de (m x n x p x …) con número pseudoaletorios Capítulo 3 / Vectores, Matrices y Arreglos Matriz Identidad Una matriz identidad es aquella en la cual, todos los elementos son ceros, con excepción de aquellos ubicados en su diagonal, de los cuales su valor es uno. Para la creación de matrices de identidad, se utiliza la función eye. Tabla 10. Uso de la función eye Forma de uso Descripción eye(n) Crea una matriz identidad de (n x n) eye(m, n) Crea una matriz identidad de (m x n) Vector de unos (1) La función ones permite la creación de matrices cuyo único valor es uno (1) Tabla 11. Uso de la función ones Forma de uso Descripción ones(n) Crea una matriz de unos de (n x n) ones(m, n) Crea una matriz de unos de (m x n) ones(m, n, p, …) Crea una matriz de unos de (m x n x p x …) 37 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Matriz de ceros Al igual que la función ones, la función rank crea una matriz llena de ceros Tabla 12. Uso de la función rank Forma de uso Descripción rank(n) Crea una matriz de ceros de (n x n) rank(m, n) Crea una matriz de ceros de (m x n) rank(m, n, p, …) Crea una matriz de ceros de (m x n x p x …) Tamaño de un arreglo Para conocer el número de elementos de un arreglo, utilice el comando length: >> length(x) ans = 11 Hay que tener en cuenta que la función length retorna la longitud (número de elementos) de la mayor dimensión con mayor número de elementos. Es decir, en un vector fila, retorna el número de columnas, y en un vector columna, el número de filas. Z = [4, 2.8, 72, 28/4, 3.61, 11 74 89]; length(X) ans = 8 W = [3, 5, 7; 1 2 4] Lenght(W) ans = 3 38 Capítulo 3 / Vectores, Matrices y Arreglos En caso que se requiera conocer la longitud en cada una de las dimensiones del arreglo, se utiliza el comando size. Existen diversas formas de utilizar la función (véase Tabla 13. Formas de uso comando size). Tabla 13. Formas de uso del comando size Forma de uso Descripción d = size(X) Retorna un arreglo con el número de elementos igual al número de dimensiones del arreglo (véase función ndims) [m,n] = size(X) Retorna el tamaño de la matriz X en las variables m y n m = size(X,dim) [d1,d2,d3,…,dn] = size(X) Retorna el length de la dimensión de X especificada por el número escalar dim Retorna cada una de las dimensiones de X en las variables d1,d2,d3,…,dn. Si el número de dimensiones de X no es igual a n entonces. Si n es menor al número de dimensiones del arreglo: retorna hasta n-1 el tamaño de la dimensión, para n, la multiplicación de las dimensiones restantes. Si n es mayor al número de dimensiones del arreglo, el número de dimensiones +1 hasta n asigna como tamaño, el valor de uno (1). Si lo que se desea saber es el número de dimensiones, se utiliza el comando ndims. Hay que tener en cuenta que el número de dimensiones de un arreglo en MatLab, por construcción, es como mínimo dos (2). Ndims(x) es igual a length(size(x)). El comando size puede ser utilizado también para la creación de matrices especiales; por ejemplo, para crear una matriz identidad del mismo tamaño de x, se utiliza la instrucción a = eye(size(x)). Acceso a elementos del vector Los elementos individuales de un vector, se acceden en MatLab a través de un número entero, denominado subíndice, encerrado entre paréntesis. Si el vector tiene más dimensiones, se separa cada una de las dimensiones por una coma (,). 39 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Por ejemplo, si se requiere acceder al segundo elemento del vector x: x(2) ans = 0.9425 otro ejemplo, en este caso, de matriz: z = [1 2 3; 4 5 6; 7 8 9] para acceder al elemento de la primera fila, segunda columna: z(1,2) ans = 2 Acceso a elementos de un vector, operador dos puntos La notación de dos puntos ( : ) se utiliza para acceder a bloques de elementos en un vector, de forma similar a como se utiliza para la creación de arreglos. La forma en que se emplea el operador dos puntos para el acceso a elementos de vectores, se presenta en la Tabla 14. 40 Capítulo 3 / Vectores, Matrices y Arreglos Tabla 14. Uso del operador dos puntos (:) para acceder a elementos de un arreglo Uso* A(:, j) A(i:end) A(i:j:k) Descripción Representa la j-ésima columna de A. En un arreglo unidimensional retorna los elementos desde i hasta el final del arreglo. En un arreglo unidimensional, retorna los elementos desde i hasta k, en incrementos de j unidades (j puede ser negativo). A(i, (:) Representa la i-ésima fila de A A(:, (:) Es el equivalente a una arreglo bidimensional. Para matrices, es igual a A A(j:k) Equivale a A(j), A(j+1), . . ., A(k) A(:, j:k) Equivale a A(:, j), A(:, j+1), . . ., A(:, k) A(: :, k) Es la k-ésima página de un arreglo tridimensional. A(i, j, k, (:) A(:) Es un vector en un arreglo de cuatro dimensiones. El vector incluye A(i,j,j,1), A(i,j,k,2), etc. Todos los elementos de A, reorganizados como una única columna. * En todos los casos, se supone que la matriz A existe y ha sido declarada previamente. Acceso por medio de arreglo Las posiciones que se desean extraer de un arreglo, pueden ser definidas en un arreglo para tal fin. Por ejemplo: >> x([1 3 6 10] Operaciones Matriciales Existen diversas operaciones que pueden realizarse con matrices, a continuación, se presentan las principales de ellas: 41 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Invertir Matrices Una matriz A (n x n) se dice que puede ser invertible o no singular, si existe una matriz B (n x n) tal que: AB - BA = I En MatLab puede usarse la función inv(A) para invertir una matriz: Transponer matrices Por efectos de notación, se usará el operador ( ' ) para representar la transpuesta de una matriz (por ejemplo, la transpuesta de la matriz A se denota por A’). Formalmente, el transponer una matriz implica que el elemento (i, j) de la matriz transpuesta corresponde al elemento (j, i) de la matriz original. A´(i,j) = A(j,i) En el caso de MatLab, existen dos formas diferentes de transponer matrices: A través del operador de transposición ( ' ) Es la transposición linear algebraica de la matriz. En caso que la matriz sea una matriz compleja, es la transpuesta conjugada compleja. Si se usa en conjunción con el operador punto ( . ), en caso de matrices complejas, la transpuesta ( .' ) no involucra conjugación. En el caso de matrices reales, el uso de cualquiera de los dos operadores produce el mismo resultado (A' = A.'). Adición de matrices Se utiliza el operador más ( + ) para realizar la suma de matrices, las dos matrices deben ser del mismo tamaño, a menos que uno de los argumentos sea un número escalar. 42 Capítulo 3 / Vectores, Matrices y Arreglos Substracción de matrices Se utiliza el operador menos ( - ) para realizar la resta de matrices, las dos matrices deben ser del mismo tamaño, a menos que uno de los argumentos sea un número escalar. Multiplicación de matrices El producto algebraico de matrices se realiza por medio del operador ( * ). Si A y B son dos matrices, el número de columnas de A debe ser igual al número de filas de B, a menos que uno de los dos sea un escalar. La matriz resultado está dada por la siguiente expresión: Multiplicación vectorial de matrices Es la multiplicación del elemento por elementos de las dos matrices, que se realiza con el operador ( .* ), las cuales deben ser del mismo tamaño, a menos que uno de ellos sea un escalar. División de matrices Al igual que en el caso escalar, existen dos formas de dividir matrices: división izquierda (mldivide u operador \) y división derecha (mrdivide u operador /). División izquierda mldivide(A, B) es equivalente a A \ B. Si A es una matriz cuadrada es equivalente a inv(A) * B, aunque se pre- fiere la notación con Backslash debido a que es mucho más rápida de ejecutar. Si A es de n x n y B es de n x 1, X = A \B es la solución al sistema AX = B, es decir, de regresión lineal. Si A es m x n y B es 1 x m con m~ 43 Guía de uso de Matlab en el desarrollo de modelos de volatilidad = n entonces X = A \ B es la solución en mínimos cuadrados al sistema sobre o subdeterminado AX = B (X minimiza norm(A*X – B)). Si A es un escalar, es igual que la división dato a dato, es decir, A \ B = A .\B División derecha mrdivide(A, B) es equivalente a A / B. A y B deben tener el mismo número de columnas. Si A es una matriz cuadrada B / A es equivalente B * inv(A). si A es n x n y B es 1 x n, entonces X = B / A es la solución al sistema XA = B La división derecha e izquierda están relacionadas por la ecuación: B/A = (A'\B')' División vectorial de matrices La división elemento por elemento puede realizarse también con matrices. División vectorial derecha de matrices Por medio del operador ( ./ ), se realiza la operación con los elementos A(i, j) / B (i, j); por lo tanto A y B deben tener el mismo tamaño, a menos que uno de ellos sea un escalar. División vectorial izquierda de matrices Por medio del operador ( .\ ), se realiza la operación con los elementos B(i, j) / A (i, j); por lo tanto A y B deben tener el mismo tamaño, a menos que uno de ellos sea un escalar. Potencia de matrices El operador ( ^ ) permite elevar la matriz A a la potencia p ( A ^ p ). Si p es positivo, la potencia se calcula elevando al cuadrado repetidamente; si es negativo, la matriz primero es invertida, y para otros valores de p, 44 Capítulo 3 / Vectores, Matrices y Arreglos el cálculo involucra la determinación de los vectores propios, de tal forma que si [V, D] = eig(A) entonces A ^ p = V*D.^p/V Potencia vectorial La potencia vectorial (A.^B) es la matriz que cumple con la siguiente relación: C(i,j) = A(i, j)^B(i, j) A y B deben ser del mismo tamaño, a menos que uno de ellos sea escalar. Producto Kronecker Si A es una matrix m x n, B es una matriz p x q, entonces el producto Kronecker es una matriz de m*p x n*q que se define como: El producto Kronecker en MatLab se implementa por medio de la función kron(A, B). Producto Punto El producto escalar entre dos vectores columna, con el mismo número de filas A y B, puede ser calculado de dos formas: utilizando la función dot, por ejemplo dot(A, B), o por medio de la multiplicación de matrices, es decir, A’*B. La función dot puede usarse también en arreglos multimensionales, en tal caso, retorna el producto escalar sobre la primera dimensión de los dos vectores. Si se desea sobre alguna dimensión en particular, se utiliza la versión dot(A,B,dim), la cual retorna el producto escalar de los dos vectores sobre la dimensión dim. 45 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Producto cruz Dado que el producto cruz es una operación binaria de dos vectores en un espacio tridimensional y su resultando es un vector perpendicular a los dos vectores iniciales, el requisito primordial para realizar el producto cruz en MatLab es que los vectores con los cuales se realiza el producto cruz sean vectores fila de tres (3) elementos. Si los vectores son multidimensionales, deben tener tres elementos sobre la primera dimensión, que es aquella sobre la cual se realiza el producto cruz: Cross(A,B). El producto cruz puede aplicarse a vectores multidimensionales sobre la dimensión que se desee, así por ejemplo cross(A,B, dim)calcula el producto cruz sobre la dimensión dim, la cual debe contener, en cada arreglo, tres (3) elementos. Ejemplo 5. Uso de operadores matriciales Operaciones Matriciales a a = [1; 2; 3] 1 2 3 b b = [4; 5; 6] 4 5 6 a’ 1 2 3 b’ 4 5 6 a+b a+2 5 7 9 3 4 5 a-b a-2 a*b Error a.*b a’*b 32 a’.*b a*2 a/b a\b 46 Operaciones de Arrays 2 4 6 0 0 1/6 0 0 1/3 0 0 1/2 16/7 a.*2 a./b a.\b -3 -3 -3 -1 0 1 4 10 18 Error 2 4 6 1/4 2/5 1/2 4 5/2 2 continua Capítulo 3 / Vectores, Matrices y Arreglos continuación Operaciones Matriciales 2/a a/2 1/2 1 3/2 1/2 1 3/2 Operaciones de Arrays 2./a a./2 a^b Error a.^b a^2 Error a.^2 2^a Error 2.^a (a+i*b)’ 1-4i 2-5i 3-6i (a+i*b).’ 1+4i 2+5i 3+6i dot(a,b) 32 cross(a, b) kron(a,b) -3 6 -3 4 5 6 8 10 12 12 15 18 2 1 2/3 1/2 1 3/2 1 32 729 1 4 9 24 8 dot(a’,b) 32 cross(a’, b) -3 6 -3 kron(a’,b) 4 8 12 5 10 15 6 12 18 Contenedores: Estructuras y CellArrays Bajo ciertas circunstancias, es necesario almacenar información de diferente tipo y organizada jerárquicamente en un mismo contenedor, lo cual no es posible hacer a través con matrices, incluso multidimensionales. En estos casos, MatLab provee dos tipos de datos para realizar esta tarea: las estructuras (struct) y los cellarrays. 47 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Estructuras Una estructura es un tipo de datos de MatLab que provee funcionalidades para almacenar datos de forma jerárquica en una única entidad; de manera sencilla, se puede entender que la estructura permite agrupar datos de diferente tipo, bajo un mismo contenedor. Una estructura está conformada por los denominados campos (fields), cada uno de los cuales corresponde a un arreglo de un tipo de datos determinado. A manera de ejemplo, se requiere almacenar la información de un estudiante, sus notas y las asignaturas que cursa, esto puede hacerse a través de una estructura. Figura 4. Ejemplo de Agregación de información con estructura Datos notas 3.8 4.0 2.6 4.5 3.2 Asignaturas Calculo Fisica nombre Carlos Sociales En la Figura 4. Ejemplo de Agregación de información con estructura, se muestra la estructura denominada “Datos” que contiene tres (3) campos: “Notas”, “Nombre” y “Asignaturas”. Como puede observarse, cada campo almacena información diferente, notas es un arreglo de números, nombre es una cadena de caracteres y asignaturas es un arreglo de cadenas de caracteres. De la misma forma, la estructura podría contener vectores o matrices multidimensionales. Así mismo, aunque se almacenen arreglos en una estructura no se exige que todos ellos tengan el mismo número de elementos; así, en el ejemplo propuesto, notas tiene: cinco elementos; nombre tiene: un único elemento y asignaturas tiene: tres elementos. Como todos los tipos de datos en MatLab, una estructura en realidad es un arreglo, de esta forma, dado que el tipo de datos struct define estructuras, un arreglo de estructuras se define como un struct array. Es más, cada estructura dentro de un arreglo de estructuras, puede contener una configuración totalmente diferente entre sí (véase Figura 5. Array de estructuras). 48 Capítulo 3 / Vectores, Matrices y Arreglos Figura 5. Array de estructuras Datos Datos(1) Datos(2) notas 3.8 4.0 2.6 4.5 3.2 notas 3.1 2.0 Asignaturas Calculo Fisica Asignaturas Español Calculo nombre Carlos Sociales nombre Maria Aunque por consistencia lógica en el ejemplo previo las estructuras mostradas tienen los mismos tipos de datos en cada uno de los campos, aunque los arreglos son de diferente tamaño en cada caso, puede presentarse el caso donde campos distintos en diferentes posiciones del arreglo de estructuras contengan incluso tipos de datos diferentes. Para crear una estructura se utiliza la sentencia struct('nombre_cam- po1', valores, 'nombre_campo2', valores, . . ., 'nombre_campon', valores). Por ejemplo, para construir la estructura que se presenta en la Figura 4. Ejemplo de Agregación de información con estructura, se haría de la siguiente forma: Datos = struct('notas', [3.8 4.0 2.6 4.5 3.2], 'nombre', 'carlos', 'Asignaguras', ['Calculo ' 'Fisica ' 'Sociales']) Cuando se ejecuta el comando de creación de la estructura, MatLab presenta el siguiente mensaje: Datos = notas: [3.8000 4 2.6000 4.5000 3.2000] nombre: 'carlos' Asignaturas: 'Calculo Fisica Sociales' Para acceder a los campos de la estructura, se coloca el nombre de la estructura, el operador punto (.) y luego, el nombre del campo; así por ejemplo, para acceder (o cambiar) el campo nombre: Datos.nombre 49 Guía de uso de Matlab en el desarrollo de modelos de volatilidad La respuesta en la ventana de comandos en MatLab es: ans = carlos Para modificar el campo: Datos.nombre = 'Pedro' La estructura modificada se verá como: Datos = notas: [3.8000 4 2.6000 4.5000 3.2000] nombre: 'Pedro' Asignaturas: 'Calculo Fisica Sociales' Para crear arreglos de estructuras, se utiliza el operador corchetes {}. Por ejemplo, para construir el arreglo de estructuras que se presentan en la Figura 5. Array de estructuras: Datos = struct('notas', { [3.8 4.0 2.6 4.5 3.2], [3.1 2.0]} , 'nombre', {'carlos', 'Maria'}, 'Asignaguras', { ['Calculo ' 'Fisica ' 'Sociales'], ['Español' 'Calculo']}) Una vez creada la estructura, MatLab presentará el siguiente mensaje: Datos = 1x2 struct array with fields: notas nombre Asignaturas Para acceder a los elementos del arreglo de la estructura, se indica el elemento y luego su campo, así por ejemplo, para acceder a la totalidad del primer elemento la instrucción Datos(1) retorna: 50 Capítulo 3 / Vectores, Matrices y Arreglos ans = notas: [3.8000 4 2.6000 4.5000 3.2000] nombre: 'carlos' asignaturas: 'Calculo Fisica Sociales' Para modificar el nombre, se utiliza la instrucción Datos(1).nombre = 'Pedro'. Algunas de las funciones principales para el manejo de estructuras se presentan a continuación: Tabla 15. Funciones de manipulación de struc Función fieldnames(X) getfield(nombre) isfield(nombre) Descripción Valor de retorno Retorna los nombres de los campos de la estructura X. Retorna el valor del campo especificado. Determina si el campo pertenece o no a la estructura. Cellarray de strings con los nombres de los campos true= sí pertenece y false no pertenece CellArrays La principal diferencia entre una estructura y un cellarray es la siguiente: en el primero, los campos se diferencian por un nombre, mientras que en el cellarray, los campos se acceden por un índice numérico. De esta forma, el cellarray también permite almacenar datos heterogéneos en un mismo elemento. En términos generales, un cellarray es una colección de contenedores denominados celdas en las cuales se pueden almacenar diferentes tipos de datos. En palabras sencillas, un cellarray es una matriz donde cada elemento puede almacenar cualquier otro tipo de datos, incluyendo estructuras (struct) u otros cellarray. Un cellarray debe ser rectangular, pues todos los arreglos se deben hacer así en MatLab. La creación de un cellarray es igual que un struct, con la diferencia que no se utiliza la instrucción struct ni se asignan nombres a los nombres de los campos. 51 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Si se representa el ejemplo de la Figura 4. Ejemplo de Agregación de información con estructura como una matriz cellarray, quedará de la siguiente forma: Datos = {[3.8 4.0 2.6 4.5 3.2], 'carlos', ['Calculo ' 'Fisica ' 'Sociales']} El resultado de la creación del cellarray es: Datos = [1x5 double] 'carlos' [1x24 char] Los cellarrays se pueden crear con múltiples columnas, separando los campos por punto y coma (;) entre filas. Si se utiliza la siguiente instrucción: Datos = {[3.8 4.0 2.6 4.5 3.2], 'carlos'; ['Calculo ' 'Fisica ' 'Sociales']} Si resulta en un error (CAT arguments dimensions are not consistent), se debe a la forma como se expuso previamente, pues debe ser siempre rectangular. Esto se corrige incluyendo una columna adicional en la segunda fila del cellarray: Datos = {[3.8 4.0 2.6 4.5 3.2], 'carlos'; ['Calculo ' 'Fisica ' 'Sociales'], NaN} El resultado de la creación del cellarray es: Datos = [1x5 double] 'carlos' [1x24 char] [NaN] Los cellarray pueden crearse también celda por celda, utilizando el operador paréntesis y las celdas separadas por coma; por ejemplo, la creación del cellarray del ejemplo debe quedar así: Datos(1,1) Datos(1,2) Datos(2,1) Datos(2,2) 52 = = = = [3.8 4.0 2.6 4.5 3.2]; 'carlos'; ['Calculo ' 'Fisica ' 'Sociales']; NaN; Capítulo 3 / Vectores, Matrices y Arreglos Si se desea preasignar memoria al cellarray, se puede utilizar la instrucción cell(número_filas, número_columnas), y luego la instrucción nombre_cellArray{número_filas, número_columnas} = [] para crear un cellarray de número_filas x número_columnas vacío, por ejemplo: A = cell(5,5); A{5, 5} = [] Crea un cellarray de 5 x 5 vacío. Si se desea ver una representación gráfica del cellarray, se utiliza la función cellplot. Figura 6. Representación gráfica de un cellarray Carlos NaN A continuación, se presentan algunas de las funciones primordiales de manipulación de un cellarray. 53 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Tabla 16. Funciones de manipulación del cellarray Función Descripción cell(m,n) Crea un cellarray de m filas y n columnas ndims(X) Retorna el número de dimensiones del cellarray X celldisp(X) Muestra el contenido de todas las celdas del cellarray X cellplot(X) Muestra una representación gráfica del cellarray X iscell(X) Determina si X es un cellarray struct2cell(X) Convierte la estructura X a un cellarray cellfun(@fun, X) Aplica la función fun a todas las celdas del cellarray X num2cell(X) Convierte el arreglo numérico X en un cellarray cell2struct(X) Convierte el cellarray X a estructura Análisis Matricial MatLab provee una serie de funciones que permiten realizar análisis matricial, a continuación se presentan las más comunes de ellas: Rango de una matriz Por medio de la función rank, se puede determinar el máximo número de columnas o filas linealmente independientes que corresponde al rango de una matriz. Determinante de una matriz La instrucción det(X) retorna el determinante de la matriz X. Es importante que la matriz sobre la cual se evalúa el determinante, sea cuadrada. 54 Capítulo 3 / Vectores, Matrices y Arreglos Valores y vectores propios de una matriz Para determinar los valores y vectores propios de una matriz, se utiliza la instrucción eig de la siguiente forma: [V,D] = eig(x) Donde V es una matriz de vectores propios y D es la matriz de valores propios de la matriz X, de tal forma que la relación A* V = V * D que es la definición formal de vector y valor propio. Descomposición de Cholesky La descomposición o el triángulo de Cholesky es una descomposición de una matriz simétrica positiva definida, en el producto de una matriz triangular y su transpuesta conjugada. Existen diversas formas de utilizar la función chol que realiza la descomposición de Cholesky, sin embargo, la forma tradicional de usarla es: [R,p] = chol(x) Donde A es una matriz positiva definida, R es la matriz superior triangular y p es cero. Se debe cumplir la relación R´ * R = A. En caso que A no sea positiva definida, p es una valor positivo. Otras funciones sobre matrices MatLab provee múltiples funciones sobre matrices y prácticamente cualquier función que se aplique a un escalar puede replicarse sobre los elementos de una matriz, a continuación se presentan algunas funciones de utilidad y uso común en matrices. 55 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Tabla 17. Algunas funciones sobre matrices Función diff sum cumsum Descripción Calcula las diferencias entre elementos adyacentes de la matriz, generando un nuevo vector, con un elemento menos que el vector original. Suma los elementos de un arreglo. Si X es un vector de n elementos, sum(X) corresponde a Ejemplo diff(X) Crea el vector [X(2)-X(1) X(3)-X(2) . . . X(n)-X(n-1)] sum(X) sum(X, dim) suma los elementos de X en la dimensión dim Retorna la suma acumulada en las diferentes dimensiones de un arreglo. Si X es un vector de n elemen- cumsum(X) tos, cumsum(X) corresponde al cumsum(X,dim) vector y que contiene los elementos y(k) tal que y(k) prod cumprod log 56 Retorna los productos a lo largo de las diferentes dimensiones de un arreglo. Si X es un vector de n elementos, prod(X) corresponde a Retorna el producto acumulado a lo largo de las diferentes dimensiones de un arreglo. Si X es un vector de n elementos, cumprod(X) corresponde al vector y que contiene los elementos y(k) tal que y(k) Calcula el logaritmo natural de todos los elementos del vector. prod(X) prod(X,dim) cumprod(X) cumprod(X,dim) log(X) Capítulo 4 Gráficos en MatLab Gráficos en MatLab MatLab permite realizar diferentes tipos de gráficos, tanto bidimensionales como tridimensionales. Para los efectos de este documento, se presentarán ejemplos en dos dimensiones que pueden ser extendidos a tres dimensiones. Para representar variables en un plano bi o tridimensional, existen diversos comandos; sin embargo, el comando plot es el más ampliamente utilizado. En la Tabla 18. Uso del comando plot, se presentan las distintas formas de utilizar este comando. Tabla 18. Uso del comando plot Uso Descripción Dibuja las columnas de Y contra el subíndice de Y. Si Y es complejo, dibuja la parte real contra la compleja. Dibuja cada vector Yi contra el vector Xi en el mismo plot(X1, Y1, X2, Y2, eje. Si Xi es un escalar y Yi es un vector, dibuja Yi pun…, Xn, Yn) tos discretos verticalmente en Xi. plot(X1, Y1, LineSDibuja las líneas definidas por la tripleta Xi, Yi, Lipec, X2, Y2, LineSpec, donde LineSpec especifica el tipo de línea, neSpec, …, Xn, Yn, marcador y color. LineSpec) plot(Y) Por ejemplo: x = -2*pi:.1:2*pi; y = cos(x); plot(x,y) 59 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Ejemplo6. Uso del comando plot En el LineSpec, se especifica el color y marcador de la línea a utilizar; adicionalmente, se puede especificar el estilo de la línea, el ancho de la línea, el color, el tamaño del marcador, entre otras características. Especificación de líneas El tipo de línea se especifica según la Tabla 19 - Especificación de estilo de línea. Tabla 19. Especificación de estilo de línea Especificador 60 Tipo de línea '-' Línea sólida (Default) '--' Línea intercalada ':' Línea punteada '-.' Línea de punto-línea 'none' Sin línea Capítulo 4 / Gráficos en MatLab Especificación de marcadores Al igual que las líneas, los marcadores pueden especificarse según se muestra a continuación: Tabla 20. Especificación de marcadores Especificador Tipo de Marcador '+' Signo más (+) 'o' Círculo '.' Punto (•) '*' Asterisco (*) 'x' Cruz 's' Cuadrado (□) 'd' Diamante (◊) '^' Triángulo apuntando hacia arriba 'v' Triángulo apuntando hacia abajo '<' Triángulo apuntando a la izquierda '>' Triángulo apuntando a la derecha 'p' Pentagrama (estrella de 5 puntas) 'h' Hexagrama (estrella de 6 puntas) 'none' No marcador, default 61 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Especificación de color Los colores se especifican según se presentan a continuación: Tabla 21. Especificación de colores Especificador Tipo de Color 'r' Rojo 'b' Azul 'g' Verde 'm' Magenta 'y' Amarillo 'k' Negro 'w' Blanco 'c' Cyan figure t = -2*pi:.1:2*pi; y = cos(x); plot(t,cos(t),'-.m*') Dibujará una línea punteada, magenta con asteriscos como marcadores. Otros comandos de utilidad Existen diversos comandos de utilidad en lo que respecta a la manipulación de gráficos en MatLab. A saber: Comando hold El comando hold determina si las nuevas gráficas se adicionan a la gráfica actual o si eliminan y reemplazan la información. Así, el comando hold 62 Capítulo 4 / Gráficos en MatLab on, retiene la gráfica actual y las propiedades de los ejes, de tal forma que las gráficas subsecuentes sean adicionadas a la gráfica existente. Por ejemplo, figure t = -2*pi:pi/20:2*pi; plot(t,cos(t),'-.bo') hold on plot(t,cos(t-pi/2),'--rs') plot(t,cos(t-pi),':g<') hold off Ejemplo 7. Comando hold on/off Comando subplot El comando subplot divide la figura actual en secciones rectangulares. De esta forma, el comando subplot(m,n,p) divide la ventana de la figura en una matriz de mxn. 63 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Ejemplo: figure subplot(2,2,1) text(.5,.5,{'subplot(2,2,1)';'o subplot 221'},… 'FontSize',14,'HorizontalAlignment','center') subplot(2,2,2) text(.5,.5,{'subplot(2,2,2)';'o subplot 222'},… 'FontSize',14,'HorizontalAlignment','center') subplot(2,2,3) text(.5,.5,{'subplot(2,2,3)';'o subplot 223'},… 'FontSize',14,'HorizontalAlignment','center') subplot(2,2,4) text(.5,.5,{'subplot(2,2,4)';'o subplot 224'},… 'FontSize',14,'HorizontalAlignment','center') Figura 7. Comando subplot 1 0.8 0.6 0.4 0.2 0 0 1 0.8 0.6 0.4 0.2 0 0 1 0.8 0.6 subplot (2,2,1) o subplot 221 0.5 0.4 1 0 0 1 0.8 0.6 subplot (2,2,3) o subplot 223 0.5 0.2 0.4 1 0.2 0 0 subplot (2,2,2) o subplot 222 0.5 1 subplot (2,2,4) o subplot 224 0.5 1 Si se requiere que una o más figuras ocupen más de una sección, se puede utilizar el comando subplot también, así: 64 Capítulo 4 / Gráficos en MatLab Ejemplo, subplots asimétricos: figure subplot(2,2,[1 3]) text(.5,.5,'subplot(2,2,[1 3])',… 'FontSize',14,'HorizontalAlignment','center') subplot(2,2,2) text(.5,.5,'subplot(2,2,2)',… 'FontSize',14,'HorizontalAlignment','center') subplot(2,2,4) text(.5,.5,'subplot(2,2,4)',… 'FontSize',14,'HorizontalAlignment','center') Figura 8. Comando subplot asimétrico 1 1 0.8 0.9 0.6 0.8 0.4 0.7 0.6 0.5 0.4 0.2 0 0 subplot (2,2,[13]) 0.8 0.6 0.2 0 0 0.4 0.5 0.5 1 0.3 0.1 subplot (2,2,2) 1 0.2 1 subplot (2,2,4) 0 0 0.5 1 Asignación de títulos y valores en los ejes La asignación de títulos de gráficos, se hace por medio del comando title. Si se desea modificar el título de los ejes, se emplean los comandos xlabel y ylabel. Cuando en uno de los ejes (generalmente el eje horizontal) se manejan fechas, se utiliza la función datetick. 65 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Tabla 17. Manejo de comandos title, xlabel, ylabel y datetick Comando title('string') xlabel('string') ylabel('string') datetick(tickaxis, dateformat) 66 Descripción Ejemplo title('Gráfica de coseno(\Theta)') Agrega el título Gráfica de coseno(θ) xlabel('-\pi \leq \ Theta \leq \pi') Agrega la cadena de texto como rótulo del eje de las x. Agrega como título del eje de las x la leyenda –π≤ θ≤ π ylabel('cos(\ Theta)') Agrega la cadena de texto Agrega como título del como rótulo del eje de las y. eje de las x la leyenda coseno(θ) datetick('x','mmm' Define el eje tickaxis Define que el eje x contiene como eje que contiene fefechas y deben presentarchas que se despliegan en el se en el formato mmm (p.e, formato dateformat. Jan para enero) Agrega la cadena de texto como título del gráfico. Capítulo 5 Manejo de archivos en MatLab Manejo de archivos en MatLab MatLab provee diversos métodos para almacenar información de una sesión de trabajo. El comando diary El comando diary permite almacenar todas las entradas y salidas de MatLab de la sesión actual de trabajo. De esta forma, se crea un log de las entradas por teclado y los resultados de salida de tipo texto (no incluye gráficas ni otros elementos de este tipo). Tabla 22. Uso del comando diary Comando Descripción diary filename Escribe una copia de todas las entradas de teclado subsecuentes y las salidas resultantes en el archivo especificado. El argumento filename es la ruta completa de ubicación del archivo log, si solo contiene el nombre del archivo, se almacenará en el directorio de MatLab actualmente activo. diary off Suspende la escritura en el archivo. diary on Reanuda la escritura en el archivo log actual. Salvar y almacenar variables de MatLab En los casos en los que se requiera almacenar el valor de las variables de MatLab para procesamiento futuro, es necesario almacenar la información en el formato binario de MatLab con el fin que se mantenga la precisión completa de dichas variables. El formato binario de MatLab se denomina MAT-files y los archivos generados tienen la extensión .mat. Para almace69 Guía de uso de Matlab en el desarrollo de modelos de volatilidad nar los valores de las variables, se utiliza el comando save, mientras que el comando load carga el archivo de variables. Tabla 23. Uso del comando save y load Comando save(filename) save(filename, variables) load(filename) Load(filename, varibles) Descripción Almacena todas las variables del workspace actual y activo, en MatLab, en un MAT-file llamado filename . Almacena solo las variables especificadas. Carga las variables del MAT-file llamado filename en el workspace actual. Carga las variables especificadas del MAT-file. Leer y guardar archivos de Excel y CSV MatLab soporta la importación y exportación de información de dos formatos adicionales, archivos: CSV (comma separated values) y Excel. Tabla 24. Comandos para manipulación de archivos Excel y CSV Comando Descripción Lee los datos de la primera hoja del archivo de Excel llamado filename y retorna los valores [num,txt,raw] = numéricos en el arreglo num. Opcionalmente, xlsread(filename) retorna los encabezados de las columnas en el arreglo txt y los datos no procesados (valores y texto) en el arreglo raw. Abre una ventana de Excel para seleccionar in[num,txt,raw] = teractivamente los datos (data), de la hoja de xlsread(filename,-1) cálculo llamada filename. [num,txt,raw] = Lee los datos de la hoja sheet del archivo de xlsread(filename,sheet) Excel llamado filename. Escribe el arreglo A en la primera hoja del arxlswrite(filename,A) chivo de Excel filename empezando en la celda A1. Escribe el arreglo A en la hoja sheet del arxlswrite(filename,A,sheet) chivo de Excel filename empezando en la celda A1. 70 Capítulo 5 / Manejo de archivos en MatLab A = csvread(filename) Cvswrite(filename, A) Lee el archivo separado por comas llamado filename. El resultado se almacena en el vector A. El archivo solo puede contener valores numéricos. Escribe la matriz A en el archivo separado por comas filename. Ejemplo Escritura en un archivo de Excel: valores = {1, 2, 3 ; 4, 5, ‘x’ ; 7, 8, 9}; encabezados = {'Primera', 'Segunda', 'Tercera'}; xlswrite('Ejemplo.xls', [encabezados; valores]); La hoja1 del archivo Ejemplo contiene: Primera 1 4 7 Segunda 2 5 8 Tercera 3 x 9 Lectura del archivo: A = xlsread('Ejemplo.xls') xlsread retornará: A = 1 2 3 4 5 NaN 7 8 9 Archivos de script M-files Para problemas simples, digitar las instrucciones en la ventana de comandos es una forma sencilla y eficiente de trabajar. Sin embargo, cuando el número de instrucciones aumenta, así como su complejidad, y adicionalmente se desea reutilizar los comandos en otra oportunidad, se hace necesario contar con una forma de almacenar los comandos y poderlos ejecutar. 71 Guía de uso de Matlab en el desarrollo de modelos de volatilidad En estos casos, se desarrolla lo que se denomina un script, que no es más que una secuencia de comandos almacenados en un archivo de texto. MatLab puede abrir y ejecutar comandos de la misma forma como si fuesen digitados en la ventana de comandos. Este tipo de archivos se denominan M-files y su extensión es .m. Los archivos M-files son archivos de texto que pueden ser creados y modificados en cualquier editor de texto, sin embargo, MatLab provee un editor propio denominado el EditorM-file, el cual se puede acceder seleccionando File → New → M-file. Figura 9. Archivo de texto M-file Para ejecutar el script, desde el M-file editor, seleccione File → Run Script. Una forma alterna es utilizar el comando Debug → Save And Run o presionando la Tecla F5. 72 Capítulo 5 / Manejo de archivos en MatLab Algunas sugerencias para el manejo de M-files 1. Asigne un nombre significativo al script, es decir, que tenga relación con el propósito del script. 2. No asigne como nombre del script, el mismo nombre de alguna variable que se calcula dentro del mismo, pues MatLab no podrá ejecutar dicho script más de una vez, a menos que el valor de dicha variable se limpie, porque luego de la primera ejecución, en el workspace, quedará la variable ―con el mismo nombre del script cargada―. 3. No asigne al script, el mismo nombre de una función o comando de MatLab. Para verificar la existencia del nombre utilice el comando which. 4. Trate de mantener las convenciones de asignación de nombres de variables de MatLab, es decir, debe comenzar por una letra, puede incluir dígitos y el carácter underscore. 73 Capítulo 6 Fundamentos de programación en MatLab Fundamentos de programación en MatLab Dentro de un archivo M-File existe una serie de comandos o acciones. Cuando una acción (instrucción) sigue otra en secuencia, es decir, las acciones se realizan siguiendo un orden preciso preestablecido de manera que una instrucción se realiza inmediatamente después de otra, se dice que se establece una Estructura Secuencial. De esta forma, el flujo del programa coincide exactamente con el orden en el cual se han escrito dichas instrucciones. Control de flujo – Estructuras de selección Sin embargo, generalmente un programa no se compone de una serie de instrucciones que se siguen en un orden establecido, sino que requiere la ejecución de una serie de acciones, que son más complicadas respecto a una lista sencilla de instrucciones. Uno de estos casos se presenta cuando existen una serie de posibles alternativas que se ejecutarán en función del cumplimiento de determinadas condiciones. De esta manera, es necesario que el programa realice una serie de acciones en función del cumplimiento o no, de determinadas sentencias. Para esto se utilizan las Estructuras de Selección. Definición: una estructura de selección es aquella en la cual determinadas acciones o instrucciones, se ejecutan según se cumplan o no determinadas condiciones. Las estructuras de selección se utilizan con el fin de tomar decisiones lógicas, de tal forma que también se denominan: estructuras de decisión o alternativas. 77 Guía de uso de Matlab en el desarrollo de modelos de volatilidad En este tipo de estructuras, se evalúa una o varias condiciones y en función del resultado retornado, se ejecuta una o varias instrucciones. Las condiciones se definen por medio de expresiones lógicas. Para evaluar las condiciones, se hace uso de los denominados operadores lógicos. Para los operadores lógicos y relacionales, una condición se denomina como verdadera si contiene un valor distinto de cero y falsa, lo contrario. La respuesta de un operador lógico es uno (1), si es verdadero y cero (0), si es falso. Tabla 25. Operadores relacionales y lógicos Operador Descripción | Menor que. Retorna a verdadero si el operando de la izquierda es exclusivamente menor que el operando de la derecha. Menor o igual que. Retorna a verdadero si el operando de la izquierda es menor o igual que el operando de la derecha. Mayor que. Retorna a verdadero si el operando de la izquierda es exclusivamente mayor que el operando de la derecha. Mayor o igual que. Retorna a verdadero si el operando de la izquierda es mayor o igual que el operando de la derecha. Igual. Retorna a verdadero si el operando de la izquierda es exactamente igual que el operando de la derecha. Diferente. Retorna a verdadero si el operando de la izquierda es diferente que el operando de la derecha. Operador Y. Retorna a verdadero si los dos operandos son verdaderos. Operador O. Retorna a verdadero si cualquiera de los dos operandos son verdaderos. ~ Operador no < <= > >= == ~= & xor(A,B) O exclusivo: retorna 1 si A o B son Verdaderos; retorna a Falso si A y B son los dos Falsos o los dos son Verdaderos. Ejemplo A<B A<=B A>B A>=B A == B A ~= B A & B A | B ~A xor(A,B) En conjunto con los operadores relacionales y lógicos, MatLab provee un conjunto de instrucciones que permiten realizar control de flujo de programas. 78 Capítulo 6 / Fundamentos de programación en MatLab Estructura if simple Las estructuras de selección simples evalúan una sola condición o conjunto de condiciones; y dependiendo del resultado retornado, se ejecuta una acción si este resultado es verdadero y, o de lo contrario, es decir, si el resultado de la instrucción es falso, no realiza ninguna acción. Las estructuras de selección simple se representa en MatLab, con la instrucción (sintaxis varias líneas): if (Condición o condiciones) <instrucciones> end Donde condición o condiciones es una expresión(es) numérica(s) o de cadena(s) que puede ser evaluada como verdadero (True) o falso (False). Las condiciones de evaluación pueden combinarse por medio de los operadores lógicos (AND, OR, NOT, XOR). Ejemplo if A <= B disp('A es menor o igual a B') end Estructura if doble Las estructuras de selección simples son bastante limitadas y rígidas. Generalmente en un programa requiere de estructuras que permitan por lo menos evaluar entre dos (2) opciones, es decir, si se cumple la condición o condiciones, se realicen una serie de instrucciones; y si no se cumple dicha condición(es), se realiza una serie diferente de instrucciones. Para realizar este tipo de acciones, se utilizan las estructuras de selección dobles, las cuales se construyen, como se describe a continuación: if (Condición o condiciones) <instrucciones-Verdadero> 79 Guía de uso de Matlab en el desarrollo de modelos de volatilidad else <instrucciones-Falso> end Ejemplo: if A <= B disp('A es menor o igual a B') else disp('A es mayor que B') end Estructura if múltiple Las estructuras de selección simple, se emplean para ejecutar una sola instrucción cuando una condición es verdadera; de otro lado, las estructuras de selección doble, se emplean para ejecutar unas instrucciones determinadas si una condición es Verdadera y ejecutar otro grupo de instrucciones si la condición es Falsa. Las estructuras de selección múltiple se utilizan para comprobar una segunda condición si la primera condición es Falsa. Usualmente se requiere que existan más de dos elecciones posibles, de tal forma que se puedan ejecutar determinadas acciones dependiendo del resultado que se obtenga al evaluar una expresión o expresiones. Dependiendo del tipo y número de expresiones a evaluar, se utilizarán diferentes estructuras de selección múltiple. En MatLab existen dos tipos de instrucciones para representar estructuras de selección múltiples, que en función de su nivel de complejidad son: • • Función switch Instrucción if – elseif – else – end Función switch La función switch evalúa una lista de expresiones y devuelve un valor o una expresión asociada a la primera instrucción de la lista que produce como resultado: Verdadero (True). 80 Capítulo 6 / Fundamentos de programación en MatLab La sintaxis de la función switch es como sigue: switch expresión-prueba [case lista_expresión-n [instrucciones-n]] . . . [otherwise [instrucciones_else]] end Donde: Expresión-prueba es la expresión que será evaluada. Puede ser de tipo numérico o de cadena de caracteres. Lista_expresión-n es una lista delimitada por comas y encerradas en corchetes {}: expresión, expresión. Solo si el primer conjunto de expresiones asociadas al primer caso se cumplen, es ejecutada. Pero si no existen coincidencias, las instrucciones del otherwise, se ejecutan. En general, la instrucción switch se emplea para evaluar una expresión que puede tomar n valores distintos, de tal forma que en función del valor que tome la expresión, se realizará una serie de acciones distintas asociadas al primer valor que, entre los valores a los que está ligado, cuente con el obtenido al evaluar la expresión. Ejemplo: switch Número case {1,2,4,5} disp('Entre case {6, 7, 8} disp('Entre case {9, 10} disp('Entre otherwise disp('Mayor end 1 y 5') 6 y 8') 9 y 10') a 10') 81 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Instrucción if . . . elseif . . . else . . . end El método alterno para evaluar estructuras de selección múltiples es el empleo de la instrucción if . . . elseif . . . else . . . end . Esta instrucción trabaja de manera similar a la instrucción if . . . else . . . end; con la diferencia que en lugar de evaluar una sola condición y determinar si es Falsa o Verdadera, evalúa la primera condición; en caso de resultar Falsa, evalúa la segunda, y así sucesivamente hasta que encuentre una condición que se cumpla para realizar una serie de instrucciones. Si ninguna de las condiciones es verdadera, se ejecutan las acciones contempladas en el caso else. La sintaxis de formato de bloque para esta instrucción es como sigue: if condición [instrucciones] [elseif condición-n [instrucciones_elseif] … [else [instrucciones_else]] end Ejemplo: if rendimiento == 1 bonificación = salario * 0.1 elseif rendimiento == 2 bonificación = salario * 0.09 elseif rendimiento == 3 bonificación = salario * 0.07 else bonificación = 0 end De esta forma, se pueden añadir instrucciones elseif a una instrucción if . . . else para comprobar una segunda condición si la primera es falsa. Por ejemplo, el siguiente procedimiento calcula una bonificación salarial dependiendo de la clasificación del trabajador. La instrucción que sigue a la instrucción else sólo se ejecuta cuando las condiciones de todas las restantes instrucciones if y elseif son Falsos. 82 Capítulo 6 / Fundamentos de programación en MatLab Cada estructura de selección y sus tipos de representación en MatLab tienen un objetivo claro y específico, para utilizar la estructura y el tipo de representación que se ajuste a sus necesidades, así como concepto del programa y requerimientos del problema. En general, si sus condiciones y acciones pueden asociarse con un tipo de datos específico (valor) o si sus condiciones reciben un valor específico, y, en función de ese valor, se ejecuta una acción o grupo de acciones, utilice la instrucción switch. En caso que su problema no se ajuste a ninguna de estas características, utilice la instrucción if . . . elseif . . . else . . . end. Es importante recalcar que las instrucciones de tipo if . . . elseif . . . else . . . end son más flexibles en cuanto al tipo de condiciones a evaluar y a las acciones a realizar, por lo que pueden ser implementadas en cualquier tipo de requerimiento. Todo depende del tipo de estructura con la cual se sienta cómodo. Estructuras de selección anidadas Las estructuras de selección se pueden anidar o encajar, es decir, introducir unas en el interior de otras, con el fin de realizar un análisis un poco más complejo. De las dos estructuras de selección estudiadas en este apartado (switch e if .. else – y sus combinaciones), tan solo las de tipo if .. else se pueden anidar. La estructura de selección anidada típica se escribe tal y como se presenta a continuación: if <condición1> if <condición2> %Esta estructura está anidada <acciones2> else <acciones-else2> end %Fin estructura anidada else <acciones3> end Obsérvese que la estructura anidada se “cierra” completamente dentro de la estructura contenedora. No se puede cerrar una estructura anidada fuera de su estructura contenedora. Es decir, no se pueden tener estructuras de 83 Guía de uso de Matlab en el desarrollo de modelos de volatilidad selección anidadas superpuestas. También es importante recalcar que las estructuras anidadas pueden no ser del mismo tipo de instrucción, es decir, se pueden anidar, en el caso de estructuras de selección, una o varias instrucciones switch dentro de una estructura if . . . else. Adicionalmente, las estructuras anidadas pueden reemplazar las estructuras de selección múltiple. Sin embargo, la utilización de estructuras anidadas en reemplazo de estructuras de selección múltiple aumenta la complejidad del código, haciendo más difícil su corrección, mantenimiento y detección de errores. Una estructura de selección de n alternativas o de decisión múltiple, puede ser construida utilizando una estructura con el siguiente formato: if <condición 1> <acciones1> else if <condición2> <acciones2> else if <condición3> <acciones3> . . . . . . end end end También pueden utilizarse cuando se realizan análisis similares al realizado por una estructura de selección múltiple, pero con la diferencia que en el caso de estructuras anidadas, para que se realicen determinadas acciones en función de algunas condiciones, tuvo que cumplirse una condición con anterioridad. Generalmente, las estructuras de selección anidadas se utilizan en conjunción con estructuras de selección múltiple. Dado que el anidado de estructuras de selección llegan a ser bastante complejas, para que el programa sea claro, es preciso utilizar identación (sangría), de modo que exista una correspondencia entre bloques de estructuras de selección. 84 Capítulo 6 / Fundamentos de programación en MatLab Estructuras de iteración Las estructuras de iteración, también denominadas bucles o ciclos (loops), se utilizan para realizar un proceso repetidas veces. Este proceso se repite mientras se cumpla una determinada condición o condiciones. Hay que prestar especial atención a los loops infinitos, hecho que ocurre cuando la condición de finalizar el bucle no se llega a cumplir nunca. Se trata de un error muy típico de programación y debe prevenirse al máximo. Generalmente, una iteración se especifica con los siguientes componentes: 1. 2. 3. 4. 5. Inicialización: se asignan valores iniciales a cantidades usadas en el ciclo antes que inicie la iteración. Variables de control: una o más variables que toman nuevos valores para cada repetición sucesiva. Instrucciones sucesivas: una o más instrucciones que asignan nuevos valores a las variables de control como preparación para la siguiente repetición. Cuerpo del ciclo: secuencia de cero o más instrucciones que se ejecutan una vez por cada iteración. Condición de continuación: expresión lógica o relacional que se prueba antes o después de cada repetición. Si la condición es verdadera, entonces se realiza la siguiente repetición, de lo contrario el control fluye a la instrucción del programa que se encuentra después del ciclo. En términos generales, hasta donde sea posible, se debe evitar el uso de ciclos, debido a que incrementan de forma substancial el tiempo y los recursos necesarios para la ejecución del script. Cuando se trabaja con arreglos (matrices o vectores) es común su manipulación por medio de ciclos. Como práctica recomendada es el pre-asignar memoria a todos los arreglos, con el fin de evitar que en cada iteración, MatLab tenga que aumentar el tamaño del arreglo de forma automática. 85 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Conceptos Preliminares Antes de seguir con los conceptos de las estructuras de iteración utilizadas en MatLab, es importante conocer ciertos conceptos preliminares que tienen alta relación con el concepto de bucle. Contadores Generalmente cuando se emplea un bucle, es necesario contar los sucesos o acciones internas del bucle, como pueden ser el número de iteraciones realizadas, etc. Una forma de controlar un bucle es mediante un contador. Definición: un contador es una variable cuyo valor se incrementa o decrece en una cantidad constante en cada iteración. Es importante tener claro que un contador no siempre incrementa, puede darse el caso en que un contador disminuye de valor. Por ejemplo, si se desea realizar un ciclo diez (10) veces, el contador se inicia en 1 y aumenta con cada iteración; mientras que si el contador se inicia en 10, deberá disminuir su valor en cada iteración. Todo depende de los requisitos y características del problema a resolver. Adicionalmente, aunque el incremento –o decremento– unitario es el más común, no en todos los casos se requiere que el contador aumente en la unidad. Se debe recalcar que los contadores requieren de una inicialización –asignación de un valor inicial base– antes de su empleo en un ciclo, donde posteriormente será incrementado o disminuido ese valor inicial. La inicialización se realiza de la siguiente forma: nombre_contador = valor_inicial; Mientras que el incremento se realiza como sigue: nombre_contador = nombre_ contador + valor_constante_incremento; 86 Capítulo 6 / Fundamentos de programación en MatLab Donde: valor_constante_incremento puede ser un número positivo o negativo. También puede utilizarse la instrucción de incremento/decremento unitario. nombre_contador++; El uso principal de los contadores es como controladores del flujo, es decir, determinar cuántas veces se realiza la iteración. Acumulador Además de contar cuántas veces se ejecuta un ciclo, constantemente es necesario almacenar, acumular o totalizar valores o datos en una variable. Para tal fin, se emplean los acumuladores. Definición: un acumulador es una variable que se incrementa o decrece una cantidad variable en cada ciclo. Como se observa claramente, el concepto de acumulador es bastante cercano al concepto de contador, con la diferencia que el acumulador se incrementa o decrece una cantidad variable, en contraposición al contador, que lo hace en una cantidad constante. Al igual que los contadores, los acumuladores requieren de una instrucción de inicialización previa a su empleo dentro del ciclo. Cada vez que se ejecuta un lazo, el acumulador requiere de una operación de acumulación, que es del tipo: nombre_acumulador = nombre_del_acumulador + valor_variable; Nótese lo siguiente: • • valor_variable puede ser un valor que cambia con cada iteración o puede ser la asignación del valor almacenado por una variable. La operación de acumulación no se refiere exclusivamente a la suma o resta. Esta puede incluir operaciones tales como multiplicación, división, etc y puede involucrar dos (2) o más operandos. 87 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Interruptor Los interruptores, conmutadores, indicadores, banderas, flags o switches son variables que pueden tomar diversos valores a lo largo de la ejecución del programa. Definición: un interruptor es una variable que puede tomar dos valores diferentes a lo largo de la ejecución de un programa, comunicando así información de una parte a otra del mismo. Los interruptores deben su nombre al hecho que por convención, únicamente adoptan dos valores diferentes ( 0 o 1; Falso o Verdadero; Rojo o Verde) al igual de un interruptor eléctrico. Estos dos valores no necesariamente deben ser una pareja, pero si deben ser del mismo tipo de datos si la variable se ha definido como de un tipo específico. Usualmente, los interruptores son utilizados en conjunción con estructuras de iteración y estructuras de selección, ya sea para el control de bucles o para la transmisión y almacenamiento de información. La instrucción for Cuando se conoce exactamente cuántas veces se debe realizar determinada acción o grupo de acciones por medio de un ciclo, la instrucción for . . . end es la instrucción idónea a emplear. La estructura de repetición for se encarga de todos los detalles de la repetición controlada por un contador. La repetición controlada por un contador requiere de los siguientes factores : 1. 2. 3. 4. El nombre de un variable de control (o contador de ciclo) El valor inicial de la variable de control La condición de prueba o valor final de la variable de control (hasta donde hacer el ciclo) El incremento o decremento que tendrá la variable de control cada vez que suceda el ciclo. Cabe anotar que el número de repeticiones no se hace modificando directamente la variable de control, sino barriendo un vector de valores, es decir, se barre sobre una matriz. 88 Capítulo 6 / Fundamentos de programación en MatLab Los errores más comunes cuando se escriben estructuras de iteración son: • • Ciclos sin fin. Errores por diferencia de uno. Es decir, el ciclo se realiza una vez más o una vez menos de lo requerido. Para evitar errores por diferencia de uno, utilice el valor final en la condición de una estructura de iteración y el operador relacional <=, partiendo de un valor inicial de uno (1), si utiliza como valor inicial cero (0), el operador lógico a emplear es <. La sintaxis general de la estructura for es: for variable = expresion [instrucciones] end los comandos entre el for y el end se ejecutan una vez cada vez que se evalúa la expresión. Algunas de las reglas para la ejecución de un for son: 1. Si la expresión resultante es una matriz vacía, el loop no se ejecutará. El control pasa directamente a la instrucción que le sigue al end del for. 2. Si el resultado de la expresión es un escalar, el loop se ejecutara una vez, con el valor de la variables igual al valor del escalar. 3. Un loop for no puede terminarse, reasignado el valor de la variable del loop dentro del mismo. 4. A la finalización del for, la variable contiene el último valor usado. 5. Puede hacerse uso del operador dos puntos: para definir el número de repeticiones, de la siguiente forma for índice = valor_inicial:incremento:valor_final Ejemplo: for i = 7:1:12 %Instruccion end 89 Guía de uso de Matlab en el desarrollo de modelos de volatilidad La instrucción while Esta instrucción ejecuta una serie de instrucciones mientras la condición dada sea verdadera. Sintaxis: while condición [intrucciones] end Si condición es True, todas las instrucciones se ejecutan hasta que se encuentra la instrucción end. Después, el control vuelve a la instrucción while y se comprueba de nuevo la condición. Si la condición es aún True, se repite el proceso. Si no es True, la ejecución se reanuda con la instrucción que sigue a la instrucción end. Los bucles while… end se pueden anidar a cualquier nivel. Cada end coincide con el while más reciente. Ejemplo: while A<B %Instrucciones end La instrucción while permite que el ciclo sea terminado de forma implícita si se cumple alguna condición, por medio de la instrucción break. Sintaxis: while condición [intrucciones] Condición_terminacion Break; end Ejemplo while A<B %Instrucciones if A == 0 break; end end 90 Capítulo 6 / Fundamentos de programación en MatLab En este caso, el ciclo se ejecuta mientras que la variable A sea menor a la variable B y en el caso que la variable A tome el valor de cero, el ciclo finalizaría. Estructuras Iterativas Anidadas De la misma forma en que se pueden anidar estructuras de selección, es posible insertar un bucle dentro de otro. Las reglas para construir estructuras repetitivas anidadas son iguales en ambos casos: la estructura interna debe estar incluida totalmente dentro de la externa (no deben haber bucles superpuestos). Adicionalmente, es importante tener contadores diferentes para cada bucle interno. Las variables de control de los bucles toman valores, de modo tal que por cada valor de la variable índice del ciclo externo se debe ejecutar totalmente el bucle interno. Las estructuras de iteración se anidan generalmente para recorrer una serie de datos (un bucle externo recorre por ejemplo las filas y un bucle interno recorre en el sentido contrario, en este caso, las columnas). La anidación o encajamiento que se presenta frecuentemente es la anidación de estructuras de iteración con estructuras de selección. Ejemplo estructuras de iteración anidadas: for i = 7:1:12 end for j = 3:1:5 valor(i-6, j-2) = i*j end 91 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Ejemplo estructuras de iteración anidadas con estructuras de selección: for i = 7:1:12 for j = 2:1:5 if j == 2 %Instrucción end if j == 3 %Instruccion 2 end end end 92 Capítulo 7 Modelamiento de Volatilidad en MatLab Modelamiento de Volatilidad en MatLab El estudio de la volatilidad y su pronóstico, entendida como la varianza condicional del activo subyacente, es relevante en diversos aspectos relacionados con la econometría financiera (Bauwens L., Sebastien L., Rombouts. 2006). Dentro de las aplicaciones que tiene, están, por ejemplo, la valoración de opciones, la selección y diversificación de portafolios, valoración de opciones, hedging y la administración de riesgos, como por ejemplo, cálculo del Value at Risk VaR y otras medidas de riesgo como lo es el Expected Shortfall ES; así como la implementación de teorías tales como CAPM (Capital Asset Pricing Model) y APT (Arbitrage pricing theory) (Tsay 2006; Bauwens et al 2006, Long 2005; Pong S., Granger C. 2003; Hansen P., Lunde A. 2005). De forma complementaria, a medida que se desarrollan nuevos instrumentos financieros, se incrementa la necesidad de analizar la volatilidad (Kawakatsu, 2006). Incluso, la volatilidad puede ser usada por los hacedores de política como un elemento que mide la vulnerabilidad de los mercados y de la economía, al conectar incertidumbre en el mercado con confidencia del público (Pong S., Granger C. 2003). En este contexto, el contar con pronósticos correctos de volatilidad es un elemento crucial en la implementación y evaluación de modelos de riesgo, de valoración de activos y de estrategias de cobertura (McMillan D., Speight A., 2004). Sin embargo, la volatilidad no es riesgo (Pong S., Granger C. 2003), cuando se interpreta como incertidumbre puede utilizarse por parte de los inversionistas como un elemento para cuantificar el nivel de riesgo de la inversión. En el caso de la volatilidad de acciones, ésta no es observable directamente, puesto que, por ejemplo, para precios de cierre de acciones, no se observa la volatilidad diaria, dado que se cuenta con un solo dato al final del día. Según Embrechts (2000), para el caso de retornos de acciones, existen una serie de hechos estilizados que de alguna forma, deben ser contenidos en los modelos matemáticos que representan su comportamiento. Los principales hechos estilizados presentes en las series de retornos de acciones son: 95 Guía de uso de Matlab en el desarrollo de modelos de volatilidad • • • • 96 Las distribuciones de retornos son de “colas anchas” o Leptocurtosis (Brooks, 2008), es decir, existe mayor probabilidad de ocurrencia de hechos extremos que en el caso de la distribución normal estándar (la cual, es ampliamente utilizada como parámetro de múltiples modelos); de tal forma, que las pérdidas pueden ser mucho mayores a las calculadas con la distribución normal (Brooks, 2008; Franses, Van Dijk, 1996; Engle RF, Patton A. 2001; Huann, D., Wand, H., Yao, Q., 2008). Retornos pequeños y amplios no ocurren de forma separada en el tiempo, como se espera en una secuencia de variables aleatorias, sino en clusters, es decir, un valor bajo o alto del retorno se presenta, otros valores de tamaño comparable aparecen poco tiempo después (Brooks, 2008; Franses, Van Dijk, 1996; Giot, P., Laurent S., 2003; Engle RF, Patton A. 2001; Engle, R., Focardi, S., Fabozzi F., 2008; McMillan, D., Speight, A., 2004; Engle RF, 2002), es decir, las variaciones de los precios de activos financieros presentan cierta dependencia que no desaparecen sino muy lentamente (Valderas, Alba y Olmedo, 2002), haciendo que los choques de volatilidad actuales influyen en la expectativa de volatilidad múltiples periodos hacia adelante (Engle RF, Patton A., 2001). Otra forma de entender la denominada volatility clustering es que las series de retornos financieros generalmente no se encuentran correlacionadas, pero las series de retornos cuadráticos si lo son (Zang, K., Laiwan, C, 2009). Una explicación plausible para este fenómeno, común a un gran número de series financieras, es que la información, afecta los cambios de precios, llega en bloques en la cual y no en eventos aislados (Brooks, 2008). Efectos Leverage. La tendencia a la volatilidad de aumentar cuando se presentan caídas en precios que cuando se presentan aumentos de precios de la misma magnitud (Brooks, 2008). Es decir, los choques tienen efectos asimétricos (Engle RF, Patton A., 2001; McMillan D., Speight A., 2004; Mills, 1999) y por lo tanto, las distribuciones de retornos asociadas son a su vez asimétricas. Bajo este escenario, existe una relación negativa entre la varianza actual y el signo de choques previos; de esta forma, un choque negativo incrementa la varianza condicional en una cantidad mayor que la magnitud donde se afecta la varianza condicional por efecto de un choque positivo. Efecto de reversión a la media. (Engle RF, Patton A., 2001). Se asocia la existencia de un nivel normal de volatilidad, al nivel Capítulo 7 / Modelamiento de Volatilidad en MatLab activo al cual, eventualmente, retornará la medida de volatilidad. En otras palabras, la reversion a la media implica que la información actual no tiene efectos de largo plazo sobre la volatilidad. Durante el capítulo se presentarán soluciones en MatLab a la implementación de los principales modelos que se estudien, usando tanto las librerías estándar de MatLab, como dos librerías adicionales: • UCSD GARCH. Disponible gratuitamente en http://www.kevinsheppard.com/wiki/UCSD_GARCH • The Oxford MFE Toolbox. Disponible gratuitamente en http:// www.kevinsheppard.com/wiki/MFE_Toolbox Volatilidad condicional y no condicional El término condicional implica una dependencia explícita a la secuencia de observaciones pasadas, mientras que el término no condicional se relaciona con el comportamiento de largo plazo de la serie de tiempo y asume que no se conoce explícitamente el pasado. La varianza condicional de una variable aleatoria gún la siguiente expresión (Brooks, 2008): se denota por se- (1) Modelación de la volatilidad La volatilidad, medida como desviación estándar o varianza de los retornos, es utilizada como una medida del riesgo total de un activo financiero. Existen diversos modelos para volatilidad (Brooks, 2008). Caminata Aleatoria Bajo este modelo, se supone que los precios (o los logaritmos de los precios) son independientes (Wang, 2008). En este modelo, el mecanismo de formación de precios sigue la siguiente expresión: (2) Pt = Pt-1+at 97 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Donde Pt es el precio del activo en el tiempo t y el término at es el error, de media cero e independiente entre si. Esto se denomina una caminata aleatoria sin drift. Cuando existe presencia de drift, el modelo puede expresarse como (3) Pt = Pt-1+at +θ0 El cambio de precio es at y es por lo tanto, independiente de otros cambios de precios previos. Por lo anterior Pt puede reescribirse, en el caso sin drift como: (4) El valor esperado de Pt es E[(Pt│Pt-1,Pt-2,⋯)] = Pt-1 , es decir, que el mejor pronóstico del precio, es el precio del periodo anterior. O en el caso con drift como: (5) En este caso, el valor esperado de Pt es E[(Pt│Pt-1,Pt-2,⋯)] = P0+ tθ0 El retorno simple del activo se define como (Campbell, J., Lo, A., MacKinlay, A.,1997): (6) El retorno compuesto es (Campbell, J., Lo, A., MacKinlay, A. 1997; Chakraborti, A., Santhanam, M., 2005): (7) En el contexto del modelo de caminata aleatoria, el pronóstico de la volatilidad del retorno resulta por (Pong, S., Granger, C., 2003): (8) 98 Capítulo 7 / Modelamiento de Volatilidad en MatLab Constituyendo el modelo más simple y sencillo de pronóstico de volatilidad. En el caso de MatLab, el cálculo de retornos logarítmicos puede ser calculado de dos formas: 1. Calculando el logaritmo y las diferencias 2. Utilizando la instrucción price2ret Suponga que en el vector, columna X, se tiene el listado de precios de una acción, ordenados cronológicamente de menor a mayor tiempo. Para determinar sus retornos continuamente compuestos se utiliza la siguiente expresión. 1. Calculando las diferencias Para retornos continuamente compuestos: Z = log(x); Retornos = diff(Z); Para retornos periódicos diarios: Retornos = diff(x) -1; 2. Utilizando el método price2ret. La función price2ret puede ser utilizada para calcular retornos aritméticos o geométricos. En términos generales, puede usarse de la siguiente forma: a. Retornos = price2ret(precios). En el vector Retornos se presentan los retornos continuamente compuestos del vector de precios utilizado, se asume que los precios están organizados cronológicamente de forma creciente (el primer elemento corresponde a la observación más antigua y el último elemento a la observación más reciente). El número de elementos del vector de Retornos es igual al número de elementos del vector de precios, menos uno. Precios puede ser también una matriz de precios, la única exigencia es que sea una matriz rectangular, donde cada columna representa una serie de precios de un activo diferente; de igual forma, los precios deben estar organizados cronológicamente. b. [Retornos, IntervalosRet] = price2ret(precios, fechas, método. Donde precios es el vector o matriz de 99 Guía de uso de Matlab en el desarrollo de modelos de volatilidad precios, ordenados cronológicamente; fechas es un vector columna que representa las fechas de los precios presentados, de tal forma que es un vector monotónamente creciente; método indica la forma de componer los retornos (‘Continuos’ o [] indica retornos continuamente compuestos, mientras que ‘Periodic’ indica retornos periódicos simples. Así como valores de retorno tiene retornos que corresponden al vector o matriz de retornos calculados según la especificación dada; IntervalosRet es un vector columna de número de elementos de precios menos uno, correspondiente a los tiempos entre las observaciones; por lo tanto si fechas es igual a [], intervalosRet es un vector columna de unos. Volatilidad histórica Es el modelo más sencillo. Implica sencillamente calcular la varianza (o en el caso de portafolios, la matriz de varianzas y covarianzas) de los retornos para un periodo de tiempo determinado, siendo este el estimativo de volatilidad de periodos futuros. Este modelo se denomina el de volatilidad no condicional. Generalmente, este modelo se utiliza como benchmark para comparar la habilidad de pronóstico de otros tipos de modelos. Según RiskMetrics (1996), para un activo, la volatilidad histórica se representa por: (9) En este orden de ideas, para calcular la desviación estándar de una serie de retornos (denominada R) en MatLab, se utiliza la siguiente expresión: Desviación = std(R) Si R es una matriz de retornos, lo que se debe calcular es la matriz de varianzas y covarianzas, por lo tanto se utiliza la siguiente expresión Varianzas_covarianzas = cov(R) Si se utiliza el comando std(R) sobre una matriz, producirá un vector fila con las desviaciones de cada una de sus columnas (cada elemento del vector corresponde a la desviación estándar de la columna 100 Capítulo 7 / Modelamiento de Volatilidad en MatLab correspondiente); si por el contrario, se utiliza la instrucción cov(R), el resultado es la matriz de varianzas y covarianzas; por lo tanto, la instrucción sqrt(diag(cov(R))) corresponde al mismo vector calculado con std(R). Modelos de promedio histórico El modelo de promedio histórico (Pong, S., Granger, C., 2003) se utiliza toda la serie histórica de realizaciones de volatilidad, según: (10) En MatLab, para calcular un modelo de promedio histórico, suponga que se tiene la matriz sigma de volatilidades históricas, para el cálculo de la volatilidad de promedio histórico, se utiliza la instrucción mean(sigma). Si se tiene un vector de precios históricos, y a partir de él se desea calcular la volatilidad histórica, se puede calcular de diferentes formas. Un modelo sencillo es ir calculando la desviación a medida que se incluyen más observaciones. Cabe anotar que se partiría de la segunda observación de retornos para calcular la desviación entre el primer elemento y el segundo. La segunda posición del vector de volatilidad histórica, correspondería a la desviación entre los tres primeros retornos, y así sucesivamente. De esta forma, si el vector de precios tiene n observaciones, el vector de retornos tendrá n-1 observaciones y el de volatilidad histórica n-2 observaciones. A continuación se presenta el cálculo de este modelo utilizando instrucciones de MatLab, para una serie de precios de un solo activo. Retornos = price2ret(precios) Vol_histórica = zeros(length(Retornos-1)) for i = 1: length(Retornos)-1 Vol_histórica = std(Retornos(1:i+1)) end vol_promedio_histórico = mean(Vol_histórica) 101 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Si lo que se tiene en precios es una matriz de precios, para calcular un modelo de volatilidad de promedio histórico, se utilizan las siguientes instrucciones: Retornos = price2ret(precios) Vol_historica = zeros(size(Retornos)) [filas, columnas] = size(Retornos) for i = 1: filas-1 Vol_histórica = std(Retornos(1:i+1)) end vol_promedio_histórico = mean(Vol_histórica) Modelos de promedio móvil En este modelo se supone que la serie de volatilidad no tiene una alta persistencia, por lo que se descartan las observaciones menos recientes. (11) Modelos de suavización exponencial Este modelo, al igual que el de promedio histórico, utiliza toda la serie histórica de volatilidad, suponiendo que las observaciones más recientes tienen mayor relevancia en el cálculo del pronóstico actual de volatilidad. (12) 102 Capítulo 7 / Modelamiento de Volatilidad en MatLab Modelos de promedio móvil ponderado exponencialmente EWMA (Exponentially widghted moving average). Es una extensión del modelo de volatilidad histórica, más precisamente, del modelo de suavización exponencial con un finito, en el cual, las observaciones más recientes tienen un impacto mayor sobre el pronóstico de volatilidad que las observaciones más antiguas; de tal forma que la importancia o peso de las observaciones cae de manera exponencial. En este sentido, el modelo de volatilidad histórica puede verse afectado por outliers en la misma proporción, mientras que la observación hace parte del universo de análisis. El valor de la volatilidad se define por la siguiente expresión: (13) Aunque alternativamente, puede expresarse como (Pong, S., Granger, C., 2003): (14) Según RiskMetris (1996), el modelo EWMA está gobernado por la siguiente expresión: (15) Donde λ ε (0,1) es el parámetro de decaimiento. Para el caso de retornos diarios de acciones, Riskmetrics propone un valor de 0.94 y un igual a cero (0), quedando la expresión transformada en: (16) , ,| 103 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Los dos problemas o limitantes del modelo EWMA son (Brooks, 2008): • • El reemplazo de una suma infinita por una suma finita de datos observados, lo cual puede llevar a diferencias importantes de los modelos EWMA en muestras pequeñas. Diversos modelos de series de tiempo, incluyendo los modelos GARCH, tienen pronósticos que tienen a la varianza no condicional de la serie, a medida que el horizonte de predicción aumenta, lo cual es adecuado, puesto que se espera que los modelos de volatilidad “reviertan a la media”. En el caso de los modelos EWMA esta característica no se cumple, siendo, por el contrario, la volatilidad explosiva a medida que el horizonte de tiempo aumenta. Para el desarrollo del modelo EWMA en MatLab, suponga que la matriz precios contiene los precios de n activos. R = price2ret(precios)' [nobservaciones, nacciones] = size(R) mediaRp_nc = mean(R)' sigmaRp_nc = cov(R) Siguiendo a Embrechts, el pronóstico de la media condicional es cero: mediaXp_c = zeros(nacciones,1) Para retornos diarios, Riskmetrics propone un lamda igual a 0.94: EWMAlamda = 0.94; nuXp_c = zeros(length(nacciones),1); sigmaXp_c = X(:,1)*(X(:,1))'; varLp_c = (b')*sigmaXp_c*b El cálculo de la varianza condicional se realiza de la siguiente forma: for i = 2:length(X), sigmaXp_c = EWMAlamda*(X(:,i)*(X(:,i))')+(1EWMAlamda)*sigmaXp_c; end 104 Capítulo 7 / Modelamiento de Volatilidad en MatLab Modelos de volatilidad implícita Todos los modelos de valoración de opciones requieren como dato de entrada un pronóstico de volatilidad. Debido a que las opciones son un activo financiero transable en los mercados, el pronóstico de volatilidad puede ser obtenido de forma implícita del modelo de valoración de la misma. Por ejemplo, si se utiliza el modelo de valoración clásico de Black-Scholes, se puede obtener la volatilidad dado que los demás elementos hacen parte del contrato suscrito en la opción. Esta volatilidad implícita es el pronóstico de la volatilidad de los activos subyacentes para el periodo determinado. El modelo de valoración de Black-Scholes, se presenta a continuación (Hull, 2002): (17) (18) (19) (20) Donde: N(X): la función acumulativa de distribución de probabilidad de la distribución normal estándar. c: precio de la opción call p: precio de la opción put so: precio de la opción en el tiempo cero k: precio strike r: tasa libre de riesgo continuamente compuesta σ: volatilidad de la acción t: tiempo de maduración de la opción MatLab provee una función que permite calcular la volatilidad implícita por medio del modelo de Black-Scholes para acciones. La instrucción es blsimpv y puede usarse de varias formas: 105 Guía de uso de Matlab en el desarrollo de modelos de volatilidad 1. 2. Volatilidad = blsimpv(So, K, r, T, c) donde So es el valor actual del activo subyacente, K es el precio de ejercicio de la opción (precio strike), r es la tasa libre de riesgo, T el tiempo de maduración y c es el valor de la opción call. Volatilidad = blsimpv(So, K, r, T, c, limite, yield, Tolerancia, clase) donde So es el valor actual del activo subyacente, K es el precio de ejercicio de la opción (precio strike), r es la tasa libre de riesgo, T el tiempo de maduración y c es el valor de la opción, limite es el límite superior para la volatilidad implícita (el valor default es 10, el cualrepresenta 1000% por año), yield es el retorno anualizado del activo subyacente, tolerancia es la tolerancia para terminación de la búsqueda de la solución (default 1-e-6) y clase indica el tipo de opción de la cual se deriva la volatilidad, porque para especificar opciones call se puede usar true o {‘Call’}, para opciones put false o {‘Put’}; si no se indica, se supone que es una opción call. Modelos autoregresivos condicionales Son modelos en los cuales, la volatilidad pronosticada es función de una función que incluye rezagos de la misma volatilidad. En estos modelos, la metodología estándar Box-Jenkins para estimar modelos autoregresivos puede ser aplicada. Si lo que se busca pronosticar es la volatilidad diaria, generalmente se utilizan dos proxies: • • Retornos diarios cuadráticos: en este modelo, el retorno cuadrático en el tiempo t se convierte en el pronóstico de la volatilidad para dicho periodo. Estimadores de rango diarios: Involucra calcular la razón logarítmica entre el precio más alto observado y el más bajo para el día t, el cual corresponde al pronóstico de volatilidad para el tiempo t, según la siguiente expresión: (21) En MatLab, su implementación se haría de la siguiente forma, suponiendo que se tiene un vector de precios denominado precios: 106 Capítulo 7 / Modelamiento de Volatilidad en MatLab sigma_Cuadrado = log(max(precios)/min(precios)) Una vez se obtiene el estimador de la volatilidad por cualquiera de los dos métodos previamente expuestos, un modelo autoregresivo estándar es estimado. (22) Como se observa, este es un modelo AR(p), en MatLab, puede estimarse utilizando la función ar. Tabla 26. Métodos de estimación modelos AR Función m = ar(R, n) (MatLab) [m, ref1]=ar(R, n, método, ventana) (MatLab) * Descripción R es la serie de tiempos de retornos, n es un escalar que representa el orden autoregresivo, m es un modelo idpoly* R es la serie de tiempos de retornos, n es un escalar que representa el orden autoregresivo, método es el algoritmo utilizado para calcular el modelo de mínimos cuadrados, el cual puede ser: ‘burg’ que usa las predicciones de errores cuadráticos, ‘fb’ que es el modelo default que minimiza la suma de errores cuadráticos, ‘gl’ que utiliza la media geométrica durante la estimación, ‘ls’ que utiliza el método de mínimos cuadrados y ‘burg’ que implementa el modelo Yule-Walker. Por esto, la ventana define cómo usar los datos fuera de la ventana de medición: ‘burg’ sin ventana (default), es decir, la extracción de datos inicia en la posición n+1, ‘pow’ postventana, los valores faltantes se reemplazan con ceros y se agregan n observaciones al final de la muestra, ‘ppw’pre y post ventana, usado en el modelo Yule-Walker, ‘prw’preventana, los valores faltantes se reemplazan con ceros al comienzo, de tal forma que los datos arrancan desde el comienzo de la serie. m es un modelo idpoly, ref1 almacena información complementaria del modelo en función del argumento método utilizado. Un modelo idpoly es un modelo lineal de polinomios que representa un modelo de entrada-salida, en el cual se contienen los parámetros (coeficientes) que describen la estructura del modelo. Debido a sus características, la serie de tiempo de datos se convierte en un objeto iddata, por lo tanto, algunas de las funciones tradicionales de MatLab no aplican sobre este objeto, por ejemplo, para determinar la matriz de varianzas y covarianzas de una serie de tipo iddata, se utiliza el comando covf(data) en lugar de cov(data). continua 107 Guía de uso de Matlab en el desarrollo de modelos de volatilidad continuación Función Descripción Y es el vector de series de tiempo. Constant es un entero, 1 si la regresión posee constante, 0 de lo contrario. Ar es el orden del modelo ar requerido. Ma es el orden del modelo requerido (para estimación de modelos ar, ma = 0). Parameters es un vec[parameters, tor que consisten en [constante AR variaerrors, LLF, SEregression,stderrors, bleExogena MA]. Stderrors es la matriz de robustSE, scores, likel varianza-covarianza estimada para los parámetros. ihoods]=armaxfilter(y,c robustSE es la matriz de covarianzas de White onstant,ar,ma) para errores. SERegression los errores estándar UCSD _ GARCH Toolbox de la regresión. Errores es un vector de errores. LLF es la log- verosimilitud de la regresión. Scores es una matriz de puntajes de coeficientes. Likelihoods es un vector de los log-verisimilitud de cada coeficiente. Y es el vector de series de tiempo. Constant es un entero, 1 si la regresión posee constante, 0 de lo contrario. Ar es el orden del modelo ar requerido. ParaParameters = meters es un vector que consisten en [constante armaxfilter(y,contant, AR variableExogena MA]. Por ejemplo, para ar) estimar un modelo AR = 3 MFE Toolbox P = 3; parameters = armaxfilter(y,1,[1:P] Por ejemplo, si se tiene una señal sinoseudal, se pueden estimar los parámetros del modelo ar(4), así: y = sin([1:600]') + 0.7*randn(600,1); y = iddata(y); mb = ar(y,4,'burg'); Modelos autoregresivos heterocedásticos condicionales (ARCH) Los modelos autoregresivos condicionales heterocedásticos (ARCH) son un grupo de modelos poderosos y útiles en procesos de econometría financiera (Marcek, D., 2002). Es más, el ARCH se puede considerar como el primer modelo econométrico específicamente diseñado para series 108 Capítulo 7 / Modelamiento de Volatilidad en MatLab financieras (Franses, McAleer, 2002). Este tipo de modelos fue desarrollado por Engle (1982) con el fin de extender los elementos, en términos autoregresivos realizados para la media, como es el modelo ARMA, desarrollado por Box y Jenkins (1970) a la varianza (Bauwens et al, 2006). En resumen, la esencia del ARCH radica en la posibilidad de especificar un proceso estocástico para los términos de error, de tal forma que se pueda predecir el promedio término de error cuando el modelo se ajusta a datos empíricos (Engle, R., Focardi, S., Fabozzi, F., 2008). El modelo ARCH ha tenido una alta influencia tanto en la econometría práctica como aplicada, es más, algunos autores (Bollerslev, 2001) consideran que este modelo ha sido el desarrollo más importante en el campo de la econometría financiera, entendida como “la aplicación de herramientas econométricas a datos financieros” (Engle, 2001, p. 53), especialmente en las últimas décadas, impulsando además, el estudio de la volatilidad, uno de los principales tópicos de esta última (Franses, McAleer., 2002). Bajo el modelo ARCH se asume que las varianzas y covarianzas condicionales dependen de las realizaciones de los residuales pasados y de las varianzas y covarianzas rezagadas (Attanasio, 1991). Una de las fortalezas de este tipo de modelos es que bajo condiciones “tradicionales”, se tiene el supuesto de homocedasticidad, es decir, que la varianza es constante en el tiempo. Si en la realidad hay presencia de heterocedasticidad, pero se aplica un modelo homocedástico, como lo es la regresión lineal, se tienen diversas consecuencias (Hayashi, 2000; Wooldridge, 2000): • • El teorema de Gauss-Markov no se mantiene para el estimador b = (X´X)-1X´y. Por lo tanto, el estimador deja de ser BLUE (el mejor estimador lineal insesgado). Se afectan las estadísticas de prueba. La estadística t no tiene distribución t. La estadística F no tiene una distribución F. La estadística LM no tiene distribución asintótica Chi cuadrado. Otro de los factores que soporta el uso de modelos ARCH en series financieras es el de volatility crustering, es decir, la volatilidad tiende a estar correlacionada de forma positiva con sus niveles de los periodos de los periodos precedentes inmediatamente. Un modelo ARCH(q) se describe como se presenta a continuación (Tsay, 2006; Brooks, 2008): 109 Guía de uso de Matlab en el desarrollo de modelos de volatilidad (23) Otra forma de expresar el modelo es (Engle, R., Focardi, S., Fabozzi, F., 2008): (24) La ecuación de media se describe por: (25) , Para una descripción de los diferentes tipos de modelos ARCH, véase Bollerslev et al. (1992, 1994), Bera and Higgins (1993), Pagan (1996) y Shephard (1996), entre otros. La estimación de modelos ARCH en MatLab puede realizarse por medio de la función tarch del MFE Toolbox. La function tarch se puede utilizar para estimar modelos ARCH, GARCH, GJR, TARCH. Tabla 27. Uso de la función TARCH - MFE Toolbox Función parameters = tarch(serie,p,o,q) 110 Descripción Serie es la serie de tiempo, p es el orden arch. Los errores se suponen normales. Para modelos arch, los parámetros o y q deben ser cero. Parametros es un vector de 1+p+o+q de los parámetros. Así por ejemplo, se desea estimar el modelo arch de orden 5 para la serie R, se utiliza la siguiente expresión: Parametros = tarch(R, 5, 0, 0) Capítulo 7 / Modelamiento de Volatilidad en MatLab Serie es la serie de tiempo, p es el orden arch. ERROR _ TYPE es el tipo de error (‘NORMAL’ para errores normales, ‘STUDENTST’ para errores T-student standard, ‘GED’ para errores con distribución GED y ‘SKEWT’ para errores tipo [PARAMETERS,LL,HT,VCVROBU Hansen skewd- t). TARCH _ TYPE 1 si se estima ST,VCV,SCORES,DIAGNOSTICS= un modelo de la familia zarch, 2 de lo contrario. tarch(serie,P,O,Q,ERROR _ PARAMETERS es un vector de 1+p+o+q de los TYPE,TARCH _ parámetros. LL es la log-verosimilitud en el òptiTYPE,STARTINGVALS,OPTIONS) mo. HT es el vector de varianzas condicionales. VCVROBUST es la matriz de covarianzas robusta de Bollerslev-Wooldridge. VCV es la matriz de covarianzas según máxima verosimilitud. SCORES Son los scores para diagnóstico de coeficientes. Para simular un modelo TARCH simulatedData = tarch_simulate(1000, [1 .1 .8], 1, 0, 0) Para determinar los parámetros parameters = tarch(simulatedData,1,0,0) Restricciones de no negatividad Debido a que es una varianza condicional, su valor debe ser siempre positivo. Debido a que por construcción, las variables del modelo de varianza condicional son positivas (los rezagos están elevados al cuadrado), se debe asegurar que los coeficientes de la ecuación de varianza no sean negativos. Por lo tanto, para asegurar la no negatividad de la varianza condicional, se debe cumplir la siguiente restricción adicional. (26) Si entonces el proceso es estacionario débil y la varianza condicional es constante e igual a (27) Bajo la función tarch, la restricción de no negatividad es una de las restricciones impuestas al modelo. 111 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Modelos ARCH Generalizados (GARCH) En el modelo GARCH, la volatilidad condicional puede ser dependiente de sus propios rezagos. Constituye un promedio ponderado de residuales cuadráticos pasados, pero tiene unos pesos que se reducen paulatinamente sin llegar a ser cero (Engle, R., Focardi, S., Fabozzi, F., 2008). Es uno de los modelos más populares para la modelación de la volatilidad (Goyal, 2000) y es útil a su vez en el pronóstico de volatilidad de series de retornos financieros (Zang, K., Laiwan, C., 2009). Sin embargo, una de sus mayores limitantes es la imposibilidad de capturar efectos asimétricos de los choques de volatilidad (Lui, Q., Morimune, K., 2006). Según Tsay, 2006, un GARCH(m,s) puede expresarse como: (28) at = σt εt (29) Con esta especificación, el mejor pronóstico de la varianza del siguiente periodo es un promedio ponderado de la varianza de largo plazo, la varianza predicha para este periodo y la nueva información que es capturada por el residual cuadrático más reciente; de esta forma, el modelo incorpora una regla de actualización Bayesiana de adaptación de comportamiento (Engle, R., Focardi, S., Fabozzi, F., 2008). Los modelos GARCH son de amplia utilidad debido a que proporciona modelos parsimoniosos que, incluso en sus formas más sencillas, son bastante efectivos prediciendo varianzas condicionales (Engle, R., Focardi, S., Fabozzi, F., 2008). En trabajos aplicados, una variación comúnmente utilizada de los modelos GARCH es la especificación GARCH(1,1) (Lega, Murcia, Vásquez, Venegas, 2007; Brooks, 2008), debido primordialmente, a tres (3) ventajas que presentan este tipo de modelos: 112 Capítulo 7 / Modelamiento de Volatilidad en MatLab • • • Es la versión más parsimoniosa del GARCH(m,s), lo cual previene del problema de parametrización del modelo. El cumplimiento de la condición de no negatividad es más probable que en el caso de los modelos ARCH. Captura hechos estilizados de las series financieras, tales como el volatlity Clustering y efectos Leverage que no capturan los modelos ARCH. Respecto a la primera afirmación, que el GARCH(1,1) es más parsimonioso (Brooks, 2008; Wang, 2009), si se toma la especificación del GARCH(1,1): (30) Si se resta uno (1) a los subíndices, se tiene: (31) Realizando esta labor nuevamente: (32) Sustituyendo en la ecuación del GARCH(1,1): (33) ( (34) Sustituyendo (35) (36) (37) 113 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Realizando sustituciones infinitas se tiene: (38) De la expresión anterior, el primer término del lado derecho es una constante y a medida que el número de observaciones aumenta, β∞ tiende a cero (0). Por lo anterior, el modelo GARCH(1, 1) se puede expresar como: (39) La ecuación anterior corresponde a un ARCH infinito, por lo tanto, es más parsimonioso. El modelo GARCH(1, 1) ha sido ampliamente utilizado para modelar volatilidad, primordialmente por su facilidad de implementación, estimación y de interpretación (Castaño, E., Gómez, K., Gallón, S. 2008). Para una descripción de los diferentes tipos de modelos GARCH, véase Palm (1996). Para la estimación de modelos GARCH, se utiliza también la función TARCH (véase Tabla 23. Uso de la función TARCH - MFE Toolbox), así por ejemplo, para estimar un modelo GARCH (1,1) con errores normales: parameters = tarch(y,1,0,1) Para estimar un modelo GARCH(1,1) con errores parameters = tarch(y,1,0,1,’SKEWT’) Condición de no negatividad para GARCH (1,1) La varianza condicional está dada por (Brooks, 2008): (40) 114 Capítulo 7 / Modelamiento de Volatilidad en MatLab Por lo tanto α0 > 0,1 - (α1 + β) ≥ 0; es decir (α1 + β) ≥ 1. Cuando se presenta raíz unitaria, es decir, (α1 + β) = 1, se denomina IGARCH o GARCH integrado, el cual es estrictamente estacionario y tiene varianza infinita. Condición de no negatividad para GARCH (p, q) Las condiciones de no negatividad son (Bollerslev, 1986; Nelson, D., Cao, C., 1992) son: (41) Ahora bien, expresando la varianza no condicional como (Wang, 2009): (42) Por lo tanto, una condición adicional es que Si se utiliza la función tarch, para implementar un modelo GARCH(p, q) con errores normales: parameters = tarch(y,p,0,q) Así por ejemplo, para simular un garch(1,1) se utiliza la instrucción: simulatedData = tarch_simulate(1000, [1 .1 .8], 1, 0, 1) Para este caso, la estimación del modelo sería: parameters = tarch(simulatedData,1,0,1) Adicionalmente, los modelos GARCH pueden ser estimados utilizando funciones directas de MatLab. 115 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Tabla 28. Modelamiento GARCH univariado con funciones propias de MatLab Función [Kappa, Alpha, Beta] = ugarch(U, P, Q) [Coeff,Errors,LLF,Innovat ions,Sigmas,Summary] = … garchfit(Especificacion, Serie) 116 Descripción Estima los parámetros de modelos GARCH (p, q) con errores normales. U corresponde al vector de disturbancias. P representa el número de lags de varianza condicional. Q representa el número de lags de errores cuadráticos. Kappa corresponde al término constante del modelo GARCH. Alpha corresponde al vector de 1 x p de coeficientes de lags de varianza condicional. Beta corresponde al vector de 1 x q de coeficientes de lags de errores cuadráticos. Estima los parámetros de modelos GARCH(1,1) con errores gausianos de los datos incluidos en el vector Series Estima los parámetros de modelos GARCH(1,1) EGARCH o GJR. Serie es el vector de datos. Especificación que corresponde al modelo, a ser estimado, para su definición, por ello debe utilizarse la función garchset. Especificacion = ga rchset(param1,val1,param2,val2,…) parami donde corresponde a un valor de parámetro aceptable y vali a su valor correspondiente. Los valores del parámetro son: VarianceModel: modelo de varianza condicional. Valores posibles: 'GARCH', 'EGARCH', 'GJR', or 'Constant'. Default 'GARCH'. P: representa el número de lags de varianza condicional. Valores posibles: enteros >= 0 Q representa el número de lags de errores cuadráticos. Valores posibles: enteros >= 0 K: coeficiente escalar de varianza condicional constante. Valor default []. GARCH: Vector de p elementos de coeficientes de varianzas condicionales. Default [] ARCH: vector de q elementos de coeficientes de lags de erroes cuadráticos. Default [] Leverage: Coeficientes de asimetría para EGARCH y GJR. Por ejemplo, para crear un modelo GARCH(1,1), la especificación será spec = garchset('P', 1, 'Q', 1) Capítulo 7 / Modelamiento de Volatilidad en MatLab Por ejemplo, para simular un proceso garch (2, 1) y posteriormente, estimar sus parámetros, se estiman así: randn('seed', 10) Kappa = 0.25; Alpha = [0.2 0.1]'; gativo (P = 2). Beta = 0.4; NumSamples = 500; %escalar positivo. %vector columna con número no ne% Q = 1. % número de muestras a simular % Simulación del proceso [U , H] = ugarchsim(Kappa, Alpha, Beta, NumSamples); % Estimar los parámetros del proceso P = 2; % P (P = Longitud de Alpha). Q = 1; % Q (Q = Longitud de Beta). [k, a, b] = ugarch(U , P , Q); %Estimacion disp(' ') disp(' Coeficientes Estimados:') disp(' -----------------------') disp([k; a; b]) disp(' ') %Pronóstico de la varianza condicional NumPeriods = 10; % Tiempo de pronóstico. [VarianceForecast, H1] = ugarchpred(U, k, NumPeriods); disp(' Pronóstico de varianza:') disp(' ------------------') disp(VarianceForecast) disp(' ') a, b, Los resultados del proceso se muestran a continuación: Coeficientes Estimados: ---------------------0.2520 0.0708 117 Guía de uso de Matlab en el desarrollo de modelos de volatilidad 0.1623 0.4000 Pronóstico de Varianza: -----------------1.3243 0.9594 0.9186 0.8402 0.7966 0.7634 0.7407 0.7246 0.7133 0.7054 Otra forma de crear modelos garch es utilizando la función garchset, por ejemplo, para crear un modelo garch(1,1): spec = garchset('P', 1, 'Q', 1) spec = Comment: 'Mean: ARMAX(0, 0, ?); Variance: GARCH(1, 1)' Distribution: 'Gaussian' C: [] VarianceModel: 'GARCH' P: 1 Q: 1 K: [] GARCH: [] ARCH: [] Si se desea cambiar el modelo anterior por un garch(1,2) spec = garchset(spec, 'Q', 2) spec = Comment: 'Mean: ARMAX(0, 0, ?); Variance: GARCH(1, 2)' Distribution: 'Gaussian' C: [] 118 Capítulo 7 / Modelamiento de Volatilidad en MatLab VarianceModel: P: Q: K: GARCH: ARCH: 'GARCH' 1 2 [] [] [] Ahora bien, para utilizar la función garchfit, se usa como ejemplo una serie de 1000 retornos simulados, basados en un GARCH(1,1) spec = garchset('C',0,'K',0.0001,'GARCH',0.9,'AR CH',0.05); [e,s,y] = garchsim(spec,1000); garchfit(spec, y); Mean: ARMAX(0,0,0); Variance: GARCH(1,1) Conditional Probability Distribution: Gaussian Number of Model Parameters Estimated: 4 Standard T Parameter Value Error Statistic ----------- ----------- ------------ ----------C -0.0013526 0.0013368 -1.0119 K 0.00027647 0.00014944 1.8500 GARCH(1) 0.77871 0.10106 7.7057 ARCH(1) 0.073557 0.028595 2.5724 Log Likelihood Value: 1728.4 Características de los modelos ARCH y GARCH y algunas de sus extensiones A continuación se presenta un breve resumen de las características de los modelos ARCH y de algunas de las distintas extensiones del modelo GARCH. 119 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Tabla 29. Características de los modelos ARCH y GARCH Modelo ARCH GARCH Alcances • Proveen un marco para el análisis y • El modelo asume que los choques positivos y negativos tienen el misestudio de modelos de volatilidad. • Permite modelar el fenómeno de hemo efecto en volatilidad. terocedasticidad no condicional, aun- • No existe una herramienta que permita seleccionar el valor del orden que sea homocedastico condicional. del modelo, pues el orden requeri• Permite incorporar el fenómeno de do para capturar todas las depenvolatility clustering. • Incorpora per se, el exceso de curtodencias en la varianza condicional puede ser muy alto. Para esto, se sis del error, por lo tanto, las colas de ha definido un decaimiento arbitrala distribución son más anchas que las de la normal. rio dado por la siguiente expresión (Brooks, 2008): Modelamiento en MatLab: Funciones garchfit, tarch (MFE (43) Toolbox) • Permite modelar heterocedasticidad condicional y no condicional (finita) • Modela colas más anchas en los errores que la distribución normal (exceso de curtosis). • Es más parsimonioso y evita la sobreestimación de un ARCH. • Menor probabilidad de incumplir la condición de no negatividad. Funciones garchfit, tarch (MFE Toolbox), ugarch. 120 Limitaciones • Las restricciones de no negatividad de los parámetros del modelo pueden llegar a violarse. Entre más parámetros se incorporen en la ecuación de varianza condicional, mayor es la probabilidad que al menos uno tenga valores negativos. • No provee indicaciones a cerca de las causas de las variaciones de la volatilidad, solo son una solución mecánica al comportamiento de la varianza condicional. • Tienen a sobrestimar la volatilidad debido a que responden lentamente a choques aislados en los retornos. • Las condiciones de no negatividad pueden no llegar a cumplirse. • No permiten feedback entre la varianza condicional y la media condicional. • Respuesta simétrica ante choques positivos y negativos en volatilidad. continua Capítulo 7 / Modelamiento de Volatilidad en MatLab continuación Modelo Alcances GARCH y ARCH con errores no normales • Bajo la especificación clásica, los Limitaciones errores se suponen que se distribuyen normalmente, sin embargo, existe evidencia empírica a cerca del exceso de curtosis de los residuales de este tipo de modelos. Existen variaciones del modelo (p.e, Bollerslev, 1987) que utilizan distribuciones no normales, usualmente, la t-student para los errores. Funciones garchfit, tarch (MFE Toolbox). continua 121 Guía de uso de Matlab en el desarrollo de modelos de volatilidad continuación Modelo IGARCH Alcances Limitaciones • GARCH integrado El modelo general se expresa por • Permite simular casos en los cuales (Hansen, P., Lunde, A., 2005): la varianza condicional es no estacionaria (raíz unitaria en varianza). • Un choque de varianza tiene efectos sobre la volatilidad futura en un horizonte de tiempo infinito. • La varianza no condicional no exis(44) te en este modelo. • Puede darse por cambios ocasionales en los niveles de volatilidad. • El modelo EWMA corresponde a un IGARCH(1, 1) Función • No hay convergencia hacia el pro[outputs] = igarch medio de largo plazo de la varian(EPSILON,P,Q, ERRORTYPE,IGA za no condicional. El pronóstico de RCHTYPE,CONSTANT,STARTINGV varianza tiene a infinito a media ALS,OPTIONS) que el horizonte de tiempo aumen(MFE Toolbox) ta. La expresión para la varianDonde: EPSILON es el vector de daza del modelo IGARCH es (Mills, tos de media cero. P, el orden de in1999): novaciones del modelo. Q, el orden de rezagos del modelo. ERRORTYPE es el tipo de error del modelo 'NORMAL', (45) 'STUDENTST', 'GED' o 'SKEWT'. El vector de outputs es igual al que genera la función tarch del MFE • En el caso del GARCH(1,1), se da toolbox cuando α1 + β = 1. Estimación de un modelo igarch(1,1) sin constante parameters = igarch(y,1,1) • Implica que los choques de la va- rianza condicional persisten indefinidamente (Mills, 1999). Estimación de un modelo igarch(1,1) con constante parameters = igarch(y,1,1,[],[],0) Estimación de un modelo igarch(1,1) con constante e innovaciones tstudent parameters = igarch(y,1,1, 'STUDENTST') 122 continua Capítulo 7 / Modelamiento de Volatilidad en MatLab continuación Modelo AGARCH Alcances Limitaciones • GARCH asimétrico. La especificación de la varianza con• Permite modelar efecto asimétricos dicional está dada por: de choques positivos y negativos. Función AGARCH del MFE Toolbox [outputs] = agarch(EPSILON,P,Q,MODEL _ TYPE,ERROR _ TYPE,STARTINGVALS,OPTIONS) Donde: EPSILON es el vector de datos de media cero. P, el orden de innovaciones del modelo. Q, el orden de rezagos del modelo. MODEL_TYPE es el tipo de modelo, 'AGARCH' (Default) ó 'NAGARCH'. ERRORTYPE es el tipo de error del modelo 'NORMAL', 'STUDENTST', 'GED' o 'SKEWT'. El vector de outputs es igual al que genera la función tarch del MFE toolbox. (46) Un valor negativo de implica que los choques positivos resultan en incrementos de menor magnitud en el valor de la volatilidad futura que los de choques negativos de igual magnitud. El modelo (1,1) se expresa por: Para la estimación de un modelo AGARCH(1,1,1), la instrucción sería: parameters = agarch(y,1,1) Estimacion de un modelo AGARCH(1,1,1) con innovaciones t-student parameters = agarch(y,1,1 , 'STUDENTST') continua 123 Guía de uso de Matlab en el desarrollo de modelos de volatilidad continuación Modelo GJR o TGARCH Alcances Limitaciones • Permite modelar efectos asimétricos El modelo (1, 1) se describe por: • La condición de no negatividad es • La asimetría es una característica de (46) las series de retornos financieros; adicionalmente, los modelos simétricos, en términos de pronóstico, tienen un desempeño menor a los modelos asimétricos (Giot, P., Laurent, S., 2003). Donde It-1 1 si Funciones GARCHFIT (MatLab), 0 de lo contrario TARCH (MFE Toolbox) Por ejemplo, para simulación y estiEl modelo general es (Hansen, P., macion de un GJR-GARCH(1,1,1) Lunde, A., 2005): y = tarch _ simulate(1000, [1 .1 .1 .8], 1, 1, 1) (47) parameters = tarch(y,1,1,1) continua 124 Capítulo 7 / Modelamiento de Volatilidad en MatLab continuación Modelo EGARCH Alcances Limitaciones El modelo (1,1) se describe por la • GARCH exponencial • Permite modelar efectos asimétricos expresión: entre los retornos positivos y negativos sobre la volatilidad. La vola- (48) tilidad responde más rápidamente a caídas en el mercado que a alzas correspondientes (Mills, 1999). • El signo de generalmente es positivo, según la evidencia empírica de tal forma que un choque negativo aumente la volatilidad (Wang, 2008). • Relaja el supuesto de no negatividad utilizando logs sobre la varianza condicional. No se requiere la condición de no negatividad. El modelo (p,q) esta definido por: Función EGARCH (MFE Tolbox) [parameters,ll,ht,vcvrobust (49) ,vcv,scores,diagnostics] = egarch(resid,p,o,q) Los parámetros son los mismos de la función tarch. Por ejemplo, para simular un EGARCH(1, 0, 1) con innovaciones normales: y = egarch _ simulate(1000,[0 .1 .95],1,0,1); Para simular un EGARCH(1,1,1) con innovaciones t-student: y = egarch _ simulate(1000,[0 .1 -.1 .95 6],1,1,1, 'STUDENTST') Para la estimación de un EGARCH(1,1) simétrico: parameters = egarch(y,1,0,1) continua 125 Guía de uso de Matlab en el desarrollo de modelos de volatilidad continuación Modelo GARCH-M Alcances Limitaciones • GARCH en media Se especifica, por ejemplo, por • Permite incorporar el supuesto que a mayor riesgo, mayor retorno. (50) • El retorno del activo es función • de su riesgo (volatilidad). La prima de riesgo, se puede asimilar a la variable δ del modelo. Función GARCHMEAN (UCSD Garch Toolbox) yt = μ + δσ(t-1) + ut (51) (52) [parameters, LLF, ht, errors, SEregression, stderrors, robustSE, scores, likelihoods] = garchinmean(data,ar,ma,p,q, options) Donde: data es el vector de datos. Ar es el orden AR deseado. MA es el orden MA deseado. P es el número de componentes ARCH. Q el número de componentes GARCH. Parameters es el vector de coeficientes arch y garch. LLF es el log-verosimilitud del proceso. Errors es el vector de errores de la regresión. Stderrors son los errores estándar de la regresión. robustSE es la matriz de varianzas y covarianzas robusta de White. Scores es la matriz de scores de coeficientes. Likehoods es el vector de log-verosimilitud de cada observación. continua 126 Capítulo 7 / Modelamiento de Volatilidad en MatLab continuación Modelo FIGARCH Alcances Limitaciones • GARCH Integrado • El modelo FIGARCH(1,d,1) se repreFraccionalmente senta como (Mills, 1999): Busca incorporar el hecho estilizado que la volatilidad presenta me- (56) moria de largo plazo (Mills, 1999); los retornos cuadráticos tienden a tener autocorrelaciones que decaen lentamente. Función figarch(MFE Toolbox) [outputs] = figarch(EPSILON, P, Q, ERRORTYPE, TRUNCLAG) •Estacionario estrictamente cuando 0≤d≤1 •Para cumplir con la condición de EPSILON es el vector de datos de meno negatividad α0 > 0 , α1 + d ≥ dia cero. P es el orden autoregresivo de 0 y 1 - 2(α1 + β ≥ d ≥ 0 memoria corta, debe ser cero (0) o uno (1). Q. es el orden del proceso de media, debe ser cero (0) o uno (1). ERROR _ TYPE es el tipo de error 'NORMAL', 'STUDENTST', 'GED' o 'SKEWT'. TRUNCLAG es el punto de corte para la representación ARCH ( ). Estimación de un modelo FIGARCH(0,d,0) parameters = figarch(y,0,0) Estimación de un modelo FIGARCH(1,d,0) parameters = figarch(y,1,0) Estimación de un modelo FIGARCH(1,d,1) con errores tstudent parameters = figarch(y,1,1, 'STUDENTST') 127 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Modelos multivariados La mayor limitante de los modelos ARCH y GARCH es que son exclusivamente univariados, es decir, se modela la volatilidad de cada serie de forma separada, aunque son los mayormente estudiados en la literatura (Sebastian, 1998). Sin embargo, para estudiar el comportamiento de portafolios de activos (Engle, R., Focardi, S., Fabozzi, F., 2008) los movimientos entre retornos financieros también son de importancia práctica (Andersen, T. G., Davis, R. A., Kreiss, J.P. y Mikosch, T. 2009; Zang, K, Laiwan, C., 2009). El utilizar modelos univariados tiene dos (2) efectos importantes (Brooks, 2008): • • No tener en cuenta los efectos de “volatility spillovers”, que se presentan cuando un cambio brusco de volatilidad en un mercado, es seguido por un cambio en volatilidad en otro. Así como las varianzas son importantes, también lo son las covarianzas entre activos. En finanzas, múltiples elementos utilizan el concepto de covarianza, como lo son el cálculo del VaR en portafolios, los betas del modelo CAPM, entre otros. En este orden de ideas, implementar modelos multivariados tiene dos ventajas primordiales (Fan, J., Wang, M., Yao, Q, 2008): • • Las correlaciones variantes en el tiempo entre diferentes activos son importantes y útiles en temas tales como optimización de portafolios, valoración de activos y administración de riesgos. Los modelos univariados pueden ser mejorados de tal forma que incorporen información relevante de otros modelos relacionados. Es más, al utilizar modelos multivariados se asume que los precios del activo en estudio no evolucionan de forma independiente al mercado en el que se encuentra inmerso (Engle RF, Patton A.,2001). Es por esto que el uso de modelos multivariados lleva a modelos empíricos más relevantes que al trabajar con modelos univariados (Bauwens, et al, 2006). Un uso tradicional de los modelos GARCH es el estudio de volatilidades entre diferentes mercados (Bauwens, et al, 2006; Kearney, Paytton, 2000; Karolyi, 1995). 128 Capítulo 7 / Modelamiento de Volatilidad en MatLab Sin embargo, extender los modelos univariados al campo multivariado conlleva ciertas dificultades, primordialmente (Kawakatsu, 2006; Engle R., Focardi, S., Fabozzi, F., 2008) las siguientes: • • Dimensionalidad: a medida que el número de dimensiones K dentro del modelo se expande, lo hace a su vez el número de parámetros a calcular. De forma general, el número de parámetros es de orden O(K4) crece de forma cuadrática en K. Condición de no negatividad: se debe encontrar una especificación del modelo que mantenga la condición que la matriz de varianzas y covarianzas sea positiva semidefinida. Modelación de Covarianzas Al igual que en el caso univariado, para el cual existen diversos modelos para el cálculo de volatilidad, en el caso multivariado, existen diferentes modelos que pueden ser utilizados para el pronóstico de covarianzas. Los principales modelos se presentan a continuación. Características de la matriz de varianzas-covarianzas • • La matriz de varianzas-covarianzas debe ser positiva-semidefinida. Entre otras cosas, significa que (Brooks, 2008; Bauwens et al, 2006; Andersen et al, 2009). • Todos los elementos de la diagonal deben ser positivos. • Debe ser simétrica respecto a su diagonal. Un caso particular, cuando los retornos son todos igualas, las varianzas son cero, por lo tanto, la matriz es positiva definida. Modelo de covarianza y correlación históricas De la misma forma que en el caso univariado la volatilidad puede ser calculada utilizando la serie histórica de datos, las covarianzas y correlaciones históricas entre diversas series de datos pueden ser calculadas usando un set de datos históricos. 129 Guía de uso de Matlab en el desarrollo de modelos de volatilidad La correlación entre dos series de datos puede calcularse a partir del coeficiente de correlación de Spearman, según la siguiente expresión: (57) La matriz de covarianzas se determina según: (58) Para modelar la matriz de varianzas y covarianzas histórica, tal y como se expuso previamente, se utiliza la función cov de MatLab: Varianzas_covarianzas = cov(R) Donde R es una matriz de retornos. Así mismo, la instrucción sqrt(diag(cov(R))) corresponde al vector de desviaciones estándar que puede ser calculado con std(R). Modelos de covarianza implícita Las covarianzas implícitas pueden ser calculadas a partir de opciones sobre el activo subyacente. Debido al reducido número de este tipo de derivados limitan el número de activos sobre los cuales se pueden calcular sus covarianzas implícitas. Modelos de promedio móvil ponderado exponencialmente Al igual que en el caso univariado, el modelo EWMA (Exponentially widghted moving average) puede ser utilizado; en el cual, las observaciones más recientes tienen un impacto mayor sobre el pronóstico de covarianza que las observaciones más antiguas, de tal forma que la importancia o peso de las observaciones cae de manera exponencial (RiskMetrics, 1996). 130 Capítulo 7 / Modelamiento de Volatilidad en MatLab El valor de la covarianza se define por la siguiente expresión: (59) Donde λε(0,1) es el parámetro de decaimiento. Al igual que en el caso univariado, el modelo EWMA multivariado corresponde a un I-GARCH. Para el cálculo de la matriz de varianzas-covarianzas por el modelo EWMA, se utilizan las mismas instrucciones que se presentaron en el caso univariado, con la diferencia que el vector de retornos, en este caso, es una matriz. Modelos GARCH multivariados Los modelos GARCH multivariados incluyen una definición para determinar cómo las covarianzas cambian en el tiempo. Existen diversos tipos de modelos GARCH multivariados, a continuación se presentan los más utilizados en la literatura. Los modelos MGARCH han sido utilizados en diferentes contextos (Tse, Y.K., Tsui, A., 2002) a series financieras, por ejemplo, Bollerslev (1990) lo aplica a los cambios de estructura de varianza de régimen de tasa de cambio del sistema monetario europeo. Kroner y Claessens (1991) calculan a través de su modelo multivariado, el portafolio óptimo de deuda de varias divisas. Karolyi (1995) lo utiliza para identificar la transmisión de retornos y volatilidades de forma internacional. Para efectos de simplicidad de notación, se presentan las versiones (1, 1) de los modelos. La matriz de varianzas-covarianzas se define por Ht. El modelo VECH Este modelo fue desarrollado por Bollerslev, Engle y Wooldridge (1988), el cual es una generalización del modelo GARCH al caso multivariado (Andersen et al 2009). En este modelo, cada elemento de la matriz de varianzas y covarianzas Ht es una función lineal de los errores cuadráticos rezagados y los productos cruzados de los errores y los valores rezagados de los elementos de Ht (Brooks, 2008; Bauwens et al, 2006, Long, 2005). 131 Guía de uso de Matlab en el desarrollo de modelos de volatilidad El modelo VECH puede expresarse como (Andersen, 2009), así: (60) Para el caso VECH(1, 1), en forma compacta: (61) Con Para este caso particular, el modelo puede escribirse como (Brooks, 2008): (62) (63) (64) Donde Ht es la matriz de varianza-covarianza condicional, es la matriz de innovación (perturbaciones; errores) de 2x1, es el vector del conjunto de información, C es un vector de parámetros de 3x1 y A y B son vectores de parámetros de 3x3. VECH (.) es el operador que apilamiento de columnas de la matriz simétrica que toma una matriz de NxN y la transforma en un vector de N(N+1)/2 x 1. Para comprender el uso del operador VECH, se presentan dos ejemplos sencillos: (65) (66) 132 Capítulo 7 / Modelamiento de Volatilidad en MatLab (67) El número de parámetros se determina según la siguiente expresión (Andersen et al, 2009) (p + q) (N (N + 1)/ 2)2 + N (N + 1 )/ 2 . En el caso de 2 activos, deben estimarse 21 parámetros. Aunque el modelo presenta diferentes ventajas por ser flexible, además del alto número de parámetros a estimar, presenta ciertas desventajas. La principal desventaja del modelo VECH es que no garantiza que la matriz de varianzas-covarianzas sea positiva semidefinida (Brooks, 2008; Andersen, 2009); pues se cuenta con condiciones suficientes pero no necesarias para el cumplimiento de esta condición (para el detalle de estos elementos véase Gouriéroux, 1997). Para la implementación en MatLab, se utiliza la función cc_mvgarch del UCSD_GARCH toolbox, de la siguiente forma: [parameters, loglikelihood, R ,Ht, likelihoods, stdresid, unistdresid, hmat, stderrors, A, B, jointscores]=cc_mvgarch(data,archP,garchQ) Donde: Data: es la matriz de txk de media cero de datos a evaluar. archP: define el modelo ARCH para la serie. Si es vacío, se calcula un modelo de orden 1 por cada serie. Si es un escalar p, se calcula un modelo de orden p por cada serie. Si es un vector de kx1, la serie i, tiene el modelo archP(i). garchP: define el modelo GARCH para la serie. Si es vacío, se calcula un modelo de orden 1 por cada serie. Si es un escalar q, se calcula un modelo de orden q por cada serie. Si es un vector de kx1, la serie i, tiene el modelo garchQ(i). parameters: vector de parámetros del modelo estimado de la forma [GarchParams(1) GarchParams(2) . . . GarchParams(k) Correlation(ccvech de la matriz de correlación)]. Donde garch parameters para cada estimación son de la forma [omega(i) 133 Guía de uso de Matlab en el desarrollo de modelos de volatilidad alpha(i1) alpha(i2) . . . alpha(ip(i)) beta(i1) beta(i2) . . . beta(iq(i))] loglikelihood: log-verosimilitud evaluada en el máximo. R: matriz de kxk de correlaciones. Ht: matrix de kxkxt de varianzas condicionales. Likelihoods: vector de tx1 de verosimilitudes. Stdresid: residuales estandarizados multivariados. Unistdresid: residuales estandarizados multiplicados por sus corres- pondientes desviaciones estándar. Hmat: matriz de txk de varianzas condicionales. Stderrors: matriz de length(parameters)2 de errores estimados. A: Matriz A estimada. B: Matriz B estimada. Scores: matriz de txlength(parameters) de puntjes de verosimilitud estimados. El modelo VECH Diagonal Debido a que el numero de parámetros para un modelo VECH son grandes y que dicho número de parámetros se incrementan de forma importante, a medida que aumenta el número de activos, una simplificación al modelo original se puede hacer suponiendo que las matrices A y B son diagonales (Bollerslev et al, 1988). De esta forma, el número de parámetros para el modelo de dos activos se reduce a nueve. El modelo, para el caso (1, 1) se caracteriza por la siguiente ecuación (Brooks, 2008): (68) , , , Según Bauwnes et al (2006), una forma de derivar de forma simple las condiciones de no negatividad sobre la matriz de varianzas-covarianzas, se puede hacer expresando el modelo en función de productos Hadamard. (69) Para cumplir la condición de no negatividad (para una prueba, véase Attanasio, 1991), C0, A0 ,G 0 y los valores iniciales de la matriz H0 sean positivas semidefinidas. Esta condición puede ser impuesta a través de una descomposición de Cholesky sobre las matrices de la ecuación anterior. 134 Capítulo 7 / Modelamiento de Volatilidad en MatLab Para la especificación del modelo EWMA, éste puede ser expresado en términos de un modelo VECH Diagonal (Bauwens, 2006). Si se toma el modelo EWMA (I-GARCH) original: (70) , , Reexpresado en términos de un modelo VECH Diagonal: (71) Donde El modelo BEKK (Baba-Engle-Kraft-Kroner) Este modelo fue desarrollado por Engle y Kroner (1995) como un caso especial del modelo VECH (Baurens et al, 2006; Andersen et al, 2009) y busca asegurar que la matriz de varianzas y covarianzas sea en todos los casos, positiva definida, pues lo es por construcción (Brooks, 2008; Bauwens, 2006; Andersen et al, 2009; Ledoit O., Santa-Clara P., Wolf M., 2003). El modelo BEKK generalizado se representa por la siguiente expresión (Andersen, et al, 2009, Fan, J. et al 2008): (72) Donde W, Bkj, Akj son matrices de NxN con la salvedad que W es una matriz triangular superior. 135 Guía de uso de Matlab en el desarrollo de modelos de volatilidad El modelo BEKK posee diversos problemas (Fan, J., Wang, M., Yao, Q, 2008), siendo el más importante la sobreparametrización del mismo, que puede llevar a una función de verosimilitud plana, haciendo que la inferencia estadística del modelo sea difícil y computacionalmente exigente. Para el caso de (1, 1, 1) se expresa de la siguiente forma (Brooks, 2008) (73) Como ejemplo, el modelo BEKK(1, 1, K) se expresa como sigue: (74) El límite K de la sumatoria representa la generalidad del proceso. En el caso del modelo BEKK (1, 1, 1), el número de parámetros es igual a N(5N + 1)/2 (Bauwens, 2006). Para el BEKK general, el número de parámetros se es (p + q)KN2 + N(N + 1 )/2 (Andersen et al, 2006). Si el número de parámetros del modelo es muy alto, puede imponerse la restricción de diagonal (BEEK Diagonal); al igual que en el caso del modelo VECH Diagonal, con la ventaja que en el caso del BEEK Diagonal, la restricción de no negatividad se garantiza. Para el modelo BEKK Diagonal completo, el número de parámetros es (p + q)KN + N(N + 1 )/2 . Por lo tanto, la mayor limitante del modelo BEKK, que se comparte con el modelo VECH, es el estimar el alto número de parámetros por lo que son poco usados cuando el número de series es mayor a 3 o 4 (Bauwens et al, 2006). El valor esperado de la varianza no condiciona es (Wang, 2008): (75) En términos de estacionariedad, el modelo BEKK es estacionario en varianza si los valores propios de la siguiente expresión es menor a uno (Andersen et al, 2006). (76) 136 Capítulo 7 / Modelamiento de Volatilidad en MatLab O expresado de otra forma (Wang, 2008): (77) Una sobresimplificación del modelo puede darse a través del denominado BEKK Escalar, donde las matrices Akj = aI y Bkj = aI se definen con y son escalares. Existen diversas modificaciones al modelo BEKK, sin embargo, una que vale la pena mencionar, es aquella bajo la cual no es necesaria la imposición de restricciones adicionales de no negatividad de la matriz Ht. Uno de estos modelos es el denominado GARCH Exponencial Matricial (Kawakatsu, 2006), el cual corresponde a una generalización del GARCH Exponencial (Nelson, 1991). En resumen, se aplica el exponencial al logaritmo de la matriz de varianzas y covarianzas, y de ello resulta una matriz definida positiva. Lo anterior debido a que cualquier matriz cuadrada de NxN A, su exponencial puede definirse por la serie de expansión (Kawakatsu, 2006), la cual converge para cualquier matriz A, así: (78) Para el caso de la matriz de varianzas y covarianzas Ht, se tiene además que la matriz es simétrica. En este caso, se puede demostrar que eA es simétrica y positiva semidefinida con inversa e-A (para prueba, véase Kawakatsu, 2006). (79) 137 Guía de uso de Matlab en el desarrollo de modelos de volatilidad En este caso Ai, Bj y Fj en este caso son matrices de parámetros a ser estimadas. El número de parámetros totales a estimar son k * + k *2 p + 2kk * q donde k * = k (k+1) /2. Para la estimación de modelos BEKK, se emplean las funciones scalar_ bekk_mvgarch, diagonal_bekk_mvgarch, full_bekk_mvgarch, scalar_bekk_T_mvgarch, diagonal_bekk_T_mvgarch y full_ bekk_T_mvgarch del toolbox UCSD_GARCH. Tabla 30. Funciones para estimación de modelos BEKK Función Descripción Data, p y q tienen la misma implicación que en la estimación del modelo VECH descrita previamente. Parameters es un vector de (k*(k+1))/2+p+q de parámetros estimados. Para recuperar el parámetro C use [parameters, loivech(parameters(1:(k*(k+1))/2) . loglikeglikelihood, Ht, lihood: log-verosimilitud evaluada en el máximo. Ht likelihoods, stes una matriz de k x k x t de varianzas condicionales. dresid, stderrors, Likelihoods: vector de tx1 de verosimilitudes. StA, B, scores] = dresid: matriz de txk residuales estandarizados mulscalar _ bekk _ tivariados. Stderrors: matriz de length(parameters)2 mvgarch(data,p,q) de errores estimados (A^(-1)*B*A^(-1)*t^(-1)) A: Matriz A estimada inversa de errores estándar no robustos. B: Matriz B estimada de covarianzas de scores. Scores: matriz de txlength(parameters) de puntajes de scores individuales. Data , p y q, parameters, loglikelihood, [parameters, loHt, likelihoods, stdresid, stderrors, A, glikelihood, Ht, B, scores representan los miso que en el caso de la funlikelihoods, stción scalar _ bekk _ mvgarch. La única diferencia dresid, stderrors, es que el vector parameters es de (k*(k+1))/2+p*k+q*k, A, B, scores] = reduciéndose entonces la dimensión; así, la matriz correcdiagonal _ bekk _ ta se obtiene de diag(parameters). Para recuperar C, mvgarch(data,p,q) ivech(parmaeters(1:(k*(k+1))/2) Data , p y q, parameters, loglikelihood, [parameters, loHt, likelihoods, stdresid, stderrors, A, glikelihood, Ht, likelihoods, stB, scores representan los miso que en el caso de la función dresid, stdescalar _ bekk _ mvgarch. La única diferencia es que rrors, A, B, scores] el vector parameters es de (k*(k+1))/2+p*k^2+q*k^2, = full _ bekk _ la matriz correcta se obtiene reshape(X,k,k). Para recuperar C, ivech(parmaeters(1:(k*(k+1))/2) mvgarch(data,p,q) continua 138 Capítulo 7 / Modelamiento de Volatilidad en MatLab continuación Función [parameters, loglikelihood, Ht, likelihoods, stdresid, stderrors, A, B, scores] = scalar _ bekk _ T _ mvgarch(data,p,q) [parameters, loglikelihood, Ht, likelihoods, stdresid, stderrors, A, B, scores] = diagonal _ bekk _ T _ mvgarch(data,p,q); [parameters, loglikelihood, Ht, likelihoods, stdresid, stderrors, A, B, scores] = full _ bekk _ T _ mvgarch(data,p,q); Descripción Data , p y q, parameters, loglikelihood, Ht, likelihoods, stdresid, stderrors, A, B, scores representan los mismo que en el caso de la función scalar _ bekk _ mvgarch. La única diferencia es que el vector parameters es que los errores se distribuyen t-student Data , p y q, parameters, loglikelihood, Ht, likelihoods, stdresid, stderrors, A, B, scores representan los mismo que en el caso de la función diagonal _ bekk _ mvgarch. La única diferencia es que los errores son distribuidos t-student Data , p y q, parameters, loglikelihood, Ht, likelihoods, stdresid, stderrors, A, B, scores representan los mismo que en el caso de la función full _ bekk _ mvgarch. La única diferencia es que los errores se distribuyen t-student Modelos de factores Los modelos de factores fueron motivados por ser mas parsimoniosos, pero principalmente, por la teoría económica. En estos modelos se supone que las observaciones se generan a partir de variables comunes, denominadas factores, que son heterocedásticos condicionalmente y que se ajustan a una estructura de tipo GARCH (Andersen et al, 2009); de esta forma, en el mercado de acciones, los movimientos conjuntos de los precios se deben a un número reducido de factores (Bauwens et al, 2006, Long 2005). Así, se reduce el problema de dimensionalidad de los modelos VECH y BEKK cuando el número de factores, en relación con el número de activos bajo análisis, es bajo. Siguiendo a Andersen (2009), se supone que Ht es generado por K(<N) factores fk,t, no necesariamente no correlacionados, que siguen la estructura GARCH de primer orden que se presenta a continuación: 139 Guía de uso de Matlab en el desarrollo de modelos de volatilidad (80) Donde Ω es matriz, positiva semidenfinida de NxN, wk,k=1,2,···,K vectores linealmente independintes de pesos de factores de Nx1 y fk,t son los factores. Se asume que los factores siguen un proceso GARCH de primer orden, regido por: (81) fk,t=ωk+αk (γ´k rt-1)2 + βk fk,t-1 Con ωk, αk y βk escalares y γ´k es un vector de Nx1 de pesos. Con esta especificación se busca que K, es decir, el número de factores, sea substancialmente menor que N, el número de activos. Aunque la estructura presentada previamente no exige que los factores no estén correlacionados, ésta puede ser una característica no deseable, debido a que puede resultar en que diversos factores capturen características similares. Cuando los factores no son correlacionados entre sí, capturan características independientes, por lo que es común el encontrar modelos con esta característica. En estos modelos, el proceso económico {xt} (retornos para el caso de activos), se conectan con los factores Zt, a través de una combinación lineal no correlacionada de éstos. (82) Xt = Wzt Para la estimación del modelo de factures, se puede utilizar la función o_ mvgarch de la librería UCSD_GARCH. [parameters, Ht, stdresid, stderrors, A, B, weights, principalcomponets, cumR2]=o_mvgarch(data, numfactors,archP,garchQ) Donde: Data: es la matriz de txk de media cero de datos a evaluar. Numfactors: el número de componentes principales a incluir en el modelo archP: define el modelo ARCH para la serie. Si es vacío, se calcula un modelo de orden 1 por cada serie. Si es un escalar p, se calcula un modelo de orden p por cada serie. Si es un vector de kx1, la serie i, tiene el modelo archP(i) 140 Capítulo 7 / Modelamiento de Volatilidad en MatLab garchP: define el modelo GARCH para la serie. Si es vacío, se calcula un modelo de orden 1 por cada serie. Si es un escalar q, se calcula un modelo de orden q por cada serie. Si es un vector de kx1, la serie i, tiene el modelo garchQ(i). parameters: vector de parámetros del modelo estimado de la forma [GarchParams(1) GarchParams(2) . . . GarchParams(k) Correlation(ccvech de la matriz de correlación)]. Donde garch parameters para cada estimación son de la forma [omega(i) alpha(i1) alpha(i2) . . . alpha(ip(i)) beta(i1) beta(i2) . . . beta(iq(i))] Ht: matrix de kxkxt de varianzas condicionales. Stdresid: residuales estandarizados multivariados (solo si numfactors = k). Unistdresid: residuales estandarizados multiplicados por sus corres- pondientes desviaciones estándar. Hmat: matriz de txk de varianzas condicionales. Stderrors: matriz de length(parameters)2 de errores estimados. A: Matriz A estimada. B: Matriz B estimada. Scores: matriz de txlength(parameters) de puntajes de verosimilitud estimados. Weights: matriz de kxk de pesos de los componentes. Principalcomponents: matriz de txk de componentes principales. cumR2: R2 acumulado en el iésimo componente principal. 141 Bibliografía Andersen, T. G., Davis, R. A., Kreiss, J.P. y Mikosch, T. (2009).Handbook of Financial Time Series. Falta ciudad y nombre de la editorial. Springer. New Yor. (La Editorial es Springer) Attanasio, O. (1991). Risk, time-varying second moments and market efficiency. Review of Economic Studies 58, pp. 479–494. Bauwens, L.; Sebastien, L.; Rombouts, J. (2006).Multivariate GARCH Models: A survey. Journal of applied econometrics21 (79), p.109. Bera, A. K., Higgins, M. L. (1993). ARCH models: properties, estimation and testing. Journal of Economic Surveys 7, pp.305-362. Bollerslev, T, Chou, R.Y., Kroner, K.F. (1992). ARCH modeling in finance: a review of the theory and empirical evidence. Journal of Econometrics 52,pp. 5-59. Bollerslev, T., Engle, R.F., Nelson, D.B. (1994). ARCH models. Handbook of Econometrics, Engle, R., McFadden, D., (eds). Amsterdam: North Holland Press. Bollerslev, T. (1990). Modelling the coherence in short-run nominal exchange rates: a ultivariate generalized ARCH approach. Review of Economics and Statistics, 72, 498-505. Bollerslev, T. (2001). Financial econometrics: past developments and future challenges. Journal of Econometrics, 100, 41-51. Box, G., Jenkins, G.M. (1970). Time Series Analysis, Forecasting and Control. Holden-Day: San Francisco. Brooks, C. (2008). Introductory Econometrics for finance. Cambridge University Press. Second Edition. 145 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Campbell, J., Lo, A., MacKinlay, A. (1997). The econometrics of financial markets. Princenton University Press. First Edition. Castaño, E., Gómez, K., Gallón, S. (2008). Pronóstico y estructuras de volatilidad multiperiodo de la tasa de cambio del peso colombiano. Cuadernos de Economía, 48, pp. 241-266. Chakraborti, A., Santhanam, M. (2005). Financial and other spatio-temporal time series: long-range correlations and spectral properties. International Journal of Modern Physics, 16, 11, pp. 1733-1743. Dusan, M. (2002). Forecast generating for ARCH-GARCH processes using the MatLab procedures. Institute of Computer Science, Faculty of Philosophy and Science, The Silesian University Opava. Embrechts, P., Mikosch, T. (2000).Mathematical models in finance. Working paper. Engle, R.F. (1982). Autoregressive conditional heteroscedasticity with estimates of the variance of United Kingdom inflation. Econométrica 50, pp.987–1007. Engle, R., Kroner, F.K. (1995). Multivariate simultaneous generalized ARCH. Econometric Theory 11, pp.122–150. Engle, R.F., Patton, A. (2001). ¿What good is a volatility model? Quantitative Finance, 1, pp.237-245. Engle, R.F. (2001). Financial econometrics: a new discipline with new methods. Journal of Econometrics 100, pp.53-56. Engle, R.F. (2002). New Frontiers of GARCH models. Journal of Applied Econometrics, 17, pp. 425- 446. Engle, R.F., Rangel, G. (2006). The Spline-GARCH Model for Unconditional Volatility and its Global Macroeconomic Causes. Working Paper No. SC-CFE-04-05, forthcoming Review of Financial Studiess. Engle, R.F., Focardi, F., Fobozzi, F. (2008). Handbook Series in Finance, ChapterARCH/GARCH Models in Applied Financial Econometrics. JonhWiley and Sons: New York. 146 Bibliografía Fan, J., Wang, M., Yao, Q. (2008). Modelling Multivariate volatilities via conditionally uncorrelated components. Journal of Royal Statistical Society, 70, Part 4, pp. 679- 702. Frances, P.H., Van, Dick D. (1996). Forecasting stock market volatility using (non linear) GARCH methods. Journal of forecasting, 15, pp.229-235. Franses, P.H. McAleer, M. (2002). Financial volatility: an introduction. Journal of applied econometrics. 17, pp. 419 – 424. Giot, P., Laurent, S. (2003). Value-at-risk for long and short trading positions. Journal of applied econometrics, 18, (6), pp. 641-664. Gouriéroux, C. (1997). ARCH Models and Financial Applications. New York: Springer-Verlag.. Goyal, A. (2000). Predictibility of stock return volatility from GARCH models. Anderson Graduate School of Management, UCLA. Working paper. pp. 1- 44. Hansen, P., Lunde, A. (2005). A forecast comparison of volatility models: does anything beat a GARCH (1, 1)? Journal of applied econometrics, 20, pp. 873-889. Hayashi, F. (2000). Econometrics. Princenton University Press, Pincenton. Second Edition Huang, D., Wang, H., Yao, Q. (2008). Estimating GARCH models: when to use what? Econometrics Journal, 11, pp. 27- 38. Hull, J. (2002). Options, Futures and other derivatives. New York: Prentice Hall, Finance Series. Fifth Edition.. Karolyi, G.A. (1995). A multivariate GARCH model of international transmission of stock returns and volatility: the case of the United States and Canada. Journal of Business and Economic Statistics 13, 11-25. 147 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Kroner, K. F., Claessens, S. (1991), Optimal Dynamic Hedging Portfolios and the Currency Composition of External Debt. Journal of International Money and Finance, 10, pp.131-148. Kawakatsu, H. (2006). Matrix exponential GARCH. Journal of Econometrics, 134, pp.95–128. Kearney, C., Patton, A.J. (2000). Multivariate GARCH modelling of exchange rate volatility transmission in the European Monetary System. Financial Review 41, 29-48. Lega, P.; Murcia, A.; Vásquez, D.; Venegas, T. (2007). Volatilidad de la tasa de cambio nominal en Colombia y su relación con algunas variables. Borradores de Economía, 473. Bogotá: Banco de la República Ledoit, O., Santa-Clara, P., Wolf, M. (2003). Flexible multivariate GARCH modeling with an application to international stock markets. The review of Economics and Statistics, 3, 83, pp 735-747. Liu, Q., Morimune, K. A. (2006). Modified GARCH model with spell of shocks. Asia-Pacific Financial Markets, 12, pp. 29-44. Long, X. D. (2005). Semiparametric multivariate GARCH model. FMA European Conference. MathWorks (2005). MatLab user reference. Natick, MA. McMillan, D., Speight, A. (2004). Daily Volatility Forecast: reassesing the performance of GARCH models. Journal of Forecasting, 23, pp. 449-460. Mills, T. (1999). The econometric modelling of financial time series. Cambridge: University Press. Second Edition. Nelson, D. B. (1991): Conditional heteroskedasticity in asset returns: a new approach. Econométrica, 59, pp.347-70. Nelson, D. B., Cao, C.Q. (1992). Inequality constraints in the univariate GARCH model. Journal of Business and Economic Statistics, 10, 2, pp.229--235. 148 Bibliografía Pagan, A. (1996). The econometrics of financial markets. Journal of Empirical Finance, 3, pp.15–102. Palm, F.C. (1996). GARCH models of volatility. In Handbook of Statistics, Maddala GS, Rao CR (eds). Amsterdam: Elsevier Science.. Pong, S., Granger, C. (2003). Forecasting volatility in financial markets: a review. Journal of Economic Literature, 41, pp. 478- 539. RiskMetrics Group. (1999). Risk Management: a Practical Guide. RiskMetrics. Risk Metrics Group. New York. Sentana, E. (1998). The relation between conditionally heteroskedastic factor models and factor GARCH models. Econometrics Journal, 1, pp. 1–9. Shephard, N. (1996). Statistical aspects of ARCH and stochastic volatility. En Time Series Models in Econometrics, Finance and Other Fields, Hinkley DV, Cox DR, Barndorff-Nielsen OE (eds). Chapman & Hall: London. Tse, Y.K., Tsui, A. (2002). A multivariate generalized autoregressive conditional heterocedasticity model with time-varying correlations. Journal of business and economics statistics, 20, 3, pp. 351-362. Tsay, R. (2005). Analysis of financial time series, 2a. ed. Wiley Series in Probability and Statistics. New Jersey. Valderas, J.; Alba, J.; Olmedo, E. (2002). Modelación estocástica en los mercados financieros: un Puente entre lo simple y lo complejo. [Versión electrónica]. Encuentros multidisciplinares, 12, Pp.1-10, from http://www.encuentros-multidisciplinares.org/Revistan%C2%BA12/Juan%20 Manuel%20Valderas;%20Jos%C3%A9%20M%C2%AA%20Alba;%20 Elena%20Olmedo.pdf. Van der Weide, R. (2002). GO–GARCH: a multivariate generalized orthogonal GARCH model, Journal of Applied Econometrics, 17, pp.549-564. Wang, P. (2009). Financial Econometrics. Routledge. Second Edition. New York. 149 Guía de uso de Matlab en el desarrollo de modelos de volatilidad Wooldridge, F. (2005). Econometric Analysis of cross section and panel data. MIT Press. Boston. Zang, K., Chan, L. (2009). Efficient Factor GARCH models and factorDCC models. Quantitative Finance, 9 (1), pp.71- 91. 150 La cartilla va dirigida a estudiantes y profesionales de Ingeniería, Finanzas, Administración y Economía que deseen adquirir conocimientos respecto al uso de MatLab y primordialmente, en la implementación de modelos de volatilidad con esta herramienta. El libro busca responder a una necesidad latente relacionada con la dificultad de enlazar la teoría y la práctica del análisis de volatilidad, pues que además de los conceptos teóricos se presentan los fundamentos de implementación de los modelos tradicionales Arch y Garch por medio de una herramienta de amplia difusión como lo es MatLab. El libro es importante desde el punto de vista teórico pues se hace una congregación de las primordiales técnicas de modelamiento de volatilidad a través de modelos Arch y Garch, tanto univariados como multivariados; y desde el punto de vista práctico, pues dichos modelos teóricos se implementan por medio de MatLab.