Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Introducción a Python para Economía y Finanzas: Ejemplos y Conceptos Básicos, Resúmenes de Economía

Un ejemplo introductorio de programación en Python para Economía y Finanzas, escritos por Thomas J. Sargent y John Stachurski. El texto aborda la sintaxis básica de Python y las estructuras de datos mediante la escritura y análisis de pequeños programas. Se incluyen ejemplos de importación de paquetes, funciones y bucles, así como la creación de gráficos con NumPy y Matplotlib.

Tipo: Resúmenes

2019/2020

Subido el 28/10/2020

ana-milagros-chiroque-monja
ana-milagros-chiroque-monja 🇵🇪

10 documentos

1 / 18

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
003 Python. Un ejemplo introductorio
September 1, 2020
Programación Python para Economía y Finanzas
Autores:
Thomas J. Sargent
John Stachurski
1 Python. Un ejemplo introductorio
1.1 Visión General
Ahora estamos listos para comenzar a aprender el lenguaje Python.
En esta conferencia, escribiremos y luego separaremos pequeños programas de Python.
El objetivo es presentarle la sintaxis básica de Python y las estructuras de datos.
Conceptos más profundos serán cubiertos en conferencias posteriores.
Debería haber leído la conferencia sobre cómo comenzar a usar Python antes de comenzar esta.
1.2 La tarea: trazar un proceso de ruido blanco
Supongamos que queremos simular y trazar el proceso de ruido blanco 0,1,· · · ,T, donde cada sorteo
tes independiente estándar normal.
En otras palabras, queremos generar figuras que se vean así:
(Aquí testá en el eje horizontal y testá en el eje vertical).
Haremos esto de varias maneras diferentes, cada vez que aprendamos algo más sobre Python.
1.3 Versión 1
Aquí hay algunas líneas de código que realizan la tarea que establecemos
[1]: import numpy as np
import matplotlib.pyplot as plt
�_values =np.random.randn(100)
plt.plot(�_values)
1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12

Vista previa parcial del texto

¡Descarga Introducción a Python para Economía y Finanzas: Ejemplos y Conceptos Básicos y más Resúmenes en PDF de Economía solo en Docsity!

003 Python. Un ejemplo introductorio

September 1, 2020

Programación Python para Economía y Finanzas Autores:

  • Thomas J. Sargent
  • John Stachurski

1 Python. Un ejemplo introductorio

1.1 Visión General

Ahora estamos listos para comenzar a aprender el lenguaje Python. En esta conferencia, escribiremos y luego separaremos pequeños programas de Python. El objetivo es presentarle la sintaxis básica de Python y las estructuras de datos. Conceptos más profundos serán cubiertos en conferencias posteriores. Debería haber leído la conferencia sobre cómo comenzar a usar Python antes de comenzar esta.

1.2 La tarea: trazar un proceso de ruido blanco

Supongamos que queremos simular y trazar el proceso de ruido blanco 0 , 1 , · · · , (^) T , donde cada sorteo t es independiente estándar normal. En otras palabras, queremos generar figuras que se vean así: (Aquí t está en el eje horizontal y (^) t está en el eje vertical). Haremos esto de varias maneras diferentes, cada vez que aprendamos algo más sobre Python.

1.3 Versión 1

Aquí hay algunas líneas de código que realizan la tarea que establecemos

[1]: import numpy as np import matplotlib.pyplot as plt

￿_values = np.random.randn(100)

plt.plot(￿_values)

plt.show()

[2]: # dir(np)

3: array([-0.21567412, -0.50655155, 0.11067506, 1.60311746, 1.81159357, -0.47630985, -0.34564725, -0.54098596, -0.75174775, -0.74075713])

[4]: # dir(plt)

[5]: # help(np.random.randn)

6: array([[ 0.60944818, -1.49212806, -0.35129443, 0.45937648], [-0.59915108, -0.33919417, -0.86700103, -0.8096318 ], [-1.22020689, 1.62965014, -0.69217348, -0.60211293], [ 0.45864969, -0.82210551, 2.03069086, 0.57790068], [-1.55472226, -0.37080636, 1.15763952, -1.33165118], [ 1.42542768, -0.62071577, 0.11908959, -1.61141516]])

Analicemos este programa y veamos cómo funciona.

La razón es que el lenguaje principal se mantiene deliberadamente pequeño, por lo que es fácil de aprender y mantener. Cuando quieres hacer algo interesante con Python, casi siempre necesitas importar funcionalidades adicionales.

Paquetes Como se indicó anteriormente, NumPy es un paquete de Python. Los desarrolladores utilizan los paquetes para organizar el código que desean compartir. De hecho, un paquete es solo un directorio que contiene

  • archivos con código Python - módulos llamados en Python speak
  • posiblemente algún código compilado al que Python pueda acceder (por ejemplo, funciones compiladas a partir de código C o FORTRAN)
  • un archivo llamado init.py que especifica lo que se ejecutará cuando escribimos import package_name De hecho, puede buscar y explorar el directorio de NumPy en su computadora con la suficiente facilidad si mira alrededor. En esta máquina, se encuentra en anaconda3/lib/python3.7/site-packages/numpy

