Afts-garch

InvokerInvoker
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

Invoker
Invoker