PL: Narzędzie do analizy rynku FX
EN: FX market analysis tool
PL: Oprogramowanie służy wyłącznie do celów edukacyjnych i badawczych. Treści generowane przez program oraz kod źródłowy nie stanowią porady inwestycyjnej ani rekomendacji zakupu lub sprzedaży jakichkolwiek instrumentów finansowych. Handel na rynku Forex wiąże się ze znacznym ryzykiem utraty kapitału. Autor nie ponosi żadnej odpowiedzialności za decyzje inwestycyjne oraz ewentualne straty finansowe poniesione w wyniku korzystania z tego narzędzia.
EN: This software is for educational and research purposes only. The content generated by the program and the source code do not constitute investment advice or a recommendation to buy or sell any financial instruments. Forex trading involves significant risk of loss of capital. The author bears no responsibility for investment decisions or financial losses incurred as a result of using this tool.
Projekt ma na celu stworzenie narzędzia do analizy instrumentów na rynku Forex oraz testowania i implementowania strategii autotradingu.
W bieżacej wersji programu skupiono się na analizie kursu EURUSD na interwale dziennym, a dokładniej na wykrywaniu krótko- i średnioterminowych trendów oraz symulacji opierających się na nich strategii.
Zaproponowano model sieci neuronowej oraz wektor cech oparty na wskaźnikach o dużej inercji (proste średnie kroczące z dziennych cen zamknięcia), aby model nie uczył się surowych cen, lecz odwzorowywał trend instrumentu. Otrzymaną w ten sposób predykcją posłużono się do generowania sygnałów kupna i sprzedaży. Stworzono także moduł symulacji do oceny wygenerowanych sygnałów.
src/- katalog źródłowy z modułami programusrc/ingestion.py- moduł odpowiadający za pobranie i przygotowanie danychsrc/features.py- moduł odpowiadający za dodanie cech oraz normalizację danychsrc/model- moduł odpowiadający za przygotowanie tensorów, parametrów modelu, trening i ewaluacjęsrc/model/architectures.py- moduł z klasami opisującymi architekturę modelisrc/model/functions.py- moduł z funkcjamisrc/strategy.py- moduł odpowiadający za obliczenia wskaźników, symulację strategii, obliczenia transakcji oraz wizualizacjęsrc/utils.py- funkcje pomocniczetests/- katalog zawierający testy programutests/test_integration.py- testy integracyjne sprawdzające poprawność przepływu danychdocs/img/- katalog zawierający dokumentację graficznąmain.py- główny punkt wejścia aplikacjiPipfile&Pipfile.lock- konfiguracja środowiska (Pipenv)
- Sklonuj repozytorium:
git clone [https://github.com/vec-law/fx-analyzer.git](https://github.com/vec-law/fx-analyzer.git) cd fx-analyzer - Zainstaluj biblioteki używając Pipenv:
pipenv install
- Uruchom program w środowisku wirtualnym:
pipenv run python main.py
Program posiada zaimplementowane automatyczne ładowanie danych z dwóch źródeł:
- Plik CSV: Program w pierwszej kolejności wyszukuje plik o nazwie
instrument_interval.csvw katalogu/data/raw. Pliki CSV pozwalają na analizę dowolnych instrumentów. Należy jednak upewnić się, że dane te mają następującą strukturę:['date', 'time', 'open', 'high', 'low', 'close', 'vol']. Strukturę tę można dostosować bezpośrednio w moduleingestion.py. - Biblioteka yfinance: W przypadku braku pliku CSV, program automatycznie próbuje pobrać dane za pomocą modułu
yfinance. Obecna wersja programu pozwala na pobieranie zyfinancetylko kursów par walutowych.
Program automatycznie sprawdza ciągłość załadowanych danych. W przypadku wykrycia luk, zbiór danych jest automatycznie przycinany do najdłuższego spójnego zakresu, co zapewnia poprawność wyliczania cech (średnich SMA).
W obecnej wersji programu zaimplementowano dzienne interwały czasowe. Należy pamiętać, aby interwał zapisywać w postaci 1d.
Wejściem modelu jest 31 prostych średnich kroczących (SMA) w zakresie od SMA10 do SMA40 z historycznych cen zamknięcia.
Wartościami docelowymi (target) są ceny zamknięcia (close).
W obecnej wersji programu nie ma możliwości ustawiania parametrów za pomocą interfejsu użytkownika. Należy je zdefiniować bezpośrednio w pliku main.py.
Do parametrów wejściowych należą:
instrument– nazwa instrumentuinterval– interwał czasowytarget_column– wybór kolumny z ceną docelowąstrategy– numer strategiiindicators– wskaźniki, na podstawie których obliczane są cechy wejściowemax_ind_period– maksymalny okres średniej kroczącejsamples_limit– limit długości zbioru danychtrain_ratio– współczynnik podziału na dane treningoweseed– parametr okreslający losowość danychepochs– liczba kroków (epok) pętli treningowejmodel_num– numer modelu odnoszący się do klasyModelV{model_num}wsrc/model/architectures.py
Komunikaty wyjściowe są wyświetlane w konsoli systemowej i podzielone na 8 etapów. W każdym z nich funkcja wykonująca operację wyświetla komunikat w postaci: [nazwa_funkcji] komunikat.
Rozpoczęcie każdego etapu sygnalizowane jest komunikatem ETAP x/8 Nazwa etapu, a zakończenie potwierdzane statusem OK. Jeżeli w trakcie trwania etapu wystąpi błąd, wyświetlana jest informacja Przerwano.
Użyto modelu model_num = 1. Jest to Wielowarstwowy Perceptron (MLP) o płytkiej strukturze z dwiema warstwami ukrytymi:
- Konfiguracja warstw: 31 (wejście) -> 16 -> 8 -> 1 (wyjście)
- Kształt: Architektura lejka (redukcyjna)
Trening i ewaluację modelu przeprowadzono przyjmując następujące parametry:
- Instrument:
EURUSD - Interwał:
1d(dzienny) - Wartość docelowa (target):
close(cena zamknięcia) - Długość zbioru danych:
4000 - Liczba epok:
1000 - Źródło danych:
yfinance - Data wykonania:
2026-01-03 - Numer modelu:
1
Poniżej przedstawiono zrzuty ekranu z wynikami treningu i ewaluacji dla trzech różnych wielkości zbioru testowego:
Zbiór testowy: 250 (train_ratio = 0.9375) |
|---|
| Trening | Ewaluacja |
|---|---|
![]() |
![]() |
Zbiór testowy: 500 (train_ratio = 0.875) |
|---|
| Trening | Ewaluacja |
|---|---|
![]() |
![]() |
Zbiór testowy: 1000 (train_ratio = 0.75) |
|---|
| Trening | Ewaluacja |
|---|---|
![]() |
![]() |
Note
Analiza średniego bezwzględnego błędu MAE wskazuje na poprawność doboru wektora cech oraz modelu – średnie odchylenie predykcji od wartości docelowej utrzymuje się na poziomie ~1%, niezależnie od wielkości zbioru testowego.
Program pozwala na wizualną analizę predykcji, która odzwierciedla trend instrumentu na podstawie generowanych wykresów. Kierunek predykcji oznaczono kolorem żółtym w przypadku trendu wzrostowego i fioletowym w przypadku trendu spadkowego.
Poniżej przedstawiono wykresy dla rozpatrywanych przypadków wielkości zbioru testowego:
Zbiór testowy: 250 (train_ratio = 0.9375, strategy = None) |
|---|
![]() |
Zbiór testowy: 500 (train_ratio = 0.875, strategy = None) |
|---|
![]() |
Zbiór testowy: 1000 (train_ratio = 0.75, strategy = None) |
|---|
![]() |
Note
Analiza wykresów pokazuje że kierunek predykcji w większości przypadków trafnie określił kierunek zmiany ceny, jednocześnie wskazując na stałość okresów tych zmian.
Jak wspomniano wcześniej, w programie zaimplementowano moduł do symulacji strategii pozwalający na testowanie dowolnej logiki rynkowej. Aby jednak było to możliwe, konieczne jest zapisanie w strukturze danych df_dict[test] następujących pól za pomocą funkcji set_positions:
- cen otwarcia transakcji:
buy_open,sell_open - cen zamknięcia transakcji:
buy_close,sell_close - indeksu z ceną zamknięcia:
idx_close
Program wykorzystywany do testowania strategii ma identyczne ustawienia parametrów jak te opisane w sekcji "Trening i ewaluacja" za wyjątkiem parametru strategy.
W programie udostępniono przykładową strategię rynkową (strategy = 1), która bazuje na następujących wskaźnikach:
delta,delta_minus_1,delta_minus_2,delta_minus_3,delta_minus_4– różnica między n-tą a n-1 predykcją dla obecnej próbki i 4 kolejnych wstecz (należy zauważyć, że predykcja n-tej próbki jest wyliczana na podstawie centargetz n-1 próbki i wcześniejszych)target– bieżąca cena (w obecnej strukturze danychdf_dict[test]jedyną dostępną bieżącą ceną jest cenatarget=close)diff_rel– względna różnica między bieżącą cenątargeta predykcją
Szczegółowe warunki otwierania i zamykania pozycji zostały zapisane w programie i można je streścić następująco:
- otwieranie pozycji w stronę trendu przy zmianie kierunku predykcji,
- otwieranie pozycji w kierunku trendu przy zbliżaniu się ceny bieżącej do predykcji,
- zamykanie pozycji przy zmianie predykcji na kierunek przeciwny,
- zamykanie pozycji przy dużych wahaniach ceny bieżącej od predykcji w stronę trendu.
Poniżej przedstawiono wykresy z wynikami przykładowej strategii:
Zbiór testowy: 250 (train_ratio = 0.9375, strategy = 1) |
|---|
![]() |
Zbiór testowy: 500 (train_ratio = 0.875, strategy = 1) |
|---|
![]() |
Zbiór testowy: 1000 (train_ratio = 0.75, strategy = 1) |
|---|
![]() |
Important
Wyniki symulacji nie uwzględniają kosztów transakcyjnych, takich jak prowizje, spready czy punkty swapowe.
Note
Wyniki strategii pokazują, że przynosi ona bardzo dobre rezultaty w przypadku występowania silnych trendów na rynku, jednak zagrożeniem są tutaj okresy konsolidacji bez jego wyraźnego kierunku.
Aby uruchomić testy integracyjne, upewnij się, że masz zainstalowany pakiet pytest, a następnie wykonaj:
pytest tests/test_integration.pyPL:
- v1.0.2: Dodano logikę wyboru modelu
- v1.0.1: Dodano testy integracyjne
- v1.0.0: Wersja bazowa
EN:
- v1.0.2: Added model selection logic
- v1.0.1: Added integration tests
- v1.0.0: Initial version
PL: Ten projekt jest udostępniany na licencji GNU General Public License v3.0. Szczegóły znajdują się w pliku LICENSE.
EN: This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.











