Las librerias con las que he desarrollado este informe
import requests
import pandas as pd
import matplotlib.pyplot as plt
from requests.structures import CaseInsensitiveDict
from datetime import datetime
import numpy as np
import pandas_ta
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
En el caso particular de la API, se ha trabajado con el token brindado por el BCRA para poder tener la conexión con Bearer para la autorización al acceso de la información La información se convierte de un json, un tipo de archivo de la base de datos, a un data frame con pd.DataFrame(data). Para el token modificar la variable si se cae y no funciona de nuevo.
url="https://api.estadisticasbcra.com/usd"
token= "Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTEyMDgwNjAsInR5cGUiOiJleHRlcm5hbCIsInVzZXIiOiJlbGl6YWJlZWVldGhkZGRtb3JhbGVzbUBnbWFpbC5jb20ifQ.o21y_1Ekig5fw0XkNr1KOkcy8t0jLXhDefLPRZm8CEvh2YM-1iJKGD2n0_jP0xv6a68iO6EjKSxPLILa3GI9CA"
headers = CaseInsensitiveDict()
headers["Accept"] = "application/json"
headers["Authorization"] = token
resp = requests.get(url, headers=headers)
data= resp.json()
df1=pd.DataFrame(data)
#########################################
#Documentaciòn de funcion para levantamiento del api
#por medio de token Bearer.
##########################################
url="https://api.estadisticasbcra.com/usd_of"
headers = CaseInsensitiveDict()
headers["Accept"] = "application/json"
headers["Authorization"] = token
resp = requests.get(url, headers=headers)
data= resp.json()
df0=pd.DataFrame(data)
#########################################
#Documentaciòn de funcion para levantamiento del api
#por medio de token Bearer.
##########################################
######################################33
date=datetime.today().strftime('%Y-%m-%d')
df1['hoy']=pd.to_datetime(date, format='%Y/%m/%d')
df1['d'] = pd.to_datetime(df1['d'])
df1['days']=(df1['hoy']- df1['d']).dt.days
d3pp= df1
df1['hay']= df1['days']<= 365
df2=df1.loc[df1['hay'] == True]
print(df2)
##############################################
date=datetime.today().strftime('%Y-%m-%d')
df0['hoy']=pd.to_datetime(date, format='%Y/%m/%d')
df0['d'] = pd.to_datetime(df0['d'])
df0['days']=(df0['hoy']- df0['d']).dt.days
d2pp= df0
df0['hay']= df0['days']<= 365
df3=df0.loc[df0['hay'] == True]
d v hoy days hay 5353 2021-09-20 184.0 2022-09-20 365 True 5354 2021-09-21 184.0 2022-09-20 364 True 5355 2021-09-22 185.0 2022-09-20 363 True 5356 2021-09-23 185.0 2022-09-20 362 True 5357 2021-09-24 186.0 2022-09-20 361 True ... ... ... ... ... ... 5593 2022-09-13 273.0 2022-09-20 7 True 5594 2022-09-14 277.0 2022-09-20 6 True 5595 2022-09-15 276.0 2022-09-20 5 True 5596 2022-09-16 277.0 2022-09-20 4 True 5597 2022-09-19 277.0 2022-09-20 1 True [245 rows x 5 columns]
df_pp= pd.merge(d3pp, d2pp, on='d')
####################################################################
#print(df3)
#aqui sale el valor maximo
df_= pd.merge(df3, df2, on='d')
#v_X blue
df_['fecha'] = pd.to_datetime(df_['d'])
df_['dia_semana'] = df_['fecha'].dt.day_name()
#brecha porcentajes
df_["volatilidad"]= df_['v_y'].rolling(window=2).std()
dfp= df_.sort_values(by='volatilidad', ascending=False)
dfp["brecha"]=(df_["v_y"]-df_["v_x"])/df_["v_x"]*100
dfp['dia_semana'] = dfp['fecha'].dt.day_name()
cleanup_num = {"dia_semana": {"Monday":"Lunes", "Tuesday":"Martes", "Wednesday":"Miercóles", "Thursday":"Jueves", 'Friday':"Viernes"}}
dfp = dfp.replace(cleanup_num)
print(dfp[['volatilidad','v_x','v_y', 'brecha','dia_semana']].head(5))
#dfp=df_.rename(columns={ 'v_x':'OFICIAL', 'v_y':'/08/2018')
print(dfp[['fecha','v_x','v_y','brecha','dia_semana', 'volatilidad']].head(15))
#################volatilidad es la variaciòn función ##########################
def volatibilidad_(info):
aux = [0]
for i in range(1, len(info)):
aux.append(abs(info[i-1]/info[i]-1)*100)
return aux
dfp= dfp.sort_values(by='fecha', ascending=True)
dfp['volatil_v_x'] = volatibilidad_(dfp['v_x'].tolist())
dfp['volatil_v_y'] = volatibilidad_(dfp['v_y'].tolist())
dfp.rename(columns={'v_x': 'dolarOficial', 'v_y': 'dolarBlue'}, inplace=True)
volatilidad v_x v_y brecha dia_semana 190 14.849242 125.99 260.0 106.365585 Lunes 203 14.142136 129.61 337.0 160.010802 Jueves 209 12.727922 131.23 296.0 125.558180 Viernes 202 11.313708 129.39 317.0 144.995749 Miercóles 205 11.313708 130.40 322.0 146.932515 Lunes fecha v_x v_y brecha dia_semana volatilidad 190 2022-07-04 125.99 260.0 106.365585 Lunes 14.849242 203 2022-07-21 129.61 337.0 160.010802 Jueves 14.142136 209 2022-07-29 131.23 296.0 125.558180 Viernes 12.727922 202 2022-07-20 129.39 317.0 144.995749 Miercóles 11.313708 205 2022-07-25 130.40 322.0 146.932515 Lunes 11.313708 194 2022-07-08 126.78 273.0 115.333649 Viernes 11.313708 233 2022-09-05 140.20 270.0 92.582026 Lunes 10.606602 210 2022-08-01 131.94 282.0 113.733515 Lunes 9.899495 208 2022-07-28 131.13 314.0 139.457027 Jueves 8.485281 197 2022-07-13 127.79 283.0 121.457078 Miercóles 7.778175 201 2022-07-19 129.13 301.0 133.098428 Martes 7.071068 88 2022-01-28 104.83 212.5 102.709148 Viernes 7.071068 211 2022-08-02 132.18 291.0 120.154335 Martes 6.363961 235 2022-09-07 140.82 284.0 101.675898 Miercóles 5.656854 191 2022-07-05 126.18 252.0 99.714693 Martes 5.656854
a) La Brecha:
Economistas coinciden en afirmar que una brecha cambiaria alta afecta el normal funcionamiento de la economía e impacta en el valor del dólar y la evolución de la inflación.
El dólar blue es el que circula en el mercado negro y suele tener un valor
más alto que el oficial. Este dólar no se compra en bancos o casas de cambio oficiales.
En este caso la brecha se ha trabajado con la fòrmula del output GAP, la razón es la siguiente:
Se aplica cuando vamos a analizar información en un periodo de tiempo de un país por ejemplo. Se tiene dos valores con características similares las cuales se buscan cuantificar por brecha o gap entre ambas.
En el caso de la fórmula con la cual se desarrollo la pregunta, se toma el dolar oficial vs el dolarblue. La data mostraba que los cambios entre ambas si tenian diferencias. La fórmula permitio a su vez al multiplicarse por 100, la obtención del porcentaje de la brecha.
Siendo el día 22 de Julio del 2022, una fecha donde la brecha fue muy grande entre ambos. Lo que nos permite comprender, que el oficial se mantiene bajo en cuanto a pago, en comparación del blue.
b) La volatilidad:
En este caso o rentabilidad diaria del activo
refiere al valor activo día n/ valor activo n-1
Se obtiene por medio de los datos diarios del activo.
Basada en los días, debemos tomarlo por fechas en este caso.
El calculo de la volatilidad de la acción nos permite obtener la probabilidad de que la
rentabilidad de una acción se sitúe en el intervalo marcado por esa desviación
típica.
https://elpais.com/diario/2005/09/04/negocio/1125839667_850215.html
print('\nPregunta b: Top 5 días con mayor variación')
dfp4['dia_semana'] = dfp4['fecha'].dt.day_name()
cleanup_num = {"dia_semana": {"Monday":"Lunes", "Tuesday":"Martes", "Wednesday":"Miercóles", "Thursday":"Jueves", 'Friday':"Viernes"}}
dfp4 = dfp4.replace(cleanup_num)
dfp4 = dfp.sort_values('volatilidad',ascending=False)
print(dfp4[['fecha','volatilidad','dolarOficial','dolarBlue', 'brecha','dia_semana']].head(5))
print("\nPregunta c: Semana con mayor variación en la brecha ")
print("\nLa respuesta esta en base a la semana en la columna *fecha* contando , 5 dìas habiles.\n")
df_final = (dfp
.reset_index()
.set_index("fecha")
.groupby([pd.Grouper(freq='W-MON')])[["dolarOficial", "dolarBlue"]].mean()
.astype(float)
.reset_index())
df_final["variacion_brecha"] = (df_final["dolarBlue"]-df_final["dolarOficial"])/df_final["dolarOficial"]*100
df_final = df_final.sort_values('variacion_brecha',ascending=False)
print (df_final.head(1))
print('\npregunta d: Día de la semana donde hay mayor variación en la brecha fue Viernes')
dfp4 = dfp.sort_values('brecha',ascending=False)
dfp4['fecha'] = pd.to_datetime(dfp4['d'])
dfp4['dia_semana'] = dfp4['fecha'].dt.day_name()
cleanup_num = {"dia_semana": {"Monday":"Lunes", "Tuesday":"Martes", "Wednesday":"Miercóles", "Thursday":"Jueves", 'Friday':"Viernes"}}
dfp4 = dfp4.replace(cleanup_num)
print(dfp4[['fecha','volatilidad','dolarOficial','dolarBlue', 'brecha','dia_semana']].head(1))
token= "Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTEyMDgwNjAsInR5cGUiOiJleHRlcm5hbCIsInVzZXIiOiJlbGl6YWJlZWVldGhkZGRtb3JhbGVzbUBnbWFpbC5jb20ifQ.o21y_1Ekig5fw0XkNr1KOkcy8t0jLXhDefLPRZm8CEvh2YM-1iJKGD2n0_jP0xv6a68iO6EjKSxPLILa3GI9CA"
########### INFORMACION #################
url="https://api.estadisticasbcra.com/usd"
headers = CaseInsensitiveDict()
headers["Accept"] = "application/json"
headers["Authorization"] =token
resp = requests.get(url, headers=headers)
data= resp.json()
df1=pd.DataFrame(data)
#########################################
##########################################
url="https://api.estadisticasbcra.com/usd_of"
headers = CaseInsensitiveDict()
headers["Accept"] = "application/json"
headers["Authorization"] =token
resp = requests.get(url, headers=headers)
data= resp.json()
df0=pd.DataFrame(data)
######################################
url="https://api.estadisticasbcra.com/milestones"
headers = CaseInsensitiveDict()
headers["Accept"] = "application/json"
headers["Authorization"] = token
resp = requests.get(url, headers=headers)
data= resp.json()
dfx=pd.DataFrame(data)
dfx= dfx.sort_values(by='d', ascending=True)
################# FECHA #########################
date=datetime.today().strftime('%Y-%m-%d')
df1['hoy']=pd.to_datetime(date, format='%Y/%m/%d')
df1['d'] = pd.to_datetime(df1['d'])
date=datetime.today().strftime('%Y-%m-%d')
df0['hoy']=pd.to_datetime(date, format='%Y/%m/%d')
df0['d'] = pd.to_datetime(df0['d'])
###### MERGE DOLAR BLUE Y OFICIAL ###############
df_= pd.merge(df0, df1, on='d')
#v_X blue
df_['fecha'] = pd.to_datetime(df_['d'])
df_['dia_semana'] = df_['fecha'].dt.day_name()
df_.rename(columns={'v_x': 'dolarOficial', 'v_y': 'dolarBlue'}, inplace=True)
df_["volatilidad"]= df_['dolarBlue'].rolling(window=2).std()
dfp= df_.sort_values(by='volatilidad', ascending=False)
dfp["brecha"]=(df_["dolarBlue"]-df_["dolarOficial"])/df_["dolarOficial"]*100
####### SACAR LA VOLATIVILIDAD ###############
def volatibilidad_(info):
aux = [0]
for i in range(1, len(info)):
aux.append(((info[i-1]/info[i] - 1)*100))
return aux
dfp_ = dfp.sort_values('fecha',ascending=True)
dfp_['volatil_dolarOficial'] = volatibilidad_(dfp_['dolarOficial'].tolist())
dfp_['volatil_dolarBlue'] = volatibilidad_(dfp_['dolarBlue'].tolist())
dfp_.rename(columns={'v_x': 'dolarOficial', 'v_y': 'dolarBlue'}, inplace=True)
date=datetime.today().strftime('%Y-%m-%d')
dfx['hoy']=pd.to_datetime(date, format='%Y/%m/%d')
dfx['d'] = pd.to_datetime(dfx['d'])
######## TENER SOLO ANO Y MES ##############
dfp['mes'] = pd.DatetimeIndex(dfp['fecha']).month
dfp['year']= pd.DatetimeIndex(dfp['fecha']).year
cleanup_num = {"mes": {1:"Ene", 2:"Feb", 3:"Mar", 4:"Abr", 5:"May", 6:"Jun",
7:"Jul", 8:"Ago", 9:"Set", 10:"Oct", 11:"Nov", 12:"Dec"}}
dfp = dfp.replace(cleanup_num)
dfp['y-m'] = dfp['mes'].map(str)+ '-' +dfp['year'].map(str)
dfp_ = dfp.sort_values('fecha',ascending=True)
dfp_['volatil_dolarOficial'] = volatibilidad_(dfp_['dolarOficial'].tolist())
dfp_['volatil_dolarBlue'] = volatibilidad_(dfp_['dolarBlue'].tolist())
dfp_.rename(columns={'v_x': 'dolarOficial', 'v_y': 'dolarBlue'}, inplace=True)
#print(dfp_[['fecha','volatil_dolarOficial','volatil_dolarBlue','brecha','dia_semana' ]])
date=datetime.today().strftime('%Y-%m-%d')
dfx['hoy']=pd.to_datetime(date, format='%Y/%m/%d')
dfx['d'] = pd.to_datetime(dfx['d'])
dfp['year']= pd.DatetimeIndex(dfp['fecha']).year
cleanup_num = {"mes": {1:"Ene", 2:"Feb", 3:"Mar", 4:"Abr", 5:"May", 6:"Jun",
7:"Jul", 8:"Ago", 9:"Set", 10:"Oct", 11:"Nov", 12:"Dec"}}
dfp['y-m'] = dfp['mes'].map(str)+ '-' +dfp['year'].map(str)
dfp = dfp.replace(cleanup_num)
df_resultado=pd.merge(dfx,dfp,how='inner',left_on=['d'],right_on=['fecha'])
df_resultado.plot(kind = 'bar',
x = 'y-m',
y = ['dolarOficial','dolarBlue','e'],
color = ['green','red','pink'])
# set the title
plt.text(0, 260, 'Sucesos importantes a nivel político-económico mes a mes', fontsize = 8,
bbox = dict(facecolor = 'red', alpha = 0.5))
# show the plot
#Print label of politico-economico
xx = np.arange(0,len(df_resultado['y-m'].tolist()),1)
i = 0
list_ = df_resultado['e'].tolist()
for x,y in zip(xx, df_resultado['dolarOficial'].tolist() ):
label = "{:.3f}".format(y)
plt.annotate(list_[i], # this is the value which we want to label (text)
(x,y), # x and y is the points location where we have to label
textcoords="offset points",
xytext=(0,10), # this for the distance between the points
# and the text label
ha='center',
fontsize = 8,
rotation=90,
color="blue",
arrowprops=dict(arrowstyle="->", color='blue'))
i+=1
plt.show()
El gran problema que enfrentará Silvina Batakis es moderar la gran cantidad de dinero que emite el BCRA para financiar el déficit fiscal, que es e l principal causante del aumento de la inflación de los últimos meses. En los últimos cuatro trimestres el BCRA emitió unos 2,2 billones de pesos y el mes pasado unos 600.000 millones de pesos.
En Internet como en la gráfica se muestra que durante estos meses la generación de dinero ha provocado un aumento en la inflación del país. La data en un inicio parece también no contener información real de lo que iba sucediendo entre algunos años.
from sklearn.linear_model import LinearRegression
#print(df_.head(-10))
df_resultado.rename(columns={'d': 'fecha'}, inplace=True)
dfp_ = (dfp_
.reset_index()
.set_index("fecha")
.groupby([pd.Grouper(freq='M')])[["dolarOficial", "dolarBlue"]].mean()
.astype(float)
.reset_index())
#print(df_[['my_dates','dolarOficial','dolarBlue']])
#print(df_.ta.ema(close='dolarBlue', length=10, append=True))
dfp_ = dfp_.iloc[10:]
#print(df_.head(10))
dfp_ = dfp_.iloc[10:]
#print(df_.head(10))
def diff_month(d1, d2):
p = []
for i in range(0, len(d1)):
p.append( (d1[i].year - d2.year) * 12 + (d1[i].month - d2.month))
return p
data_all = dfp_['fecha'].tolist()
data_max = data_all[0]
dfp_['Number'] = diff_month(data_all, data_max)
# Regresion Lineal
model = LinearRegression().fit(dfp_[['Number']], dfp_[['dolarBlue']])
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
date_max = (dfp_['Number'].tolist())[-1]
df_predict = [[date_max + 3], [date_max + 6], [date_max + 12]]
predict_months = model.predict(df_predict)
print("Predicción 3 meses Blue ", predict_months[0])
print("Predicción 6 meses Blue ", predict_months[1])
print("Predicción 12 meses Blue ", predict_months[2])
modelOf = LinearRegression().fit(dfp_[['Number']], dfp_[['dolarOficial']])
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
date_max = (dfp_['Number'].tolist())[-1]
df_predict = [[date_max + 3], [date_max + 6], [date_max + 12]]
predict_months = modelOf.predict(df_predict)
print("Predicción 3 meses oficial ", predict_months[0])
print("Predicción 6 meses oficial ", predict_months[1])
print("Predicción 12 meses oficial ", predict_months[2])
months_year = (dfp_['fecha'].dt.to_period('M')).tolist()
plt.scatter(dfp_['Number'].tolist(), dfp_['dolarBlue'].tolist(), label="dolarBlue")
plt.scatter(dfp_['Number'].tolist(), dfp_['dolarOficial'].tolist(), label="dolarOfc")
y_pred = model.predict(dfp_[['Number']])
y_predO= modelOf.predict(dfp_[['Number']])
plt.plot(dfp_['Number'], y_pred, color = 'red', linewidth = 3, label="LR_Blue")
plt.plot(dfp_['Number'], y_predO, color = 'green', linewidth = 3, label="LR_Ofic")
plt.title('Regresion Simple')
plt.xlabel('fecha')
plt.ylabel('dolar cotization')
plt.xticks(dfp_['Number'].tolist()[0::15], months_year[0::15], rotation=90)
plt.legend(loc="upper left")
plt.show()
Predicción 3 meses Blue [106.11081509]
Predicción 6 meses Blue [108.00115445]
Predicción 12 meses Blue [111.78183317]
Predicción 3 meses oficial [64.30218871]
Predicción 6 meses oficial [65.41218611]
Predicción 12 meses oficial [67.63218092]
En el caso de la regresión lineal la pendiente por no ser una regresión polinómica sino lo que pide el enunciado
textualmente no tiende a ir tomando la forma de la gráfica. En este caso la comparación entre los datos muestra que el dolar blue es el que tiene mayor fuerza en el mercado. Mientras que el dolar oficial se mantiene muy por debajo en cuanto a pagos.
El resultado para el blue continúa manteniendose superior al dolar oficial en este periodo de tiempo.
dfp_["brecha"]=(dfp_["dolarBlue"]-dfp_["dolarOficial"])/dfp_["dolarOficial"]*100
year_max = dfp_['fecha'].tolist()[-1]
dfp_['year']=(year_max - dfp_['fecha']).dt.days
dfp_['year']= dfp_['year']<= 252*5
dfp_=dfp_.loc[dfp_['year'] == True]
dfp3 = dfp_.sort_values('dolarOficial',ascending=True)
print("Dolar Oficial Bajo: \n", dfp3.head(4))
dfp3 = dfp_.sort_values('dolarBlue',ascending=False)
print("Dolar Blue Alto: \n", dfp3.head(4))
**Para esta pregunta, podemos determinar que el Dolar oficial más bajo fue en el año 2019 entre los últimos 4 años para el dolar oficial. Hubiera sido bueno comprar el dolar en esa época. Para venderlo al dolar Blue este mes.
**Para esta pregunta, podemos determinar que el Dolar oficial más bajo fue en el año 2019 entre los últimos 4 años para el dolar oficial. Hubiera sido bueno comprar el dolar en esa época. Para venderlo al dolar Blue este mes.