Vinnaren i pepparkakshustävlingen!
2017-05-19, 15:36
  #169
Medlem
Citat:
Ursprungligen postat av Enoxation
Står ganska tydligt i (FB) Tråden om strategier för fonder.

Nåväl, jag har lagt upp scriptet på Pastebin, innehåller även script för US Unemployment Rate. Notera att i
Kod:
azPerf(id;ma;cachetime)
så är cacheTime i detta scriptet i timmar, ex:
Kod:
cell B2=2801,
cell B3=azPerf(B2;10;5)
hämtar data med id:2801, MA:10 och cachar i 5 timmar;

Tack, uppskattar tålamodet - nu har jag fått ordning på det!
Citera
2017-05-19, 15:45
  #170
Medlem
...och kolumnerna som returneras är i huvudsak enkla att identifiera, men för att vara 100% säker:
Kolumnen innan "1 månad", antar att det är indikatorn som talar om hur kursen står gentemot MA10 värdet?

Positivt värde = köp, negativt = flytta pengarna till obligationer?

Som sagt, nybörjare så har inte pusslat ihop alla delar fullt ut ännu!
Citera
2017-05-19, 16:50
  #171
Medlem
Citat:
Ursprungligen postat av neumank
...och kolumnerna som returneras är i huvudsak enkla att identifiera, men för att vara 100% säker:
Kolumnen innan "1 månad", antar att det är indikatorn som talar om hur kursen står gentemot MA10 värdet?

Positivt värde = köp, negativt = flytta pengarna till obligationer?

Som sagt, nybörjare så har inte pusslat ihop alla delar fullt ut ännu!
Kolumnerna är följande:
ID, Fond, Typ, Avgift, Trend/Indikator, Kurs, MA, Sharpe, Standardavvikelse, 3 mån, 6 mån, 12 mån, 3 år, 5 år, NAV hämtad, Startad
Citera
2017-05-19, 17:13
  #172
Medlem
Citat:
Ursprungligen postat av ChiLLon
Kolumnerna är följande:
ID, Fond, Typ, Avgift, Trend/Indikator, Kurs, MA, Sharpe, Standardavvikelse, 3 mån, 6 mån, 12 mån, 3 år, 5 år, NAV hämtad, Startad
Dock har jag i det scriptet på pastrbin har jag valt att ta bort kurs och MA-kurs, stddev mm eftersom enligt mig är den procentuella skillnaden som är viktigast, dvs "indikator"
Citera
2017-05-19, 17:15
  #173
Medlem
Citat:
Ursprungligen postat av ChiLLon
Kolumnerna är följande:
ID, Fond, Typ, Avgift, Trend/Indikator, Kurs, MA, Sharpe, Standardavvikelse, 3 mån, 6 mån, 12 mån, 3 år, 5 år, NAV hämtad, Startad


Hmm,
De första fyra är jag säker på. Därefter kommer en kolumn jag inte kan identifiera, och därefter får jag upp 1 mån, 3 mån, 6 mån, 1 år, 3 år, 5 år. Startad.

Se t.ex. raden för Swedbank ny teknik nedan med ID 1933. 1.25 är avgiften, därefter vet jag inte vad 15.2 står för - sen kommer tidsreferenser (så pass kan jag läsa skriptet att det stämmer).

1933 Swedbank Robur Ny Teknik Branschfond 1.25 15.2 6.68 10.55 25.64 55.86 164.11 307.28 1996-11-11
Citera
2017-05-19, 17:31
  #174
Medlem
Citat:
Ursprungligen postat av neumank
Hmm,
De första fyra är jag säker på. Därefter kommer en kolumn jag inte kan identifiera, och därefter får jag upp 1 mån, 3 mån, 6 mån, 1 år, 3 år, 5 år. Startad.

Se t.ex. raden för Swedbank ny teknik nedan med ID 1933. 1.25 är avgiften, därefter vet jag inte vad 15.2 står för - sen kommer tidsreferenser (så pass kan jag läsa skriptet att det stämmer).

1933 Swedbank Robur Ny Teknik Branschfond 1.25 15.2 6.68 10.55 25.64 55.86 164.11 307.28 1996-11-11
Jag har ändrat i scriptet jag länkade, det inkluderar inte dessa värdena då jag fann dessa ointressanta. Indikator innebär hur mycket dagens pris skiljer sig mot MA<x> i procent.
Så här ser min sista rad ut i scriptet:
Kod:
rows.push([data.name, data.type, fee, diff, data.changeSinceOneMonth, data.changeSinceThreeMonths,data.changeSinceSixMonths,data.changeSinceOneYear, data.changeSinceThreeYears, data.changeSinceFiveYears, data.startDate]);

Byt ut mot detta om du vill ha mer info:
Kod:
rows.push([data.name, data.type, fee, diff,data.NAV,sma,data.sharpeRatio, data.changeSinceOneMonth, data.changeSinceThreeMonths,data.changeSinceSixMonths,data.changeSinceOneYear, data.changeSinceThreeYears, data.changeSinceFiveYears,data.NAVLastUpdated, data.startDate]);

det borde fungera
Citera
2017-05-19, 17:57
  #175
Medlem
Citat:
Ursprungligen postat av neumank
Hmm,
De första fyra är jag säker på. Därefter kommer en kolumn jag inte kan identifiera, och därefter får jag upp 1 mån, 3 mån, 6 mån, 1 år, 3 år, 5 år. Startad.

Se t.ex. raden för Swedbank ny teknik nedan med ID 1933. 1.25 är avgiften, därefter vet jag inte vad 15.2 står för - sen kommer tidsreferenser (så pass kan jag läsa skriptet att det stämmer).

1933 Swedbank Robur Ny Teknik Branschfond 1.25 15.2 6.68 10.55 25.64 55.86 164.11 307.28 1996-11-11
TS har även i en av de senare sidorna kopierat in koden i ett inlägg, alltså utan extern länk. Gå bakåt sida för sida så finner du originalet.
Citera
2017-05-20, 11:50
  #176
Medlem
sinewaves avatar
Det var för data till PV. :)

Här är det andra, paste:at:
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;
  
}


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;
 
}
Citera
2017-05-20, 19:26
  #177
Medlem
Citat:
Ursprungligen postat av sinewave
Projekt låter lite kortsiktigt kanske, men --- absolut!

Förstår dock inte meningen "Trendföljande regler är passande för att undvika större värdefall, men genererar sällan speciellt mycket i överavkastning". Detta är trots allt inte sant:
http://i.imgur.com/wBTysNl.png
1987-2017, Svenskt index kontra Svenskt index + MA10 + långa räntor

Notera att avkastningen är sämre för "Timing Portfolio" fram tills början på 00-talet. Hade någon som främst är ute efter att maximera avkastning valt att fortsätta efter tretton år av underavkastning? I decennier med stigande börs (t.ex. 80 och 90-talet) ger MA-regler inte bättre avkastning, snarare sämre då man missar mycket i trendvändningarna. På 00-talet har vi haft två långa recessioner och därav bättre avkastning för alla strategier som gjorde att man undvek större delen av dom nedgångarna. Tittar man på backtest med 100 år (på typ DJIA) så är avkastningen för ungefär samma som för buy-n-hold, dock med lägre max. drawdown.

Citat:
Ursprungligen postat av sinewave
Det knepiga med korrelation är dock att vi ibland vill sitta med tillgångar som korrelerar ty annars påverkas avkastningen väldigt negativt. Även detta finns ex på i tråden; ett ex där jag endast tar de saker som korrelerar med varandra mindre varpå effekten givetvis blir låg avkastning men givetvis också rekord i låg 'Drawdown', se inlägg #7, 'Uncorrelated Assets':
(FB) Tråden om strategier för fonder

Vad är planen för ditt progg?

Har man inte tillgång till belåning så är det klart bättre att välja den mindre diversifierade portföljen med högre avkastning, men diversifiering ger högre riskjusterad avkastning och kan därav ge högre avkastning till samma risk om man har tillgång till belåning, per CAPM.

Planen är väl att det kanske kan vara en god grund för framtida pensionssparande som jag inte behöver lägga speciellt mycket tid på att underhålla. Sen var jag intresserad av hur MCA kunde förbättras.
Citera
2017-05-21, 00:32
  #178
Medlem
sinewaves avatar
Citat:
Ursprungligen postat av Phynance
Notera att avkastningen är sämre för "Timing Portfolio" fram tills början på 00-talet. Hade någon som främst är ute efter att maximera avkastning valt att fortsätta efter tretton år av underavkastning? I decennier med stigande börs (t.ex. 80 och 90-talet) ger MA-regler inte bättre avkastning, snarare sämre då man missar mycket i trendvändningarna. På 00-talet har vi haft två långa recessioner och därav bättre avkastning för alla strategier som gjorde att man undvek större delen av dom nedgångarna. Tittar man på backtest med 100 år (på typ DJIA) så är avkastningen för ungefär samma som för buy-n-hold, dock med lägre max. drawdown.



Har man inte tillgång till belåning så är det klart bättre att välja den mindre diversifierade portföljen med högre avkastning, men diversifiering ger högre riskjusterad avkastning och kan därav ge högre avkastning till samma risk om man har tillgång till belåning, per CAPM.

Planen är väl att det kanske kan vara en god grund för framtida pensionssparande som jag inte behöver lägga speciellt mycket tid på att underhålla. Sen var jag intresserad av hur MCA kunde förbättras.

Ja?

Nej, någon som hade varit ute efter att maximera avkastningen hade inte kört ett MA10 (månader) i 30 år på ett singulärt index. Ganska givet då det är en defensiv strategi och alla sådana inte presterar bättre än index när index går som bäst. Detta såvida man inte väger upp det hela med diversifiering och med tillgångar som i regel presterar bättre än sitt närmsta index (som småbolag). Även då är det dock svårt att slå superindexet svenskt index om det aldrig kommer någon typ av bredare nedgång.

"Dock med lägre drawdown". Ja, precis. Många hade nog inte suttit kvar om de stod på runt -60% heller och det finns givetvis ännu längre backtester för den som letar:
http://i0.wp.com/www.philosophicalec...swedenall1.jpg

...eller se bara bara serien som Phil. Economics börjar med i denna post:
http://www.philosophicaleconomics.co...movingaverage/
Citera
2017-05-21, 22:16
  #179
Medlem
Fantastiskt bra tråd sinewave!

Jag har själv lekt med Portfolio Visualizer men men kan inte programmera så det har inte ledit till nånting.

Citat:
Ursprungligen postat av sinewave

c) Ja, jag går jag i tankarna att skapa någon gratis och enklare desktopapp bara för fonder och för att folk ska kunna hålla koll på den typen av strategier jag gått igenom. Ovanpå detta kan jag kasta in annonser (icke-störande sådana) givetvis. Skulle dock mer skapa det för min skull än för andras skull.

Ett program där man kan välja strategi och vilka fonder man är intresserad av och som sen genererar köp- och säljsignaler är det precis vad jag skulle vara intresserad av. Men jag tycker att du borde ta betalt. Det värde ett sånt program skulle skapa borde du ha betalt för! Kanske donationer vore en möjlighet så folk kan bidra utifrån förmåga?
Citera
2017-05-22, 10:45
  #180
Medlem
sinewaves avatar
Citat:
Ursprungligen postat av Shef
Fantastiskt bra tråd sinewave!

Jag har själv lekt med Portfolio Visualizer men men kan inte programmera så det har inte ledit till nånting.

Ett program där man kan välja strategi och vilka fonder man är intresserad av och som sen genererar köp- och säljsignaler är det precis vad jag skulle vara intresserad av. Men jag tycker att du borde ta betalt. Det värde ett sånt program skulle skapa borde du ha betalt för! Kanske donationer vore en möjlighet så folk kan bidra utifrån förmåga?

Det finns redan Google-scriptet som jag skapade för ett tag sedan som genererar köp/sälj-signaler. Detta fungerar okej även om Google Spreadsheets kan vara lite svajigt. Men det gör också att behovet av ett program blir lägre för det enda ett sådant då skulle lösa är att göra allt lite enklare.

Pengar blir något av en icke-grej. Användningsområdet är nämligen så pass smalt (strategier för fonder) att antal användare förmodligen blir väldigt lågt. Däremot kommer jag utveckla det ändå, men då mest för egen del. Då behovet är litet går det dock långsammare.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback