Skip to content

vec-law/fx-analyzer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

80 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

fx-analyzer

PL: Narzędzie do analizy rynku FX

EN: FX market analysis tool

Zastrzeżenie (Disclaimer)

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.

Opis projektu

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.

Struktura projektu

  • src/ - katalog źródłowy z modułami programu
  • src/ingestion.py - moduł odpowiadający za pobranie i przygotowanie danych
  • src/features.py - moduł odpowiadający za dodanie cech oraz normalizację danych
  • src/model - moduł odpowiadający za przygotowanie tensorów, parametrów modelu, trening i ewaluację
  • src/model/architectures.py - moduł z klasami opisującymi architekturę modeli
  • src/model/functions.py - moduł z funkcjami
  • src/strategy.py - moduł odpowiadający za obliczenia wskaźników, symulację strategii, obliczenia transakcji oraz wizualizację
  • src/utils.py - funkcje pomocnicze
  • tests/ - katalog zawierający testy programu
  • tests/test_integration.py - testy integracyjne sprawdzające poprawność przepływu danych
  • docs/img/ - katalog zawierający dokumentację graficzną
  • main.py - główny punkt wejścia aplikacji
  • Pipfile & Pipfile.lock - konfiguracja środowiska (Pipenv)

Instalacja i użycie

  1. Sklonuj repozytorium:
    git clone [https://github.com/vec-law/fx-analyzer.git](https://github.com/vec-law/fx-analyzer.git)
    cd fx-analyzer
  2. Zainstaluj biblioteki używając Pipenv:
    pipenv install
  3. Uruchom program w środowisku wirtualnym:
    pipenv run python main.py

Ładowanie danych

Program posiada zaimplementowane automatyczne ładowanie danych z dwóch źródeł:

  • Plik CSV: Program w pierwszej kolejności wyszukuje plik o nazwie instrument_interval.csv w 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 module ingestion.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 z yfinance tylko kursów par walutowych.

Korekta danych

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).

Interwały czasowe

W obecnej wersji programu zaimplementowano dzienne interwały czasowe. Należy pamiętać, aby interwał zapisywać w postaci 1d.

Dane wejściowe

Wejściem modelu jest 31 prostych średnich kroczących (SMA) w zakresie od SMA10 do SMA40 z historycznych cen zamknięcia.

Wartości docelowe

Wartościami docelowymi (target) są ceny zamknięcia (close).

Parametry wejściowe

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 instrumentu
  • interval – interwał czasowy
  • target_column – wybór kolumny z ceną docelową
  • strategy – numer strategii
  • indicators – wskaźniki, na podstawie których obliczane są cechy wejściowe
  • max_ind_period – maksymalny okres średniej kroczącej
  • samples_limit – limit długości zbioru danych
  • train_ratio – współczynnik podziału na dane treningowe
  • seed – parametr okreslający losowość danych
  • epochs – liczba kroków (epok) pętli treningowej
  • model_num – numer modelu odnoszący się do klasy ModelV{model_num} w src/model/architectures.py

Komunikaty wyjściowe

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.

Architektura wybranego modelu

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 ewaluacja

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

Wyniki

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
Trening Ewaluacja
Zbiór testowy: 500 (train_ratio = 0.875)
Trening Ewaluacja
Trening Ewaluacja
Zbiór testowy: 1000 (train_ratio = 0.75)
Trening Ewaluacja
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.

Analiza trendu instrumentu

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)
Wykres 250
Zbiór testowy: 500 (train_ratio = 0.875, strategy = None)
Wykres 250
Zbiór testowy: 1000 (train_ratio = 0.75, strategy = None)
Wykres 250

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.

Symulacja strategii

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

Przykładowa strategia rynkowa:

Założenia

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 cen target z n-1 próbki i wcześniejszych)
  • target – bieżąca cena (w obecnej strukturze danych df_dict[test] jedyną dostępną bieżącą ceną jest cena target = close)
  • diff_rel – względna różnica między bieżącą ceną target a 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.

Wyniki

Poniżej przedstawiono wykresy z wynikami przykładowej strategii:

Zbiór testowy: 250 (train_ratio = 0.9375, strategy = 1)
Wykres 250
Zbiór testowy: 500 (train_ratio = 0.875, strategy = 1)
Wykres 250
Zbiór testowy: 1000 (train_ratio = 0.75, strategy = 1)
Wykres 250

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.

Testowanie

Aby uruchomić testy integracyjne, upewnij się, że masz zainstalowany pakiet pytest, a następnie wykonaj:

pytest tests/test_integration.py

Historia zmian (Change Log)

PL:

  • 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

Licencja (License)

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.