R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Pitkävetokohteet R:ään

Pitkäveto on Veikkauksen peli, jossa pitää veikata, voittaako kotijoukkue, vierasjoukkue vai tuleeko tasapeli. Kullekin vaihtoehdolle on eri voittokertoimet, ja samalla voi veikata useampien otteluiden tulosyhdistelmää. Veikkaus jakelee kohteiden tiedot mm. XML-muodossa, josta ne on helppo lukea esimerkiksi R:ään. Kun kertoimet ovat R:ssä, voidaan niiden perusteella helposti laskea esimerkiksi voittotodennäköisyyksiä ja voiton odotusarvoja tietyllä panoksella. Jos tuloksia olisi käytettävissä useammilta sivuilta, voisi niiden perusteella määrittää vaikkapa arbitraaseja.

Veikkauksen sivulta haetaan kertoimet, parsitaan ne, lasketaan tietyt tunnusluvut, ja suodatetaan jäljellä vain auki olevat kohteet seuraavasti:

# Haetaan listat
d1<-haeListat()
 
# Parsitaan listoista tiedot
d2<-parsiListat(d1)
 
# Lasketaan tunnusluvut
d3<-laskeArvot(d2)
 
# Suodatetaan esiin vain auki olevat kohteet.
d4<-suodataTulokset(d3)

Tuloksena saadaan seuraavankaltainen listaus:

tn = 1 / kerroin
palautusprosentti = 1 / sum(tn)
reaalikerroin = tn * palautusprosentti
odotusarvo = reaalikerroin * kerroin
kelly = kellyn kertoimet reaalikertoimista laskettuna
kellytn = kellyn kertoimet tn:stä laskettuna
 
head(d4)
    numero          kohde.auki        kohde.kiinni kotijoukkue vierasjoukkue
222    107 2015-11-02 06:00:00 2015-11-08 21:55:00    Bordeaux        Monaco
223      4 2015-11-02 06:00:00 2015-11-10 18:25:00       Ilves      Pelicans
224      5 2015-11-02 06:00:00 2015-11-11 18:25:00      KooKoo           JYP
225      6 2015-11-02 06:00:00 2015-11-11 18:25:00     Tappara         KalPa
226      7 2015-11-02 06:00:00 2015-11-12 18:25:00         HPK           TPS
227      8 2015-11-02 06:00:00 2015-11-12 18:25:00     Ässät          HIFK
    kjkerroin tasankerroin vjkerroin      kjtn   tasantn   vjtn
222      2.25            3       3.2 0.4444444 0.3333333 0.3125
223        NA           NA        NA        NA        NA     NA
224        NA           NA        NA        NA        NA     NA
225        NA           NA        NA        NA        NA     NA
226        NA           NA        NA        NA        NA     NA
227        NA           NA        NA        NA        NA     NA
    palautusprosentti kjreaalikerroin tasanreaalikerroin vjreaalikerroin
222         0.9171975       0.4076433          0.3057325       0.2866242
223                NA              NA                 NA              NA
224                NA              NA                 NA              NA
225                NA              NA                 NA              NA
226                NA              NA                 NA              NA
227                NA              NA                 NA              NA
    kjodotusarvo tasanodotusarvo vjodotusarvo     kjkelly  tasankelly
222    0.9171975       0.9171975    0.9171975 -0.06624204 -0.04140127
223           NA              NA           NA          NA          NA
224           NA              NA           NA          NA          NA
225           NA              NA           NA          NA          NA
226           NA              NA           NA          NA          NA
227           NA              NA           NA          NA          NA
        vjkelly kjkellytn tasankellytn vjkellytn
222 -0.03763752         0            0         0
223          NA        NA           NA        NA
224          NA        NA           NA        NA
225          NA        NA           NA        NA
226          NA        NA           NA        NA
227          NA        NA           NA        NA

Tarvittavat funktiot on listattu alla:

haeListat <- function() {
   p1 <- readLines("https://www.veikkaus.fi/info/xml/pitkaveto1.xml")
   p2 <- readLines("https://www.veikkaus.fi/info/xml/pitkaveto2.xml")
   p3 <- readLines("https://www.veikkaus.fi/info/xml/pitkaveto3.xml")
   p4 <- readLines("https://www.veikkaus.fi/info/xml/pitkaveto4.xml")
   p5 <- readLines("https://www.veikkaus.fi/info/xml/pitkaveto5.xml")
   p6 <- readLines("https://www.veikkaus.fi/info/xml/pitkaveto6.xml")
   p7 <- readLines("https://www.veikkaus.fi/info/xml/pitkaveto7.xml")
   p  <- c(p1, p2, p3, p4, p5, p6, p7)
   return(p)
}
 
