Mostrando entradas con la etiqueta Matlab. Mostrar todas las entradas
Mostrando entradas con la etiqueta Matlab. Mostrar todas las entradas

7 mar 2024

Filtro Hodrick Prescott informado en Matlab e Iris

El siguiente ejemplo muestra cómo obtener estimaciones de la brecha de producción usando el filtro hp para distintos periodos. En primer lugar, cargamos los datos del gdp real, disponible en el Banco Central en frecuencia trimestral.

Tomamos el logaritmo del PIB y realizamos el ajuste estacional usando el procedimiento x12.

%Do housekeeping   
close all; clear; clc;
 
load('data_for_model_dom.mat');
 
dq.l_gdp = 100*log(dq.GDP_U);
dq.l_gdp_adj = x12(dq.l_gdp);
 
dbplot(dq,sdate:ehist,{'"GDP and potential GDP" [l_gdp,l_gdp_adj]'},'Linewidth',2);


Posteriormente, estimamos el PIB potencial usando el filtro hp de IRIS (versión [IrisToolbox] for Macroeconomic Modeling Release 20211222).

[dq.l_gdp_bar,dq.l_gdp_gap] = hpf(dq.l_gdp);
[dq.l_gdp_bara,dq.l_gdp_gapa] = hpf(dq.l_gdp_adj);
 
% set important dates
sdate = qq(2012,1);
ehist = qq(2023,4);
 
dbplot(dq,sdate:ehist,{'"GDP and potential GDP" [l_gdp_adj, l_gdp_bara]'},'Linewidth',2);


Finalmente, usamos el objeto lbar_tnd para informarle que valores queremos tenga el PIB potencial en determinados periodos. Note por ejemplo que sin informar el efecto COVID tienen un efecto sobre el PIB potencial que inicia antes de 2020.

lbar_tnd = Series([sdate,qq(2012,2)    ,qq(2019,4)],...
                 [dq.l_gdp(qq(2012,2)),dq.l_gdp(qq(2012,2)),520]);
[dq.l_gdp_bara1,dq.l_gdp_gapa1] = hpf(dq.l_gdp_adj,'level',lbar_tnd);
 
dbplot(dq,sdate:ehist,...
    {'"GDP and potential GDP" [l_gdp_adj, l_gdp_bara, l_gdp_bara1]', ...
    '"Cycle GDP" [l_gdp_gapa1]'},...
    'Linewidth',2, ...
    'zeroline',true, ...
    'highlight',qq(2020,1):qq(2020,4));
legend('Obs','hp','Location','best');




26 sept 2023

Modelo de Oferta y Demanda en Matlab

Syms es una función que se utiliza para declarar símbolos o variables simbólicas. Estos símbolos no tienen un valor numérico asignado de forma predeterminada, en contraste con las variables normales en MATLAB que almacenan valores numéricos. En su lugar, los símbolos se utilizan para realizar cálculos simbólicos, como álgebra simbólica, cálculo, manipulación de expresiones matemáticas y resolución de ecuaciones simbólicas.

syms x
ezplot(x^2 - x*1.5, [-2 2])

Puedes utilizar syms en MATLAB para simular las curvas de oferta y demanda mediante ecuaciones simbólicas y luego graficar los resultados. Definiendo con syms las variables del modelo, posteriormente necesitamos definir las expresiones que definen las curvas de oferta y demanda y resolver el sistema de ecuaciones (solve). Posteriormente se utiliza la función subs, que permite remplazar valores dentro de una expresión simbólica. Es decir, dentro de la función demanda, podemos recuperar los valores para el precio de demanda que corresponden a cada una de las cantidades demandadas[1].

 syms P Q
 
oferta = 1.2*Q + 5;
demanda = 10 - 0.45*Q;
 
equilibrio = solve(oferta == demanda, [P, Q]);
 
Q_values = linspace(0, 10, 100); % Valores de Q para el gráfico
 
oferta_values = subs(oferta, Q, Q_values);
demanda_values = subs(demanda, Q, Q_values);

Finalmente, se grafican los resultados. Teniendo en cuenta que, en MATLAB, se utiliza el comando figure antes de crear un gráfico para crear una nueva ventana de figura o lienzo de dibujo en la que se mostrará el gráfico. Esto es útil cuando deseas tener múltiples gráficos en ventanas separadas o cuando deseas personalizar aspectos específicos de la figura, como su tamaño o propiedades. Hold on permite anexar series a un mismo gráfico, como múltiples layers en el caso de ggplot2 para los usuarios de R. Finalmente, se agregan las etiquetas y las opciones sobre formato del gráfico.

