library(fastDummies)
library(lubridate)
library(caret)
library(generics)

## Predicting "C", CSCO Adjusted Closing Prices

## Data from CSCO closing prices
cisco <- read.csv("CSCO.csv", header=TRUE)

## Format Date variable + Create Month Dummy
cisco$Date <- as.Date(cisco$Date, format = c('%m/%d/%Y'))
cisco$Month <- as.factor(month(cisco$Date))
cisco <- dummy_cols(cisco)

summary(cisco)
      Date                 Obs          Adj.Close         Volume              Month    
 Min.   :0020-03-16   Min.   :  1.0   Min.   :31.71   Min.   :  5720500   3      : 45  
 1st Qu.:0020-09-13   1st Qu.:126.8   1st Qu.:42.55   1st Qu.: 15471275   6      : 44  
 Median :0021-03-15   Median :252.5   Median :47.67   Median : 19027700   12     : 44  
 Mean   :0021-03-13   Mean   :252.5   Mean   :48.13   Mean   : 21539236   7      : 43  
 3rd Qu.:0021-09-13   3rd Qu.:378.2   3rd Qu.:54.76   3rd Qu.: 24357175   8      : 43  
 Max.   :0022-03-14   Max.   :504.0   Max.   :63.59   Max.   :106928300   10     : 43  
                                                                          (Other):242  
    Month_1           Month_2          Month_3           Month_4           Month_5       
 Min.   :0.00000   Min.   :0.0000   Min.   :0.00000   Min.   :0.00000   Min.   :0.00000  
 1st Qu.:0.00000   1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000  
 Median :0.00000   Median :0.0000   Median :0.00000   Median :0.00000   Median :0.00000  
 Mean   :0.07738   Mean   :0.0754   Mean   :0.08929   Mean   :0.08333   Mean   :0.07937  
 3rd Qu.:0.00000   3rd Qu.:0.0000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000  
 Max.   :1.00000   Max.   :1.0000   Max.   :1.00000   Max.   :1.00000   Max.   :1.00000  
                                                                                         
    Month_6          Month_7           Month_8           Month_9           Month_10      
 Min.   :0.0000   Min.   :0.00000   Min.   :0.00000   Min.   :0.00000   Min.   :0.00000  
 1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000  
 Median :0.0000   Median :0.00000   Median :0.00000   Median :0.00000   Median :0.00000  
 Mean   :0.0873   Mean   :0.08532   Mean   :0.08532   Mean   :0.08333   Mean   :0.08532  
 3rd Qu.:0.0000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000  
 Max.   :1.0000   Max.   :1.00000   Max.   :1.00000   Max.   :1.00000   Max.   :1.00000  
                                                                                         
    Month_11          Month_12     
 Min.   :0.00000   Min.   :0.0000  
 1st Qu.:0.00000   1st Qu.:0.0000  
 Median :0.00000   Median :0.0000  
 Mean   :0.08135   Mean   :0.0873  
 3rd Qu.:0.00000   3rd Qu.:0.0000  
 Max.   :1.00000   Max.   :1.0000  
                                   
## First Regression Model
model <- lm(Adj.Close ~ Obs + Volume + Month_1 + Month_2 + Month_3 + Month_4 + Month_5 + Month_6 + Month_7 + Month_8 + Month_9 + Month_10 + Month_11, data= cisco[1:403,])

summary(model)

Call:
lm(formula = Adj.Close ~ Obs + Volume + Month_1 + Month_2 + Month_3 + 
    Month_4 + Month_5 + Month_6 + Month_7 + Month_8 + Month_9 + 
    Month_10 + Month_11, data = cisco[1:403, ])

Residuals:
    Min      1Q  Median      3Q     Max 
-5.0602 -1.3046 -0.1273  1.4521  5.5295 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.404e+01  5.441e-01  62.554  < 2e-16 ***
Obs          4.868e-02  9.842e-04  49.457  < 2e-16 ***
Volume      -2.416e-08  1.153e-08  -2.095  0.03677 *  
Month_1     -4.060e-02  6.499e-01  -0.062  0.95023    
Month_2      4.656e-01  6.511e-01   0.715  0.47500    
Month_3      1.860e+00  5.825e-01   3.193  0.00152 ** 
Month_4      4.286e+00  5.460e-01   7.849 4.11e-14 ***
Month_5      4.819e+00  5.536e-01   8.706  < 2e-16 ***
Month_6      5.325e+00  5.418e-01   9.828  < 2e-16 ***
Month_7      4.960e+00  5.424e-01   9.146  < 2e-16 ***
Month_8      4.407e+00  5.448e-01   8.090 7.69e-15 ***
Month_9      1.422e+00  5.523e-01   2.574  0.01042 *  
Month_10    -1.728e+00  5.695e-01  -3.035  0.00257 ** 
Month_11    -3.077e+00  6.473e-01  -4.754 2.82e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.068 on 389 degrees of freedom
Multiple R-squared:  0.9015,    Adjusted R-squared:  0.8982 
F-statistic: 273.8 on 13 and 389 DF,  p-value: < 2.2e-16
# Prediction using 80% for train, 20% for test
pred.train <- predict(model, cisco[1:403,], interval = 'prediction')

