Pobierz skondensowaną porcję wartościowej wiedzy o inwestowaniu!🙂

Ponad 20 lat temu (połowa lat 90. XX wieku), gdy pierwszy raz zetknąłem się z programowaniem, poza środowiskami profesjonalnie zajmującymi się informatyką, było to zagadnienie bardzo mało znane i rozumiane. Nic w tym dziwnego, bo i same komputery osobiste w owym czasie nieśmiało dopiero wkraczały do naszych domów. Od tamtego czasu świat przeżył dosłownie rewolucje.

Obecnie umiejętność programowania nie jest zarezerwowana tylko dla profesjonalistów i coraz powszechniej jest nauczana w szkołach. Coraz więcej też osób chce poświęcić się programowaniu profesjonalnie ze względu choćby na wielość ofert pracy (oby to tylko nie był jedyny powód), gdzie od lat notuje się rekordowe wręcz niedobory kandydatów.

W tym odcinku opowiem na bazie własnych doświadczeń i przemyśleń, na ile wiedza z zakresu programowania może być pomocna w tradingu, spekulacji, czy szerzej — inwestowaniu. Mowię o tym czy każdy może poznać choćby podstawy programowania, oraz przybliżę kilka języków programowania, podając ich praktyczne zastosowania.

Programowanie kojarzy się często z czymś, co jest bardzo skomplikowane. Wcale tak być nie musi. Współczesne języki programowania wysokiego poziomu zostały zaprojektowane tak, by programista mógł jak najbardziej skupić się na rozwiązywanym problemie, przy jak najmniejszym zaangażowaniu w kwestie czysto techniczne.

Traderzy (w szczególności indywidualni traderzy) mogą korzystać ze specjalnie stworzonych dla nich środowisk programowania, tak by poświęcając na naukę dosłownie kilka dni, startując od zera, móc zacząć tworzyć i testować strategie transakcyjne. Do tego nie ma potrzeby kończenia studiów informatycznych i lat nauki zaawansowanych paradygmatów programowania.

Dla znakomitej większości traderów języki typu Assembler, C/C++, czy nawet Java, są całkowicie zbędne. Dużo szybciej i sprawniej można odnaleźć się w językach skryptowych, dostępnych na wielu platformach stworzonych dla traderów (np. AmiBroker, TradeStation) czy popularnym ostatnio języku Python. Jeśli więc rozpoczynasz swoją przygodę z programowaniem na potrzeby tradingu, nie rzucaj się od razu na głęboką wodę – zyskasz masę czasu, a całkiem możliwe, że i pieniędzy.

W tym odcinku dowiesz się

  • Jakie mam kwalifikacje do tego, by wypowiadać się na temat programowania
  • Czym jest programowanie
    • Bardzo krótka historia programowania
    • Czym jest język programowania
    • Podstawowe grupy języków programowania
  • Czy nauka programowania jest trudna?
  • Do czego można wykorzystać umiejętność programowania w tradingu
  • Krótka charakterystyka języków programowania wykorzystywanych w tradingu
    • C/C++ (jako przykład języków kompilowanych do kodu maszynowego)
    • Java, C# (C Sharp), Visual Basic .NET (jako przykład języków kompilowanych do kodu pośredniego, uruchamianego na maszynie wirtualnej) 1 1. C# może być kompilowany również, podobnie jak na przykład C++, do kodu maszynowego. Taki kod uruchamiany jest bezpośrednio w systemie operacyjnym z pominięciem maszyny wirtualnej. ×
    • Python (jako przykład języka interpretowanego z kaczym typowaniem :D)
    • MATLAB
    • R
    • Excel + Visual Basic for Applications (VBA)
    • MetaQuotes Language (MQL)
    • EasyLanguage (TradeStation)
    • TradersStudio
    • AmiBroker Formula Language (AFL)
    • TradeSense (TradeNavigator)
    • Ninja Script (oparty na C# w ramach platformy Ninja Trader)

Przydatne linki do tego odcinka

  • TradersStudio – środowisko do tworzenia i testowania strategi transakcyjnych
  • TradeStation – broker + środowisko do tworzenia i testowania strategi transakcyjnych w języku EasyLanguage
  • R – język programowania i środowisko do obliczeń statystycznych
  • AmiBroker – aplikacja do analizy technicznej wraz ze środowiskiem dla programistów w jęzku AFL
  • Python – interpretowany język programowania ogólnego przeznaczenia
  • Visual Studio Community – darmowe środowisko programowania, m.in. dla języków takich jak: C#, Visual Basic, C++, Python
  • MATLAB – środowisko do obliczeń numerycznych z możliwością programowania
  • NinjaTrader – broker + środowisko do tworzenia i testowania strategi transakcyjnych w języku NinjaScript opartym na języku C#
  • TradeNavigator – platforma transakcyjna i deweloperska wykorzystująca prosty język skryptowy TradeSense
  • MetaQuotes – platforma transakcyjna i deweloperska wykorzystująca język MQL

UWAGA! Nie jestem żadnym masterem programowania. Znam całą masę świetnych programistów, którzy są na niesamowitym wręcz poziomie, o którym nawet nie marzę. Mimo wszystko uważam, że dla zwykłych śmiertelników, nawet spoza świata profesjonalistów, można być przeciętnym rzemieślnikiem, traktującym programowanie jako umiejętność pomagającą w rozwiązywaniu konkretnych problemów. Z sukcesem. Serio 🙂

Zaproszenie do dyskusji

Serdecznie zapraszam Cię do komentowania i zadawania pytań, bezpośrednio na tej stronie poniżej, lub na mojej stronie na Facebook’u lub moim profilu Twitter’owym.

Alternatywnie możesz zadać pytanie głosowe, nagrywając się na SpeakPipe. Pamiętaj tylko, że masz 90 sekund na nagranie. 🙂

Bardzo zależy mi na Twoim głosie, za który już teraz z góry bardzo dziękuję. 🙂

✒ TRANSKRYPT PODCASTU

czyli wersja do czytania

Wstęp


Dzień dobry! Witam Cię serdecznie po nieco dłuższej przerwie w podcaście System Trader. Dziś mamy 11. odcinek. Właśnie przed chwilą skończyłem nagrywanie wywiadu z niesamowitym gościem. Andrea Unger gościł w moim podcaście. Ten wywiad będzie dostępny w 12. odcinku.

Milczałem ostatnimi czasy nieco dłużej niż zwykle, nie oznaczało to jednak, że nic nie robię. Wręcz przeciwnie. Działo się całkiem sporo, tyle, że wiele rzeczy nad którymi pracuję zobaczycie dopiero z dużym opóźnieniem, a niektóre z nich nigdy nie zobaczą światła dziennego, ponieważ umrą szybciej, niż się rodziły. 🙂

Nie jestem typem faceta, który uwielbia przesiadywanie na social mediach – Facebooku, Twitterze, Instagramie. Być może jest to trochę dziwne stwierdzenie, bo zdecydowałem się nagrywać podcast i pisać bloga. W ramach podcastu walczę ze sobą, aby na tych mediach być obecnym. Mimo wszystko nie jest to moje naturalne miejsce bytowania. Nie mam zwyczaju, aby cały czas atakować świat informacjami, co się wokół mnie dzieje. Nie wiem czy to dobrze, czy źle — tak mam.

Dziś w tym odcinku chciałem podzielić się nieco swoją wiedzą z zakresu programowania. Bardzo pobieżnie, muskam zaledwie temat. Nie zamierzam robić w tym odcinku kursu programowania przez podcast. Byłoby to co najmniej trudne, o ile w ogóle możliwe. 😉

Widzę jednak, że coraz więcej osób mierzy się z zagadnieniem programowania, właśnie w kontekście poszukiwania swojego miejsca na rynkach finansowych. Często takie osoby nie wiedzą od czego zacząć, jak to ugryźć. Jeszcze inni nie wiedzą do czego i czy w ogóle programowanie mogłoby pomóc im w tradingu, czy inwestowaniu jako takim.

Ten odcinek skierowany jest głównie do osób początkujących.

Co znajdziesz w tym odcinku?

Na wstępie powiem dlaczego zdecydowałem się mówić o tym wszystkim samodzielnie, bez zaproszenia gościa (czego nie wykluczam w przyszłości).Skrótowo powiem też czym jest programowanie. Czym są języki programowania. Na jakie grupy możemy je dzielić.

Poruszę również temat nauki programowania. Dla wielu to wydaje się czarną magią, niedostępną wiedzą, podobnie jak z matematyką w szkole. Wydaje mi się, że często niesłusznie, bo w ten sposób niepotrzebnie stawiamy sobie wysokie zapory w naszym umyśle. Niektórym wydaje się, że programowanie to takie zagadnienie, które zdecydowanie ich przerasta. Będę chciał się z tym rozprawić i przekonać, że wcale tak być nie musi.

Opowiem w czym umiejętność programowania może nam pomóc w kontekście tradingu. To jest bardzo istotne. Nie będziemy się uczyć programowania po to, aby móc zaimponować koledze czy koleżance. Jeżeli uczymy się programowania, to robimy to po coś, by móc rowiązać jakiś określony problem.

Nie będę mówił o programowaniu w szerszym pojęciu, gdzie mamy docelowo być zawodowym, profesjonalnym programistą. Będę skupiał się na tym, w czym programowanie może nam pomóc, nam jako zwykłym ludziom, jeśli zamierzamy być lub jesteśmy już traderem czy inwestorami. Na koniec opowiem bardzo pobieżnie o kilkunastu językach programowania, które są wykorzystywane powszechnie w świecie finansowym.

Jakie mam kwalifikację do tego, aby mówić o programowaniu?

Aby nieco uwiarygodnić siebie i swoje słowa, to powiem, że z programowaniem pierwszy raz zetknąłem się w połowie lat 90. poprzedniego wieku. To jest ponad 2 dekady. Następnie z tej pasji przerodziło się to w decyzję życiową, że będę się chciał się tym zająć na poważnie. Zdecydowałem się na pójście na studia informatyczne na Akademię Górniczo-Hutniczą w Krakowie.

Swoją drogą, co prawda dawno nie miałem kontaktu z AGH, ale każdy kto dziś myśli o pójściu w stronę informatyki czy programowania, to zdecydowanie mogę polecić AGH, tym bardziej jeśli chce czy może studiować w Krakowie. Naprawdę tam można poznać kawał solidnej, rzetelnej wiedzy. Zdobyłem tam tytuł magistra inżyniera właśnie na kierunku informatyka na AGH.

Od 2005 roku pracowałem na etacie jako programista. Pracowałem, ponieważ od kilku lat, od 2010 roku nie pracuję stricte na etacie, pracując w modelu freelancera. Mam jednak codzienny kontakt z kodem źródłowym, z programowaniem i całym procesem związanym z ta dyscypliną. Cały czas działam bardzo aktywnie w tym obszarze zawodowo.

Jeśli chodzi o aspekty tradingowe, spekulacyjne, finansowe, to system tradingiem, czyli budową systemów transakcyjnych, tę przygodę rozpocząłem w roku 2008. Swoją drogą był to bardzo ciekawy i gorący okres na naukę — zapaść światowej ekonomii. Indeksy w USA śmigały w ciągu dnia +/- 5-10% nawet. Zmiany typu 2-3% w ciągu dnia to była „normalka”.

Od tamtego czasu szlifuję swoje umiejętności, jeśli chodzi o programowanie w kontekście wykorzystania tych umiejętności do budowy systemów transakcyjnych (a raczej nie tyle programowania, co przede wszystkim projektowania strategii).

Linda Bradford Raschke - wywiad

Bardzo pouczający wywiad z kobietą, która z wielkimi sukcesami handluje na rynkach już 40 lat!

Czytaj dalej →

Czym jest programowanie?

Gdyby ktoś zadał mi takie pytanie i padło by ono z ust osoby, która jest totalnie zielona, to powiedziałbym, że jest to umiejętność pisania w języku komputera tego, co chcemy aby komputer dla nas zrobił. Komputer zna szereg języków, w których możemy do niego mówić.

Jeżeli zapiszemy to w języku, który komputer rozumie, to może on dla nas wykonać wiele cennych rzeczy.

Człowiek jest dość kiepski, jeśli chodzi o przetwarzanie na przykład dużych wolumenów danych. To co nam ludziom może zająć dni, miesiące czy długie lata, komputer może wykonać w szybki sposób, w dosłownie ułamku sekundy. Nie tylko jednak o przetwarzanie wielkich wolumenów danych chodzi. Czasami chodzi zwyczajnie o zautomatyzowanie pewnych czynności, odciążając nas, ludzi.

Aby komputer mógł coś dla nas zrobić, to musimy temu komputerowi niejako wytłumaczyć, nauczyć go tego czego od niego oczekujemy.  Do tego celu używane są języki programowania.

Komputer zna szereg języków, w których możemy do niego mówić

Krótka historia programowania

Historia programowania nie jest krótka. Wydaje nam się, że komputery otaczają nas dziś i być może pojawiło się to pierwszy raz w latach 70., 80. czy 90. XX wieku. Historia programowania sięga jednak znacznie dalej.

Pierwsze poważne języki programowania zaczęły powstawać mniej więcej w latach 40. podczas II Wojny Światowej. Były oczywiście zarezerwowane dla bardzo ograniczonego grona (vide projekt Manhattan).

Potem to ewoluowało w stronę większej dostępności komputerów dla szerszego grona ludzi. W latach 50-70. XX wieku powstało sporo języków tak zwanego wysokiego poziomu. Są to języki, które pomagają nam się skupić głównie na tym, co chcemy, aby komputer dla nas zrobił, a nie na tych wszystkich technicznych bebechach, które czasami przysłaniają rozwiązanie, które chcemy dzięki komputerowi znaleźć.

Języki wysokiego poziomu wprowadziły przykładowo takie rzeczy jak programowanie obiektowe, czyli rodzaj techniki programowania, gdzie programista ma wejść na wyższy poziom abstrakcji. Ma skupić się na rozwiązywanym problemie, a nie na technicznych detalach związanych z np. znajomością architektury procesora, na którym ma działać tworzone oprogramowanie. Programista modeluje świat realny na tak zwane klasy, czyli elementy będące odpowiednikami świata realnego (np. klasa samochód, czyli matryca do produkowania samochodów). Później z tych klas tworzone są obiekty, czyli już konkretne byty, z którymi programista może wchodzić w interakcje (ożywiać te obiekty, wykonywać przy ich pomocy konkretne akcje).

Takie podejście, zwane w jęzku angielskim object oriented było już dostępne w latach 70. — nie jest to jakiś ostatni krzyk mody jak by się mogło wydawać. To właśnie wtedy powstawały pierwsze języki programowania z tym podejściem, jak na przykład Smalltalk, w którym miałem nawet okazję przez chwilę programować.

Jeżeli chodzi o programowanie, to rzecz sprowadza się do tego, że programista zapisuje  tekstem tzw. kod źródłowy w edytorze tekstu w notacji, która jest zrozumiała przez komputer. Tę notację (składnię) definiuje nam konkretny język programowania, a jeszcze ścliślej mówiąc — gramatyka języka programowania. Język polski również ma zbiór reguł, ma swoją gramatykę — podobnie, przez analogie jest z językami programowania.

Tak jak ludzkość zna wiele języków, którymi możemy się porozumiewać, podobnie jest jeśli chodzi o komputery. Komputer może znać wiele języków.

Języki programowania dzielimy na kompilowane i interpretowane

Grupy języków programowania

Języki dzielimy na dwie podstawowe grupy: języki kompilowane i języki interpretowane.

Języki kompilowane to takie języki, które w momencie, kiedy napiszemy coś w takim języku jako programiści w edytorze tekstu, to aby to mogło zostać zrozumiane przez komputer, to musimy wykonać jeden dodatkowy krok. Musimy ten kod skompilować.

Kompilator, który zajmuje się kompilowaniem, ma za zadanie przetłumaczyć to, co napisał programista, do kodu, który będzie zrozumiały przez komputer, przez procesor. W przypadku języka C++, kompilator kompiluje kod źródłowy, kod naszego programu, do tzw. kodu maszynowego, czyli do instrukcji, które są rozumiane na poziomie procesora.

Powszechne są też języki kompilowane, których kompilatory nie kompilują kodu programu do kodu maszynowego, tylko kompilują kod źródłowy do tzw. kodu pośredniego. Rozumiany jest on na wyższym poziomie niż procesor, na tak zwanej wirtualnej maszynie.

Takim przykładem języka, który funkcjonuje w ten sposób, jest język Java. Nie mylcie z językiem JavaScript, który poza wspólnym słowem „Java”, nie ma wiele wspólnego z językiem Java.

Również język C# (C Sharp) może funkcjonować w podobny sposób jak Java, tj. na maszynie wirtualnej. Mówię może, ponieważ C# jest wyjątkowym językiem, który potrafi zachowywać się czasami jak Java, czyli funkcjonować na maszynie wirtualnej, a czasami można z niego wydusić nieco więcej i skompilować go podobnie jak język C bezpośrednio do kodu maszynowego.

Jest jeszcze specjalny przypadek, jeśli chodzi o języki. Jest bowiem możliwe, aby pisać bezpośrednio kod, który jest już w postaci instrukcji do procesora — w uproszczeniu mówiąc w języku najniższego poziomu. Mowa oczywiście o języku Asembler.

Problem z takim językiem jest taki, że pisząc kod jest on ściśle przywiązany do konkretnej architektury sprzętowej (procesora). Jeżeli opracowaliśmy taki kod na procesor w architekturze X, to nie możemy takiego kodu łatwo przenieść i wykonać go na procesorze, który jest w architekturze Y. Inna sprawa to, że pisanie w Asemblerze jest żmudne, bardzo żmudne, a przy tym skomplikowane.

OK, ale zejdźmy bliżej ziemii. Chciałbym dodać jeszcze kilka słów odnośnie Javy.

Głównym zamierzeniem języka Java było to, aby napisać kod źródłowy raz, a następnie uruchamiać go na jak największej liczbie komputerów, bez względu na system operacyjny czy architekturę sprzętową.

A więc w idealnym świecie piszemy kod źródłowy w Javie, a następnie maszyna wirtualna (rodzaj platformy uruchomieniowej dla oprogramowania), na której ten kod jest wykonywany, jest dostępna na wiele różnych systemów operacyjnych (np. Mac OS, Windows, Linux, z/OS). Teoretycznie powinno to działać — tę samą aplikację możemy uruchomić np. na Mac’u i Windows’ie. Teoretycznie, ponieważ tym się różni teoria od praktyki, że czasami w praktyce, jeśli ten kod wykorzystuje coś bardzo specyficznego dla konkretnego systemu operacyjnego, to wtedy jest problem z przeniesieniem tego kodu. 😉

Jest jeszcze jedna istotna rzecz, jeśli chodzi o języki kompilowane. Języki kompilowane zwykle są językami typizowanymi statycznie, czyli tak zwane typowanie jest realizowane statyczne. O co chodzi?

Każdy kto już miał jakikolwiek związek z programowaniem wie, czym jest zmienna. Ktoś, kto nie miał nic wspólnego z programowaniem, to wyjaśniam.  Wyobraźmy sobie takie pudełko, które znajduje się w pamięci komputera, w którym chcemy przechowywać jakieś dane. W językach kompilowanych takie pudełko musi już na etapie jego definiowania w kodzie określać jakiego rodzaju dane będą tam przechowywane (np. dane tekstowe czy numeryczne).

Jeśli zarezerwowaliśmy sobie w pamięci zmienną, w której chcemy przechowywać tekst (tzw. string), to nie możemy nagle do takiego pudełka włożyć danych, które są liczbą. To jest tak zwane typowanie statyczne. Programista tworząc taką zmienną musi powiedzieć, że tworzy zmienną, w której będzie chciał przechowywać tekst.

Przykładem takich języków są języki kompilowane: C, C++, Java czy C#. Tu są pewne niuanse, o których nie chcę mówić, żeby nie komplikować bez potrzeby tego odcinka.

Języki interpretowane nie potrzebują kompilowania kodu

Mamy zatem już omówione języki kompilowane. Wiemy też już co to jest typowanie.

Kolejną popularną grupą języków są języki interpretowane, czyli języki, które nie potrzebują kompilowania kodu. Jak napiszemy sobie kod w języku C, to aby móc go uruchomić, musimy wcześniej odpalić kompilator, który jest pewnym rodzajem oprogramowania, które tłumaczy to na kod maszynowy. To dopiero ten kod maszynowy, skompilowany program, możemy uruchomić w systemie operacyjnym jako działającą aplikację. O tym już mówiłem chwilkę temu.

Język interpretowany nie wymaga natomiast poddania kodu procesowi kompilacji. Kod jest tłumaczony, interpretowany czy też parsowany w locie podczas jego wykonania.

Aby lepiej to zrozumieć możemy taki test zrobić, pisząc prosty kawałek kodu w języku JavaScript, który jest rozumiany przez przeglądarki internetowe. Ten kod JavaScript nie musi być w żaden sposób kompilowany wcześniej przed użyciem do np. kodu maszynowego rozumianego przez procesor — jest natychmiast wykonywany w locie (w uproszczeniu można powiedzieć, że systemem operacyjnym takiego kodu w JavaScript jest przeglądarka internetowa). Inaczej jeszcze mówiąć kod jest interpretowany (czytany) przez przeglądarkę i w czasie rzeczywistym wykonywany.

Zwróć uwagę raz jeszcze, że JavaScript to język skryptowy, interpretowany, w odróżnieniu od języka Java — to są zupełnie różne światy.

W przypadku języków interpretowanych mamy tzw. typowanie dynamiczne. Możemy stworzyć zmienną bez określania typu danych które tam będą przechowywane. Możemy więc wstawić do takiej zmiennej tekst, potem liczbę, a później jeszcze coś innego. Jest mniej rzeczy na głowie programisty, ponieważ nie musi pamiętać o typach danych. Może być nieco szybciej i łatwiej napisać kod programu. Oczywiście za pewną cenę. Zwykle języki interpretowane są znacznie wolniejsze od języków kompilowanych. Zaletą jednak języka interpretowanego jest to, że nasz kod źródłowy może być uruchomiony jako program wszędzie, gdzie dostępny jest tylko interpreter danego języka.

Przykładem języków interpretowanych są Python, Matlab czy język R, popularny ostatnimi czasy. Również AmiBroker Formula Language – AFL – to przykład języka interpretowanego.

Czy z inwestowania na rynkach kapitałowych można się utrzymać?

Czy inwestując pieniądze na rynkach finansowych można zarobić godziwe pieniądze?

Czytaj dalej →

Czy nauka programowania jest trudna?

Krótka odpowiedź na to pytanie, według mnie brzmi – nie. Zdecydowanie. Uważam, że dziś ludzie w szkołach podstawowych, czy średnich, na lekcjach matematyki uczą się koncepcji bardziej abstrakcyjnych niż to, co możemy znaleźć w językach programowania, przynajmniej jeśli idzie o posługiwanie się nimi na poziomie tworzenia prostych rozwiązań.

Wychodzę z założenia i nie chcę, aby było to odebrane jako przechwalanie, bo sam jestem po studiach informatycznych, aby ogarnąć od strony logicznej koncepcję programowania, to nie ma w tym wielkich rzeczy, które miałyby ograniczyć dostęp do tej umiejętności tylko wybranym. Każdy człowiek, który skończył szkołę podstawową czy liceum, jest w stanie w kilka dni ogarnąć podstawy niemal dowolnego języka programowania. Nie zaczynałbym jednak od języka niskopoziomowego, jak język C czy Asembler.

Jeśli byśmy zaczęli od prostszego języka skryptowego – Visual Basic, Python, JavaScript, to w kilka dni możemy to ogarnąć na tyle, by napisać i zrozumieć prosty kod.

Koncepcje, które są w językach programowania powtarzają się. Jeśli poznamy język programowania X, to później gdy będziemy chcieli poznać język Y, przyjdzie nam to o wiele łatwiej i szybciej, bo wiele schematów jest takich samych. Będzie inny zapis, będzie nieco inna filozofia, jeśli chodzi o zastosowanie języka. Jednak koncepcje będą identyczne, jeśli chodzi o zrozumienie: bloki warunkowe, pętle, zmiene, stałe, itd.

Po co w takim razie studia informatyczne trwają kilka lat? Musimy odróżnić dwie rzeczy – jeżeli traktujemy język jako narzędzie, którym chcemy rozwiązać konkretny problem, to nie musimy rozumieć do końca jak to narzędzie działa.

Jeśli chcemy obejrzeć film w telewizji, to nie musimy wiedzieć, jak telewizor funkcjonuje. Studia informatyczne to coś więcej. To jak porównać studia informatyczne do anglistyki. Ktoś, kto idzie na anglistykę, to nie idzie tam po to, aby nauczyć się języka angielskiego. Zwykle osoby, które tam idą znają świetnie język. Uczą się tam więcej rzeczy o samym języku, o kulturze itd.

Podobnie jest z informatyką. Szczególnie dziś, ludzie którzy idą na studia informatyczne, to zazwyczaj świetnie programują i to w kilku językach. Nie idą tam uczyć się programowania. Uczą się wielu rzeczy, które w praktyce codziennej, zwłaszcza kiedy jesteśmy traderami i chcemy napisać coś prostego, nie jest nam zupełnie potrzebne. Nie musimy znać wielu szczegółów, czy całej filozofii, która stoi przykładowo za koncepcją programowania obiektowego. Jeśli ktoś jako trader będzie chciał tworzyć systemy transakcyjne, w ogóle nie musi myśleć o programowaniu obiektowym.

Nie musimy też znać mechanizmów działania kompilatora. Nie musimy wiedzieć jak kompilator działa, jak to się dzieje, że tłumaczy nam ten kod źródłowy do kodu wynikowego. Nie musimy również wiedzieć jak działają parsery. I tak dalej.

Co to są parsery? Parser to kawałek oprogramowania, które sprawdza, czy to co wpisał programista jest w zgodzie z tzw. gramatyką języka programowania, z którego korzysta i czy nie łamie zasad tej gramatyki.

Ale aby korzystać z języka programowania, nie musimy wiedzieć jak działają parsery. A jest to jest dość skomplikowana wiedza. Nie musimy znać tej całej teorii automatów, które są niezbędne do budowy gramatyk języków programowania. Tak jak nie musimy znać mechanizmów funkcjonowania stosu protokołów TCP/IP, żeby czytać onet.pl czy ten tekst w tej chwili. 🙂 Analogicznie nie musimy znać sposobu funkcjonowania procesora, jego architektury, aby korzystać z komputera jako użytkownik.

Nie musimy programować też na poziomie Asemblera, po to, aby walczyć o skrawki sekund, aby nasz program jak najszybciej się wykonywał. Jako retail traderzy nie będziemy robić raczej czegokolwiek w zakresie high frequency trading, czyli tradingu wysokich częstotliwości.

Nie musimy też być ekspertami z zakresu wielu innych teorii stojących za systemami operacyjnymi, algorytmami, programowaniem równoległym czy współbieżnym. Dlatego w ciągu kilku dni możemy się nauczyć podstaw programowania, skupiając się na aspektach praktycznych. Może zrobić to każdy z nas, zapominając o tych detalach, które przed chwilą wymieniałem.

Jeśli opanujemy pierwszy język programowania, to później nauka kolejnego języka przyjdzie nam dużo łatwiej i szybciej. Często to się sprowadza do tego, że siadamy przed nowym językiem i metodą copy-paste, czy poprzez szybkie spojrzenie w dokumentację możemy tworzyć nowy kod.

Do czego możemy wykorzystać umiejętność programowania w tradingu?

Po pierwsze – jak ktoś się uprze i nie będzie chciał się uczyć programowania, to nie musi tego robić. Nawet jeżeli będzie miał problemy do rozwiązania, które by tego wymagały. Może wszystko zlecić, aby ktoś to programowanie za niego zrobił. Przykładowo Linda Raschke wynajęła sobie tradera-programistę, który tworzył to, co ona mu zleciła. Można działać w takim modelu, jeśli godzimy się na to by komuś za to zapłacić.  Jeśli jesteś jednak traderem indywidualnym, to może być znaczący koszt.

Jeśli opanujemy jeden język programowania, to nauka kolejnego przyjdzie nam szybciej

Do czego może nam się przydać więc programowanie w świecie inwestycji?

Jeżeli jesteśmy systematycznymi/algorytmicznymi traderami, takimi, którzy korzystają z mechanicznych systemów transakcyjnych, to język programowania umożliwia napisanie, stworzenie sobie takiego systemu transakcyjnego. Musimy przy pomocy języka napisać kod, który będzie realizował koncepcję tradingową (logikę), którą chcemy wykorzystać na rynku. Mówiąc jeszcze inaczej: możemy zaprogramować swoją strategię, a później nawet ją zautomatyzować tak, że będzie handlowała samodzielnie. Brzmi to jak kosmos może dla kogoś zupełnie zielonego, ale takie rzeczy w XXI wieku to wręcz „normalka”.

Niejako „w pakiecie” otrzymujemy możliwość backtestingu, czyli przeprowadzenia testów na historycznych danych rynkowych.

Takie testowanie można rozciągnąć na dużo bardziej zaawansowane formy testowania, jak walk forward analysis, czyli testowanie z okresowym reoptymalizowaniem. Niektórzy z tego korzystają, a niektórzy nie.

Inna technika, to symulacja Monte Carlo – tu będziemy próbować system pod kątem jego stabilności, czy nie wystarczy delikatnie coś zmienić i on się posypie. Pozwoli odpowiedzieć na pytanie, czy to, co wcześniej uzyskaliśmy w teście na danych historycznych nie okazało się tylko czystym przypadkiem i zwyczajnie nie będzie działać w przyszłości na realnym rynku.

Strategia transakcyjna jest zwykle bardzo prosta jeśli idzie o logikę, w skrajnych sytuacjach może być to dosłownie nawet jedna czy dwie linijki kodu! To nie jest tak jak w wielu innych projektach, stricte informatycznych, gdzie projekty liczą sobie setki tysięcy czy miliony linii kodu. Gdzie programista dziennie „przerzuca” setki czy tysiące linii kodu.

Jeżeli chodzi o trading, to backtesting nie jest jedyną rzeczą, do którego przyda nam się umiejętność programowania. Możemy robić wiele innych rzeczy, czysto technicznych, które występują w tradingu. Możemy automatyzować wiele zadań, które są powtarzalne — np. pobieranie danych z jakiegoś zdalnego serwera, raportowanie itp.

Jest jeszcze jeden aspekt o którym już wspominałem, jeśli chodzi o programowanie w tradingu, który warto poruszyć. Otóż jeśli mamy strategię, którą zaprogramowaliśmy, wytestowaliśmy i wiemy, że jest taka, jak być powinna, to możemy pójść na maksa i zautomatyzować jej wykonanie.

Od pewnego czasu realizuję to w ramach TradeStation, czyli takiej platformy, gdzie jest platforma do developmentu, rozwoju strategii transakcyjnych, ale również jest to broker. Można te strategie tam automatyzować i podpinać pod żywy rynek.

W moim przypadku wszystkie zlecenia rynkowe idą tam z automatu. Czasami jestem w innym kraju. Komputer, na którym to działa jest w innym kraju. To działa i handluje bez mojego aktywnego zaangażowania. Możemy pójść też w tę stronę.

Nie skupiajmy się jednak na automatyzacji handlu od samego początku. Automatyzacja handlu to wisienka na torcie. Aby móc coś zautomatyzować jeśli chodzi o trading, to musimy mieć coś, co ma wartość, co ma przewagę rynkową. Jeśli ktoś jest początkujący, to powinien się skupić na tym przede wszystkim, aby stworzyć obiektywny system transakcyjny, strategię, która ma przewagę rynkową.

Automatyzacja handlu, zakładając, że mamy strategię, która jest zyskowna, ma sens wtedy, gdy podążanie za nią wymagałoby naszej uwagi przez wiele godzin dziennie, i to każdego dnia (np. strategia oparta o niski interwał — wykres 5-min, itp.). Albo gdy mamy wiele strategii działających w tym samym czasie.

Jeśli strategia jest leniwa, która wymaga podjęcia akcji przykładowo raz dziennie czy jeszcze rzadziej, to może się okazać, że nie warto niczego automatyzować. Być może nic nie zyskamy, bo automatyzację też należy nadzorować — w końcu tam są realne pieniądze, a ewentualne błędy mogą być bardzo kosztowne.

Osoba początkująca nie powinna skupiać się na automatyzacji handlu

Krótki przegląd języków programowania

Chciałem wymienić kilka różnych języków programowania, które są szeroko powszechne w świecie traderskim i nie tylko. Będę się jednak głównie skupiał na świecie tradingowym. Będę chciał w tym krótkim materiale przedstawić kilka języków wraz z ich szybką charakterystyką.

Tom Basso, rynkowa legenda podążania za trendem

Tom Basso to kolejny bohater słynnej serii książek J. Schwager’a, Czarodzieje Rynku, który zgodził się udzielić ekskluzywnego wywiadu dla Was w ramach mojego podcastu. 🙂

Czytaj dalej →

C/C++

Zacznę od C i C++.  Jeśli jesteś początkujący to nie rzucaj się na naukę języka C i C++. To nie są języki zbyt proste do nauki. Najprawdopodobniej, jeżeli jesteś retail traderem, to nie są ci potrzebne rzeczy, które te języki umożliwiają.

Są one wykorzystywane w City Londyńskim bardzo powszechnie, ale to z powodów, dla których retail trader i tak nie skorzysta, np. HFT.

Kod źródłowy napisany w tych językach jest kompilowany do kodu maszynowego, a programy stworzone przy ich pomocy mogą być bardzo szybkie w działaniu. Działają znacznie szybciej niż ma to miejsce w przypadku języka interpretowanego (np. Python). Kod źródłowy języka C potrafi być nawet kilkaset razy szybszy od tego, co stworzymy w języki Python. Nie oznacza to, że język Python jest do kitu. Po prostu są one stworzone do innych rzeczy.

Język C wiele decyzji na niskim poziomie techniczym pozostawia na głowie programisty (np. zarządzanie pamięcią). Pozwala to z jednej strony na tworzenie kodu wynikowego, który jest bardzo szybki w działaniu, ale na barki programisty spada odpowiedzialność obsługi aspektów, które w innych językach realizowane są automatycznie.

Wyobraźmy sobie, że mamy tablicę — listę na której każda pozycja przechowuje np. wartość liczbową. Iterujemy (przechodzimy)  element po elemencie po tej tablicy, w której załóżmy mamy 5 elementów. Jeżeli w jęzuku Java w tablicy 5-cio elementowej spróbowali byśmy odczytać 6-ty element, to nie da się tego zrobić, bo tablica była zadeklarowana jako 5-cio elementowa. W języku C możemy natomiast to zrobić. Będziemy bez przeszkód czytać z pamięci 6, 7, 10 i 1000 element, pomimo, że tablica była zadeklarowana na 5 elementów! Tam nie ma wbudowanego sprawdzania, czy programista nie robi głupoty. Będziemy mogli w efekcie odczytywać przypadkowe komórki z pamięci, które należeć mogą do zupełnie innego procesu. Co gorsza — możemy nadpisać te komórki pamięci innymi danymi. Tym samym możemy zaburzyć nawet działanie systemu operacyjnego w pewnych sytuacjach.

Ten język wymaga znacznie większej wiedzy i ostrożności w stosowaniu. Jest mniej produktywny, jeśli chodzi o pisanie w tym języku, ponieważ trzeba się natrudzić myśląc o kwestiach nie związanych wprost z problemem, który chcemy rozwiązać przy pomocy komputera. W Javie czy Pythonie można zrobić wiele podobnych rzeczy w znacznie szybszy sposób.

Jeżeli chodzi o języki C i C++, to są dość stare języki. Początki języka C sięgają końca lat 60. XX wieku. C++ jest ponad 10 lat młodszy.

Przewaga, jeśli chodzi o szybkość języka C i C++ powoduje, że wiele profesjonalnych rozwiązań, na przykład high frequency trading jest realizowane przy ich pomocy.

Przy okazji, jeśli chodzi o HFT, to nie jest tam istotna tylko kwestia programowania szybkiego kodu. Chodzi też o szybkość infrastruktury sieciowej, czy bardzo bliskiej lokalizacji serwerów transakcyjnych, na których ten kod się wykonuje.

Java, C#, Visual Basic .NET

Pozostajemy nadal przy językach kompilowanych —  C#i Java. Są to młodsze języki. Powiedzmy lata 90. ubiegłego wieku. Są to języki nie tylko kompilowane, ale i obiektowe, gdzie możemy w pełni pisać według paradygmatów programowania obiektowego. W przypadku tworzenia strategii transakcyjnej dla przeciętnego tradera zupełnie nie jest to jednak wiedza istotna.

Na platformie .NET obok języka C# mamy też dostęp do Visual Basic .NET (nie mylić z Visual Basic, VBA, który jest dostępny np. w Excelu). Są one też dostępne na platformie MultiCharts .NET, co jest fajne, bo mamy siłę tych języków, plus duże wsparcie w kontekście tradingu.

MultiCharts integruje się z wieloma dostawcami danych i brokerami, np. InteractiveBrokers, umożliwiając m.in. automatyzację handlu.

Język C# jest też dostępny na platformie NinjaTrader. Tam jest wbudowany język, który nazywa się NinjaScript, jeśli dobrze pamiętam. Ten język na NinjaTrader bazuje właśnie na C# i można z nim pracować bezpośrednio w środowisku dla programistów Visual Studio.

Powszechnie stosowanym rozwiązaniem, jeżeli chodzi o tę grupę języków, jest język Java. Jest on podobny do C# (albo raczej w drugą stronę: C# powstawał niejako na doświadczeniach Javy), w szczególności kod kompilowany jest do tzw. kodu pośredniego (nazywanego w Javie byte-code’em), który następnie wykonywany jest na tzw. maszynie wirtualnej, czyli platformie uruchomieniowej, instalowanej na konkretnym systemie operacyjnym.

W języku Java napisano przez ostatnie ponad 2 dekady bardzo wiele rozwiązań biznesowych, w tym wiele bardzo skomplikowanych i wielkich systemów informatycznych. Z pewnością, bez względu na panujące mody, ten język będzie w powszechnym użyciu jeszcze przez kolejne dziesięciolecia.

Python

Kolejnym językiem programowania, wkraczając już w języki interpretowane, jest Python. Język Python jest powszechnie stosowany w świecie tradingowym. Obecnie przeżywa chyba największy renesans ze wszystkich tu wymienionych języków, zwłaszcza w kontekście tradingu. Wynika to z wielu powodów.

Sam język jest oczywiście darmowy ale przede wszystkim wiele bibliotek, które wokół tego języka są dostępne, są również dostępne za darmo. Mówię tu o bibliotekach, czyli gotowych rozwiązaniach pod kątem tradingu (np. backtesting).

Osobiście nie przeniosłem swojego warsztatu do Pythona. I nie wiem, czy kiedyś to zrobię, bo oznaczałoby to ogrom pracy z przepisywaniem obecnego kodu stworzonego w innych językach.

Ale jeśli zaczynasz od zera, to z pewnością warto poważnie rozważyć nauke Pythona.

Wiele bibliotek wokół Pythona, pod kątem tradingu, jest za darmo

MATLAB

Jest to bardzo ciekawe rozwiązanie, bardzo uniwersalne, chociaż nie było tworzone z myślą o tradingu. MATLAB jest oprogramowaniem komercyjnym.

Jeżeli chodzi o trading to MATLAB można rozbudowywać o nowe biblioteki czy pakiety w kontekście tradingu. MATLAB ma wygodny debugger, czyli można ten kod, który się tam pisze, w prosty sposób sprawdzać, śledzić, analizować. Jeśli są błędy, to można go wykonywać linijka po linijce. Sprawdzać co się dzieje, co się zmienia w danych, czyli to wszystko co znają programiści z innych środowisk — np. Visual Studio, IntelliJ IDEA, a co nie zawsze jest dostępne w językach skryptowych.

R

Następnym językiem interpretowanym jest język R. Moje doświadczenia z językiem R są niewielkie. Zainstalowałem go kiedyś po to, aby zobaczyć jak to wygląda. Osobiście nie jestem fanem tego, co tam zobaczyłem i nie korzystam z niego. Ale to tylko moja opinia.

W języku R w bardzo zwięzły sposób można zrobić coś, co w innym języku mogłoby wymagać zapisania większej liczby linii kodu (zwłaszcza jeśli idzie o wykonywanie zadań obliczeniowych). Zaletą języka R jest również elastyczność. Jest to rozwiązanie darmowe.

W kontekście szybkości wykonania jest to język wolny, jak większość języków interpretowanych.

Język R umożliwia również wywoływanie funkcji, które pochodzą z bibliotek napisanych w języku C++. Te biblioteki są bardzo szybkie oczywiście w porównaniu do samego języka R.

Język R jest popularny w środowisku akademickim.

Zaletą języka R jest jego elastyczność

Excel + Visual Basic for Applications (VBA)

Visual Basic for Applications (VBA) to język, który jest wbudowany w Excela. To jest absolutnie świetne rozwiązanie. Myślę, że przez wielu bardzo niedoceniane. Czasami wręcz wyśmiewane.

To, że jest to skuteczne i wartościowe rozwiązanie, niech faktem świadczącym o tym będzie to, że całkiem niezłą kasę proponują w ofertach pracy w City Londyńskim ludziom, którzy mają opanowanego Visual Basic for Applications. Wiele rzeczy do prototypowania robi się w Visual Basic, w Excelu. To nie jest szybkie, to nie jest skalowalne. Ale nie trzeba stosować armaty na wróbla, aby coś szybko sprawdzić. Jeżeli coś jest interesującego, to potem można to przenieść do bardziej wydajnego narzędzia czy języka programowania.

Jeśli pracujemy nad strategiami długoterminowymi, gdzie zwykle mamy do przetworzenia mniejsze wolumeny danych, to VBA może okazać się jedynym potrzebnym narzędziem na pokładzie tradera.

Visual Basic ma ogromne możliwości w Excelu. Można tam pisać na przykład kompletne programy z interfejsem użytkownika. Można się łączyć z danymi od brokerów. Można robić masę rzeczy. Oczywiście, jest to język interpretowany, nie kompilowany, a więc dość wolny. Środowisko programistyczne też przez lata nie jest już widać rozwijane przez Microsoft.

MQL

Kolejnym językiem jest MetaQuotes Language, czyli MQL. O ile w Visual Basic siedziałem bardzo dużo, w MQL praktycznie w ogóle. Poza tym, że parę razy w życiu korzystałem z MetaQuotes. 😉

Jest powszechny na platformach Forexowych. Problem jest taki, że dane, które tam są, są zwykle  z kosmosu. To może spowodować, że wyniki też będą z kosmosu (shit-in, shit-out). Dane, które nie są z kosmosu, często dużo kosztują, albo dużo kosztuje praca, aby te dane wyglądały po ludzku. I to jest kolejny powód, dla którego osobiście nie jestem wielkim fanem Forexa. Nie chcę się jednak narażać już dalszym mówieniem o tych sprawach forexowych (wiem, że są świetni traderzy i na tym rynku). To po prostu nie jest mój świat, tyle w temacie. 🙂

MQL nie jest językiem tak szybkim, jak to co możemy znaleźć w języku C/C++ lub Javie.

EasyLanguage

Następny język – EasyLanguage, który nie do końca jest aż tak easy. 😉 Jest to język, który wchodzi w skład platformy TradeStation. Ja korzystam z TradeStation od początku 2017 roku, po to, aby móc handlować na rynku kontraktów terminowych w Stanach Zjednoczonych.

TradeStation mamy niezły pakiet deweloperski, jeśli chodzi o rozwój strategii transakcyjnych, chociaż już nieco trąci myszką i czuć ducha poprzedniej epoki. Później możemy te strategie uruchamiać na TradeStation i automatyzować handel na żywym rynku.

Dla kogoś kto szczególnie myśli o automatyzacji handlu kontraktów terminowych w Stanach Zjednoczonych (i nie tylko), TradeStation jest ciekawym rozwiązaniem. To co jest istotne — mamy (odpłatnie) dostęp do świetnej jakości danych.

TradersStudio

Kolejne rozwiązanie to jest TradersStudio. To jest coś, czego nigdy nie wykorzystywałem. Wiem, że korzysta z tego Robert Pardo, którego cenię i poważam. Jest między innymi twórcą podejścia walk forward analysis.

Thomas Stridsman, z którym miałem przyjemność rozmawiać w ramach podcastów, korzysta z TradersStudio. To jest takie środowisko, które służy do tego, aby budować strategię transakcyjne i je testować. Tam jest wbudowany język, który jest skrzyżowaniem EasyLanguage i Visual Basic.

Kolejną zaletą TradersStudio jest to, że łatwo przenieść większość kodu napisanego w EasyLanguage, na TradeStation, do TradersStudio.

AmiBroker Formula Language

Nasz polski, rodzimy produkt, który w świecie przyjął się już na dobre od wielu wielu lat i ma wielu zwolenników (jak nie przeciwników). Autorem jest Tomasz Janeczko.

Taka ciekawostka — pierwszy człon nazwy, Ami, pochodzi podobno od nazwy komputera Amiga. Pierwsza implementacja AmiBrokera była przeznaczona na ten typ komputera chyba, o którym dziś młodzież już nawet pewnie nie słyszała. 😉

Absolutnie polecam przynajmniej sprawdzić AmiBroker. Za małą kasę (w porównaniu do konkurencji) mamy pełny wypas. Dla większości indywidualnych traderów jest tam wszystko, co potrzeba.

Miałem na początku problem z AmiBrokerem — lata temu, kiedy nie było możliwości debugowania. To mi nie do końca leżało. Jako człowiek, który na co dzień siedzi w środowiskach programowania jak IntelliJ czy Eclipse, a później zasiadł przed AmiBrokerem, poczułem pewien dyskomfort.

Nie lubię w AmiBrokerze też tego, że o ile wiele rzeczy można zrobić bardzo szybko, to czasam proste sprawy są skomplikowane w implementacji. Część tych komplikacji wynika z zaszłości historycznych. A część to po prostu styl autora, który mi osobiście nie przypadł do gustu.

TradeSense

Trade Navigator firmy Genesis. Tego narzędzia nie znam, ale kiedyś jeden z kolegów Facebookowych podesłał mi go, z zapytaniem o język TradeSense. Nie miałem z nim nigdy nic wspólnego, ale szybko zerkając do dokumentacji widać, że to prosty język skryptowy, podobny do innych, które są na TradeStation czy w AmiBrokerze. Język skryptowy.

Sam Trade Navigator jest polecany przez wiele osób. Jakby ktoś był na Trade Navigator to może warto dodać, że jest tam też możliwość automatyzacji handlu.

Rynki finansowe według Krzysztofa Łucjana, zawodowego tradera

Gościem wywiadu jest Krzysztof Łucjan, zawodowy trader, specjalizujący się w handlu kontraktami terminowymi, współtwórca Stooq

Czytaj dalej →

Podsumowanie

To właściwie tyle z mojej strony. Chciałem na koniec jeszcze powiedzieć, że język programowania, to tylko i wyłącznie narzędzie. Wiem, że wśród nerdów informatyki czy programowania, języki programowania podlegają modom. Mnie to już nie grzeje, mówiąc tak zupełnie wprost. 🙂

Osobiście staram się na to patrzeć stricte przez kontekst narzędzia i moich potrzeb. Trzeba dobrać odpowiednio narzędzie do zadania. Nie warto brać narzędzia, które będzie armatą, podczas gdy chcemy upolować wróbla. Nie możemy też popełnić błędu polując na mamuta z wiatrówką.

Warto pamiętać, że język programowania to tylko narzędzie

Zachęcam wszystkich do spróbowania swoich sił w programowaniu — chociażby na zupełnie podstawowym poziomie. Nawet jeśli jeszcze tego nie robiliście, a boicie się, że jest to zbyt trudne, uwierzcie — strach ma tylko wielkie oczy. Uważam, że każdy przy odrobinie chęci i samozaparcia jest w stanie ogarnąć jego podstawy. Czego wszystkim szczerze życzę. 🙂

Gorąco pozdrawiam i do usłyszenia niebawem.

Bye, bye!

Jacek (4A 61 63 65 6B) 😉

   ___                _    
  |_  |              | |   
    | | __ _  ___ ___| | __
    | |/ _` |/ __/ _ \ |/ /
/\__/ / (_| | (_|  __/   < 
\____/ \__,_|\___\___|_|\_\

Footnotes

  1. C# może być kompilowany również, podobnie jak na przykład C++, do kodu maszynowego. Taki kod uruchamiany jest bezpośrednio w systemie operacyjnym z pominięciem maszyny wirtualnej.
Subskrybuj
Powiadom o
guest

10 komentarzy
najstarszy
najnowszy oceniany
Inline Feedbacks
View all comments

Ruszyła sprzedaż oprogramowania #ST

Kilkadziesiąt gotowców inwestycyjnych!