import ipympl
%matplotlib widget
%matplotlib inline
import ipywidgets as widgets
import matplotlib.pyplot as plt
import numpy as np
import sympy as sy
from sympy import *
import pandas as pd
from causalgraphicalmodels import CausalGraphicalModel
import os
os.environ["PATH"] += os.pathsep + 'C:/Program Files/Graphviz/bin/'
from IPython.display import Image
import warnings
warnings.filterwarnings('ignore')

6. Modelo IS-LM con Tasa de Interés Exógena \((r)\) fijada por el Banco Central:#

6.1. Ecuaciones#

  • Ecuación de la IS:

Partiendo de:

\[ Y = C + I + G + X - M \]

donde

\[ C = C_0 + b(1-t)Y \]
\[ I = I_0 - hr \]
\[ G = G_0 \]
\[ X = X_0 \]
\[ M = mY \]

Reemplazando:

\[ Y = C_0 + b(1-t)Y + I_0 - hr + G_0 + X_0 - mY \]

La ecuación de la IS es en función de \(Y\) es:

\[ Y = \frac{1}{1 - (b - m)(1 - t)} (C_o + I_o + G_o + X_o - hr) \]

o,

\[ Y = \frac{1}{B_1} (B_0) \]

Donde \( B_0 = C_o + I_o + G_o + X_o - hr \) y \( B_1 = 1 - (b - m)(1 - t) \)

  • Ecuación de la LM:

\[ \frac{M_o^s}{P_0} = kY - jr \]

Ahora \(M^s\) es la variable endogena, por eso escribimos la LM En función de \((M^s)\):

\[ M^s = P_0(kY - jr) \]

6.2. Equilibrio IS-LM con \(r\) exógena#

  • Ingreso de equilibrio: es igual a la ecuación de la IS

\[ Y^e = \frac{1}{1 - (b - m)(1 - t)} (C_o + I_o + G_o + X_o - hr) \]
  • Masa monetaria: reemplazamos \(Y\) en \(M_s\):

\[ M^e_s = P_0(kY - jr) \]
\[ M^e_s = (\frac{B_0}{B_1})P_0k - P_0jr \]
\[ M^e_s = P_0k(\frac{1}{1 - (b - m)(1 - t)} (C_o + I_o + G_o + X_o - hr)) - P_0jr \]

6.3. Curva IS#

#--------------------------------------------------

# Curva IS

r_size = 100 

Co = 13
b = 0.7
t = 0.25
Io = 6.4
Go = 5
h = 0.3
Xo = 2
m = 0.4

r = np.arange(r_size)

# Ecuación

def IS_CB(Co, b, t, Io, h, Xo, m, Go):
    IS_CB = (1/(1 - (b - m)*(1 - t)))*(Co + Io + Go + Xo - h*r)
    return IS_CB

IS_CB = IS_CB(Co, b, t, Io, h, Xo, m, Go)

6.4. Curva LM#

#--------------------------------------------------
# Curva LM
    
# Parámetros

Y_size = 100

P = 3.5
k = 1.76
j = 3
r = 15

Y = np.arange(Y_size)

# Ecuación

def LM_CB(Y, P, k, j, r):
    LM_CB = P*(k*Y - j*r)
    return LM_CB

LM_CB = LM_CB(Y, P, k, j, r)

6.5. Funcion para encontrar el cruce de rectas#

# líneas punteadas autómaticas

    # definir la función line_intersection
def line_intersection(line1, line2):
    xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0])
    ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1])

    def det(a, b):
        return a[0] * b[1] - a[1] * b[0]

    div = det(xdiff, ydiff)
    if div == 0:
       raise Exception('lines do not intersect')

    d = (det(*line1), det(*line2))
    x = det(d, xdiff) / div
    y = det(d, ydiff) / div
    return x, y

6.5.1. Encontrar puntos de cruce#

r_ec = np.full((100), 15)

# coordenadas de las curvas (x,y)
A = [IS_CB[0], Y[0]] # DA, coordenada inicio
B = [IS_CB[-1], Y[-1]] # DA, coordenada fin

