library(tidyverse)
library(readxl)
library(ggplot2)
library(lubridate)
library(forecast)
library(writexl)
library(tseries)
library(magrittr)

1, Data

Here is the bi-snnual electricity price in Malta (Euro / Kilowatt-hour) with all taxes and levies included, which is downloaded from https://ec.europa.eu/eurostat/data/database and https://www.statista.com/statistics/418104/electricity-prices-for-households-in-malta/. The data in 2008 and 2009 is missing.

head(ti)
ti %>%
  ggplot() +
    geom_line(mapping = aes(x = bi_annual, y = price)) +
    labs(
      title = "Bi-Annual Electricity Price in Malta",
      subtitle = "with All taxes and levies included from 2003f to 2009s",
      y = "Price (Euro / Kilowatt-hour)",
      x = "Index (Bi-Annual)"
      )

2, Linear Regression

acf(ti$price, na.action = na.pass)

pacf(ti$price, na.action = na.pass)

There is no obvious seasonal variation or fluctuation. So linear regression is used to model the trend. Then, arima model is used to remove the correlation in residuals.

lm <- lm(price ~ bi_annual, ti)
acf(lm$residuals)

pacf(lm$residuals)

3, ARIMA Model of Residuals from Linear Regression

mod_resi_lm <- auto.arima(lm$residuals)
mod_resi_lm
Series: lm$residuals 
ARIMA(1,0,0) with zero mean 

Coefficients:
         ar1
      0.8613
s.e.  0.0854

sigma^2 estimated as 0.0001835:  log likelihood=83.43
AIC=-162.87   AICc=-162.4   BIC=-160.13
acf(mod_resi_lm$residuals)

pacf(mod_resi_lm$residuals)

3, Forecast

Forecast is the combination of those from linear regression model and arima model.

pred_resi_lm <- predict(mod_resi_lm, n.ahead = 21 * 2)
pred_lm <- predict(
  lm, newdata = data.frame(bi_annual = seq(2019.5, 2019.5 + 20.5, by = 0.5))
  )
ti_fore <- ti %>%
  bind_rows(
    tibble(
      bi_annual = seq(2019.5, 2019.5 + 20.5, by = 0.5),
      price = as.numeric(pred_resi_lm$pred) + pred_lm,
      observation = rep(FALSE, length(pred_lm))
      )
    )
ti_fore %>%
  ggplot() +
    geom_line(mapping = aes(x = bi_annual, y = price, color = observation)) +
    labs(
      title = "Forecast of Bi-Annual Electricity Price in Malta",
      subtitle = "with all included from 19F to 40F using data from 03f to 09s",
      y = "Price (Euro / Kilo-Watt-Hour)",
      x = "Bi-Annual"
      )

4, Annual Averaged Price Forecast

ti_annual <-
  tibble(
    year = round(seq(2019 - 0.01, 2019 - 0.01 + 20.5, by = 0.5)), 
    price = c(0.1305, (pred_resi_lm$pred + pred_lm)[1:41]), bi = rep(1:2, 21)
    ) %>%
  spread(key = "bi", value = "price") %>%
  mutate(price_ave = (.$`1` + .$`2`) / 2) %>%
  select(year, price_ave)
