Czas to pieniądz! Czyli wyścig programistów.

Opublikowane przez Heniek w dniu

Znaczenia powiedzenia z tytułu nie trzeba nikomu tłumaczyć. Dawniej używano go, aby zaganiać chłopów do robót polowych, teraz pewnie częściej pada z ust rodziców do dzieci, albo z ust kierowników do ich podwładnych. Czy bardziej ono pomaga, czy szkodzi na wydajność pracy – to inna historia. To tylko pretekst, aby opowiedzieć o pewnym wyścigu.

Handel wysokich częstotliwości

To pojęcie mało znane, ale jest sposobem na zdobycie fortuny! Nie jest on tak spektakularny, jak znalezienie żyły złota albo założenie firmy-giganta komputerowego. Ale działa. Po angielsku to High Frequency Trading, czyli HFT. O co chodzi? Już tłumaczę, ale po kolei.

Wszystkie działania na giełdach papierów wartościowych można w dużym uproszczeniu sprowadzić do zagadnienia: co kupić, a co sprzedać, aby później na tym zyskać? Tęgie głowy się nad tym łamią, odkąd istnieje handel. Niesamowicie trudno jest przewidzieć wzrosty i spadki cen, bo zależy to od mnóstwa czynników. Więc jak sobie radzić, nie będąc jasnowidzem?

Algorytmy dla handlu

Ekonomiści świetnie znają się na wykresach cen akcji. Rekin biznesu na podstawie kształtów tychże często trafnie przewidzi, w którą firmę warto zainwestować, nawet bez wiedzy z konkretnej dziedziny. Niestety, im dalej chcieć przewidywać, tym jest to trudniejsze. Ma na to wpływ teoria chaosu, ale to inna matematyczna opowieść.

Więc kto szybko wykalkuluje opłacalność, pójdzie, kupi taniej, a potem sprzeda drożej – ten ma najlepszy zysk. Niestety, każde takie kupno i sprzedaż też ma wpływ na cenę akcji. Więc lepiej się spieszyć! Jeśli ktoś nas ubiegnie, już może się nie opłacać inwestycja w Zenek-Pol, tylko np. Zenek-Max. Ale to trzeba będzie wyliczyć od nowa.

Jeżeli opłacalność transakcji można wydedukować tylko z wykresów cen, to, uwaga, uwaga! Do roboty da się zaprząc komputer. Wystarczy dobrze wymyślić formułę. W zasadzie wygląda to jak szkolne zadanie:

Dane:

  • historia cen różnych towarów
  • ilości posiadanych towarów

Szukane:

  • ile i jakie spośród dostępnych towarów opłaca się kupić?
  • ile i jakie spośród dostępnych towarów opłaca się sprzedać?

W internecie łatwo dostępne są notowania giełdowe, które są właśnie historią cen papierów wartościowych. Gorzej ze sposobem rozwiązania (czyli algorytmem), który pozwalałby podjąć trafną decyzję. Nie weźmiemy go ze szkolnego podręcznika. Teoretycznie mógłby brzmieć: “kupuj, gdy jest tanie, sprzedawaj, gdy jest drogie”. Praktycznie takie algorytmy są opracowywane przez doświadczonych maklerów i pilnie strzeżone. Ale to wciąż o wiele za mało! Nie wystarczy rozwiązać takie zadanie, trzeba to zrobić szybciej, niż komputer konkurencji – bo inaczej trzeba będzie to robić od nowa. Stąd właśnie:

Wysokie częstotliwości

W tym miejscu zmieniamy dziedzinę: z finansów na programowanie! Wszak można wziąć powyższą formułę (oczywiście, jeśli się ją ma) i napisać program, który rozwiązuje zadanie sam, i to szybciej niż człowiek. Nie jest to zbyt łatwe, bo:

  • konieczne jest zastosowanie skomplikowanej matematyki;
  • zazwyczaj zależy od szeregu parametrów, które trzeba po prostu wymyślić;
  • wynik jest obarczony ryzykiem, które też dobrze byłoby obliczyć;
  • trzeba zdążyć przed konkurencją.

Ostatni punkt sprawia, że zadanie jest po prostu karkołomne! Bo na wolnym rynku, gdzie obowiązuje ciągła rywalizacja, oznacza to wyścig. Chodzi o to, żeby często zawierać mnóstwo transakcji, szybko reagując na najmniejsze nawet zmiany cen. Obliczenia trzeba więc nieustannie przyspieszać i stąd określenie “wysokie częstotliwości”. Jak szybko to działa? Sęk w tym, że nie ma ograniczeń. Ponieważ transakcje mogą być w pełni zautomatyzowane, to wystarczy wyprzedzić konkurencję o 1 ns (0,000 000 001 s), aby zyskać minimalną przewagę. Można wygrać o nanosekundę.

Jak ścigają się programy?

