Statistiline andmeteadus ja visualiseerimine MTMS.01.100     Praktikumid     Projektid     Huvitavat materjali

Kodutöö 1 osa II

Sissejuhatus

Mati “Raha” Masin töötab investeerimispangas ning ta vastutab igapäevase aktsiaturu ülevaate koostamise eest. Ta vihkab oma tööd selle rutiinsuse pärast. Vaja on kopeerida uued aktsiaturu andmed Exceli tabeli õigesse lahtrisse, klikkida vajalikel nuppudel ja kopeerida tulemused raportisse.

Peale selle, et tegevus on igav, võib andmete, valemite ja tulemuste kopeerimisel tekkida mitmeid vigu. Seega kontrollib Mati mitu korda üle ega kopeerimisel vigu ei tekkinud, sest ta teab, et andmete kopeerimisel võivad eksida isegi Harvardi majandusteadlased (praktikum 2 teema).

Ta unistab automaatsest statistikaraportist - andmed ning analüüsi tulemused uuenevad automaatselt ja raporti genereerimine on automatiseeritud. Selles praktikumis vaatamegi, kuidas sellist tööprotsessi automatiseerida R-is.

Eesmärgiks on koostada automaatselt uuenev raport, kus on:

  • suurimad tõusjad ja kukkujad;
  • aktsiaturu ülevaade sektorite lõikes;
  • aktsiate ostusoovitused.

Andmetabelist info kättesaamiseks kasutame R-i paketti dplyr. Selle paketi kohta loe täpsemalt praktikumimaterjalist ning uuri sealseid minimalistlikke näiteid.

Ülevaade andmestikust

Andmestikus on näidatud 505 ettevõtte (kõik need ettevõtted, mis on kuulsas S&P 500 indeksis) kohta järgmised tunnused:

  • symbol: ettevõtte ID börsil
  • nimi: ettevõtte nimi
  • sektor: sektor, kus ettevõte tegutseb
  • hind: viimase aktsiatehingu hind
  • tootlus: aktsiahinna muutus võrreldes eelmise päevaga protsentides
  • kogus: aktsiate arv, mis vahetas omanikku päeva jooksul
  • kasum_aktsia_kohta: ettevõtte aastakasum / aktsiate koguarv
  • dividend_aktsia_kohta: väljamakstud dividendid aastas / aktsiate koguarv

Laadi alla andmestik Aktsiad 2020.csv ning loe andmestik töökeskonda.

Kodutöö raport

Kodutöö tulemusena peab valmima raport, kus kajastuvad järgnevate ülesannete lahendused. Allpool on toodud nii raportile esitatavad täpsemad nõuded (vt ülesanne 5) kui ka näidisraport. Ülesannete lahendamisel on vaja kasutada dplyr paketi funktsioone.

Ülesanne 1 (3 punkti) - Suurimad tõusjad. Suurimad kukkujad.

Mati tahab oma turuülevaates näidata kolme suurimat tõusjat ja kukkujat.

Kõigepealt leia kolm kõige suurema päevase tootlusega aktsiat ning väljasta nende kohta:

  1. ettevõtte sümbol
  2. ettevõtte nimi
  3. hind
  4. tootlus.

Seejärel leia kolm kõige madalama päevase tootlusega aktsiat ning väljasta nende kohta samasugune info.

Näpunäide: Abiks on funktsioonid arrange(), select() ja top_n().

Ülesanne 2 (5 punkti) - Ülevaade sektorite lõikes

Mati soovib raportis näidata ülevaadet ka sektorite lõikes, sest kliente võib huvitadada, kas ehitussektori aktsiatega kaubeldi rohkem kui IT-sektori aktsiatega?

Iga sektori kohta, kus on vähemalt 30 ettevõtet, väljasta järgnev info:

  1. sektori keskmine tootlus
  2. sektori kogukäive
  3. sektori keskmine käive
  4. ettevõtete arv sektoris