parsiListat <- function(p) {
   numero        <- gsub("<NRO/>", "", gsub("</NRO>", "", gsub("<NRO>", "", p[grep("<NRO", p)])))
   kohde.auki    <- strptime(substr(p[grep("<KOHDE", p)], 25, 43), format="%d.%m.%Y %H:%M:%S", tz="EET")
   kohde.kiinni  <- strptime(substr(p[grep("<KOHDE", p)], 54, 72), format="%d.%m.%Y %H:%M:%S", tz="EET")
 
   kotijoukkue   <- gsub("</KOTIJOUKKUE>", "", gsub("<KOTIJOUKKUE>", "", p[grep("KOTIJOUKKUE", p)]))
   vierasjoukkue <- gsub("</VIERASJOUKKUE>", "", gsub("<VIERASJOUKKUE>", "", p[grep("VIERASJOUKKUE", p)]))
 
   kjkerroin     <- as.numeric(gsub(",", ".", gsub("</KJ_KERROIN>", "", gsub(" </KJ_KERROIN>", "", gsub("<KJ_KERROIN>", "", p[grep("KJ_KERROIN", p)])))))
   tasankerroin  <- as.numeric(gsub(",", ".", gsub("</TASAN_KERROIN>", "", gsub(" </TASAN_KERROIN>", "", gsub("<TASAN_KERROIN>", "", p[grep("TASAN_KERROIN", p)])))))
   vjkerroin     <- as.numeric(gsub(",", ".", gsub("</VJ_KERROIN>", "", gsub(" </VJ_KERROIN>", "", gsub("<VJ_KERROIN>", "", p[grep("VJ_KERROIN", p)])))))
 
   d<-data.frame(numero, kohde.auki, kohde.kiinni, kotijoukkue, vierasjoukkue, kjkerroin, tasankerroin, vjkerroin)
   return(d)
}
 
laskeArvot<-function(x) {
   x$kjtn    <- 1 / x$kjkerroin
   x$tasantn <- 1 / x$tasankerroin
   x$vjtn    <- 1 / x$vjkerroin
 
   x$palautusprosentti <- 1 / (1 / x$kjkerroin + 1 / x$tasankerroin + 1 / x$vjkerroin)
 
   x$kjreaalikerroin    <- x$kjtn * x$palautusprosentti
   x$tasanreaalikerroin <- x$tasantn * x$palautusprosentti
   x$vjreaalikerroin    <- x$vjtn * x$palautusprosentti
 
   x$kjodotusarvo    <- x$kjreaalikerroin * x$kjkerroin
   x$tasanodotusarvo <- x$tasanreaalikerroin * x$tasankerroin
   x$vjodotusarvo    <- x$vjreaalikerroin * x$vjkerroin
 
   x$kjkelly    <- ((x$kjreaalikerroin * x$kjkerroin) -1 ) / (x$kjkerroin -1)
   x$tasankelly <- ((x$tasanreaalikerroin * x$tasankerroin) -1 ) / (x$tasankerroin -1)
   x$vjkelly    <- ((x$vjreaalikerroin * x$vjkerroin) -1 ) / (x$vjkerroin -1)
 
   x$kjkellytn    <- ((x$kjtn * x$kjkerroin) -1 ) / (x$kjkerroin -1)
   x$tasankellytn <- ((x$tasantn * x$tasankerroin) -1 ) / (x$tasankerroin -1)
   x$vjkellytn    <- ((x$vjtn * x$vjkerroin) -1 ) / (x$vjkerroin -1)
 
   cat("tn = 1 / kerroin\n")
   cat("palautusprosentti = 1 / sum(tn)\n")
   cat("reaalikerroin = tn * palautusprosentti\n")
   cat("odotusarvo = reaalikerroin ' kerroin\n")
   cat("kelly = kellyn kertoimet reaalikertoimista laskettuna\n")
   cat("kellytn = kellyn kertoimet tn:stä laskettuna\n")
 
   return(x)
}
 
suodataTulokset<-function(x) {
   d<-x[x$kohde.kiinni > strptime(Sys.time(), format="%Y-%m-%d %H:%M:%S", tz="EET"),]
   return(d)
}

2 Responses to “Pitkävetokohteet R:ään”

  • Raimo Haikari sanoo:

    Hei

    Esimerkin innoittamana innostuin kokeilemaan kuinka pitkävetokohteiden kertoimet saadaan luettua Veikkauksen tarjoaman sovellusrajapinnan kautta. Toteutus löytyy osoitteesta http://tietokana.joomla.com/pitkaevetokohteet-r-aeaen.

    Ja vielä sellainen pikkujuttu, että parsiListat -funktion parametri (x) ei vastaa toiminnallisuuden toteuttavien funktioden odottamaa (p).

    – rami –

    • Jarno sanoo:

      Hei!

      Hyvä huomio tuo funktion parametrien nimien eriäväisyys! Korjasin nyt funktion, toivottavasti.

      Huomasin, että Veikkaus tarjoaa myös REST-API:n, mutta arvelin tuon XML-muodon käytön menevän helpommin. Olin väärässä, sillä ainakaan R:n parseri ei suostunut sitä suoraan parsimaan (epästandardinmukainen muoto), jolloin sitä ei pääse myöskään helposti kyselemään vaikkapa XPath:lla. Hyvä, että löytyy nyt esimerkki myös API:n käytöstä.

      – Jarno


Category