C = [r_ec[0], Y[0]] # L_45, coordenada inicio
D = [r_ec[-1], Y[-1]] # L_45, coordenada fin

# creación de intersección

intersec_1 = line_intersection((A, B), (C, D))
intersec_1 # (y,x)
(15.000000000000002, 49.25)

6.6. Gráfico del modelo IS-LM-PM#

# Gráfico del modelo IS-PM

# Dimensiones del gráfico
y_max = np.max(Y)
fig, ax = plt.subplots(figsize=(10, 8))

# Curvas a graficar
ax.plot(IS_CB, label = "IS", color = "C1") #IS
ax.plot(r_ec, color = "red", label ="PM") #r: tasa de interés

plt.axvline(intersec_1[1], ymin= 0, ymax= 1, linestyle = ":", color = "grey")
plt.axline((intersec_1[1], intersec_1[0]), slope=0.25, color="C0", label = 'LM')

ax.yaxis.set_major_locator(plt.NullLocator())   
ax.xaxis.set_major_locator(plt.NullLocator())

ax.text(0, 16, '$r_0$', fontsize = 13, color = 'black')
ax.text(51, -5, '$Y_0$', fontsize = 13, color = 'black')
ax.text(48, 16.5, '$E_0$', fontsize = 13, color = 'black')

ax.set(title="IS-LM con r exógena", xlabel= 'Y', ylabel= 'r')
ax.legend()

plt.show()
../_images/tutorial7_modelo_is_lm_r_exogena_16_0.png

6.7. Estática comparativa#

# nombrar variables como símbolos
Co, Io, Go, Xo, h, b, m, t, P, k, j, r, beta_0, beta_1 = symbols('Co, Io, Go, Xo, h, b, m, t, P, k, j, r, beta_0, beta_1')

# # Beta_0 y beta_1
# beta_0 = (Co + Io + Go + Xo - h*r)
# beta_1 = (1-(b-m)*(1-t))

# Producto de equilibrio y la tasa de interes de equilibrio en el modelo IS-LM
Y_eq = (Co + Io + Go + Xo - h*r/(1-(b-m)*(1-t)))
Ms_eq = (Co + Io + Go + Xo - h*r/(1-(b-m)*(1-t)))*(P*k) - (P*j*r)

6.7.1. Incremento tasa de interés \((r)\)#

  • Matemática:

df_Y_eq_r = diff(Y_eq, r)
print("El Diferencial del Producto con respecto al diferencial de la tasa de interés = ", df_Y_eq_r)
El Diferencial del Producto con respecto al diferencial de la tasa de interés =  -h/(-(1 - t)*(b - m) + 1)

¿\(∆Y\) sabiendo que \(∆r > 0\)?

\[ \frac{∆Y}{∆r} = (-) \]
\[ \frac{∆Y}{(+)} = (-) \]
\[ ∆Y = (-) \]
df_Ms_eq_r = diff(Ms_eq, r)
print("El Diferencial de la Masa Monetaria con respecto al diferencial de la tasa de interés = ", df_Ms_eq_r)
El Diferencial de la Masa Monetaria con respecto al diferencial de la tasa de interés =  -P*h*k/(-(1 - t)*(b - m) + 1) - P*j

¿\(∆M^s\) sabiendo que \(∆r > 0\)?

\[ \frac{∆M^s}{∆r} = (-) \]
\[ \frac{∆M^s}{(+)} = (-) \]
\[ ∆M^s = (-) \]
  • Intuición:

\[ r↑ → I↓ → DA↓ → DA < Y → Y↓ \]
\[ r↑ → M^d<M^s → M^s↓ \]
  • Gráfico:

#--------------------------------------------------
    # Curva IS

r_size = 100 

Co = 13
b = 0.7
t = 0.25
Io = 6.4
Go = 5
h = 0.3
Xo = 2
m = 0.4

r = np.arange(r_size)

# Ecuación

def IS_CB(Co, b, t, Io, h, Xo, m, Go):
    IS_CB = (1/(1 - (b - m)*(1 - t)))*(Co + Io + Go + Xo - h*r)
    return IS_CB

IS_CB = IS_CB(Co, b, t, Io, h, Xo, m, Go)


#--------------------------------------------------
    # Curva LM
    
# Parámetros

Y_size = 100

P = 3.5
k = 1.76
j = 3
r = 15

Y = np.arange(Y_size)

# Ecuación

def LM_CB(Y, P, k, j, r):
    LM_CB = P*(k*Y - j*r)
    return LM_CB

LM_CB = LM_CB(Y, P, k, j, r)

#---------------------------------------------------
    # Nueva LM

r = 20 

def LM_CB_2(Y, P, k, j, r):
    LM_CB_2 = P*(k*Y - j*r)
    return LM_CB_2

LM_CB_2 = LM_CB_2(Y, P, k, j, r)
r_ec = np.full((100), 15)

    # coordenadas de las curvas (x,y)
A = [IS_CB[0], Y[0]] # DA, coordenada inicio
B = [IS_CB[-1], Y[-1]] # DA, coordenada fin

C = [r_ec[0], Y[0]] # L_45, coordenada inicio
D = [r_ec[-1], Y[-1]] # L_45, coordenada fin

    # creación de intersección

intersec_1 = line_intersection((A, B), (C, D))
intersec_1 # (y,x)
(15.000000000000002, 49.25)
r_ec_2 = np.full((100), 20)

    # coordenadas de las curvas (x,y)
A = [IS_CB[0], Y[0]] # DA, coordenada inicio
B = [IS_CB[-1], Y[-1]] # DA, coordenada fin

C = [r_ec_2[0], Y[0]] # L_45, coordenada inicio
D = [r_ec_2[-1], Y[-1]] # L_45, coordenada fin

    # creación de intersección

intersec_2 = line_intersection((A, B), (C, D))
intersec_2 # (y,x)
(20.0, 36.333333333333336)
# Gráfico del modelo IS-PM

# Dimensiones del gráfico
y_max = np.max(Y)
fig, ax = plt.subplots(figsize=(10, 8))

# Curvas a graficar
ax.plot(IS_CB, label = "IS", color = "C1") #IS
ax.plot(r_ec, color = "red", label ="PM") #r: tasa de interés
ax.plot(r_ec_2, color = "red", label ="PM_2", linestyle = 'dashed') #r: tasa de interés

plt.axline((intersec_1[1], intersec_1[0]), slope=0.25, color="C0", label = 'LM')
plt.axline((intersec_2[1], intersec_2[0]), slope=0.25, color="C0", label = 'LM_2', linestyle = 'dashed')

plt.axvline(x=intersec_1[1], ymin= 0, ymax= 1, linestyle = ":", color = "grey")
plt.axvline(x=intersec_2[1], ymin= 0, ymax= 1, linestyle = ":", color = "grey")

ax.text(0, 16, '$r_0$', fontsize = 13, color = 'black')
ax.text(51, -5, '$Y_0$', fontsize = 13, color = 'black')
ax.text(48, 16.5, '$E_0$', fontsize = 13, color = 'black')

ax.text(0, 21, '$r_1$', fontsize = 13, color = 'red')
ax.text(40, -5, '$Y_1$', fontsize = 13, color = 'red')
ax.text(35, 22, '$E_1$', fontsize = 13, color = 'red')

ax.set(title="Incremento de la tasa de interés en el plano $(Y, r)$", xlabel= 'Y', ylabel= 'r')
ax.legend()

plt.show()
../_images/tutorial7_modelo_is_lm_r_exogena_31_0.png
# Gráfico del modelo IS-PM

# Dimensiones del gráfico
y_max = np.max(Y)
fig, ax = plt.subplots(figsize=(10, 8))

