Aikasarjat

Tämän artikkelin ohjelmakoodin ja tulosteet löydät GitHubista:

https://github.com/taanila/tilastoapu/blob/master/aikasarjat.ipynb

Jos kopioit koodia itsellesi, niin kannattaa käyttää GitHubia. Tästä artikkelista kopioidut koodit eivät välttämättä toimi oikein.

Oletan, että lukijalla on asennettuna Anaconda ja sen mukana tuleva Jupyter notebook.

Tämän artikkelin esimerkeissä käytän osoitteesta

http://www.nasdaqomxnordic.com/osakkeet/historiallisetkurssitiedot

noutamiani csv-muotoisia historiatietoja Elisan ja Telian osakkeiden kurssikehityksestä:

Ohjelmakirjastojen tuonti

Aikasarjojen käsittelyyn ja kuvamiseen tarvitsen ainakin pandas ja matplotlib.pyplot kirjastoja:

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

Aikasarjojen avaaminen dataframeen

Jos aikasarjan sisältävä tekstimuotoinen tiedosto on tallennettu työasemalleni, niin voin kurkistaa sen sisään esimerkiksi seuraavasti:

aikas1

Yllä olevan perusteella huomasin että nasdaqomxnordicin sivuilta noudetut historialliset kurssitiedot on tallennettu seuraavasti:

  • erottimena puolipiste
  • desimaalipisteenä pilkku
  • ensimmäinen rivi ei sisällä varsinaista dataa.

Edellä olevan perusteella päädyin avaamaan aikasarjan dataframeen seuraavila parametreillä:

elisa = pd.read_csv('ELISA-2016-01-01-2018-10-19.csv', sep = ';', 
   decimal = ',', skiprows = 1, usecols = 
   [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
telia = pd.read_csv('TELIA1-2016-01-01-2018-10-19.csv', sep = ';', 
   decimal = ',', skiprows = 1, usecols = 
   [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

Aikasarjasta tulee kunnon aikasarja sijoittamalla aikaleimat dataframen rivi-indeksiksi. Varmistan pd.to_datetime()-funktiolla, että aikaleimat tunnistetaan päivämääriksi. Lisäksi järjestän indeksin päivämäärien mukaan vanhimmasta uusimpaan:

elisa.index = pd.to_datetime(elisa['Date'])
elisa.sort_index(inplace = True)

telia.index = pd.to_datetime(telia['Date'])
telia.sort_index(inplace = True)

Viivakaavio

Viivakaavion piirtäminen esimerkiksi päätöshinnoista (Closing price) onnistuu helposti:

elisa['Closing price'].plot()

aikas2

Voin tarkastella kuviossa vain rajattua osaa aikasarjasta, esimerkiksi syyskuusta 2018 alkaen:

elisa['Closing price']['2018-09':].plot()

aikas3

Liukuva keskiarvo

Liukuvan keskiarvon voin laskea rolling()-funktiolla:

elisa['Closing price'].plot()
elisa['Closing price'].rolling(200).mean().plot()

aikas4

Halutessani voin tallentaa liukuvat keskiarvot dataframeen:

elisa['rolling200'] = elisa['Closing price'].rolling(200).mean()

Voin korvata mean()-funktion ja laskea liukuvasti myös muita tilastollisia tunnuslukuja.

Kaksi aikasarjaa samaan kaavioon

Esimerkkiaikasarjojeni arvot ovat eri suuruusluokkaa (Elisan osake kymmeniä euroja, Telian osake muutamia euroja). Jos haluan esittää tällaiset aikasarjat samassa kaaviossa ”päällekkäin”, niin tarvitsen kummallekin sarjalle oman arvoakselin.

Seuraavassa lisään ensin kaavion, jonka koon määritän oletusta suuremmaksi. Ensimmäisen sarjan väriksi valitsen käytössä olevan teeman ensimmäisen värin (C0). Toiselle sarjalle määritän oman akselin (ax2 = ax1.twinx()) ja väriksi valitsen käytössä olevan teeman toisen värin (C1).

fig, ax1 = plt.subplots(figsize = (10, 6))

color = 'C0'
#ax1.set_xlabel('Aika')
ax1.set_ylabel('Elisa', color=color)
ax1.plot(elisa['Closing price'], color=color)
ax1.tick_params(axis='y', labelcolor=color)

ax2 = ax1.twinx()
color = 'C1'
ax2.set_ylabel('Telia', color=color)
ax2.plot(telia['Closing price'], color=color)
ax2.tick_params(axis='y', labelcolor=color)

aikas5

Muutosprosentit

Muutosprosentit lasken kätevästi:

elisa['Elisa_Change'] = elisa['Closing price'].pct_change()
telia['Telia_Change'] = telia['Closing price'].pct_change()

Seuraavassa teen muutosprosenteista oman dataframen:

muutokset = pd.concat([elisa['Elisa_Change'], 
   telia['Telia_Change']], axis=1)
muutokset.head()

aikas6

Seuraavassa piirrän muutokset syyskuusta alkaen viivakaavioon:

muutokset['2018-09':].plot()

aikas7

Liukuva korrelaatio

Esimerkiksi 125 päivän liukuva korrelaatio kertoo viimeisimmän 125 päivän korrelaation kahden aikasarjan arvojen välillä. Liukuvaa korrelaatiota laskettaessa on syytä käyttää prosenttimuutoksia.

korrelaatio=muutokset['Elisa_Change'].rolling(125, 
   min_periods=30).corr(muutokset['Telia_Change'])
korrelaatio.plot()

aikas8

Yllä Elisan ja Soneran prosenttimuutokset ovat aluksi korreloineet voimakkaast, mutta vuoden 2018 syyskuun vaiheilla korrelaatiokerroin on pudonnut lähelle arvoa 0,2.

Tarkastelu viikonpäivittäin

Jos haluan tutkia, onko tuottoprosenteissa eroa eri viikonpäivien välillä, niin tallennan ensin viikonpäivät dataframeen. Sen jälkeen voin laskea tuottoprosentin tunnusluvut eri viikonpäiville (0 = maanantai):

muutokset['Weekday'] = muutokset.index.weekday
muutokset['Elisa_Change'].groupby(muutokset['Weekday']).describe()

aikas9

Lisätietoa

Jos olet kiinnostunut aikasarjaennustamisesta, niin tutustu myös artikkeleihin

 

 

 

Mainokset