Použití VB.NET pro obchodování na burze–3. díl

V minulých dvou dílech seriálu o použití VB.NET při obchodování na burze jsme si ukázali, jak vypočítat SMA200 a SMA5 ze zavíracích dat, která jsme “natvrdo” zadali do kódu. Jak asi tušíte, v praxi se to takto nedělá, protože data z burzy jsou živá a mít je v kódu napevno je v podstatě nesmysl. Dnes si tedy ukážeme, jak data z burzy načítat ze stránek YAHOO, a pro kontrolu, že to máme správně si vypočítáme úplně stejné průměry, jako v předchozích dvou dílech seriálu. Jdeme na to.

Jak na historická data z YAHOO

Server Yahoo poskytuje historická data ve formě CSV souborů (hodnoty oddělené čárkami), dokumentaci k formátu najdeme třeba zde. Je tedy jasné, že pro data od 4.12.2013 do 19.9.2014 (posledních 200 obchodních dnů ke dni, kdy píši tento článek) bychom museli použít URL ve tvaru:

http://ichart.yahoo.com/table.csv?s=GLD&a=11&b=4&c=2013&d=8&e=19&f=2014

(klidně vyzkoušejte, odkaz by měl vrátit CSV soubor sám o sobě).

Jak to zpracovat ve VB.NET

Ve VB.NET se to zpracuje poměrně přímočaře. Nejprve použijeme vestavěného webového klienta, aby nám stáhnul CSV soubor. Ten uložíme do řetězce. Následně tento řetězec projdeme řádek po řádku a “vysápneme” z něj informaci o zavírací ceně pro daný den. Tyto zavírací ceny postupně vložíme do seznamu (List) a pak už je to stejné jako v předchozích dílech – výpočet průměrů.

Kód vypadá následovně:

Code Snippet
Imports System.Net
Imports System.IO
Imports Microsoft.VisualBasic.FileIO
Imports System.Globalization
Imports System.Threading

Module Module1
  Sub Main()
    'nastavíme program tak, aby pochopil že 123.45 je desetinné číslo
    'tedy v ČR by tam byla čárka, v EN tečka, nyní to program pochopí
    Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture

    'webový klient pro stažení CSV souboru
    Dim myClient As WebClient = New WebClient()

    'odpověď serveru uložíme do proměnné. Ohledně formátu viz stránku
    'https://code.google.com/p/yahoo-finance-managed/wiki/csvHistQuotesDownload
    Dim reply As String =
      myClient.DownloadString("http://ichart.yahoo.com/table.csv?s=GLD&a=11&b=4&c=2013&d=8&e=19&f=2014")

    'proměnná pro uložení cen, až je budeme získávat ze staženého souboru
    Dim Ceny As List(Of Decimal) = New List(Of Decimal)(200)

    'budeme číst řetězec, který jsme obdrželi ze serveru
    Using myReader As StringReader = New StringReader(reply)

      'budeme rozkládat na řádky
      Using myparser As TextFieldParser = New TextFieldParser(myReader)

        'soubor je s oddělovačem, ne s pevnou šířkou
        myparser.TextFieldType = FieldType.Delimited

        'tím oddělovačem je čárka (a nic jiného)
        myparser.Delimiters = New String() {","}

        'řádek začínající "Date" nebudeme parsovat (to je 1. řádek)
        myparser.CommentTokens = New String() {"Date"}

        'nyní tedy vlastní "řádek po řádku" práce
        Do While Not myparser.EndOfData

          'načti obsah řádku do pole
          Dim Radek As String() = myparser.ReadFields

          'nyní máme – Date,Open,High,Low,Close,Volume,Adj Close
          'nás zajímá pouze Close, což je pátý prvek pole
          'VB.NET čísluje prvky pole od nuly
          Ceny.Add(Double.Parse(Radek(4)))
        Loop
      End Using
    End Using

    Console.Write(Ceny.Average) 'vypíše 123.71015

    'zde nemusíme otáčet. Již je seřazeno sestupně
    Console.Write(Ceny.Take(5).Average) 'vypíše 117.976

  End Sub
End Module

Přišla mi e-mailem jakási stížnost, že VB.NET je ukecaný. Není to pravda, níže uvádím stejný kód jako je ten nahoře, pouze jsem ho vtěsnal do několika málo řádků. Špatně se to ale čte Mrkající veselý obličej.