Uwaga, teraz będzie trochę technicznie. Kupienie szybszego komputera dawno przestało wystarczać. Oto parę sztuczek, które można zastosować, aby podrasować program:

  • Użycie właściwego języka programowania: C++ lub C zamiast Pythona czy Javy. Są uważane za mniej przyjazne, ale często szybsze w działaniu.
  • Przesunięcie obliczeń z czasu działania do pisania (dokładniej: kompilacji) programu. Pewne rzeczy można obliczać z góry, żeby nie tracić czasu w kluczowym momencie.
  • Unikanie operacji na pamięci: tak, jak zazwyczaj zapis pliku na twardy dysk jest ręczny, ponieważ chwilkę trwa. Tutaj znaczącą chwilę trwa zajmowanie i zwalnianie pamięci RAM, więc lepiej robić to np. tylko raz, przy uruchomieniu programu.
  • Przechowywanie wszelkich danych w szybkich kontenerach, aby były dostępne bez żmudnego wyszukiwania lub sortowania.
  • Wykorzystanie odczytu bloków pamięci na raz: procesor i tak zawsze odczytuje ją pewnych kawałkach jednocześnie, ale trzeba umieć tego użyć.
  • Unikanie wielowątkowości. Zaskakujące, ale kilka jednoczesnych kalkulacji często jest nieopłacalne! Wymaga bowiem synchronizacji, wymiany danych, czasami oczekiwania, aż zakończą się jakieś obliczenia. Tymczasem tutaj potrzeba tylko błyskawicznej odpowiedzi.
  • Maksymalne wykorzystanie predyktora rozgałęzień: to mechanizm ukryty wewnątrz procesorów, który zgaduje przyszłość. W uproszczeniu: wykonuje zawczasu pewne instrukcje, których powtarzania się spodziewa, aby mieć szybciej gotowy wynik.
  • Obliczanie przybliżone. Ponieważ zadanie jest matematyczne, to oczywiste jest używanie łatwo dostępnych metod, choćby dla potęgowania. Jednak niekiedy liczenie do któregoś z kolei miejsca po przecinku może być nieopłacalne, lepiej szybciej poznać wynik mniej dokładny.

I to są dopiero schody! Widać tutaj, na co komu są tak trudne zagadnienia z tej dziedziny. Ale czyż maszynka do robienia pieniędzy może być prosta? Jest jeszcze jeden szczegół, od którego czacha dymi: prędkość światła.

Światło jest za wolne

Kto ma minimalnie pojęcie o tej prędkości, ten chyba właśnie popukał się w głowę. Ono może okrążyć Ziemię 7,5 raza na sekundę, to ma być wolno?! Tak, bo w 0,001 s przebywa “zaledwie” 300 km. A sygnały “kup, sprzedaj” pędzą na giełdę właśnie maksymalnie z prędkością światła. To fizyczne ograniczenie każdej prędkości. Czyli… Zamiast przyspieszać swój program o 0,001 s, można uruchomić go 300 km bliżej serwera giełdy – wyjdzie na to samo! Efekt? Nie mogąc przyspieszyć światła, specjaliści z domów maklerskich stosują kolejne sztuczki, niezwiązane z programowaniem:

  • specjalna konfiguracja systemu operacyjnego (zawsze obciąża on procesor);
  • użycie FPGA zamiast procesorów (to układy scalone wyspecjalizowane tylko dla jednego zastosowania);
  • skonfigurowanie połączenia przez Internet jak najbardziej bezpośrednio (każde urządzenie sieciowe po drodze do giełdy wprowadzi pewne opóźnienie);
  • przenosiny komputera bliżej, nawet do wewnątrz budynku giełdy (żeby zyskać 1 ns, trzeba skrócić dystans zaledwie o 30 cm);
  • używanie łączności bezprzewodowej zamiast kabli (sygnał jest szybszy w powietrzu, niż w miedzianym przewodzie).

Podsumowując

Co z tego wszystkiego wynika?

Po pierwsze: HFT dowodzi, że istnieją prawdziwe maszynki do zarabiania pieniędzy. Ale nie są magiczne, działają na zasadzie wyścigu między sobą.

Po drugie: programiści, którzy ogarniają te systemy od zaplecza, posiadają bezcenną wiedzę. Ich umiejętności przekładają się na (teoretycznie) nieograniczone zyski.

Po trzecie: ludzka pomysłowość jest tak wielka, że ograniczają ją tylko prawa fizyki, jak na przykład limit prędkości światła.

W przyszłości do HFT może użyte będą komputery kwantowe, które obecnie nie wychodzą poza laboratoria. Może wprowadzane będą ograniczenia prawne, aby nie dochodziło do absurdów. Zrobienie przeciągu w pokoju z serwerem może przesunąć go o mikroskopijną odległość, głupio byłoby przez to spóźnić się o 0,000 000 000 000 001 s i stracić majątek.

A dokąd zdąża ten wyścig programistów? Do ciągłego ulepszania swoich dzieł, a więc i rozwoju swojej wiedzy! Do stawania się coraz to lepszym. Do fascynacji tym, jak ułamki sekund mogą dzielić wirtualnie działającą matematykę od jak najbardziej realnych pieniędzy.


0 Komentarzy

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *