Testowanie historyczne portfela

WAŻNE: zalecane jest przeczytanie rozdziału: Testowanie historyczne własnej strategii

Nowy tester historyczny pracuje na POZIOMIE PORTFELA, co oznacza, że wartość środków własnych odnosi się do wartości portfela, która równa jest sumie dostępnej gotówki i wszystkich otwartych pozycji. Także zarządzanie wielkością pozycji prowadzone jest w oparciu o wartość całego portfela.

Nowy tester historyczny pozwala na połączenie sygnałów transakcyjnych ze strategiami zarządzania wielkością pozycji w sposób dokładnie odzwierciedlający zawieranie transakcji w czasie rzeczywistym. Najważniejszą cechą testera jest możliwość dynamicznego zarządzania kapitałem i kontrola ryzyka na poziomie portfela. Oznacza to, że wielkości pozycji mogą być ustalane w oparciu o wiedzę o całym portfelu - czyli dokładnie tak jak w rzeczywistości.

KONFIGURACJA

Do przeprowadzenia testowania historycznego na poziomie portfela niezbędne są dwa podstawowe elementy:

1. Konieczne jest napisanie formuły generującej sygnały otwarcia pozycji (buy / sell / short /cover) tak jak opisano to w: "Testowanie historyczne własnej strategii"

2. Trzeba określić ilość możliwych jednocześnie pozycji oraz sposób (algorytm) w jaki będzie ustalana wielkość każdej z otwieranych pozycji

OKREŚLENIE MAKSYMALNEJ LICZBY OTWARTYCH POZYCJI

Możliwe są dwa sposoby zdefiniowania liczby równolegle otwartych pozycji:

1. Wybierz: Settings (ustawienia), zakładka: Portfolio(Portfel) i wprowadź liczbę w polu: Max. Open Positions (maksymalna liczba otwartych pozycji).

2. Zdefiniuj maksymalną liczbę otwartych pozycji bezpośrednio w formule używając funkcji SetOption (formuła będzie będzie uchylać liczbę określoną w menu Settings 'Ustawienia')

SetOption("MaxOpenPositions", 5 ); // otwieraj jednocześnie do 5 pozycji.

USTALANIE WIELKOŚCI POZYCJI

WAŻNE: aby możliwe było otwarcie tym samym momencie więcej niż jednej pozycji konieczne jest dodanie do formuły zmiennej PositionSize, aby nie inwestowac w transakcję 100% posiadanej gotówki.

PositionSize = -25; // inwestuj do 25% kapitału w 1 transakcję

or

PositionSize = 5000; // inwestuj $5000 w pojedynczą transakcję

W prosty sposób można ustalić zarówno wielkośc pozycji jak i ich maksymlną liczbę, tak, że kapitał rozkłada się równomiernie na poszczególne transakcje:

PosQty = 5; // Tu definiujesz ile chcesz mieć otwartych pozycji
SetOption("MaxOpenPositions", PosQty );
PositionSize = -100/PosQty; // inwestuj 100% kapitału podzielone przez maksymalną liczbę pozycji.

Możliwe jest także bardziej skomplikowane zarządzanie wielkości pozycji, np. bazowane na zmienności (np. metoda Van Tharpa).

PositionSize = -2 * BuyPrice/(2*ATR(10));

W ten sposób w transakcję inwestowane jest 2% wartości portfela skorygowane o parametr: BuyPrice/2*ATR.

Wykorzystanie wartości punktowej pozycji (Position Score)

W przypadku, gdy liczba możliwych do zawarcia w danym momencie transakcji przewyższa maksymalną liczb otwartych pozycji, wykorzystanie zmiennej PositionScore pozwala wybór preferowanych transakcji - pierwszeństwo będą mieć transakcje o wyższej warotści zmiennej PositionScore. Poniższy przykład pokazuje prosty system bazujący na przecięciu średnich kroczących. Dodatkowym kryterium jest wartość wskaźnika RSI. W momencie gdy jednocześnie pojawi się więcej sygnałów kupna niż zezwala na to ilość posiadanej gotówki lub maks. ilość otwartych pozycji, preferowane będą walory z niższą wartością RSI. Proces wyboru transakcji można zobaczyć włączając "Detailed log" (raport szczegółowy).

Poniższy przykład pokazuje również, jak przy użyciu opcji Optymalizacja określić ilość jednocześnie otwartych pozycji, która przynosi największy dochód.

/*****
** tryb REGULAR PORTFOLIO
** Ten przykład
** znajduje optymalną liczbę jednocześnie otwartych pozycji.
**
****/

SetOption("InitialEquity", 20000 );
SetTradeDelays(1,1,1,1);
RoundLotSize = 1;

posqty = Optimize("PosQty", 4, 1, 20, 1 );
SetOption("MaxOpenPositions", posqty);

// poądana wartość pozycji równa jest 100% wartości portfela
// podzielonej przez liczbę pozycji: PosQty

PositionSize = -100/posqty;

// System ten jest bardzo prosty...
// parametry średniej kroczącej również mogą być optymalizowane...
p1 = 10;
p2 = 22;
// simple MA crossover
Short=Cross( MA(C,p1) , MA(C,p2) );
Buy=Cross( MA(C,p2) , MA(C,p1) );
// always in the market
Sell=Short;
Cover=Buy;

// tu wprowadzona jest dodatkowa punktacja
// służąca określaniu preferowanych walorów
// gdy wystąpi więcej sygnałów otwarcia pozycji
// niż pozwala na to stan gotówki lub max. liczba otw. pozycji.
PositionScore = 100-RSI(); // prefer stocks that have low RSI;

HANDEL ROTACYJNY

Rotacyjne zawieranie transakcji (określane także jako 'fund-switching' lub 'scoring and ranking') jest również możliwe. Aby zapozanć się z bardziej szczegółowymi informacjami na ten temat, zobacz opis funkcji EnableRotationalTrading.

Patrz również:

Testowanie historyczne własnej strategii

Testowanie historyczne systemów transakcyjnych dla kontraktów futures

Użycie edytora AFL

Przewodnik dot. użycia testera historycznego (newsletter 1/2002)