22. Tidsrækker og ARIMA
En tidsrække er en række observationer registreret over tid. Lukkekursen
på Novo i 2023 kan beskrives som en tidsrække, hvor vi registrerer tiden – altså datoen – og lukkekursen.
ARIMA er et avanceret analyseværktøj til at analysere og forudsige
tidsrækker.
Vi vil her med eksempler beskrive, hvordan de
enkelte elementer i ARIMA rent praktisk fungerer.
ARIMA (AutoRegressive Integrated Moving Average)-modeller er udbredt inden for tidsserieanalyse til at forudsige fremtidige punkter i en tidsserie. Nedenstående tabel viser eksempler på, hvor ARIMA-modeller bruges:
| Sektor | Eksempel |
|---|---|
| Økonomi og Finans | Forudsige aktiekurser, aktieafkast eller markedsindekser (teknisk aktieanalyse) |
| Økonomi og Finans | Estimere fremtidige renter eller inflationsrater eller andre makroøkonomiske indikatorer. |
| Meteorologi | Forudsige temperatur, nedbør eller andre klimatiske variabler over tid |
| Energi | Forudsige el-forbruget |
| Energi | Estimere prisen på olie eller andre energikilder |
| Sundhedssektoren | Forudsige antallet af patientindlæggelser i sygehuse |
| Sundhedssektoren | Spore og forudsige spredningen af epidemier |
| Supply Chain Management | Forudsige efterspørgslen efter et produkt for bedre lagerstyring |
| Supply Chain Management | Estimere nødvendige råmaterialer over tid |
| Telekommunikation | Forudsige dataforbrug for at forbedre netværkskapacitet |
| E-handel | Forudsige besøgstal på en hjemmeside eller antal klik på en annonce |
Tabel 22.1: Eksempler på anvendelse af ARIMA-modeller til tidsrækkeforudsigelse inden for udvalgte sektorer — økonomi og finans, meteorologi, energi, sundhed, supply chain management, telekommunikation og e-handel.
Kilde: Egen tilvirkning.
Disse er blot nogle få eksempler. ARIMA-modeller er meget alsidige og kan anvendes på en lang række af tidsserier.
Moderne ML-baserede tidsrækkemodeller, fx LSTM/neurale netværk, bruges i stigende grad til algoritmisk handel og likviditetsprognoser som supplement til eller konkurrent mod ARIMA, særligt hvor sammenhængene i data er ikke-lineære.
AR står for AutoRegressive I står for Integrated MA står for Moving Average
Gennemgangen af tidsrækkeanalyse bygger meget på praktisk anvendelighed
(dvs. vi vil gerne kunne forudsige kursudviklingen), vi vil springe let hen
over teorien der kan være tung og er meget omfattende.
Lad os i de følgende afsnit, se på nogle simple eksempler for trinvis, at kunne
beskrive hvorledes modellen fungerer.
ARIMA(0,0,0)
Nedenfor kan du hente aktiekurser for 50 dage i filen ARIMA1.xlsx for en fiktiv aktie.
ARIMA1.xlsx Excel-filenVi vil nu undersøge om disse kan bruges til at forudsige noget om fremtidige aktiekurser. For at gøre dette, skal man importere Excelfilen, og copy paste kommandoen fra rammen nedenfor. Importer ARIMA1.xlsx til R via menuen File - Import Dataset - Excel. Nu skal datasættet rettes til en tidsserie med ts() kommandoen.
ARIMA1 <- ts(ARIMA1)
Vi kan nu plotte vore data i R.
plot.ts(ARIMA1, xlab='Tid', ylab = 'Kursdata')
Det er svært at se nogen tydelig udvikling i kursen.
Vi benytter auto.arima til at undersøge om der er en systematik i tidsserien, for at bruge denne funktion skal vi hente og loade pakken forecast med fx. pacman:
Funktionen auto.arima i R finder automatisk den ARIMA-model, der passer bedst til observationerne.
auto.arima(ARIMA1)
Output ARIMA(0,0,0) with non-zero mean, fortæller os at data er ligesom hvid støj. Den bedste forudsigelse af aktieprisen, vi kan komme med, er gennemsnittet af alle kurserne. Vi kan altså ikke forudsige prisen vha. vore fine værktøjer.
Akaike Information Criterion (AIC) og Bayesian Information Criterion (BIC) benyttes til at vælge den ARIMA-model, der har de laveste AIC- og BIC-værdier. auto.arima finder automatisk den bedste model.
Her er ligningen for aktiekursen, den bedste forudsigelse af den fremtidige kurs er den gennemsnitlige kurs der er observeret ovenfor.
$$\hat{Y_t}=19,8964$$
Variablen \( \hat{Y_t}\), kaldet Y hat t, angiver vort estimatEstimat betyder gæt.
Hvis vi har en stikprøve, hvor vi har målt 100 mænds højde til
gennemsnitligt 179 cm., er vores bedste gæt på middelhøjden i populationen
179 cm. Vi kan skrive vort estimat for μ er 179 cm.
Klik her for at lære mere om parametre og parameter-estimater! (gæt) på aktiekursen på tidspunkt \(t=1,2,3,... \)
. Der er således så lidt systematik i Data at her er tale om en ARIMA(0,0,0) model. Dette svarer til en vandret
linje ved \( \hat{Y_t}=19,8964\).Vi ser også at der står
“ARIMA(0,0,0) with non-zero mean” i output fra R.
ARIMA(1,0,0) eller AR(1) autoregression
En ARIMA(1,0,0)-model kan beskrives som en simpel lineær regressionsmodelLineær regression handler om at finde en simpel sammenhæng mellem to ting — fx temperatur (X) og issalg (Y). Hvor mange is sælger en kiosk, når temperaturen er 27 grader? Man samler data for temperaturer og issalg, tegner den bedste rette linje gennem punkterne — og aflæser svaret. Det er lineær regression.
Ved multipel lineær regression bruger man flere X-variable samtidig — fx både temperatur, ugedag og om det er ferie — for at forudsige Y (issalget) mere præcist.
Klik
her for at lære mere om lineær regressionsanalyse!, hvor X-variablen er Y-variablen fra en
periode før
(fx. måneden, dagen eller sekundet før).
Vi beregner estimaterneEstimat betyder gæt.
Hvis vi har en stikprøve, hvor vi har målt 100 mænds højde til
gennemsnitligt 179 cm., er vores bedste gæt på middelhøjden i populationen
179 cm. Vi kan skrive vort estimat for μ er 179 cm.
Klik her for at lære mere om parametre og parameter-estimater! i den lineære regressionsmodel vha. OLSMindste kvadraters metode (OLS — Ordinary Least Squares) finder den bedste rette linje gennem datapunkter ved
at minimere summen af de kvadrerede afstande fra punkterne til linjen.
Adrien-Marie Legendre publicerede metoden først i 1805; Carl Friedrich Gauss hævdede at have brugt den
allerede fra 1795, men offentliggjorde først sin udgave i 1809. Metoden er stadig grundlaget for lineær
regression og mange AI-modeller — hvert lag i et neuralt netværk er i bund og grund en lineær
regression.
Klik her for at lære mere om
lineær regression i kapitel 11!-metoden (mindste kvadraters metodeMindste kvadraters metode (OLS — Ordinary Least Squares) finder den bedste rette linje gennem datapunkter ved
at minimere summen af de kvadrerede afstande fra punkterne til linjen.
Adrien-Marie Legendre publicerede metoden først i 1805; Carl Friedrich Gauss hævdede at have brugt den
allerede fra 1795, men offentliggjorde først sin udgave i 1809. Metoden er stadig grundlaget for lineær
regression og mange AI-modeller — hvert lag i et neuralt netværk er i bund og grund en lineær
regression.
Klik her for at lære mere om
lineær regression i kapitel 11!).
I ARIMA-modeller benytter vi en metode, der hedder MLE – Maximum Likelihood-estimationsmetodenEstimat betyder gæt.
Hvis vi har en stikprøve, hvor vi har målt 100 mænds højde til
gennemsnitligt 179 cm., er vores bedste gæt på middelhøjden i populationen
179 cm. Vi kan skrive vort estimat for μ er 179 cm.
Klik her for at lære mere om parametre og parameter-estimater! – som ikke gennemgås
nærmere her. EstimaterneEstimat betyder gæt.
Hvis vi har en stikprøve, hvor vi har målt 100 mænds højde til
gennemsnitligt 179 cm., er vores bedste gæt på middelhøjden i populationen
179 cm. Vi kan skrive vort estimat for μ er 179 cm.
Klik her for at lære mere om parametre og parameter-estimater! ved de 2 metoder bliver nogenlunde ens.
En ARIMA(1,0,0) model kan skrives som:
$$ \hat{Y_t}=c+\phi Y_{t-1} $$
Vi kan forklare, at $\hat{Y_{t}}$ er værdien for tidsrækken på tidspunkt $t$, ud fra en konstant $c$ plus en faktor $ϕ$, der ganges på værdien for tidsrækken på tidspunkt $t-1$. For at bestemme c skal vi kende tidsrækkens sande middelværdi $\mu$ og $ϕ$, disse værdier kan R beregne for os. Vi kan så beregne konstanten $c=(1-ϕ)⋅\mu$. Det betyder så at vi kan estimere fremtidige værdier for tidsrækken.
Vi har nu et eksempel, hvor den sande middelværdi for tidsrækken er $\mu=100$ og $ϕ=0{,}5$ for en ARIMA(1,0,0)-model. Så kan vi beregne konstanten $c=(1-ϕ)⋅\mu=(1-0{,}5)⋅100=50$. Ligningen for modellen kan så skrives som:
$$\hat{Y_{t}}=c+ϕY_{t-1}⇔\hat{Y_{t}}=50+0{,}5Y_{t-1}$$
$ϕ$ fortæller, at hvis kursen dagen før var 80, og gennemsnitskursen er 100, vil kursen i morgen $t=1$ ifølge modellen være forudsagt som: $$50+0{,}5⋅80=90$$ Dagen efter $t=2$ vil kursen så være forudsagt til: $$50+0{,}5⋅90=95$$ Om 3 dage dvs. $t=3$ vil kursen så være forudsagt til: $$50+0{,}5⋅95=97{,}5$$ Om 4 dage dvs. $t=4$ vil kursen så være forudsagt til: $$50+0{,}5⋅97{,}5=98{,}75$$
Osv.
Vi siger, at forudsagte værdier konvergerer mod (dvs. nærmer sig) $\mu=100$.
AR i ARIMA, står for autoregression, selv-regression mod middelværdien, i eksemplet så vi hvordan værdien nærmer sig 100, hvis vi forudsiger flere dages kurser kan vi se dette.
$ϕ$ må kun antage værdier mellem -1 og 1 (og ikke være lig med disse grænseværdier), hvilket betyder, at modellen er stationær og derfor nærmer sig den sande middelværdi $\mu$.
Hvad vil der ske hvis $\mu=100$ og $ϕ=-0{,}5$ for en ARIMA(1,0,0) model (husk $c=(1-ϕ)⋅\mu$ når man skal bestemme modellen)?
Hent ARIMA2.xlsx Excel-filen herunder. Importer ARIMA2.xlsx til R via menuen File - Import Dataset - Excel. Nu skal datasættet rettes til en tidsserie med ts() kommandoen.
ARIMA2.xlsx Excel-filenVi kan nu plotte vore data i R.
plot.ts(ARIMA2, xlab='Tid ARIMA2', ylab = 'Kursdata ARIMA2')
Figur 22.1: ARIMA2 tidsserie (n = 50) — en fiktiv aktiekurs, hvor auto.arima efterfølgende afslører 1. ordens autoregression (ARIMA(1,0,0)). Hold musen over punkterne for tidspunkt og kurs.
Kilde: Egen tilvirkning.
Her afslører auto.arima 1. ordens autoregression dvs.
Modellen kan skrives som.
$$\hat{Y_{t}}=c+ϕY_{t-1}⇔$$
$$\hat{Y_{t}}=(1-0{,}3664)⋅103{,}2372+0{,}3664Y_{t-1}⇔$$
$$\hat{Y_{t}}=65{,}4125+0{,}3664Y_{t-1}$$
Vi ser nu igen på vores eksempel med ARIMA2. Vi kan nu i R forudsige aktiekursen 12 perioder frem med forecast-funktionen fra forecast-pakken:
Husk at loade pakken forecast før du benytter forecast-funktionen, forecast-pakken benyttes også til auto.arima funktionen., man kan angive hvor mange perioder frem man ønsker forudsigelsen med fx. h=12 som herunder:
forecast(auto.arima(ARIMA2), h = 12)
Bemærk vi får både forudsagte kurser samt nedre og øvre grænser for 80% og
95% konfidensintervallerKonfidensintervallet beregnes ud fra en stikprøve, og angiver nedre og
øvre grænser indenfor hvilke populations parameteren, ligger med en vis
sandsynlighed.
Er 95% konfidensintervallet for mænds gennemsnitlige højde fx. 172 cm.
og 182 cm. kan vi sige:
Vi kan med 95% sandsynlighed sige den gennemsnitlige højde for mænd i
populationen, ligger mellem 172 cm. og 182 cm.
Jo større stikprøve og jo lavere sikkerhed (konfidensniveau), jo mere
præcist bliver vore konfidensinterval (interval estimatet), dvs
intervallet bliver smallere.
Vi kan beregne konfidensintervaller for parametre vi estimerer, fx.
gennemsnittet, standardafvigelsen, andelen etc.
I modsætning til et punktestimat for fx. middelværdien, fortæller
konfidensintervallet os noget om kvaliteten af vort estimat/gæt, ud fra
bredden af konfidensintervallet.
Klik her for at
lære mere om konfidensintervallet!
.
Vi forudsiger altså, at kursen er 105,3673 til tid 51.
Vi kan med 80% sandsynlighed sige, at kursen til tid 51 ligger mellem 90,84985 og 119,8848.
Vi kan med 95% sandsynlighed sige, at kursen til tid 51 ligger mellem 83,16476 og 127,5699, bemærk det højere
konfidensniveauKonfidensniveauet 1-α angiver sandsynligheden for ikke at forkaste en sand
nulhypotese dvs. korrekt beslutning.
Man kan bestemme konfidensniveauet som 1-α dvs. 1 minus
signifikansniveauet.
Dvs. summen af signifikansniveauet og konfidensniveauet giver altid 1
eller 100%
Klik her
for at lære mere om konfidensniveauet! medfører mindre præcision i form af et bredere konfidensintervalKonfidensintervallet beregnes ud fra en stikprøve, og angiver nedre og
øvre grænser indenfor hvilke populations parameteren, ligger med en vis
sandsynlighed.
Er 95% konfidensintervallet for mænds gennemsnitlige højde fx. 172 cm.
og 182 cm. kan vi sige:
Vi kan med 95% sandsynlighed sige den gennemsnitlige højde for mænd i
populationen, ligger mellem 172 cm. og 182 cm.
Jo større stikprøve og jo lavere sikkerhed (konfidensniveau), jo mere
præcist bliver vore konfidensinterval (interval estimatet), dvs
intervallet bliver smallere.
Vi kan beregne konfidensintervaller for parametre vi estimerer, fx.
gennemsnittet, standardafvigelsen, andelen etc.
I modsætning til et punktestimat for fx. middelværdien, fortæller
konfidensintervallet os noget om kvaliteten af vort estimat/gæt, ud fra
bredden af konfidensintervallet.
Klik her for at
lære mere om konfidensintervallet!
.
ARIMA(0,1,0) eller I(1) Integrated
Hvis en serie er ikke-stationær (en der ikke nærmer sig en bestemt middelværdi), er den simpleste model en random walk uden drift.
$$\hat{Y_{t}}-Y_{t-1}=0⇔\hat{Y_{t}}=Y_{t-1}+0$$ Dette betyder vi bedst kan forudsige Y ved værdien perioden før.
En ikke-stationær serie med en konstant trend, en såkaldt random walk med drift, kan skrives som:
$$\hat{Y_{t}}-Y_{t-1}=\mu⇔\hat{Y_{t}}=Y_{t-1}+\mu$$ Dette betyder, at Y ændrer sig konstant med $\mu$ i hver periode. Drift betyder, at tidsrækken ændrer sig med et fast beløb pr. periode (stiger, hvis $\mu$ er positiv).
Forestiller man sig en ARIMA(0,1,0) med drift 10 og en kurs på tidspunkt t-1 på 120, vil vi forudsige en kurs på 130 ved tid t og 140 ved tid t+1 osv. Vi kan opskrive modellen som: $$\hat{Y_{t}}-Y_{t-1}=10⇔\hat{Y_{t}}=Y_{t-1}+10$$
Hent ARIMA3.xlsx Excel-filen herunder, filen indeholder 51 perioders historiske aktiekurser.
Importer ARIMA3.xlsx til R via menuen File - Import Dataset - Excel.
Nu skal datasættet rettes til en tidsserie med ts() kommandoen.
Modellen ovenfor kan skrives som: $$\hat{Y_{t}}-Y_{t-1}=\mu⇔\hat{Y_{t}}-Y_{t-1}=7{,}9⇔\hat{Y_{t}}=Y_{t-1}+7{,}9$$ Vi indsætter drift i stedet for $\mu$. Tolkningen er, at modellen forudsiger, at aktiekursen stiger med 7,9 fra periode til periode.
Hvis vi har en ren random walk model uden drift dvs. med $\mu=0$ ARIMA(0,1,0) for en aktiekurs, forventer vi at kursen til tid t vil være den samme som til tid t-1. Denne kan skrives som:
$$\hat{Y_{t}}-Y_{t-1}=0$$
Vi kan forecaste med forecast-funktionen som vi så tidligere.
Forecast funktionen er mere stabil end predict, men vi skal huske at have loaded pakken forecast, man kan angive hvor mange perioder frem man ønsker forudsigelsen med h=12 :
forecast(auto.arima(ARIMA3), h = 12)
Vi får både forudsagte kurser samt nedre og øvre grænser for 80% og 95%
konfidensintervallerKonfidensintervallet beregnes ud fra en stikprøve, og angiver nedre og
øvre grænser indenfor hvilke populations parameteren, ligger med en vis
sandsynlighed.
Er 95% konfidensintervallet for mænds gennemsnitlige højde fx. 172 cm.
og 182 cm. kan vi sige:
Vi kan med 95% sandsynlighed sige den gennemsnitlige højde for mænd i
populationen, ligger mellem 172 cm. og 182 cm.
Jo større stikprøve og jo lavere sikkerhed (konfidensniveau), jo mere
præcist bliver vore konfidensinterval (interval estimatet), dvs
intervallet bliver smallere.
Vi kan beregne konfidensintervaller for parametre vi estimerer, fx.
gennemsnittet, standardafvigelsen, andelen etc.
I modsætning til et punktestimat for fx. middelværdien, fortæller
konfidensintervallet os noget om kvaliteten af vort estimat/gæt, ud fra
bredden af konfidensintervallet.
Klik her for at
lære mere om konfidensintervallet!
.
Vi kan også danne et plot af vor 12 perioders forecast efter periode 50, dette kan vi gøre med koden herunder:
plot(forecast(auto.arima(ARIMA3), h = 12))
Bemærk den blå linje fra periode 51 til ovenfor er vores forecast, det mørkegrå areal er 80% konfidensbæltet, det lysegrå areal er 95% konfidensbæltet.
ARIMA(0,0,1) eller MA(1) Moving average
I stedet for at bruge tidligere aktiekurser til at forudsige aktiekursen kan vi benytte tidligere
målefejl (residualerResidualen er forskellen mellem faktisk Y værdi og forudsagt Y værdi i den
lineære regressionsanalyse.
Antag fx man bruger X-variablen kvm. til at forudsige Y-variablen
ejendomspriser.
En ejendom er faktisk til salg for 4 mio, men den lineære
regressionsmodel forudsiger at en 100 kvm ejendom skal koste 5 mio. Da
bliver residualen faktisk - forudsagt = 4 - 5 = -1, prisen på ejendommen
er altså 1 mio. under den ifølge modellen forventede pris.
Klik
her for at lære mere om lineær regressionsanalyse!) til at forudsige kursen.
Modellen kan skrives som:
$$\hat{Y_{t}}=\mu+θ_{1}e_{t-1}$$ Hvis vi forestiller os $\mu=50$, $θ_{1}=0{,}5$, kursen til tid t-1 var 120, og forudsigelsen til tid t-1 var 100, så målefejlen til tid t-1, $e_{t-1}$, er faktisk kurs minus forudsagt kurs, altså 120-100=20. Nu kan vi forudsige kursen til tid t som: $$\hat{Y_{t}}=\mu+θ_{1}e_{t-1}⇔\hat{Y_{t}}=50+0{,}5⋅20=60$$
Hent ARIMA4.xlsx Excel-filen herunder. Importer ARIMA4.xlsx til R via menuen File - Import Dataset - Excel. Nu skal datasættet rettes til en tidsserie med ts() kommandoen.
ARIMA4.xlsx Excel-filen
Vi kan nu forudsige aktiekursen 12 perioder frem med predict:
forecast(auto.arima(ARIMA4), h = 12)
Bemærk her bliver forecast værdien det samme fra tid 52 og frem, når vi skal finde residualenResidualen er forskellen mellem faktisk Y værdi og forudsagt Y værdi i den
lineære regressionsanalyse.
Antag fx man bruger X-variablen kvm. til at forudsige Y-variablen
ejendomspriser.
En ejendom er faktisk til salg for 4 mio, men den lineære
regressionsmodel forudsiger at en 100 kvm ejendom skal koste 5 mio. Da
bliver residualen faktisk - forudsagt = 4 - 5 = -1, prisen på ejendommen
er altså 1 mio. under den ifølge modellen forventede pris.
Klik
her for at lære mere om lineær regressionsanalyse!, skal vi bestemme
forskellen mellem faktisk og forudsagt, men vi havde jo kun en faktisk kurs til tid 50, derfor bliver residualerneResidualen er forskellen mellem faktisk Y værdi og forudsagt Y værdi i den
lineære regressionsanalyse.
Antag fx man bruger X-variablen kvm. til at forudsige Y-variablen
ejendomspriser.
En ejendom er faktisk til salg for 4 mio, men den lineære
regressionsmodel forudsiger at en 100 kvm ejendom skal koste 5 mio. Da
bliver residualen faktisk - forudsagt = 4 - 5 = -1, prisen på ejendommen
er altså 1 mio. under den ifølge modellen forventede pris.
Klik
her for at lære mere om lineær regressionsanalyse!
0. Vores bedste gæt på faktisk kurs er vores forudsagte kurs, så differencerne bliver 0.
ARIMA af højere orden
ARIMA(2,0,0)
ARIMA-modeller kan afhænge af flere tidligere perioder, fx kan ligningen for ARIMA(2,0,0) eller AR(2) opskrives som:
$$\hat{Y_{t}}=c+ϕ_{1}Y_{t-1}+ϕ_{2}Y_{t-2}$$ Modellen afhænger altså af 2 tidligere perioder (lags) og ikke en. Man betegner dette som en model med lag 2.
Hent ARIMA5.xlsx Excel-filen herunder, filen indeholder salgsdata for 118 perioder.
Importer ARIMA5.xlsx til R via menuen File - Import Dataset - Excel. Nu skal datasættet rettes til en tidsserie med ts() kommandoen, før vi benytter auto.arima kommandoen.
ts.plot(ARIMA5)
auto.arima(ARIMA5)
forecast(auto.arima(ARIMA5), h = 12)
plot(forecast(auto.arima(ARIMA5), h = 12))
Herunder ses plottet for 118 historiske og 12 forudsagte salg:
ARIMA(0,1,3)
ARIMA-modeller kan indeholde flere forskellige elementer med lag, som fx.
ARIMA(0,1,3).
Hent ARIMA6.xlsx Excel-filen herunder, filen indeholder historiske salgsdata for 120 perioder.
Importer ARIMA6.xlsx til R via menuen File - Import Dataset - Excel. Nu skal datasættet rettes til en tidsserie med ts() kommandoen, før vi benytter auto.arima kommandoen.
ts.plot(ARIMA6)
auto.arima(ARIMA6)
forecast(auto.arima(ARIMA6), h = 24)
plot(forecast(auto.arima(ARIMA6), h = 24))
Herunder ses plottet for 120 historiske og 24 forudsagte salg:
ARIMA og sæsonalitet
Hvis fx. en aktie handles lavere om fredagen, kan ARIMA-modellerne korrigere for dette ved sæsonkorrektion. I sæsonkorrigerede modeller vises dette som en ekstra vektor med 3 tal for hhv. sæsonkorrigeret AR eller SAR, sæsonkorrigeret I eller SI og sæsonkorrigeret MA eller SMA. En model som ARIMA(1,0,0)(1,0,0) har altså udover AR også en sæsonkomponent.
ARIMA eksempler
Traktorer
Hent følgende data for månedligt traktor salg fra januar 2003 til december 2014, med følgende kommandoer i R,
bemærk her
hentes ikke en Excelfil, derimod findes en csv fil på nettet, der kan læses direkte ind i R med read.csv
kommandoen.
Traktor datasættet er 2 søjler med datoer og salget. Her udelader vi datoer og omdanner kun salget i søjle 2 til
en tidsserie vha. data[,2] R-kommandoen der kun tager 2. søjle. I ts kommandoen angiver vi
starten på
tidsserien
start = c(2003,1)
og hyppigheden dvs. frequency=12 fordi vi har 12 måneder pr. år.
data = read.csv('http://ucanalytics.com/blogs/wp-content/uploads/2015/06/Tractor-Sales.csv')
data = ts(data[,2],start = c(2003,1),frequency = 12)
Vi ser, at salget er voksende over tid, og der er ligeledes en sæsonkomponent. Det er her også vigtigt at
bemærke, at variansen stiger – der bliver større forskel mellem årets gode og dårlige måneder. I 2003 er der
ikke særlig stor variation i forhold til i 2014, og der er derfor ikke varianshomogenitetVarianshomogenitet betyder der er ens varianser for populationerne.
Hvis fx. vi har 2 stikprøver med højder for CBS og Cphbusiness
studerende, vil varianshomogenitet betyde, at der er samme variation i
de 2 populationer.
Testet kunne se ud som nedenfor, bemærk er der varianshomogenitet, er
standardafvigelserne også altid ens.
H0: σCBS=σCph (Der er
Varianshomogenitet)
H1: σCBS≠σCph (Der er ikke
varianshomogenitet)
Klik her
for
at lære mere om varianshomogenitet!. For at sikre, at
auto.arima finder den bedste model, bør vi sikre varianshomogenitetVarianshomogenitet betyder der er ens varianser for populationerne.
Hvis fx. vi har 2 stikprøver med højder for CBS og Cphbusiness
studerende, vil varianshomogenitet betyde, at der er samme variation i
de 2 populationer.
Testet kunne se ud som nedenfor, bemærk er der varianshomogenitet, er
standardafvigelserne også altid ens.
H0: σCBS=σCph (Der er
Varianshomogenitet)
H1: σCBS≠σCph (Der er ikke
varianshomogenitet)
Klik her
for
at lære mere om varianshomogenitet!. Det kan vi gøre ved at tage
titalslogaritmen af data. Det betyder, at vi senere skal huske at transformereTransformer-arkitekturen er den struktur, moderne sprogmodeller bygger på. Den kan behandle hele sætninger på
én gang i stedet for ord for ord, hvilket gør træningen meget hurtigere.
Google-forskere introducerede arkitekturen i 2017. Alle moderne sprogmodeller — inklusive ChatGPT, Claude og
Gemini — bygger på denne idé.
Klik her for at
læse mere om transformer i kapitel 1! data tilbage ved at opløfte 10 i
data'ende potens.
plot(data, xlab='Years', ylab = 'Tractor Sales')
Vi log-transformererTransformer-arkitekturen er den struktur, moderne sprogmodeller bygger på. Den kan behandle hele sætninger på
én gang i stedet for ord for ord, hvilket gør træningen meget hurtigere.
Google-forskere introducerede arkitekturen i 2017. Alle moderne sprogmodeller — inklusive ChatGPT, Claude og
Gemini — bygger på denne idé.
Klik her for at
læse mere om transformer i kapitel 1! data for at sikre stationaritet mht. varians. Læg mærke til, at der nu er samme variation i
alle årene. Vi kan se, at den log-transformeredeTransformer-arkitekturen er den struktur, moderne sprogmodeller bygger på. Den kan behandle hele sætninger på
én gang i stedet for ord for ord, hvilket gør træningen meget hurtigere.
Google-forskere introducerede arkitekturen i 2017. Alle moderne sprogmodeller — inklusive ChatGPT, Claude og
Gemini — bygger på denne idé.
Klik her for at
læse mere om transformer i kapitel 1! y-skala har en anden skala, som vi skal huske at rette tilbage
inden vi tolker på tallene.
Vi finder bedste model med auto.arima, når der er stationaritet/varianshomogenitet, dvs. efter vi har taget log10
af data. For at sikre højst mulige præcision, benytter vi her parameterenEn parameter betegner en ukendt konstant i en statistisk model eller
formel, ud fra en stikprøve estimeres (gættes kvalificeret på) dens
værdi.
En parameter kan fx. være β, μ, p, σ etc.
Vi ønsker at udtale os om danske mænds højde, populationen er så danske
mænd. Stikprøve gennemsnittet for fx. 100 mænds højde 179,34 cm. er
parameter estimatet (gættet på middelværdien i populationen). Den sande
ukendte parameter i populationen er altså middelhøjden i populationen
μ
I AI-sammenhæng bruges ordet parametre om de tal modellen justerer under træning — som knapper på et kæmpe
regneapparat. GPT-1 havde 117 millioner parametre; de største modeller anslås til billioner.
Flere parametre = modellen kan skelne mellem flere sproglige mønstre — men det koster eksponentielt mere at
træne.
Klik her for at lære mere om parametre og parameter-estimater! approximation=FALSE,
auto.arima algoritmen arbejder langsommere men mere præcist, da tidsrækken er rimeligt avanceret er dette at
foretrække.
library(forecast)
ARIMAfit = auto.arima(log10(data), approximation=FALSE)
ARIMAfit
Nu kan vi forudsige kommende traktor salg, vha. ARIMA(0,1,1)(0,1,1)[12] modellen, der netop har
afsløret en
sæsonkomponent.
Vi benytter nu forecast for at forudsige traktorsalget 3 år dvs. 36 perioder/måneder.
Inden vi aflæser salget skal både historiske, forudsagte og nedre og øvre grænser transformeresTransformer-arkitekturen er den struktur, moderne sprogmodeller bygger på. Den kan behandle hele sætninger på
én gang i stedet for ord for ord, hvilket gør træningen meget hurtigere.
Google-forskere introducerede arkitekturen i 2017. Alle moderne sprogmodeller — inklusive ChatGPT, Claude og
Gemini — bygger på denne idé.
Klik her for at
læse mere om transformer i kapitel 1! tilbage fra log10,
dvs. vi opløfter data med grundtal 10:
# Vi forecaster:
forecast <- forecast(ARIMAfit, h = 36)
# transformer log10 tilbage til oprindelige værdier:
forecast$x <- 10^forecast$x
forecast$mean <- 10^forecast$mean
forecast$lower <- 10^forecast$lower
forecast$upper <- 10^forecast$upper
forecast
Her ses output, forudsagt traktorsalg de næste 3 år, inklusiv konfidensintervallerKonfidensintervallet beregnes ud fra en stikprøve, og angiver nedre og
øvre grænser indenfor hvilke populations parameteren, ligger med en vis
sandsynlighed.
Er 95% konfidensintervallet for mænds gennemsnitlige højde fx. 172 cm.
og 182 cm. kan vi sige:
Vi kan med 95% sandsynlighed sige den gennemsnitlige højde for mænd i
populationen, ligger mellem 172 cm. og 182 cm.
Jo større stikprøve og jo lavere sikkerhed (konfidensniveau), jo mere
præcist bliver vore konfidensinterval (interval estimatet), dvs
intervallet bliver smallere.
Vi kan beregne konfidensintervaller for parametre vi estimerer, fx.
gennemsnittet, standardafvigelsen, andelen etc.
I modsætning til et punktestimat for fx. middelværdien, fortæller
konfidensintervallet os noget om kvaliteten af vort estimat/gæt, ud fra
bredden af konfidensintervallet.
Klik her for at
lære mere om konfidensintervallet!
:
plot(forecast,xlab = "Tid",ylab = "Traktorsalg")
Bemærk hvor præcist og flot vor ARIMA-model rent matematisk har forudsagt salget. Konfidensbælterne mørkegrå 80% og lysegrå 95% øges, jo længere ude i fremtiden vi er, da usikkerheden stiger.
Detail debet card forbrug på Island (millioner ISK).
Vi henter en R-pakke, der hedder fpp. Den indeholder data for månedlige køb i detailhandelen med debitkort på Island for årene 2000 til 2012 målt i millioner islandske kroner. Disse data er interessante, da Island i lighed med Danmark i perioden oplever stigende kortbrug frem for kontanter. Bemærk også sæsonfaktoren forbundet med stigende køb ved juletid.
# Installer fpp pakken
install.packages("fpp")
# Load fpp pakken
library(fpp)
# Gemmer debitcards som data
data <- debitcards
# plot data for køb på debitkort
plot(data)
Vi kan se at variationen er stigende, vi bør derfor log10 transformereTransformer-arkitekturen er den struktur, moderne sprogmodeller bygger på. Den kan behandle hele sætninger på
én gang i stedet for ord for ord, hvilket gør træningen meget hurtigere.
Google-forskere introducerede arkitekturen i 2017. Alle moderne sprogmodeller — inklusive ChatGPT, Claude og
Gemini — bygger på denne idé.
Klik her for at
læse mere om transformer i kapitel 1! for at sikre stationaritet, inden vi
bestemmer ARIMA-modellen.
plot(log10(data))
Vi finder bedste model med auto.arima, når der er stationaritet/varianshomogenitet, dvs. efter vi har taget log10
af data. For at sikre højst mulige præcision, benytter vi her parameterenEn parameter betegner en ukendt konstant i en statistisk model eller
formel, ud fra en stikprøve estimeres (gættes kvalificeret på) dens
værdi.
En parameter kan fx. være β, μ, p, σ etc.
Vi ønsker at udtale os om danske mænds højde, populationen er så danske
mænd. Stikprøve gennemsnittet for fx. 100 mænds højde 179,34 cm. er
parameter estimatet (gættet på middelværdien i populationen). Den sande
ukendte parameter i populationen er altså middelhøjden i populationen
μ
I AI-sammenhæng bruges ordet parametre om de tal modellen justerer under træning — som knapper på et kæmpe
regneapparat. GPT-1 havde 117 millioner parametre; de største modeller anslås til billioner.
Flere parametre = modellen kan skelne mellem flere sproglige mønstre — men det koster eksponentielt mere at
træne.
Klik her for at lære mere om parametre og parameter-estimater! approximation=FALSE,
auto.arima
algoritmen arbejder langsommere men mere præcist, da tidsrækken er rimeligt avanceret er dette at foretrække.
library(forecast)
ARIMAfit = auto.arima(log10(data), approximation=FALSE)
ARIMAfit
Nu kan vi forudsige de kommende 2 års omsætning på debetkort med ARIMA-modellen. Vi husker at transformereTransformer-arkitekturen er den struktur, moderne sprogmodeller bygger på. Den kan behandle hele sætninger på
én gang i stedet for ord for ord, hvilket gør træningen meget hurtigere.
Google-forskere introducerede arkitekturen i 2017. Alle moderne sprogmodeller — inklusive ChatGPT, Claude og
Gemini — bygger på denne idé.
Klik her for at
læse mere om transformer i kapitel 1! tilbage.
# Vi forecaster:
forecast <- forecast(ARIMAfit, h = 24)
# transformer log10 tilbage til oprindelige værdier:
forecast$x <- 10^forecast$x
forecast$mean <- 10^forecast$mean
forecast$lower <- 10^forecast$lower
forecast$upper <- 10^forecast$upper
forecast
Forudsagt brug af debetkort de næste 24 måneder bliver:
Julehandelen i december 2014 er således ifølge modellen forudsagt til at være på 30.948 mio ISK dvs. 30,9 mia
ISK, hvilket svarede til cirka 1,47 mia DKK.
Vi plotter nu historiske og forudsagt omsætning på debetkort på Island, bemærk vi har transformeretTransformer-arkitekturen er den struktur, moderne sprogmodeller bygger på. Den kan behandle hele sætninger på
én gang i stedet for ord for ord, hvilket gør træningen meget hurtigere.
Google-forskere introducerede arkitekturen i 2017. Alle moderne sprogmodeller — inklusive ChatGPT, Claude og
Gemini — bygger på denne idé.
Klik her for at
læse mere om transformer i kapitel 1! tilbage
ovenfor.
plot(forecast,xlab = "Tid",ylab = "Salg Debetkort")
Teknisk aktieanalyse
Man kan hente online aktiekurser med quantmod pakken installer denne med
fx. pacman, vi skal også bruge pakken forecast som vi ligeledes henter. Vi
henter nedenfor Google aktiedata. Husk hvis man bruger Sys.date får man ikke samme model da dags dato ikke er den
samme, som da 27/12 2023 da dette er skrevet.
Vi ser her kun på Google aktiedata for 2023 herunder.
# Vi loader pakkerne quantmod og forecast
pacman::p_load(quantmod, forecast)
# Vi henter Google aktiedata fra 2023-01-01 til dags dato
# getSymbols.warning4.0=FALSE betyder vi ikke vil have diverse advarsler
getSymbols("GOOG",from = "2023-01-01", to = Sys.Date(),getSymbols.warning4.0=FALSE)
Vi vil her kun plotte justeret lukkekurs for Google dette er den 6. søjle i GOOG datasættet.
plot(GOOG[,6],main = "Google adj. close")
Vi benytter auto.arima på justeret lukkekurs, vi får en ARIMA(0,1,0) serie, vi kan se at isoleret set har 2023 været et fantastisk år for Google aktien, der forudsiges en daglig stigning på 0,2159 USD.
agoog <- auto.arima(GOOG[,6])
agoog
Vi forudsiger 100 dages aktiekurs baseret på modellen:
forudsagt <- forecast(agoog, h=100)
forudsagt
plot(forudsagt)
Bemærk her skal vi passe på, da vi kun ser på 2023, havde vi fx. set på kursen fra år 2000 og frem havde vi fået en mere kompliceret og knap så optimistisk forudsigelse.
pacman::p_load(quantmod, forecast)
getSymbols("GOOG",from = "2000-01-01", to = Sys.Date(),getSymbols.warning4.0=FALSE)
plot(GOOG[,6],main = "Google adj. close")
agoog <- auto.arima(GOOG[,6])
agoog
forudsagt <- forecast(agoog, h=100)
forudsagt
plot(forudsagt)
Vi ser, at modellen er mere kompliceret end en ARIMA(1,1,1)-model, med en mindre daglig drift på kun 0,0285 USD.
Man kan analysere aktier fra hele verden med quantmod pakken. Find symbolet på Yahoo Finance. Bemærk, hvis du fx
har et aktiesymbol som Novo Nordisk NOVO-B.CO, hvor der er bindestreg og punktum, skal du bruge
backticks `NOVO-B.CO` i
referencer.
Så R gemmer aktiedata i filen NOVO-B.CO, men vi skal bruge `NOVO-B.CO` for
at refere til data.
getSymbols("NOVO-B.CO",from = "2020-01-01", to = Sys.Date(),getSymbols.warning4.0=FALSE)
anovo <- auto.arima(`NOVO-B.CO`[,6])
Eksporter Aktiekurser til Excel
Man kan eksportere data til fx Excel med pakken rio, herunder dannes en Excel-fil med to ark med hhv. aktiedata og forudsigelser. Funktionen export(), benyttes, man angiver data til de enkelte ark en list() funktion, sidste argument er selve filnavnet. Filen gemmes i arbejdsbiblioteket. Herfra kan den kopieres eller eksporteres.
#Hent rio med install.packages("rio")
#Load rio med library("rio") eller benyt pacman som herunder
pacman::p_load(quantmod, forecast, rio)
getSymbols("GOOG",from = "2017-01-01", to = Sys.Date(),getSymbols.warning4.0=FALSE)
agoog <- auto.arima(GOOG[,6])
fagoog <- forecast(agoog)
fagoog <- as.data.frame(fagoog)
GOOG <- as.data.frame(GOOG)
export(list(GOOG,fagoog),overwrite=TRUE,"google.xlsx")
Ovenstående kode henter Google aktiedata kører en arima analyse på disse, og gemmer kurser og forecast i Excelfilen google.xlsx i arbejdsbiblioteket.
Aktieafkast
I Quantmod pakken ligger også mulighed for at beregne fx. dagligt,
ugentligt afkast, dette gør vi vha. funktionen “periodReturn”. Her er angivet period = 'yearly', så
vi får angivet det årlige afkast fra 2010 til i år, sidste år er kun år til dato. Man kan benytte andre parametreEn parameter betegner en ukendt konstant i en statistisk model eller
formel, ud fra en stikprøve estimeres (gættes kvalificeret på) dens
værdi.
En parameter kan fx. være β, μ, p, σ etc.
Vi ønsker at udtale os om danske mænds højde, populationen er så danske
mænd. Stikprøve gennemsnittet for fx. 100 mænds højde 179,34 cm. er
parameter estimatet (gættet på middelværdien i populationen). Den sande
ukendte parameter i populationen er altså middelhøjden i populationen
μ
I AI-sammenhæng bruges ordet parametre om de tal modellen justerer under træning — som knapper på et kæmpe
regneapparat. GPT-1 havde 117 millioner parametre; de største modeller anslås til billioner.
Flere parametre = modellen kan skelne mellem flere sproglige mønstre — men det koster eksponentielt mere at
træne.
Klik her for at lære mere om parametre og parameter-estimater!
som fx. monthly, weekly, daily.
getSymbols("GOOG", from = "2010-01-01", to = Sys.Date())
goog <- periodReturn(GOOG, period = 'yearly', subset = '2010::')
goog
Bemærk afkastet er angivet som decimaltal, så 2023 har været et fantastisk år at have haft Google aktier, da disse er steget med 60,96% (bemærk året er ikke helt slut men opgjort ud fra kurs 26. december 2023), året før 2022 var ringe pga. Ukraine krigen, således faldt aktien 38,67% i 2022.
Vi kunne plotte med linjer med R-kommandoen plot(goog), men herunder er benyttet punkter i stedet man kan bruge forskellige symboler ved at ændre tallet i pch = 10.
# plot med punkter
plot(goog, pch = 10, type = "p", main = "Google årligt afkast siden 2010", ylab="Afkast",ylim = c(-0.3,0.8))
Vi kan forudsige det årlige afkast ligesom aktiekursen; vi opstiller en ARIMA-model:
auto.arima(goog)
Vi får en ARIMA(1,0,0), hvor vi konvergerer mod et gennemsnitligt årligt afkast på 20,56%. Modellen kan ikke forudsige op- og nedture, krige etc. Det er heller ikke muligt at benytte en sæsonkomponent, da årsdata ikke har en sæsonperiode at måle på. Forudsigelsen bliver derfor et flot årligt afkast på aktien.
forecast(auto.arima(goog),h=100)
Bemærk, at afkastet konvergerer mod 20,56% pr. år ifølge modellen. Er man længe nok i Google-aktien, er den
en god investering ifølge modellen, baseret på historiske data. Vi har dog meget brede konfidensintervallerKonfidensintervallet beregnes ud fra en stikprøve, og angiver nedre og
øvre grænser indenfor hvilke populations parameteren, ligger med en vis
sandsynlighed.
Er 95% konfidensintervallet for mænds gennemsnitlige højde fx. 172 cm.
og 182 cm. kan vi sige:
Vi kan med 95% sandsynlighed sige den gennemsnitlige højde for mænd i
populationen, ligger mellem 172 cm. og 182 cm.
Jo større stikprøve og jo lavere sikkerhed (konfidensniveau), jo mere
præcist bliver vore konfidensinterval (interval estimatet), dvs
intervallet bliver smallere.
Vi kan beregne konfidensintervaller for parametre vi estimerer, fx.
gennemsnittet, standardafvigelsen, andelen etc.
I modsætning til et punktestimat for fx. middelværdien, fortæller
konfidensintervallet os noget om kvaliteten af vort estimat/gæt, ud fra
bredden af konfidensintervallet.
Klik her for at
lære mere om konfidensintervallet!
. Vi kan
med
95% sikkerhed sige, at det årlige afkast forudsagt 100 år frem i tiden ligger mellem -42,64% og 83,77%.
Quiz
Spørgsmål
Importer ARIMA22.xlsx til R via menuen File - Import Dataset - Excel. Bestem for den fremtidige aktiekurs 15 perioder frem, udregn direkte fx. vha. Excel og tjek dit resultat i R.
ts.plot(ARIMA22)
auto.arima(ARIMA22)
forecast(auto.arima(ARIMA22),h=15)
plot(forecast(auto.arima(ARIMA22),h=15))
I Excel-filen herunder er udregnet forudsagte kurser fra tid 51 til tid 65, disse stemmer med de forecastede kurser i R.
Hent ARIMA22_forudsagt.xlsx Excel-filenBestem for den fremtidige aktiekurs 24 perioder frem vha. forecast, udregn direkte fx. vha. Excel og tjek dit resultat i R.
ts.plot(ARIMA7)
auto.arima(ARIMA7)
forecast(auto.arima(ARIMA7),h=24)
plot(forecast(auto.arima(ARIMA7),h=24))
Herunder er udregnet forudsagte kurser i Excel.
ARIMA7_forudsagt.xlsx Excel-filenHvis du plotter ses at tidsserien synes at have en sæsonkomponent, husk derfor at log10 transformere serien inden ARIMA analysen.
Bestem for den fremtidige aktiekurs 12 perioder frem vha. forecast, plot den forecastede udvikling.
library(forecast)
# Ret kurserne i søjle 2 til en tidsserie.
# Angiv seriens start og frekvens.
data = ts(data[,2],start = c(2013,1),frequency = 12)
plot(data, xlab='Tid', ylab = 'Salg pr måned')
ARIMAfit = auto.arima(log10(data), approximation=FALSE)
ARIMAfit
# Vi forecaster:
forecast <- forecast(ARIMAfit, h = 36)
# transformer log10 tilbage til oprindelige værdier:
forecast$x <- 10^forecast$x
forecast$mean <- 10^forecast$mean
forecast$lower <- 10^forecast$lower
forecast$upper <- 10^forecast$upper
forecast
# plot med forecast
plot(forecast,xlab = "Tid",ylab = "Salg")
Forudsig aktiekursen 100 dage frem.
Husk da aktie symbolet er NOVO-B.CO skal du benytte backticks `NOVO-B.CO`
Hent månedligt afkast for Novo aktien for samme tidsperiode.
Plot månedligt afkast i en figur, med afkastet som punkter.
Forudsig de næste 12 måneders afkast baseret på en ARIMA analyse.
pacman::p_load(quantmod, forecast)
getSymbols("NOVO-B.CO",from = "2010-01-01", to = "2023-12-27",getSymbols.warning4.0=FALSE)
plot(`NOVO-B.CO`[,6],main = "Novo adj. close")
anovo <- auto.arima(`NOVO-B.CO`[,6])
anovo
forudsagt <- forecast(anovo, h=100)
forudsagt
plot(forudsagt,main = "Novo adj. close",ylab = "Kurs",xlab = "Dag 2010-01-01 til 2023-12-22")
Vi ser nu på det månedlige afkast for Novo aktien
# Afkast pr måned hentes vha. period monthly
novoreturn <- periodReturn(`NOVO-B.CO`, period = 'monthly', subset = '2010::')
novoreturn
# plot med punkter
plot(novoreturn, pch = 10, type = "p", main = "Novo månedligt afkast", ylab="Afkast",ylim = c(-0.3,0.4))
auto.arima(novoreturn)
forecast(auto.arima(novoreturn),h=12)
Vi ser her at den bedste forudsigelse, er et flot månedligt afkast på 0,0199 ≈ 2%
Forudsig aktiekursen 100 dage frem.
Aktie symbolet er AAPL Hent månedligt afkast for Apple aktien for samme tidsperiode.
Plot månedligt afkast i en figur, med afkastet som punkter.
Forudsig de næste 24 måneders afkast baseret på en ARIMA analyse. Plot forudsigelsen af Apple aktien 24 måneder frem.
# Vi kan undgå scientific notation med nedenstående kommando
options(scipen = 999)
pacman::p_load(quantmod, forecast)
getSymbols("AAPL",from = "2010-01-01", to = "2023-12-27",getSymbols.warning4.0=FALSE)
plot(AAPL[,6],main = "Apple adj. close")
aa <- auto.arima(AAPL[,6])
aa
forudsagt <- forecast(aa, h=100)
forudsagt
plot(forudsagt,main = "Apple adj. close",ylab = "Kurs",xlab = "Dag 2000-01-01 til 2023-12-22")
Vi ser nu på det månedlige afkast for Apple aktien
# Afkast pr måned hentes vha. period monthly
return <- periodReturn(AAPL, period = 'monthly', subset = '2010::')
return
# plot med punkter
plot(return, pch = 10, type = "p", main = "Apple månedligt afkast", ylab="Afkast", ylim = c(-0.3,0.3))
auto.arima(return)
forecast(auto.arima(return),h=24)
# Plot af forudsagt månedligt afkast
plot(forecast(auto.arima(return),h=24))
Vi ser her at den gennemsnitlige forudsigelse, er et flot månedligt afkast på 0,022 ≈ 2,2%