










Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
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
1 / 18
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!











Programación Python para Economía y Finanzas Autores:
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.
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.
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
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.
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:
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:
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:
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**