Jak powstaje strategia typu Momentum? Przykład, krok po kroku

Zachęcony komentarzem jednego z komentujących na LinkedIn, na temat narzędzia Mapa Momentum spółek GPW, że po co to i na co to komu, skoro nie jest pełną strategią z jasnymi momentami wyjścia, pomyślałem: żyjemy w erze AI, z LLMem przecież da się to zrobić pewnie w max kilka godzin.

Co prawda, nie do tego mapę stworzyłem, tylko raczej do ręcznego przeglądania spółek i wyłapywania, czy jakaś z bardziej popularnego sektora właśnie ma większe kłopoty na kursie. Czyli bardziej do strategii powrotu do średniej. Ale prawdą jest, do strategii typu momentum też da się je prosto wykorzystać.

Jak pomyślałem, tak zrobiłem — i wciąż nie mogę uwierzyć, że 5-8 lat temu taka analiza zajmowała mi kilka tygodni pracy. Teraz to 2-3 godziny z LLMem. Zupełnie nie żałuję tych lat, kiedy robiłem to sam, bo poznałem dokładnie gdzie leżą haczyki w takich analizach i wiele na temat tego, co może działać, a co raczej nie. Ale dziś stworzenie nowej takiej analizy to po prostu bajka.

Oczywiście samo kodowanie przez AI to kilka sekund czy minut, ale zawsze jest później dłuższy proces szlifowania, weryfikowania, analizowania i dopracowania wyniku. Więc realnie, trzeba liczyć 2-3 godziny, czasem dłużej.

Ktoś może powiedzieć: ale AI robi błędy. No jasne, ale czy ludzie ich nie robią? Czy jest gwarancja, że w moim kodzie sprzed 8 lat ich nie było? Jasne, dokładałem wszelkich starań, ale wtedy analizowałem to ja i być może ze 2 inne osoby, a dziś można zapytać kilku różnych AI: przyjmij sceptyczną postawę, podważ wszystko co może być źle w tym rozumowaniu, zasugeruj co może być nie-tak. I w ciągu sekund ma się drugi, trzeci punkt widzenia. Można prosić jeden model o weryfikację pracę drugiego. Ma to swoje ograniczenia, oczywiście, ale netto uważam za wkład pozytywny do pracy analityka czy (szczególnie!) programisty.


Traktuj proszę poniższe wyliczenia i kody z przymrużeniem oka: to jest szybka praca na boku codziennych obowiązków, to nie jest jeszcze gotowa strategia. Ale jest dobrym punktem startowym do dalszej pogłębionej analizy.



Krok 1: Mapa momentum spółek

W skrócie przypominam czym jest mapa momentum: to po prostu narzędzie, które na płaszczyźnie przedstawia „siłę trendu” na wybranym zestawie spółek. Oś pozioma to normalizacja min-max kursu z ostatniego roku (czyli w skrócie: momentum długoterminowe), oś pionowa to normalizacja min-max RSI 14-sesyjnego (czyli można powiedzieć: momentum krótkoterminowe).

Na tej bazie poprosiłem Claude’a o stworzenie mega prostej strategii, która:

Jako przykład, wrzucam jak wygląda mapa momentum spółek na koniec marca 2026. Jest tu co prawda tylko 60 spółek z WIG20 + MWIG40 (w strategii używam pełnego zestawu z GPW), ale i tak widać obrazowo, jakie spółki trafią do portfela takiej strategii: Asbis, Enea, LPP, Orange, PKN.

[pełna lista sygnałów poniżej, tickery na koniec marca to: ASB, CAP, CRI, ENA, LPP, LWB, MOL, OPL, PKN, TRN]

Takie wykazują ostatnio momentum, i takie byłyby trzymane w tej akurat strategii przez kolejny miesiąc.

Mapa momentum spółek na GPW, stan na 31 marca 2026.

W ten sposób powstała pierwsza, początkowa iteracja rozumowania, krok pierwszy.

Poniżej więc wykres, jaki po pierwszych kilku wymianach zdań wyrzucił Claude, po uwzględnieniu moich poprawek (zawsze coś nie działa na początku ;)) i poprawkach bazy danych.

Naiwna pierwsza wersja strategii momentum na polskich akcjach: kupuj co miesiąc 10 najsilniejszych spółek
Krok 1: Naiwna pierwsza wersja strategii momentum na polskich akcjach: kupuj co miesiąc 10 najsilniejszych spółek. Na górze proste statystyki strategii: CAGR, maxDD, Sharpe i profit factor.

Strategia rzekomo ma CAGR (średnią roczną stopę zwrotu) rzędu 40%, ale nie dajmy się porwać tym złudzeniom, jest szereg problemów z tą „strategią”, do których przejdziemy za moment.

Widać natomiast fajnie 2 ważne efekty: że momentum najsilniej działało w latach 2003-07, i w hossie pocovidowej w 2020-21. To jest już pierwsza wskazówka, że jesteśmy na dobrym tropie, bo momentum (i trend following ogólniej) właśnie tak działa: seriami. Są okresy silnego wystrzału do góry, i są okresy relatywnej stagnacji, które potrafią trwać latami, co widać na wykresie.

Widać też kolosalny drawdown -62% po mega hossie 2003-07, co i tak jest optymistyczne wiedząc, że działamy na bazie danych obciążonej survivorship bias (nie mam tu spółek delistowanych przed 2021). W prawdziwym świecie byłoby dużo gorzej. O tym za moment.

Krok 2: Realistyczne filtry spółek

W kroku drugim wkraczamy w urealnienie tych wyników. Po pierwsze dodać trzeba koszty transakcyjne. Dziś spotykane są 0,3% – 0m4%, ale w przeszłości na pewno były dużo większe. Więc już sam ten fakt obniżyłby wynik historyczny istotnie.

Druga sprawa to odfiltrowanie spółek, na których w ogóle możliwy byłby handel. Wiadomo, że jak wpadnie do portfela spółka microcap, która robi po 1000% wzrostu, to fajnie wygląda w backteście, ale niemożliwe jest do odtworzenia na prawdziwym majątku, bo obraca się na niej po 1000 zł dziennie.

Dodaję więc filtr: mediana obrotu (wolumen * cena) z ostatniego miesiąca ponad 250 000 zł. To już zawęża uniwersum dostępnych spółek istotnie.

Dodałem też, na zielono, liczbę spółek w portfolio, żeby upewnić się czy faktycznie alokacja jest cały czas na wybranym poziomie.

Poniżej wynik całego drugiego kroku.

Krok 2 strategii momentum: dodanie warunku płynności i kosztów transakcyjnych
Krok 2: Uwzględnienie płynności i kosztów transakcyjnych w strategii momentum. Na zielono liczba spółek spełniających kryteria.

Jak widać, już samo to urealniło bardziej i statystyki, i przebieg samej krzywej kapitału. CAGR spadł do 14%, maksymalne obsunięcie wzrosło do -72%.

Myślę, że takiego obsunięcia nie wytrwałby nawet najbardziej zagorzały zwolennik inwestowania w momentum 🙂 więc czas zrobić coś z tym kolosalnym drawdownem.

Krok 3: Walka z obsunięciami

Pierwsza myśl, jaka przyszła mi do głowy jest wykorzystanie tzw. szerokości rynkowych. To prosty wskaźnik, który mierzy jaki odsetek spółek z całego rynku jest w trendzie wzrostowym. W hossach zwykle jest on wysoki, w bessach odwrotnie. Może to będzie dobry filtr dla uniknięcia ekspozycji akcyjnej w tych trudniejszych momentach?

Poniżej na wykresie dochodzi kolejny subplot — wskaźnik szerokości rynkowych, i to czy on sam jest ponad swoją średnią (rośnie) czy poniżej (spada). Cały dostępny okres jest po prostu podzielony na te dwie skrajności i dwa możliwe stany rynku: hossa (risk-on) lub bessa (risk-off).

Na czerwono, paskami zaznaczone okresy tak wybranego risk-off.

Krok 3 strategii momentum: dodany filtr alokacji, żeby ograniczyć obsunięcia
Krok 3: Dodanie mechanizmu risk on/off: w celu kontroli obsunięć, staramy się unikać alokacji w spółki w trakcie rynkowej bessy.

Są plusy, są minusy tego rozwiązania. Obsunięcie faktycznie bardzo mocno spadło — z -72% na o wiele bardziej znośne -26%. Wynik, oczywiście, z tego powodu trochę też: CAGR z 14% na 12%. To nadal wynik przyzwoity, ale już bez szału. Sharpe dzięki tej operacji wzrósł (bo zmienność spadła dużo bardziej niż spadł zysk), profit factor też ma się lepiej.

Mam jednak wrażenie, że to jest trochę wylanie dziecka z kąpielą. Po pierwsze szerokości dość często wskazują risk-off, dużo częściej niż bym chciał. Po drugie: CAGR na poziomie 12% w strategii typu momentum (czyli zazwyczaj dość agresywnej) to nic szczególnie zachęcającego — gdyby chcieć ją zastosować w realnym przypadku w firmie oferującej taki produkt klientom, należałoby uwzględnić co najmniej kilka procent opłat i kosztów rocznie, realnie więc byłby to wynik rzędu 8%. Przy drawdownach rzędu 26-30%, taki produkt nie byłby konkurencyjny na rynku; mówiąc prościej: nikt by się nim nie zainteresował.

Spróbujmy więc cofnąć się o krok i spróbować czegoś innego.

Krok 4: Hedge’owanie indeksem?

Skoro totalny brak alokacji w okresach spadających szerokości jest zbyt restrykcyjny, może warto zostawić spółki w spokoju, i tylko włączać hedge’a na części alokacji? Na całość (100%) to zbyt mocne, bo już wiemy z poprzedniego kroku, że takich okresów jest dość dużo.

W takim razie spójrzmy jak zadziała włączanie hedge (transakcja short na kontraktach terminowych) na WIG20, na 50% wartości portfela. Przyznam, że tu trochę eksperymentowałem z różnymi procentami, 100% było słabe szczególnie w okresie 2017-19, być może MWIG40 zadziałałby wtedy lepiej. Z kolei poniżej 50% nie ma sensu schodzić, bo korzyść z takiego działania staje się znikoma.

Krok 4 strategii momentum: hedge'owanie indeksem zamiast wyłączania spółek
Krok 4: Hedge’owanie indeksem w okresach spadających szerokości. W celu kontroli obsunięć, staramy się unikać alokacji w trakcie rynkowej bessy, ale nie poprzez unikanie spółek, a przez otwarcie pozycji short na kontraktach WIG20.

Jak widać, to okazuje się totalnie nietrafione. I wynik (11%) jest gorszy, i obsunięcia (-61%) dużo gorsze niż w poprzednim przypadku. Sharpe jest tu słabszy niż nie hedge’ując wcale. Można powiedzieć, że shortowanie indeksu, który generalnie jest skrzywiony na to, żeby rosnąć (długoterminowy bias na rynkach akcyjnych) to nienajlepszy pomysł. A pamiętajmy, że to nie żaden S&P500 czy Nasdaq, tylko nasz, bijący niegdyś rekordy słabości, WIG20!

