• 11 061 online
  • 1 111 280 medlemmar
  • 57 793 320 inlägg
2017-07-14, 11:14
  #1
Medlem
sinewaves avatar
Här diskuteras kod som gäller saker som att hämta fonddata i Google Spreadsheets eller bara i allmänhet hämta fonddata från olika tjänster av olika anledningar.
__________________
Senast redigerad av sinewave 2017-07-14 kl. 11:17.
Citera
2017-07-17, 15:23
  #2
Medlem
Citat:
Ursprungligen postat av sinewave
Här diskuteras kod som gäller saker som att hämta fonddata i Google Spreadsheets eller bara i allmänhet hämta fonddata från olika tjänster av olika anledningar.

1. Jag försöker i Google Finance hitta något för att i mitt spreadsheet få aktuell data på följande index:
MSCI Europe Net Total Return Index - EUR
MSCI AC Asia Ex Japan Net
MSCI Japan Index, net return.

Jag vet inte hur jag ska göra... för indexen OMX30 och SP500 kopierade jag bara tidigare kod som du postat i den andra tråden.

2. Vad betyder "-305" och " 0;2)" i koden nedan?
Edit: förstår jag rätt om "-305" representerar de 10 senaste månaderna?

Kod:
=MEDEL(INDEX(GOOGLEFINANCE("INDEXNASDAQ:OMXS30";"price";TODAY()-305;TODAY();"DAILY"); 0; 2))

3. Hur får jag in UNRATE data till GS?

Tack på förhand, Sinewave.
__________________
Senast redigerad av applemos 2017-07-17 kl. 15:40.
Citera
2017-07-17, 16:47
  #3
Medlem
sinewaves avatar
Citat:
Ursprungligen postat av applemos
1. Jag försöker i Google Finance hitta något för att i mitt spreadsheet få aktuell data på följande index:
MSCI Europe Net Total Return Index - EUR
MSCI AC Asia Ex Japan Net
MSCI Japan Index, net return.

Jag vet inte hur jag ska göra... för indexen OMX30 och SP500 kopierade jag bara tidigare kod som du postat i den andra tråden.

2. Vad betyder "-305" och " 0;2)" i koden nedan?
Edit: förstår jag rätt om "-305" representerar de 10 senaste månaderna?

Kod:
=MEDEL(INDEX(GOOGLEFINANCE("INDEXNASDAQ:OMXS30";"price";TODAY()-305;TODAY();"DAILY"); 0; 2))

3. Hur får jag in UNRATE data till GS?

Tack på förhand, Sinewave.

1. Om du försöker hämta data från Google Finance som inte existerar där blir det svårt. Sök på finance.google.com innan och se om det du vill ha ens finns tillgängligt. Det är dock enklare att använda data direkt från Avanza.

2. Ja, 305 betyder antal dagar. Oftast synonymt för MA10 (månader). Vad 0;2 betyder minns jag inte.

3. Använd scriptet som postades förut:

Kod:
function getUERATE(ma, cacheTime) {
 
    if (typeof ma !== "number") {
        ma = 12;
    } else {
        ma = ma || 12;
    }
    cacheTime = cacheTime || 32400; // 6 hours
    var cacheString = 'cache_unrate' + ma;
    var cache = CacheService.getScriptCache();
    var cacheData = cache.get(cacheString);    
    var unrate_url = 'https://api.bls.gov/publicAPI/v1/timeseries/data/LNS14000000';
    var response;
 
    // options for all requests
    var options = {
        "muteHttpExceptions": true
    }
    var data;
    response = UrlFetchApp.fetch(unrate_url, options);
    if (cacheData != null) {
        data = cacheData;
    }
    else {
        response = UrlFetchApp.fetch(unrate_url, options);
        data = response.getContentText();
        cache.put(cacheString, data, cacheTime); // cache for 1 hour
    }
    data = response.getContentText();
    data = JSON.parse(data);
 
    if (data.status !== "REQUEST_SUCCEEDED") {
        return null;
    }
    var series = data.Results.series[0].data;
    if (!Array.isArray(series) || series.length < 1) {
        return null;
    }
    var rows = [];
    var currUE = parseFloat(series[0].value);
    if (series.length < ma + 1) {
        ma = series.length;
    }
    var sumRate = 0.0;
    for (var i = 1; i < ma + 1; i++) {
        var ueval = parseFloat(series[i].value);
 
        sumRate += ueval;
    }
    var smarate = sumRate / (ma);
    smarate = Math.round(smarate * 100) / 100;
    //unrate = Math.round(unrate * 100) / 100
    rows.push(["US UE Rate:", currUE.toFixed(2)]);
    rows.push(["SMA" + ma + ":", smarate.toFixed(2)]);
    rows.push(["Recession likely?", smarate > currUE ? "No" : "Yes"]);
    return rows;
 
}

