Jak powiązać wiadomości z wykresami giełdowymi i zrozumieć czynniki wpływające na ruchy rynku
Każdy, kto kiedykolwiek otworzył terminal transakcyjny, to widział. Akcja nagle spada o 8% w ciągu jednej sesji, wykres rysuje przerażającą czerwoną świecę, a kanał informacji finansowych jest zalewany dziesiątkami rozproszonych artykułów. Aby powiązać konkretne wydarzenie z ruchem ceny, spędzasz pół dnia na ręcznym przeszukiwaniu według dat.
Autor projektu open-source PokieTicker rozwiązał ten problem dla siebie i udostępnił kod źródłowy na GitHub. Efektem jest narzędzie, które nakłada wydarzenia bezpośrednio na wykresy świecowe, organizuje wiadomości według tematów i uruchamia je przez kombinację modeli językowych i klasycznego uczenia maszynowego.

Co potrafi aplikacja
Interfejs zbudowany jest wokół interaktywnego wykresu D3.js. Zamiast suchego terminala widzisz oś czasu, gdzie każdy dzień z wiadomościami jest oznaczony kropką. Kliknięcie kropki otwiera panel kontekstowy ze szczegółami.
Główne funkcje warte sprawdzenia:
- Interaktywne oznaczanie wydarzeń na wykresach świecowych. Możesz od razu zobaczyć, w którym dniu ukazało się sprawozdanie kwartalne lub wiadomość regulacyjna i jak zareagowała cena.
- Filtrowanie tematyczne. Wiadomości są podzielone na kategorie: wyniki finansowe, produkty, działania regulacyjne, zmiany w zarządzie oraz ogólne warunki rynkowe.
- Wyszukiwanie analogii historycznych. System porównuje bieżące tło wiadomości z przeszłymi okresami przy użyciu podobieństwa cosinusowego osadzeń wektorowych i pokazuje, gdzie akcja poruszała się w podobnych sytuacjach.
- Wyjaśnianie ruchów przez LLM. Zaznaczasz zakres dat myszką, a model gromadzi fakty i tworzy krótkie podsumowanie, dlaczego nastąpił spadek lub wzrost.

Architektura i ekonomiczny potok danych
Praca z tekstami finansowymi często uderza cię rachunkami za API sieci neuronowych. Jeśli wgrasz każdą publikację bezpośrednio do Claude, twoje saldo zostanie wyzerowane w ciągu kilku godzin. Autor zbudował trójwarstwowy potok filtrowania, który redukuje niepotrzebne koszty.
Najpierw dane są pobierane z API Polygon. Następnie uruchamia się Warstwa 0 — prosty zestaw reguł w Pythonie, który filtruje spam, clickbait i bezużyteczne podsumowania typu "5 akcji do kupienia w maju". Ten krok eliminuje około 17% szumu informacyjnego za darmo.
Pozostałe artykuły trafiają do Warstwy 1. Tutaj Claude Haiku jest używany przez Batch API w partiach po 50. Model określa sentyment, wyciąga argumenty wzrostowe lub spadkowe i formułuje esencję dyskusji. Przetwarzanie wsadowe kosztuje zaledwie 35 centów za 1000 artykułów.
Wreszcie Warstwa 2 oparta na Claude Sonnet aktywuje się tylko na bezpośrednie żądanie użytkownika, gdy potrzebna jest dogłębna analiza konkretnego skoku ceny dla wybranego okresu.
Jak działa prognozowanie ruchów cen
Na szczycie sentymentu wiadomości i wskaźników technicznych działa model oparty na XGBoost. Autor nie próbuje zbudować "świętego graala tradingu" i uczciwie ostrzega w opisie, że projekt ma charakter badawczy.
Wektor cech składa się z 31 parametrów:
- Metryki wiadomości: liczba artykułów dziennie, średni wynik sentymentu, stosunek pozytywnych do negatywnych, średnie kroczące sentymentu z 3, 5 i 10 dni, plus momentum sentymentu.
- Sygnały techniczne: zwroty z 1, 3, 5 i 10 dni handlowych, miara zmienności, anomalie wolumenu obrotu, wskaźnik RSI-14 oraz przecięcia średnich kroczących.
Klasyfikatory XGBoost są trenowane do prognozowania kierunku ruchów cen w horyzontach T+1, T+3 i T+5. Logika jest prosta: silne wiadomości wywołują bezwładność rynku, która często trwa od jednego do trzech dni, zwłaszcza jeśli negatywne publikacje pojawiają się seriami.
Backend zawiera również eksperymentalny moduł LSTM, choć gradient boosting pozostaje głównym działającym rozwiązaniem.
Frontend (React + Vite + D3.js) Backend (FastAPI + SQLite WAL)
+---------------------------------+ +----------------------------+
| CandlestickChart (D3.js) |----->| /api/stocks/{sym}/ohlc |
| NewsPanel & Predictions |<-----| /api/news, /api/predict |
+---------------------------------+ +----------------------------+
Szybki start bez rejestracji kluczy API
Miły szczegół: aby wypróbować projekt lokalnie, nie musisz od razu kupować subskrypcji Polygon ani zakładać konta w Anthropic. Repozytorium zawiera już gotowe archiwum z bazą danych SQLite zawierającą 51 000 świec i 61 000 artykułów wiadomości, plus wytrenowane wagi modelu.
Wdrożenie zajmuje pięć minut:
git clone https://github.com/owengetinfo-design/PokieTicker.git
cd PokieTicker
# Распаковываем готовую базу и модели
gunzip -k pokieticker.db.gz
tar xzf models.tar.gz -C backend/ml/
# Настраиваем бэкенд на Python 3.10+
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# Устанавливаем зависимости фронтенда
cd frontend && npm install && cd ..
Usługi uruchamiane są w dwóch zakładkach terminala. W pierwszej uruchamiamy FastAPI:
source venv/bin/activate
uvicorn backend.api.main:app --reload
W drugiej uruchamiamy Vite:
cd frontend && npm run dev
Po tym interfejs otwiera się w przeglądarce pod adresem http://localhost:7777/PokieTicker/.
Jeśli chcesz pobrać świeże dane z giełdy, skopiuj po prostu .env.example do .env, dodaj swój darmowy klucz Polygon i klucz Anthropic, a następnie uruchom polecenie python -m backend.weekly_update.
Wrażenia i wnioski
PokieTicker jest interesujący nie tyle jako doradca tradingowy, co jako przykład dobrze zaprojektowanej aplikacji full-stack. Można z niego wiele się nauczyć:
- Przejrzysta konfiguracja FastAPI i SQLite w trybie WAL, która jest więcej niż wystarczająca dla setek tysięcy rekordów.
- Efektywne wykorzystanie LLM poprzez wstępne filtrowanie oparte na regułach i Batch API.
- Wizualizacja danych finansowych w czystym D3.js bez ciężkich widżetów zewnętrznych.
- Praktyczne połączenie metryk NLP z klasyczną analizą szeregów czasowych.
Repozytorium będzie przydatne dla programistów budujących własne pulpity analityczne, eksperymentujących z przetwarzaniem tekstu dla ML lub po prostu chcących zrozumieć przyczyny wahań rynkowych. Kod źródłowy jest wydany na permisywnej licencji MIT.
Powiązane projekty