ti_annual
LS0tCnRpdGxlOiAiRm9yZWNhc3QgQmktQW5udWFsIEVsZWN0cmljaXR5IFByaWNlIGluIE1hbHRhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKZGF0ZTogT2N0IDIwdGgsIDIwMTkKYXV0aG9yOiBFZHdhcmQgSi4gWHUgKDxlZHh1OTZAb3V0bG9vay5jb20+KQotLS0KCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9CnJtKGxpc3QgPSBscygpKQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgY29sbGFwc2UgPSBUUlVFLAogIGNvbW1lbnQgPSAiIz4iLAogIGZpZy5hbGlnbiA9ICJjZW50ZXIiLAogIGZpZy5hc3AgPSA5LzE2LAogIGZpZy53aWR0aCA9IDcsCiAgd2FybmluZyA9IEZBTFNFCikKYGBgCgpgYGB7ciwgd2FybmluZz1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGZvcmVjYXN0KQpsaWJyYXJ5KHdyaXRleGwpCmxpYnJhcnkodHNlcmllcykKbGlicmFyeShtYWdyaXR0cikKYGBgCgojIyAxLCBEYXRhCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KdGkgPC0KICByZWFkeGw6OnJlYWRfZXhjZWwoIn4vR2l0SHViL0VuZXJneVN0b3JhZ2UvZS1wcmljZS1mb3JlY2FzdC9lLXByaWNlLnhsc3giKSAlPiUKICBhcy5tYXRyaXgoKSAlPiUKICB0KCkgJT4lCiAge3RpYmJsZShiaV9hbm51YWwgPSBhcy5udW1lcmljKHJvd25hbWVzKC4pKSwgcHJpY2UgPSAuWywxXSl9ICU+JQogIG11dGF0ZShvYnNlcnZhdGlvbiA9IHJlcChUUlVFLCBsZW5ndGgoLiRiaV9hbm51YWwpKSkKCnRpWzE1OjIzLCAyXSA8LSBjKDE2LjQ3LCAxNi41MywgMTYuNTEsIDE2LjY2LCAxNi43MywgMTYuNzgsIDE2LjY0LCAxNi44OSwgMTQuNzQpIC8gMTAwCmBgYAoKSGVyZSBpcyB0aGUgYmktc25udWFsIGVsZWN0cmljaXR5IHByaWNlIGluIE1hbHRhIChFdXJvIC8gS2lsb3dhdHQtaG91cikgd2l0aCBhbGwgdGF4ZXMgYW5kIGxldmllcyBpbmNsdWRlZCwgd2hpY2ggaXMgZG93bmxvYWRlZCBmcm9tIDxodHRwczovL2VjLmV1cm9wYS5ldS9ldXJvc3RhdC9kYXRhL2RhdGFiYXNlPiBhbmQgPGh0dHBzOi8vd3d3LnN0YXRpc3RhLmNvbS9zdGF0aXN0aWNzLzQxODEwNC9lbGVjdHJpY2l0eS1wcmljZXMtZm9yLWhvdXNlaG9sZHMtaW4tbWFsdGEvPi4gVGhlIGRhdGEgaW4gMjAwOCBhbmQgMjAwOSBpcyBtaXNzaW5nLgoKYGBge3J9CmhlYWQodGkpCmBgYAoKYGBge3J9CnRpICU+JQogIGdncGxvdCgpICsKICAgIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSBiaV9hbm51YWwsIHkgPSBwcmljZSkpICsKICAgIGxhYnMoCiAgICAgIHRpdGxlID0gIkJpLUFubnVhbCBFbGVjdHJpY2l0eSBQcmljZSBpbiBNYWx0YSIsCiAgICAgIHN1YnRpdGxlID0gIndpdGggQWxsIHRheGVzIGFuZCBsZXZpZXMgaW5jbHVkZWQgZnJvbSAyMDAzZiB0byAyMDA5cyIsCiAgICAgIHkgPSAiUHJpY2UgKEV1cm8gLyBLaWxvd2F0dC1ob3VyKSIsCiAgICAgIHggPSAiSW5kZXggKEJpLUFubnVhbCkiCiAgICAgICkKYGBgCgojIyAyLCBMaW5lYXIgUmVncmVzc2lvbgoKYGBge3J9CmFjZih0aSRwcmljZSwgbmEuYWN0aW9uID0gbmEucGFzcykKYGBgCgpgYGB7cn0KcGFjZih0aSRwcmljZSwgbmEuYWN0aW9uID0gbmEucGFzcykKYGBgCgpUaGVyZSBpcyBubyBvYnZpb3VzIHNlYXNvbmFsIHZhcmlhdGlvbiBvciBmbHVjdHVhdGlvbi4gU28gbGluZWFyIHJlZ3Jlc3Npb24gaXMgdXNlZCB0byBtb2RlbCB0aGUgdHJlbmQuIFRoZW4sIGFyaW1hIG1vZGVsIGlzIHVzZWQgdG8gcmVtb3ZlIHRoZSBjb3JyZWxhdGlvbiBpbiByZXNpZHVhbHMuCgpgYGB7cn0KbG0gPC0gbG0ocHJpY2UgfiBiaV9hbm51YWwsIHRpKQpgYGAKCmBgYHtyfQphY2YobG0kcmVzaWR1YWxzKQpgYGAKCmBgYHtyfQpwYWNmKGxtJHJlc2lkdWFscykKYGBgCgojIyAzLCBBUklNQSBNb2RlbCBvZiBSZXNpZHVhbHMgZnJvbSBMaW5lYXIgUmVncmVzc2lvbgoKYGBge3J9Cm1vZF9yZXNpX2xtIDwtIGF1dG8uYXJpbWEobG0kcmVzaWR1YWxzKQptb2RfcmVzaV9sbQpgYGAKCmBgYHtyfQphY2YobW9kX3Jlc2lfbG0kcmVzaWR1YWxzKQpgYGAKCmBgYHtyfQpwYWNmKG1vZF9yZXNpX2xtJHJlc2lkdWFscykKYGBgCgojIyAzLCBGb3JlY2FzdAoKRm9yZWNhc3QgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIHRob3NlIGZyb20gbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgYW5kIGFyaW1hIG1vZGVsLgoKYGBge3J9CnByZWRfcmVzaV9sbSA8LSBwcmVkaWN0KG1vZF9yZXNpX2xtLCBuLmFoZWFkID0gMjEgKiAyKQpwcmVkX2xtIDwtIHByZWRpY3QoCiAgbG0sIG5ld2RhdGEgPSBkYXRhLmZyYW1lKGJpX2FubnVhbCA9IHNlcSgyMDE5LjUsIDIwMTkuNSArIDIwLjUsIGJ5ID0gMC41KSkKICApCgp0aV9mb3JlIDwtIHRpICU+JQogIGJpbmRfcm93cygKICAgIHRpYmJsZSgKICAgICAgYmlfYW5udWFsID0gc2VxKDIwMTkuNSwgMjAxOS41ICsgMjAuNSwgYnkgPSAwLjUpLAogICAgICBwcmljZSA9IGFzLm51bWVyaWMocHJlZF9yZXNpX2xtJHByZWQpICsgcHJlZF9sbSwKICAgICAgb2JzZXJ2YXRpb24gPSByZXAoRkFMU0UsIGxlbmd0aChwcmVkX2xtKSkKICAgICAgKQogICAgKQpgYGAKCmBgYHtyfQp0aV9mb3JlICU+JQogIGdncGxvdCgpICsKICAgIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSBiaV9hbm51YWwsIHkgPSBwcmljZSwgY29sb3IgPSBvYnNlcnZhdGlvbikpICsKICAgIGxhYnMoCiAgICAgIHRpdGxlID0gIkZvcmVjYXN0IG9mIEJpLUFubnVhbCBFbGVjdHJpY2l0eSBQcmljZSBpbiBNYWx0YSIsCiAgICAgIHN1YnRpdGxlID0gIndpdGggYWxsIGluY2x1ZGVkIGZyb20gMTlGIHRvIDQwRiB1c2luZyBkYXRhIGZyb20gMDNmIHRvIDA5cyIsCiAgICAgIHkgPSAiUHJpY2UgKEV1cm8gLyBLaWxvLVdhdHQtSG91cikiLAogICAgICB4ID0gIkJpLUFubnVhbCIKICAgICAgKQpgYGAKCiMjIDQsIEFubnVhbCBBdmVyYWdlZCBQcmljZSBGb3JlY2FzdAoKYGBge3J9CnRpX2FubnVhbCA8LQogIHRpYmJsZSgKICAgIHllYXIgPSByb3VuZChzZXEoMjAxOSAtIDAuMDEsIDIwMTkgLSAwLjAxICsgMjAuNSwgYnkgPSAwLjUpKSwgCiAgICBwcmljZSA9IGMoMC4xMzA1LCAocHJlZF9yZXNpX2xtJHByZWQgKyBwcmVkX2xtKVsxOjQxXSksIGJpID0gcmVwKDE6MiwgMjEpCiAgICApICU+JQogIHNwcmVhZChrZXkgPSAiYmkiLCB2YWx1ZSA9ICJwcmljZSIpICU+JQogIG11dGF0ZShwcmljZV9hdmUgPSAoLiRgMWAgKyAuJGAyYCkgLyAyKSAlPiUKICBzZWxlY3QoeWVhciwgcHJpY2VfYXZlKQpgYGAKCmBgYHtyfQp0aV9hbm51YWwKYGBgCgo=