# Curvas a graficar
ax.plot(LM_CB, label = "LM", color = "C0") #LM
plt.axvline(x=intersec_1[1], ymin= 0, ymax= 1, color = "C8", label = 'YY')
plt.axvline(x=intersec_2[1], ymin= 0, ymax= 1, color = "C8", label = 'YY_t', linestyle = 'dashed')

plt.axhline(y=145, xmin= 0, xmax= 0.5, color = "grey", linestyle = ':')
plt.axhline(y=65, xmin= 0, xmax= 0.38, color = "grey", linestyle = ':')

ax.text(0, 160, '$m_0^s$', fontsize = 13, color = 'black')
ax.text(51, -155, '$Y_0$', fontsize = 13, color = 'black')

ax.text(0, 75, '$m_1^s$', fontsize = 13, color = 'C8')
ax.text(38, -155, '$Y_1$', fontsize = 13, color = 'C8')

ax.yaxis.set_major_locator(plt.NullLocator())   
ax.xaxis.set_major_locator(plt.NullLocator())

ax.set(title="Incremento de la tasa de interés en el plano $(Y, m)$", xlabel= 'Y', ylabel= '$m^s$')
ax.legend()

plt.show()
../_images/tutorial7_modelo_is_lm_r_exogena_32_0.png
# Dos gráficos en un solo cuadro
fig, (ax1, ax2) = plt.subplots(2, figsize=(8, 16)) 

#---------------------------------
    # IS_PM

# Curvas a graficar
ax1.plot(IS_CB, label = "IS", color = "C1") #IS
ax1.plot(r_ec, color = "red", label ="PM") #r: tasa de interés
ax1.plot(r_ec_2, color = "red", label ="PM_2", linestyle = 'dashed') #r: tasa de interés

ax1.axline((intersec_1[1], intersec_1[0]), slope=0.25, color="C0", label = 'LM')
ax1.axline((intersec_2[1], intersec_2[0]), slope=0.25, color="C0", label = 'LM_2', linestyle = 'dashed')

ax1.axvline(x=intersec_1[1], ymin= 0, ymax= 1, linestyle = ":", color = "grey")
ax1.axvline(x=intersec_2[1], ymin= 0, ymax= 1, linestyle = ":", color = "grey")

ax1.text(0, 16, '$r_0$', fontsize = 13, color = 'black')
ax1.text(51, -5, '$Y_0$', fontsize = 13, color = 'black')
ax1.text(48, 16.5, '$E_0$', fontsize = 13, color = 'black')

ax1.text(0, 21, '$r_1$', fontsize = 13, color = 'red')
ax1.text(40, -5, '$Y_1$', fontsize = 13, color = 'red')
ax1.text(35, 22, '$E_1$', fontsize = 13, color = 'red')

ax1.set(title="Incremento de la tasa de interés $(r)$", xlabel= 'Y', ylabel= 'r')
ax1.legend()


#---------------------------------
    # YY-MM
    
ax2.plot(LM_CB, label = "LM", color = "C0") #LM
ax2.axvline(x=intersec_1[1], ymin= 0, ymax= 1, color = "C8", label = 'YY')
ax2.axvline(x=intersec_2[1], ymin= 0, ymax= 1, color = "C8", label = 'YY_t', linestyle = 'dashed')

ax2.axhline(y=145, xmin= 0, xmax= 0.5, color = "grey", linestyle = ':')
ax2.axhline(y=65, xmin= 0, xmax= 0.38, color = "grey", linestyle = ':')

ax2.text(0, 160, '$m_0^s$', fontsize = 13, color = 'black')
ax2.text(51, -155, '$Y_0$', fontsize = 13, color = 'black')

ax2.text(0, 75, '$m_1^s$', fontsize = 13, color = 'C8')
ax2.text(38, -155, '$Y_1$', fontsize = 13, color = 'C8')

ax2.set(xlabel= 'Y', ylabel= '$m^s$')
ax2.legend()

plt.show()
../_images/tutorial7_modelo_is_lm_r_exogena_33_0.png
#--------------------------------------------------
    # Curva LM
    
# Parámetros

Y_size = 100

P = 3.5
k = 1.76
j = 3
r = 15

