Dziś na blogu gościnny wpis przygotowany przez Marcina Piterę. Jest to mam nadzieję, że pierwszy z serii wpisów opisujących przystępnie interesujące zagadnienia związane z analizą danych. W tym przypadku finansowych.
Marcin Pitera
Cześć! W najbliższym czasie przedstawię wam serię wpisów, które pokażą, jak używać R w w kontekście danych finansowych, matematyki finansowej, czy analizy ilościowej. Zajmiemy się na przykład obróbką danych finansowych, optymalizacją portfelową, czy modelami GARCH. W tym wpisie zaczniemy od podstaw, czyli importu oraz prezentacji najczęściej obrabianych danych finansowych, tzn. danych i wykresów typu OHLC (Open-High-Low-Close).
Ponieważ jest to mój pierwszy wpis, zanim przejdziemy do szczegółów, zróbmy krótki komentarz na temat dostępnych bibliotek finansowych, gdyż są ich dziesiątki (jeżeli nie setki). Na start polecam wszystkim pakiety związane ze stowarzyszeniem Rmetrics. Wśród bibliotek takich jak fBasics, fTrading, fGarch, fImport, czy fOptions każdy powinien znaleźć coś dla siebie. Warto zajrzeć też na stronę CRAN Task View: Empirical Finance, która zawiera zestawienie najważniejszych pakietów. Oczywiście duże wartościowych „nieoficjalnych” pakietów i funkcji można znaleźć również na GitHubie. (Przykład? Biblioteka mgarchBEKK do wielowymiarowych modeli GARCH.)
Jak wspomnieliśmy, w dzisiejszym wpisie omówimy podstawy, czyli jak importować oraz prezentować dane finansowe w formacie OHLC. Zazwyczaj oznacza to, iż rozważamy szereg czasowy złożony z ceny otwarcia, najwyższej ceny, najniżej ceny oraz ceny zamknięcia, dla danego okresu i danego aktywa finansowego (zamiast ceny można rozważać też na przykład stopy procentowe). Warto zwrócić uwagę, iż do takich danych często dołączany jest wolumen (wielkość obrotu; ang. volume) oraz dopasowana cena zamknięcia (ang. adjusted closing price). Dane takie (przynajmniej dzienne dane historyczne ) są zazwyczaj darmowe i dostępne online ze stron takich jak finance.yahoo.com (dane z giełdy amerykańskiej, notowania obligacji, indeksy giełdowe, etc.), czy stooq.pl (polecam do danych z polskiej giełdy). W R znajduje się wiele narzędzi do automatycznego importu danych z tego typu stron. (Przykładowo funkcja getSymbols.yahoo z biblioteki quantmod, czy biblioteka fImport).
Dane w formacie OHLC mogą być prezentowane na wiele sposobów takich jak wykresy OHLC, czy wykresy świecowe (tzw. świece japońskie). Dodatkowym plusem danych OHLC jest fakt, iż bardzo łatwo konwertować dane z krótszych na dłuższe okresy, np. dane dzienne na dane miesięczne, czy kwartalne. Także dane tickowe (ang. tick data, tick-by-tick data), np. z rynku walutowego FOREX można stosunkowo łatwo przerobić na format OHLC.
To tyle tytułem wstępu. Pokażemy teraz na przykładzie jak ładować i prezentować takie dane. Weźmy notowania amerykańskiego indeksu giełdowego NASDAQ 100 w okresie of 01.01.2000 do 01.01.2015.
Na początku załadujemy biblioteki z których będziemy korzystać oraz ściągniemy nasze dane.
require(fImport); require(quantmod); require(xts) ndx.daily<-yahooSeries("^NDX",from="2000-01-01",to="2015-01-01") ndx.daily<-as.xts(ndx.daily[,1:5])
Domyślnie, ndx.daily jest obiektem timeSeries (klasa S4) [wskazówka: użyj funkcji str i class jeżeli chcesz wiedzieć więcej o danej zmiennej]. Oczywiście można typ obiektu zmienić na inny, który nam bardziej odpowiada (przykłady innych typów obiektów do szeregów czasowych: zoo, foo, fts xts). Dla wygody, wybraliśmy klasę xts. Jeżeli masz dane OHLC w pliku csv (badź innym, np. xls), to możesz użyć standardowych funkcji do importu w R takich jak read.csv/read.table/read.zoo.
Następnie rysujemy standardowy wykres OHLC, używając do tego danych z ostatnich dwóch miesięcy oraz funkcji chartSeries.
ndx.daily2<-ndx.daily["2014-11/"] chartSeries(ndx.daily2, type="bars")
Możemy ustawić inny wygląd, czy typ wykresu. Weźmy na przykład dane z ostatnich trzech lat, przekonwertujmy nasze dane na miesięczne OHLC i zróbmy wykres świecowy w innym szablonie kolorystycznym.
ndx.daily3<-to.monthly(ndx.daily["2012/2014"], drop.time=FALSE) chartSeries(ndx.daily3,theme=chartTheme("white"), type="candlesticks")
Ogólnie, konwersja danych OHLC w R jest dosyć prosta i można ją zrobić korzystając na przykład z funkcji to.period (osobiście, dla wygody, używam wrapperów takich jak to.weekly, to.monthly, to.minutes5, etc.).
W końcu, dane w formacie tickowym mogą być przekonwertowane na format OHLC na wiele sposobów. Weźmy przykładowy zestaw danych Forex z pakietu highfrequency i przekonwertujmy go na 15 minutowe OHLC [wskazówka: chcesz użyć czegoś innego? wpisz w google np. „R financial data” i użyj innej metody, czy biblioteki. Jest wiele funkcji do importu danych również z Forex, np. na GitHubie].
require(highfrequency) data("sample_tdataraw") tick.data<-sample_tdataraw$PRICE; mode(tick.data)<-"numeric" ohlc.data<-to.minutes15(tick.data)
To tyle na dzisiaj. Omówilismy tylko podstawy – następne wpisy powinny być ciekawsze.
Szukasz więcej informacji? Wpisz w Google np. „OHLC R”. Przykładowe ciekawe linki poniżej:
- http://www.r-bloggers.com/financial-data-accessible-from-r-part-iii/
- http://blog.revolutionanalytics.com/2013/12/quantitative-finance-applications-in-r.html
- http://blog.revolutionanalytics.com/2015/09/reading-financial-time-series-with-r.html
- https://openanalytics.wordpress.com/2014/02/27/creating-candlestick-charts-in-r-for-non-financial-data/
- http://www.computerworld.com/article/2921176/business-intelligence/great-r-packages-for-data-import-wrangling-visualization.html
Hej, jeśli chodzi o polską giełdę to napisałem kiedyś trochę kodu w c#, który pobiera dzienne OHLC ze strony giełdy w podziale na wszystkie typy instrumentów i zapisuje w csv. Aplikację zrobiłem w prostym winformie, który wrzuciłem na swojego githuba konraddroptable/StockExchangeData