pred.test <- predict(model, cisco[404:504,], level = 0.95, interval = 'prediction')

pred <- as.data.frame(pred.test)

pred$Actual <- cisco$Adj.Close[404:504]

pred2 <- as.data.frame(pred.train)

pred2$Actual <- cisco$Adj.Close[1:403]

final.pred <- rbind(pred2, pred)

# Visualizing Prediction against Actual Closing Prices 

plot(cisco$Obs, cisco$Adj.Close, col= 'red', type = 'l', xlab= "Days", ylab= 'Adjusted Closing Price', main= "CSCO, Forecast vs. Actual: Model 1")
lines(cisco$Obs, final.pred$fit, col= 'green', lty=2)
lines(cisco$Obs, final.pred$lwr, lty=2,  col= 'gray')
lines(cisco$Obs, final.pred$upr, lty=2, col='gray')



## Same process for Model 2 (without Volume)
model2 <- lm(Adj.Close ~ Obs + Month_1 + Month_2 + Month_3 + Month_4 + Month_5 + Month_6 + Month_7 + Month_8 + Month_9 + Month_10 + Month_11, data= cisco[1:403,])

pred.train2 <- predict(model2, cisco[1:403,], interval = 'prediction')

pred.test2 <- predict(model2, cisco[404:504,], level = 0.95, interval = 'prediction')

pred3 <- as.data.frame(pred.test2)

pred3$Actual <- cisco$Adj.Close[404:504]

pred4 <- as.data.frame(pred.train2)

pred4$Actual <- cisco$Adj.Close[1:403]

final.pred2 <- rbind(pred4, pred3)

plot(cisco$Obs, cisco$Adj.Close, col= 'red', type = 'l', xlab= "Days", ylab= 'Adjusted Closing Price', main= "CSCO, Forecast vs. Actual: Model 2")
lines(cisco$Obs, final.pred2$fit, col= 'green', lty=2)
lines(cisco$Obs, final.pred2$lwr, lty=2,  col= 'gray')
lines(cisco$Obs, final.pred2$upr, lty=2, col='gray')



## Testing the accuracy of both models
mod1 <- train(Adj.Close ~ Obs + Volume + Month_1 + Month_2 + Month_3 + Month_4 + Month_5 + Month_6 + Month_7 + Month_8 + Month_9 + Month_10 + Month_11, data= cisco[1:403,], method = "lm")
mod2 <- train(Adj.Close ~ Obs + Month_1 + Month_2 + Month_3 + Month_4 + Month_5 + Month_6 + Month_7 + Month_8 + Month_9 + Month_10 + Month_11, data= cisco[1:403,], method = "lm")

list <- list(mod1 = mod1, mod2 = mod2)
accuracy <- resamples(list)
summary(accuracy)

Call:
summary.resamples(object = accuracy)

Models: mod1, mod2 
Number of resamples: 25 

MAE 
         Min.  1st Qu.   Median     Mean  3rd Qu.     Max. NA's
mod1 1.605485 1.680337 1.726161 1.729170 1.778863 1.891144    0
mod2 1.581941 1.667239 1.727389 1.724524 1.778190 1.871096    0

RMSE 
         Min.  1st Qu.   Median     Mean  3rd Qu.     Max. NA's
mod1 1.964998 2.060981 2.112976 2.146359 2.216938 2.379242    0
mod2 1.975027 2.112218 2.153536 2.157368 2.211069 2.329747    0

Rsquared 
          Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
mod1 0.8641401 0.8876401 0.8959600 0.8914946 0.9004141 0.9110341    0
mod2 0.8766728 0.8876267 0.8926772 0.8919774 0.8962724 0.9050617    0
## Using Model 1 to Predict next Month (Last 30 days)

