From 782d735d734f914339dbf592db4ee7f66edb1576 Mon Sep 17 00:00:00 2001 From: ritvikmath Date: Thu, 11 Jun 2020 19:23:36 -0700 Subject: [PATCH] Add files via upload --- GARCH Stock Modeling.ipynb | 424 +++++++++++++++++++++++++++++++++++++ 1 file changed, 424 insertions(+) create mode 100644 GARCH Stock Modeling.ipynb diff --git a/GARCH Stock Modeling.ipynb b/GARCH Stock Modeling.ipynb new file mode 100644 index 0000000..5eafee1 --- /dev/null +++ b/GARCH Stock Modeling.ipynb @@ -0,0 +1,424 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# GARCH Stock Forecasting" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Read Data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas_datareader.data as web\n", + "from datetime import datetime, timedelta\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from arch import arch_model\n", + "from statsmodels.graphics.tsaplots import plot_acf, plot_pacf\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## DIS Volatility" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "start = datetime(2015, 1, 1)\n", + "end = datetime(2020, 6, 10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dis = web.DataReader('DIS', 'yahoo', start=start, end=end)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "returns = 100 * dis.Close.pct_change().dropna()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(10,4))\n", + "plt.plot(returns)\n", + "plt.ylabel('Pct Return', fontsize=16)\n", + "plt.title('DIS Returns', fontsize=20)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## PACF" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_pacf(returns**2)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fit GARCH(3,3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model = arch_model(returns, p=3, q=3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model_fit = model.fit()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "model_fit.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Try GARCH(3,0) = ARCH(3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model = arch_model(returns, p=3, q=0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model_fit = model.fit()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model_fit.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rolling_predictions = []\n", + "test_size = 365\n", + "\n", + "for i in range(test_size):\n", + " train = returns[:-(test_size-i)]\n", + " model = arch_model(train, p=3, q=0)\n", + " model_fit = model.fit(disp='off')\n", + " pred = model_fit.forecast(horizon=1)\n", + " rolling_predictions.append(np.sqrt(pred.variance.values[-1,:][0]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rolling_predictions = pd.Series(rolling_predictions, index=returns.index[-365:])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "plt.figure(figsize=(10,4))\n", + "true, = plt.plot(returns[-365:])\n", + "preds, = plt.plot(rolling_predictions)\n", + "plt.title('Volatility Prediction - Rolling Forecast', fontsize=20)\n", + "plt.legend(['True Returns', 'Predicted Volatility'], fontsize=16)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# S&P 500" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "start = datetime(2000, 1, 1)\n", + "end = datetime(2020, 6, 10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "spy = web.DataReader('SPY', 'yahoo', start=start, end=end)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "returns = 100 * spy.Close.pct_change().dropna()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(10,4))\n", + "plt.plot(returns)\n", + "plt.ylabel('Pct Return', fontsize=16)\n", + "plt.title('SPY Returns', fontsize=20)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## PACF" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_pacf(returns**2)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fit GARCH(2,2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model = arch_model(returns, p=2, q=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model_fit = model.fit()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "model_fit.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Rolling Forecast" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rolling_predictions = []\n", + "test_size = 365*5\n", + "\n", + "for i in range(test_size):\n", + " train = returns[:-(test_size-i)]\n", + " model = arch_model(train, p=2, q=2)\n", + " model_fit = model.fit(disp='off')\n", + " pred = model_fit.forecast(horizon=1)\n", + " rolling_predictions.append(np.sqrt(pred.variance.values[-1,:][0]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rolling_predictions = pd.Series(rolling_predictions, index=returns.index[-365*5:])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "plt.figure(figsize=(10,4))\n", + "true, = plt.plot(returns[-365*5:])\n", + "preds, = plt.plot(rolling_predictions)\n", + "plt.title('Volatility Prediction - Rolling Forecast', fontsize=20)\n", + "plt.legend(['True Returns', 'Predicted Volatility'], fontsize=16)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# How to use the model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "train = returns\n", + "model = arch_model(train, p=2, q=2)\n", + "model_fit = model.fit(disp='off')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pred = model_fit.forecast(horizon=7)\n", + "future_dates = [returns.index[-1] + timedelta(days=i) for i in range(1,8)]\n", + "pred = pd.Series(np.sqrt(pred.variance.values[-1,:]), index=future_dates)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(10,4))\n", + "plt.plot(pred)\n", + "plt.title('Volatility Prediction - Next 7 Days', fontsize=20)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}