Osakesijoittaminen

Salkkujen seuranta: excel-taulukot

Pariin päivään investing.com kurssihaku ei ole toiminut. Tietääkö onko siellä muutettu lähdekoodia, ja miten ao. skriptiä pitäisi korjata?

Esim täältä kaivalla lähdekoodia: REMEDY | Remedy Entertainment Oyj Osakkeet - Investing.com

Tällä olen siis engl. kiel. google sheetsissä saanut kurssitiedon ja tehnyt myös desimaalipisteen korvaamisen pilkulla

Ps. Onneksi mm. Avanzan skriptit vielä toimivat…

Kokeile onnistuuko tällä linella (itsellä toimii suomenkielisesä sheetsissä):


edit: tässä vielä suoraan kopioitavissa: =IMPORTXML(“REMEDY | Remedy Entertainment Oyj Osakkeet - Investing.com” ; “//*[@id=’__next’]/div/div/div[2]/main/div/div[1]/div[2]/div[1]/span”)
edit 2: äh, tämä tulkitseekin tuon osoitteen tuolla tavalla, mutta saa tuosta ainakin tuon loppuosan :smiley:

1 tykkäys

Kannattaa kokeilla tässäkin ketjussa mainittua yahoofinance-skriptiä, toimii varmemmin kuin investing.com

1 tykkäys

Toimiiko teillä yahoofinance-skripti normaalisti? Tein sen pohjalta vähän jatkokehitystä ja tänään lopetti toimintansa ja esimerkiksi hinnan tilalle tulee tällä hetkellä muutos.

Näyttäis olevan rikki. :roll_eyes: Pitää katsoa illemmalla onko korjattavissa vai meneekö paaliin.

1 tykkäys

Tuskastelin samaa, mutta onneksi Marketwatchin kautta sain Remedyn toimimaan:
=IMPORTXML(“REMEDY Stock Price | Remedy Entertainment Oyj Stock Quote (Finland: Helsinki) | MarketWatch”, “/html/body/div[3]/div[2]/div[3]/div/div[2]/h3/span”)

1 tykkäys

Nyt näyttää taas pelaavan normaalisti. Ilmeisesti yhteys Googlelta kolmansien osapuolten servereille tahtoo välillä takuta.

1 tykkäys

Mandatumin 9A-veroraportilla on käytetty eri valuuttakurssia kuin kaikilla muilla Mandatumin raporteilla. Tämä herättää nyt Mandatumin asiakkaissa luonnollisesti hämmennystä. Tässä esimerkki:
image
EKP:n USD-kurssi 21.2.2020 on 1,0801 https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/usd.xml
Päivän alin ja ylin kurssi Tradingviewstä.

TradesExecuted -excelin lehdellä ‘Kaupan kirjattu summa’ sarakkeessa ‘Summa asiakkaan valuutassa’ on siis “väärin”, koska siinä on käytetty jotain kaupankäyntialustan kurssia. Tuo nyt kuitenkin sattuu TV:n päivän vaihteluväliin. Aivan kamalan väärin sekään ei ehkä olisi, mutta parempi olisi laskea tuolla EKP:n kurssilla.
image

Millä excel-kaavalla saisi päivän valuuttakurssin poimittua tuosta EKP:n urlista?

2 tykkäystä

Aloittelija kyselee että saako Nordnetissä olevan salkun sisällön jonkun apin kautta haettua esim Google sheetiin? Haluisin saada piirakoita ja käppyröitä mm. maantieteellisestä hajautuksesta jne.

Sivuni/Tilin yleisnäkymä. Oikealla ylhäällä omistusten päällä on ostoerittäin. Klik. Sivulla oikealla ylhäällä löytyy vie csv-tiedottoon. Saat exeliin salkkusi.

1 tykkäys

Hmm, kiitos tästä. Pitää tutkia. Ei taida kuitenkaan täysin palvella tarpeitani eli ei excelin tiedot kerro esim toimialaa tai maantieteellisyyttä joista ois ollu mielenkiintoista piirrellä piirakat.

Ei Excel voi saada tietoja, joita sille ei anneta. Toki voit lisätä tiedon itse ja piirtää sitten graafit

Kokeilepa lisätä salkkusi Morningstarin x-ray palveluun. Sieltä saa rutosti tietoa

1 tykkäys

Viitsiikö joku auttaa Marketscreenerin konsensus-ennusteiden imaisemisessa Google Sheetsiin? Olen tähän mennessä käyttänyt IMPORTXML-komentoa, mutta tämä on vähän huono ratkaisu sillä valinnassa käytettävä XPath ei ole vakio vaan voi muuttua konsensusdatojen päivittyessä.

Nykyinen komento:
=SUBSTITUTE(INDEX(SPLIT(IMPORTXML("https://www.marketscreener.com/quote/stock/REMEDY-ENTERTAINMENT-OYJ-39437145/consensus/", "//*[@id='zbCenter']/div/span/table[4]/tbody/tr[2]/td[3]/div[2]/div[2]/table/tbody/tr[3]/td[2]/b"), " "), 1, 1), ",", ".")

Tuo yllä oleva siis toimii, mutta joidenkin osakkeiden kohdalta menee aina välillä rikki. Tälläkin pääsee eteenpäin, mutta kuulen mielelläni jos joku saa vaikka imaistua tiedot IMPORTHTML:n avulla (itse en saanut dataa sillä ulos).

=QUERY(IMPORTHTML("https://www.marketscreener.com/quote/stock/REMEDY-ENTERTAINMENT-OYJ-39437145/consensus/", "table", 30), "select Col2 where Col1 Starts with 'Average target price'",FALSE)

Tuolla saa average consensus tekstin muodossa * 50,00 € *

Siitä saa numeron jota sheetsi ymmärtää tällä
=REGEXEXTRACT("* 50,00€ *","([0-9]+[,][0-9]+)")
=> 50,00

Yhtenä pötkönä

=REGEXEXTRACT(QUERY(IMPORTHTML("https://www.marketscreener.com/quote/stock/REMEDY-ENTERTAINMENT-OYJ-39437145/consensus/", "table", 30), "select Col2 where Col1 Starts with 'Average target price'",FALSE),"([0-9]+[,][0-9]+)")

E: jos tota yrittää laittaa muille yhtiöille niin voi olla että joutuu muokkamaan tuota IMPORTHTML-funktion parametria joka on nyt 30 (Kertoo funktiolle kuinka monennetta html-tablea halutaan käsitellä). Se tuntuu vaihtelevan n. 25-31 välillä riippuen yhtiöstä. Esim Titaniumille se on 28

1 tykkäys

Tässä tarvitaan taustalle sama cheerio kuin yahoofinance-skriptissäkin, eli jos käytetään eri sheetillä niin pitää asentaa vastaavalla tavalla.

function marketscreener(symbol) {
  const content = UrlFetchApp.fetch("https://www.marketscreener.com/quote/stock/"+symbol+"/financials/").getContentText();
  const $ = Cheerio.load(content);
  const years = $("td.bc2Y").toArray().map((element) => { return $(element).text()}).filter(unique);
  const data = $("td.bc2V").toArray().map((element) => { return $(element).text().replace(/ /g, "").replace(/\,/g, ".").replace(/x/g, "")});
  var dataArr = [];
  while(data.length) dataArr.push(data.splice(0,(years.length)));
  var titles = $("td.bc2T").toArray().map((element) => { return $(element).text()});
  dataArr.forEach((element, index) => element.unshift(titles[index]));
  years.unshift("");
  return [years].concat(dataArr);
}

function unique(value, index, self) {
  return self.indexOf(value) === index;
}

Ja käyttö menee seuraavasti:

=marketscreener("LEGGETT-PLATT-INCORPOR-13369")

…ja siitä voi sitten kaivella haluamansa vaikkapa index- ja vlookup-funktioiden kanssa.

3 tykkäystä

Saako kurssitietoja ajettua Bloombergista jollain konstilla? Mulla on edelleen ongelmana PYN Eliten kurssi, jota en ole saanut muualta kuin investing.comista, mutta se on tunnetusti epävakaa. Tai saan sen myös Morningstarista, mutta sekään ei vaikuta yhtään vakaammalta.

Bloomberg sanoo että pitäisi maksaa sivuston käytöstä, mutta yksityisen selailun tilassa sivu aukeaa normaalisti.

Edit: Kiitos kovasti @Prophier ! Tuo ratkaisi ongelman ja pääsin kokonaan eroon epävakaasta Investing comista. On tämä Inderesin palsta kyllä huippu!

Edit2: Ainakin mun Google Sheets -versiossa pitää pilkut vaihtaa puolipisteiksi, niin kaava lähtee pelittämään. Sama oikeastaan on koskenut muitakin tässä ketjussa olevia kaavahäkkyröitä.

1 tykkäys
=index(split(importhtml("https://www.pyn.fi/en/pyn-elite/performance/","list",1),"*",TRUE,TRUE),1,2)
3 tykkäystä

FYI krypto-niiloille, yahoofinance-scriptin saa toimimaan myös kryptoille seuraavilla koodinpätkillä (esimerkkinä tässä bitcoin):

=yahoofinance("BTC-USD","price")
=yahoofinance("BTC-USD","change")
=yahoofinance("BTC-USD","changepct")

Kudos @Prophier scriptistä ja avusta :pray:

Ja kertauksena, ohjeet yahoofinancen käyttöön oli tässä viestissä:

1 tykkäys

Kun olen täysin käsi näiden kanssa, niin miten tämä siis tapahtuu?

Pari esimerkkiä tuota Leggett & Plattia käyttäen. Selkeyden vuoksi laita aluksi A1-soluun

=marketscreener("LEGGETT-PLATT-INCORPOR-13369")

Index-funktiolla voit valita rangesta yksittäisen solun, rivin tai sarakkeen. Kaavaan isketään vain halutut koordinaatit. Esimerkiksi datan vuosiluvut tai sitten vuodelle 2023 ennustetun efektiivisen osinkotuoton saat näillä:

=index(A:G,1,)
=index(A:G,5,7)

Tuo mainitsemani vlookup ei ollutkaan ihan optimi, kun se palauttaa vain yksittäisen solun. Sen sijaan tehokkaampaa on yhdistää filter- ja find-funktiot siten, että komento etsii hakusanaa vastaavan rivin. Tässä on se etu, että rivit eivät mene sekaisin vaikka marketscreenerin tablet eivät ole ihan vakiomuotoisia (vertaa vaikka Leggettiä Sitowisen dataan). Rivi löytyy vaikka seuraavasti:

=filter(A:G,find("Net sales",A:A)>0)

Saman voi tehdä seuraavasti query-funktiolla, joka on todella monipuolinen laite moneen muuhunkin datan kahlaamiseen ja analysointiin:

=query({A:G},"select * where Col1 contains 'Net sales'",0)

Query mahdollistaa myös siistimmän sheetin siinä mielessä, ettet joudu ottamaan tuota isoa sarakkeet A-G täyttävää datakasaa ruudulle pyörimään. Silloin voit yhdistää marketscreenerin tuohon saman komennon sisään ja hakea vaikka suoraan vapaat kassavirrat:

=query(marketscreener("LEGGETT-PLATT-INCORPOR-13369"),"select * where Col1 contains 'Free Cash'",0)
1 tykkäys