head.png

Las librerias con las que he desarrollado este informe

In [1]:
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
Dólar oficial vs Dólar Blue: últimos 365 días: a)Día con mayor variación en la brecha b)Top 5 días con mayor variación c)Semana con mayor variación en la brecha d)Día de la semana donde hay mayor variación en la brecha

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.

In [2]:
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)
In [3]:
#########################################
#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]
In [4]:
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&oacute;les",  "Thursday":"Jueves",  'Friday':"Viernes"}}
dfp = dfp.replace(cleanup_num)
In [5]:
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&oacute;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&oacute;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&oacute;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&oacute;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&oacute;les     5.656854
191 2022-07-05  126.18  252.0   99.714693            Martes     5.656854
Dólar oficial vs Dólar Blue: últimos 365 días: a)Día con mayor variación en la brecha b)Top 5 días con mayor variación c)Semana con mayor variación en la brecha d)Día de la semana donde hay mayor variación en la brecha

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. descarga.png 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.

In [ ]:
 

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 math-20220805.png

In [ ]:
print('\nPregunta b: Top 5 d&iacute;as con mayor variaci&oacute;n')
dfp4['dia_semana'] = dfp4['fecha'].dt.day_name()
cleanup_num = {"dia_semana": {"Monday":"Lunes", "Tuesday":"Martes", "Wednesday":"Mierc&oacute;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))
In [ ]:
print("\nPregunta c: Semana con mayor variaci&oacute;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))
In [ ]:
print('\npregunta d: D&iacute;a de la semana donde hay mayor variaci&oacute;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&oacute;les",  "Thursday":"Jueves",  'Friday':"Viernes"}}
dfp4 = dfp4.replace(cleanup_num)

print(dfp4[['fecha','volatilidad','dolarOficial','dolarBlue', 'brecha','dia_semana']].head(1))
Con la info histórica del valor del dólar y del blue, realizar un análisis exploratorio. Cruzar la data con sucesos importantes a nivel político-económico y graficar mes a mes.
In [ ]:
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
In [ ]:
####### 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&iacute;tico-econ&oacute;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()

descargar.png 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.

**Implementar una regresión lineal (una para cada tipo de dólar) para predecir el valor del dólar**
In [ ]:
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&oacute;n 3 meses  Blue ", predict_months[0])
print("Predicci&oacute;n 6 meses  Blue ", predict_months[1])
print("Predicci&oacute;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&oacute;n 3 meses oficial ", predict_months[0])
print("Predicci&oacute;n 6 meses  oficial ", predict_months[1])
print("Predicci&oacute;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()

Captura%20de%20pantalla%202022-08-05%20084839.png

**Implementar una regresión lineal (una para cada tipo de dólar) para predecir el valor del dólar**

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] descargar%20%282%29.png 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.

Inflación vs Dólar últimos 4 años: Mejor momento para comprar dolár oficial y venderlo a dolár blue
In [ ]:
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))

Captura%20de%20pantalla%202022-08-05%20080909.png

**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.

OIP.jfif

In [ ]: