# Kontrollerar att API nyckeln är laddad
if(httr::GET(paste0("https://apiservice.borsdata.se/v1/instruments/kpis/241/last/latest?authKey=",params$key))[2]!=200){stop("Lägg in din Börsdata API nyckel på rad 8 i dokumentet")}
# install.packages("tidyverse")
# devtools::install_github("jakobjohannesson/borsdata")
# devtools::install_github("jakobjohannesson/bolagsanalyser")
library(tidyverse)
library(borsdata)
library(rvest)
library(flextable)
library(httr)
library(jsonlite)
library(lubridate)

set_flextable_defaults(big.mark = ",", 
  font.size = 12,digits = 0, theme_fun = theme_vanilla,
  padding.bottom = 0, 
  padding.left = 4,
  padding.right = 4,
  padding.top = 2,
  background.color = "#FFEEEB")
ins<-fetch_instruments(params$key)
listdate<-ins %>% filter(insId == params$id) %>% select(listingDate)
listdate<-lubridate::as_date(listdate[1,1])
co<-fetch_countries(params$key)
branches<-fetch_branches(params$key)
sector<-fetch_sectors(params$key)
markets<-fetch_markets(params$key)

# Skapar en ny frame
ins<-ins %>% select(insId,name,ticker,marketId,branchId,sectorId,countryId)

# country
co<-co %>% rename(countryId=id)
ins<-left_join(x = ins,y = co,by="countryId")

# sector
bran<-sector %>% rename(sectorId=id)
ins<-left_join(x = ins,y = bran,by="sectorId")

# branches
bran<-branches %>% rename(branchId=id)
ins<-left_join(x = ins,y = bran,by="branchId")

# markets
bran<-markets %>% rename(marketId=id)
ins<-left_join(x = ins,y = bran,by="marketId")

# Skapar en ny dataframe
frame<-ins %>% select(insId,name.x,ticker,name.y,name.x.x,name.y.y,name,exchangeName) 
colnames(frame)<-c("id","Bolagsnamn","Ticker","Land","Sektor","Bransch","Marknadsplats","Handelsplats")
frame

bolagsnamn<-frame %>% filter(id == params$id) %>% select(Bolagsnamn) %>% as.character()
Ticker<-frame %>% filter(id == params$id) %>% select(Ticker) %>% as.character()
Land<-frame %>% filter(id == params$id) %>% select(Land) %>% as.character()
Sektor<-frame %>% filter(id == params$id) %>% select(Sektor) %>% as.character()
Branschs<-frame %>% filter(id == params$id) %>% select(Bransch) %>% as.character()
Marknadsplats<-frame %>% filter(id == params$id) %>% select(Marknadsplats) %>% as.character()
Handelsplats<-frame %>% filter(id == params$id) %>% select(Handelsplats) %>% as.character()


download.file(url = paste0("https://borsdata.blob.core.windows.net/images/spa/logo/",params$id,"-d.png"),destfile = "logga.png","curl",quiet = TRUE)

# Hämtar mer information 
content<-httr::GET(paste0("https://instrumentsinfoprod.blob.core.windows.net/refinitiv/",params$id,".json"))
information<-httr::content(content)
hemsida<-information$webSite
antal_employed<-information$employees$count
miljoner_aktier<-round(information$totalSharesOut$totalSharesOut/1000000,1)
adress<-information$contactInfo$streetAddress
city<-str_to_title(information$contactInfo$city)

title: "Bolagsanalys av r bolagsnamn"

Om r bolagsnamn

r bolagsnamn (r Ticker) är verksamt inom branschen r Branschs som är en del av sektorn r Sektor. r bolagsnamn noterades r listdate och är listat på r Marknadsplats i r Land.

r bolagsnamn har r antal_employed anställda i sitt företag, där huvudkontorets address är r adress i r city. Totalt finns det r miljoner_aktier miljoner akiter och företagets hemsida är r hemsida.

Börsdata beskrivning

this<-httr::GET(url = paste0("https://instrumentsinfoprod.blob.core.windows.net/refinitiv/",params$id,"_sv-SE.json"))
content<-httr::content(this)
beskrivning<-content$businessSummary[[1]]

r beskrivning

Insiderhandel

url_bolagsnamn<-str_replace_all(bolagsnamn,"\\s","+")

# Special case...
if(url_bolagsnamn == "Fast+Balder"){url_bolagsnamn<-"Balder"}

url_pg1<-paste0("https://marknadssok.fi.se/Publiceringsklient/sv-SE/Search/Search?SearchFunctionType=Insyn&Utgivare=",url_bolagsnamn,"&PersonILedandeSt%C3%A4llningNamn=&Transaktionsdatum.From=&Transaktionsdatum.To=&Publiceringsdatum.From=&Publiceringsdatum.To=&button=search&Page=",1)
html<-read_html(url_pg1)
ds<-html_table(html)[[1]]
ds$Volym<-as.numeric(str_replace_all(ds$Volym,",",""))
df<-ds
for(i in 2){
  url<-paste0("https://marknadssok.fi.se/Publiceringsklient/sv-SE/Search/Search?SearchFunctionType=Insyn&Utgivare=",url_bolagsnamn,"&PersonILedandeSt%C3%A4llningNamn=&Transaktionsdatum.From=&Transaktionsdatum.To=&Publiceringsdatum.From=&Publiceringsdatum.To=&button=search&Page=",2)
  html<-read_html(url)
  ds<-html_table(html)[[1]]
  if(nrow(ds)==0){break}
  ds$Volym<-as.numeric(str_replace_all(ds$Volym,",",""))
  df<-bind_rows(df,ds)
}
df$Pris<-str_replace_all(df$Pris,",","\\.")
df$Pris<-df$Pris %>% as.numeric() %>% round(digits = 2)
df$Pris<-paste(df$Pris, df$Valuta)
df<-df[1:nrow(df),c(1,3,4,12,11,10,6)]
colnames(df)<-c("Datum", "Person", "Befattning", "Pris", "Volymenhet", "Volym", "Karaktär")


ft <- flextable(df)
ft <- theme_vanilla(ft)
ft <- add_footer_lines(ft, paste("Insiderhandel i",bolagsnamn))
ft <- color(ft, part = "footer", color = "#666666")
ft <- set_caption(ft, caption = "")
ft <- flextable::fontsize(ft,size = 10,part = "all")
ft <- width(ft,width = 0.88,)
ft <- autofit(ft,part = "header")

ft


Finansiell historik

# Aktiekurs
omxs30<-fetch_stockprice(637,params$key) # 637 är index
stockprice<-fetch_stockprice(id = params$id,key = params$key)
stockprice$d<-as.Date(stockprice$d)
sss<-as.character(Sys.Date()-stockprice$d[1])
# Om default date är kortare är tidigare i tiden än vad diff_date, då vill vi ha diff_date.
if(years(2)>days(sss)){
  great_date<-days(sss)
  spread<-"2 months"
} else {
  great_date<-years(2)
  spread<-"10 weeks"
}
omxs30$d<-as.Date(omxs30$d)
stonk<-left_join(omxs30,stockprice,"d") %>% select(d,c.x,c.y) %>% filter(!is.na(c.y)) %>% 
  rename(Omxs30Index = "c.x", ftg = "c.y") %>% filter(d > Sys.Date()-great_date) %>% 
  mutate(standard = Omxs30Index/(Omxs30Index[1]/ftg[1]))
ggplot(stonk,aes(d))+
  geom_line(aes(y=ftg,colour = bolagsnamn), size=1.1)+
  geom_line(aes(y=standard,color="OMXS30\nStockholm"), size=1.1)+ theme_bw()+
  labs(x="Datum", y="Aktiekurs", 
       title = str_wrap(paste("Aktiekursens utveckling för", bolagsnamn,
                               "mellan", Sys.Date()-great_date, "och",tail(stockprice$d,1), 
                               "jämfört med OMXS30 Stockholm"),width = 55))+
  scale_x_date(date_labels = "%b\n %Y", date_breaks = spread,
               limits = c(Sys.Date()-great_date,Sys.Date()))+
  theme(plot.title =                              
          element_text(hjust = 0.5,size = 24),
        panel.grid.major.x =                    
          element_blank(),                         
        panel.grid.minor.x =                       
          element_blank(),
        panel.grid.major.y =                       
          element_line(color = "grey",size=1),
        legend.position="bottom",
         legend.title = element_blank(),
        legend.text = element_text(color = "black", size = 22),
        axis.title.x.bottom = 
          element_text(size = 22,face = "bold"),
        axis.title.y.left = 
          element_text(size = 22,face = "bold"),
        axis.text.x.bottom = 
          element_text(size=20),
        axis.text.y.left =  
          element_text(size=20))


Största ägarna

buy<-paste0("https://apiservice.borsdata.se/v1/instruments/kpis/",241,"/last/latest?authKey=",params$key)
s<-GET(buy)
content<-content(s)
values<-content$values 
test<-tibble(id=map(values, 1), value=map(values, 3))


buy<-paste0("https://apiservice.borsdata.se/v1/instruments/kpis/242/last/latest?authKey=",params$key)
s<-GET(buy)
content<-content(s)
values<-content$values 
test<-left_join(test,tibble(id=map(values, 1), value=map(values, 3)),by = "id")

buy<-paste0("https://apiservice.borsdata.se/v1/instruments/kpis/243/last/latest?authKey=",params$key)
s<-GET(buy)
content<-content(s)
values<-content$values 
test<-left_join(test,tibble(id=map(values, 1), value=map(values, 3)),by = "id")

buy<-paste0("https://apiservice.borsdata.se/v1/instruments/kpis/244/last/latest?authKey=",params$key)
s<-GET(buy)
content<-content(s)
values<-content$values 
test<-left_join(test,tibble(id=map(values, 1), value=map(values, 3)),by = "id")

buy<-paste0("https://apiservice.borsdata.se/v1/instruments/kpis/245/last/latest?authKey=",params$key)
s<-GET(buy)
content<-content(s)
values<-content$values 
test<-left_join(test,tibble(id=map(values, 1), value=map(values, 3)),by = "id")

buy<-paste0("https://apiservice.borsdata.se/v1/instruments/kpis/246/last/latest?authKey=",params$key)
s<-GET(buy)
content<-content(s)
values<-content$values 
test<-left_join(test,tibble(id=map(values, 1), value=map(values, 3)),by = "id")

buy<-paste0("https://apiservice.borsdata.se/v1/instruments/kpis/247/last/latest?authKey=",params$key)
s<-GET(buy)
content<-content(s)
values<-content$values 
test<-left_join(test,tibble(id=map(values, 1), value=map(values, 3)),by = "id")

buy<-paste0("https://apiservice.borsdata.se/v1/instruments/kpis/248/last/latest?authKey=",params$key)
s<-GET(buy)
content<-content(s)
values<-content$values 
test<-left_join(test,tibble(id=map(values, 1), value=map(values, 3)),by = "id")

buy<-paste0("https://apiservice.borsdata.se/v1/instruments/kpis/249/last/latest?authKey=",params$key)
s<-GET(buy)
content<-content(s)
values<-content$values 
test<-left_join(test,tibble(id=map(values, 1), value=map(values, 3)),by = "id")


