{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Goal: Fit a time series model to the historical bitcoin daily closing values\n", "\n", "1. [Simple Exponential Smoothing](#optparam1)\n", "2. [Holt's Linear Trend Method](#optparam2)\n", "3. [Damped Trend Method](#optparam3)\n", "4. [Taxonomy of Exponential Smoothing Methods](#optparam4)\n", "\n", "\n", "* Importing 'forecast' package which is very useful to model time series data\n", "* As well as lattice package to use xyplot() function which is a simple function to plot time series in a neat way" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning message:\n", "\"package 'forecast' was built under R version 3.4.4\"" ] }, { "data": { "text/html": [ "
    \n", "\t
  1. 'test.csv'
  2. \n", "\t
  3. 'train.csv'
  4. \n", "
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item 'test.csv'\n", "\\item 'train.csv'\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. 'test.csv'\n", "2. 'train.csv'\n", "\n", "\n" ], "text/plain": [ "[1] \"test.csv\" \"train.csv\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "library(forecast)\n", "library(lattice)\n", "list.files(path = \"data/\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
DateOpenHighLowCloseVolumeMarket.Cap
Jul 31, 2017 2763.24 2889.62 2720.61 2875.34 860,575,000 45,535,800,000
Jul 30, 2017 2724.39 2758.53 2644.85 2757.18 705,943,000 44,890,700,000
Jul 29, 2017 2807.02 2808.76 2692.80 2726.45 803,746,000 46,246,700,000
Jul 28, 2017 2679.73 2897.45 2679.73 2809.01 1,380,100,000 44,144,400,000
Jul 27, 2017 2538.71 2693.32 2529.34 2671.78 789,104,000 41,816,500,000
Jul 26, 2017 2577.77 2610.76 2450.80 2529.45 937,404,000 42,455,000,000
\n" ], "text/latex": [ "\\begin{tabular}{r|lllllll}\n", " Date & Open & High & Low & Close & Volume & Market.Cap\\\\\n", "\\hline\n", "\t Jul 31, 2017 & 2763.24 & 2889.62 & 2720.61 & 2875.34 & 860,575,000 & 45,535,800,000\\\\\n", "\t Jul 30, 2017 & 2724.39 & 2758.53 & 2644.85 & 2757.18 & 705,943,000 & 44,890,700,000\\\\\n", "\t Jul 29, 2017 & 2807.02 & 2808.76 & 2692.80 & 2726.45 & 803,746,000 & 46,246,700,000\\\\\n", "\t Jul 28, 2017 & 2679.73 & 2897.45 & 2679.73 & 2809.01 & 1,380,100,000 & 44,144,400,000\\\\\n", "\t Jul 27, 2017 & 2538.71 & 2693.32 & 2529.34 & 2671.78 & 789,104,000 & 41,816,500,000\\\\\n", "\t Jul 26, 2017 & 2577.77 & 2610.76 & 2450.80 & 2529.45 & 937,404,000 & 42,455,000,000\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "Date | Open | High | Low | Close | Volume | Market.Cap | \n", "|---|---|---|---|---|---|\n", "| Jul 31, 2017 | 2763.24 | 2889.62 | 2720.61 | 2875.34 | 860,575,000 | 45,535,800,000 | \n", "| Jul 30, 2017 | 2724.39 | 2758.53 | 2644.85 | 2757.18 | 705,943,000 | 44,890,700,000 | \n", "| Jul 29, 2017 | 2807.02 | 2808.76 | 2692.80 | 2726.45 | 803,746,000 | 46,246,700,000 | \n", "| Jul 28, 2017 | 2679.73 | 2897.45 | 2679.73 | 2809.01 | 1,380,100,000 | 44,144,400,000 | \n", "| Jul 27, 2017 | 2538.71 | 2693.32 | 2529.34 | 2671.78 | 789,104,000 | 41,816,500,000 | \n", "| Jul 26, 2017 | 2577.77 | 2610.76 | 2450.80 | 2529.45 | 937,404,000 | 42,455,000,000 | \n", "\n", "\n" ], "text/plain": [ " Date Open High Low Close Volume Market.Cap \n", "1 Jul 31, 2017 2763.24 2889.62 2720.61 2875.34 860,575,000 45,535,800,000\n", "2 Jul 30, 2017 2724.39 2758.53 2644.85 2757.18 705,943,000 44,890,700,000\n", "3 Jul 29, 2017 2807.02 2808.76 2692.80 2726.45 803,746,000 46,246,700,000\n", "4 Jul 28, 2017 2679.73 2897.45 2679.73 2809.01 1,380,100,000 44,144,400,000\n", "5 Jul 27, 2017 2538.71 2693.32 2529.34 2671.78 789,104,000 41,816,500,000\n", "6 Jul 26, 2017 2577.77 2610.76 2450.80 2529.45 937,404,000 42,455,000,000" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "train = read.csv(\"data/train.csv\", header=T)\n", "test = read.csv(\"data/test.csv\", header=T)\n", "\n", "# glimpse of top few rows of train data\n", "\n", "head(train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* We will predict the daily Closing value time series for future periods.\n", "* The future data has for validation purposes in in the test data frame" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
DateOpenHighLowCloseVolumeMarket.Cap
Aug 07, 2017 3212.78 3397.68 3180.89 3378.94 1,482,280,000 52,987,300,000
Aug 06, 2017 3257.61 3293.29 3155.60 3213.94 1,105,030,000 53,720,900,000
Aug 05, 2017 2897.63 3290.01 2874.83 3252.91 1,945,700,000 47,778,200,000
Aug 04, 2017 2806.93 2899.33 2743.72 2895.89 1,002,120,000 46,276,200,000
Aug 03, 2017 2709.56 2813.31 2685.14 2804.73 804,797,000 44,666,400,000
Aug 02, 2017 2727.13 2762.53 2668.59 2710.67 1,094,950,000 44,950,800,000
\n" ], "text/latex": [ "\\begin{tabular}{r|lllllll}\n", " Date & Open & High & Low & Close & Volume & Market.Cap\\\\\n", "\\hline\n", "\t Aug 07, 2017 & 3212.78 & 3397.68 & 3180.89 & 3378.94 & 1,482,280,000 & 52,987,300,000\\\\\n", "\t Aug 06, 2017 & 3257.61 & 3293.29 & 3155.60 & 3213.94 & 1,105,030,000 & 53,720,900,000\\\\\n", "\t Aug 05, 2017 & 2897.63 & 3290.01 & 2874.83 & 3252.91 & 1,945,700,000 & 47,778,200,000\\\\\n", "\t Aug 04, 2017 & 2806.93 & 2899.33 & 2743.72 & 2895.89 & 1,002,120,000 & 46,276,200,000\\\\\n", "\t Aug 03, 2017 & 2709.56 & 2813.31 & 2685.14 & 2804.73 & 804,797,000 & 44,666,400,000\\\\\n", "\t Aug 02, 2017 & 2727.13 & 2762.53 & 2668.59 & 2710.67 & 1,094,950,000 & 44,950,800,000\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "Date | Open | High | Low | Close | Volume | Market.Cap | \n", "|---|---|---|---|---|---|\n", "| Aug 07, 2017 | 3212.78 | 3397.68 | 3180.89 | 3378.94 | 1,482,280,000 | 52,987,300,000 | \n", "| Aug 06, 2017 | 3257.61 | 3293.29 | 3155.60 | 3213.94 | 1,105,030,000 | 53,720,900,000 | \n", "| Aug 05, 2017 | 2897.63 | 3290.01 | 2874.83 | 3252.91 | 1,945,700,000 | 47,778,200,000 | \n", "| Aug 04, 2017 | 2806.93 | 2899.33 | 2743.72 | 2895.89 | 1,002,120,000 | 46,276,200,000 | \n", "| Aug 03, 2017 | 2709.56 | 2813.31 | 2685.14 | 2804.73 | 804,797,000 | 44,666,400,000 | \n", "| Aug 02, 2017 | 2727.13 | 2762.53 | 2668.59 | 2710.67 | 1,094,950,000 | 44,950,800,000 | \n", "\n", "\n" ], "text/plain": [ " Date Open High Low Close Volume Market.Cap \n", "1 Aug 07, 2017 3212.78 3397.68 3180.89 3378.94 1,482,280,000 52,987,300,000\n", "2 Aug 06, 2017 3257.61 3293.29 3155.60 3213.94 1,105,030,000 53,720,900,000\n", "3 Aug 05, 2017 2897.63 3290.01 2874.83 3252.91 1,945,700,000 47,778,200,000\n", "4 Aug 04, 2017 2806.93 2899.33 2743.72 2895.89 1,002,120,000 46,276,200,000\n", "5 Aug 03, 2017 2709.56 2813.31 2685.14 2804.73 804,797,000 44,666,400,000\n", "6 Aug 02, 2017 2727.13 2762.53 2668.59 2710.67 1,094,950,000 44,950,800,000" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "head(test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Creating **close_tr_df** as a data frame having dates and closing values in USD for **TRAIN** data\n", "* Creating **close_val_df** as a data frame having dates and closing values in USD for **TEST** data\n", "\n", "\n", "\n", "* We will also use the **mdy()** function from lubridate to convert Date column from factor to a POSIXCt object" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning message:\n", "\"package 'dplyr' was built under R version 3.4.3\"Warning message:\n", "\"package 'lubridate' was built under R version 3.4.3\"Warning message:\n", "\"package 'bindrcpp' was built under R version 3.4.4\"" ] }, { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
DateClose
15512017-07-262529.45
15522017-07-272671.78
15532017-07-282809.01
15542017-07-292726.45
15552017-07-302757.18
15562017-07-312875.34
\n" ], "text/latex": [ "\\begin{tabular}{r|ll}\n", " & Date & Close\\\\\n", "\\hline\n", "\t1551 & 2017-07-26 & 2529.45 \\\\\n", "\t1552 & 2017-07-27 & 2671.78 \\\\\n", "\t1553 & 2017-07-28 & 2809.01 \\\\\n", "\t1554 & 2017-07-29 & 2726.45 \\\\\n", "\t1555 & 2017-07-30 & 2757.18 \\\\\n", "\t1556 & 2017-07-31 & 2875.34 \\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "| | Date | Close | \n", "|---|---|---|---|---|---|\n", "| 1551 | 2017-07-26 | 2529.45 | \n", "| 1552 | 2017-07-27 | 2671.78 | \n", "| 1553 | 2017-07-28 | 2809.01 | \n", "| 1554 | 2017-07-29 | 2726.45 | \n", "| 1555 | 2017-07-30 | 2757.18 | \n", "| 1556 | 2017-07-31 | 2875.34 | \n", "\n", "\n" ], "text/plain": [ " Date Close \n", "1551 2017-07-26 2529.45\n", "1552 2017-07-27 2671.78\n", "1553 2017-07-28 2809.01\n", "1554 2017-07-29 2726.45\n", "1555 2017-07-30 2757.18\n", "1556 2017-07-31 2875.34" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
DateClose
2017-08-012718.26
2017-08-022710.67
2017-08-032804.73
2017-08-042895.89
2017-08-053252.91
2017-08-063213.94
\n" ], "text/latex": [ "\\begin{tabular}{r|ll}\n", " Date & Close\\\\\n", "\\hline\n", "\t 2017-08-01 & 2718.26 \\\\\n", "\t 2017-08-02 & 2710.67 \\\\\n", "\t 2017-08-03 & 2804.73 \\\\\n", "\t 2017-08-04 & 2895.89 \\\\\n", "\t 2017-08-05 & 3252.91 \\\\\n", "\t 2017-08-06 & 3213.94 \\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "Date | Close | \n", "|---|---|---|---|---|---|\n", "| 2017-08-01 | 2718.26 | \n", "| 2017-08-02 | 2710.67 | \n", "| 2017-08-03 | 2804.73 | \n", "| 2017-08-04 | 2895.89 | \n", "| 2017-08-05 | 3252.91 | \n", "| 2017-08-06 | 3213.94 | \n", "\n", "\n" ], "text/plain": [ " Date Close \n", "1 2017-08-01 2718.26\n", "2 2017-08-02 2710.67\n", "3 2017-08-03 2804.73\n", "4 2017-08-04 2895.89\n", "5 2017-08-05 3252.91\n", "6 2017-08-06 3213.94" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "suppressPackageStartupMessages(library(ggplot2))\n", "suppressPackageStartupMessages(library(dplyr))\n", "suppressPackageStartupMessages(library(lubridate))\n", "\n", "train$Date <- mdy(train$Date)\n", "test$Date <- mdy(test$Date)\n", "\n", "close_tr_df <- train[,c(\"Date\", \"Close\")] %>% arrange(Date)\n", "close_val_df <- test[,c(\"Date\", \"Close\")] %>% arrange(Date)\n", "tail(close_tr_df)\n", "head(close_val_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* We can see that train data ends at July 31st 2017 while test data starts at August 1st 2017\n", "* Lets see if we have any missing values" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\n", "FALSE \n", " 3112 " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "\n", "FALSE \n", " 14 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "table(is.na(close_tr_df))\n", "table(is.na(close_val_df))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* No missing values\n", "\n", "\n", "\n", "* Now using **ts() function and its START= and END=** arguments to create a **ts** object for TRAIN data and VALIDATION (TEST) DATA\n", "* **ts** object is a time series object. We can do many flexible time series operations directly on this object\n", "* We also plot the created ts object to see the pattern" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\niII1Q7A41eXBej7+L3weCtaMmWDNz7rCJwrHXPXQp1+vqGT+CdaMuWB98APw5ppgPY4fGv0o\nolsIVtL0wLKCxSHDpJw4U/o3wCl9S7AnWEmpYK087q5lxrDH8OUS582UijYFO4KVlFirenuF\nTvIMkDDaNea8iSJYs987donhpIO1PNOK3v2FQwYLCu3rTUyPlqvG+SZYSXuCNfmp/f+Q1jgP\nCzdYVugP+vjcC3n/vV3lPBGspGSw1gs0PMfuqdi2cd9InLQ+WP37AHTva7r7zq50jghW0u5g\nDdfqdwfrNv3Xs865WZB+9eo5Q15bha9TN15epVNCsJJSh+b4JFijJxf3HTo58VRSG/79eiv3\nWrNKH+5x0z37zF6ls0GwkvYH63VUmm6vvq2/evShu6jnMUM+uhbkZhishdMTJyROaedOqMLO\nN1KdfaP66oM13D1wdWfT5EWMP96GCVvdtYIsrT0rOP/90Sn+wTr6VvXnPz7LRPJojesz5dGT\naVa2PeAfXVRqT5u6J2xIq3uMJk/pXnbzPCCfdxm/25OcJvnppz8dwoHDy54VrO64ke+ztF/Q\nMn2D+CRYb/8gThcFuBOspCPHw347KtGGlax2GKznx5mrZ++HID55uqR7LNV9MfjAiGAlza11\nfvazkydxPg/WKEELwXq9o8+nV4pv+ejflW5vh/4wfP4xmmENK+lwsEbT7eMnoVNnXH5eyazO\n3Md3/Ojc7tY5niVMOhqsyQOjj4P16e848BP8qKvu+FrZDyvpSLCSD5Q++uk909ZUz5tgnUuw\nko4FK3FewaqSlaiz2SRMOhislZ+euahdk9tfiIzJ1eksuiedHqzJXjXps+wKlh2y8uV+OZ3d\nGpLOn2mTZw1P+6XPXUs9DZ4jd8npzgpW83LOFfuuq4OV7Mu+X9rvDe9vR27cI+fzCCvpgmAN\n9whNvixs70Ok4fEh/B3JiTvjfNawki4J1mCvwNQDor2/8xWs3s5L4lzuh/N5ljDpik3CwSOh\n1O/Y/yvP2risxhU3T/Ilnxf8ntrZDyvlkpnWbwe2/dfd6wWP/c7zn9Is3OS9R8+4sboH0MPH\nuO6ECwhWykVTrR2/G2u35vQ87tGpv+nMCyvM671rum8cvu1fR6567Wdiy/wS+xfdS94kvCpY\nt9HqVbdHwgVz25OG87q3gRjeHbM3Vtv2P7F2iZNvuf0vsTtYrz82/nQAV861aUqumdiCNWv4\n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\nBAsIQ7CAMP4fVpkA1OB01g0AAAAASUVORK5CYII=", "text/plain": [ "plot without title" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "library(repr)\n", "close_tr_ts <- ts(close_tr_df$Close,\n", " start = c(as.numeric(format(close_tr_df$Date[1], \"%Y\")), as.numeric(format(close_tr_df$Date[1], \"%j\"))),\n", " end = c(as.numeric(format(close_tr_df$Date[nrow(close_tr_df)], \"%Y\")), as.numeric(format(close_tr_df$Date[nrow(close_tr_df)], \"%j\"))),\n", " frequency = 365)\n", "close_val_ts <- ts(close_val_df$Close,\n", " start = c(as.numeric(format(close_val_df$Date[1], \"%Y\")), as.numeric(format(close_val_df$Date[1], \"%j\"))),\n", " end = c(as.numeric(format(close_val_df$Date[nrow(close_val_df)], \"%Y\")), as.numeric(format(close_val_df$Date[nrow(close_val_df)], \"%j\"))),\n", " frequency = 365)\n", "options(repr.plot.width=10 , repr.plot.height=4)\n", "xyplot(close_tr_ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "* There is a trend starting slowly from late 2015, increasing slowly till mid 2017 and very rapidly thereafter.\n", "* Seasonality seems to be absent\n", "* Non-stationary time series.\n", "\n", "\n", "* **Forecasting approach from initial observations:**\n", " 1. First we will start off by trying extremely basic models like naive forecast and drift.\n", " 2. Then we will try out various exponential smoothing models starting with simple exponential smoothing and going on to ets with trend.\n", " 3. We will also try ARIMA at the end.\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 step Naive model" ] }, { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "
MERMSEMAEMPEMAPEMASEACF1Theil's U
Training set 1.687883 37.1248 16.54763 0.1035267 2.589161 0.03643976 -0.02139786 NA
Test set239.297143 351.7594 263.70571 7.3128706 8.212188 0.58071007 0.573282022.102406
\n" ], "text/latex": [ "\\begin{tabular}{r|llllllll}\n", " & ME & RMSE & MAE & MPE & MAPE & MASE & ACF1 & Theil's U\\\\\n", "\\hline\n", "\tTraining set & 1.687883 & 37.1248 & 16.54763 & 0.1035267 & 2.589161 & 0.03643976 & -0.02139786 & NA \\\\\n", "\tTest set & 239.297143 & 351.7594 & 263.70571 & 7.3128706 & 8.212188 & 0.58071007 & 0.57328202 & 2.102406 \\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "| | ME | RMSE | MAE | MPE | MAPE | MASE | ACF1 | Theil's U | \n", "|---|---|\n", "| Training set | 1.687883 | 37.1248 | 16.54763 | 0.1035267 | 2.589161 | 0.03643976 | -0.02139786 | NA | \n", "| Test set | 239.297143 | 351.7594 | 263.70571 | 7.3128706 | 8.212188 | 0.58071007 | 0.57328202 | 2.102406 | \n", "\n", "\n" ], "text/plain": [ " ME RMSE MAE MPE MAPE MASE \n", "Training set 1.687883 37.1248 16.54763 0.1035267 2.589161 0.03643976\n", "Test set 239.297143 351.7594 263.70571 7.3128706 8.212188 0.58071007\n", " ACF1 Theil's U\n", "Training set -0.02139786 NA \n", "Test set 0.57328202 2.102406 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Drift model i.e. First observation - Last observation" ] }, { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "
MERMSEMAEMPEMAPEMASEACF1Theil's U
Training set8.381870e-12 37.08641 16.5874 -0.4063651 2.630292 0.03652735 -0.02139786 NA
Test set2.325456e+02344.82320 258.4009 7.0950805 8.047721 0.56902835 0.57220176 2.060728
\n" ], "text/latex": [ "\\begin{tabular}{r|llllllll}\n", " & ME & RMSE & MAE & MPE & MAPE & MASE & ACF1 & Theil's U\\\\\n", "\\hline\n", "\tTraining set & 8.381870e-12 & 37.08641 & 16.5874 & -0.4063651 & 2.630292 & 0.03652735 & -0.02139786 & NA \\\\\n", "\tTest set & 2.325456e+02 & 344.82320 & 258.4009 & 7.0950805 & 8.047721 & 0.56902835 & 0.57220176 & 2.060728 \\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "| | ME | RMSE | MAE | MPE | MAPE | MASE | ACF1 | Theil's U | \n", "|---|---|\n", "| Training set | 8.381870e-12 | 37.08641 | 16.5874 | -0.4063651 | 2.630292 | 0.03652735 | -0.02139786 | NA | \n", "| Test set | 2.325456e+02 | 344.82320 | 258.4009 | 7.0950805 | 8.047721 | 0.56902835 | 0.57220176 | 2.060728 | \n", "\n", "\n" ], "text/plain": [ " ME RMSE MAE MPE MAPE MASE \n", "Training set 8.381870e-12 37.08641 16.5874 -0.4063651 2.630292 0.03652735\n", "Test set 2.325456e+02 344.82320 258.4009 7.0950805 8.047721 0.56902835\n", " ACF1 Theil's U\n", "Training set -0.02139786 NA \n", "Test set 0.57220176 2.060728 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "naive_close <- naive(close_tr_ts, h = nrow(close_val_df))\n", "drift_close <- rwf(close_tr_ts, h = nrow(close_val_df), drift = T)\n", "\n", "cat(\"1 step Naive model\")\n", "accuracy(naive_close, close_val_ts)\n", "cat(\"Drift model i.e. First observation - Last observation\")\n", "accuracy(drift_close, close_val_ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Both the models are yielding almost similar results.\n", "* We that see that we are heavily overfitting the train data for both models. This is because the right at the end of the train time series, there is a severe trend and the whole range of the time series has changed.\n", "* This provides more evidence that exponential smoothing models might provide a reasonable estimate as we can weight the recent observations more in that.\n", "* Let us try **Exponential Smoothing models**\n", "\n", "\n", "\n", "\n", "## 1. Simple Exponential Smoothing\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Forecast method: Simple exponential smoothing\n", "\n", "Model Information:\n", "Simple exponential smoothing \n", "\n", "Call:\n", " ses(y = close_tr_ts) \n", "\n", " Smoothing parameters:\n", " alpha = 0.9799 \n", "\n", " Initial states:\n", " l = 134.3295 \n", "\n", " sigma: 37.1296\n", "\n", " AIC AICc BIC \n", "22672.88 22672.89 22688.93 \n", "\n", "Error measures:\n", " ME RMSE MAE MPE MAPE MASE\n", "Training set 1.720947 37.10568 16.53901 0.1054994 2.586803 0.03642078\n", " ACF1\n", "Training set -0.001713561\n", "\n", "Forecasts:\n", " Point Forecast Lo 80 Hi 80 Lo 95 Hi 95\n", "2017.5808 2756.594 2709.011 2804.178 2683.822 2829.367\n", "2017.5836 2756.594 2689.974 2823.214 2654.708 2858.481\n", "2017.5863 2756.594 2675.278 2837.910 2632.232 2880.956\n", "2017.5890 2756.594 2662.859 2850.330 2613.238 2899.950\n", "2017.5918 2756.594 2651.903 2861.286 2596.482 2916.707\n", "2017.5945 2756.594 2641.989 2871.200 2581.320 2931.868\n", "2017.5973 2756.594 2632.867 2880.322 2567.370 2945.819\n", "2017.6000 2756.594 2624.373 2888.816 2554.379 2958.810\n", "2017.6027 2756.594 2616.392 2896.796 2542.174 2971.015\n", "2017.6055 2756.594 2608.842 2904.346 2530.627 2982.561\n" ] } ], "source": [ "close_ses <- ses(close_tr_ts)\n", "summary(close_ses)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* **ses()** function minimizes the SSE to estimate the right value of ALPHA and INITIAL STATE \"L0\"\n", "* Looking at the summary, the ideal values for ALPHA and L0 are selected as 0.9798 and 134.2529 respectively\n", "* Lets look at our performance on test data" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\n", "
MERMSEMAEMPEMAPEACF1Theil's U
Test set239.8828352.1581263.95677.3325588.2195470.5732822.104888
\n" ], "text/latex": [ "\\begin{tabular}{r|lllllll}\n", " & ME & RMSE & MAE & MPE & MAPE & ACF1 & Theil's U\\\\\n", "\\hline\n", "\tTest set & 239.8828 & 352.1581 & 263.9567 & 7.332558 & 8.219547 & 0.573282 & 2.104888\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "| | ME | RMSE | MAE | MPE | MAPE | ACF1 | Theil's U | \n", "|---|\n", "| Test set | 239.8828 | 352.1581 | 263.9567 | 7.332558 | 8.219547 | 0.573282 | 2.104888 | \n", "\n", "\n" ], "text/plain": [ " ME RMSE MAE MPE MAPE ACF1 Theil's U\n", "Test set 239.8828 352.1581 263.9567 7.332558 8.219547 0.573282 2.104888 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "close_ses_preds = data.frame(predict(close_ses, h= nrow(close_val_df)))\n", "accuracy(close_ses_preds$Point.Forecast, close_val_ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* The model is still not performing efficiently. RMSE for test set is still $ 352 which was nearly the same as the one obtained by Naive model\n", "* Factors like optimal **Alpha being 0.97** & **Naive model performing equally well as exponential smoothing** tends to suggest that the **observations in the recent past are more important when predicting Bitcoin Closing values**\n", "\n", "* Note that we still haven't accomodated a model component for trend.\n", "* We can definitely see that trend starts from late 2015 and is pretty much persistent throughout until the end\n", "* So let us try to accomodate this trend\n", "\n", "\n", "## 2. Holt's linear trend method" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "plot without title" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "library(repr)\n", "options(repr.plot.width =10, repr.plot.height=4)\n", "\n", "autoplot(close_ses) +\n", " autolayer(fitted(close_ses), series=\"Fitted\") +\n", " ylab(\"Bitcoin Daily Closing in $\") + xlab(\"Year\")" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Forecast method: Holt's method\n", "\n", "Model Information:\n", "Holt's method \n", "\n", "Call:\n", " holt(y = close_tr_ts) \n", "\n", " Smoothing parameters:\n", " alpha = 0.9735 \n", " beta = 0.0035 \n", "\n", " Initial states:\n", " l = 138.194 \n", " b = 0.7433 \n", "\n", " sigma: 37.1073\n", "\n", " AIC AICc BIC \n", "22673.01 22673.05 22699.75 \n", "\n", "Error measures:\n", " ME RMSE MAE MPE MAPE MASE\n", "Training set 0.900354 37.05951 16.4525 -0.008326569 2.583958 0.03623029\n", " ACF1\n", "Training set 8.804001e-05\n", "\n", "Forecasts:\n", " Point Forecast Lo 80 Hi 80 Lo 95 Hi 95\n", "2017.5808 2762.285 2714.730 2809.840 2689.556 2835.014\n", "2017.5836 2767.996 2701.510 2834.482 2666.315 2869.677\n", "2017.5863 2773.707 2692.497 2854.916 2649.508 2897.906\n", "2017.5890 2779.417 2685.687 2873.147 2636.070 2922.765\n", "2017.5918 2785.128 2680.288 2889.968 2624.789 2945.468\n", "2017.5945 2790.839 2675.888 2905.789 2615.037 2966.640\n", "2017.5973 2796.549 2672.245 2920.854 2606.442 2986.656\n", "2017.6000 2802.260 2669.198 2935.322 2598.759 3005.761\n", "2017.6027 2807.971 2666.636 2949.306 2591.817 3024.124\n", "2017.6055 2813.681 2664.478 2962.885 2585.494 3041.869\n" ] } ], "source": [ "close_holt_lt <- holt(close_tr_ts)\n", "summary(close_holt_lt)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\n", "
MERMSEMAEMPEMAPEACF1Theil's U
Test set217.0598 328.8001 246.0173 6.596363 7.663347 0.56939481.964626
\n" ], "text/latex": [ "\\begin{tabular}{r|lllllll}\n", " & ME & RMSE & MAE & MPE & MAPE & ACF1 & Theil's U\\\\\n", "\\hline\n", "\tTest set & 217.0598 & 328.8001 & 246.0173 & 6.596363 & 7.663347 & 0.5693948 & 1.964626 \\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "| | ME | RMSE | MAE | MPE | MAPE | ACF1 | Theil's U | \n", "|---|\n", "| Test set | 217.0598 | 328.8001 | 246.0173 | 6.596363 | 7.663347 | 0.5693948 | 1.964626 | \n", "\n", "\n" ], "text/plain": [ " ME RMSE MAE MPE MAPE ACF1 Theil's U\n", "Test set 217.0598 328.8001 246.0173 6.596363 7.663347 0.5693948 1.964626 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "close_holt_lt_preds = data.frame(predict(close_holt_lt, h= nrow(close_val_df)))\n", "accuracy(close_holt_lt_preds$Point.Forecast, close_val_ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* RMSE has reduced by $ 30\n", "\n", "* In Holt's linear trend method, all the future forecasts are either trended up or trended down constantly.\n", "* This is not practical for most real-life datasets since some time or the other in the future, the trend will flatten.\n", "* To accomodate this, there is a method called as DAMPED LINEAR TREND\n", "* DAMPED LINEAR TREND method is very similar to Holt's method just with an additional dampening parameter which slowly reduces the trend of forecasts.\n", "* Short term forecasts are trended in this method and long-term forecasts are flattened.\n", "\n", "\n", "## 3. Damped Trend Method" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " Point Forecast Lo 80 Hi 80 Lo 95 Hi 95\n", "2017.5808 2756.605 2708.976 2804.234 2683.763 2829.448\n", "2017.5836 2756.612 2689.922 2823.301 2654.619 2858.605\n", "2017.5863 2756.617 2675.212 2838.022 2632.119 2881.115\n", "2017.5890 2756.621 2662.780 2850.463 2613.103 2900.140\n", "2017.5918 2756.625 2651.811 2861.439 2596.326 2916.924\n", "2017.5945 2756.627 2641.885 2871.370 2581.145 2932.110\n", "2017.5973 2756.630 2632.752 2880.507 2567.175 2946.084\n", "2017.6000 2756.631 2624.247 2889.016 2554.167 2959.096\n", "2017.6027 2756.633 2616.255 2897.010 2541.944 2971.321\n", "2017.6055 2756.634 2608.695 2904.573 2530.381 2982.887" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "close_holt_damped <- holt(close_tr_ts, damped=TRUE, phi=0.8)\n", "close_holt_damped" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABLAAAAHgCAMAAACCSWStAAAAQlBMVEUAAAAAyswzMzNNTU1o\naGh8fHyMjIyampqnp6eysrK9vb3Hx8fIRy7Q0NDR+vrZ2dnh4eHp6enr6+vw8PD51tP///80\nFDjwAAAACXBIWXMAABJ0AAASdAHeZh94AAAgAElEQVR4nO3di3aiyraA4eqFtyTtNrbH93/V\nI4JYXAqhmFA1q/5vjN0xRjGRNf+tiGjuAKCECf0LAMBUBAuAGgQLgBoEC4AaBAuAGgQLgBoE\nC4AaBAuAGgQLgBoEC4AassEyDYml3Y6u843ZzVvU+xfq/2rlOdVNefza064oc38A2Ys5WK6l\nHB7L3/suajhY1bkev/a0KxIsQIR0sLZYmjG//osiWIBeOoO1YFFjwSoKzwUTLGATawbr91iY\n4vhb/eC2M4fHicv+8XTuXP38/Dh9vD1PnnaPsy/1tczjWpf6+aV9xus2qvObRbZu5v5VmN1j\n+d+PL99Dv1h9qn2lepGHQ//mBpfZ/BXN71L+sPkDmkU//8bii2ABMlYM1rnenFUN9sGY0/3+\nU511Kn9+ep58Pqgp3pe8NNeqY3CxFlPdxisS1SLbN/P1PH05Pr98D/xi1an2lV43dfrq39zQ\nMt9/RfO7VD+8dBZd/41HggWIWC9Yv49Jv91vj5G9lj/Y357nlY9CfvflNP+a4ny/7cux/zKP\nUjz+Lbek78zPvUzC7rU064zWrTSLbN3MY5mPShTVl+5VmlOdK9k/791cf5n2X/H6Xcq/5VD+\nAa1FP755LO1cECxAxEqvEt7L2X4+jrofq0ciz6dLJ/N8Bngrn8odnw9WbmUBdtXZz6tZs+3a\nPvQ6v15k62bOz2VWD29aizIjv9voNq7+Mu2/4vW71JfpLPpUPci7FQQLkLBesHblQ4yH6/vB\n0uO89wXqStV+z1/754UOpjj+XOul3dtnNLfy/rd7MzfrR+5g9X6390V7N9dfpv1XtH6X6ofW\nol9/44FgARLWe0rYnLaCYHqjXvkumpZcnyefG7erS1hntJbcrVLrZrq/TecRVO9K75/3bq6/\nzP5f0fph//e57wkWIGHrYA1e9tuY/ennWp9zfm7A/npfojmjdc2VgtW7uaFgdf+KT8FiGxYg\nYr1gDT0lLKxdPov3U8JdtTnqfe3fY/nqobW06ozWrQw/JbR/DXewRp4S9m6uv0z7rxh/Slif\nfyNYgIj1gnUy1VsBmw3bz9PP837Ll9OO9Ybqpkzn7iOX1pi7NsYP3czHYPWuNLCpvXPK+mL/\nFb1gtRZ9qNL2TbAAEesF6/EM71S9vv/b/OD3ufPSb1G26myK33q3hl35Ylr94n+1W8GpegXu\n2j6jdSv1Iodu5mOwelcy5rWdvXdz/WXaf0V1ReuHrUV/m+Kn2m1r0d0KoLJesLo7Z9rnWTuO\nlvtefb82Yl+aHTeLa/VqXOuM1q10FmnfzMdg9a60a5rSu7mBZVp/xc5+AcH+YbUXxP558otg\nASJWDFbn7S+V6+n9npnvnSmqnZa+ywteztWbd55vjSl78bt7bkl6n9G6lWaR/Zv5HKzuleqb\nug/c3NAy339FdcXWD1tvzfnhrTmAHCYJgBoEC4AaBAuAGgQLgBoEC4AaBAuAGgQLgBoEC4Aa\nBAuAGgQLgBqSwfoHYFuC86sCwQIUE5xfFQgWoJjg/KpAsADFBOdXBYIFKCY4vyoQLEAxwflV\nYVqwioexr5XQ6w7IjngRIjcpWEX9j+trLfS6A7IjXoTIESxAMfEiRG76NiyCBURHNgfxkwrW\nfw/yvx0AWCYGq9q4ziMsIC7SQYgdTwkBxWRzED+CBSgmm4P48SohoJh4ESJHsADFxIsQOfZ0\nBxQTL0LkeC8hoJjg/KpAsNBhTOjfANMJzq8KBAsW8/CPYCkiOL8qECw06sdWBEsRwflVgWCh\nYVpfoIHg/KpAsNAgWPoIzq8KBAsvpncC0ROcXxUIFl4IlkKC86sCwcILwVJIcH5VIFh4IVgK\nCc6vCgQLNTNwCrETnF8VCBZqBEsjwflVgWChRrA0EpxfFQgWagRLI8H5VYFgoWIGTyJygvOr\nAsFCxThOI2qC86sCwUKFYKkkOL8qECxUCJZKgvOrAsFChWCpJDi/KhAsPBnnN4iZ4PyqQLDw\nRLB0EpxfFQhWdoZrRLB0EpxfFQhWdghWSgTnVwWClZ3BT8UxI98hYoLzqwLBys3wp+KY0W8R\nLcH5VYFg5YZgJUVwflUgWLkhWEkRnF8VCFZuzFCOuucQLC0E51cFgpUbgpUUwflVgWBlxvwj\nWCkRnF8VCFZmhoLV39GBYGkhOL8qEKzMmOaf5pyBOuUdrAj++j9TLyg4vyoQrMx0gzW4G2kM\nIxuQ117/cnfZn4fJFxacXxUIVmY6wXKNWdbFChesP7NiVRKcXxUIVmYI1metR53DD0E/XGm+\n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", "text/plain": [ "plot without title" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "autoplot(window(close_tr_ts, start=c(2017,100))) +\n", " autolayer(close_holt_lt, series=\"Holt's method\", PI=FALSE) +\n", " autolayer(close_holt_damped, series=\"Damped Holt's method\", PI=FALSE) +\n", " ggtitle(\"Forecasts from Holt's method\") + xlab(\"Year\") +\n", " ylab(\"Closing value of Bitcoin in USD\") +\n", " guides(colour=guide_legend(title=\"Forecast\"))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\n", "
MERMSEMAEMPEMAPEACF1Theil's U
Test set239.8575 352.1354 263.9395 7.331729 8.219017 0.57327922.10475
\n" ], "text/latex": [ "\\begin{tabular}{r|lllllll}\n", " & ME & RMSE & MAE & MPE & MAPE & ACF1 & Theil's U\\\\\n", "\\hline\n", "\tTest set & 239.8575 & 352.1354 & 263.9395 & 7.331729 & 8.219017 & 0.5732792 & 2.10475 \\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "| | ME | RMSE | MAE | MPE | MAPE | ACF1 | Theil's U | \n", "|---|\n", "| Test set | 239.8575 | 352.1354 | 263.9395 | 7.331729 | 8.219017 | 0.5732792 | 2.10475 | \n", "\n", "\n" ], "text/plain": [ " ME RMSE MAE MPE MAPE ACF1 Theil's U\n", "Test set 239.8575 352.1354 263.9395 7.331729 8.219017 0.5732792 2.10475 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "close_holt_damped_preds = data.frame(predict(close_holt_damped, h= nrow(close_val_df)))\n", "accuracy(close_holt_damped_preds$Point.Forecast, close_val_ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* RMSE did not improve at all for Point.Forecast\n", "* Interestingly, I tried checking the accuracy with Upper 95% Confidence boundary and the RMSE reduced extensively.\n", "* This suggests that our model is under-estimating the trend and dampening is not a good option here.\n", "* Lets see if we can correct this in future models" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\n", "
MERMSEMAEMPEMAPEACF1Theil's U
Test set101.5592 244.8846 198.6328 2.784298 6.332324 0.55665591.45503
\n" ], "text/latex": [ "\\begin{tabular}{r|lllllll}\n", " & ME & RMSE & MAE & MPE & MAPE & ACF1 & Theil's U\\\\\n", "\\hline\n", "\tTest set & 101.5592 & 244.8846 & 198.6328 & 2.784298 & 6.332324 & 0.5566559 & 1.45503 \\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "| | ME | RMSE | MAE | MPE | MAPE | ACF1 | Theil's U | \n", "|---|\n", "| Test set | 101.5592 | 244.8846 | 198.6328 | 2.784298 | 6.332324 | 0.5566559 | 1.45503 | \n", "\n", "\n" ], "text/plain": [ " ME RMSE MAE MPE MAPE ACF1 Theil's U\n", "Test set 101.5592 244.8846 198.6328 2.784298 6.332324 0.5566559 1.45503 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "accuracy(close_holt_damped_preds$Hi.95, close_val_ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## 4. Taxonomy of Exponential Smoothing Methods" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* There are multiple combinations of Exponential Smoothing models available to us.\n", "* Models with trend, seasonal and level components with either of the components absent/present/additive/multiplicative.\n", "* **ets()** function takes in a 'ts' object and estimates the best component driven Exponential Smoothing method among several options available" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning message in ets(close_tr_ts, damped = FALSE, allow.multiplicative.trend = TRUE):\n", "\"I can't handle data with frequency greater than 24. Seasonality will be ignored. Try stlf() if you need seasonal forecasts.\"" ] }, { "data": { "text/plain": [ "ETS(M,M,N) \n", "\n", "Call:\n", " ets(y = close_tr_ts, damped = FALSE, allow.multiplicative.trend = TRUE) \n", "\n", " Smoothing parameters:\n", " alpha = 0.9473 \n", " beta = 0.0218 \n", "\n", " Initial states:\n", " l = 138.5493 \n", " b = 0.9992 \n", "\n", " sigma: 0.0424\n", "\n", " AIC AICc BIC \n", "20508.17 20508.21 20534.92 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "close_ets <- ets(close_tr_ts, damped=FALSE, allow.multiplicative.trend=TRUE)\n", "close_ets" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\n", "
MERMSEMAEMPEMAPEACF1Theil's U
Test set169.6478 281.2822 209.8717 5.067698 6.548465 0.55875811.680426
\n" ], "text/latex": [ "\\begin{tabular}{r|lllllll}\n", " & ME & RMSE & MAE & MPE & MAPE & ACF1 & Theil's U\\\\\n", "\\hline\n", "\tTest set & 169.6478 & 281.2822 & 209.8717 & 5.067698 & 6.548465 & 0.5587581 & 1.680426 \\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "| | ME | RMSE | MAE | MPE | MAPE | ACF1 | Theil's U | \n", "|---|\n", "| Test set | 169.6478 | 281.2822 | 209.8717 | 5.067698 | 6.548465 | 0.5587581 | 1.680426 | \n", "\n", "\n" ], "text/plain": [ " ME RMSE MAE MPE MAPE ACF1 Theil's U\n", "Test set 169.6478 281.2822 209.8717 5.067698 6.548465 0.5587581 1.680426 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "close_ets_preds = data.frame(predict(close_ets, h= nrow(close_val_df)))\n", "accuracy(close_ets_preds$Point.Forecast, close_val_ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Finally a BIG improvement w.r.t Point.Forecast\n", "* Our last best RMSE for point forecast was $ 328\n", "* ets() chose an Exponential Smoothing model with Multiplicative Level, Multiplicative Trend and Seasonality Absent.\n", "* Note that we had set the trend dampening to be FALSE, let us set it to be true, although intuitively is should not help because our previous model was under-estimating the values.\n", "* Before that lets quickly check the RMSE with Upper 95 CL as our forecasts" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\n", "
MERMSEMAEMPEMAPEACF1Theil's U
Test set-305.036 322.8162 305.036 -10.4896410.48964 0.225983 2.014339
\n" ], "text/latex": [ "\\begin{tabular}{r|lllllll}\n", " & ME & RMSE & MAE & MPE & MAPE & ACF1 & Theil's U\\\\\n", "\\hline\n", "\tTest set & -305.036 & 322.8162 & 305.036 & -10.48964 & 10.48964 & 0.225983 & 2.014339 \\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "| | ME | RMSE | MAE | MPE | MAPE | ACF1 | Theil's U | \n", "|---|\n", "| Test set | -305.036 | 322.8162 | 305.036 | -10.48964 | 10.48964 | 0.225983 | 2.014339 | \n", "\n", "\n" ], "text/plain": [ " ME RMSE MAE MPE MAPE ACF1 Theil's U\n", "Test set -305.036 322.8162 305.036 -10.48964 10.48964 0.225983 2.014339 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "accuracy(close_ets_preds$Hi.95, close_val_ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* RMSE has increased for Upper 95 CL. This is good. This means our model has improved and not under-estimated the forecasts.\n", "* Although, I soon found out that there is still some under estimation as Upper 80 CL gives an RMSE below 200.\n", "* This might be an indication that in the validation data we have, the values are slightly inflated. If we use Higher 80 CL, it might indicate an overfit of the current validation data.\n", "* So sticking to Point Forecasts as our actual forecasts will still be a better decision." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\n", "
MERMSEMAEMPEMAPEACF1Theil's U
Test set-128.1982193.1998 165.9069 -4.70026 5.83816 0.44952351.192402
\n" ], "text/latex": [ "\\begin{tabular}{r|lllllll}\n", " & ME & RMSE & MAE & MPE & MAPE & ACF1 & Theil's U\\\\\n", "\\hline\n", "\tTest set & -128.1982 & 193.1998 & 165.9069 & -4.70026 & 5.83816 & 0.4495235 & 1.192402 \\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "| | ME | RMSE | MAE | MPE | MAPE | ACF1 | Theil's U | \n", "|---|\n", "| Test set | -128.1982 | 193.1998 | 165.9069 | -4.70026 | 5.83816 | 0.4495235 | 1.192402 | \n", "\n", "\n" ], "text/plain": [ " ME RMSE MAE MPE MAPE ACF1 Theil's U\n", "Test set -128.1982 193.1998 165.9069 -4.70026 5.83816 0.4495235 1.192402 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "accuracy(close_ets_preds$Hi.80, close_val_ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Foolowing is Search for best Component Exponential Smoothing model with **trend DAMPNING**\n", "* As expected, the model does not help much." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning message in ets(close_tr_ts, damped = TRUE, allow.multiplicative.trend = TRUE):\n", "\"I can't handle data with frequency greater than 24. Seasonality will be ignored. Try stlf() if you need seasonal forecasts.\"" ] }, { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\n", "
MERMSEMAEMPEMAPEACF1Theil's U
Test set201.227 312.9744 233.6084 6.085012 7.278193 0.56624241.869645
\n" ], "text/latex": [ "\\begin{tabular}{r|lllllll}\n", " & ME & RMSE & MAE & MPE & MAPE & ACF1 & Theil's U\\\\\n", "\\hline\n", "\tTest set & 201.227 & 312.9744 & 233.6084 & 6.085012 & 7.278193 & 0.5662424 & 1.869645 \\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "| | ME | RMSE | MAE | MPE | MAPE | ACF1 | Theil's U | \n", "|---|\n", "| Test set | 201.227 | 312.9744 | 233.6084 | 6.085012 | 7.278193 | 0.5662424 | 1.869645 | \n", "\n", "\n" ], "text/plain": [ " ME RMSE MAE MPE MAPE ACF1 Theil's U\n", "Test set 201.227 312.9744 233.6084 6.085012 7.278193 0.5662424 1.869645 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "close_ets_damped <- ets(close_tr_ts, damped=TRUE, allow.multiplicative.trend=TRUE)\n", "close_ets_damped_preds = data.frame(predict(close_ets_damped, h= nrow(close_val_df)))\n", "accuracy(close_ets_damped_preds$Point.Forecast, close_val_ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## 5. ARIMA Modelling\n", "\n", "* So the best results thus far has been ETS(M,M,N) Model - $ 281 RMSE.\n", "* Let us try to better it using ARIMA models.\n", "* ARIMA models use the past observations and past errors to create extremely flexible forecasting systems\n", "* We will use a non-seasonal ARIMA model" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Series: close_tr_ts \n", "ARIMA(3,2,0) \n", "\n", "Coefficients:\n", " ar1 ar2 ar3\n", " -0.7579 -0.5192 -0.2873\n", "s.e. 0.0243 0.0283 0.0245\n", "\n", "sigma^2 estimated as 1730: log likelihood=-7992.15\n", "AIC=15992.3 AICc=15992.32 BIC=16013.69" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "(close_arima <- auto.arima(close_tr_ts))" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\n", "
MERMSEMAEMPEMAPEACF1Theil's U
Test set88.00693 219.4182 179.0843 2.391043 5.721041 0.54103551.309949
\n" ], "text/latex": [ "\\begin{tabular}{r|lllllll}\n", " & ME & RMSE & MAE & MPE & MAPE & ACF1 & Theil's U\\\\\n", "\\hline\n", "\tTest set & 88.00693 & 219.4182 & 179.0843 & 2.391043 & 5.721041 & 0.5410355 & 1.309949 \\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "| | ME | RMSE | MAE | MPE | MAPE | ACF1 | Theil's U | \n", "|---|\n", "| Test set | 88.00693 | 219.4182 | 179.0843 | 2.391043 | 5.721041 | 0.5410355 | 1.309949 | \n", "\n", "\n" ], "text/plain": [ " ME RMSE MAE MPE MAPE ACF1 Theil's U\n", "Test set 88.00693 219.4182 179.0843 2.391043 5.721041 0.5410355 1.309949 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "close_arima_preds = close_arima %>% forecast(h= nrow(close_val_df)) %>% data.frame()\n", "accuracy(close_arima_preds$Point.Forecast, close_val_ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* We can see that AUTO.ARIMA() selected an ARIMA model with p = 3, d = 2 and q = 0.\n", "* RMSE is also the best we have had so far, $ 220.\n", "\n", "#### In the second notebook we will try to\n", "1. Come up with our own ARIMA parameters and see if the performance increases\n", "2. run LSTM Neural Networks to see if the performance increases" ] } ], "metadata": { "kernelspec": { "display_name": "R", "language": "R", "name": "ir" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "3.4.2" } }, "nbformat": 4, "nbformat_minor": 2 }