Add files via upload

master
ritvikmath 2020-06-11 19:23:36 -07:00 committed by GitHub
parent 2efdf84abd
commit 782d735d73
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 424 additions and 0 deletions

View File

@ -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
}