torsdag 30 juni 2016

Automagi!


Problem

Ett av mina mål med min TrendValue-portfölj är att den ska berätta för mig när jag behöver agera så att jag slipper drabbas av känslomässiga, felaktiga köp- och sälj-transaktioner och undvika min egen idioti och okunskap, och ett steg i den riktningen är att ha ett glidande Stop-Loss på 20%. Tyvärr går det inte att hos Avanza sätta upp glidande Stop-Loss som gäller tills vidare, utan om jag fattat det rätt (förmodligen inte...) så går det bara att lägga det som en säljorder som gäller upp till 30 dagar. Jag hade ju helst sett att det gick att lägga en trigger eller alarm som är permanent och procentuellt räknad från All Time High sedan inköp, och triggern hos Avanza verkar bara vara som ett fast belopp. 







Som den SysAdmin jag är till vardags, så har jag därför försökt lösa uppgiften på egen hand med hjälp av ett Powershell script (JA, det finns bättre skriptspråk. JA, det finns säkert färdiga lösningar på mitt problem. JA, det kan GARANTERAT optimeras. NEJ, det finns inte på GitHub ... jag vet, men jag är nöjd med resultatet och bryr mig inte). Detta är ett as-is-inga-garantier-med-total-avsaknad-av-felhantering-som-potentiellt-kan-formatera-om-Internet-skript, men om du tror att det funkar och aldrig kommer att be mig om hjälp med ev fel, fuckups eller andra fullt möjliga scenarier som kan inträffa så är du VARMT VÄLKOMMEN att använda skriptet. :)

Lösning

I korta drag funkar den så här (jag vet att det är ap-fult, men det fyller sin funktion. Jag har tyvärr inga Powerpoint-skills, så ni får ta det som det är...):

  1. Skriptet körs var 5:e minut (som en Scheduled Task i Windows) och läser in data från CSV-filen med den senaste datan om alla aktierna. 
  2. Aktuell data om aktierna hämtas från Yahoo Finance baserat på ticker.
  3. Jämförelse mellan nuvarande pris och tidigare All Time High görs och uppdateras om det har stigit.
  4. CSV-filen uppdateras med ny data.
  5. Mail skickas OM någon aktie fallit mer än X% från All Time High (för närvarande kör med X=20%, såg en intressant artikel om Stop-Loss)







 













Text-filen

Semikolonseparerad text-fil med innehaven specificerade i form av:
  • companyName - namnet på företaget
  • ticker - stock ticker hos Yahoo Finance
  • price - aktuellt pris på aktien
  • allTimeHigh - All Time High pris på aktien sedan inköp, uppdateras vid varje skriptkörning.
  • athDeviation - beräknas som ((allTimeHigh - pris)/allTimeHigh * 100) och är den procentuella skillnaden mellan All Time High och det nuvarande priset på aktien. Uppdateras vid varje körning.
  • timestamp - tidsangivelse på senaste datat för en aktie, uppdateras vid varje körning
  • alertSent - är i utgångsläget satt till FALSE (skrivs manuellt in i filen när man skapar den), men sätts till TRUE om ett mail har skickats angående den aktuella aktien, för att undvika att scriptet mailar var 5:e minut om larm på samma aktie. Flaggan måste återställas till FALSE manuellt, men tanken är ju att man ska sälja aktien istället eftersom GSL har överskridits.
Screenshot på filen:

Skriptet

Det är väl inte så mycket att säga om, inga funktioner, inga in-parametrar går att använda... plain and simple, från start till slut.

"System Requirements" är att filen med aktie-datan finns ($filepath) och att du har tillgång till en SMTP-server/tjänst som går att skicka mailen via. Sedan får man ändra $trailingStopLossLimit till önskat värde, i mitt fall 20%

Det finns två Write-Host rader som skriver ut om allTimeHigh ökat eller är oförändrat, samt en rad i #Export delen som skriver ut allStocks och dess data. Dessa har jag enbart använt när jag byggt skriptet och de syns bara om man kör det i Powershell-konsollen, så de kan tas bort/kommenteras ut, om man schemalägger det. Enjoy!
 
# Variables and stuff
$alertList = @()
$allStocks = @()
$tempFilePath = "C:\scripts\fin\temp.csv"
$filePath = "C:\scripts\fin\yahoo_stockPrices.csv"
$trailingStopLossLimit = 20 #as percentage