Juhised:

  • Lisa andmestikku tunnus käive, mis näitab, kui suure summa eest igat aktsiat kaubeldi. (Selleks tuleb korrutada päeva jooksul kaubeldud aktsiate arv viimase tehingu hinnaga.)
  • Arvuta iga sektori kohta
    • keskmine tootlus,
    • kogukäive,
    • keskmine käive,
    • ettevõtete arv.
      Näpunäide 1: Kasuta paketi dplyr funktsioone group_by() ja summarise().
      Näpunäide 2: Summade ja keskmiste arvutamisel ära võta arvesse puuduvaid väärtusi (puuduvate väärtuse välja jätmiseks võib funktsioonide sum ja mean argumendi na.rm väärtuseks seada TRUE).
  • Näita ainult neid sektoreid, kus on vähemalt 30 ettevõtet.
  • Sorteeri tabel tunnuse kogukäive alusel kahanevalt.

Ülesanne 3 (5 punkti) - kauplemisalgoritm

Mati arvates annab iga vähegi nupukam aktsiaanalüütik klientidele aktsiate ostusoovitusi, et klient saaks oma vara kasvatada.

Kirjuta funktsioon kauplemisalgoritm, mille sisendiks on andmestik data ja mis tagastab kolme kõige atraktiivsema ettevõtte sümbolid, mis saavadki ostusoovitusteks.

Juhised:

  • Kõigepealt tekita andmestikku juurde järgmised kaks tunnust:
    • kasumi-aktsiahinna suhe (kasum_aktsia_kohta/hind) [kui sa tead, mida tähendab PE suhe, siis me arvutame PE suhte pöördväärtust]
    • dividendi määr (dividend_aktsia_kohta/hind) [pane tähele, et mõnel ettevõttel on dividend_aktsia_kohta väärtus NA. Asenda esmalt puuduvad väärtused 0-ga]
  • Arvuta iga aktsia kohta atraktiivsuse skoor, mis on arvutatud järgnevalt 0.5 * kasumi-aktsiahinna suhe + 0.5 * dividendi määr
  • Ostusoovituseks leia kolm kõige suurema skooriga aktsiat.

Kui eelnevaga oled hakkama saanud, siis proovi eelnev kood kirjutada funktsiooniks, mis võtab sisendiks suvalise andmestiku ning väljastab kolme kõige atraktiivsema ettevõtte aktsiate sümbolid vektorina (meenutus: andmestik$tunnus). Funktsioon võib välja näha näiteks nii:

kauplemisalgoritm = function(x){
  # tekitame andmestikule x juurde tunnused kasumi-aktsiahinna suhe 
  # ja dividendi määr
  # [sinu kood]
  
  # arvutame iga aktsia kohta atraktiivsuse skoori
  # [sinu kood]
  
  # tagasta kolme kõige suurema skooriga ettevõtte sümbolid vektorina
}

Ülesanne 4 (2 punkti) - turvaline kauplemisalgoritm ja ostusoovitused

Mati ei ole veel vanemanalüütiku staatust saanud ning ta kardab veidi oma soovituste pärast. Mis juhtub kui aktsiasoovitus osutub katastroofiks? Kui kliendid saavad Mati soovituste pärast hiigelsuuri kahjumeid, siis kõigub ka tema töökoht. Mis oleks kui soovitada ainult populaarseid aktsiaid? Siis saab ju alati öelda, et vanemanalüütikud teistes pankades soovitasid ka …

Nüüd kirjuta funktsioon kauplemisalgoritm_turvaline, kus valid atraktiivseid aktsiaid vaid populaarsete aktsiate hulgast. Populaarsed aktsiad on järgnevad: AAPL, AMZN, FB, GOOG, IBM, NFLX, NVDA.