Y = np.arange(Y_size)

# Ecuación

def LM_CB(Y, P, k, j, r):
    LM_CB = P*(k*Y - j*r)
    return LM_CB

LM_CB = LM_CB(Y, P, k, j, r)
# Gráfico del modelo IS-PM

# Dimensiones del gráfico
y_max = np.max(Y)
fig, ax = plt.subplots(figsize=(10, 8))

# Curvas a graficar
ax.plot(LM_CB, label = "LM", color = "C0") #IS
plt.axvline(x=intersec_1[1], ymin= 0, ymax= 1, color = "C8", label = 'YY')

plt.axhline(y=145, xmin= 0, xmax= 0.5, color = "grey", linestyle = ':')

ax.text(0, 160, '$m_0^s$', fontsize = 13, color = 'black')
ax.text(51, -155, '$Y_0$', fontsize = 13, color = 'black')
ax.text(45, 160, '$E_0$', fontsize = 13, color = 'black')

ax.yaxis.set_major_locator(plt.NullLocator())   
ax.xaxis.set_major_locator(plt.NullLocator())

ax.set(title="IS-LM con tasa de interés $(r)$ exógena en el plano $(Y, m)$", xlabel= 'Y', ylabel= '$m^s$')
ax.legend()

plt.show()
../_images/tutorial7_modelo_is_lm_r_exogena_35_0.png
# Dos gráficos en un solo cuadro
fig, (ax1, ax2) = plt.subplots(2, figsize=(8, 16)) 

#---------------------------------
    # IS_PM

# Curvas a graficar
ax1.plot(IS_CB, label = "IS", color = "C1") #IS
ax1.plot(r_ec, color = "red", label ="PM") #r: tasa de interés

ax1.axvline(intersec_1[1], ymin= 0, ymax= 1, linestyle = ":", color = "grey")
ax1.axline((intersec_1[1], intersec_1[0]), slope=0.25, color="C0", label = 'LM')

ax1.yaxis.set_major_locator(plt.NullLocator())   
ax1.xaxis.set_major_locator(plt.NullLocator())

ax1.text(0, 16, '$r_0$', fontsize = 13, color = 'black')
ax1.text(51, -5, '$Y_0$', fontsize = 13, color = 'black')
ax1.text(48, 16.5, '$E_0$', fontsize = 13, color = 'black')

ax1.set(title="IS-LM con r exógena", xlabel= 'Y', ylabel= 'r')
ax1.legend()


#---------------------------------
    # YY-MM
    
ax2.plot(LM_CB, label = "MM", color = "C0") #IS
ax2.axvline(x=intersec_1[1], ymin= 0, ymax= 1, color = "C8", label = 'YY')

ax2.axhline(y=145, xmin= 0, xmax= 0.5, color = "grey", linestyle = ':')

ax1.yaxis.set_major_locator(plt.NullLocator())   
ax1.xaxis.set_major_locator(plt.NullLocator())

ax2.text(0, 160, '$m_0^s$', fontsize = 13, color = 'black')
ax2.text(51, -155, '$Y_0$', fontsize = 13, color = 'black')

ax2.set(xlabel= 'Y', ylabel= 'm')
ax2.legend()

plt.show()
../_images/tutorial7_modelo_is_lm_r_exogena_36_0.png
# nombrar variables como símbolos
Co, Io, Go, Xo, h, b, m, t, P, k, j, r, beta_0, beta_1 = symbols('Co, Io, Go, Xo, h, b, m, t, P, k, j, r, beta_0, beta_1')

# # Beta_0 y beta_1
# beta_0 = (Co + Io + Go + Xo - h*r)
# beta_1 = (1-(b-m)*(1-t))

# Producto de equilibrio y la tasa de interes de equilibrio en el modelo IS-LM
Y_eq = (Co + Io + Go + Xo - h*r/(1-(b-m)*(1-t)))
Ms_eq = (Co + Io + Go + Xo - h*r/(1-(b-m)*(1-t)))*(P*k) - (P*j*r)