# Get historical data from file
$stocksHistory = Import-Csv -Path $filePath -Delimiter ";"

# Loop through all stocks
foreach($stockHistory in $stocksHistory){

    # Construct URL
    $baseUrl = "http://finance.yahoo.com/d/quotes.csv?s="
    $dataSelection = "&f=snl1c4d1t1" #http://www.jarloo.com/yahoo_finance/, https://greenido.wordpress.com/2009/12/22/yahoo-finance-hidden-api/
    $url = $baseUrl + $($stockHistory.Ticker) + $dataSelection

    # Get current data from Yahoo Finance to CSV file
    Invoke-WebRequest -Uri $url -OutFile $tempFilePath
   
    # Import data from downloaded CSV file
    $stockCurrent = Import-Csv $tempFilePath -Delimiter "," -Header Ticker, CompanyName, Price, Currency, Date, Time

    # Calculate AllTimeHigh deviation
    $athDeviation = ([system.double]$stockHistory.allTimeHigh - [system.double]$stockCurrent.Price)/[system.double]$stockHistory.allTimeHigh * 100
    # Compare current Yahoo prices with historical AllTimeHigh
    if([system.double]$stockCurrent.Price -gt [system.double]$stockHistory.allTimeHigh){
   
        Write-Host "---$($stockCurrent.CompanyName): All time high exceeded!" -ForegroundColor Green
        $stockHistory.allTimeHigh = $stockCurrent.Price
           
    }else{
   
        Write-Host "---$($stockCurrent.CompanyName): All time high NOT exceeded!" -ForegroundColor Yellow

    }

    # Stop Loss Alert filtering
    If(($stockHistory.alertSent -eq $false) -and ($athDeviation -gt $trailingStopLossLimit)){
      
        # Collect current alerts
        $alertList += $stockHistory
        $stockHistory.alertSent = $true
   
    }

    # Update stock with Yahoo Finance data
    $stockHistory.price = $stockCurrent.Price
    $stockHistory.timeStamp = (get-date ($stockCurrent.Date) -Format yyyy-MM-dd) + "T" + (get-date ($stockCurrent.Time) -Format HH:mm:ss) + "Z"
    $stockHistory.athDeviation = $athDeviation

    # Save updated stock info
    $allStocks += $stockHistory

}

# Export
$allStocks | Export-Csv -Path $filePath -Force -Delimiter ";" -NoTypeInformation
$allStocks | Sort-Object athDeviation -Descending| ft -AutoSize

# Send notfication if there are objects on Alertlist
if($alertlist.count -ne 0){

    # Convert AlertList to HTML

$Header = @"
    <style>
    TABLE {border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}
    TH {border-width: 1px;padding: 3px;border-style: solid;border-color: black;background-color: #6495ED;}
    TD {border-width: 1px;padding: 3px;border-style: solid;border-color: black;}
    </style>
"@

    [System.String]$body = $alertList | ConvertTo-HTML -Head $Header
   
    Send-MailMessage -From abc@mail.com -To abc@mail.com -BodyAsHtml -body $body -Subject "Automated Stock Alert" -SmtpServer smtp.mail.com

}





  



tisdag 7 juni 2016

Hail to the screener!

Min villkorslösa tillit till min screener, gjorde att några utdelningar som jag fick i handen idag, ca 600SEK, ska investeras i 50st aktier i det mycket kända och världsledande företaget... *trumvirvel*... Village Farms International Inc i Kanada!!

Tystnaden ekar ut över arenan där den STORE värdeinvesteraren tillkännagör sitt senaste fynd från sin guldtron.
- Hoho, alla följare och likasinnade välinsatta, pålästa och faktabaserade investerare! Varför i hela Helsefyr känner ingen till detta företag som ger varje riskkapitalist gåshud ända ner till tårna? Hur kan ni säga att ni undersökt marknaden om ni har MISSAT denna guldgruva till investering..?
- Vi tror att du hallucinerar eller möjligen har rökt svampar... eller båda. Får vi gå nu? Ingen annan här har NÅNSIN hört talas om din paprikaodling som du investerat i...
- Men ni kan ju inte gå nu... Eehh, vadå okänt? Hur menar ni? Allt som finns på Internet är ju känt för alla, det säger man ju om sociala medier och andra hjärnkrympande avarter av moln-nätverket....
- Att lyssna på dig och dina "bedrifter" är mer hjärnkrympande än att tro på Scientologerna under ledning av Donald Trump...
- Ok, gå ni och köp några trygga, utdelande H&M-aktier igen, så ska jag vara med och bygga ett grönsaksimperium som kommer att ta över världen! Power to the tomatoes, bell peppers and cucumbers!

https://www.google.com/finance?q=TSE:VFF
Village Farms International, Inc. (Village Farms) is a producer, marketer and distributor of greenhouse-grown tomatoes, bell peppers and cucumbers in North America. The Company operates through two segments: Produce business and the Energy business. The Produce business produces, markets and sells the product group, which consists of tomatoes, bell peppers and cucumbers. The Energy business produces power that it sells per a long-term contract to its customer. The Company markets and distributes under its Village Farms brand name, primarily to retail supermarkets and fresh food distribution companies across the United States and Canada. Village Farms operates approximately three distribution centers located across the United States and Canada. The Company, through its subsidiary, VF Clean Energy, Inc., owns and operates a seven megawatt (MW) power plant from landfill gas that generates electricity and provides thermal heat in colder months.

torsdag 2 juni 2016

Rationalitet vs emotionalitet - the battle of braincells!

De flesta av privatinvesterings-bloggarna ute på det stora stygga Internet som skriver om sina investeringar, låter alltid så snusförnuftiga, kloka, genomtänkta, planerande, långsiktiga och målmedvetna. 
"Jag har 100 000SEK investerat idag, sparar 10 000SEK/månad och kommer att uppnå nirvana i form av 10 000 000SEK om 10 år för jag köper bara aktier i företag enligt modell X vilket ger avkastning Y". 
Vid första eftertanke och naturligtvis med utgångspunkt i mitt eget beteende, tänker jag att det är helt orimligt att alla är så konsekventa och strukturerade som de gör gällande från sina höga hästar... eller? Trillar de/ni aldrig ner och slår sig? Alltså, gör de inga, none, zero, nada, ALDRIG några avsteg från de fina modeller och strategier de har satt upp för sig själva och sitt sparande? Nallar lite av allt det goda för att köpa den där prylen de som gärna vill ha? Eller göra resan som ni längtat efter? Eller täcka för renoveringen som behövs? Personligen tvivlar jag, det kan inte bara vara jag som slåss för att hålla undan hjärnspökena, sååå unik är jag inte... :)

Visst, jag vet, jag är allt annat än konsekvent och strukturerad, men jag hymlar inte med det. Jag hoppas ju att detta skrivandet är en resa i sig självt, som ska kunna ge mig en bättre bild av hur jag tänker och resonerar och därigenom kunna förbättra mig och bli en bättre sparare/investerare. Precis som alla andra har jag målbilder för mitt sparande, men oftast känns den bilden väldigt avlägsen med 15 års sparhorisont, hur gärna man än vill blunda för det som händer idag, här och nu. Eftersom målet är avlägset och bilden av det är ganska vag och suddig, gör det att det är svårt att hålla fokus på uppgiften. Som i alla normala projekt bör man därför bryta ner den stora kakan i många små smulor som är mer lättsmälta och hanterbara. Så i andan av det ska jag så småningom försöka ta mig an att göra en vääääldigt enkel projektplan (det måste gå att hålla den uppdaterad och följa den med minsta möjliga ansträngning, annars kommer även den att döden dö, jag känner mig själv alltför väl...) med förväntade resultat vid givna tillfällen.

För lika väl som känslor kommer in i matchen när det gäller att investera sparade pengar enligt givna regler, så är de ju lika mycket en del av vardagen när man sitter med reklambroschyren om semesterresor, katalogen med nya möbler till det renoverade rummet som fortfarande står halvfärdigt, tuffa verktyg som man tycker att man borde behöva när man ska göra byggprojekt A, B och C och så vidare.

Så vad krävs för att kunna hålla sig till rationellt beteende? Ja, förresten, den frågan kan jag rikta både till mig själv och de stackars satar som råkat fastna i den här tanke- och text-geggan. För egen del är svaret ENKELHET. I modell, strategi, plan - allt ska vara så enkelt att vilken apa som helst med Internet-uppkoppling och mina inloggningsuppgifter skulle kunna exekvera enligt instruktionerna. Kanske den här modellen är vettig.