final.pred$Date <- cisco$Date
final.pred[475:504,]
NA
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCgpgYGB7cn0KbGlicmFyeShmYXN0RHVtbWllcykKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoY2FyZXQpCmxpYnJhcnkoZ2VuZXJpY3MpCgojIyBQcmVkaWN0aW5nICJDIiwgQ1NDTyBBZGp1c3RlZCBDbG9zaW5nIFByaWNlcwoKIyMgRGF0YSBmcm9tIENTQ08gY2xvc2luZyBwcmljZXMKY2lzY28gPC0gcmVhZC5jc3YoIkNTQ08uY3N2IiwgaGVhZGVyPVRSVUUpCgojIyBGb3JtYXQgRGF0ZSB2YXJpYWJsZSArIENyZWF0ZSBNb250aCBEdW1teQpjaXNjbyREYXRlIDwtIGFzLkRhdGUoY2lzY28kRGF0ZSwgZm9ybWF0ID0gYygnJW0vJWQvJVknKSkKY2lzY28kTW9udGggPC0gYXMuZmFjdG9yKG1vbnRoKGNpc2NvJERhdGUpKQpjaXNjbyA8LSBkdW1teV9jb2xzKGNpc2NvKQoKc3VtbWFyeShjaXNjbykKCiMjIEZpcnN0IFJlZ3Jlc3Npb24gTW9kZWwKbW9kZWwgPC0gbG0oQWRqLkNsb3NlIH4gT2JzICsgVm9sdW1lICsgTW9udGhfMSArIE1vbnRoXzIgKyBNb250aF8zICsgTW9udGhfNCArIE1vbnRoXzUgKyBNb250aF82ICsgTW9udGhfNyArIE1vbnRoXzggKyBNb250aF85ICsgTW9udGhfMTAgKyBNb250aF8xMSwgZGF0YT0gY2lzY29bMTo0MDMsXSkKCnN1bW1hcnkobW9kZWwpCgojIFByZWRpY3Rpb24gdXNpbmcgODAlIGZvciB0cmFpbiwgMjAlIGZvciB0ZXN0CnByZWQudHJhaW4gPC0gcHJlZGljdChtb2RlbCwgY2lzY29bMTo0MDMsXSwgaW50ZXJ2YWwgPSAncHJlZGljdGlvbicpCgpwcmVkLnRlc3QgPC0gcHJlZGljdChtb2RlbCwgY2lzY29bNDA0OjUwNCxdLCBsZXZlbCA9IDAuOTUsIGludGVydmFsID0gJ3ByZWRpY3Rpb24nKQoKcHJlZCA8LSBhcy5kYXRhLmZyYW1lKHByZWQudGVzdCkKCnByZWQkQWN0dWFsIDwtIGNpc2NvJEFkai5DbG9zZVs0MDQ6NTA0XQoKcHJlZDIgPC0gYXMuZGF0YS5mcmFtZShwcmVkLnRyYWluKQoKcHJlZDIkQWN0dWFsIDwtIGNpc2NvJEFkai5DbG9zZVsxOjQwM10KCmZpbmFsLnByZWQgPC0gcmJpbmQocHJlZDIsIHByZWQpCgojIFZpc3VhbGl6aW5nIFByZWRpY3Rpb24gYWdhaW5zdCBBY3R1YWwgQ2xvc2luZyBQcmljZXMgCgpwbG90KGNpc2NvJE9icywgY2lzY28kQWRqLkNsb3NlLCBjb2w9ICdyZWQnLCB0eXBlID0gJ2wnLCB4bGFiPSAiRGF5cyIsIHlsYWI9ICdBZGp1c3RlZCBDbG9zaW5nIFByaWNlJywgbWFpbj0gIkNTQ08sIEZvcmVjYXN0IHZzLiBBY3R1YWw6IE1vZGVsIDEiKQpsaW5lcyhjaXNjbyRPYnMsIGZpbmFsLnByZWQkZml0LCBjb2w9ICdncmVlbicsIGx0eT0yKQpsaW5lcyhjaXNjbyRPYnMsIGZpbmFsLnByZWQkbHdyLCBsdHk9MiwgIGNvbD0gJ2dyYXknKQpsaW5lcyhjaXNjbyRPYnMsIGZpbmFsLnByZWQkdXByLCBsdHk9MiwgY29sPSdncmF5JykKCgojIyBTYW1lIHByb2Nlc3MgZm9yIE1vZGVsIDIgKHdpdGhvdXQgVm9sdW1lKQptb2RlbDIgPC0gbG0oQWRqLkNsb3NlIH4gT2JzICsgTW9udGhfMSArIE1vbnRoXzIgKyBNb250aF8zICsgTW9udGhfNCArIE1vbnRoXzUgKyBNb250aF82ICsgTW9udGhfNyArIE1vbnRoXzggKyBNb250aF85ICsgTW9udGhfMTAgKyBNb250aF8xMSwgZGF0YT0gY2lzY29bMTo0MDMsXSkKCnByZWQudHJhaW4yIDwtIHByZWRpY3QobW9kZWwyLCBjaXNjb1sxOjQwMyxdLCBpbnRlcnZhbCA9ICdwcmVkaWN0aW9uJykKCnByZWQudGVzdDIgPC0gcHJlZGljdChtb2RlbDIsIGNpc2NvWzQwNDo1MDQsXSwgbGV2ZWwgPSAwLjk1LCBpbnRlcnZhbCA9ICdwcmVkaWN0aW9uJykKCnByZWQzIDwtIGFzLmRhdGEuZnJhbWUocHJlZC50ZXN0MikKCnByZWQzJEFjdHVhbCA8LSBjaXNjbyRBZGouQ2xvc2VbNDA0OjUwNF0KCnByZWQ0IDwtIGFzLmRhdGEuZnJhbWUocHJlZC50cmFpbjIpCgpwcmVkNCRBY3R1YWwgPC0gY2lzY28kQWRqLkNsb3NlWzE6NDAzXQoKZmluYWwucHJlZDIgPC0gcmJpbmQocHJlZDQsIHByZWQzKQoKcGxvdChjaXNjbyRPYnMsIGNpc2NvJEFkai5DbG9zZSwgY29sPSAncmVkJywgdHlwZSA9ICdsJywgeGxhYj0gIkRheXMiLCB5bGFiPSAnQWRqdXN0ZWQgQ2xvc2luZyBQcmljZScsIG1haW49ICJDU0NPLCBGb3JlY2FzdCB2cy4gQWN0dWFsOiBNb2RlbCAyIikKbGluZXMoY2lzY28kT2JzLCBmaW5hbC5wcmVkMiRmaXQsIGNvbD0gJ2dyZWVuJywgbHR5PTIpCmxpbmVzKGNpc2NvJE9icywgZmluYWwucHJlZDIkbHdyLCBsdHk9MiwgIGNvbD0gJ2dyYXknKQpsaW5lcyhjaXNjbyRPYnMsIGZpbmFsLnByZWQyJHVwciwgbHR5PTIsIGNvbD0nZ3JheScpCgoKIyMgVGVzdGluZyB0aGUgYWNjdXJhY3kgb2YgYm90aCBtb2RlbHMKbW9kMSA8LSB0cmFpbihBZGouQ2xvc2UgfiBPYnMgKyBWb2x1bWUgKyBNb250aF8xICsgTW9udGhfMiArIE1vbnRoXzMgKyBNb250aF80ICsgTW9udGhfNSArIE1vbnRoXzYgKyBNb250aF83ICsgTW9udGhfOCArIE1vbnRoXzkgKyBNb250aF8xMCArIE1vbnRoXzExLCBkYXRhPSBjaXNjb1sxOjQwMyxdLCBtZXRob2QgPSAibG0iKQptb2QyIDwtIHRyYWluKEFkai5DbG9zZSB+IE9icyArIE1vbnRoXzEgKyBNb250aF8yICsgTW9udGhfMyArIE1vbnRoXzQgKyBNb250aF81ICsgTW9udGhfNiArIE1vbnRoXzcgKyBNb250aF84ICsgTW9udGhfOSArIE1vbnRoXzEwICsgTW9udGhfMTEsIGRhdGE9IGNpc2NvWzE6NDAzLF0sIG1ldGhvZCA9ICJsbSIpCgpsaXN0IDwtIGxpc3QobW9kMSA9IG1vZDEsIG1vZDIgPSBtb2QyKQphY2N1cmFjeSA8LSByZXNhbXBsZXMobGlzdCkKc3VtbWFyeShhY2N1cmFjeSkKCiMjIFVzaW5nIE1vZGVsIDEgdG8gUHJlZGljdCBuZXh0IE1vbnRoIChMYXN0IDMwIGRheXMpCgpmaW5hbC5wcmVkJERhdGUgPC0gY2lzY28kRGF0ZQpmaW5hbC5wcmVkWzQ3NTo1MDQsXQoKYGBgCgoK