test3<-test %>% filter(id == params$id)
null<-purrr::pluck(test3,2) %>% unlist()
if(is.null(null)){
  ingen_information<-"Saknar information från Börsdatas API om största kapitalägarna"
} else {
  ingen_information<-NA
  test3<-test3 %>% select(-1) %>% matrix(nrow = 3) %>% 
  unlist() %>% matrix(ncol=3) %>% as_tibble() %>% rename("Kapital" = V1,
                                                         "Röster" = V2,
                                                         "Ägare" = V3)
  ft <- flextable(test3)
  ft <- theme_vanilla(ft)
  ft <- add_footer_lines(ft, paste("Största ägarna i",bolagsnamn))
  ft <- color(ft, part = "footer", color = "#666666")
  ft <- set_caption(ft, caption = "")
  ft <- width(ft,width = 2,)
  ft <- align(ft, align = "left", part = "all")
  ft <- autofit(ft)

  ft
}

r if(!is.na(ingen_information)){ingen_information}


Blankning

# Blankningsförändrad - 1 månad

buy<-paste0("https://apiservice.borsdata.se/v1/instruments/kpis/212/last/diff?authKey=",params$key)
s<-GET(buy)
content<-content(s)
values<-content$values
test<-tibble(id=map(values, 1), `Genomsnittlig förändring i blankning - 1 månad`=map(values, 3))

# Blankning - 1 månad
buy<-paste0("https://apiservice.borsdata.se/v1/instruments/kpis/208/last/mean?authKey=",params$key)
s<-GET(buy)
content<-content(s)
values<-content$values
test<-left_join(test,tibble(id=map(values, 1), `Snittblankning - 1 månad`=map(values, 3)),by = "id")

# Blankning - 1 år
buy<-paste0("https://apiservice.borsdata.se/v1/instruments/kpis/210/last/mean?authKey=",params$key)
s<-GET(buy)
content<-content(s)
values<-content$values
test<-left_join(test,tibble(id=map(values, 1), `Snittblankning - 1 år`=map(values, 3)),by = "id")

# Återköp - 1 månad
buy<-paste0("https://apiservice.borsdata.se/v1/instruments/kpis/213/last/sum?authKey=",params$key)
s<-GET(buy)
content<-content(s)
values<-content$values
test<-left_join(test,tibble(id=map(values, 1), `Återköp av aktier MKR - Totalt - 1 månad`=map(values, 3)),by = "id")

# Återköp - 1 år
buy<-paste0("https://apiservice.borsdata.se/v1/instruments/kpis/215/last/sum?authKey=",params$key)
s<-GET(buy)
content<-content(s)
values<-content$values
test<-left_join(test,tibble(id=map(values, 1), `Återköp av aktier MKR - Totalt - 1 år`=map(values, 3)),by = "id")

test3<-test %>% filter(id == params$id) %>% select(-1)
tmp<-test3
temp<-tibble(Händelse = colnames(tmp),Värde = t(test3))

if(is.null(test3$`Snittblankning - 1 år`[[1]])){
  ft<-"Det finns ingen blankning i företaget som är större än 0,5 procent i snitt senaste året."

} else {
    temp$Värde <- str_replace_all(string = temp$Värde,"NULL","0")
    ft <- flextable(temp)
    ft <- theme_vanilla(ft)
    ft <- add_footer_lines(ft, paste("Blankning och återköp i",bolagsnamn))
    ft <- color(ft, part = "footer", color = "#666666")
    ft <- set_caption(ft, caption = "")
    ft <- width(ft,width = 2.55,)
    ft <- autofit(ft)
    ft
}

r if(class(ft)=="character"){ft}


Värdering

options(scipen = 999999999)
r12<-fetch_r12(params$id,params$key) %>% slice(1:19)
r12$period<-r12$period*3
for(i in 1:nrow(r12)){
  if(nchar(r12$period[i])==1){
    r12$period[i]<-paste0(r12$year[i],"0",r12$period[i],"01")
  }
  else{
    r12$period[i]<-paste0(r12$year[i],r12$period[i],"01")
  }
}
r12$period<-ymd(r12$period)

df<-r12 %>% select(period,revenues,gross_Income,profit_Before_Tax) %>% 
  rename(time = period,
         Omsättning = revenues,
         Bruttovinst = gross_Income,
         EBIT = profit_Before_Tax) %>% pivot_longer(cols=!time,names_to = "Linjer",values_to = "value")