Juhised:

  • Vali andmestikust välja ainult aktsiad AAPL, AMZN, FB, GOOG, IBM, NFLX, NVDA.
  • Rakenda saadud alamandmestikul eelnevas ülesandes kirjutatud funktsiooni.

Kui eelnev töötab, siis kirjuta eelnev kood funktsiooniks.

kauplemisalgoritm_turvaline = function(x){
  # sinu kood
}

Kasutades funktsiooni kauplemisalgoritm_turvaline, väljasta 3 ostusoovitust.

Ülesanne 5 (5 punkti) - raporti vormistamine

Vormistage eelnevate ülesannete lahendused selliseks knitr raportiks (html või pdf formaadis), et

  • Kõik andmestike väljatrükid oleks toodud tabelitena. Selleks kasuta näiteks funktsiooni kable. (Näpunäide: funktsiooni kable kasutades saab komakohtade arvu määrata parameetri digits abil ja selleks, et suured arvud paremini loetavad oleks, saab täiendava argumendina lisada format.args = list(big.mark = " "), mis lisab tuhandeliste vahele tühiku. Selleks, et vabaneda teaduslikust arvuformaadist, st arvu eksponentkujul esitamisest, tuleb koodi algusesse lisada options(scipen=1000).)
  • Ostusoovitus (ül 4 tulemus) lisage teksti sisse reasisese R-i koodi abil (inline R code).
  • Ära raportis R-i koodi (ega muud müra) näita. Koodi väljajätmiseks kasuta näiteks iga koodibloki päises valikut echo=FALSE. Teine variant on muuta globaalseid sätteid, kus lisad .Rmd faili algusesse
```{r, echo=FALSE}
library(knitr)
opts_chunk$set(echo=FALSE, message=FALSE, warning = FALSE)
```

Näidisraport

Raport võiks välja näha umbes selline (pildil ei ole näidatud ilmtingimata õiged väärtused):

Mida on vaja esitada?

Esitada tuleb nii raport (html või pdf formaadis) kui ka selle lähtekood .Rmd failina.

Boonusülesanne 1 (1 punkt): raporti täiendamine

Kasuta paketti kableExtra, et vormindada ühte või enamat raportis olevat tabelit. Paketi võimalustega tutvumiseks saab kasutada näiteks seda abimaterjali.

Boonusülesanne 2 (3 punkti): andmete automaatne uuenemine

Muuda kodutööd selliselt, et staatilise faili Aktsiad 2020.csv asemel kasutatakse reaalajas andmeid, mis on saadud portaalist finance.yahoo.com.

Mõned näpunäited:

  • kasuta R-i paketti quantmod
  • kasuks tuleb funktsioon getQuote
  • tunnuste loetelu nägemiseks, mida on võimalik finance.yahoo.com portaalist saada, on abiks funktsioon yahooQF()
  • hinnana kasuta tunnust Last Trade (Price Only), sümbolina Symbol, tootlusena Change in Percent, kogusena Volume, kasumina aktsia kohta Earnings/Share, dividendina aktsia kohta Dividend/Share
  • ettevõtete nime ja sektori saab Wikipedia lehelt alla laadida järgmise koodijupi abil:
library(rvest) # Vajalik eelnevalt installida pakett rvest
sp500_wiki <- read_html(
  "https://en.wikipedia.org/wiki/List_of_S%26P_500_companies")

aktsiad_wiki <- sp500_wiki %>%
  html_nodes("table") %>%
  html_nodes(xpath = '//*[@id="constituents"]') %>% 
  html_table()

aktsiad_wiki <- aktsiad_wiki[[1]][,c(1,2,4)]
colnames(aktsiad_wiki) = c("symbol", "nimi", "sektor")
aktsiad_wiki$symbol = gsub(".", "-", aktsiad_wiki$symbol, fixed = TRUE)
  • ühenda Wikist laetud andmestik Yahoo’st saadud andmestikuga tunnuse symbol alusel (vt?join või ?merge)