Rozdział 11
Zawieranie transakcji zgodnie z Trybem Cyklu
W tym rozdziale przedstawimy całkowicie automatyczny system transakcyjny Maximum Entropy Spectral Analysis (MESA), oparty na zasadach przedstawionych w poprzednich rozdziałach. Naszym sposobem podejścia do tego zagadnienia jest ustalenie okresów dla Trybu Trendu i Trybu Cyklu oraz zawieranie transakcji zgodnie z Trybem Cyklu, stosując tylko Sinewave Indicator. Kupujemy i sprzedajemy na podstawie przecięcia się tych dwóch linii, z których składa się ten wskaźnik. System transakcyjny stosujący Tryb Trendu i Tryb Cyklu łącznie, można rozwinąć i ulepszyć. Zamiarem tego rozdziału jest przedstawienie niektórych technik ulepszających teoretyczne sygnały Trybu Cyklu w czysto mechanicznym systemie transakcyjnym zgodnie z którym, przeprowadzane są transakcje na rzeczywistych rynkach.
Program przedstawiony na Rysunku 11.1 jest kompletnym systemem transakcyjnym stosującym zasady, ściśle oparte na podstawach teoretycznych. Jest on absolutnie nie do zastosowania w rzeczywistych sytuacjach transakcyjnych lub dla poszczególnych indywidualnych papierów wartościowych.
inputs: Price(Close), Window(1), RegCode(„LPJDPDTBHB”);
vars: dc(0), SmoothPrice(0), DCPeriod(0), count(0), RealPart(0), ImagPart(0), DCPhase(0), DCSine(0), LeadSine(0), ITrend(0), IntPeriod(0), Trendline(0), Trend(0), DaysInTrend(0);
DefineDllFunc: „c:\mesadll\mesa2kd.dll”,int,”INIT”,int;
|
Rysunek 11.1 Teoretyczny system transakcyjny Trybu Cyklu.
DefineDllFunc: „c:\mesadll\mesa2kd.dll”,int,”DomCycle”, Int,float,float,float,lpfloat; DefineDllFunc: „c:\mesadll\mesa2kd.dll”,int, ”MATRIX”,lpstr;
if currentbar = 1 then begin init(1); Matrix(regcode); end;
DomCycle(Window,Price,H,L,&dc);
{Compute Dominant Cycle Phase} SmoothPrice = (4*Price + 3*Price[1] + 2*Price[2] + Price[3]) / 10; DCPeriod = IntPortion(dc + .5); RealPart = 0; ImagPart = 0; For count = 0 To DCPeriod - 1 begin RealPart = RealPart + Cosine(360*count / DCPeriod)* (SmoothPrice[count]); ImagPart = ImagPart + Sine(360*count / DCPeriod)* (SmoothPrice[count]); End; If AbsValue(RealPart) > 0.001 then DCPhase = Arctangent(ImagPart / RealPart); If AbsValue(RealPart) <= 0.001 then DCPhase = 90*Sign(ImagPart); DCPhase = DCPhase + 90; If RealPart < 0 then DCPhase = DCPhase + 180;
{Compensate for one bar lag of the Weighted Moving Average} If dc <> 0 then DCPhase = DCPhase + 360 / dc;
{Don't let phase exceed 360 degrees in a cycle} If DCPhase > 360 then DCPhase = DCPhase - 360;
{Force phase wrap at 315 degrees to avoid full scale wrap at 0-360 boundary} If DCPhase > 315 then DCPhase = DCPhase - 360;
{Compute the Sine and LeadSine Indicators} DCSine = Sine(DCPhase);
|
Rysunek 11.1 Ciąg dalszy.
LeadSine = Sine(DCPhase + 45);
{Compute Trendline as simple average over the measured Dominant Cycle period} ITrend = 0; IntPeriod = IntPortion(dc + .5); For count = 0 to IntPeriod - 1 begin ITrend = ITrend + Price[count]; End; If IntPeriod > 0 then ITrend = ITrend / IntPeriod; Trendline = (4*ITrend + 3*ITrend[1] + 2*ITrend[2] + ITrend[3]) / 10; If CurrentBar < 12 then Trendline = Price;
{Assume Trend Mode} Trend = 1;
{Measure days in trend from last crossing of the Sinewave Indicator lines} If LeadSine Crosses Over DCSine or LeadSine Crosses Under DCSine then begin DaysInTrend = 0; End; DaysInTrend = DaysInTrend + 1; If DaysInTrend < .5*dc then Trend = 0;
If AbsValue((SmoothPrice - Trendline)/ Trendline) >= .015 then Trend = 1;
If Trend = 0 then begin If LeadSine Crosses Over DCSine then Buy(„LSine”) on Open; If LeadSine Crosses Under DCSine then Sell(„SSine”) on Open; End;
|
Rysunek 11.1 Teoretyczny system transakcyjny Trybu Cyklu.
Program rozpoczyna się od zdefiniowania funkcji MESA Dynamic Linked Library (DLL), inicjowania DLL i następnie obliczania Cyklu Dominującego (dc) za pomocą DLL. Następna część programu mierzy fazę i oblicza Sinewave Indicator dokładnie tak, jak to zrobiliśmy w Rozdziale 8. Następnie obliczana jest gładzona Chwilowa Linia Trendu dokładnie tak, jak w Rozdziale 8. Zakładamy, że rynek ma większą skłonność do przebywania w Trybie Trendu i przyjmujemy Tryb Trendu jako stan domyślny. Następnie przyjmujemy warunek Trybu Cyklu. Tryb Cyklu na pewno istnieje, gdy LeadSine przecina DCSine wskaźnika Sinewave Indicator. Ponadto, Tryb Cyklu istnieje przez połowę Cyklu Dominującego po wystąpieniu tego przypadku. Podążając śladem liczby słupków od czasu wystąpienia przecięcia i porównując ten czas do połowy Cyklu Dominującego, możemy oznaczyć okresy aktywności Trybu Cyklu. Jednakże, bardzo często można zauważyć, że cena mocno odchyla się od Chwilowej Linii Trendu. W takich przypadkach jest wysoce nieprawdopodobne, aby cena gładzona (SmoothPrice) przecięła Chwilową Linię Trendu, tak jak należy spodziewać się tego w Trybie Cyklu. A zatem, ustanawiamy inną arbitralną regułę, że jeśli SmoothPrice jest większa niż 1.5 procent od Chwilowej Linii Trendu, to rynek jest w Trybie Trendu. Nasz system jest prosty. Zawieramy transakcje tylko wtedy, gdy rynek jest w Trybie Cyklu. Kupujemy na otwarciu przy następnym słupku, gdy LeadSine przetnie w górę DCSine. Sprzedajemy na otwarciu przy następnym słupku, gdy LeadSine przetnie w dół DCSine. Przedstawaimy także stop zabezpieczający w przypadku, gdy nasze sygnały Trybu Cyklu są błędne i rynek rozpoczyna Tryb Trendu przeciwko nam. Zajętą pozycję utrzymujemy aż do momentu, gdy padnie sygnał jej odwrócenia lub osiągnięta została wartość ustawionego stopu loss.
Jako przykład, program najpierw zastosowano dla kontraktów futures Treasury Bonds, ponieważ Treasury Bonds poruszją się cyklicznie w pewnych granicach. To jest, inaczej niż kontrakty futures S&P i Nasdaq, Treasury Bonds nie mają odchyleń w postaci długoterminowych trendów. Takiej selekcji dokonano dlatego, ponieważ system zawiera transakcje, tak długie jak i krótkie, z równomierną częstotliwością, dzięki czemu nie ma potrzeby dostosowania się do odchyleń systemu. Utworzono kontynuacyjny kontrakt, począwszy od 9 lipca 1984 r., a skończywszy na 29 września 2000 r., tj. 15.88 lat. (Kontynuacyjny kontrakt utworzono, wiążąc kolejne kontrakty w jedną całość i regulując wszystkie ceny w poprzednich kontraktach za pomocą różnicy ceny w stosunku do dodanego kontraktu. Czynność tę powtarzamy dla każdego nowego poprzedzającego kontraktu). Dodając 1.000$ jako stop zarządzający, otrzymamy wynik przedstawiony w Tabeli 11.1.
Tabela 11.1 Wyniki początkowe systemu transakcyjnego Trybu Cyklu
__________________________________________________________________________________________
Całkowity zysk netto 24,125.00$
Liczba transakcji 262
% zyskownych transakcji 41.2%
Średni zysk na transakcji 92.08$
Współczynnik zysku 1.18
Maksymalne osunięcie kapitału (18,625.00$)
Wynik nie jest szczególnie dobry. Maksymalne osunięcie kapitału jest prawie takie jak zysk netto, współczynnik zysku (stosunek sumy zysków ze wszystkich transakcji do sumy strat ze wszystkich transakcji) jest niski. W tym przypadku większe znaczenie ma prowizja wynosząca 30$ za jedną transakcję, 1 tick poślizgu przy zawieraniu transakcji wynoszący 31.25$ oraz 1 tick poślizgu przy wychodzeniu z rynku. Okaże się wtedy, że nasz średni zysk z jednej transakcji jest w przybliżeniu równy naszym kosztom transakcyjnym. To jest, powinniśmy przestać korzystać z takiej pomocy. Można jednak włożyć wysiłek w ulepszenie rezultatów systemu transakcyjnego.
Pierwszym krokiem w ulepszeniu systemu transakcyjnego jest zrozumienie, że nie uwzględniliśmy naruszenia teorii. Nasze wejścia na rynek zależą od przecinania się linii LeadSine i DCSine. Ich wzajemne przecinanie się zależy od mierzonej fazy. Przypuszczalnie doświadczamy większego opóźnienia niż oznaczyliśmy je teoretycznie. Na przykład, zawieranie transakcji w następnym dniu na otwarciu, po przecięciu się LeadSine i DCSine, jest równoznaczne z tym, że dodajemy jeden dzień opóźnienia. Możemy skompensować to opóźnienie, korygując obliczenie fazy. Konkretyzując, optymalna kompensacja wynosi 3 słupki i taką też kompensację fazy wprowadzamy do programu.
{Kompensacja opóźnienia czasowego}
If dc <> 0 then DCPhase = DCPhase + 3 * 360 / dc;
Taka kompensacja ulepsza rezultaty systemu transakcyjnego, co przedstawia Tabela 11.2. W szczególności, prawie podwaja zysk netto.
Tabela 11.2 Wyniki systemu transakcyjnego Trybu Cyklu po kompensacji fazy
__________________________________________________________________________________________
Całkowity zysk netto 39,625.00$
Liczba transakcji 334
% zyskownych transakcji 44.3%
Średni zysk na transakcji 118.64$
Współczynnik zysku 1.25
Maksymalne osunięcie kapitału (20,406.00$)
Liczba transakcji także zwiększyła się, w wyniku czego średni zysk z transakcji wzrósł tylko nieznacznie. Gdy zbadamy rezultaty bliżej zobaczymy, że transakcje po długiej stronie rynku miały średni zysk 60$, podczas gdy transakcje po krótkiej stronie rynku miały średnią stratę 20.375$. Jasne jest, że następnym krokiem ulepszania rezultatów jest spowodowanie zmniejszenia strat po krótkiej stronie rynku. Zmierzając do końca, wypróbujemy najpierw filtr, który pozwala na zawieranie krótkich transakcji tylko wtedy, gdy nachylenie Chwilowej Linii Trendu jest skierowane do dołu. Program taki przedstawia się następująco:
If LeadSine Crosses Under DCSine and Trend < Trend[1] then Sell(„SSine”) on Open;
Efektem działanie tego filtra jest nie tylko wzrost zysku netto, ale również zmniejszenie liczby transakcji, tak więc średni zysk z transakcji wzrasta, co zasługuje na uwagę, do 245$, tak jak przedstawia to Tabela 11.3.
Tabela 11.3 Wyniki systemu transakcyjnego Trybu Cyklu po zastosowaniu filtra określającego kierunek trendu
__________________________________________________________________________________________
Całkowity zysk netto 47,837.00$
Liczba transakcji 195
% zyskownych transakcji 35.9%
Średni zysk na transakcji 245.83$
Współczynnik zysku 1.40
Maksymalne osunięcie kapitału (23,968.00$)
Praktycznie nie zmienił się zysk netto z transakcji po długiej stronie rynku, natomiast strata netto z transakcji po krótkiej stronie rynku zmniejszyła się do 12.375$. Tak więc nadal mamy problem z wyeliminowaniem straty netto z transakcji po krótkiej stronie rynku.
Zastosujemy odmienną regułę, polegającą na tym, że zajmujemy krótką pozycję, gdy pięciodniowa średnia LeadSine jest mniejsza niż pięciodniowa średnia DCSine. Program uwzględniający tę regułę, przedstawia się następująco:
If LeadSine Crosses Under DCSine and Average(LeadSine,5) < Average(DCSine,5) then Sell(„SSine”) on Open;
Bezpośrednim rezultatem tego filtra jest to, że większość transakcji po krótkiej stronie rynku została wyeliminowana. W rezultacie zysk netto w przybliżeniu podwoił się, tak jak to przedstawiono w Tabeli 11.4.
Tabela 11.4 Wyniki systemu transakcyjnego Trybu Cyklu po zastosowaniu średniej pięciodniowej do LeadSine i DCSine
__________________________________________________________________________________________
Całkowity zysk netto 92,718.75$
Liczba transakcji 100
% zyskownych transakcji 36.0%
Średni zysk na transakcji 927.19$
Współczynnik zysku 2.6
Maksymalne osunięcie kapitału (15,281.25$)
Nie tylko podwoiliśmy zysk netto, ale również zmniejszyliśmy liczbę transakcji prawie o połowę. Tak więc, średni zysk z transakcji wzrósł do 927$. Współczynnik zysku (stosunek sumy wszystkich zysków z transakcji do sumy strat ze wszystkich transakcji) podskoczył do 2.60 - co jest wspaniałym wynikiem, dającym wysokie prawdopodobieństwo osiągnięcia sukcesu. Wszystkie wyniki raportu ulepszyły się, za wyjątkiem procentu zyskownych transakcji.
Od początku ulepszania systemu transakcyjnego nie zmieniliśmy wartości stop loss, wynoszącego 1.000$. Gdy ustawimy stop loss na poziomie 2.200$ zauważymy, że system jest znacznie zyskowniejszy. Przedstawia to tabela 11.5.
Tabela 11.5 Wyniki skończonego ulepszania systemu transakcyjnego Trybu Cyklu
__________________________________________________________________________________________
Całkowity zysk netto 112,093.75$
Liczba transakcji 78
% zyskownych transakcji 55.1%
Średni zysk na transakcji 1436.46$
Współczynnik zysku 2.90
Maksymalne osunięcie kapitału (17,650.00$)
Zwiększenie wartości stop loss umożliwia uniknięcie kilku stratnych transakcji, z powodu zbyt szybkiego zamknięcia pozycji. Powoduje to zmniejszenie liczby transakcji, ale ważniejszą rzeczą jest to, że zwiększył się procent zyskownych transakcji do ponad 50%. Konsekwentny wzrost krzywej kapitału, przedstawionej na Rysunku 11.2 pokazuje, że system wywiązywał się dobrze i był on stabilny przez okres 16 lat.
Rozpoczynając od czysto teoretycznych rozważań i wykonując kilka kroków, doszliśmy do silnego i stabilnego automatycznego systemu transakcyjnego, który konkuruje lub przewyższa większość dostępnych komercyjnych systemów transakcyjnych. Moim zdaniem, jasno to dowodzi wartości projektowania systemów transakcyjnych opartych na modelu teoretycznym.
Rysunek 11.2 Wzrost krzywej kapitału automatycznego systemu transakcyjnego Trybu Cyklu dla Treasury Bond przez okres 15.88 lat.
Zapamiętaj
Stanem domyślnym jest Tryb Trendu.
Stan Trybu Cyklu trwa przez pół Cyklu Dominującego od momentu przecięcia się linii wskaźnika LeadSine i DCSine.
Jako dodatkową regułę przyjmujemy, że stan Trybu Trendu trwa wtedy, gdy SmoothPrice jest większa o 1.5% od Chwilowej Linii Trendu.
Opóźnienie można kompensować, modyfikując mierzony kąt fazowy.
Stratne transakcje można eliminować za pomocą filtra.
Skuteczność transakcji często można podwyższyć otwierając zlecenie stop loss.
Zawieranie transakcji zgodnie z Trybem Cyklu
1
95