Wycofuję się więc totalnie z tego kroku, trzeba znaleźć coś innego.

Krok 5: Indeks dyfuzji jako filtr fazy risk-on / off

Wtedy do głowy przychodzi mi inny mechanizm risk-on/off, coś co już wiem, że działa ze strategii Global Growth Cycle: indeks dyfuzji OECD CLI.

Po wyjaśnienie tego wskaźnika odsyłam Cię do tamtego artykułu, gdzie jest omówiony ze szczegółami, teraz tylko powiem: są to wskaźniki wyprzedzające (CLI) dla zestawu krajów (17) publikowane przez OECD, a ja po prostu zliczam jaki ich odsetek wrósł lub spadł miesiąc do miesiąca. To jest właśnie indeks dyfuzji.

Na wykresie poniżej zastąpił on szerokości rynkowe na ostatnim subplocie.

Czy nie należy się martwić problemem opóźnienia w danych OECD CLI? Akurat nie, bo wskazanie pojawia się w pierwszej połowie miesiąca, a ja tu dodałem opóźnienie wskazania o 1 miesiąc. Czyli na koniec miesiąca brana jest wartość znana już kilka tygodni wcześniej. Można by to usprawnić, przesuwając tylko o 2 tygodnie, albo handlując w połowie miesiąca — takie pomysły dadzą prawdopodobnie lepszy wynik, ja się w to tutaj nie bawię, bo skupiam się na prostym „toy model” — „modelu zabawkowym”.

Krok 5 strategii momentum: indeks dyfuzji OECD CLI jako mechanizm risk-on/off. Hedge'owanie indeksem.
Krok 5: Wykorzystanie indeksu dyfuzji OECD CLI jako mechanizmu risk-on / off strategii. Shortowanie indeksu WIG20 podczas risk-off. Kolejna próba kontrolowania obsunięć tak, żeby nie były zbyt duże, i nie odjąć zbyt dużo zysku z pierwotnego mechanizmu.

Widać, że jest jakiś postęp. CAGR faktycznie wyższy, 14%, ale obsunięcie -52% jest nadal znaczne. Na pewno jest lepiej niż krok 2 i 4, ale czy też 3?

W takim razie wróćmy do pomysłu kroku 3, czyli bez shortowania indeksem, a po prostu unikania alokacji w spółkach w fazie risk-off.

Krok 6: Alokacja w spółki tylko w fazie risk-on

Poniższy wykres przedstawia wariant, w którym:

Krok 6 strategii momentum: indeks dyfuzji OECD CLI jako mechanizm risk-on/off. Brak hedge'a na indeksie.
Krok 6: Blisko finalnej strategii. Indeks dyfuzji OECD CLI jako mechanizm risk-on/off. Brak alokacji w okresach risk-off.

Jak widać, prowadzi to do CAGR około 15%, i obsunięcia rzędu -25%, czyli już bardzo przyzwoitych wartości. Jak przyzwoitych?

Dodałem WIG buy&hold dla porównania, żeby pokazać, że to już jest bardzo godny wysiłku wynik. CAGR indeksu jest niższy (8.6%), a obsunięcie dużo wyższe (-69%), więc już przynajmniej (potencjalnie! Tj. to tylko backtest) bijemy pasywne inwestowanie.

Statystyki tej wersji to:

StatystykaWartość
CAGR15,2%
Max obsunięcie (maxDD)-24,8%
Sharpe0,80
Profit factor1,90
MAR ratio0,61
Średni zysk na transakcji11,6%
Średnia strata na transakcji-6,4%

Krok 7: Ostateczna strategia spółek z Mapy Momentum

Ostatnim krokiem było eksperymentowanie z kryterium momentum długoterminowym i krótkoterminowym. Okazało się, że krótkoterminowy wskaźnik RSI(14) to tylko szum — wyrzucenie go totalnie ze wskazań daje i wynik (odrobinę) lepszy, i mniejszy obrót na portfelu (rzadsze zmiany w portfelu), więc… po co go trzymać?

Poniżej wprowadziłem jeszcze poprawki graficzne do wykresu — zamiana języka na polski, wyszczególnienie niektórych elementów, tak żeby było czytelniej i bardziej estetycznie.

Krok 7 strategii momentum: gotowa strategia
Krok 7: Ostateczny kształt strategii Mapy Momentum. Mapa momentum (tylko oś pozioma) jako kryterium selekcji spółek. Indeks dyfuzji OECD CLI jako kryterium alokacji (risk-on/off). Szczegółowe parametry podane poniżej wykresu, wyniki na górze i w tekście.

Dodałem także sam indeks WIG w okresach risk-on (pomarańczowa, przerywana krzywa), żeby zobaczyć na ile wynik pochodzi z samego mechanizmu selekcji reżimów ryzyka, a na ile z selekcji spółek. Jak widać, MAR ratio taka wersja ma nawet lepsze: prawie 0,8, ale przy niższym wyniku. MAR dla wersji „spółkowej” to wciąż solidne 0,7.

Ostateczne wyniki strategii to:

StatystykaWartość
CAGR18,4%
Max obsunięcie (maxDD)-26,4%
Sharpe0,94
Profit factor2,13
MAR ratio0,69
Średni zysk na transakcji11,1%
Średnia strata na transakcji-6,1%
Odsetek transakcji zyskownych53,8%

Haczyki i gwiazdki, czyli na co trzeba uważać

Przede wszystkim trzeba podkreślić, że to nie jest gotowa strategia, tylko przygotowany „na szybko” model zabawkowy, od którego warto zacząć. Stworzyłem go w kilka godzin rozmawiając z Claudem, i weryfikując wyniki z grubsza. Przy konkretnej strategii inwestycyjnej zalecałbym dużo większą wnikliwość i ostrożność.

Na pewno ograniczeniem jest survivorship bias w bazie danych, którą mam (spółki z yahoo finance, dbanie o poprawność spółek, splitów i dywidend od kilku lat – własnymi środkami). Im bardziej wstecz w czasie na powyższych wykresach, tym większą gra to rolę, czyli tym bardziej sceptycznym należy być co do wyników. Dziś (i w ostatnich kilku latach) wyniki są wiarygodne — dla wyników dużo starszych należałoby przeprowadzić analizę raz jeszcze, na bardziej wiarygodnej, płatnej bazie danych.

Jak pisałem, dziś można porozmawiać z AI na temat samej analizy, i wskazał mi on sam takie potencjalne zagrożenia:

potencjalny look-ahead bias w danych OECD CLI — tym się nie martwię, bo ręcznie zbieram te dane od lat i zawsze biorę tylko wartość first vintage, bez rewidowania,

survivorship bias w danych spółek (temat poruszony wyżej),

ważenie w funkcji celu — tu faktycznie nic nie było optymalizowane, bardzo możliwe, że bardziej skomplikowane funkcje dadzą lepsze wyniki,

koszty (założone na poziomie 0,3%) zapewne historycznie były inne, i w przyszłości też będą inne,

– i wreszcie: nie uwzględnienie, że okresy 100% w gotówce (których jest dość sporo) też dają odsetki, np. z instrumentów krótkoterminowych (lokaty, obligacje krótkoterminowe). To potencjalny bonus nie uwzględniony w tych obliczeniach.

Wyniki na mapie wyników

Z ciekawości, wrzuciłem jeszcze wyniki za okres od końca 2019 do końca 2025 na swoją standardową mapę wyników TFI — tylko po to, żeby mieć jakiś punkt odniesienia. Skorzystałem z danych użytych przy okazji omawiania strategii Uplift Momentum — bardziej złożonej i dużo lepiej przebadanej strategii Momentum (bo nie tylko przeze mnie) na polskich (i nie tylko) akcjach.

Wynik niniejszego „modelu zabawkowego” zaznaczyłem na fioletowo, kółkiem z 'x’ w środku.

Mapa wyników funduszy TFI + indeksów pasywnych + wybranych strategii algorytmicznych (typu momentum)

Wynik jest porównywalny z GGCE (podobny region) i z indeksem SWIG80 (ten sam wynik, mniejszy drawdown). Nie dościga wyniku CAGR z Uplift Momentum na akcjach polskich (PL), chociaż ma dużo mniejszy drawdown.

Dlaczego to może działać?

Na koniec — fragment odrobinę filozoficzny. Dlaczego coś tak mega prostego ma wyniki lepsze niż niejeden fundusz (nawet zakładając CAGR o 3-4% mniejszy, na pokrycie kosztów formalnych i wynagrodzeń), i miałoby w ogóle działać w przyszłości?

Odpowiedź jest podobna, jak w przypadku większości strategii algorytmicznych: bo są one bardzo proste, ale nie łatwe. Niełatwe w stosowaniu. Największa trudność to jest zwykle behawior i zachowanie — wytrwanie w strategii.

Najbardziej w tym temacie lubię cytat z Richarda Dennisa, twórcy eksperymentu żółwi, z lat 80-tych ubiegłego wieku: „w zasadzie moglibyśmy opublikować szczegóły naszych strategii inwestycyjnych na głównej stronie New York Times’a, a i tak większość czytających by ich nie przestrzegała”.

Niewiele się zmieniło w tej sprawie. Często myśli się o inwestowaniu jako o przewadze informacyjnej, i czasem taka faktycznie jest w jakiejś strategii (zazwyczaj dyskrecjonalnej), ale o wiele częściej siłą strategii jest po prostu przewaga behawioralna.

Tak jest z wieloma strategiami inwestycyjnymi. Klucz do ich sukcesu nie leży w niezwykłości zasad, które są w nich stosowane czy nieprzeciętnej przewadze informacyjnej, czy też magicznej formułce programistycznej. Klucz tkwi w tym, że w każdej strategii inwestycyjnej, żeby mieć wynikające z niej zyski, musisz zaufać na tyle, żeby przetrwać doświadczane w niej straty. To są koszty jej stosowania, i są one nieuniknione. I te koszty często pojawiają się w szczególnie niesprzyjających momentach.

Najlepszy i najprostszy przykład to są strategie pasywne. Nie ma chyba nic prostszego, tam nie ma żadnej selekcji, żadnego kombinowania. Korzystasz po prostu z wielodekadowego wzrostu gospodarczego świata. Gdzie jest haczyk? Haczyk to konieczność przetrwania obsunięć rzędu -40%, -50%, czasem nawet więcej, w środowisku informacyjnym, które jest wtedy skrajnie niesprzyjające.

Nawet w branży inwestycyjnej, w której pracowałem, miałem spory problem przekonać ludzi (na początku) do sensowności stosowania prostych metod algorytmicznych. Są po prostu trudne do zaakceptowania dla ludzkiej natury, która często podpowiada nam: większe skomplikowane, ludzki proces analityczny, bardziej dyskrecjonalne strategie będą bardziej wiarygodne niż prosty automat, i dadzą większe poczucie kontroli.

Ludzie bardzo często odchodzą od prostych strategii, bo uważają, że wiedzą lepiej. Zawsze istnieje pokusa myślenia, że w nawet losowych zachowaniach rynku czai się istotny sygnał. Zwykle bardziej szczegółowa opowieść wydaje się bardziej wiarygodna, i to tak zwana heurystyka reprezentatywności, o której pisał Kahneman i Tversky. Ale to szerzej postaram się opisać w jednym z późniejszych wpisów.

Dalsze kroki, czyli co należy usprawnić

Czy polecam stosować tę konkretną strategię w realnym portfelu? Jeszcze nie, bo trzeba dopracować kilka szczegółów, opisanych wyżej. Zresztą, da się stworzyć bardziej sensowne, bardziej wyrafinowane strategie tego typu, chociażby modyfikując powyżej opisaną funkcje celu. Ale taki plan działania jak tu przedstawiony, krok po kroku, jest bardzo dobrym punktem startu do ich konstruowania.

W realnym zastosowaniu zatroszczyłbym się, przede wszystkim:

o pełną, wiarygodną bazę danych, na podstawie której pracujesz i dobierasz spółki. Można korzystać z bezpłatnych alternatyw, ale do realnego handlu polecałbym jednak którąś z płatnych i porządnie utrzymywanych baz danych,

– wprowadził transzowanie, czyli nie handel tylko raz, na koniec miesiąca, ale podział strategii na kilka „podzespołów”, działających równolegle, z których każdy uruchamiany jest w innej części miesiąca. Daje to dywersyfikację na to, co się dzieje na rynku, ale też wygładza trochę losowość i arbitralność wybranych tu parametrów,

– jeżeli ktoś nalegałby jednak na optymalizację parametrów wybranej tu strategii (co wprowadza zagrożenie zwane overfittingiem do danych historycznych), to należałoby to zrobić z podziałem całej bazy danych historycznych na okresy in-sample (na których algorytm „uczy się” lepszych parametrów) i out-of-sample (na których są sprawdzane). Tu już wchodzilibyśmy mocno w temat statystycznej istotności takich testów, i osobiście raczej jestem sceptyczny do tego typu optymalizacji, bo o wiele silniej wprowadzają one overfitting, niż faktycznie poprawiają wyniki, ale zaznaczam tylko, że jest taka możliwość.

Cała taka procedura badawcza, poszukiwania w ten sposób optymalnych parametrów, nazywa się mianem Walk forward optimization. Dla mnie jednak prostota podejścia (i pewna „niezależność” w ten sposób od konkretnych parametrów) jest nadrzędna wobec odrobinę lepszych wyników przy potencjalnie sporym błędzie takiego dopasowania.

Polecić mogę też np. odrobinę bardziej złożoną (ale ideowo dość podobną) strategię typu momentum akcji na rynku polskim opisaną już 5 lat temu przez Jacka Lemparta z SystemTrader.pl, zwaną Advanced Equity Momentum, którą z tego co wiem, Jacek publicznie prowadzi na swoim portfelu już od kilku lat. Tam znajdziesz szeroki jej opis.

Pełny kod do strategii i pełna lista sygnałów

Poniżej załączam pełny kod do wygenerowania powyższego wykresu (końcowego) strategii. To, co do niego potrzebujesz, to własnej bazy danych o kursach spółek, umieszczenie jej w folderze ’data’, pliku z listą spółek ’gpw_stocks.csv’ oraz pliku ze wskazaniami indeksu dyfuzji OECD CLI. To te trzy elementy potrzebne do wczytania przez pandas.read_csv. Wszystkie są do zdobycia w sieci dość łatwo dla ambitnej, zmotywowanej osoby 🙂

Zostawiłem też funkcję celu jako score_dict[t] = 1.*price_norm + 0.*rsi_norm — jak widzisz, momentum krótkoterminowe jest tu przemnożone przez 0, czyli nie gra żadnej roli, jak wyszło w trakcie powyższego rozumowania. Zostawiam jednak ten fragment dla chętnych, być może ktoś zechce potestować ten kod i spróbować zrobić wersję, w której ten fragment się też przyda.

Pokaż pełny kod strategii (Python)

#-*- coding: utf-8 -*-

import pandas as pd
import numpy as np
import datetime as dt
import os
from talib import RSI
import matplotlib
import matplotlib.pyplot as plt
matplotlib.rc('font', family='Verdana')
matplotlib.style.use('ggplot')

# ============================================================
# PARAMETERS
# ============================================================
NUM = 10                # number of stocks in portfolio
LOOKBACK = 252          # ~1 year of trading days for min-max normalization
RSI_PERIOD = 14         # RSI calculation period
COST_PER_TRADE = 0.003  # 0.3% one-way transaction cost (buy or sell)
MIN_TURNOVER = 250_000  # minimum median 30-day turnover in PLN
TURNOVER_WINDOW = 30    # rolling window for median turnover (trading days)
DI_THRESHOLD = 0.5      # DI >= this → risk-on, otherwise risk-off (cash)

# ============================================================
# DATA LOADING
# ============================================================

def load_stock(filename, folder='data'):
    """Load a single stock CSV, return (adj_close_series, close_series, volume_series)."""
    df = pd.read_csv(
        folder + '/' + filename + '.csv', sep=',', index_col=0,
        parse_dates=True, skiprows=1,
        names=['Date', 'Adj Close', 'Close', 'High', 'Low', 'Open', 'Volume']
    )
    adj_close = pd.to_numeric(df['Adj Close'], errors='coerce').astype(float)
    close     = pd.to_numeric(df['Close'],     errors='coerce').astype(float)
    volume    = pd.to_numeric(df['Volume'],     errors='coerce').astype(float)

    adj_close.name = filename
    close.name     = filename
    volume.name    = filename

    return adj_close, close, volume


instruments = pd.read_csv('gpw_stocks.csv', sep=',', header=0)
instruments['filename'] = instruments['Ticker']
instruments['assetname'] = instruments['Name']
instruments = instruments.reset_index(drop=True)

for i in instruments.index:
    label = instruments['assetname'][i]
    instruments.loc[i, 'assetname'] = label

# Load all stock instruments
adj_frames = []
close_frames = []
vol_frames = []

for i in range(len(instruments)):
    adj, cls, vol = load_stock(instruments['filename'][i])
    adj_frames.append(adj)
    close_frames.append(cls)
    vol_frames.append(vol)

ALLDATA  = pd.concat(adj_frames, axis=1)
CLOSE    = pd.concat(close_frames, axis=1)
VOLUME   = pd.concat(vol_frames, axis=1)

for df in [ALLDATA, CLOSE, VOLUME]:
    df.sort_index(inplace=True)
    df.index = pd.to_datetime(df.index)

tickers = instruments['Ticker'].tolist()
print(f"Loaded {len(tickers)} instruments, "
      f"date range: {ALLDATA.index[0].date()} — {ALLDATA.index[-1].date()}")

# Load WIG for benchmark
WIG_adj, _, _ = load_stock('WIG', folder='indexData')
WIG = WIG_adj.copy()
WIG.index = pd.to_datetime(WIG.index)
WIG = WIG.sort_index()
print(f"WIG loaded: {WIG.index[0].date()} — {WIG.index[-1].date()}")

# ============================================================
# OECD CLI DIFFUSION INDEX
# ============================================================

print("Loading OECD CLI Diffusion Index …")
di_raw = pd.read_csv('DiffusionIndex.csv', index_col=0, parse_dates=True)
di_raw.index = pd.to_datetime(di_raw.index)
di_raw = di_raw.sort_index()
di_raw['MMIncrease'] = di_raw['MMIncrease'].shift(1) # shift by 1 month to account for data lag
DI_COL = di_raw.columns[0]
print(f"DI loaded: {di_raw.index[0].date()} — {di_raw.index[-1].date()}, "
      f"column: '{DI_COL}'")

DI = di_raw[DI_COL].reindex(ALLDATA.index, method='ffill')
RISK_ON = DI >= DI_THRESHOLD

risk_on_pct = RISK_ON.dropna().mean() * 100
print(f"Risk-on days: {RISK_ON.sum()} / {len(RISK_ON)}  ({risk_on_pct:.1f}%)")

# ============================================================
# TURNOVER: median of (Close * Volume) over trailing 30 days
# ============================================================

print("Computing turnover …")
DAILY_TURNOVER = CLOSE * VOLUME
MEDIAN_TURNOVER = DAILY_TURNOVER.rolling(window=TURNOVER_WINDOW,
                                         min_periods=TURNOVER_WINDOW).median()

# ============================================================
# MOMENTUM MEASURE  (no look-ahead bias)
# ============================================================

def compute_scores(prices_df, tickers, lookback=LOOKBACK, rsi_period=RSI_PERIOD):
    score_dict = {}
    for t in tickers:
        p = prices_df[t].copy()

        p_min = p.rolling(window=lookback, min_periods=lookback).min()
        p_max = p.rolling(window=lookback, min_periods=lookback).max()
        p_range = p_max - p_min
        price_norm = (p - p_min) / p_range.replace(0, np.nan)

        rsi = pd.Series(RSI(p.values, timeperiod=rsi_period), index=p.index)
        rsi_min = rsi.rolling(window=lookback, min_periods=lookback).min()
        rsi_max = rsi.rolling(window=lookback, min_periods=lookback).max()
        rsi_range = rsi_max - rsi_min
        rsi_norm = (rsi - rsi_min) / rsi_range.replace(0, np.nan)

        score_dict[t] = 1.*price_norm + 0.*rsi_norm

    return pd.DataFrame(score_dict, index=prices_df.index)


print("Computing momentum scores …")
SCORES = compute_scores(ALLDATA, tickers)

# ============================================================
# IDENTIFY MONTH-END DATES
# ============================================================

ym = ALLDATA.index.to_period('M')
month_end_dates = (
    pd.Series(ALLDATA.index, index=ALLDATA.index)
    .groupby(ym)
    .last()
    .sort_values()
)

first_valid = SCORES.dropna(how='all', axis=0).index[0]
month_end_dates = month_end_dates[month_end_dates >= first_valid]
month_end_dates = month_end_dates.values

print(f"Month-end rebalance dates: {len(month_end_dates)}  "
      f"({pd.Timestamp(month_end_dates[0]).date()} → "
      f"{pd.Timestamp(month_end_dates[-1]).date()})")

# ============================================================
# BACKTEST
#   - Risk-on (DI >= 0.5): hold top NUM momentum stocks
#   - Risk-off (DI < 0.5): full cash
# ============================================================

equity = 1.0
equity_curve = []
prev_portfolio = set()
monthly_returns = []
stocks_in_portfolio = []
risk_on_history = []
di_history = []
holdings_log = []  # (rank_date, exit_date, risk_on, [tickers])

trade_wins = 0
trade_losses = 0
trade_win_sum = 0.0
trade_loss_sum = 0.0
gross_profit = 0.0
gross_loss = 0.0

for idx in range(len(month_end_dates) - 1):
    rank_date = month_end_dates[idx]
    exit_date = month_end_dates[idx + 1]

    # --- risk-on / risk-off from DI ---
    di_value = DI.loc[rank_date] if rank_date in DI.index else np.nan
    is_risk_on = bool(di_value >= DI_THRESHOLD) if np.isfinite(di_value) else True
    risk_on_history.append((exit_date, is_risk_on))
    di_history.append((exit_date, di_value))

    # --- risk-off → cash ---
    if not is_risk_on:
        equity_curve.append((exit_date, equity))
        monthly_returns.append(0.0)
        stocks_in_portfolio.append((exit_date, 0))
        holdings_log.append((rank_date, exit_date, False, []))
        prev_portfolio = set()
        continue

    # --- liquidity filter ---
    turnover_row = MEDIAN_TURNOVER.loc[rank_date]
    liquid_stocks = set(turnover_row[turnover_row >= MIN_TURNOVER].dropna().index)

    # --- ranking ---
    row = SCORES.loc[rank_date]
    row = row[row.index.isin(liquid_stocks)]
    valid = row.dropna().sort_values(ascending=False)

    if len(valid) < NUM:
        equity_curve.append((exit_date, equity))
        monthly_returns.append(0.0)
        stocks_in_portfolio.append((exit_date, len(valid) if len(valid) > 0 else 0))
        holdings_log.append((rank_date, exit_date, True, list(valid.index)))
        continue

    selected = set(valid.index[:NUM])
    selected_sorted = sorted(selected)

    # --- compute per-stock returns during the NEXT month ---
    sel_list = list(selected)
    prices_start = ALLDATA.loc[rank_date, sel_list]
    prices_end   = ALLDATA.loc[exit_date, sel_list]

    valid_mask = (prices_start > 0) & prices_start.notna() & prices_end.notna()
    prices_start = prices_start[valid_mask]
    prices_end   = prices_end[valid_mask]

    stock_returns = (prices_end / prices_start) - 1.0
    stock_returns = stock_returns.dropna()
    stock_returns = stock_returns[np.isfinite(stock_returns)]

    n_held = len(stock_returns)
    stocks_in_portfolio.append((exit_date, n_held))
    holdings_log.append((rank_date, exit_date, True, selected_sorted))

    if n_held == 0:
        equity_curve.append((exit_date, equity))
        monthly_returns.append(0.0)
        continue

    # --- transaction costs on stock turnover ---
    new_entries  = selected - prev_portfolio
    exits        = prev_portfolio - selected
    turnover_pct = (len(new_entries) + len(exits)) / (2 * NUM)
    cost = turnover_pct * 2 * COST_PER_TRADE

    # --- portfolio return (equal weight stocks) ---
    port_return = stock_returns.mean() - cost

    # --- track individual stock trades for win/loss stats ---
    for t in stock_returns.index:
        r = stock_returns[t]
        if r > 0:
            trade_wins += 1
            trade_win_sum += r
            gross_profit += r
        else:
            trade_losses += 1
            trade_loss_sum += abs(r)
            gross_loss += abs(r)

    equity *= (1 + port_return)
    equity_curve.append((exit_date, equity))
    monthly_returns.append(port_return)
    prev_portfolio = selected

# ============================================================
# SAVE HOLDINGS LOG TO TXT
# ============================================================

holdings_file = 'momentum_holdings.txt'
with open(holdings_file, 'w') as f:
    f.write(f"Momentum GPW — Top {NUM} stocks, monthly rebalance\n")
    f.write(f"Liquidity filter: median 30d turnover >= {MIN_TURNOVER/1000:.0f}k PLN\n")
    f.write(f"Risk-off (DI < {DI_THRESHOLD}): full cash\n")
    f.write("=" * 70 + "\n\n")

    for rank_date, exit_date, risk_on, held_tickers in holdings_log:
        rd = pd.Timestamp(rank_date).strftime('%Y-%m-%d')
        ed = pd.Timestamp(exit_date).strftime('%Y-%m-%d')
        regime = "RISK-ON " if risk_on else "RISK-OFF"

        if not risk_on:
            f.write(f"{rd} → {ed}  [{regime}]  CASH\n")
        elif len(held_tickers) == 0:
            f.write(f"{rd} → {ed}  [{regime}]  (no valid stocks)\n")
        else:
            ticker_str = ", ".join(held_tickers)
            f.write(f"{rd} → {ed}  [{regime}]  ({len(held_tickers)}) {ticker_str}\n")

print(f"\nHoldings log saved to {holdings_file}")

# ============================================================
# DataFrames for plotting
# ============================================================

eq_df = pd.DataFrame(equity_curve, columns=['Date', 'Equity']).set_index('Date')
nstocks_df = pd.DataFrame(stocks_in_portfolio, columns=['Date', 'N']).set_index('Date')
risk_df = pd.DataFrame(risk_on_history, columns=['Date', 'RiskOn']).set_index('Date')
di_df = pd.DataFrame(di_history, columns=['Date', 'DI']).set_index('Date')

# ============================================================
# WIG BUY & HOLD BENCHMARK
# ============================================================

bt_start = eq_df.index[0]
bt_end   = eq_df.index[-1]

WIG_trimmed = WIG.loc[bt_start:bt_end].dropna()
WIG_bh = WIG_trimmed / WIG_trimmed.iloc[0]

WIG_final = WIG_bh.iloc[-1]
WIG_years = (WIG_bh.index[-1] - WIG_bh.index[0]).days / 365.25
WIG_cagr = WIG_final ** (1.0 / WIG_years) - 1.0
WIG_running_max = WIG_bh.cummax()
WIG_dd = WIG_bh / WIG_running_max - 1.0
WIG_maxdd = WIG_dd.min()

# ============================================================
# WIG RISK-ON ONLY BENCHMARK
# (Buy & hold WIG only during risk-on months, cash otherwise)
# ============================================================

wig_ro_equity = 1.0
wig_ro_curve = []

for idx in range(len(month_end_dates) - 1):
    rank_date = month_end_dates[idx]
    exit_date = month_end_dates[idx + 1]

    di_value = DI.loc[rank_date] if rank_date in DI.index else np.nan
    is_risk_on = bool(di_value >= DI_THRESHOLD) if np.isfinite(di_value) else True

    if not is_risk_on:
        wig_ro_curve.append((exit_date, wig_ro_equity))
        continue

    wig_start = WIG.loc[rank_date] if rank_date in WIG.index else np.nan
    wig_end   = WIG.loc[exit_date] if exit_date in WIG.index else np.nan

    if np.isfinite(wig_start) and np.isfinite(wig_end) and wig_start > 0:
        wig_ret = (wig_end / wig_start) - 1.0
        wig_ro_equity *= (1 + wig_ret)

    wig_ro_curve.append((exit_date, wig_ro_equity))

wig_ro_df = pd.DataFrame(wig_ro_curve, columns=['Date', 'Equity']).set_index('Date')

wig_ro_final = wig_ro_df['Equity'].iloc[-1]
wig_ro_years = len(wig_ro_curve) / 12.0
wig_ro_cagr = wig_ro_final ** (1.0 / wig_ro_years) - 1.0
wig_ro_running_max = wig_ro_df['Equity'].cummax()
wig_ro_dd = wig_ro_df['Equity'] / wig_ro_running_max - 1.0
wig_ro_maxdd = wig_ro_dd.min()

# ============================================================
# STRATEGY STATISTICS
# ============================================================

monthly_ret = np.array(monthly_returns)
n_months = len(monthly_ret)
n_years = n_months / 12.0

final_equity = eq_df['Equity'].iloc[-1]
cagr = final_equity ** (1.0 / n_years) - 1.0

running_max = eq_df['Equity'].cummax()
drawdown = eq_df['Equity'] / running_max - 1.0
max_dd = drawdown.min()

avg_win  = (trade_win_sum / trade_wins)   if trade_wins   > 0 else 0
avg_loss = (trade_loss_sum / trade_losses) if trade_losses > 0 else 0
profit_factor = (gross_profit / gross_loss) if gross_loss > 0 else np.inf

if monthly_ret.std() > 0:
    sharpe = (monthly_ret.mean() / monthly_ret.std()) * np.sqrt(12)
else:
    sharpe = 0.0

risk_off_months = (~risk_df['RiskOn']).sum()
risk_on_months  = risk_df['RiskOn'].sum()

print("\n" + "=" * 60)
print(f"  MOMENTUM STRATEGY  |  Top {NUM} stocks  |  Monthly rebal.")
print(f"  Liquidity filter : median 30d turnover >= {MIN_TURNOVER/1000:.0f}k PLN")
print(f"  Risk-off (DI < {DI_THRESHOLD}) : full cash")
print(f"  Risk-on / off    : {risk_on_months} / {risk_off_months} months")
print("=" * 60)
print(f"  Period        : {eq_df.index[0].date()} → {eq_df.index[-1].date()}")
print(f"  Months traded : {n_months}")
print(f"  CAGR          : {cagr*100:8.2f} %")
print(f"  Max Drawdown  : {max_dd*100:8.2f} %")
print(f"  Sharpe (ann.) : {sharpe:8.2f}")
print(f"  Profit Factor : {profit_factor:8.2f}")
print("-" * 60)
print(f"  Winning trades: {trade_wins:6d}   avg win : {avg_win*100:7.2f} %")
print(f"  Losing  trades: {trade_losses:6d}   avg loss: {avg_loss*100:7.2f} %")
print(f"  Win rate      : {trade_wins/(trade_wins+trade_losses)*100:7.2f} %")
print("-" * 60)
print(f"  WIG B&H       : CAGR {WIG_cagr*100:6.2f}%   MaxDD {WIG_maxdd*100:6.2f}%")
print(f"  WIG risk-on   : CAGR {wig_ro_cagr*100:6.2f}%   MaxDD {wig_ro_maxdd*100:6.2f}%")
print("=" * 60)

# ============================================================
# PLOT  (4 panels: equity + benchmarks, drawdown, stocks held, DI)
# ============================================================

fig, axes = plt.subplots(4, 1, figsize=(12, 11.2), sharex=True,
                         gridspec_kw={'height_ratios': [3, 1, 1, 1.5]})
fig.patch.set_facecolor('white')

for ax in axes:
    ax.set_facecolor('white')
    ax.grid(True, which='major', alpha=0.25, color='#cccccc')
    ax.grid(True, which='minor', alpha=0.12, color='#dddddd')
    ax.tick_params(colors='#333333')
    for spine in ax.spines.values():
        spine.set_color('#cccccc')

# --- Panel 1: Equity curves (log scale) ---
ax1 = axes[0]
ax1.set_title('Wyniki strategii (skala log) — spółki polskie (GPW)\n', fontsize=16, fontweight='bold',
              color='#222222', loc='center', pad=8)
ax1.semilogy(eq_df.index, eq_df['Equity'], color='#2244aa', linewidth=1.8,
             label=f'Strategia Momentum (CAGR {cagr*100:.1f}%, MaxDD {max_dd*100:.1f}%)')
ax1.semilogy(wig_ro_df.index, wig_ro_df['Equity'], color='#dd8800', linewidth=1.3,
             linestyle='-.',
             label=f'WIG tylko gdy risk-on (CAGR {wig_ro_cagr*100:.1f}%, MaxDD {wig_ro_maxdd*100:.1f}%)')
ax1.semilogy(WIG_bh.index, WIG_bh.values, color='#999999', linewidth=1.2,
             linestyle='--',
             label=f'WIG kup & trzymaj (CAGR {WIG_cagr*100:.1f}%, MaxDD {WIG_maxdd*100:.1f}%)')
ax1.legend(loc='upper left', fontsize=9, framealpha=0.9, facecolor='white', edgecolor='darkgoldenrod')
ax1.tick_params(axis='x', labelbottom=True)

# shade risk-off periods
for i in range(len(risk_df)):
    if not risk_df['RiskOn'].iloc[i]:
        d = risk_df.index[i]
        ax1.axvspan(d - pd.Timedelta(days=15), d + pd.Timedelta(days=15),
                    alpha=0.1, color='darkorange', zorder=0)

# --- Panel 2: Drawdown ---
ax2 = axes[1]
ax2.set_title(u'Obsunięcie kapitału (drawdown) strategii', fontsize=13, fontweight='bold',
              color='#222222', loc='center', pad=8)
ax2.fill_between(drawdown.index, drawdown.values * 100, 0,
                 color='#cc3333', alpha=0.4)
ax2.plot(drawdown.index, drawdown.values * 100, color='#cc3333', linewidth=0.8)

# --- Panel 3: Stocks in portfolio ---
ax3 = axes[2]
ax3.set_title(u'Liczba spółek w portfelu', fontsize=13, fontweight='bold',
              color='#222222', loc='center', pad=8)
ax3.bar(nstocks_df.index, nstocks_df['N'], width=25, color='#228833', alpha=0.7)
ax3.axhline(y=NUM, color='#888888', linestyle='--', linewidth=0.8, label=f'Target = {NUM}')
ax3.set_ylim(0, NUM + 2)
ax3.legend(loc='lower right', fontsize=9, framealpha=0.9)

# --- Panel 4: OECD CLI Diffusion Index ---
ax4 = axes[3]
ax4.set_title('Indeks Dyfuzji OECD CLI', fontsize=13, fontweight='bold',
              color='#222222', loc='center', pad=8)
ax4.plot(di_df.index, di_df['DI'], color='#2244aa', linewidth=1.2,
         marker='o', markersize=2)
ax4.axhline(y=DI_THRESHOLD, color='#888888', linestyle='--', linewidth=1.0,
            label=f'Wartość graniczna = {DI_THRESHOLD}')
ax4.fill_between(di_df.index, di_df['DI'], DI_THRESHOLD,
                 where=(di_df['DI'] >= DI_THRESHOLD),
                 alpha=0.2, color='green', label='Risk-on')
ax4.fill_between(di_df.index, di_df['DI'], DI_THRESHOLD,
                 where=(di_df['DI'] < DI_THRESHOLD),
                 alpha=0.2, color='red', label=u'Risk-off (gotówka)')
ax4.set_ylim(-0.05, 1.05)
ax4.legend(loc='lower right', fontsize=9, framealpha=0.9)

ax4.xaxis.set_major_locator(matplotlib.dates.YearLocator(2))
ax4.xaxis.set_minor_locator(matplotlib.dates.YearLocator())

# --- Parameters text box below the chart ---
param_text = (
    f"Parametry:  liczba spółek w portfelu = {NUM}  |  "
    f"Funkcja celu = 52weekPriceNorm({LOOKBACK}d)\n"
    f"Filtr płynności: mediana {TURNOVER_WINDOW}d obrotu ≥ {MIN_TURNOVER/1000:.0f}k PLN  |  "
    f"koszty transakcyjne = {COST_PER_TRADE*100:.1f}% w jedną stronę\n"
    f"Filtr ryzyka:  Indeks Dyfuzji OECD CLI ≥ {DI_THRESHOLD} → risk-on (trzymaj spółki), "
    f"< {DI_THRESHOLD} → risk-off (pełna gotówka)  |  "
    f"rebalans: miesięcznie (ostatnia sesja)"
)

fig.text(0.05, 0.01, param_text, ha='left', va='top', fontsize=9,
         color='#555555', family='monospace',
         bbox=dict(boxstyle='round,pad=0.5', facecolor='#f5f5f5',
                   edgecolor='#cccccc', alpha=0.9))

plt.tight_layout()
plt.subplots_adjust(bottom=0.07)
plt.savefig('momentum_strategy.png', dpi=200, bbox_inches='tight',
            facecolor='white', edgecolor='none')
plt.show()

print("\nChart saved to momentum_strategy.png")

Pokaż pełną listę sygnałów (txt)

Momentum GPW — Top 10 stocks, monthly rebalance
Liquidity filter: median 30d turnover >= 250k PLN
Risk-off (DI < 0.5): full cash
======================================================================

2001-01-31 → 2001-02-28  [RISK-OFF]  CASH
2001-02-28 → 2001-03-30  [RISK-OFF]  CASH
2001-03-30 → 2001-04-30  [RISK-OFF]  CASH
2001-04-30 → 2001-05-31  [RISK-OFF]  CASH
2001-05-31 → 2001-06-29  [RISK-OFF]  CASH
2001-06-29 → 2001-07-31  [RISK-OFF]  CASH
2001-07-31 → 2001-08-31  [RISK-OFF]  CASH
2001-08-31 → 2001-09-28  [RISK-OFF]  CASH
2001-09-28 → 2001-10-31  [RISK-OFF]  CASH
2001-10-31 → 2001-11-30  [RISK-OFF]  CASH
2001-11-30 → 2001-12-31  [RISK-OFF]  CASH
2001-12-31 → 2002-01-31  [RISK-OFF]  CASH
2002-01-31 → 2002-02-28  [RISK-ON ]  (10) ACP, AGO, BHW, KGH, KTY, MBK, MIL, PEO, PKN, SGN
2002-02-28 → 2002-03-29  [RISK-ON ]  (10) ACP, AGO, ECH, KGH, KTY, MBK, OPL, PEO, PKN, SGN
2002-03-29 → 2002-04-30  [RISK-ON ]  (10) ACP, AGO, ECH, KGH, MBK, MIL, OPL, PEO, PKN, SGN
2002-04-30 → 2002-05-31  [RISK-ON ]  (10) ACP, AGO, BHW, ECH, MBK, MIL, OPL, PEO, PKN, SGN
2002-05-31 → 2002-06-28  [RISK-ON ]  (10) ACP, AGO, ECH, KGH, MBK, MIL, OPL, PEO, PKN, SGN
2002-06-28 → 2002-07-31  [RISK-OFF]  CASH
2002-07-31 → 2002-08-30  [RISK-OFF]  CASH
2002-08-30 → 2002-09-30  [RISK-OFF]  CASH
2002-09-30 → 2002-10-31  [RISK-OFF]  CASH
2002-10-31 → 2002-11-29  [RISK-OFF]  CASH
2002-11-29 → 2002-12-31  [RISK-OFF]  CASH
2002-12-31 → 2003-01-31  [RISK-OFF]  CASH
2003-01-31 → 2003-02-28  [RISK-OFF]  CASH
2003-02-28 → 2003-03-31  [RISK-OFF]  CASH
2003-03-31 → 2003-04-30  [RISK-OFF]  CASH
2003-04-30 → 2003-05-30  [RISK-OFF]  CASH
2003-05-30 → 2003-06-30  [RISK-OFF]  CASH
2003-06-30 → 2003-07-31  [RISK-ON ]  (10) ACP, ECH, KGH, KTY, OPL, PEO, PKN, RPC, SGN, SNK
2003-07-31 → 2003-08-29  [RISK-ON ]  (10) ACP, ECH, KGH, KTY, OPL, PEO, PKN, RPC, SNK, STF
2003-08-29 → 2003-09-30  [RISK-ON ]  (10) ACP, AGO, ECH, FTE, GTN, LES, PEO, PKN, SGN, SPL
2003-09-30 → 2003-10-31  [RISK-ON ]  (10) ACP, ECH, GTN, KGH, KTY, MCI, PKN, RPC, SNK, STF
2003-10-31 → 2003-11-28  [RISK-ON ]  (10) ACP, BRS, ECH, GTN, KGH, KTY, MCI, PKN, SNK, STF
2003-11-28 → 2003-12-31  [RISK-ON ]  (10) BRS, ECH, GTN, KGH, KTY, LTX, MCI, PKN, SNK, STF
2003-12-31 → 2004-01-30  [RISK-ON ]  (10) BRS, ECH, GTN, KGH, KTY, LTX, OPL, PKN, SNK, STF
2004-01-30 → 2004-02-27  [RISK-ON ]  (10) BDX, BRS, ECH, KGH, LES, LTX, OPL, PKN, SNK, STF
2004-02-27 → 2004-03-31  [RISK-ON ]  (10) APT, BDX, CDR, KGH, LES, LTX, MCI, PKN, PXM, STF
2004-03-31 → 2004-04-30  [RISK-ON ]  (10) AMC, BDX, KGH, LES, LTX, PEO, PKN, SNK, STF, STX
2004-04-30 → 2004-05-31  [RISK-ON ]  (10) BDX, ECH, LBW, LES, LTX, SNK, SPL, STF, STP, VRG
2004-05-31 → 2004-06-30  [RISK-ON ]  (10) ECH, GOB, KTY, LBW, LTX, MNC, SGN, SNK, STF, VRG
2004-06-30 → 2004-07-30  [RISK-ON ]  (10) ECH, KTY, LBW, LES, MCI, PKN, RPC, SGN, SNK, STF
2004-07-30 → 2004-08-31  [RISK-ON ]  (10) BRS, ECH, GOB, LBW, LES, PKN, RPC, SGN, SNK, STF
2004-08-31 → 2004-09-30  [RISK-ON ]  (10) BRS, ECH, LBW, LES, LTX, PKN, PXM, SGN, SNK, STF
2004-09-30 → 2004-10-29  [RISK-ON ]  (10) BRS, ECH, GOB, KGH, LBW, LTX, PKN, PXM, RPC, STF
2004-10-29 → 2004-11-30  [RISK-ON ]  (10) BRS, ECH, LPP, OPL, PEO, PKN, PXM, RPC, STF, VRG
2004-11-30 → 2004-12-31  [RISK-OFF]  CASH
2004-12-31 → 2005-01-31  [RISK-ON ]  (10) ACP, AGO, BRS, GOB, GTN, MIL, OPL, PEO, PKN, SPL
2005-01-31 → 2005-02-28  [RISK-OFF]  CASH
2005-02-28 → 2005-03-31  [RISK-OFF]  CASH
2005-03-31 → 2005-04-29  [RISK-OFF]  CASH
2005-04-29 → 2005-05-31  [RISK-OFF]  CASH
2005-05-31 → 2005-06-30  [RISK-OFF]  CASH
2005-06-30 → 2005-07-29  [RISK-OFF]  CASH
2005-07-29 → 2005-08-31  [RISK-ON ]  (10) AGO, ECH, GTC, GTN, KGH, OPL, PEO, PKN, RPC, SPL
2005-08-31 → 2005-09-30  [RISK-ON ]  (10) ACP, ECH, GTN, ING, KGH, MBK, MIL, PEO, PKN, PXM
2005-09-30 → 2005-10-31  [RISK-ON ]  (10) ECH, GTC, GTN, ING, KGH, LBW, MBK, MIL, PKN, SPL
2005-10-31 → 2005-11-30  [RISK-ON ]  (10) ACP, BCM, ECH, GTC, GTN, ING, KGH, LBW, MIL, PXM
2005-11-30 → 2005-12-30  [RISK-ON ]  (10) ACP, BCM, ECH, GTN, ING, KGH, LBW, MBK, PXM, SPL
2005-12-30 → 2006-01-31  [RISK-ON ]  (10) ACP, APT, ECH, GTC, ING, KGH, MBK, MIL, PBG, PXM
2006-01-31 → 2006-02-28  [RISK-ON ]  (10) APT, BHW, ECH, GTN, ING, LBW, MSW, PBG, PRT, SPL
2006-02-28 → 2006-03-31  [RISK-ON ]  (10) APT, ECH, GOB, GTN, ING, PBG, PEO, PKO, RPC, SNK
2006-03-31 → 2006-04-28  [RISK-ON ]  (10) APT, ATG, GTN, KGH, LBW, MIL, PBG, PRM, PXM, STP
2006-04-28 → 2006-05-31  [RISK-ON ]  (10) APT, BDX, GTN, ING, KGN, LTX, MCI, ONO, PJP, STP
2006-05-31 → 2006-06-30  [RISK-ON ]  (10) APT, INK, KGN, MSW, PPS, PRT, PXM, SNK, STP, TRI
2006-06-30 → 2006-07-31  [RISK-ON ]  (10) BHW, ING, MSW, PBG, PEO, PKO, PXM, SNK, SPL, STF
2006-07-31 → 2006-08-31  [RISK-ON ]  (10) EAT, ECH, MBK, MSW, PBG, PKO, PXM, SNK, SPL, STF
2006-08-31 → 2006-09-29  [RISK-ON ]  (10) APT, ATG, EUR, IDM, PBG, PJP, PXM, SNK, STF, STP
2006-09-29 → 2006-10-31  [RISK-ON ]  (10) APT, ATG, BDX, EAT, ING, MBK, MSW, PBG, PXM, RPC
2006-10-31 → 2006-11-30  [RISK-ON ]  (10) APL, BHW, ECH, ERG, ING, KTY, MBK, MSW, PBG, STP
2006-11-30 → 2006-12-29  [RISK-ON ]  (10) EAT, ECH, GOB, GTC, GTN, INK, MSW, PBG, PEP, PJP
2006-12-29 → 2007-01-31  [RISK-ON ]  (10) BHW, GTN, KTY, MCI, MIL, MSW, OPL, PJP, TRI, VRG
2007-01-31 → 2007-02-28  [RISK-ON ]  (10) ECH, ERG, GTN, ING, MSZ, NVT, PBG, PKO, PXM, SPL
2007-02-28 → 2007-03-30  [RISK-ON ]  (10) ATG, INK, MSW, NVT, PBG, PXM, RWL, STP, STX, VRG
2007-03-30 → 2007-04-30  [RISK-ON ]  (10) ACP, CPA, ENP, ERG, MBK, RMK, SPL, STF, VRG, WIK
2007-04-30 → 2007-05-31  [RISK-ON ]  (10) ACP, INK, LPP, MBK, MCI, PBG, SNK, SPL, STP, ZAP
2007-05-31 → 2007-06-29  [RISK-ON ]  (10) ENP, GTN, HDR, MOL, PCE, PEP, PRT, RPC, STP, ZAP
2007-06-29 → 2007-07-31  [RISK-ON ]  (10) CAR, GTN, IDM, KTY, LPP, MBK, MCI, PBF, PEP, VRG
2007-07-31 → 2007-08-31  [RISK-ON ]  (10) CAR, KGH, MBK, MIL, MOL, PBF, PCE, PEP, PKO, VRG
2007-08-31 → 2007-09-28  [RISK-OFF]  CASH
2007-09-28 → 2007-10-31  [RISK-OFF]  CASH
2007-10-31 → 2007-11-30  [RISK-OFF]  CASH
2007-11-30 → 2007-12-31  [RISK-OFF]  CASH
2007-12-31 → 2008-01-31  [RISK-OFF]  CASH
2008-01-31 → 2008-02-29  [RISK-OFF]  CASH
2008-02-29 → 2008-03-31  [RISK-OFF]  CASH
2008-03-31 → 2008-04-30  [RISK-OFF]  CASH
2008-04-30 → 2008-05-30  [RISK-OFF]  CASH
2008-05-30 → 2008-06-30  [RISK-OFF]  CASH
2008-06-30 → 2008-07-31  [RISK-OFF]  CASH
2008-07-31 → 2008-08-29  [RISK-OFF]  CASH
2008-08-29 → 2008-09-30  [RISK-OFF]  CASH
2008-09-30 → 2008-10-31  [RISK-OFF]  CASH
2008-10-31 → 2008-11-28  [RISK-OFF]  CASH
2008-11-28 → 2008-12-31  [RISK-OFF]  CASH
2008-12-31 → 2009-01-30  [RISK-OFF]  CASH
2009-01-30 → 2009-02-27  [RISK-OFF]  CASH
2009-02-27 → 2009-03-31  [RISK-OFF]  CASH
2009-03-31 → 2009-04-30  [RISK-OFF]  CASH
2009-04-30 → 2009-05-29  [RISK-ON ]  (10) ACP, ATS, BDX, BHW, CEZ, EUR, KGH, LBW, LTX, PEP
2009-05-29 → 2009-06-30  [RISK-ON ]  (10) ACP, BDX, CEZ, COG, CPS, DOM, EUR, KER, KGH, LTX
2009-06-30 → 2009-07-31  [RISK-ON ]  (10) BDX, CEZ, COG, CPS, DOM, EUR, KER, KGH, LTX, PBG
2009-07-31 → 2009-08-31  [RISK-ON ]  (10) ATT, CDR, CEZ, CPS, KER, KGH, LBW, LTX, MSW, MSZ
2009-08-31 → 2009-09-30  [RISK-ON ]  (10) BRS, CAR, CEZ, DOM, ECH, EUR, GTN, LPP, MSW, PEP
2009-09-30 → 2009-10-30  [RISK-ON ]  (10) BDX, BHW, CEZ, DOM, GTN, ING, KTY, MSW, PLZ, UCG
2009-10-30 → 2009-11-30  [RISK-ON ]  (10) BHW, CEZ, GTN, ING, KER, KGH, LES, MBK, PKO, PLZ
2009-11-30 → 2009-12-31  [RISK-ON ]  (10) AMB, AMC, BHW, CEZ, ING, KGH, KTY, LES, PEO, PKO
2009-12-31 → 2010-01-29  [RISK-ON ]  (10) AMC, CEZ, GTN, ING, KER, KGH, KTY, PKN, PKO, SPL
2010-01-29 → 2010-02-26  [RISK-ON ]  (10) AMC, AST, BHW, CEZ, EUR, GTN, KER, MIL, PKO, PXM
2010-02-26 → 2010-03-31  [RISK-ON ]  (10) AGO, AMC, BHW, CEZ, GTN, KER, LPP, PEP, PXM, VRG
2010-03-31 → 2010-04-30  [RISK-ON ]  (10) AGO, AMC, APT, BDX, CEZ, GTN, INK, KGN, PXM, SPL
2010-04-30 → 2010-05-31  [RISK-ON ]  (10) AGO, EUR, GTN, ING, KER, KGN, MIL, PKN, PKO, SPL
2010-05-31 → 2010-06-30  [RISK-ON ]  (10) AGO, BDX, GTN, ING, KER, MCI, MIL, PKN, PKO, SPL
2010-06-30 → 2010-07-30  [RISK-ON ]  (10) BDX, BRS, CEZ, EUR, ING, KER, LTX, MIL, PBF, SPL
2010-07-30 → 2010-08-31  [RISK-ON ]  (10) AMB, BDX, BRS, CEZ, EUR, GTN, KER, MCI, PBF, PKN
2010-08-31 → 2010-09-30  [RISK-ON ]  (10) AMC, ATT, BHW, BRS, CDR, CEZ, CIG, ING, KER, OPL
2010-09-30 → 2010-10-29  [RISK-ON ]  (10) AMC, BHW, CEZ, ECH, EUR, GOB, GTN, ING, KGH, OPL
2010-10-29 → 2010-11-30  [RISK-ON ]  (10) ATT, BHW, BRS, CEZ, ENA, GTN, IDM, ING, MCI, MIL
2010-11-30 → 2010-12-31  [RISK-ON ]  (10) ATT, CPS, ENA, EUR, GTN, KER, LBW, MCI, OPN, PCE
2010-12-31 → 2011-01-31  [RISK-ON ]  (10) ABE, AST, ATT, GOB, GTN, KER, KGH, MCI, PCE, ZAP
2011-01-31 → 2011-02-28  [RISK-ON ]  (10) BHW, CDR, CEZ, GTN, KER, MBK, PKN, SGN, SPL, ZAP
2011-02-28 → 2011-03-31  [RISK-ON ]  (10) CEZ, CIG, CRM, GTN, KER, LBW, LWB, MRB, SPL, ZAP
2011-03-31 → 2011-04-29  [RISK-OFF]  CASH
2011-04-29 → 2011-05-31  [RISK-OFF]  CASH
2011-05-31 → 2011-06-30  [RISK-OFF]  CASH
2011-06-30 → 2011-07-29  [RISK-OFF]  CASH
2011-07-29 → 2011-08-31  [RISK-OFF]  CASH
2011-08-31 → 2011-09-30  [RISK-OFF]  CASH
2011-09-30 → 2011-10-31  [RISK-OFF]  CASH
2011-10-31 → 2011-11-30  [RISK-OFF]  CASH
2011-11-30 → 2011-12-30  [RISK-OFF]  CASH
2011-12-30 → 2012-01-31  [RISK-OFF]  CASH
2012-01-31 → 2012-02-29  [RISK-OFF]  CASH
2012-02-29 → 2012-03-30  [RISK-OFF]  CASH
2012-03-30 → 2012-04-30  [RISK-OFF]  CASH
2012-04-30 → 2012-05-31  [RISK-OFF]  CASH
2012-05-31 → 2012-06-29  [RISK-OFF]  CASH
2012-06-29 → 2012-07-31  [RISK-OFF]  CASH
2012-07-31 → 2012-08-31  [RISK-OFF]  CASH
2012-08-31 → 2012-09-28  [RISK-OFF]  CASH
2012-09-28 → 2012-10-31  [RISK-OFF]  CASH
2012-10-31 → 2012-11-30  [RISK-OFF]  CASH
2012-11-30 → 2012-12-31  [RISK-OFF]  CASH
2012-12-31 → 2013-01-31  [RISK-ON ]  (10) ATT, EAT, GEA, GTN, ING, KGH, MCI, PCE, PZU, ZAP
2013-01-31 → 2013-02-28  [RISK-ON ]  (10) ATT, CDR, CRM, EUR, GPW, KGH, LPP, MCI, MOL, PCE
2013-02-28 → 2013-03-29  [RISK-ON ]  (10) AMC, ATT, BDX, CDR, GTN, MBK, MOL, PCE, PKN, VRG
2013-03-29 → 2013-04-30  [RISK-ON ]  (10) AMC, ATT, BDX, EUR, GEA, ING, LPP, MBK, NEU, PCE
2013-04-30 → 2013-05-31  [RISK-ON ]  (10) AMC, CDR, EUR, KRU, LPP, MBK, MON, NEU, PCE, PZU
2013-05-31 → 2013-06-28  [RISK-ON ]  (10) BDX, CDR, EUR, GEA, ING, MBK, MCI, PCE, PZU, SPL
2013-06-28 → 2013-07-31  [RISK-ON ]  (10) ACT, AMC, BBD, BDX, CDR, CEZ, GEA, LES, MBK, NEU
2013-07-31 → 2013-08-30  [RISK-ON ]  (10) BDX, CDR, DVL, GTN, MBK, MCI, MIL, PEO, SPL, WWL
2013-08-30 → 2013-09-30  [RISK-ON ]  (10) ACT, AMC, CDR, EEX, GTN, KOM, MCI, MON, NEU, VRG
2013-09-30 → 2013-10-31  [RISK-ON ]  (10) ACT, ASB, ATG, CDR, GTN, KTY, LBW, NEU, OPN, VRG
2013-10-31 → 2013-11-29  [RISK-ON ]  (10) ASB, CAR, CDR, LES, LTX, MSZ, NEU, RBW, TRK, VRG
2013-11-29 → 2013-12-31  [RISK-ON ]  (10) AMC, APT, CAR, ENA, FTE, GTN, LES, MSZ, NEU, PGM
2013-12-31 → 2014-01-31  [RISK-ON ]  (10) ABE, BDX, CDR, FTE, KTY, LES, LPP, MSZ, NEU, STX
2014-01-31 → 2014-02-28  [RISK-ON ]  (10) APT, BDX, CAR, CDR, FTE, ING, MIL, OPL, PKO, SPL
2014-02-28 → 2014-03-31  [RISK-ON ]  (10) CAR, FTE, LPP, LTX, MON, MSZ, PKO, RBW, SPL, STX
2014-03-31 → 2014-04-30  [RISK-ON ]  (10) BDX, ENA, ING, LTX, MON, PHN, RBW, SPL, STX, UCG
2014-04-30 → 2014-05-30  [RISK-OFF]  CASH
2014-05-30 → 2014-06-30  [RISK-OFF]  CASH
2014-06-30 → 2014-07-31  [RISK-OFF]  CASH
2014-07-31 → 2014-08-29  [RISK-OFF]  CASH
2014-08-29 → 2014-09-30  [RISK-OFF]  CASH
2014-09-30 → 2014-10-31  [RISK-ON ]  (10) BDX, BHW, CEZ, CPS, ING, KRU, MON, MSZ, PEO, TPE
2014-10-31 → 2014-11-28  [RISK-OFF]  CASH
2014-11-28 → 2014-12-31  [RISK-ON ]  (10) ACP, ATC, CDR, CEZ, ENA, GPW, ING, KRU, KTY, PKN
2014-12-31 → 2015-01-30  [RISK-OFF]  CASH
2015-01-30 → 2015-02-27  [RISK-ON ]  (10) 11B, ACP, BDX, GPW, KRU, MON, PKN, PKP, PZU, VRG
2015-02-27 → 2015-03-31  [RISK-ON ]  (10) BDX, FTE, GPW, KRU, KTY, MCI, MON, NEU, RBW, VRG
2015-03-31 → 2015-04-30  [RISK-ON ]  (10) ACP, AMC, CAR, CDR, EAT, KRU, MAB, MSW, PKN, RBW
2015-04-30 → 2015-05-29  [RISK-ON ]  (10) ACP, AMC, BDX, CAR, EAT, GPW, KTY, MOL, PKN, RBW
2015-05-29 → 2015-06-30  [RISK-ON ]  (10) ACP, AMC, BFT, BIO, EAT, FTE, KER, KTY, NEU, PKP
2015-06-30 → 2015-07-31  [RISK-OFF]  CASH
2015-07-31 → 2015-08-31  [RISK-OFF]  CASH
2015-08-31 → 2015-09-30  [RISK-OFF]  CASH
2015-09-30 → 2015-10-30  [RISK-OFF]  CASH
2015-10-30 → 2015-11-30  [RISK-OFF]  CASH
2015-11-30 → 2015-12-31  [RISK-OFF]  CASH
2015-12-31 → 2016-01-29  [RISK-OFF]  CASH
2016-01-29 → 2016-02-29  [RISK-OFF]  CASH
2016-02-29 → 2016-03-31  [RISK-OFF]  CASH
2016-03-31 → 2016-04-29  [RISK-OFF]  CASH
2016-04-29 → 2016-05-31  [RISK-OFF]  CASH
2016-05-31 → 2016-06-30  [RISK-OFF]  CASH
2016-06-30 → 2016-07-29  [RISK-ON ]  (10) ATC, CDR, CIG, EAT, ECH, FTE, KRU, MAB, NEU, VRG
2016-07-29 → 2016-08-31  [RISK-ON ]  (10) CDR, CIG, EAT, ING, JSW, KER, KRU, KTY, NEU, TXT
2016-08-31 → 2016-09-30  [RISK-ON ]  (10) AGT, BRS, CDR, CIG, EAT, FTE, ING, JSW, KTY, SPL
2016-09-30 → 2016-10-31  [RISK-ON ]  (10) 11B, AMC, BFT, BRS, CIG, FTE, GEA, NEU, OPN, WLT
2016-10-31 → 2016-11-30  [RISK-ON ]  (10) ASB, BLO, BRS, ECH, JSW, KER, LBW, OPN, PKN, SNK
2016-11-30 → 2016-12-30  [RISK-ON ]  (10) 11B, ASB, BRS, EAT, ECH, FTE, KER, OPN, STP, TRK
2016-12-30 → 2017-01-31  [RISK-ON ]  (10) 11B, AGO, BRS, EAT, GPW, ING, MDG, PKO, STP, TRK
2017-01-31 → 2017-02-28  [RISK-ON ]  (10) GTN, ING, KER, KTY, NEU, OPN, STP, TOR, WLT, WWL
2017-02-28 → 2017-03-31  [RISK-ON ]  (10) 11B, AGO, BRS, FTE, ING, LWB, PKP, PXM, WLT, ZEP
2017-03-31 → 2017-04-28  [RISK-ON ]  (10) 11B, BFT, CDR, EAT, GEA, LPP, LTX, PCR, PKP, TPE
2017-04-28 → 2017-05-31  [RISK-ON ]  (10) ALR, BDX, BFT, EAT, KRU, LPP, MBK, PCR, PZU, WLT
2017-05-31 → 2017-06-30  [RISK-ON ]  (10) BFT, CAR, CDR, GEA, GTC, KTY, PKO, SNK, TXT, WLT
2017-06-30 → 2017-07-31  [RISK-ON ]  (10) CDR, DOM, ENA, GEA, GPW, GTC, KTY, LPP, MIL, TXT
2017-07-31 → 2017-08-31  [RISK-ON ]  (10) CDR, ENA, ENG, GEA, ING, KRU, MIL, PGE, SPL, TPE
2017-08-31 → 2017-09-29  [RISK-ON ]  (10) 11B, GPW, GTC, GTN, ING, JSW, LPP, OPL, PKN, PZU
2017-09-29 → 2017-10-31  [RISK-ON ]  (10) ATT, CDR, DVL, EAT, ENG, GEA, ING, KTY, PKN, PZU
2017-10-31 → 2017-11-30  [RISK-ON ]  (10) ALR, CDR, DVL, ING, LPP, MBK, MIL, PKN, PKO, PZU
2017-11-30 → 2017-12-29  [RISK-ON ]  (10) ALR, BFT, EAT, GTN, ING, MBK, MIL, PKO, PZU, RBW
2017-12-29 → 2018-01-31  [RISK-ON ]  (10) ALR, BFT, BHW, EAT, KTY, LPP, MIL, PCR, PKO, SPL
2018-01-31 → 2018-02-28  [RISK-ON ]  (10) 11B, ASB, BHW, DVL, GEA, ING, MIL, NWG, STX, VRG
2018-02-28 → 2018-03-30  [RISK-ON ]  (10) 11B, ALR, ASB, BFT, BHW, EAT, GEA, MON, STX, WWL
2018-03-30 → 2018-04-30  [RISK-OFF]  CASH
2018-04-30 → 2018-05-31  [RISK-OFF]  CASH
2018-05-31 → 2018-06-29  [RISK-OFF]  CASH
2018-06-29 → 2018-07-31  [RISK-OFF]  CASH
2018-07-31 → 2018-08-31  [RISK-OFF]  CASH
2018-08-31 → 2018-09-28  [RISK-OFF]  CASH
2018-09-28 → 2018-10-31  [RISK-OFF]  CASH
2018-10-31 → 2018-11-30  [RISK-OFF]  CASH
2018-11-30 → 2018-12-31  [RISK-OFF]  CASH
2018-12-31 → 2019-01-31  [RISK-OFF]  CASH
2019-01-31 → 2019-02-28  [RISK-OFF]  CASH
2019-02-28 → 2019-03-29  [RISK-OFF]  CASH
2019-03-29 → 2019-04-30  [RISK-OFF]  CASH
2019-04-30 → 2019-05-31  [RISK-OFF]  CASH
2019-05-31 → 2019-06-28  [RISK-OFF]  CASH
2019-06-28 → 2019-07-31  [RISK-OFF]  CASH
2019-07-31 → 2019-08-30  [RISK-OFF]  CASH
2019-08-30 → 2019-09-30  [RISK-OFF]  CASH
2019-09-30 → 2019-10-31  [RISK-OFF]  CASH
2019-10-31 → 2019-11-29  [RISK-OFF]  CASH
2019-11-29 → 2019-12-31  [RISK-OFF]  CASH
2019-12-31 → 2020-01-31  [RISK-OFF]  CASH
2020-01-31 → 2020-02-28  [RISK-OFF]  CASH
2020-02-28 → 2020-03-31  [RISK-OFF]  CASH
2020-03-31 → 2020-04-30  [RISK-OFF]  CASH
2020-04-30 → 2020-05-29  [RISK-OFF]  CASH
2020-05-29 → 2020-06-30  [RISK-OFF]  CASH
2020-06-30 → 2020-07-31  [RISK-ON ]  (10) ALG, BLO, CLC, CRJ, JRH, MOV, MRB, MRC, OML, UNT
2020-07-31 → 2020-08-31  [RISK-ON ]  (10) AMC, ASB, BDX, CDR, CLC, GPW, KGH, NEU, SVE, TXT
2020-08-31 → 2020-09-30  [RISK-ON ]  (10) AMC, ASB, AWM, DOM, KGH, KTY, MOV, MRB, PEP, TEN
2020-09-30 → 2020-10-30  [RISK-ON ]  (10) BDX, GPW, KTY, MOL, MRB, MRC, OML, PLW, SNW, TEN
2020-10-30 → 2020-11-30  [RISK-ON ]  (10) AMC, ASB, BDX, BMX, ENG, NEU, PLW, SNW, TEN, TXT
2020-11-30 → 2020-12-30  [RISK-ON ]  (10) ASB, BDX, KER, KGH, KTY, MRB, NEU, SLV, STX, WPL
2020-12-30 → 2021-01-29  [RISK-ON ]  (10) ASB, ATC, BDX, KER, MRB, PLW, PXM, STP, STX, WPL
2021-01-29 → 2021-02-26  [RISK-ON ]  (10) ASB, AST, CAR, DOM, KRU, KSG, MRB, NEU, STX, TXT
2021-02-26 → 2021-03-31  [RISK-ON ]  (10) ASB, AST, BDX, COG, DVL, PEP, PKP, SLV, WLT, WPL
2021-03-31 → 2021-04-30  [RISK-ON ]  (10) ABE, ACT, ASB, CPR, KTY, PKO, SKH, TOA, VOT, WPL
2021-04-30 → 2021-05-31  [RISK-ON ]  (10) ABE, ASB, ATT, BBT, DOM, DVL, ENA, ERB, MBR, STS
2021-05-31 → 2021-06-30  [RISK-ON ]  (10) DVL, GTN, ING, KRU, KTY, MRB, PEO, PKP, TOR, VRG
2021-06-30 → 2021-07-30  [RISK-ON ]  (10) ACP, ERB, GTN, LPP, LWB, OPN, PCR, SLV, TXT, WPL
2021-07-30 → 2021-08-31  [RISK-ON ]  (10) ACP, ALR, APR, ATC, COG, CPS, KTY, LPP, OPL, STX
2021-08-31 → 2021-09-30  [RISK-ON ]  (10) ACP, ING, KRU, MBK, MIL, PCR, PEO, PKO, PZU, SPL
2021-09-30 → 2021-10-29  [RISK-ON ]  (10) ACT, BMC, BNP, CAR, ING, JSW, LWB, MBK, PKN, WLT
2021-10-29 → 2021-11-30  [RISK-ON ]  (10) ALR, ATC, BHW, BOS, ING, MBK, MIL, PEO, PKO, STX
2021-11-30 → 2021-12-30  [RISK-ON ]  (10) APR, BHW, CAR, EAH, ING, MBR, OPL, SLV, SPL, WPL
2021-12-30 → 2022-01-31  [RISK-ON ]  (10) APR, BHW, CAR, GRN, ING, LPP, MBR, OPL, SLV, ZRE
2022-01-31 → 2022-02-28  [RISK-OFF]  CASH
2022-02-28 → 2022-03-31  [RISK-OFF]  CASH
2022-03-31 → 2022-04-29  [RISK-OFF]  CASH
2022-04-29 → 2022-05-31  [RISK-OFF]  CASH
2022-05-31 → 2022-06-30  [RISK-OFF]  CASH
2022-06-30 → 2022-07-29  [RISK-OFF]  CASH
2022-07-29 → 2022-08-31  [RISK-OFF]  CASH
2022-08-31 → 2022-09-30  [RISK-OFF]  CASH
2022-09-30 → 2022-10-31  [RISK-OFF]  CASH
2022-10-31 → 2022-11-30  [RISK-OFF]  CASH
2022-11-30 → 2022-12-30  [RISK-OFF]  CASH
2022-12-30 → 2023-01-31  [RISK-OFF]  CASH
2023-01-31 → 2023-02-28  [RISK-OFF]  CASH
2023-02-28 → 2023-03-31  [RISK-OFF]  CASH
2023-03-31 → 2023-04-28  [RISK-OFF]  CASH
2023-04-28 → 2023-05-31  [RISK-OFF]  CASH
2023-05-31 → 2023-06-30  [RISK-ON ]  (10) ACT, BDX, BHW, BRS, ELT, ENT, GPW, OTS, SPL, UNT
2023-06-30 → 2023-07-31  [RISK-ON ]  (10) ABE, ALR, APR, DVL, ELT, ING, KRU, MSZ, PKO, VRC
2023-07-31 → 2023-08-31  [RISK-ON ]  (10) ALR, CAR, DVL, EAT, MBK, MDG, MOL, PEO, PKO, TPE
2023-08-31 → 2023-09-29  [RISK-ON ]  (10) ABE, ALR, BHW, DOM, DVL, ENI, GPP, LPP, MOL, PZU
2023-09-29 → 2023-10-31  [RISK-ON ]  (10) 1AT, APR, BFT, GPW, KRU, KTY, OPL, PLW, PZU, RVU
2023-10-31 → 2023-11-30  [RISK-ON ]  (10) ALR, ING, KTY, MBK, MOL, OPL, PEO, PKO, PZU, SPL
2023-11-30 → 2023-12-29  [RISK-OFF]  CASH
2023-12-29 → 2024-01-31  [RISK-ON ]  (10) BDX, BNP, ENT, GPW, MOL, OND, PEO, SPL, UNT, VRC
2024-01-31 → 2024-02-29  [RISK-ON ]  (10) BDX, BHW, BLO, ELT, ENA, MOL, OPL, PEO, PKO, TOR
2024-02-29 → 2024-03-28  [RISK-ON ]  (10) ACT, ALR, BDX, BOS, ING, MBK, PEO, RBW, SNT, VOX
2024-03-28 → 2024-04-30  [RISK-ON ]  (10) ABE, ALR, BFT, DVL, ING, KTY, PEO, PKO, SPL, VRC
2024-04-30 → 2024-05-31  [RISK-ON ]  (10) ALR, ART, DVL, GPW, ING, KTY, MVP, PEO, PKO, RBW
2024-05-31 → 2024-06-28  [RISK-ON ]  (10) ALR, ATC, BDX, BFT, CMP, DIG, ELT, KTY, PKO, VOX
2024-06-28 → 2024-07-31  [RISK-ON ]  (10) ALR, ATC, GPW, KTY, MRB, PKO, RBW, RNK, SPL, TOR
2024-07-31 → 2024-08-30  [RISK-ON ]  (10) CDR, ING, MRB, NNG, PKO, PKP, RNK, SNT, TOR, VOX
2024-08-30 → 2024-09-30  [RISK-ON ]  (10) ALR, CDR, CLC, CLN, CPS, ENG, OPL, SHO, SNT, VOX
2024-09-30 → 2024-10-31  [RISK-ON ]  (10) DVL, ELT, ENA, ENG, KTY, NNG, SHO, SNT, TOR, VOX
2024-10-31 → 2024-11-29  [RISK-ON ]  (10) ACP, DOM, DVL, ELT, ENA, ENG, PKO, RBW, SNT, VOX
2024-11-29 → 2024-12-30  [RISK-ON ]  (10) ACP, AST, CMP, CPS, DVL, ELT, ENA, MBR, RBW, VOX
2024-12-30 → 2025-01-31  [RISK-ON ]  (10) ACP, AST, BFT, DIG, ENA, ENG, MSZ, RBW, SNT, VOX
2025-01-31 → 2025-02-28  [RISK-ON ]  (10) ACP, CPS, DOM, ENA, LBW, MBR, PKO, TPE, UNT, VOX
2025-02-28 → 2025-03-31  [RISK-ON ]  (10) ACP, BCX, BHW, BLO, CLE, KSG, LBW, LPP, NWG, ZRE
2025-03-31 → 2025-04-30  [RISK-ON ]  (10) ABE, ACP, ALR, BNP, ELT, ENA, LBW, MIL, STX, TPE
2025-04-30 → 2025-05-30  [RISK-ON ]  (10) BCX, BFT, BLO, CDR, CPS, DOM, DVL, OPL, PXM, TPE
2025-05-30 → 2025-06-30  [RISK-ON ]  (10) ACP, BHW, DIG, EUC, GPP, PEO, PKN, PLW, SHO, ZEP
2025-06-30 → 2025-07-31  [RISK-ON ]  (10) ACP, BHW, CDR, DIG, ENA, ING, PEO, PGE, PZU, TPE
2025-07-31 → 2025-08-29  [RISK-ON ]  (10) CRJ, DIG, ING, MBK, PAS, PCO, PEO, PKO, SGN, VRC
2025-08-29 → 2025-09-30  [RISK-ON ]  (10) BMC, DAD, DIG, GPW, HUG, KRU, KTY, MDG, TPE, VRG
2025-09-30 → 2025-10-31  [RISK-ON ]  (10) APT, CRI, DAD, HUG, KTY, NWG, PCO, SNT, TOR, VOT
2025-10-31 → 2025-11-28  [RISK-ON ]  (10) ASB, ENG, GPW, HUG, NWG, PKN, SNT, TOA, TOR, TRK
2025-11-28 → 2025-12-30  [RISK-ON ]  (10) BFT, ENG, GPW, HUG, KGH, KTY, NWG, OPL, SNT, TOR
2025-12-30 → 2026-01-30  [RISK-ON ]  (10) GPW, ICE, KGH, KRU, MBK, OPL, PCO, PKO, PXM, SNT
2026-01-30 → 2026-02-27  [RISK-ON ]  (10) BHW, CAR, DAD, GPW, ICE, ING, JSW, PKN, TEN, TPE
2026-02-27 → 2026-03-31  [RISK-ON ]  (10) ABE, ASB, BDX, CRI, ENA, GPW, OPL, PKN, TOR, TPE
2026-03-31 → 2026-04-10  [RISK-ON ]  (10) ASB, CAP, CRI, ENA, LPP, LWB, MOL, OPL, PKN, TRN

Jeśli przyda Ci się powyższe — daj znać w komentarzu lub wiadomości prywatnej. I powodzenia!


To jest wpis #16. Podoba Ci się to co przeczytałeś? Albo jeszcze lepiej – nie podoba się! I chcesz o tym napisać, z czymś się nie zgodzić, zaprotestować? Pisz śmiało w komentarzach.

5 2 głosy
Ocena artykułu
Subskrybuj
Powiadom o
guest
0 Komentarze
Najstarsze
Najnowsze Najwięcej głosów
Opinie w linii
Zobacz wszystkie komentarze
0
Chętnie poznam Twoje przemyślenia, skomentuj.x