# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# # ARCH: Autoregressive Conditional Heteroscedasticity
#
# ## Volatilidad 
#
# - Buscar estabilidad de la serie a largo plazo.
# - Nos interesa la magnitud de los resiudos $\epsilon_t$
# - Menor varianza de los datos implica menor volatilidad. Eso se traduce en menor riesgo y mayor seguridad en las inversiones.
# - Tomar $\epsilon_{t}^2$ resuelve el problema de signos positivos y negativos.
# - $\epsilon_{t}^2$ penaliza diferencias altas entre valores altos y predicciones.
#
# Consiste en dos ecuaciones: basado en la $\mu$ (media) y en la $\sigma^2$
#  - Medición de cambios inesperados.
#
# ## ARCH
#
# Dos componentes en el modelo: 
# i. Heterocedasticidad: dispersión diferente (medidas de dispersión dcomo $\sigma$ y $\sigma^2$. El énfasis es en esta última)
#
# ii. Condicional: un valor que depende de otro, i.e. $P(A|B)$.
#
# El modelo autorregresivo tomando los dos componentes mencionados:
# - $(\sigma_{t}^2|x_1\ x_2\ x_3\ ... x_n)$
#
# - $(\sigma_{t}^2|\sigma_1\sigma_2\sigma_3\ ... \sigma_n)$
#
# ### ARCH(1)
#
# - $Var(x_t|x_{t-1}) = \alpha_0 + \alpha_1 \epsilon_{t-1}^2$
# - $\sigma_{t}^2 = \alpha_0 + \alpha_1 \epsilon_{t-1}^2$
#
# ### ARCH(q)
#
# - $\sigma_{t}^2 = \alpha_0 + \alpha_1 \epsilon_{t-1}^2 + \alpha_2 \epsilon_{t-2}^2 + ... +\alpha_q \epsilon_{t-q}^2$
#
#

# ## Importing relevant  packages

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.graphics.tsaplots as sgt
import statsmodels.tsa.stattools as sts
from statsmodels.tsa.arima_model import ARIMA
from scipy.stats.distributions import chi2
from math import sqrt
import seaborn as sns
sns.set()

# ## Importing Data and Pre-processing

raw_csv_data = pd.read_csv("../../DataSets/Index2018.csv")
df_comp = raw_csv_data.copy()
df_comp.date = pd.to_datetime(df_comp.date, dayfirst = True)
df_comp.set_index("date", inplace = True)
df_comp = df_comp.asfreq('b')
df_comp = df_comp.fillna(method='ffill')

df_comp.head()

# +
#df_comp.shape

# +
#df_comp = df_comp.asfreq('b')
# -

df_comp.isna().sum()

# +
#df_comp = df_comp.fillna(method = 'ffill')
#df_comp.isna().sum()

# +
# Creamos una nueva variabale (una copia de ftse)

df_comp['market_value'] = df_comp.ftse
df_comp.head()
# -

import warnings
warnings.filterwarnings("ignore")

del df_comp['spx']
del df_comp['dax']
del df_comp['ftse']
del df_comp['nikkei']

# splitting data set
size = int(len(df_comp)*0.8)
df, df_test = df_comp.iloc[:size], df_comp.iloc[size:]


# ### LLR TEST

def LLR_test(mod_1,mod_2, DF = 1):
    L1 = mod_1.llf
    L2 = mod_2.llf
    LR = (2*(L2-L1))
    p  = chi2.sf(LR, DF).round(3)
    return p


# ## Creating Return from 'ftse' values

df['returns'] = df.market_value.pct_change(1)*100
df.head()

df['sq_returns'] = df.returns.mul(df.returns)
df.head()

# ## Returns vs Squared Returns

df.returns.plot(figsize =(20,5))
plt.title("Returns", size = 24)
plt.show()

df.sq_returns.plot(figsize =(20,5))
plt.title("Volatilidad", size = 24)
plt.show()

# Mirar plot con función de autocorrelación parcial de los retornos y retornos al cuadrado
sgt.plot_pacf(df.returns[1:], lags = 40, alpha = 0.05, zero = False, method = ('ols'))
plt.title("PACF of returns", size = 21)
plt.show()

# +
sgt.plot_pacf(df.sq_returns[1:], lags = 40, alpha = 0.05, zero = False, method = ('ols'))
plt.title("PACF of squared returns", size = 21)
plt.show()

# tiende a existir tendencias a corto plazo en la varianza
# -

# ## ARCH

# !pip install arch

from arch import arch_model

model_arch_1 = arch_model(df.returns[1:])
results_arch_1 = model_arch_1.fit()
# results_arch_1 = model_arch_1.fit(update_freq = 5)
results_arch_1.summary()

# # ARCH(1)

# +

model_arch_1 = arch_model(df.returns[1:], mean = 'Constant', vol = "ARCH", p = 1)
results_arch_1 = model_arch_1.fit(update_freq = 1)
results_arch_1.summary()

StarcoderdataJupyterScriptsDedupFiltered