Afts-garch

2 min read
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from matplotlib import style
%matplotlib inline
from datetime import datetime
import yfinance as yf
stock = yf.Ticker("GS")
volitality_data = stock.history(period="max")
volatility_data = stock.history(period="5y")
from alpha_vantage.timeseries import TimeSeries
api_key = "YOUR_ALPHA_VANTAGE_KEY"
ts = TimeSeries(key=api_key, output_format="pandas")
volatility_data, meta_data = ts.get_daily(symbol="GS", outputsize="full")
print(volatility_data.tail())
volatility_data.head()
# Plot the historical volatility data
plt.figure(figsize=(10, 6))
plt.plot(volatility_data.index, volatility_data["4. close"])
plt.xlabel("date")
plt.ylabel("Volatility")
plt.title("Historical Volatility Data")
plt.grid(True)
plt.show()
# Calculate the rolling mean and standard deviation
rolling_mean = volatility_data["4. close"].rolling(window=30).mean()
rolling_std = volatility_data["4. close"].rolling(window=30).std()
# Plot the rolling mean and standard deviation
plt.figure(figsize=(10, 6))
plt.plot(volatility_data.index, volatility_data["4. close"], label="Volatility")
plt.plot(rolling_mean.index, rolling_mean, label="Rolling Mean")
plt.plot(rolling_std.index, rolling_std, label="Rolling Std")
plt.xlabel("Date")
plt.ylabel("Volatility")
plt.title("Rolling Mean and Standard Deviation of Volatility Data")
plt.legend()
plt.grid(True)
plt.show()
from arch import arch_model
returns = np.log(volatility_data["4. close"]).diff().dropna()
model_arch = arch_model(returns, vol='ARCH', p=1) # p=1 for ARCH(1)
model_fit_arch = model_arch.fit()
print(model_fit_arch.summary())
volatility_arch = model_fit_arch.conditional_volatility
plt.figure(figsize=(10, 6))
plt.plot(volatility_arch)
plt.title('Conditional Volatility (ARCH(1))')
plt.xlabel('Date')
plt.ylabel('Volatility')
plt.show()
mae = np.mean(np.abs(volatility_arch - returns))
print("Mean Absolute Error (MAE):", mae)
rmse = np.sqrt(np.mean((volatility_arch - returns) ** 2))
print("Root Mean Squared Error (RMSE):", rmse)
model = arch_model(returns, vol="Garch", p=1, q=1)
results = model.fit()
results.summary()
volatility = results.conditional_volatility
plt.figure(figsize=(10, 6))
plt.plot(volatility)
plt.title('Conditional Volatility (GARCH(1,1))')
plt.xlabel('Date')
plt.ylabel('Volatility')
plt.show()
plt.figure(figsize=(10, 6))
plt.plot(volatility.index, volatility, label="Estimated Volatility")
plt.plot(returns.index, returns, label="Actual Volatility")
plt.xlabel("Date")
plt.ylabel("Volatility")
plt.title("Estimated and Actual Volatility")
plt.legend()
plt.grid(True)
plt.show()
forecast = results.forecast(start=0, horizon=30)
forecast_volatility = forecast.variance.dropna().values.flatten()
# Plot the forecasted volatility
plt.figure(figsize=(10, 6))
plt.plot(forecast_volatility, label="Forecasted Volatility")
plt.xlabel("Time")
plt.ylabel("Volatility")
plt.title("Forecasted Volatility")
plt.legend()
plt.grid(True)
plt.show()
mae = np.mean(np.abs(volatility - returns))
print("Mean Absolute Error (MAE):", mae)
rmse = np.sqrt(np.mean((volatility - returns) ** 2))
print("Root Mean Squared Error (RMSE):", rmse)
errors = volatility - returns
# Plot the histogram of forecast errors
plt.figure(figsize=(10, 6))
plt.hist(errors, bins=30, density=True)
plt.xlabel("Forecast Error")
plt.ylabel("Density")
plt.title("Histogram of Forecast Errors")
plt.grid(True)
plt.show()
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# Plot ACF and PACF of squared returns
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
plot_acf(returns**2, lags=20, ax=axes[0])
axes[0].set_title("ACF of Squared Returns")
plot_pacf(returns**2, lags=20, ax=axes[1])
axes[1].set_title("PACF of Squared Returns")
plt.show()
0
Subscribe to my newsletter
Read articles from Invoker directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