Subpaquetes Considera la línea ￿_values = np.random.randn(100). Aquí np se refiere al paquete NumPy , mientras que random es un subpaquete de NumPy. Los subpaquetes son solo paquetes que son subdirectorios de otro paquete.

1.3.2 Importar nombres directamente Recordemos este código que vimos arriba

14: import numpy as np

np.sqrt(16)

Aquí hay otra forma de acceder a la función de raíz cuadrada de NumPy

15: from numpy import sqrt

sqrt(64)

Esto también está bien. La ventaja es menor al escribir, si usamos sqrt a menudo en nuestro código. La desventaja es que, en un programa largo, estas dos líneas pueden estar separadas por muchas otras líneas.

Entonces es más difícil para los lectores saber de dónde viene sqrt, si así lo desean.

1.3.3 Paseos aleatorios Volviendo a nuestro programa que traza el ruido blanco, las tres líneas restantes después de las declaraciones de importación son

[16]: ￿_values = np.random.randn(100)

plt.plot(￿_values)

plt.show()

La primera línea genera 100 (quasi) estándares normales independientes y los almacena ￿_values. Las siguientes dos líneas generan la trama. Podemos y veremos varias formas de configurar y mejorar este gráfico a continuación.

1.4 Implementaciones Alternativas

Intentemos escribir algunas versiones alternativas de nuestro primer programa , que trazó los dibujos de 2D de la distribución normal. Los siguientes programas son menos eficientes que el original y, por lo tanto, algo artificiales. Pero sí nos ayudan a ilustrar algunas sintaxis y semánticas importantes de Python en un entorno familiar.

1.4.2 Listas. Las listas son una estructura de datos nativa de Python utilizada para agrupar una colección de objetos. Por ejemplo, intente

[18]: x = [10, 'Economía', True ] x

[18]: [10, 'Economía', True]

x

20: [10, 'Economía', True, 2.5]

Esto append() es lo que se llama un método, que es una función “adjunta” a un objeto, en este caso, la lista x. Otro método de lista útil es pop()

[22]: # dir(x)

Las listas en Python están basadas en cero (como en C, Java o Go), por lo que el primer elemento está referenciado por x[0]

26: [10, 'Economía', True]

1.4.3 El bucle For Ahora consideremos el ciclo for del Section ?? , que era

[27]: for i in range(ts_length): e = np.random.randn() ￿_values.append(e)

29: range(0, 100)

Python ejecuta las dos líneas sangradas ts_length veces antes de continuar. Estas dos líneas se llaman a code block, ya que comprenden el “bloque” de código sobre el que estamos haciendo un bucle. A diferencia de la mayoría de los otros lenguajes, Python conoce la extensión del bloque de código solo por sangría. En nuestro programa, la sangría disminuye después de la línea ￿_values.append(e), diciéndole a Python que esta línea marca el límite inferior del bloque de código. Más información sobre la sangría a continuación: por ahora, veamos otro ejemplo de un bucle for

[30]: animales = ['perro', 'gato', 'pájaro']

[32]: for animal in animales: print("El plural de " + animal + " es " + animal + "s")

El plural de perro es perros El plural de gato es gatos El plural de pájaro es pájaros Este ejemplo ayuda a aclarar cómo funciona el ciclo for: cuando ejecutamos un ciclo del formulario [ ]: for variable_name in sequence:

El intérprete de Python realiza lo siguiente: Para cada elemento de la sequence, une el nombre variable_name a ese elemento y luego ejecuta el bloque de código. De hecho, el objeto sequence puede ser un objeto muy general, como veremos pronto.

Tenga en cuenta que:

  • el bloque de código para el bucle while nuevamente está delimitado solo por sangría
  • la declaración i = i + 1 puede ser reemplazada por i += 1

1.5 Otra aplicación

Hagamos una aplicación más antes de pasar a los ejercicios. En esta aplicación, trazamos el saldo de una cuenta bancaria a lo largo del tiempo. No hay retiros durante el período de tiempo, cuya última fecha se denota por T. El saldo inicial es b 0 y la tasa de interés es r. El saldo se actualiza del período t a t + 1 de acuerdo a bt+1 = (1 + r)bt. En el siguiente código, generamos y graficamos la secuencia si b 0 , b 1 , … , bT. En lugar de usar una lista de Python para almacenar esta secuencia, usaremos una matriz NumPy.

[34]: r = 0.025 # tasa de interés T = 50 # fecha de finalización b = np.empty(T+1) # una matriz NumPy vacía, para almacenar todo b_t b[0] = 10 # saldo inicial

for t in range(T): b[t+1] = (1 + r) * b[t]

plt.plot(b, label='bank balance')

plt.legend() plt.show()

35: array([10. , 10.25 , 10.50625 , 10.76890625, 11.03812891, 11.31408213, 11.59693418, 11.88685754, 12.18402898, 12.4886297 , 12.80084544, 13.12086658, 13.44888824, 13.78511045, 14.12973821, 14.48298166, 14.84505621, 15.21618261, 15.59658718, 15.98650186, 16.3861644 , 16.79581851, 17.21571398, 17.64610683, 18.0872595 , 18.53944098, 19.00292701, 19.47800018, 19.96495019, 20.46407394, 20.97567579, 21.50006769, 22.03756938, 22.58850861, 23.15322133, 23.73205186, 24.32535316, 24.93348699, 25.55682416, 26.19574476, 26.85063838, 27.52190434, 28.20995195, 28.91520075, 29.63808077, 30.37903279, 31.13850861, 31.91697132, 32.71489561, 33.532768 , 34.3710872 ])

La instrucción b = np.empty(T+1) asigna almacenamiento en memoria para T+1 números (punto flotante). Estos números se completan con el bucle for. Asignar memoria al inicio es más eficiente que usar una lista de Python y append, dado que este último debe solicitar repetidamente espacio de almacenamiento del sistema operativo. Observe que agregamos una leyenda a la trama, una característica que se le pedirá que use en los ejercicios.

1.6.2 Ejercicio 2 Comenzando con su solución para el ejercicio 2, trace tres series de tiempo simuladas, una para cada uno de los casos = 0, = 0. 8 y = 0. 98. Use un bucle for para recorrer los valores de ￿. Si puede, agregue una leyenda para ayudar a distinguir entre las tres series de tiempo. Consejos:

  • Si llama a la función plot() varias veces antes de llamar show(), todas las líneas que produzca terminarán en la misma cifra.
  • Para la leyenda, señaló que la expresión 'foo' + str(42) se evalúa como 'foo42'.

1.6.3 Solucion 2

[38]: ￿_values = [0.0, 0.8, 0.98] T = 200 x = np.empty(T+1)

for ￿ in ￿_values: x[0] = 0 for t in range(T): x[t+1] = ￿ * x[t] + np.random.randn() plt.plot(x, label=f'$ \ alpha = { ￿ } $')

plt.legend() plt.show()

1.6.4 Ejercicio 3 Similar a los ejercicios anteriores, trace la serie de tiempo

xt+1 = ∗ |xt| + (^) t+1 dónde x 0 = 0 y t = 0, ..., T

Utilizar T = 200, = 0. 9 y (^) t como antes. Busque en línea una función que pueda usarse para calcular el valor absoluto |xt|.

1.6.5 Solucion 3 Aquí hay una solución:

[39]: ￿ = 0. T = 200 x = np.empty(T+1) x[0] = 0

for t in range(T): x[t+1] = ￿ * np.abs(x[t]) + np.random.randn()

plt.plot(x)

Ahora, escriba una nueva solución para el Ejercicio 3 que no use una función existente para calcular el valor absoluto. Reemplace esta función existente con una condición if – else.

1.6.7 Solucion 4 Aquí hay una solución:

[42]: ￿ = 0. T = 200 x = np.empty(T+1) x[0] = 0

for t in range(T): if x[t] < 0: abs_x = - x[t] else : abs_x = x[t]

x[t+1] = ￿ * abs_x + np.random.randn()

plt.plot(x) plt.show()

1.6.8 Ejercicio 5 Aquí hay un ejercicio más difícil, que requiere un poco de reflexión y planificación. La tarea es calcular una aproximación a usando Monte Carlo. No use importaciones además de

[43]: import numpy as np

Sus sugerencias son las siguientes:

  • Si U es una variable aleatoria uniforme bivariada en el cuadrado de la unidad (0, 1)^2 , entonces la probabilidad de que U se encuentra en un subconjunto B de (0, 1)^2 es igual al área de B.
  • Si U 1 , ..., Un son copias IID de U , entonces como n se hace grande, la fracción que cae en B, converge a la probabilidad de aterrizar en B.
  • Para un círculo, area = ∗ radius^2.

1.6.9 Solucion 5 Considere el círculo de diámetro 1 incrustado en el cuadrado de la unidad. Dejar que su área sea A y deja que su radio sea r = 1/2. Si sabemos entonces podemos calcular A va traves de A = r^2. Pero aquí el punto es calcular , lo que podemos hacer por $ ￿= A/r^2$. Resumen: Si podemos estimar el área de un círculo con diámetro 1, entonces dividir por r^2 = (1/2)^2 = 1/4 da una estimación de. Estimamos el área muestreando uniformes bivariados y observando la fracción que cae dentro del círculo.

[45]: n = 100000 count = 0

for i in range(n): u, v = np.random.uniform(), np.random.uniform() d = np.sqrt((u - 0.5)2 + (v - 0.5)2) if d < 0.5: count += 1

area_estimate = count / n

print(area_estimate * 4) # dividing by radius**