och sedan =getUERATE() eller =getUERATE(); beroende på vilka språkinställningar etc du har.
Citera
2017-07-17, 17:04
  #4
Medlem
Citat:
Ursprungligen postat av sinewave
1. Om du försöker hämta data från Google Finance som inte existerar där blir det svårt. Sök på finance.google.com innan och se om det du vill ha ens finns tillgängligt. Det är dock enklare att använda data direkt från Avanza.

2. Ja, 305 betyder antal dagar. Oftast synonymt för MA10 (månader). Vad 0;2 betyder minns jag inte.

3. Använd scriptet som postades förut:

Tack för hjälpen Sinewave.
Finns det beskrivet i den andra tråden hur du hämtar in data direkt från Avanza?
UNrateskriptet ville ha någon behörighet och att jag skulle logga in på googlekonto. Det var lite märkligt så jag hoppar den biten för tillfället. Vill mest få igång MA10 på mina fonder, men alla korrelerar väl så kanske räcker det ändå med att bara ha trackers på OMX och SP500...
Citera
2017-07-17, 17:10
  #5
Medlem
sinewaves avatar
Citat:
Ursprungligen postat av applemos
Tack för hjälpen Sinewave.
Finns det beskrivet i den andra tråden hur du hämtar in data direkt från Avanza?
UNrateskriptet ville ha någon behörighet och att jag skulle logga in på googlekonto. Det var lite märkligt så jag hoppar den biten för tillfället. Vill mest få igång MA10 på mina fonder, men alla korrelerar väl så kanske räcker det ändå med att bara ha trackers på OMX och SP500...

För att skapa dina egna spreadsheets och göra någonting behöver du givetvis logga in på Google.
Ja, det andra scriptet finns i tråden men här är det igen:

Kod:
/**
* GS AZ-fuldata v1.0.2
*/

function azPost(id, ma, single) {
  
  var azPost_url = 'https://www.avanza.se/ab/component/highstockchart/getchart/orderbook';
  var cacheTime = 32400; // 32400s = 6 hours
  
  id = id || false;
  ma = ma || false;
  single = single || false;
  
  // check if cached
  var cacheString = 'cache_' + id.toString() + ma + single;
  var cache = CacheService.getScriptCache();
  var cacheData = cache.get(cacheString);
  
  if(!id) return 'Inget id definierat';
  
  if(id){
    
    var json = '{"orderbookId":%id%,"chartType":"AREA","widthOfPlotContainer":558,"chartResolution":"MONTH","navigator":true,"percentage":false,"volume":false,"owners":false,"timePeriod":"year","ta":[]}';
    json = json.replace('%id%', id);
    
    if( ma ){
      json = json.replace('[]', '[{"type":"sma","timeFrame": '+ ma +'}]');
    }
    
    // make the request
    var options = {
      'method' : 'post',
      'contentType': 'application/json',
      'payload' : json,
      'muteHttpExceptions': true
    }
    
    var response, data;
    
    if(cacheData != null) {
      data = cacheData;
    }
    else {
      response = UrlFetchApp.fetch(azPost_url, options);
      data = response.getContentText();
      cache.put(cacheString, data, cacheTime); // cache for 1 hour
    }
    var data = JSON.parse(data);
    var dataPoints = data.dataPoints;
    
    // check if ma set
    if( ma ) var maData = data.technicalAnalysis[0]['dataPoints'];
    
    var rows = [],
        data, i=0, len = dataPoints.length;
    
    for (i; i<len; i++) {
      
      cur = dataPoints[i];
      var date = cur[0],
          nav = cur[1];
      
      var jsdate = new Date(date),
          year = jsdate.getFullYear(),
          month = jsdate.getMonth() + 1, // jsdate = 0 based index
            day = jsdate.getDate();
      
      if( month < 10 ) { month = '0' + month; } // add leading zero
      if( day < 10 ) { day = '0' + day; } // add leading zero
      
      var ymd = year +'-'+ month + '-' + day;
      
      if( ma ) {
        var cur_sma;
        if ( maData[i+1] ){
          cur_sma = maData[i+1][1]; // sma-index is index-1
        }
        else { cur_sma = ''; }
      }
      
      // last point did not have ma, must find latest ma (since 1 year data does not include 100% of all MA-points)
      if( ma && cur_sma === '' ){
        var len = maData.length;
        cur_sma = maData[len-1];
      }
      
      if( !single ){
        if( !ma ) { rows.push([ymd, nav]); }
        else { rows.push([ymd, nav, cur_sma]); }
      }
      else {
        if( !ma ) { rows.push([nav]); }
        else { rows.push([nav, cur_sma]); }
      }
      
    } // end loop
    
    // set headers
    if(ma) { rows.unshift(['Datum', 'Kurs', 'MA'+ma]); }
    else { rows.unshift(['Datum', 'Kurs']); }
    
    // check if user wants single (value)
    if( single ) {
      var len = rows.length,
          lastRow = rows[len-1];
      
      rows = [lastRow];
    }
    
    return rows;
    
  }
  
} // azPost()