ggplot(df,aes(x=time,y=value,color=Linjer))+
  geom_line(size=1.2)+
  scale_x_date(date_labels = "%b %Y",breaks = "3 month")+
  theme_bw()+
  labs(x = "Datum",  
       y = "Miljoner kr",  
       title = paste0("Omsättning, bruttovinst och EBIT\n",bolagsnamn),
       caption = "Källa: Börsdata")+
  theme(plot.title =                              
          element_text(hjust = 0.5,size = 29),
        plot.caption = element_text(size = 20),
        panel.grid.major.x =                    
          element_line(color = "grey",size=0.5),                         
        panel.grid.minor.x =                       
          element_blank(),                         
        panel.grid.minor.y =                       
          element_line(color = "grey",size=0.2),
        panel.grid.major.y =                       
          element_line(color = "grey",size=0.5),
        legend.position="bottom",
         legend.title = element_blank(),
        legend.text = element_text(color = "black", size = 24),
        axis.title.x.bottom = 
          element_text(size = 28,face = "bold"),
        axis.title.y.left = 
          element_text(size = 25,face = "bold"),
        axis.text.x.bottom = 
          element_text(size=20,angle = 90,vjust = 0.5),
        axis.text.y.left =  
          element_text(size=20))


Relativvärdering vs peers i bransch

telecom<-frame %>% filter(Bransch == Branschs)
if(nrow(telecom)>50){
  telecom<-telecom %>% filter(Land == "Sverige") 
  if(nrow(telecom)>30){
    telecom<-telecom %>% filter(Handelsplats != "Pepins market")
  }
}

kpi_table <- ralger::table_scrap("https://github.com/Borsdata-Sweden/API/wiki/KPI-History") %>% 
  filter(Reporttype == "r12") %>% filter(Pricetype == 
                                           "mean") %>% arrange(KpiId)
kpi_table<-kpi_table %>% slice(2,10,26,36)

M<-matrix(nrow = nrow(telecom),ncol = 4)
for(i in 1:nrow(telecom)){
  for(j in 1:nrow(kpi_table)){
    temp <- httr::GET(url = paste0("https://apiservice.borsdata.se/v1/Instruments/", 
                                  telecom$id[i], "/kpis/",kpi_table$KpiId[j],"/r12/mean/history?authKey=", 
                                  params$key, "&maxcount=1"))
    temp <- httr::content(temp, type = "text", encoding = "UTF-8")
    temp <- jsonlite::fromJSON(temp)
    temp<-temp %>% as_tibble() %>% select(1,4)
    if(is.null(temp$values$v)){break}
    M[i,j]<-temp$values$v
  }
  Sys.sleep(0.2)
}
colnames(M)<-c("P/E","EV/EBIT","Rörelsemarginal","Soliditet")
telecom<-M %>% as_tibble() %>% mutate(id = telecom$id) %>% left_join(telecom)
telecom<-telecom %>% arrange(Rörelsemarginal)
telecom$Rörelsemarginal<-paste0(round(telecom$Rörelsemarginal,1),"%")
telecom$Soliditet<-paste0(round(telecom$Soliditet,1),"%")
telecom<-telecom %>% filter(!is.na(`P/E`))


ft <- flextable(telecom[,c(6,1,2,3,4,8,11)])
ft <- theme_vanilla(ft)
ft <- add_footer_lines(ft, paste("Peers mot",bolagsnamn))
ft <- color(ft, part = "footer", color = "#666666")
ft <- set_caption(ft, caption = "")
ft <- width(ft,width = 0.7,)
ft <- align(ft,part = "all",align = "center")
ft <- fontsize(ft,part = "all",size = 9.8)
ft <- autofit(ft,part = "header")


ft

\newpage

Referenser



JakobJohannesson/bolagsanalyser documentation built on March 14, 2021, 2:51 p.m.