figure;
plot(Q_values, oferta_values, 'b', 'LineWidth', 2);
hold on;
plot(Q_values, demanda_values, 'r', 'LineWidth', 2);
scatter(equilibrio.Q, equilibrio.P, 100, 'k', 'filled'); % Punto de equilibrio
xlabel('Cantidad (Q)');
ylabel('Precio (P)');
title('Curvas de Oferta y Demanda');
legend('Oferta', 'Demanda', 'Equilibrio', 'Location','best');
grid on;


[1] syms x y
 
expr = x^2 + y;
valor_x = 3;
valor_y = 4;
 
resultado = subs(expr, [x, y], [valor_x, valor_y]);

23 nov 2022

Modelo de análisis macroeconómico Bayesiano en IRIS

La siguiente entrada muestra como especificar un Modelo de Análisis Macroeconómico Bayesiano para la economía dominicana, disponible como serie de estudio en la pagina del Banco Central de la República Dominicana. Esta aplicación se realiza en IRIS (Macroeconomic Modeling Toolbox) un paquete desarrollado por el Fondo Monetario Internacional.

Posterior a instalar el paquete IRIS y anexarlo al path de MATLAB. En primer lugar es necesario desarrollar el archivo “.model”, que es un script en Matlab donde presentamos las variables, los parámetros y las ecuaciones del modelo. El detalle de esta estructura puede verse en el paper presentado por Franz Hanann y mencionado anteriormente.

!variables
"brecha del producto" y_gap
"brecha de tasa de interes real" r_gap
"inflacion trimestral anualizada" pic
"tasa de politica monetaria" tpm  
"inflacion interanual" picA 
"log pib" y    
"pib potencial" y_pot
"tasa de interes real" r  

!shocks
 
 "choque de brecha del producto" eta_y_gap
 "choque de oferta o costes" eta_pic
 "choque de politica monetaria" eta_tpm
 "choque de pib potencial" eta_y_pot
 
!parameters
 
%brecha del producto
"persistencia de la brecha del producto" bet_1
"componente prospectivo, expectativas" bet_2
"elasticidad de la brecha de tasa, pendiente curba IS" bet_3
 
%curva de Phillips
"inercia inflacionaria" alp_1
"componente prospectivo expectativas" alp_2
"pendiente curva de Phillips" alp_3 %mas pequeno, menos sensible es la inflacion a la brecha

% Regla de Taylor
"persistencia tpm" phi_tpm
"parametro de taylor" phi_pic
"brecha del producto" phi_y_gap
 
% parametros de largo plazo
"meta de tasa" meta_pic
"Tasa de interes neutral" i_neutral
"Tasa de interes real de largo plazo" r_neutral
"Crecimiento potencial" gA_pot
 
!equations
 
 %brecha del producto
 y_gap = bet_1*y_gap{-1}+ bet_2*y_gap{+1}-bet_3*r_gap + eta_y_gap;
   
 %curva de phillips
 pic = alp_1*pic{-1}+alp_2*pic{+1}+alp_3*y_gap+eta_pic;
   
 %regla de politica
 tpm = phi_tpm*tpm{-1}+(1-phi_tpm)*(i_neutral+phi_pic*(picA{-1}-meta_pic)+phi_y_gap*y_gap)+eta_tpm;

   
 % tasa de interes real
 r = tpm - pic{-1};
   
 %brecha de la tasa de interes real
 r_gap = r - r_neutral;
   
 %log pib
 y=y_gap+y_pot;
   
 %log pib pot
 y_pot=y_pot{-1} + eta_y_pot; %+ 0.25*gA_pot 
   
 %inflacion anual
 picA=0.25*(pic+pic{-1}+pic{-2}+pic{-3});

Posteriormente, una vez hayamos generado esta estructura, es necesario definir el valor de los parámetros y correr los programas que resuelven el modelo. Usamos la función Model.fromFile Que carga la estructura del modelo, colocado anteriormente en un scipt de extensión “.model”. Note que posteriormente asignamos el valor de estimación a los parámetros del modelo para posteriormente resolver el estado estacionario del modelo.

%% Clear workspace
clear;
close all;
clc;
%#ok<*NOPTS>
 
%% Load model file and create model object
 
m = Model.fromFile("EcnCerrada.model");
 
%% Assign parameters
 
%brecha del producto
m.bet_1 = 0.5;  %persistencia de la brecha del producto
m.bet_2 = 0.05; %componente prospectivo, expectativas
m.bet_3 = 0.20; %elasticidad de la brecha de tasa, pendiente curba IS
 
%curva de Phillips
m.alp_1 = 0.4;       %inercia inflacionaria
m.alp_2 = (1-m.alp_1); %componente prospectivo, expectativas
m.alp_3 = 0.10;     %pendiente curva de Phillips. mas pequeno, menos sensible es la inflacion a la brecha
 
% Regla de Taylor
m.phi_tpm = 0.7; %persistencia tpm
m.phi_pic = 1.5; %a mayor, mayor es la respuesta de la polibica a la infalcion. parametro de taylor (tema: este se puede estimar)
m.phi_y_gap = 0.5; %brecha del producto

% parametros de largo plazo
m.meta_pic = 4; %meta de tasa
m.i_neutral = 6; %promedio de la tasa entre 2013-2019
m.r_neutral = m.i_neutral-m.meta_pic; %tasa de interes real de largo plazo
m.gA_pot = 5.1;
 
%% Compute steady state
% * Calculate (stationary) steady state for given parameters
% * Make sure it is a valid steady state
% * Print a steady state table
 
m = steady(m);
checkSteady(m);
 
%% Show a steady state table
 
table(m, ["steadyLevel", "description"])
 
%% Calculate first-order solution matrices
%
% Run `solve()` to calculate a first-order expansion of the model
% equations around the steady state, and finds a first-order
% rational-expectations solution. The solution matrices (state-space
% matrices) are stored within the model object; they are examined in
% <know_all_about_solution>. The availability of a first-order solution is
% indicated the model object is displayed.
 
m = solve(m)

Ahora se generan la estructura de data para simular choques y recuperar impulso respuesta.  Aquí asignamos valores a los choques (d2.eta_tpm(1:5) = 1;) para posteriormente ver la repuesta del sistema a esta perturbación. Finalmente estudiamos gráficamente la respuesta de 4 variables ('y_gap', 'r_gap', 'y', 'pic') a este tipo de perturbación. Observándose, como es natural que los choques mas persistente tienen a tener un efecto mayor en la evolución de las variables.


%% Find steady state
% * Create a steady-state database
% * Enter a productivity shock
% * Display the input time series for the shock on the screen
 
d0 = steadydb(m, 1:40)
d = d0;
d.eta_tpm(1) = 1;
disp(d.eta_tpm);
 
%% Choque en la tasa de politica monetaria
d1 = d;
d1 = sstatedb(m, 1:40);
d1.eta_tpm(1) = 1;
disp(d1.eta_tpm)

s1 = simulate(m, d1, 1:40); %simula impulso respuesta choque
 
%choque mas persistente.
% Parte de un escenario nuevo
d2 = d;
d2.eta_tpm(1:5) = 1;
s2 = simulate(m, d2, 1:40);
 
% Gráfico de la variable de interes
s = s1 & s2;
dbplot(s, 0:40, {'y_gap', 'r_gap', 'y', 'pic'}, 'Tight=', true);
 
le = visual.hlegend('bottom', 'No Persistente', 'Persistente');
title(le, 'Choque tpm'); 

Podemos generar el mismo choque, pero en un contexto de mayor persistencia de la inflación, por lo que, modificamos el valor del coeficiente asociado a la persistencia. AL hacer esta modificación en el nivel de persistencia, es importante tener en cuenta el valor de otros coeficientes. Primero clonamos el modelo anterior, modificamos los parámetros y luego pasados a identificar el estado estacionario y solución del modelo en un nuevo objeto. Finalmente, simulamos el choque sobre este nuevo objeto.

m1 = m;

m1.alp_1 = m.alp_1*1.2;
m1.alp_2 = (1-m1.alp_1);
m1 = steady(m1);
m1 = solve(m1)
d3 = sstatedb(m1, 1:40);
d3.eta_tpm(1) = 1;
s3 = simulate(m1, d3, 1:40);
 
% Gráfico de la variable de interes
s = s1 & s3;
dbplot(s, 0:40, {'y_gap', 'r_gap', 'y', 'pic'}, 'Tight=', true);
 
le = visual.hlegend('bottom', 'No Persistente', 'Persistente');
title(le, 'Choque tpm');
 
% Comparar estados
table( ...
    [m, m1], ["steadyLevel", "steadyChange", "form", "description"] ...
    , "writeTable", "steady.xlsx" ...
)

5 may 2017

Curso: fundamentos de Matlab para el análisis económico



El curso se divide en dos parte: una primera parte donde se realiza una introducción aplicada al uso de Matlab, en esta se desarrollan los conceptos básicos y se utilizan distintas herramientas para el análisis estadístico; en la segunda parte, que inicia en la quinta parte del curso, se desarrollan elementos de programación como las estructuras y bucles, continuado con la introducción al uso de funciones y paquetes especiales para el análisis de datos en Matlab.

Clase 4. Funciones 

Ejercicios: 1, 2, 3, 4, 5 , 6.
Documentos de referencia recomendados:

·         Corcuera, Pedro. Gráficos en Matlab. Departamento de Matemática Aplicada y Ciencias de la Computación. Universidad de Cantabria.
·  Madoz, Agueda & Etxeberria, Paulina (2015). Notes on Matlab. University of the Basque Country, UPV/EHU.
·     MathWorks (2014).  Learning MATLAB. United State.
·     More, Holly. Matlab para ingenieros. Salt Lake Community College. Pearson, Prentice Hall.
·  Raul, Exequiel (2011). Taller Matlab 1. Instituto de Economía. Pontificia Universidad Católica de Chile.

Realizado en: Fundación para el Avance de las Matemáticas (FAMA)

4 mar 2015

Econometria con Matlab: Como usar ventanas móviles para obtener series históricas de betas en el CAPM


En ocasiones necesitamos testar la estabilidad de cierta estimación analizando la evolución de una serie histórica de betas del modelo de regresión lineal.  El método de ventanas móviles permite realizar este tipo de ejercicio. En el siguiente ejemplo se muestra como se puede obtener una serie histórica de betas del CAPM y el Alpha de Jensen. Como usualmente se dispondrá de la rentabilidad del mercado y la de un sin numero de activos, lo que hemos llamado x e y(i) respectivamente, donde i i representa cada una de las columnas de la matriz de activos.

% -------------------------------------------------------------
%la idea es:
% tienes una matriz de variables (Yi), donde i representa cada columna
% y tienes una variable X, que representa tu rendimiento de mercado en el CAPM
% necesitas hacer series temporales de betas: esto lo harás por ventanas móviles, % por tanto
% necesitas un bucle o usar operaciones vectorizadas, opta por un bucle
% necesitas recorrer tu matriz (yi), esto lo harás con otro bucle, como este ya es un segundo bucle, sera un bucle anidados, el primero te sirve para recorrer de columna en columna y el segundo para especificar las observaciones que tendrán una amplitud determinada por tu venta.

% genero variables hipoteticas que simulan rentabilidades
   x = random('Normal',0,1,100,1);     % rentabilidad del mercado
 y_i = random('Normal',0,1,100,5);   % rentabilidad de activos

% Se supone que tienes una base de datos de esta forma. ahora debes hacer el bucle anidado
% no tengo intenrnet, pero hay infinidad de ejemplos de ejemplos en internet de como hacer
% un bucle para recorrer una matriz.

 ventana=90;         % esta ventada determina la amplitud de la ventana
 [f, c]=size(y_i);    % te permite obtener las dimensiones para tu bucle

  for i=1:c        % este bucle te recorre las columna de la matriz
      for obs=1:f-ventana % este te recorre las observaciones de cada columnas
   
  % Regresión del CAPM (recuerda que el CAPM usa exceso de rent respecto al ALR)
  % Ten pendiente que el vector de 1, matricialmente te permite obtener constante      en regresión
       behat = regress(x(obs:obs+ventana-1), [ones(ventana,1) ...                                        y_i(obs:obs+ventana-1,i)]) ;
      
     % Aqui usas las dimensiones, para obtener matrices que almacenan tus betas.
         beta_capm(obs,i)=behat(2);
         alpha_jemsem(obs,i)=behat(1);

   % Analisis de estabilidad de cada beta, opcional. Haces un gráfico para ver la      evolución histórica
   % De cada uno los betas de tus activos.
        figure(i)
            plot(beta_capm(:,i))
     end
end

% Matriz de resultados

beta_capm


Espero os sirva,
Nerys

Recodificación de Variables en R

  La recodificación de variables es una tarea esencial en el análisis de datos que nos permite transformar datos continuos en categorías más...