// hämta senaste kurs
function azNav(id, ma, res){
  return azPost(id, ma, true);
}

function toPercent(val){
  return Math.round(val*10000)/100;
}

/* hämta 1 mån, 3 mån, 6 mån etc */
function azPerf(id,ma,cacheTime){
  
  id = id || false;
  ma = ma || 10;
  cacheTime = cacheTime || 32400; // 6 hours
  
  if(!id) return 'no id was set';
  
  var azFund_url = 'https://www.avanza.se/_mobile/market/fund/{id}',
      azStock_url = 'https://www.avanza.se/_mobile/market/stock/{id}',
      check_url = 'https://www.avanza.se/_mobile/market/orderbooklist/{id}',
      response, data, rows = [], url;
  
  // options for all requests
  var options = {
    "muteHttpExceptions":true
  }
  
  
  // first check what type something is, can be either FUND or something else
  // all 'something' else has a different format, but the *SAME* format
  
  // check if cached
  var cacheString = 'check_' + id.toString() + ma;
  var cache = CacheService.getScriptCache();
  var cacheData = cache.get(cacheString);
  
  if( cacheData ){
    data = cacheData;
  }
  else {
    check_url = check_url.replace('{id}', id);
    response = UrlFetchApp.fetch(check_url, options);
    data = response.getContentText();
    cache.put(cacheString, data, cacheTime);
  }
  
  var isFund = true;
  
  //return data;
  data = JSON.parse(data);
  data = data[0];
  
  var type = data.instrumentType;
  
  // check what the instrument type was and act accordingly
  if( type !== "FUND" ){ isFund = false;  }
  
  if( !isFund ){
    
    url = azStock_url.replace('{id}', id);
    
    // check if cached
    var cacheString = 'stock_' + id.toString() + ma;
    var cache = CacheService.getScriptCache();
    var cacheData = cache.get(cacheString);
    
    if( cacheData ){
      data = cacheData;
    }
    else {
      check_url = check_url.replace('{id}', id);
      response = UrlFetchApp.fetch(url, options);
      data = response.getContentText();
      cache.put(cacheString, data, cacheTime);
    }
    
    data = JSON.parse(data);
    
    // not a fund, we must manually calculate returns
    // and set this to data-object
    
    if( data.sellPrice ){
      var currentNav = data.sellPrice; // .buyPrice also available (AZ uses sellPrice)
    }
    else {
      var currentNav = data.lastPrice;
    }
    data.NAV = currentNav;
    
    
    // add all changeSinceXXX
    data.changeSinceOneMonth = toPercent((currentNav/data.priceOneMonth)-1);
    data.changeSinceThreeMonths = toPercent((currentNav/data.priceThreeMonthsAgo)-1);
    data.changeSinceSixMonths = toPercent((currentNav/data.priceSixMonthsAgo)-1);
    data.changeSinceOneYear = toPercent((currentNav/data.priceOneYearAgo)-1);
    data.changeSinceThreeYears = toPercent((currentNav/data.priceThreeYearsAgo)-1);
    data.changeSinceFiveYears = toPercent((currentNav/data.priceFiveYearsAgo)-1);
    
    // add others
    data.sharpeRatio = '-';
    data.NAVLastUpdated = data.lastPriceUpdated;
    data.startDate = '-';
    data.standardDeviation = '-';
    
    data.managementFee = '-';
    data.name = data.name + ' (' + data.tickerSymbol + ')';
    
    if( type.indexOf('TRADED_FUND') > -1 ){
      data.type = 'ETF';
    }
    else if( type === 'CERTIFICATE'){
      data.type = 'Certifikat';
    }
    else if( type === 'INDEX'){
      data.type = 'Index';
    }
    else {
      data.type = 'Aktie';
    }
    
  }
  
  // it's a fund
  else {
    
    
    // check if cached
    var cacheString = 'fund_' + id.toString() + ma;
    var cache = CacheService.getScriptCache();
    var cacheData = cache.get(cacheString);
    
    if( cacheData ){
      data = cacheData;
    }
    else {
      url = azFund_url.replace('{id}',id);
      response = UrlFetchApp.fetch(url, options);
      data = response.getContentText();
      cache.put(cacheString, data, cacheTime);
    }
    
    data = JSON.parse(data);
  }
  
  var lastUpdate;
  lastUpdate = data.NAVLastUpdated.split('T')[0];
  
  var nav = azPost(id, ma, true),     
      cur = data.NAV,
      //cur = nav[0][0],
      sma = nav[0][1];
  
  if( isNaN(sma) ){
    sma = sma[1];
  }
  
  var diff = Math.round(((cur/sma)-1)*1000)/1000,
    diff = Math.round(diff*1000)/10 + '%';
  
  var stdDev = data.standardDeviation,
      fee = data.managementFee;
  
  // check for changeSince since some will not have certain values
  for( var key in data ) {
    var cur = data[key];
    if( key.indexOf('changeSince') > -1 ){
      if( isNaN(cur) ){ data[key] = 0; }
    }
  } // end loop
  
  rows.push([data.name, data.type, fee, diff, data.NAV, sma, data.sharpeRatio, stdDev, data.changeSinceThreeMonths,data.changeSinceSixMonths,data.changeSinceOneYear, data.changeSinceThreeYears, data.changeSinceFiveYears, lastUpdate, data.startDate]);
  
  return rows;
  
}

