├── README.md
├── 0. Updating The Dataset.ipynb
├── 11. Auto ARIMA.ipynb
├── 10. The GARCH model.ipynb
└── 4. Analyzing prices using the AR model.ipynb
/README.md:
--------------------------------------------------------------------------------
1 | # Time-series-analysis-in-Python
2 | I perform time series analysis of data from scratch. I also implement The Autoregressive (AR) Model, The Moving Average (MA) Model, The Autoregressive Moving Average (ARMA) Model, The Autoregressive Integrated Moving Average (ARIMA) Model, The ARCH Model, The GARCH model, Auto ARIMA, forecasting and exploring a business case.
3 |
4 | Index2018.csv is the dataset used for time series analysis in this project
5 |
--------------------------------------------------------------------------------
/0. Updating The Dataset.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "# Importing the necessary package \n",
10 | "import yfinance "
11 | ]
12 | },
13 | {
14 | "cell_type": "code",
15 | "execution_count": 2,
16 | "metadata": {},
17 | "outputs": [],
18 | "source": [
19 | "# Ignoring warning messages\n",
20 | "import warnings \n",
21 | "warnings.filterwarnings(\"ignore\")"
22 | ]
23 | },
24 | {
25 | "cell_type": "code",
26 | "execution_count": 3,
27 | "metadata": {},
28 | "outputs": [
29 | {
30 | "name": "stdout",
31 | "output_type": "stream",
32 | "text": [
33 | "[*********************100%***********************] 4 of 4 downloaded\n"
34 | ]
35 | }
36 | ],
37 | "source": [
38 | "# Using the .download() method to get our data\n",
39 | "\n",
40 | "raw_data = yfinance.download (tickers = \"^GSPC ^FTSE ^N225 ^GDAXI\", start = \"1994-01-07\", end = \"2019-09-27\", interval = \"1d\", group_by = 'ticker', auto_adjust = True, treads = True)\n",
41 | "\n",
42 | "# tickers -> The time series we are interested in - (in our case, these are the S&P, FTSE, NIKKEI and DAX)\n",
43 | "# start -> The starting date of our data set\n",
44 | "# end -> The ending date of our data set (at the time of upload, this is the current date)\n",
45 | "# interval -> The distance in time between two recorded observations. Since we're using daily closing prices, we set it equal to \"1d\", which indicates 1 day. \n",
46 | "# group_by -> The way we want to group the scraped data. Usually we want it to be \"ticker\", so that we have all the information about a time series in 1 variable.\n",
47 | "# auto_adjust -> Automatically adjust the closing prices for each period. \n",
48 | "# treads - > Whether to use threads for mass downloading. "
49 | ]
50 | },
51 | {
52 | "cell_type": "code",
53 | "execution_count": 4,
54 | "metadata": {},
55 | "outputs": [],
56 | "source": [
57 | "# Creating a back up copy in case we remove/alter elements of the data by mistake\n",
58 | "df_comp = raw_data.copy()"
59 | ]
60 | },
61 | {
62 | "cell_type": "code",
63 | "execution_count": 5,
64 | "metadata": {},
65 | "outputs": [],
66 | "source": [
67 | "# Adding new columns to the data set\n",
68 | "df_comp['spx'] = df_comp['^GSPC'].Close\n",
69 | "df_comp['dax'] = df_comp['^GDAXI'].Close\n",
70 | "df_comp['ftse'] = df_comp['^FTSE'].Close\n",
71 | "df_comp['nikkei'] = df_comp['^N225'].Close"
72 | ]
73 | },
74 | {
75 | "cell_type": "code",
76 | "execution_count": 6,
77 | "metadata": {
78 | "scrolled": true
79 | },
80 | "outputs": [],
81 | "source": [
82 | "df_comp = df_comp.iloc[1:] # Removing the first elements, since we always start 1 period before the first, due to time zone differences of closing prices\n",
83 | "del df_comp['^N225'] # Removing the original tickers of the data set\n",
84 | "del df_comp['^GSPC']\n",
85 | "del df_comp['^GDAXI']\n",
86 | "del df_comp['^FTSE']\n",
87 | "df_comp=df_comp.asfreq('b') # Setting the frequency of the data\n",
88 | "df_comp=df_comp.fillna(method='ffill') # Filling any missing values"
89 | ]
90 | },
91 | {
92 | "cell_type": "code",
93 | "execution_count": 7,
94 | "metadata": {},
95 | "outputs": [
96 | {
97 | "name": "stdout",
98 | "output_type": "stream",
99 | "text": [
100 | " spx dax ftse nikkei\n",
101 | " \n",
102 | "Date \n",
103 | "1994-01-07 469.90 2224.95 3446.0 18124.01\n",
104 | "1994-01-10 475.27 2225.00 3440.6 18443.44\n",
105 | "1994-01-11 474.13 2228.10 3413.8 18485.25\n",
106 | "1994-01-12 474.17 2182.06 3372.0 18793.88\n",
107 | "1994-01-13 472.47 2142.37 3360.0 18577.26\n",
108 | " spx dax ftse nikkei\n",
109 | " \n",
110 | "Date \n",
111 | "2019-09-20 2992.07 12468.01 7344.9 22079.09\n",
112 | "2019-09-23 2991.78 12342.33 7326.1 22079.09\n",
113 | "2019-09-24 2966.60 12307.15 7291.4 22098.84\n",
114 | "2019-09-25 2984.87 12234.18 7290.0 22020.15\n",
115 | "2019-09-26 2977.62 12288.54 7351.1 22048.24\n"
116 | ]
117 | }
118 | ],
119 | "source": [
120 | "print (df_comp.head()) # Displaying the first 5 elements to make sure the data was scraped correctly\n",
121 | "print (df_comp.tail()) # Making sure the last day we're including in the series are correct"
122 | ]
123 | }
124 | ],
125 | "metadata": {
126 | "kernelspec": {
127 | "display_name": "Python 3",
128 | "language": "python",
129 | "name": "python3"
130 | },
131 | "language_info": {
132 | "codemirror_mode": {
133 | "name": "ipython",
134 | "version": 3
135 | },
136 | "file_extension": ".py",
137 | "mimetype": "text/x-python",
138 | "name": "python",
139 | "nbconvert_exporter": "python",
140 | "pygments_lexer": "ipython3",
141 | "version": "3.7.4"
142 | }
143 | },
144 | "nbformat": 4,
145 | "nbformat_minor": 2
146 | }
147 |
--------------------------------------------------------------------------------
/11. Auto ARIMA.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "### Packages"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 1,
13 | "metadata": {},
14 | "outputs": [],
15 | "source": [
16 | "import numpy as np\n",
17 | "import pandas as pd\n",
18 | "import scipy\n",
19 | "import statsmodels.api as sm\n",
20 | "import matplotlib.pyplot as plt\n",
21 | "import seaborn as sns\n",
22 | "import sklearn\n",
23 | "from statsmodels.tsa.arima_model import ARIMA\n",
24 | "from arch import arch_model\n",
25 | "import seaborn as sns\n",
26 | "import yfinance\n",
27 | "import warnings\n",
28 | "warnings.filterwarnings(\"ignore\")\n",
29 | "sns.set()"
30 | ]
31 | },
32 | {
33 | "cell_type": "markdown",
34 | "metadata": {},
35 | "source": [
36 | "### Loading the data"
37 | ]
38 | },
39 | {
40 | "cell_type": "code",
41 | "execution_count": 2,
42 | "metadata": {},
43 | "outputs": [
44 | {
45 | "name": "stdout",
46 | "output_type": "stream",
47 | "text": [
48 | "[*********************100%***********************] 4 of 4 downloaded\n"
49 | ]
50 | }
51 | ],
52 | "source": [
53 | "raw_data = yfinance.download (tickers = \"^GSPC ^FTSE ^N225 ^GDAXI\", start = \"1994-01-07\", end = \"2018-01-29\", \n",
54 | " interval = \"1d\", group_by = 'ticker', auto_adjust = True, treads = True)"
55 | ]
56 | },
57 | {
58 | "cell_type": "code",
59 | "execution_count": 3,
60 | "metadata": {},
61 | "outputs": [],
62 | "source": [
63 | "df_comp = raw_data.copy()"
64 | ]
65 | },
66 | {
67 | "cell_type": "code",
68 | "execution_count": 4,
69 | "metadata": {},
70 | "outputs": [],
71 | "source": [
72 | "df_comp['spx'] = df_comp['^GSPC'].Close[:]\n",
73 | "df_comp['dax'] = df_comp['^GDAXI'].Close[:]\n",
74 | "df_comp['ftse'] = df_comp['^FTSE'].Close[:]\n",
75 | "df_comp['nikkei'] = df_comp['^N225'].Close[:]"
76 | ]
77 | },
78 | {
79 | "cell_type": "code",
80 | "execution_count": 5,
81 | "metadata": {
82 | "scrolled": true
83 | },
84 | "outputs": [],
85 | "source": [
86 | "df_comp = df_comp.iloc[1:]\n",
87 | "del df_comp['^N225']\n",
88 | "del df_comp['^GSPC']\n",
89 | "del df_comp['^GDAXI']\n",
90 | "del df_comp['^FTSE']\n",
91 | "df_comp=df_comp.asfreq('b')\n",
92 | "df_comp=df_comp.fillna(method='ffill')"
93 | ]
94 | },
95 | {
96 | "cell_type": "markdown",
97 | "metadata": {},
98 | "source": [
99 | "### Creating Returns"
100 | ]
101 | },
102 | {
103 | "cell_type": "code",
104 | "execution_count": 6,
105 | "metadata": {},
106 | "outputs": [],
107 | "source": [
108 | "df_comp['ret_spx'] = df_comp.spx.pct_change(1)*100\n",
109 | "df_comp['ret_ftse'] = df_comp.ftse.pct_change(1)*100\n",
110 | "df_comp['ret_dax'] = df_comp.dax.pct_change(1)*100\n",
111 | "df_comp['ret_nikkei'] = df_comp.nikkei.pct_change(1)*100"
112 | ]
113 | },
114 | {
115 | "cell_type": "markdown",
116 | "metadata": {},
117 | "source": [
118 | "### Splitting the Data"
119 | ]
120 | },
121 | {
122 | "cell_type": "code",
123 | "execution_count": 7,
124 | "metadata": {},
125 | "outputs": [],
126 | "source": [
127 | "size = int(len(df_comp)*0.8)\n",
128 | "df, df_test = df_comp.iloc[:size], df_comp.iloc[size:]"
129 | ]
130 | },
131 | {
132 | "cell_type": "markdown",
133 | "metadata": {},
134 | "source": [
135 | "### Fitting a Model"
136 | ]
137 | },
138 | {
139 | "cell_type": "code",
140 | "execution_count": 8,
141 | "metadata": {},
142 | "outputs": [],
143 | "source": [
144 | "from pmdarima.arima import auto_arima"
145 | ]
146 | },
147 | {
148 | "cell_type": "code",
149 | "execution_count": 9,
150 | "metadata": {},
151 | "outputs": [],
152 | "source": [
153 | "model_auto = auto_arima(df.ret_ftse[1:])"
154 | ]
155 | },
156 | {
157 | "cell_type": "code",
158 | "execution_count": 10,
159 | "metadata": {},
160 | "outputs": [
161 | {
162 | "data": {
163 | "text/plain": [
164 | "ARIMA(maxiter=50, method='lbfgs', order=(2, 0, 5), out_of_sample_size=0,\n",
165 | " scoring='mse', scoring_args=None, seasonal_order=(0, 0, 0, 1),\n",
166 | " start_params=None, suppress_warnings=False, trend=None,\n",
167 | " with_intercept=True)"
168 | ]
169 | },
170 | "execution_count": 10,
171 | "metadata": {},
172 | "output_type": "execute_result"
173 | }
174 | ],
175 | "source": [
176 | "model_auto"
177 | ]
178 | },
179 | {
180 | "cell_type": "code",
181 | "execution_count": 11,
182 | "metadata": {},
183 | "outputs": [
184 | {
185 | "data": {
186 | "text/html": [
187 | "
\n",
188 | "Statespace Model Results\n",
189 | "\n",
190 | " | Dep. Variable: | y | No. Observations: | 5020 | \n",
191 | "
\n",
192 | "\n",
193 | " | Model: | SARIMAX(2, 0, 5) | Log Likelihood | -7885.690 | \n",
194 | "
\n",
195 | "\n",
196 | " | Date: | Fri, 03 Jan 2020 | AIC | 15789.380 | \n",
197 | "
\n",
198 | "\n",
199 | " | Time: | 10:19:03 | BIC | 15848.070 | \n",
200 | "
\n",
201 | "\n",
202 | " | Sample: | 0 | HQIC | 15809.946 | \n",
203 | "
\n",
204 | "\n",
205 | " | - 5020 | | | \n",
206 | "
\n",
207 | "\n",
208 | " | Covariance Type: | opg | | | \n",
209 | "
\n",
210 | "
\n",
211 | "\n",
212 | "\n",
213 | " | coef | std err | z | P>|z| | [0.025 | 0.975] | \n",
214 | "
\n",
215 | "\n",
216 | " | intercept | 0.0309 | 0.024 | 1.289 | 0.197 | -0.016 | 0.078 | \n",
217 | "
\n",
218 | "\n",
219 | " | ar.L1 | 0.1766 | 0.039 | 4.544 | 0.000 | 0.100 | 0.253 | \n",
220 | "
\n",
221 | "\n",
222 | " | ar.L2 | -0.8128 | 0.035 | -22.984 | 0.000 | -0.882 | -0.743 | \n",
223 | "
\n",
224 | "\n",
225 | " | ma.L1 | -0.2005 | 0.038 | -5.239 | 0.000 | -0.275 | -0.125 | \n",
226 | "
\n",
227 | "\n",
228 | " | ma.L2 | 0.7654 | 0.037 | 20.436 | 0.000 | 0.692 | 0.839 | \n",
229 | "
\n",
230 | "\n",
231 | " | ma.L3 | -0.0953 | 0.012 | -8.246 | 0.000 | -0.118 | -0.073 | \n",
232 | "
\n",
233 | "\n",
234 | " | ma.L4 | 0.0112 | 0.009 | 1.229 | 0.219 | -0.007 | 0.029 | \n",
235 | "
\n",
236 | "\n",
237 | " | ma.L5 | -0.1113 | 0.009 | -12.960 | 0.000 | -0.128 | -0.094 | \n",
238 | "
\n",
239 | "\n",
240 | " | sigma2 | 1.3550 | 0.014 | 94.014 | 0.000 | 1.327 | 1.383 | \n",
241 | "
\n",
242 | "
\n",
243 | "\n",
244 | "\n",
245 | " | Ljung-Box (Q): | 69.64 | Jarque-Bera (JB): | 6575.67 | \n",
246 | "
\n",
247 | "\n",
248 | " | Prob(Q): | 0.00 | Prob(JB): | 0.00 | \n",
249 | "
\n",
250 | "\n",
251 | " | Heteroskedasticity (H): | 2.00 | Skew: | -0.18 | \n",
252 | "
\n",
253 | "\n",
254 | " | Prob(H) (two-sided): | 0.00 | Kurtosis: | 8.60 | \n",
255 | "
\n",
256 | "
Warnings:
[1] Covariance matrix calculated using the outer product of gradients (complex-step)."
257 | ],
258 | "text/plain": [
259 | "\n",
260 | "\"\"\"\n",
261 | " Statespace Model Results \n",
262 | "==============================================================================\n",
263 | "Dep. Variable: y No. Observations: 5020\n",
264 | "Model: SARIMAX(2, 0, 5) Log Likelihood -7885.690\n",
265 | "Date: Fri, 03 Jan 2020 AIC 15789.380\n",
266 | "Time: 10:19:03 BIC 15848.070\n",
267 | "Sample: 0 HQIC 15809.946\n",
268 | " - 5020 \n",
269 | "Covariance Type: opg \n",
270 | "==============================================================================\n",
271 | " coef std err z P>|z| [0.025 0.975]\n",
272 | "------------------------------------------------------------------------------\n",
273 | "intercept 0.0309 0.024 1.289 0.197 -0.016 0.078\n",
274 | "ar.L1 0.1766 0.039 4.544 0.000 0.100 0.253\n",
275 | "ar.L2 -0.8128 0.035 -22.984 0.000 -0.882 -0.743\n",
276 | "ma.L1 -0.2005 0.038 -5.239 0.000 -0.275 -0.125\n",
277 | "ma.L2 0.7654 0.037 20.436 0.000 0.692 0.839\n",
278 | "ma.L3 -0.0953 0.012 -8.246 0.000 -0.118 -0.073\n",
279 | "ma.L4 0.0112 0.009 1.229 0.219 -0.007 0.029\n",
280 | "ma.L5 -0.1113 0.009 -12.960 0.000 -0.128 -0.094\n",
281 | "sigma2 1.3550 0.014 94.014 0.000 1.327 1.383\n",
282 | "===================================================================================\n",
283 | "Ljung-Box (Q): 69.64 Jarque-Bera (JB): 6575.67\n",
284 | "Prob(Q): 0.00 Prob(JB): 0.00\n",
285 | "Heteroskedasticity (H): 2.00 Skew: -0.18\n",
286 | "Prob(H) (two-sided): 0.00 Kurtosis: 8.60\n",
287 | "===================================================================================\n",
288 | "\n",
289 | "Warnings:\n",
290 | "[1] Covariance matrix calculated using the outer product of gradients (complex-step).\n",
291 | "\"\"\""
292 | ]
293 | },
294 | "execution_count": 11,
295 | "metadata": {},
296 | "output_type": "execute_result"
297 | }
298 | ],
299 | "source": [
300 | "model_auto.summary()"
301 | ]
302 | },
303 | {
304 | "cell_type": "markdown",
305 | "metadata": {},
306 | "source": [
307 | "### Important Arguments"
308 | ]
309 | },
310 | {
311 | "cell_type": "code",
312 | "execution_count": 14,
313 | "metadata": {
314 | "scrolled": true
315 | },
316 | "outputs": [],
317 | "source": [
318 | "model_auto = auto_arima(df_comp.ret_ftse[1:], exogenous = df_comp[['ret_spx', 'ret_dax', 'ret_nikkei']][1:], m = 5,\n",
319 | " max_order = None, max_p = 7, max_q = 7, max_d = 2, max_P = 4, max_Q = 4, max_D = 2,\n",
320 | " maxiter = 50, alpha = 0.05, n_jobs = -1, trend = 'ct', information_criterion = 'oob',\n",
321 | " out_of_sample = int(len(df_comp)*0.2))\n",
322 | "\n",
323 | "\n",
324 | "# !!! Important Note: In pdmarima v1.5.2, out_of_sample_size is replaced with out_of_sample, so make sure to use the latter!\n",
325 | "\n",
326 | "\n",
327 | "# exogenous -> outside factors (e.g other time series)\n",
328 | "# m -> seasonal cycle length\n",
329 | "# max_order -> maximum amount of variables to be used in the regression (p + q)\n",
330 | "# max_p -> maximum AR components\n",
331 | "# max_q -> maximum MA components\n",
332 | "# max_d -> maximum Integrations\n",
333 | "# maxiter -> maximum iterations we're giving the model to converge the coefficients (becomes harder as the order increases)\n",
334 | "# alpha -> level of significance, default is 5%, which we should be using most of the time\n",
335 | "# n_jobs -> how many models to fit at a time (-1 indicates \"as many as possible\")\n",
336 | "# trend -> \"ct\" usually\n",
337 | "# information_criterion -> 'aic', 'aicc', 'bic', 'hqic', 'oob' \n",
338 | "# (Akaike Information Criterion, Corrected Akaike Information Criterion,\n",
339 | "# Bayesian Information Criterion, Hannan-Quinn Information Criterion, or\n",
340 | "# \"out of bag\"--for validation scoring--respectively)\n",
341 | "# out_of_smaple -> validates the model selection (pass the entire dataset, and set 20% to be the out_of_sample_size)"
342 | ]
343 | },
344 | {
345 | "cell_type": "code",
346 | "execution_count": 15,
347 | "metadata": {},
348 | "outputs": [
349 | {
350 | "data": {
351 | "text/html": [
352 | "\n",
353 | "Statespace Model Results\n",
354 | "\n",
355 | " | Dep. Variable: | y | No. Observations: | 6276 | \n",
356 | "
\n",
357 | "\n",
358 | " | Model: | SARIMAX(2, 0, 2)x(1, 0, 1, 5) | Log Likelihood | -6340.661 | \n",
359 | "
\n",
360 | "\n",
361 | " | Date: | Fri, 03 Jan 2020 | AIC | 12705.322 | \n",
362 | "
\n",
363 | "\n",
364 | " | Time: | 10:34:50 | BIC | 12786.256 | \n",
365 | "
\n",
366 | "\n",
367 | " | Sample: | 01-10-1994 | HQIC | 12733.364 | \n",
368 | "
\n",
369 | "\n",
370 | " | - 01-29-2018 | | | \n",
371 | "
\n",
372 | "\n",
373 | " | Covariance Type: | opg | | | \n",
374 | "
\n",
375 | "
\n",
376 | "\n",
377 | "\n",
378 | " | coef | std err | z | P>|z| | [0.025 | 0.975] | \n",
379 | "
\n",
380 | "\n",
381 | " | intercept | -0.0043 | 0.009 | -0.500 | 0.617 | -0.021 | 0.013 | \n",
382 | "
\n",
383 | "\n",
384 | " | drift | -1.45e-06 | 2.72e-06 | -0.533 | 0.594 | -6.78e-06 | 3.88e-06 | \n",
385 | "
\n",
386 | "\n",
387 | " | ret_spx | 0.0958 | 0.006 | 16.947 | 0.000 | 0.085 | 0.107 | \n",
388 | "
\n",
389 | "\n",
390 | " | ret_dax | 0.5582 | 0.005 | 113.729 | 0.000 | 0.549 | 0.568 | \n",
391 | "
\n",
392 | "\n",
393 | " | ret_nikkei | 0.0702 | 0.004 | 16.547 | 0.000 | 0.062 | 0.079 | \n",
394 | "
\n",
395 | "\n",
396 | " | ar.L1 | -0.1932 | 0.101 | -1.918 | 0.055 | -0.390 | 0.004 | \n",
397 | "
\n",
398 | "\n",
399 | " | ar.L2 | 0.5083 | 0.059 | 8.643 | 0.000 | 0.393 | 0.624 | \n",
400 | "
\n",
401 | "\n",
402 | " | ma.L1 | 0.0863 | 0.101 | 0.855 | 0.393 | -0.112 | 0.284 | \n",
403 | "
\n",
404 | "\n",
405 | " | ma.L2 | -0.5369 | 0.056 | -9.535 | 0.000 | -0.647 | -0.427 | \n",
406 | "
\n",
407 | "\n",
408 | " | ar.S.L5 | 0.0705 | 0.339 | 0.208 | 0.836 | -0.595 | 0.736 | \n",
409 | "
\n",
410 | "\n",
411 | " | ma.S.L5 | -0.0987 | 0.339 | -0.291 | 0.771 | -0.764 | 0.567 | \n",
412 | "
\n",
413 | "\n",
414 | " | sigma2 | 0.4404 | 0.004 | 99.131 | 0.000 | 0.432 | 0.449 | \n",
415 | "
\n",
416 | "
\n",
417 | "\n",
418 | "\n",
419 | " | Ljung-Box (Q): | 84.27 | Jarque-Bera (JB): | 15325.76 | \n",
420 | "
\n",
421 | "\n",
422 | " | Prob(Q): | 0.00 | Prob(JB): | 0.00 | \n",
423 | "
\n",
424 | "\n",
425 | " | Heteroskedasticity (H): | 0.54 | Skew: | 0.25 | \n",
426 | "
\n",
427 | "\n",
428 | " | Prob(H) (two-sided): | 0.00 | Kurtosis: | 10.64 | \n",
429 | "
\n",
430 | "
Warnings:
[1] Covariance matrix calculated using the outer product of gradients (complex-step)."
431 | ],
432 | "text/plain": [
433 | "\n",
434 | "\"\"\"\n",
435 | " Statespace Model Results \n",
436 | "=========================================================================================\n",
437 | "Dep. Variable: y No. Observations: 6276\n",
438 | "Model: SARIMAX(2, 0, 2)x(1, 0, 1, 5) Log Likelihood -6340.661\n",
439 | "Date: Fri, 03 Jan 2020 AIC 12705.322\n",
440 | "Time: 10:34:50 BIC 12786.256\n",
441 | "Sample: 01-10-1994 HQIC 12733.364\n",
442 | " - 01-29-2018 \n",
443 | "Covariance Type: opg \n",
444 | "==============================================================================\n",
445 | " coef std err z P>|z| [0.025 0.975]\n",
446 | "------------------------------------------------------------------------------\n",
447 | "intercept -0.0043 0.009 -0.500 0.617 -0.021 0.013\n",
448 | "drift -1.45e-06 2.72e-06 -0.533 0.594 -6.78e-06 3.88e-06\n",
449 | "ret_spx 0.0958 0.006 16.947 0.000 0.085 0.107\n",
450 | "ret_dax 0.5582 0.005 113.729 0.000 0.549 0.568\n",
451 | "ret_nikkei 0.0702 0.004 16.547 0.000 0.062 0.079\n",
452 | "ar.L1 -0.1932 0.101 -1.918 0.055 -0.390 0.004\n",
453 | "ar.L2 0.5083 0.059 8.643 0.000 0.393 0.624\n",
454 | "ma.L1 0.0863 0.101 0.855 0.393 -0.112 0.284\n",
455 | "ma.L2 -0.5369 0.056 -9.535 0.000 -0.647 -0.427\n",
456 | "ar.S.L5 0.0705 0.339 0.208 0.836 -0.595 0.736\n",
457 | "ma.S.L5 -0.0987 0.339 -0.291 0.771 -0.764 0.567\n",
458 | "sigma2 0.4404 0.004 99.131 0.000 0.432 0.449\n",
459 | "===================================================================================\n",
460 | "Ljung-Box (Q): 84.27 Jarque-Bera (JB): 15325.76\n",
461 | "Prob(Q): 0.00 Prob(JB): 0.00\n",
462 | "Heteroskedasticity (H): 0.54 Skew: 0.25\n",
463 | "Prob(H) (two-sided): 0.00 Kurtosis: 10.64\n",
464 | "===================================================================================\n",
465 | "\n",
466 | "Warnings:\n",
467 | "[1] Covariance matrix calculated using the outer product of gradients (complex-step).\n",
468 | "\"\"\""
469 | ]
470 | },
471 | "execution_count": 15,
472 | "metadata": {},
473 | "output_type": "execute_result"
474 | }
475 | ],
476 | "source": [
477 | "model_auto.summary()"
478 | ]
479 | }
480 | ],
481 | "metadata": {
482 | "kernelspec": {
483 | "display_name": "Python 3",
484 | "language": "python",
485 | "name": "python3"
486 | },
487 | "language_info": {
488 | "codemirror_mode": {
489 | "name": "ipython",
490 | "version": 3
491 | },
492 | "file_extension": ".py",
493 | "mimetype": "text/x-python",
494 | "name": "python",
495 | "nbconvert_exporter": "python",
496 | "pygments_lexer": "ipython3",
497 | "version": "3.6.7"
498 | }
499 | },
500 | "nbformat": 4,
501 | "nbformat_minor": 2
502 | }
503 |
--------------------------------------------------------------------------------
/10. The GARCH model.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "## Importing the relevant packages"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 1,
13 | "metadata": {},
14 | "outputs": [],
15 | "source": [
16 | "import pandas as pd\n",
17 | "import numpy as np\n",
18 | "import matplotlib.pyplot as plt\n",
19 | "import statsmodels.graphics.tsaplots as sgt\n",
20 | "import statsmodels.tsa.stattools as sts\n",
21 | "from statsmodels.tsa.arima_model import ARIMA\n",
22 | "from scipy.stats.distributions import chi2 \n",
23 | "from arch import arch_model\n",
24 | "from math import sqrt\n",
25 | "import seaborn as sns\n",
26 | "sns.set()"
27 | ]
28 | },
29 | {
30 | "cell_type": "markdown",
31 | "metadata": {},
32 | "source": [
33 | " "
34 | ]
35 | },
36 | {
37 | "cell_type": "markdown",
38 | "metadata": {},
39 | "source": [
40 | "## Importing the Data and Pre-processing "
41 | ]
42 | },
43 | {
44 | "cell_type": "code",
45 | "execution_count": 2,
46 | "metadata": {},
47 | "outputs": [],
48 | "source": [
49 | "raw_csv_data = pd.read_csv(\"Index2018.csv\") \n",
50 | "df_comp=raw_csv_data.copy()\n",
51 | "df_comp.date = pd.to_datetime(df_comp.date, dayfirst = True)\n",
52 | "df_comp.set_index(\"date\", inplace=True)\n",
53 | "df_comp=df_comp.asfreq('b')\n",
54 | "df_comp=df_comp.fillna(method='ffill')"
55 | ]
56 | },
57 | {
58 | "cell_type": "code",
59 | "execution_count": 3,
60 | "metadata": {},
61 | "outputs": [],
62 | "source": [
63 | "df_comp['market_value']=df_comp.ftse"
64 | ]
65 | },
66 | {
67 | "cell_type": "code",
68 | "execution_count": 4,
69 | "metadata": {},
70 | "outputs": [],
71 | "source": [
72 | "del df_comp['spx']\n",
73 | "del df_comp['dax']\n",
74 | "del df_comp['ftse']\n",
75 | "del df_comp['nikkei']\n",
76 | "size = int(len(df_comp)*0.8)\n",
77 | "df, df_test = df_comp.iloc[:size], df_comp.iloc[size:]"
78 | ]
79 | },
80 | {
81 | "cell_type": "code",
82 | "execution_count": 5,
83 | "metadata": {},
84 | "outputs": [],
85 | "source": [
86 | "import warnings\n",
87 | "warnings.filterwarnings(\"ignore\")"
88 | ]
89 | },
90 | {
91 | "cell_type": "markdown",
92 | "metadata": {},
93 | "source": [
94 | " "
95 | ]
96 | },
97 | {
98 | "cell_type": "markdown",
99 | "metadata": {},
100 | "source": [
101 | "## The LLR Test"
102 | ]
103 | },
104 | {
105 | "cell_type": "code",
106 | "execution_count": 6,
107 | "metadata": {},
108 | "outputs": [],
109 | "source": [
110 | "def LLR_test(mod_1, mod_2, DF = 1):\n",
111 | " L1 = mod_1.fit(start_ar_lags = 11).llf\n",
112 | " L2 = mod_2.fit(start_ar_lags = 11).llf\n",
113 | " LR = (2*(L2-L1)) \n",
114 | " p = chi2.sf(LR, DF).round(3)\n",
115 | " return p"
116 | ]
117 | },
118 | {
119 | "cell_type": "markdown",
120 | "metadata": {},
121 | "source": [
122 | "## Creating Returns"
123 | ]
124 | },
125 | {
126 | "cell_type": "code",
127 | "execution_count": 7,
128 | "metadata": {
129 | "scrolled": true
130 | },
131 | "outputs": [],
132 | "source": [
133 | "df['returns'] = df.market_value.pct_change(1)*100"
134 | ]
135 | },
136 | {
137 | "cell_type": "markdown",
138 | "metadata": {},
139 | "source": [
140 | "## The Simple GARCH Model"
141 | ]
142 | },
143 | {
144 | "cell_type": "code",
145 | "execution_count": 8,
146 | "metadata": {},
147 | "outputs": [
148 | {
149 | "name": "stdout",
150 | "output_type": "stream",
151 | "text": [
152 | "Iteration: 5, Func. Count: 39, Neg. LLF: 6972.734752397977\n",
153 | "Iteration: 10, Func. Count: 73, Neg. LLF: 6970.088043671654\n",
154 | "Optimization terminated successfully. (Exit mode 0)\n",
155 | " Current function value: 6970.058366189876\n",
156 | " Iterations: 13\n",
157 | " Function evaluations: 91\n",
158 | " Gradient evaluations: 13\n"
159 | ]
160 | },
161 | {
162 | "data": {
163 | "text/html": [
164 | "\n",
165 | "Constant Mean - GARCH Model Results\n",
166 | "\n",
167 | " | Dep. Variable: | returns | R-squared: | -0.001 | \n",
168 | "
\n",
169 | "\n",
170 | " | Mean Model: | Constant Mean | Adj. R-squared: | -0.001 | \n",
171 | "
\n",
172 | "\n",
173 | " | Vol Model: | GARCH | Log-Likelihood: | -6970.06 | \n",
174 | "
\n",
175 | "\n",
176 | " | Distribution: | Normal | AIC: | 13948.1 | \n",
177 | "
\n",
178 | "\n",
179 | " | Method: | Maximum Likelihood | BIC: | 13974.2 | \n",
180 | "
\n",
181 | "\n",
182 | " | | No. Observations: | 5020 | \n",
183 | "
\n",
184 | "\n",
185 | " | Date: | Thu, Sep 19 2019 | Df Residuals: | 5016 | \n",
186 | "
\n",
187 | "\n",
188 | " | Time: | 17:53:26 | Df Model: | 4 | \n",
189 | "
\n",
190 | "
\n",
191 | "\n",
192 | "Mean Model\n",
193 | "\n",
194 | " | coef | std err | t | P>|t| | 95.0% Conf. Int. | \n",
195 | "
\n",
196 | "\n",
197 | " | mu | 0.0466 | 1.183e-02 | 3.939 | 8.187e-05 | [2.342e-02,6.981e-02] | \n",
198 | "
\n",
199 | "
\n",
200 | "\n",
201 | "Volatility Model\n",
202 | "\n",
203 | " | coef | std err | t | P>|t| | 95.0% Conf. Int. | \n",
204 | "
\n",
205 | "\n",
206 | " | omega | 0.0109 | 3.004e-03 | 3.640 | 2.724e-04 | [5.048e-03,1.682e-02] | \n",
207 | "
\n",
208 | "\n",
209 | " | alpha[1] | 0.0835 | 1.071e-02 | 7.794 | 6.476e-15 | [6.249e-02, 0.104] | \n",
210 | "
\n",
211 | "\n",
212 | " | beta[1] | 0.9089 | 1.148e-02 | 79.168 | 0.000 | [ 0.886, 0.931] | \n",
213 | "
\n",
214 | "
Covariance estimator: robust"
215 | ],
216 | "text/plain": [
217 | "\n",
218 | "\"\"\"\n",
219 | " Constant Mean - GARCH Model Results \n",
220 | "==============================================================================\n",
221 | "Dep. Variable: returns R-squared: -0.001\n",
222 | "Mean Model: Constant Mean Adj. R-squared: -0.001\n",
223 | "Vol Model: GARCH Log-Likelihood: -6970.06\n",
224 | "Distribution: Normal AIC: 13948.1\n",
225 | "Method: Maximum Likelihood BIC: 13974.2\n",
226 | " No. Observations: 5020\n",
227 | "Date: Thu, Sep 19 2019 Df Residuals: 5016\n",
228 | "Time: 17:53:26 Df Model: 4\n",
229 | " Mean Model \n",
230 | "============================================================================\n",
231 | " coef std err t P>|t| 95.0% Conf. Int.\n",
232 | "----------------------------------------------------------------------------\n",
233 | "mu 0.0466 1.183e-02 3.939 8.187e-05 [2.342e-02,6.981e-02]\n",
234 | " Volatility Model \n",
235 | "============================================================================\n",
236 | " coef std err t P>|t| 95.0% Conf. Int.\n",
237 | "----------------------------------------------------------------------------\n",
238 | "omega 0.0109 3.004e-03 3.640 2.724e-04 [5.048e-03,1.682e-02]\n",
239 | "alpha[1] 0.0835 1.071e-02 7.794 6.476e-15 [6.249e-02, 0.104]\n",
240 | "beta[1] 0.9089 1.148e-02 79.168 0.000 [ 0.886, 0.931]\n",
241 | "============================================================================\n",
242 | "\n",
243 | "Covariance estimator: robust\n",
244 | "\"\"\""
245 | ]
246 | },
247 | "execution_count": 8,
248 | "metadata": {},
249 | "output_type": "execute_result"
250 | }
251 | ],
252 | "source": [
253 | "model_garch_1_1 = arch_model(df.returns[1:], mean = \"Constant\", vol = \"GARCH\", p = 1, q = 1)\n",
254 | "results_garch_1_1 = model_garch_1_1.fit(update_freq = 5)\n",
255 | "results_garch_1_1.summary()"
256 | ]
257 | },
258 | {
259 | "cell_type": "markdown",
260 | "metadata": {},
261 | "source": [
262 | "## Higher-Lag GARCH Models"
263 | ]
264 | },
265 | {
266 | "cell_type": "code",
267 | "execution_count": 9,
268 | "metadata": {},
269 | "outputs": [
270 | {
271 | "name": "stdout",
272 | "output_type": "stream",
273 | "text": [
274 | "Iteration: 5, Func. Count: 44, Neg. LLF: 6978.593988486672\n",
275 | "Iteration: 10, Func. Count: 80, Neg. LLF: 6970.063553697997\n",
276 | "Optimization terminated successfully. (Exit mode 0)\n",
277 | " Current function value: 6970.058366227228\n",
278 | " Iterations: 12\n",
279 | " Function evaluations: 95\n",
280 | " Gradient evaluations: 12\n"
281 | ]
282 | },
283 | {
284 | "data": {
285 | "text/html": [
286 | "\n",
287 | "Constant Mean - GARCH Model Results\n",
288 | "\n",
289 | " | Dep. Variable: | returns | R-squared: | -0.001 | \n",
290 | "
\n",
291 | "\n",
292 | " | Mean Model: | Constant Mean | Adj. R-squared: | -0.001 | \n",
293 | "
\n",
294 | "\n",
295 | " | Vol Model: | GARCH | Log-Likelihood: | -6970.06 | \n",
296 | "
\n",
297 | "\n",
298 | " | Distribution: | Normal | AIC: | 13950.1 | \n",
299 | "
\n",
300 | "\n",
301 | " | Method: | Maximum Likelihood | BIC: | 13982.7 | \n",
302 | "
\n",
303 | "\n",
304 | " | | No. Observations: | 5020 | \n",
305 | "
\n",
306 | "\n",
307 | " | Date: | Thu, Sep 19 2019 | Df Residuals: | 5015 | \n",
308 | "
\n",
309 | "\n",
310 | " | Time: | 17:54:06 | Df Model: | 5 | \n",
311 | "
\n",
312 | "
\n",
313 | "\n",
314 | "Mean Model\n",
315 | "\n",
316 | " | coef | std err | t | P>|t| | 95.0% Conf. Int. | \n",
317 | "
\n",
318 | "\n",
319 | " | mu | 0.0466 | 1.184e-02 | 3.938 | 8.219e-05 | [2.341e-02,6.982e-02] | \n",
320 | "
\n",
321 | "
\n",
322 | "\n",
323 | "Volatility Model\n",
324 | "\n",
325 | " | coef | std err | t | P>|t| | 95.0% Conf. Int. | \n",
326 | "
\n",
327 | "\n",
328 | " | omega | 0.0109 | 2.908e-03 | 3.761 | 1.696e-04 | [5.236e-03,1.663e-02] | \n",
329 | "
\n",
330 | "\n",
331 | " | alpha[1] | 0.0835 | 1.189e-02 | 7.019 | 2.231e-12 | [6.017e-02, 0.107] | \n",
332 | "
\n",
333 | "\n",
334 | " | beta[1] | 0.9089 | 0.188 | 4.845 | 1.268e-06 | [ 0.541, 1.277] | \n",
335 | "
\n",
336 | "\n",
337 | " | beta[2] | 0.0000 | 0.180 | 0.000 | 1.000 | [ -0.352, 0.352] | \n",
338 | "
\n",
339 | "
Covariance estimator: robust"
340 | ],
341 | "text/plain": [
342 | "\n",
343 | "\"\"\"\n",
344 | " Constant Mean - GARCH Model Results \n",
345 | "==============================================================================\n",
346 | "Dep. Variable: returns R-squared: -0.001\n",
347 | "Mean Model: Constant Mean Adj. R-squared: -0.001\n",
348 | "Vol Model: GARCH Log-Likelihood: -6970.06\n",
349 | "Distribution: Normal AIC: 13950.1\n",
350 | "Method: Maximum Likelihood BIC: 13982.7\n",
351 | " No. Observations: 5020\n",
352 | "Date: Thu, Sep 19 2019 Df Residuals: 5015\n",
353 | "Time: 17:54:06 Df Model: 5\n",
354 | " Mean Model \n",
355 | "============================================================================\n",
356 | " coef std err t P>|t| 95.0% Conf. Int.\n",
357 | "----------------------------------------------------------------------------\n",
358 | "mu 0.0466 1.184e-02 3.938 8.219e-05 [2.341e-02,6.982e-02]\n",
359 | " Volatility Model \n",
360 | "============================================================================\n",
361 | " coef std err t P>|t| 95.0% Conf. Int.\n",
362 | "----------------------------------------------------------------------------\n",
363 | "omega 0.0109 2.908e-03 3.761 1.696e-04 [5.236e-03,1.663e-02]\n",
364 | "alpha[1] 0.0835 1.189e-02 7.019 2.231e-12 [6.017e-02, 0.107]\n",
365 | "beta[1] 0.9089 0.188 4.845 1.268e-06 [ 0.541, 1.277]\n",
366 | "beta[2] 0.0000 0.180 0.000 1.000 [ -0.352, 0.352]\n",
367 | "============================================================================\n",
368 | "\n",
369 | "Covariance estimator: robust\n",
370 | "\"\"\""
371 | ]
372 | },
373 | "execution_count": 9,
374 | "metadata": {},
375 | "output_type": "execute_result"
376 | }
377 | ],
378 | "source": [
379 | "model_garch_1_2 = arch_model(df.returns[1:], mean = \"Constant\", vol = \"GARCH\", p = 1, q = 2)\n",
380 | "results_garch_1_2 = model_garch_1_2.fit(update_freq = 5)\n",
381 | "results_garch_1_2.summary()"
382 | ]
383 | },
384 | {
385 | "cell_type": "code",
386 | "execution_count": 10,
387 | "metadata": {},
388 | "outputs": [
389 | {
390 | "name": "stdout",
391 | "output_type": "stream",
392 | "text": [
393 | "Iteration: 5, Func. Count: 51, Neg. LLF: 6993.438671672955\n",
394 | "Iteration: 10, Func. Count: 97, Neg. LLF: 6972.43119644999\n",
395 | "Iteration: 15, Func. Count: 138, Neg. LLF: 6970.058671960955\n",
396 | "Optimization terminated successfully. (Exit mode 0)\n",
397 | " Current function value: 6970.05836623016\n",
398 | " Iterations: 17\n",
399 | " Function evaluations: 154\n",
400 | " Gradient evaluations: 17\n"
401 | ]
402 | },
403 | {
404 | "data": {
405 | "text/html": [
406 | "\n",
407 | "Constant Mean - GARCH Model Results\n",
408 | "\n",
409 | " | Dep. Variable: | returns | R-squared: | -0.001 | \n",
410 | "
\n",
411 | "\n",
412 | " | Mean Model: | Constant Mean | Adj. R-squared: | -0.001 | \n",
413 | "
\n",
414 | "\n",
415 | " | Vol Model: | GARCH | Log-Likelihood: | -6970.06 | \n",
416 | "
\n",
417 | "\n",
418 | " | Distribution: | Normal | AIC: | 13952.1 | \n",
419 | "
\n",
420 | "\n",
421 | " | Method: | Maximum Likelihood | BIC: | 13991.2 | \n",
422 | "
\n",
423 | "\n",
424 | " | | No. Observations: | 5020 | \n",
425 | "
\n",
426 | "\n",
427 | " | Date: | Thu, Sep 19 2019 | Df Residuals: | 5014 | \n",
428 | "
\n",
429 | "\n",
430 | " | Time: | 17:54:23 | Df Model: | 6 | \n",
431 | "
\n",
432 | "
\n",
433 | "\n",
434 | "Mean Model\n",
435 | "\n",
436 | " | coef | std err | t | P>|t| | 95.0% Conf. Int. | \n",
437 | "
\n",
438 | "\n",
439 | " | mu | 0.0466 | 1.179e-02 | 3.954 | 7.683e-05 | [2.351e-02,6.972e-02] | \n",
440 | "
\n",
441 | "
\n",
442 | "\n",
443 | "Volatility Model\n",
444 | "\n",
445 | " | coef | std err | t | P>|t| | 95.0% Conf. Int. | \n",
446 | "
\n",
447 | "\n",
448 | " | omega | 0.0109 | 8.157e-03 | 1.341 | 0.180 | [-5.052e-03,2.692e-02] | \n",
449 | "
\n",
450 | "\n",
451 | " | alpha[1] | 0.0835 | 6.059e-02 | 1.378 | 0.168 | [-3.528e-02, 0.202] | \n",
452 | "
\n",
453 | "\n",
454 | " | beta[1] | 0.9089 | 2.148 | 0.423 | 0.672 | [ -3.301, 5.119] | \n",
455 | "
\n",
456 | "\n",
457 | " | beta[2] | 0.0000 | 3.375 | 0.000 | 1.000 | [ -6.614, 6.614] | \n",
458 | "
\n",
459 | "\n",
460 | " | beta[3] | 3.9718e-13 | 1.294 | 3.070e-13 | 1.000 | [ -2.536, 2.536] | \n",
461 | "
\n",
462 | "
Covariance estimator: robust"
463 | ],
464 | "text/plain": [
465 | "\n",
466 | "\"\"\"\n",
467 | " Constant Mean - GARCH Model Results \n",
468 | "==============================================================================\n",
469 | "Dep. Variable: returns R-squared: -0.001\n",
470 | "Mean Model: Constant Mean Adj. R-squared: -0.001\n",
471 | "Vol Model: GARCH Log-Likelihood: -6970.06\n",
472 | "Distribution: Normal AIC: 13952.1\n",
473 | "Method: Maximum Likelihood BIC: 13991.2\n",
474 | " No. Observations: 5020\n",
475 | "Date: Thu, Sep 19 2019 Df Residuals: 5014\n",
476 | "Time: 17:54:23 Df Model: 6\n",
477 | " Mean Model \n",
478 | "============================================================================\n",
479 | " coef std err t P>|t| 95.0% Conf. Int.\n",
480 | "----------------------------------------------------------------------------\n",
481 | "mu 0.0466 1.179e-02 3.954 7.683e-05 [2.351e-02,6.972e-02]\n",
482 | " Volatility Model \n",
483 | "=============================================================================\n",
484 | " coef std err t P>|t| 95.0% Conf. Int.\n",
485 | "-----------------------------------------------------------------------------\n",
486 | "omega 0.0109 8.157e-03 1.341 0.180 [-5.052e-03,2.692e-02]\n",
487 | "alpha[1] 0.0835 6.059e-02 1.378 0.168 [-3.528e-02, 0.202]\n",
488 | "beta[1] 0.9089 2.148 0.423 0.672 [ -3.301, 5.119]\n",
489 | "beta[2] 0.0000 3.375 0.000 1.000 [ -6.614, 6.614]\n",
490 | "beta[3] 3.9718e-13 1.294 3.070e-13 1.000 [ -2.536, 2.536]\n",
491 | "=============================================================================\n",
492 | "\n",
493 | "Covariance estimator: robust\n",
494 | "\"\"\""
495 | ]
496 | },
497 | "execution_count": 10,
498 | "metadata": {},
499 | "output_type": "execute_result"
500 | }
501 | ],
502 | "source": [
503 | "model_garch_1_3 = arch_model(df.returns[1:], mean = \"Constant\", vol = \"GARCH\", p = 1, q = 3)\n",
504 | "results_garch_1_3 = model_garch_1_3.fit(update_freq = 5)\n",
505 | "results_garch_1_3.summary()"
506 | ]
507 | },
508 | {
509 | "cell_type": "code",
510 | "execution_count": 11,
511 | "metadata": {},
512 | "outputs": [
513 | {
514 | "name": "stdout",
515 | "output_type": "stream",
516 | "text": [
517 | "Iteration: 5, Func. Count: 44, Neg. LLF: 6973.212556117614\n",
518 | "Iteration: 10, Func. Count: 85, Neg. LLF: 6967.735886702618\n",
519 | "Optimization terminated successfully. (Exit mode 0)\n",
520 | " Current function value: 6967.731020076142\n",
521 | " Iterations: 12\n",
522 | " Function evaluations: 99\n",
523 | " Gradient evaluations: 12\n"
524 | ]
525 | },
526 | {
527 | "data": {
528 | "text/html": [
529 | "\n",
530 | "Constant Mean - GARCH Model Results\n",
531 | "\n",
532 | " | Dep. Variable: | returns | R-squared: | -0.001 | \n",
533 | "
\n",
534 | "\n",
535 | " | Mean Model: | Constant Mean | Adj. R-squared: | -0.001 | \n",
536 | "
\n",
537 | "\n",
538 | " | Vol Model: | GARCH | Log-Likelihood: | -6967.73 | \n",
539 | "
\n",
540 | "\n",
541 | " | Distribution: | Normal | AIC: | 13945.5 | \n",
542 | "
\n",
543 | "\n",
544 | " | Method: | Maximum Likelihood | BIC: | 13978.1 | \n",
545 | "
\n",
546 | "\n",
547 | " | | No. Observations: | 5020 | \n",
548 | "
\n",
549 | "\n",
550 | " | Date: | Thu, Sep 19 2019 | Df Residuals: | 5015 | \n",
551 | "
\n",
552 | "\n",
553 | " | Time: | 17:54:44 | Df Model: | 5 | \n",
554 | "
\n",
555 | "
\n",
556 | "\n",
557 | "Mean Model\n",
558 | "\n",
559 | " | coef | std err | t | P>|t| | 95.0% Conf. Int. | \n",
560 | "
\n",
561 | "\n",
562 | " | mu | 0.0466 | 1.187e-02 | 3.922 | 8.780e-05 | [2.329e-02,6.982e-02] | \n",
563 | "
\n",
564 | "
\n",
565 | "\n",
566 | "Volatility Model\n",
567 | "\n",
568 | " | coef | std err | t | P>|t| | 95.0% Conf. Int. | \n",
569 | "
\n",
570 | "\n",
571 | " | omega | 0.0129 | 4.097e-03 | 3.158 | 1.589e-03 | [4.908e-03,2.097e-02] | \n",
572 | "
\n",
573 | "\n",
574 | " | alpha[1] | 0.0547 | 1.665e-02 | 3.286 | 1.017e-03 | [2.208e-02,8.735e-02] | \n",
575 | "
\n",
576 | "\n",
577 | " | alpha[2] | 0.0389 | 2.345e-02 | 1.659 | 9.709e-02 | [-7.056e-03,8.488e-02] | \n",
578 | "
\n",
579 | "\n",
580 | " | beta[1] | 0.8974 | 1.712e-02 | 52.415 | 0.000 | [ 0.864, 0.931] | \n",
581 | "
\n",
582 | "
Covariance estimator: robust"
583 | ],
584 | "text/plain": [
585 | "\n",
586 | "\"\"\"\n",
587 | " Constant Mean - GARCH Model Results \n",
588 | "==============================================================================\n",
589 | "Dep. Variable: returns R-squared: -0.001\n",
590 | "Mean Model: Constant Mean Adj. R-squared: -0.001\n",
591 | "Vol Model: GARCH Log-Likelihood: -6967.73\n",
592 | "Distribution: Normal AIC: 13945.5\n",
593 | "Method: Maximum Likelihood BIC: 13978.1\n",
594 | " No. Observations: 5020\n",
595 | "Date: Thu, Sep 19 2019 Df Residuals: 5015\n",
596 | "Time: 17:54:44 Df Model: 5\n",
597 | " Mean Model \n",
598 | "============================================================================\n",
599 | " coef std err t P>|t| 95.0% Conf. Int.\n",
600 | "----------------------------------------------------------------------------\n",
601 | "mu 0.0466 1.187e-02 3.922 8.780e-05 [2.329e-02,6.982e-02]\n",
602 | " Volatility Model \n",
603 | "=============================================================================\n",
604 | " coef std err t P>|t| 95.0% Conf. Int.\n",
605 | "-----------------------------------------------------------------------------\n",
606 | "omega 0.0129 4.097e-03 3.158 1.589e-03 [4.908e-03,2.097e-02]\n",
607 | "alpha[1] 0.0547 1.665e-02 3.286 1.017e-03 [2.208e-02,8.735e-02]\n",
608 | "alpha[2] 0.0389 2.345e-02 1.659 9.709e-02 [-7.056e-03,8.488e-02]\n",
609 | "beta[1] 0.8974 1.712e-02 52.415 0.000 [ 0.864, 0.931]\n",
610 | "=============================================================================\n",
611 | "\n",
612 | "Covariance estimator: robust\n",
613 | "\"\"\""
614 | ]
615 | },
616 | "execution_count": 11,
617 | "metadata": {},
618 | "output_type": "execute_result"
619 | }
620 | ],
621 | "source": [
622 | "model_garch_2_1 = arch_model(df.returns[1:], mean = \"Constant\", vol = \"GARCH\", p = 2, q = 1)\n",
623 | "results_garch_2_1 = model_garch_2_1.fit(update_freq = 5)\n",
624 | "results_garch_2_1.summary()"
625 | ]
626 | },
627 | {
628 | "cell_type": "code",
629 | "execution_count": 12,
630 | "metadata": {},
631 | "outputs": [
632 | {
633 | "name": "stdout",
634 | "output_type": "stream",
635 | "text": [
636 | "Iteration: 5, Func. Count: 49, Neg. LLF: 6974.886815445026\n",
637 | "Iteration: 10, Func. Count: 94, Neg. LLF: 6968.538209285089\n",
638 | "Iteration: 15, Func. Count: 134, Neg. LLF: 6967.731020049032\n",
639 | "Optimization terminated successfully. (Exit mode 0)\n",
640 | " Current function value: 6967.731020049671\n",
641 | " Iterations: 15\n",
642 | " Function evaluations: 134\n",
643 | " Gradient evaluations: 15\n"
644 | ]
645 | },
646 | {
647 | "data": {
648 | "text/html": [
649 | "\n",
650 | "Constant Mean - GARCH Model Results\n",
651 | "\n",
652 | " | Dep. Variable: | returns | R-squared: | -0.001 | \n",
653 | "
\n",
654 | "\n",
655 | " | Mean Model: | Constant Mean | Adj. R-squared: | -0.001 | \n",
656 | "
\n",
657 | "\n",
658 | " | Vol Model: | GARCH | Log-Likelihood: | -6967.73 | \n",
659 | "
\n",
660 | "\n",
661 | " | Distribution: | Normal | AIC: | 13947.5 | \n",
662 | "
\n",
663 | "\n",
664 | " | Method: | Maximum Likelihood | BIC: | 13986.6 | \n",
665 | "
\n",
666 | "\n",
667 | " | | No. Observations: | 5020 | \n",
668 | "
\n",
669 | "\n",
670 | " | Date: | Thu, Sep 19 2019 | Df Residuals: | 5014 | \n",
671 | "
\n",
672 | "\n",
673 | " | Time: | 17:55:01 | Df Model: | 6 | \n",
674 | "
\n",
675 | "
\n",
676 | "\n",
677 | "Mean Model\n",
678 | "\n",
679 | " | coef | std err | t | P>|t| | 95.0% Conf. Int. | \n",
680 | "
\n",
681 | "\n",
682 | " | mu | 0.0466 | 1.187e-02 | 3.924 | 8.721e-05 | [2.330e-02,6.982e-02] | \n",
683 | "
\n",
684 | "
\n",
685 | "\n",
686 | "Volatility Model\n",
687 | "\n",
688 | " | coef | std err | t | P>|t| | 95.0% Conf. Int. | \n",
689 | "
\n",
690 | "\n",
691 | " | omega | 0.0129 | 4.816e-03 | 2.687 | 7.217e-03 | [3.500e-03,2.238e-02] | \n",
692 | "
\n",
693 | "\n",
694 | " | alpha[1] | 0.0547 | 1.665e-02 | 3.285 | 1.019e-03 | [2.207e-02,8.736e-02] | \n",
695 | "
\n",
696 | "\n",
697 | " | alpha[2] | 0.0389 | 2.505e-02 | 1.553 | 0.120 | [-1.018e-02,8.800e-02] | \n",
698 | "
\n",
699 | "\n",
700 | " | alpha[3] | 0.0000 | 2.572e-02 | 0.000 | 1.000 | [-5.041e-02,5.041e-02] | \n",
701 | "
\n",
702 | "\n",
703 | " | beta[1] | 0.8974 | 2.245e-02 | 39.978 | 0.000 | [ 0.853, 0.941] | \n",
704 | "
\n",
705 | "
Covariance estimator: robust"
706 | ],
707 | "text/plain": [
708 | "\n",
709 | "\"\"\"\n",
710 | " Constant Mean - GARCH Model Results \n",
711 | "==============================================================================\n",
712 | "Dep. Variable: returns R-squared: -0.001\n",
713 | "Mean Model: Constant Mean Adj. R-squared: -0.001\n",
714 | "Vol Model: GARCH Log-Likelihood: -6967.73\n",
715 | "Distribution: Normal AIC: 13947.5\n",
716 | "Method: Maximum Likelihood BIC: 13986.6\n",
717 | " No. Observations: 5020\n",
718 | "Date: Thu, Sep 19 2019 Df Residuals: 5014\n",
719 | "Time: 17:55:01 Df Model: 6\n",
720 | " Mean Model \n",
721 | "============================================================================\n",
722 | " coef std err t P>|t| 95.0% Conf. Int.\n",
723 | "----------------------------------------------------------------------------\n",
724 | "mu 0.0466 1.187e-02 3.924 8.721e-05 [2.330e-02,6.982e-02]\n",
725 | " Volatility Model \n",
726 | "=============================================================================\n",
727 | " coef std err t P>|t| 95.0% Conf. Int.\n",
728 | "-----------------------------------------------------------------------------\n",
729 | "omega 0.0129 4.816e-03 2.687 7.217e-03 [3.500e-03,2.238e-02]\n",
730 | "alpha[1] 0.0547 1.665e-02 3.285 1.019e-03 [2.207e-02,8.736e-02]\n",
731 | "alpha[2] 0.0389 2.505e-02 1.553 0.120 [-1.018e-02,8.800e-02]\n",
732 | "alpha[3] 0.0000 2.572e-02 0.000 1.000 [-5.041e-02,5.041e-02]\n",
733 | "beta[1] 0.8974 2.245e-02 39.978 0.000 [ 0.853, 0.941]\n",
734 | "=============================================================================\n",
735 | "\n",
736 | "Covariance estimator: robust\n",
737 | "\"\"\""
738 | ]
739 | },
740 | "execution_count": 12,
741 | "metadata": {},
742 | "output_type": "execute_result"
743 | }
744 | ],
745 | "source": [
746 | "model_garch_3_1 = arch_model(df.returns[1:], mean = \"Constant\", vol = \"GARCH\", p = 3, q = 1)\n",
747 | "results_garch_3_1 = model_garch_3_1.fit(update_freq = 5)\n",
748 | "results_garch_3_1.summary()"
749 | ]
750 | }
751 | ],
752 | "metadata": {
753 | "kernelspec": {
754 | "display_name": "Python 3",
755 | "language": "python",
756 | "name": "python3"
757 | },
758 | "language_info": {
759 | "codemirror_mode": {
760 | "name": "ipython",
761 | "version": 3
762 | },
763 | "file_extension": ".py",
764 | "mimetype": "text/x-python",
765 | "name": "python",
766 | "nbconvert_exporter": "python",
767 | "pygments_lexer": "ipython3",
768 | "version": "3.6.7"
769 | }
770 | },
771 | "nbformat": 4,
772 | "nbformat_minor": 2
773 | }
774 |
--------------------------------------------------------------------------------
/4. Analyzing prices using the AR model.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "## Importing the relevant packages\n"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 1,
13 | "metadata": {},
14 | "outputs": [],
15 | "source": [
16 | "import pandas as pd\n",
17 | "import numpy as np\n",
18 | "import matplotlib.pyplot as plt\n",
19 | "import statsmodels.graphics.tsaplots as sgt\n",
20 | "from statsmodels.tsa.arima_model import ARMA\n",
21 | "from scipy.stats.distributions import chi2\n",
22 | "import statsmodels.tsa.stattools as sts \n",
23 | "import seaborn as sns\n",
24 | "sns.set()"
25 | ]
26 | },
27 | {
28 | "cell_type": "markdown",
29 | "metadata": {},
30 | "source": [
31 | "## Importing the Data and Pre-processing "
32 | ]
33 | },
34 | {
35 | "cell_type": "code",
36 | "execution_count": 2,
37 | "metadata": {},
38 | "outputs": [],
39 | "source": [
40 | "raw_csv_data = pd.read_csv(\"Index2018.csv\") \n",
41 | "df_comp=raw_csv_data.copy()\n",
42 | "df_comp.date = pd.to_datetime(df_comp.date, dayfirst = True)\n",
43 | "df_comp.set_index(\"date\", inplace=True)\n",
44 | "df_comp=df_comp.asfreq('b')\n",
45 | "df_comp=df_comp.fillna(method='ffill')"
46 | ]
47 | },
48 | {
49 | "cell_type": "code",
50 | "execution_count": 3,
51 | "metadata": {},
52 | "outputs": [],
53 | "source": [
54 | "df_comp['market_value']=df_comp.ftse"
55 | ]
56 | },
57 | {
58 | "cell_type": "code",
59 | "execution_count": 4,
60 | "metadata": {},
61 | "outputs": [],
62 | "source": [
63 | "del df_comp['spx']\n",
64 | "del df_comp['dax']\n",
65 | "del df_comp['ftse']\n",
66 | "del df_comp['nikkei']\n",
67 | "size = int(len(df_comp)*0.8)\n",
68 | "df, df_test = df_comp.iloc[:size], df_comp.iloc[size:]"
69 | ]
70 | },
71 | {
72 | "cell_type": "markdown",
73 | "metadata": {},
74 | "source": [
75 | "## The ACF"
76 | ]
77 | },
78 | {
79 | "cell_type": "code",
80 | "execution_count": 5,
81 | "metadata": {
82 | "scrolled": true
83 | },
84 | "outputs": [
85 | {
86 | "data": {
87 | "image/png": "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\n",
88 | "text/plain": [
89 | ""
90 | ]
91 | },
92 | "metadata": {
93 | "needs_background": "light"
94 | },
95 | "output_type": "display_data"
96 | }
97 | ],
98 | "source": [
99 | "sgt.plot_acf(df.market_value, zero = False, lags = 40)\n",
100 | "plt.title(\"ACF for Prices\", size = 20)\n",
101 | "plt.show()"
102 | ]
103 | },
104 | {
105 | "cell_type": "code",
106 | "execution_count": 6,
107 | "metadata": {},
108 | "outputs": [],
109 | "source": [
110 | "import warnings\n",
111 | "warnings.filterwarnings(\"ignore\")"
112 | ]
113 | },
114 | {
115 | "cell_type": "markdown",
116 | "metadata": {},
117 | "source": [
118 | "## The PACF"
119 | ]
120 | },
121 | {
122 | "cell_type": "code",
123 | "execution_count": 7,
124 | "metadata": {
125 | "scrolled": true
126 | },
127 | "outputs": [
128 | {
129 | "data": {
130 | "image/png": "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\n",
131 | "text/plain": [
132 | ""
133 | ]
134 | },
135 | "metadata": {
136 | "needs_background": "light"
137 | },
138 | "output_type": "display_data"
139 | }
140 | ],
141 | "source": [
142 | "sgt.plot_pacf(df.market_value, lags = 40, alpha = 0.05, zero = False, method = ('ols'))\n",
143 | "plt.title(\"PACF for Prices\", size = 20)\n",
144 | "plt.show()"
145 | ]
146 | },
147 | {
148 | "cell_type": "markdown",
149 | "metadata": {},
150 | "source": [
151 | "## The AR(1) Model"
152 | ]
153 | },
154 | {
155 | "cell_type": "code",
156 | "execution_count": 8,
157 | "metadata": {},
158 | "outputs": [],
159 | "source": [
160 | "model_ar = ARMA(df.market_value, order=(1,0))"
161 | ]
162 | },
163 | {
164 | "cell_type": "code",
165 | "execution_count": 9,
166 | "metadata": {},
167 | "outputs": [],
168 | "source": [
169 | "results_ar = model_ar.fit()"
170 | ]
171 | },
172 | {
173 | "cell_type": "code",
174 | "execution_count": 10,
175 | "metadata": {},
176 | "outputs": [
177 | {
178 | "data": {
179 | "text/html": [
180 | "\n",
181 | "ARMA Model Results\n",
182 | "\n",
183 | " | Dep. Variable: | market_value | No. Observations: | 5021 | \n",
184 | "
\n",
185 | "\n",
186 | " | Model: | ARMA(1, 0) | Log Likelihood | -27622.598 | \n",
187 | "
\n",
188 | "\n",
189 | " | Method: | css-mle | S.D. of innovations | 59.258 | \n",
190 | "
\n",
191 | "\n",
192 | " | Date: | Fri, 27 Sep 2019 | AIC | 55251.196 | \n",
193 | "
\n",
194 | "\n",
195 | " | Time: | 10:03:35 | BIC | 55270.760 | \n",
196 | "
\n",
197 | "\n",
198 | " | Sample: | 01-07-1994 | HQIC | 55258.052 | \n",
199 | "
\n",
200 | "\n",
201 | " | - 04-05-2013 | | | \n",
202 | "
\n",
203 | "
\n",
204 | "\n",
205 | "\n",
206 | " | coef | std err | z | P>|z| | [0.025 | 0.975] | \n",
207 | "
\n",
208 | "\n",
209 | " | const | 5057.0038 | 486.461 | 10.395 | 0.000 | 4103.558 | 6010.450 | \n",
210 | "
\n",
211 | "\n",
212 | " | ar.L1.market_value | 0.9985 | 0.001 | 1298.863 | 0.000 | 0.997 | 1.000 | \n",
213 | "
\n",
214 | "
\n",
215 | "\n",
216 | "Roots\n",
217 | "\n",
218 | " | Real | Imaginary | Modulus | Frequency | \n",
219 | "
\n",
220 | "\n",
221 | " | AR.1 | 1.0015 | +0.0000j | 1.0015 | 0.0000 | \n",
222 | "
\n",
223 | "
"
224 | ],
225 | "text/plain": [
226 | "\n",
227 | "\"\"\"\n",
228 | " ARMA Model Results \n",
229 | "==============================================================================\n",
230 | "Dep. Variable: market_value No. Observations: 5021\n",
231 | "Model: ARMA(1, 0) Log Likelihood -27622.598\n",
232 | "Method: css-mle S.D. of innovations 59.258\n",
233 | "Date: Fri, 27 Sep 2019 AIC 55251.196\n",
234 | "Time: 10:03:35 BIC 55270.760\n",
235 | "Sample: 01-07-1994 HQIC 55258.052\n",
236 | " - 04-05-2013 \n",
237 | "======================================================================================\n",
238 | " coef std err z P>|z| [0.025 0.975]\n",
239 | "--------------------------------------------------------------------------------------\n",
240 | "const 5057.0038 486.461 10.395 0.000 4103.558 6010.450\n",
241 | "ar.L1.market_value 0.9985 0.001 1298.863 0.000 0.997 1.000\n",
242 | " Roots \n",
243 | "=============================================================================\n",
244 | " Real Imaginary Modulus Frequency\n",
245 | "-----------------------------------------------------------------------------\n",
246 | "AR.1 1.0015 +0.0000j 1.0015 0.0000\n",
247 | "-----------------------------------------------------------------------------\n",
248 | "\"\"\""
249 | ]
250 | },
251 | "execution_count": 10,
252 | "metadata": {},
253 | "output_type": "execute_result"
254 | }
255 | ],
256 | "source": [
257 | "results_ar.summary()"
258 | ]
259 | },
260 | {
261 | "cell_type": "markdown",
262 | "metadata": {},
263 | "source": [
264 | "## Higher-Lag AR Models"
265 | ]
266 | },
267 | {
268 | "cell_type": "code",
269 | "execution_count": 11,
270 | "metadata": {},
271 | "outputs": [
272 | {
273 | "data": {
274 | "text/html": [
275 | "\n",
276 | "ARMA Model Results\n",
277 | "\n",
278 | " | Dep. Variable: | market_value | No. Observations: | 5021 | \n",
279 | "
\n",
280 | "\n",
281 | " | Model: | ARMA(2, 0) | Log Likelihood | -27621.866 | \n",
282 | "
\n",
283 | "\n",
284 | " | Method: | css-mle | S.D. of innovations | 59.249 | \n",
285 | "
\n",
286 | "\n",
287 | " | Date: | Fri, 27 Sep 2019 | AIC | 55251.731 | \n",
288 | "
\n",
289 | "\n",
290 | " | Time: | 10:03:37 | BIC | 55277.817 | \n",
291 | "
\n",
292 | "\n",
293 | " | Sample: | 01-07-1994 | HQIC | 55260.872 | \n",
294 | "
\n",
295 | "\n",
296 | " | - 04-05-2013 | | | \n",
297 | "
\n",
298 | "
\n",
299 | "\n",
300 | "\n",
301 | " | coef | std err | z | P>|z| | [0.025 | 0.975] | \n",
302 | "
\n",
303 | "\n",
304 | " | const | 5036.7744 | 495.444 | 10.166 | 0.000 | 4065.721 | 6007.828 | \n",
305 | "
\n",
306 | "\n",
307 | " | ar.L1.market_value | 0.9814 | 0.014 | 69.595 | 0.000 | 0.954 | 1.009 | \n",
308 | "
\n",
309 | "\n",
310 | " | ar.L2.market_value | 0.0171 | 0.014 | 1.211 | 0.226 | -0.011 | 0.045 | \n",
311 | "
\n",
312 | "
\n",
313 | "\n",
314 | "Roots\n",
315 | "\n",
316 | " | Real | Imaginary | Modulus | Frequency | \n",
317 | "
\n",
318 | "\n",
319 | " | AR.1 | 1.0015 | +0.0000j | 1.0015 | 0.0000 | \n",
320 | "
\n",
321 | "\n",
322 | " | AR.2 | -58.4573 | +0.0000j | 58.4573 | 0.5000 | \n",
323 | "
\n",
324 | "
"
325 | ],
326 | "text/plain": [
327 | "\n",
328 | "\"\"\"\n",
329 | " ARMA Model Results \n",
330 | "==============================================================================\n",
331 | "Dep. Variable: market_value No. Observations: 5021\n",
332 | "Model: ARMA(2, 0) Log Likelihood -27621.866\n",
333 | "Method: css-mle S.D. of innovations 59.249\n",
334 | "Date: Fri, 27 Sep 2019 AIC 55251.731\n",
335 | "Time: 10:03:37 BIC 55277.817\n",
336 | "Sample: 01-07-1994 HQIC 55260.872\n",
337 | " - 04-05-2013 \n",
338 | "======================================================================================\n",
339 | " coef std err z P>|z| [0.025 0.975]\n",
340 | "--------------------------------------------------------------------------------------\n",
341 | "const 5036.7744 495.444 10.166 0.000 4065.721 6007.828\n",
342 | "ar.L1.market_value 0.9814 0.014 69.595 0.000 0.954 1.009\n",
343 | "ar.L2.market_value 0.0171 0.014 1.211 0.226 -0.011 0.045\n",
344 | " Roots \n",
345 | "=============================================================================\n",
346 | " Real Imaginary Modulus Frequency\n",
347 | "-----------------------------------------------------------------------------\n",
348 | "AR.1 1.0015 +0.0000j 1.0015 0.0000\n",
349 | "AR.2 -58.4573 +0.0000j 58.4573 0.5000\n",
350 | "-----------------------------------------------------------------------------\n",
351 | "\"\"\""
352 | ]
353 | },
354 | "execution_count": 11,
355 | "metadata": {},
356 | "output_type": "execute_result"
357 | }
358 | ],
359 | "source": [
360 | "model_ar_2 = ARMA(df.market_value, order=(2,0))\n",
361 | "results_ar_2 = model_ar_2.fit()\n",
362 | "results_ar_2.summary()"
363 | ]
364 | },
365 | {
366 | "cell_type": "code",
367 | "execution_count": 12,
368 | "metadata": {},
369 | "outputs": [
370 | {
371 | "data": {
372 | "text/html": [
373 | "\n",
374 | "ARMA Model Results\n",
375 | "\n",
376 | " | Dep. Variable: | market_value | No. Observations: | 5021 | \n",
377 | "
\n",
378 | "\n",
379 | " | Model: | ARMA(3, 0) | Log Likelihood | -27615.871 | \n",
380 | "
\n",
381 | "\n",
382 | " | Method: | css-mle | S.D. of innovations | 59.178 | \n",
383 | "
\n",
384 | "\n",
385 | " | Date: | Fri, 27 Sep 2019 | AIC | 55241.742 | \n",
386 | "
\n",
387 | "\n",
388 | " | Time: | 10:03:37 | BIC | 55274.349 | \n",
389 | "
\n",
390 | "\n",
391 | " | Sample: | 01-07-1994 | HQIC | 55253.168 | \n",
392 | "
\n",
393 | "\n",
394 | " | - 04-05-2013 | | | \n",
395 | "
\n",
396 | "
\n",
397 | "\n",
398 | "\n",
399 | " | coef | std err | z | P>|z| | [0.025 | 0.975] | \n",
400 | "
\n",
401 | "\n",
402 | " | const | 5089.6412 | 520.376 | 9.781 | 0.000 | 4069.723 | 6109.560 | \n",
403 | "
\n",
404 | "\n",
405 | " | ar.L1.market_value | 0.9806 | 0.014 | 69.619 | 0.000 | 0.953 | 1.008 | \n",
406 | "
\n",
407 | "\n",
408 | " | ar.L2.market_value | -0.0309 | 0.020 | -1.563 | 0.118 | -0.070 | 0.008 | \n",
409 | "
\n",
410 | "\n",
411 | " | ar.L3.market_value | 0.0489 | 0.014 | 3.466 | 0.001 | 0.021 | 0.077 | \n",
412 | "
\n",
413 | "
\n",
414 | "\n",
415 | "Roots\n",
416 | "\n",
417 | " | Real | Imaginary | Modulus | Frequency | \n",
418 | "
\n",
419 | "\n",
420 | " | AR.1 | 1.0013 | -0.0000j | 1.0013 | -0.0000 | \n",
421 | "
\n",
422 | "\n",
423 | " | AR.2 | -0.1850 | -4.5161j | 4.5199 | -0.2565 | \n",
424 | "
\n",
425 | "\n",
426 | " | AR.3 | -0.1850 | +4.5161j | 4.5199 | 0.2565 | \n",
427 | "
\n",
428 | "
"
429 | ],
430 | "text/plain": [
431 | "\n",
432 | "\"\"\"\n",
433 | " ARMA Model Results \n",
434 | "==============================================================================\n",
435 | "Dep. Variable: market_value No. Observations: 5021\n",
436 | "Model: ARMA(3, 0) Log Likelihood -27615.871\n",
437 | "Method: css-mle S.D. of innovations 59.178\n",
438 | "Date: Fri, 27 Sep 2019 AIC 55241.742\n",
439 | "Time: 10:03:37 BIC 55274.349\n",
440 | "Sample: 01-07-1994 HQIC 55253.168\n",
441 | " - 04-05-2013 \n",
442 | "======================================================================================\n",
443 | " coef std err z P>|z| [0.025 0.975]\n",
444 | "--------------------------------------------------------------------------------------\n",
445 | "const 5089.6412 520.376 9.781 0.000 4069.723 6109.560\n",
446 | "ar.L1.market_value 0.9806 0.014 69.619 0.000 0.953 1.008\n",
447 | "ar.L2.market_value -0.0309 0.020 -1.563 0.118 -0.070 0.008\n",
448 | "ar.L3.market_value 0.0489 0.014 3.466 0.001 0.021 0.077\n",
449 | " Roots \n",
450 | "=============================================================================\n",
451 | " Real Imaginary Modulus Frequency\n",
452 | "-----------------------------------------------------------------------------\n",
453 | "AR.1 1.0013 -0.0000j 1.0013 -0.0000\n",
454 | "AR.2 -0.1850 -4.5161j 4.5199 -0.2565\n",
455 | "AR.3 -0.1850 +4.5161j 4.5199 0.2565\n",
456 | "-----------------------------------------------------------------------------\n",
457 | "\"\"\""
458 | ]
459 | },
460 | "execution_count": 12,
461 | "metadata": {},
462 | "output_type": "execute_result"
463 | }
464 | ],
465 | "source": [
466 | "model_ar_3 = ARMA(df.market_value, order=(3,0))\n",
467 | "results_ar_3 = model_ar_3.fit()\n",
468 | "results_ar_3.summary()"
469 | ]
470 | },
471 | {
472 | "cell_type": "code",
473 | "execution_count": 13,
474 | "metadata": {},
475 | "outputs": [
476 | {
477 | "data": {
478 | "text/html": [
479 | "\n",
480 | "ARMA Model Results\n",
481 | "\n",
482 | " | Dep. Variable: | market_value | No. Observations: | 5021 | \n",
483 | "
\n",
484 | "\n",
485 | " | Model: | ARMA(4, 0) | Log Likelihood | -27602.863 | \n",
486 | "
\n",
487 | "\n",
488 | " | Method: | css-mle | S.D. of innovations | 59.024 | \n",
489 | "
\n",
490 | "\n",
491 | " | Date: | Fri, 27 Sep 2019 | AIC | 55217.726 | \n",
492 | "
\n",
493 | "\n",
494 | " | Time: | 10:03:38 | BIC | 55256.854 | \n",
495 | "
\n",
496 | "\n",
497 | " | Sample: | 01-07-1994 | HQIC | 55231.437 | \n",
498 | "
\n",
499 | "\n",
500 | " | - 04-05-2013 | | | \n",
501 | "
\n",
502 | "
\n",
503 | "\n",
504 | "\n",
505 | " | coef | std err | z | P>|z| | [0.025 | 0.975] | \n",
506 | "
\n",
507 | "\n",
508 | " | const | 5493.1989 | 959.292 | 5.726 | 0.000 | 3613.022 | 7373.376 | \n",
509 | "
\n",
510 | "\n",
511 | " | ar.L1.market_value | 0.9771 | 0.014 | 69.567 | 0.000 | 0.950 | 1.005 | \n",
512 | "
\n",
513 | "\n",
514 | " | ar.L2.market_value | -0.0286 | 0.020 | -1.455 | 0.146 | -0.067 | 0.010 | \n",
515 | "
\n",
516 | "\n",
517 | " | ar.L3.market_value | -0.0224 | 0.020 | -1.135 | 0.256 | -0.061 | 0.016 | \n",
518 | "
\n",
519 | "\n",
520 | " | ar.L4.market_value | 0.0729 | 0.014 | 5.171 | 0.000 | 0.045 | 0.100 | \n",
521 | "
\n",
522 | "
\n",
523 | "\n",
524 | "Roots\n",
525 | "\n",
526 | " | Real | Imaginary | Modulus | Frequency | \n",
527 | "
\n",
528 | "\n",
529 | " | AR.1 | 1.0009 | -0.0000j | 1.0009 | -0.0000 | \n",
530 | "
\n",
531 | "\n",
532 | " | AR.2 | 0.9543 | -2.0876j | 2.2954 | -0.1818 | \n",
533 | "
\n",
534 | "\n",
535 | " | AR.3 | 0.9543 | +2.0876j | 2.2954 | 0.1818 | \n",
536 | "
\n",
537 | "\n",
538 | " | AR.4 | -2.6026 | -0.0000j | 2.6026 | -0.5000 | \n",
539 | "
\n",
540 | "
"
541 | ],
542 | "text/plain": [
543 | "\n",
544 | "\"\"\"\n",
545 | " ARMA Model Results \n",
546 | "==============================================================================\n",
547 | "Dep. Variable: market_value No. Observations: 5021\n",
548 | "Model: ARMA(4, 0) Log Likelihood -27602.863\n",
549 | "Method: css-mle S.D. of innovations 59.024\n",
550 | "Date: Fri, 27 Sep 2019 AIC 55217.726\n",
551 | "Time: 10:03:38 BIC 55256.854\n",
552 | "Sample: 01-07-1994 HQIC 55231.437\n",
553 | " - 04-05-2013 \n",
554 | "======================================================================================\n",
555 | " coef std err z P>|z| [0.025 0.975]\n",
556 | "--------------------------------------------------------------------------------------\n",
557 | "const 5493.1989 959.292 5.726 0.000 3613.022 7373.376\n",
558 | "ar.L1.market_value 0.9771 0.014 69.567 0.000 0.950 1.005\n",
559 | "ar.L2.market_value -0.0286 0.020 -1.455 0.146 -0.067 0.010\n",
560 | "ar.L3.market_value -0.0224 0.020 -1.135 0.256 -0.061 0.016\n",
561 | "ar.L4.market_value 0.0729 0.014 5.171 0.000 0.045 0.100\n",
562 | " Roots \n",
563 | "=============================================================================\n",
564 | " Real Imaginary Modulus Frequency\n",
565 | "-----------------------------------------------------------------------------\n",
566 | "AR.1 1.0009 -0.0000j 1.0009 -0.0000\n",
567 | "AR.2 0.9543 -2.0876j 2.2954 -0.1818\n",
568 | "AR.3 0.9543 +2.0876j 2.2954 0.1818\n",
569 | "AR.4 -2.6026 -0.0000j 2.6026 -0.5000\n",
570 | "-----------------------------------------------------------------------------\n",
571 | "\"\"\""
572 | ]
573 | },
574 | "execution_count": 13,
575 | "metadata": {},
576 | "output_type": "execute_result"
577 | }
578 | ],
579 | "source": [
580 | "model_ar_4 = ARMA(df.market_value, order=[4,0])\n",
581 | "results_ar_4 = model_ar_4.fit()\n",
582 | "results_ar_4.summary()"
583 | ]
584 | },
585 | {
586 | "cell_type": "markdown",
587 | "metadata": {},
588 | "source": [
589 | "## LLR Test"
590 | ]
591 | },
592 | {
593 | "cell_type": "code",
594 | "execution_count": 16,
595 | "metadata": {},
596 | "outputs": [],
597 | "source": [
598 | "def LLR_test(mod_1, mod_2, DF=1):\n",
599 | " L1 = mod_1.fit().llf\n",
600 | " L2 = mod_2.fit().llf\n",
601 | " LR = (2*(L2-L1))\n",
602 | " p = chi2.sf(LR, DF).round(3)\n",
603 | " return p"
604 | ]
605 | },
606 | {
607 | "cell_type": "markdown",
608 | "metadata": {},
609 | "source": [
610 | "## Comparing Higher-Lag AR Models"
611 | ]
612 | },
613 | {
614 | "cell_type": "code",
615 | "execution_count": 17,
616 | "metadata": {},
617 | "outputs": [
618 | {
619 | "data": {
620 | "text/plain": [
621 | "0.001"
622 | ]
623 | },
624 | "execution_count": 17,
625 | "metadata": {},
626 | "output_type": "execute_result"
627 | }
628 | ],
629 | "source": [
630 | "LLR_test(model_ar_2, model_ar_3)"
631 | ]
632 | },
633 | {
634 | "cell_type": "code",
635 | "execution_count": null,
636 | "metadata": {},
637 | "outputs": [],
638 | "source": [
639 | "LLR_test(model_ar_3, model_ar_4)"
640 | ]
641 | },
642 | {
643 | "cell_type": "code",
644 | "execution_count": null,
645 | "metadata": {},
646 | "outputs": [],
647 | "source": [
648 | "model_ar_4 = ARMA(df.market_value, order=[4,0])\n",
649 | "results_ar_4 = model_ar_4.fit()\n",
650 | "print(results_ar_4.summary()) \n",
651 | "print (\"LLR test: \" + str(LLR_test(model_ar_3, model_ar_4)))"
652 | ]
653 | },
654 | {
655 | "cell_type": "code",
656 | "execution_count": null,
657 | "metadata": {},
658 | "outputs": [],
659 | "source": [
660 | "model_ar_5 = ARMA(df.market_value, order=(5,0))\n",
661 | "results_ar_5 = model_ar_5.fit()\n",
662 | "print(results_ar_5.summary())\n",
663 | "print(\"\\nLLR test p-value = \" + str(LLR_test(model_ar_4, model_ar_5)))"
664 | ]
665 | },
666 | {
667 | "cell_type": "code",
668 | "execution_count": null,
669 | "metadata": {},
670 | "outputs": [],
671 | "source": [
672 | "model_ar_6 = ARMA(df.market_value, order=(6,0))\n",
673 | "results_ar_6 = model_ar_6.fit()\n",
674 | "print(results_ar_6.summary())\n",
675 | "print(\"\\nLLR test p-value = \" + str(LLR_test(model_ar_5, model_ar_6)))"
676 | ]
677 | },
678 | {
679 | "cell_type": "code",
680 | "execution_count": null,
681 | "metadata": {},
682 | "outputs": [],
683 | "source": [
684 | "model_ar_7 = ARMA(df.market_value, order=(7,0))\n",
685 | "results_ar_7 = model_ar_7.fit()\n",
686 | "print(results_ar_7.summary())\n",
687 | "print(\"\\nLLR test p-value = \" + str(LLR_test(model_ar_6, model_ar_7)))"
688 | ]
689 | },
690 | {
691 | "cell_type": "code",
692 | "execution_count": null,
693 | "metadata": {},
694 | "outputs": [],
695 | "source": [
696 | "model_ar_8 = ARMA(df.market_value, order=(8,0))\n",
697 | "results_ar_8 = model_ar_8.fit()\n",
698 | "print(results_ar_8.summary())\n",
699 | "print(\"\\nLLR test p-value = \" + str(LLR_test(model_ar_7, model_ar_8)))"
700 | ]
701 | },
702 | {
703 | "cell_type": "code",
704 | "execution_count": null,
705 | "metadata": {},
706 | "outputs": [],
707 | "source": [
708 | "print(\"LLR test: \" + str(LLR_test(model_ar, model_ar_7, DF = 6)))"
709 | ]
710 | },
711 | {
712 | "cell_type": "markdown",
713 | "metadata": {},
714 | "source": [
715 | "## Analysing the Residuals"
716 | ]
717 | },
718 | {
719 | "cell_type": "code",
720 | "execution_count": null,
721 | "metadata": {},
722 | "outputs": [],
723 | "source": [
724 | "df['res_price'] = results_ar_7.resid"
725 | ]
726 | },
727 | {
728 | "cell_type": "code",
729 | "execution_count": null,
730 | "metadata": {},
731 | "outputs": [],
732 | "source": [
733 | "df.res_price.mean()"
734 | ]
735 | },
736 | {
737 | "cell_type": "code",
738 | "execution_count": null,
739 | "metadata": {},
740 | "outputs": [],
741 | "source": [
742 | "df.res_price.var()"
743 | ]
744 | },
745 | {
746 | "cell_type": "code",
747 | "execution_count": null,
748 | "metadata": {},
749 | "outputs": [],
750 | "source": [
751 | "sts.adfuller(df.res_price)"
752 | ]
753 | },
754 | {
755 | "cell_type": "code",
756 | "execution_count": null,
757 | "metadata": {},
758 | "outputs": [],
759 | "source": [
760 | "sgt.plot_acf(df.res_price, zero = False, lags = 40)\n",
761 | "plt.title(\"ACF Of Residuals for Prices\",size=24)\n",
762 | "plt.show()"
763 | ]
764 | },
765 | {
766 | "cell_type": "code",
767 | "execution_count": null,
768 | "metadata": {},
769 | "outputs": [],
770 | "source": [
771 | "df.res_price[1:].plot(figsize=(20,5))\n",
772 | "plt.title(\"Residuals of Prices\",size=24)\n",
773 | "plt.show()"
774 | ]
775 | }
776 | ],
777 | "metadata": {
778 | "kernelspec": {
779 | "display_name": "Python 3",
780 | "language": "python",
781 | "name": "python3"
782 | },
783 | "language_info": {
784 | "codemirror_mode": {
785 | "name": "ipython",
786 | "version": 3
787 | },
788 | "file_extension": ".py",
789 | "mimetype": "text/x-python",
790 | "name": "python",
791 | "nbconvert_exporter": "python",
792 | "pygments_lexer": "ipython3",
793 | "version": "3.7.4"
794 | }
795 | },
796 | "nbformat": 4,
797 | "nbformat_minor": 2
798 | }
799 |
--------------------------------------------------------------------------------