Code Snippet
Module Module2
  Sub Main()
    Dim Ceny As List(Of Decimal) = New List(Of Decimal)(200)
    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture
    Using myparser As Microsoft.VisualBasic.FileIO.TextFieldParser = New Microsoft.VisualBasic.FileIO.TextFieldParser(New System.IO.StringReader(New System.Net.WebClient().DownloadString("http://ichart.yahoo.com/table.csv?s=GLD&a=11&b=4&c=2013&d=8&e=19&f=2014")))
      myparser.Delimiters = New String() {","} : myparser.CommentTokens = New String() {"Date"}
      Do While Not myparser.EndOfData : Ceny.Add(Double.Parse(myparser.ReadFields(4))) : Loop
    End Using
    Console.Write(String.Format("{0} {1}", Ceny.Average, Ceny.Take(5).Average))
  End Sub
End Module

Ostatní články tohoto seriálu

  1. Použití VB.NET pro obchodování – zasílání e-mailů (25.2.2015)
  2. VB.NET, burza a Linux–není to šílené? (30.1.2015)
  3. Použití VB.NET pro obchodování na burze–10. díl (16.1.2015)
  4. Použití VB.NET pro obchodování na burze–9. díl (2.1.2015)
  5. Použití VB.NET pro obchodování na burze–8. díl (14.12.2014)
  6. Použití VB.NET pro obchodování na burze–7. díl (3.11.2014)
  7. Použití VB.NET pro obchodování na burze–6. díl (27.10.2014)
  8. VB.NET a burza – REALTIME data z Google–5. díl (20.10.2014)
  9. Použití VB.NET pro obchodování na burze–4. díl (13.10.2014)
  10. Použití VB.NET pro obchodování na burze–3. díl (6.10.2014)
  11. Použití VB.NET pro obchodování na burze - 2. díl (29.9.2014)
  12. Použití VB.NET pro obchodování na burze–1. díl (22.9.2014)
Příspěvek byl publikován v rubrice Nezařazené se štítky . Můžete si uložit jeho odkaz mezi své oblíbené záložky.

6 komentářů u Použití VB.NET pro obchodování na burze–3. díl

  1. Mirek napsal:

    Při přístupu na yahoo pro stáhnutí dat se občas stává, že server je chvilkově nedostupný – v tuto chvíli se program zastaví a nahlásí chybu.

    Dá se to nějakým způsobem ošetřit?

    Napadá mě jakmile bude server nedostupný, tak zkusit akci opakovat za 1 vteřinu. Jak to ale udělat když se v případě nedostupnosti serveru program kousne na příkazu …myClient.DownloadString(„http… ?

  2. Pingback: Použití VB.NET pro obchodování (data od IB) – 12. díl | Akcie

  3. myk napsal:

    Kdo by chtěl stahovat data v Pythonu, doporučuji modul pandas-datareader, který umí číst data z google i z yahoo. Stejný výsledek jako u kódu ve VB.net se dá v Pythonu dosáhnout takto:

    import pandas_datareader.data as web
    import datetime
    import pandas as pd

    startDate = datetime.datetime(1998, 1, 1) # datum, od kdy stahovat data
    endDate = datetime.datetime.now() #načítáme data až do dneška
    workingDir = ‚C:/users/user1‘ #adresář, kam se ukládají data

    # načti data z Yahoo ode dne startDate do dne endDate, výstup je ve struktuře pandas.dataframe
    data = web.DataReader(‚GLD‘, ‚yahoo‘, startDate, endDate)
    # zapiš data do .csv
    data.to_csv(workingDir + ‚GLD‘ + ‚_all.csv‘, index = True, header = True)

    # Kdo by chtěl jen sloupce ‚Date‘ a ‚Adj Close‘ může s výhodou využít vlastnosti pandas.dataframe
    adjclose = data[ ‚Adj Close‘] # vrátí jen sloupce ‚Date‘ (jako index) a ‚Adj Close‘
    # zapiš do .csv
    adjclose.to_csv(workingDir + str(symbol) + ‚adj_close.csv‘, index = True, header = True)

  4. myk napsal:

    zapomněl jsem nahradit str(symbol) v poslední řádce za ‚GLD‘

Napsat komentář

Vaše emailová adresa nebude zveřejněna.