Optymalizacja systemu transakcyjnego z walidacją krzyżową parametrów

    Czas na testy kolejnego systemu. Podobnie jak wcześniejsze, ten system też będzie wykorzystywał efekt momentum, ale będzie jeszcze prostszy. Tym razem nie używamy żadnych popularnych wskaźników — interesuje nas wyłącznie zmiana ceny w określonym czasie.

Warunek wejścia:

    Cena musi wzrosnąć o więcej niż określony procent w podanym okresie.

Warunek wyjścia:

    Cena musi spaść o więcej niż określony procent w podanym okresie.

    Okresy oraz wymagane zmiany to nasze parametry, które będziemy optymalizować. Jak zwykle, na początku zoptymalizujemy system na okresie in-sample (2008-2018), aby następnie przetestować najlepsze konfiguracje na danych out-of-sample (lata 2018-2024).

Zakres testowanych parametrów:

    Zmiana ceny: od 0% do +100% dla sygnału wejścia i od -90% do 0% dla sygnału wyjścia.
    Okresy: od 5 do 375 dni (od tygodnia do półtora roku) dla obu sygnałów.

    Pierwszym wyzwaniem jest ogromna liczba kombinacji — pełna permutacja wszystkich parametrów (z krokiem o 1) daje ich ponad miliard. Przy wydajności kilku testów na sekundę, sprawdzenie wszystkich zajęłoby kilkanaście lat. Z tego powodu przetestujemy tylko 1000 losowo wybranych kombinacji. Mimo, że to niewielki ułamek całej przestrzeni, to przy stabilnych parametrach (gdy wynik nie zmienia się znacząco przy niewielkich zmianach parametrów), powinniśmy otrzymać wiarygodne wartości.

Dodatkowe założenia systemu:

  1. Początkowy kapitał: 100 000 zł.
  2. W przypadku zbyt wielu sygnałów kupna wybieramy akcje z największą zmianą za okres kupna.
  3. Prowizje: 1% przy kupnie i sprzedaży.
  4. Nie otwieramy pozycji, jeśli jednocześnie występuje sygnał sprzedaży (analogicznie przy zamykaniu).
  5. Kupujemy akcje za 5% wartości konta; jeśli nie mamy wolnej gotówki, czekamy.

    Ostatni z warunków rodzi kolejny problem: jest całkiem prawdopodobne, że w danej chwili wiele spółek będzie spełniało warunek wejścia. Omijanie części sygnałów (gdy brakuje wolnej gotówki) oznacza, że końcowy kapitał będzie zależny od tego jakie spółki dały sygnał akurat wtedy kiedy mieliśmy wolny kapitał. Z kolei wolny kapitał zależy od poprzednich sygnałów. Innymi słowy, końcowy wynik mocno zależy od tego jak układały się sygnały wejścia i wyjścia, a nie tylko ich siły. Zaczynając test dzień wcześniej lub później zmieniamy "ścieżkę" transakcji i końcowy wynik.

    Jednym ze sposobów aby sobie z tym poradzić jest wprowadzenie jakiejś losowości. W przypadku algorytmów sztucznej inteligencji często w takich sytuacjach jest stosowana walidacja krzyżowa (cross-validation). Możemy na przykład usunąć losową połowę spółek i dopiero wtedy przeprowadzić test (ciągle mówimy o teście in-sample). Procedurę powtarzamy dowolną ilość razy, np 50. Mediana wyników jest końcowym wynikiem dla testowanych parametrów. Dlaczego mediana a nie średnia? Nie chcemy aby wynik był zawyżony przez kilka bardzo dobrych przebiegów. W teście out-of-sample preferujemy stabilność dobrych wyników zamiast kilku bardzo dobrych ale mało prawdopodobnych. Po prostu, out-of-sample ma symulować prawdziwy trading wykonywany przez wiele lat i nie będziemy mieli możliwości "cofnąć się w czasie" bo nie trafiliśmy z parametrami.

    Poniżej tabela z wynikami dla najlepszych 10 kombinacji parametrów z testu in-sample:

rate of change results

    Tak zoptymalizowany system wyraźnie wygrywa z rynkiem. W okresie in-sample WIG wzrósł o 26%, a nasz system średnio o 150%. Dodatkowo, osiem na dziesięć kombinacji pobiło średni wzrost akcji (108%) w tym okresie. Interesujące jest też to, że najlepsze parametry w teście in-sample okazały się najlepsze również w out-of-sample.

    Jest to kolejny test pokazujący, że trend oraz odpowiednia procedura wyboru systemu daje możliwości pobicia indeksu. Kod źródłowy do systemu znajduje się tutaj.

Następny wpis
Pytania lub uwagi? Twitter / X: Łukasz Wojtów
Software do testowania rynków finansowych: Alis