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

Minule jsme stahovali historická data ze serveru YAHOO, dneska se vrhneme na úplně totéž pouze s tou výjimkou, že zdrojem dat nám bude všemocný a všeobjímající GOOGLE. Jak uvidíte, kód je vlastně úplně tentýž, takže čas, který bychom zabrali vysvětlováním, věnujeme raději tomu, abychom data z YAHOO a GOOGLE vzájemně porovnali.

Google

Jediné, co je alespoň trochu odlišné od YAHOO je fakt, že GOOGLE používá trochu jiný formát pro URL, z něhož lze historická data stáhnout. CSV soubor se stejnými daty jako v minulém díle bychom tedy dostali po zadání:

http://www.google.com/finance/historical?output=csv&q=GLD&startdate=2013-12-04&enddate=2014-09-19

Dále už je to opravdu stejné a my můžeme psát kód ve smyslu minulého dílu seriálu.

Srovnáváme data

Abychom dnes alespoň něco užitečného udělali, srovnáme data ze serveru YAHOO s daty ze serveru GOOGLE. K tomu budeme muset kód trochu modifikovat. Uvědomme si, že rozdíly mohou  být ve dvou věcech:

  1. V jednom či druhém zdroji dat mohou chybět některé datumy, a / nebo
  2. Datumy sice mohou souhlasit, ale budou rozdílné zavírací ceny.

Abychom vše nějak smysluplně porovnali, už nám nebude stačit seznam zavíracích cen, ale budeme potřebovat nějakou strukturu, kam uložíme dvojici datum – cena pro každý zdroj dat. A pak provedeme několik LINQ to Objects dotazů, konkrétně

  1. Existují v souboru dat z YAHOO datumy, které chybí v souboru z GOOGLE a naopak?
  2. Pokud jsou datumy stejné, existují lišící se CENY?

Kód bude následující:

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

Module Module1
  Sub Main()

    Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture
    Dim myClient As WebClient = New WebClient()
    Dim reply_google As String = myClient.DownloadString("http://www.google.com/finance/historical?output=csv&q=GLD&startdate=2013-12-04&enddate=2014-09-19")
    Dim reply_yahoo 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ých souborů
    Dim Akcie_google As List(Of Akcie) = ParsujDataZRetezce(reply_google)
    Dim Akcie_yahoo As List(Of Akcie) = ParsujDataZRetezce(reply_yahoo)

    Console.Write("{0} – {1}", Akcie_google.Count, Akcie_yahoo.Count) 'mělo by jich být stejně

    Dim YahooDatumyNavic As List(Of Date) = (From y In Akcie_yahoo Select y.Datum).Except(From g In Akcie_google Select g.Datum).ToList 'neměly by být žádné
    Dim GoogleDatumyNavic As List(Of Date) = (From g In Akcie_google Select g.Datum).Except(From y In Akcie_yahoo Select y.Datum).ToList 'neměly by být žádné

    Dim Rozdily As List(Of Akcie) = (From y In Akcie_yahoo Join g In Akcie_google On y.Datum Equals g.Datum Where y.Cena <> g.Cena Select y).ToList 'neměly by být žádné

  End Sub

#Region "Pomocné metody, funkce a třídy"

  ''' <summary>
  ''' Vrátí seznam akcií na základě vstupu z CSV
  ''' </summary>
  ''' <param name="retezec">Vstupní CSV soubor jako řetězec</param>
  ''' <returns></returns>
  ''' <remarks></remarks>
  Function ParsujDataZRetezce(retezec As String) As List(Of Akcie)
    Dim Zasobnik As New List(Of Akcie)(200)
    Using myReader As StringReader = New StringReader(retezec)
      Using myparser As TextFieldParser = New TextFieldParser(myReader)
        myparser.TextFieldType = FieldType.Delimited
        myparser.Delimiters = New String() {","}
        myparser.CommentTokens = New String() {"Date"}
        Do While Not myparser.EndOfData
          Dim Radek As String() = myparser.ReadFields
          Zasobnik.Add(New Akcie(Radek(0), Radek(4)))
        Loop
      End Using
    End Using
    Return Zasobnik
  End Function

  ''' <summary>
  ''' Pomocná třída pro uložení data a ceny
  ''' </summary>
  ''' <remarks></remarks>
  Class Akcie
    Property Datum As Date
    Property Cena As Decimal
    Sub New(Datum, Cena)
      Me.Datum = Datum
      Me.Cena = Cena
    End Sub
  End Class

#End Region

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.

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

  1. Djm napsal:

    Mel bych dotaz na amina, jaky pouziva konektor k IB platforme. Ja kdyz jsem pred rokem a pul jel akciove pary, tak jsem pouzival knihovnu Krs.Ats.IBNet. Ta je nyni stale ve verzi 9.66 z roku 2012. A mezitim IB udelalo vlastni .NET knihovnu https://www.interactivebrokers.com/en/software/api/apiguide/csharp/csharp.htm

    Tak se chci zeptat admina a ostatnich, kteri to pouzivate, zda byste mi doporucili zustat u puvodni knihovny (nechce se mi prepisovat kod, ktery uz mam). Nebo hrozi nejake riziko, ze Krs.Ats.IBNet je prilis zastaraly a hrozi prusvih, kdyz ho budu pouzivat?

    • admin napsal:

      Používám Krs.Ats.IBNet. Ten vestavěný klient od IB nepřináší nic navíc, pouze je trochu jinak napsaný. Čili to mi za to nestojí.

  2. Kolous napsal:

    Jak jsi zmiňoval, že pro javu není nic jako LINQ. Tak co jsem koukal na nové vlastnosti verze 8, tak Streams API umožňují např. filtrovat nebo řadit data podobným způsobem a bonus k tomu je multithreading zadarmo ;-)

    • admin napsal:

      Jasně, nic proti Javě. Ale zatímco Javu „umím“ tak, že splácám kód, tak ve VB.NET to umím i pochopit a leckdy i vysvětlit ostatním. Tak proto ty články píšu o VB.NET. Jinak LINQ je taky o silné typové kontrole v době překladu, ale to už by bylo pro většinu čtenářů asi info mimo mísu;-).

      Samozřejmě, že v Javě se dá napsat úplně totéž, parsery na CSV jistě má ;-)

  3. 世界の事実… […]ここにいくつかのリンクです、我々はためにリンク 思うが 彼らがしているの価値を訪問[…] …

  4. myk napsal:

    Dneska mi při pokusu o získání realtime price akcie LMT vrací google 400 bad request. Ostatní mi procházejí. Dělá vám to taky?

    http://finance.google.com/finance/info?client=ig&q=LMT

Napsat komentář

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