Detta gör dock liten nytta om man inte har ett Google-konto och således inte kan skapa Google Spreadsheets. :-)
Citera
2017-07-17, 17:15
  #6
Medlem
Citat:
Ursprungligen postat av sinewave
För att skapa dina egna spreadsheets och göra någonting behöver du givetvis logga in på Google.

Tack för skriptet, ska testa det!
Haha givetvis är jag inloggad, det var därför det var så konstigt att det ville ha min databehörighet eller vad den nu frågade om. Jag försöker vara försiktig, pga min okunskap om world wide web
Citera
2017-07-17, 17:19
  #7
Medlem
sinewaves avatar
Citat:
Ursprungligen postat av applemos
Tack för skriptet, ska testa det!
Haha givetvis är jag inloggad, det var därför det var så konstigt att det ville ha min databehörighet eller vad den nu frågade om. Jag försöker vara försiktig, pga min okunskap om world wide web

Det där med rättigheter är högst förmodligen för att alla dessa script hämtar data från externa källor som Google inte känner till eller som inte ingår i Googles egna tjänster.
Citera
2017-07-17, 17:27
  #8
Medlem
Citat:
Ursprungligen postat av sinewave
Det där med rättigheter är högst förmodligen för att alla dessa script hämtar data från externa källor som Google inte känner till eller som inte ingår i Googles egna tjänster.

Ok, tack så mkt för hjälpen!
Citera