Handel parą. spready filtry

Anonim

Witam wszystkich! W tym artykule postaram się powiedzieć, w jaki sposób można zaoszczędzić sporo czasu, nerwów i oczu, przewracając tysiące par spreadów, próbując rozwikłać niepotrzebne nam rozprzestrzenia. Najpierw jednak przyjrzyjmy się, co zostało napisane w poprzednich artykułach:

1. kointegracji w obrocie pary

2. handlowym Pair. spread.

3. handlowym Pair. Udziały dla par

4. Para Trading: parę akcji, korelacja, portfel inwestycyjny spread kointegracji (Klevtsov Anton)

Ci, którzy nie czytać, bardzo polecam. Artykuły te opisał koncepcję handlu pary, dlaczego nie kointegracji korelację, która rozprowadza i jak ją zbudować.

Cóż, teraz porozmawiajmy o możliwych filtrów, rozprzestrzenia się, a raczej o filtrze „piękna” spreadu, w jednym czasie nazwaliśmy go w ten sposób)

Pomiar stopnia kointegracji

W pierwszym artykule już mówił o kointegracji oraz jego znaczenie. Jest to czas, aby dostać się z nią zapoznać z praktycznego punktu widzenia.

Dlaczego oczekujemy kointegracji? Wiemy już, że system smarowania między zapasów, chcemy widzieć w nich to, co zaletą i zrozumienia. Obliczanie kointegracji pomóc nam odfiltrować chaotyczne spready, które nie różnią się od wartości nieprzewidywalny planowania akcji spółek.

W jaki sposób można uprościć poszukiwania pięknych smarowania?

Aby ocenić stopień kointegracji między szeregów czasowych, istnieje szereg metod matematycznych, jedną z podstawowych i najbardziej skuteczna jest rozszerzenie testu Diki Fullera (test ADF). Idź do składnika matematycznej w tym artykule nie będzie, bo Aby zrozumieć potrzebę wiedzieć więcej prostych modeli i koncepcji ekonometrii. Ale nie zapominajmy, że żyjemy jesteśmy w epoce technologii informacyjnych i każdy model matematyczny można zautomatyzować w środowisku programowania. Tych drugich odróżnić MATLAB i projekt R, ale wolałbym to drugie. Dlatego wszystkie kawałki kodu, które położę się w tym i kolejnych artykułach będziemy stosować go do języka R.

Skonstruować spread pair BMR/OFC:

Widzimy bardzo dobry wybór. Ta rozpiętość była ADP testy z wyróżnieniem, wartość wyjściowa p. value wynosiła 0,01, co może wskazywać na rozprzestrzenianie akcesoriów do stacjonarnych o 99%. Wartość P.value jest współczynnikiem, który określa prawdopodobieństwo, że rozpiętość nie jest nieruchomy. W tym przypadku, wskaźnik 1%, a następnie 99% prawdopodobieństwa, że ​​rozrzut zastrz nas. Uważa się być nieruchomy, szeregów czasowych, jeżeli wartość jest mniejsza niż lub równa p.value 0,05, tj 5%. Ale z mojego doświadczenia mogę powiedzieć, że test ADP nie jest doskonały i często przypisuje dobrych spreadów wysoką p.value, a złe spready odnosi się do postoju.

Kod do obliczania p. value:

Biblioteka (timeDate)

stock1 = get. hist.quote (Instrument = "BMR"

start = "2012-01-01"

koniec = "01. 10.2014"

quote = "AdjClose", retclass = "zoo", cichy = TRUE, drop = FAŁSZ)

stock2 = get. hist.quote (Instrument = "OFC"

start = "2012-01-01"

koniec = "01. 10.2014"

quote = "AdjClose", retclass = "zoo", cichy = TRUE, Spadek = FAŁSZ)

spred = stock1 stock2

p. value = adf.test (spred) $ p.value

get. hist.quote funkcja wibracji ceny zamknięcia dostosowany do dywidend i rozłamów, pobiera dane z Yahoo Finance. Daty rozpoczęcia i zakończenia okresu wskazać pobrany. Parametr przyrząd ustawia nazwę giełdowy niezbędny. Dwie ostatnie linie zbudować stosunek spred i określenia wartości p.value.

Co by przekonać do ADP skuteczności testu, zbudować kilka SPY/AAPL:

Zgadzam się, nie ma się czego złapać i pokazał nam, że test: wartość p. value = 0,9, to znaczy, 90% tego spreadu nie jest nieruchoma, myślę, że nikt nie będzie argumentować))

Reszta jest dla każdego z was) za ten kod trzeba napisać pętlę, która będzie budować wszystkie możliwe pary i określić ich poziom kointegracji. Mogę powiedzieć, że kilka tysięcy par może nawet dziesiątki tysięcy, zamów filtr 97-98%)) Dobry pary nie tak dużo.

Filtr rozprzestrzenia N2

Nie ma innej opcji do rozprzestrzeniania się dość dobrych par filtrów. Wymyśliłem, że nie tak dawno temu, nie był jeszcze znacznie opkatal, ale działa bardzo dobrze)

Przypomnijmy, że finansowa szeregów czasowych można przedstawić jako zbiór procesów Wienera i OU. Filtr jest Ideą jest na tym aksjomatem otrzymujemy stałą rozprzestrzeniania jeżeli składnik trendu w pierwszych i drugich działań są najbardziej podobne, to nie będzie tylko elementy stacjonarne, spread pomiędzy które otrzymujemy.

Pozwól nam dowiedzieć:

Zbudowaliśmy dwa wykresy akcji (BMR i OFC) podane do odsetek.

Następnie budujemy średnią ruchomą dla każdego:

I widzimy, że tendencja (średnie ruchome) tych akcji prawie takie same. Kiedy budujemy spread pomiędzy nimi, składnik ten trend będzie się wyeliminować i otrzymujemy różnicę pomiędzy stacjonarnych elementów, które są rozmieszczone wokół średnich kroczących.

Fakt, że różnica między akcji jest nieruchomy, można upewnić się powyżej.

Teraz musimy interpretować ten model, w którym każdy rysunek. Zrobiłem to poprzez znalezienie średnią arytmetyczną bezwzględnej różnicy między średnimi ruchomymi: (suma | SMA1-SMA2 |) / (Chart_period-sma_period). Odebrany wskaźnik (nazwać t.value), co wskazuje na średnią bezwzględną różnicę ślizgowych, odpowiednio, w dolnej, bardziej podobny do średniej składnika z magazynu, a zwłaszcza różnicy między nimi jest nieruchomy. Po serii testów, okazało się, że w dość dobre rozłożenie t.value nie więcej niż 10, mają dobre nie więcej niż 5, nie więcej niż trzy różne. okres wygładzania, użyłem 50, z inną wartością t.value będzie inaczej i jakie wartości będą odpowiadać dobrym spread - jest nieznany. Ale ja z nim jeszcze praktykowane, więc zakres wartości można zmieniać do gustu. Na przykład t.value BMR-OFC rozłożone równy 1,43, podczas gdy Spy-AAPL jest 23

Kod do obliczania t. value dla R

filtr = funkcja (a, b, smooth_period, chart_period)

{

Biblioteka (TTR)

a = [1: chart_period]

b = [1: chart_period]

a = A/A [1] x 100

B = b/B [1] x 100

ema. a = EMA (a, smooth_period)

ema. b = EMA (b smooth_period)

t. value = suma (ABS (ema.a [smooth_period: chart_period] -ema.b [smooth_period: chart_period])) / (chart_period-smooth_period + 1)

Powrót (round (t. value 2))

}

Gdzie a - cena od pierwszych akcji, b - cena druga akcja, smooth_period - okres ruchu (polecam 50), chart_period - długość harmonogramu.

Kod dla thinkorswim:

Def Dane1 = blisko (GetSymbolPart (1));

Def Data2 = blisko (GetSymbolPart (2));

Def KF = blisko (GetSymbolPart (1)) [500];

Def KFF = blisko (GetSymbolPart (2)) [500];

Def bn = BarNumber ();

Def HBN = HighestAll (Bn);

Def bn_diff = HBN - BN;

Def kf1 = GetValue (KF -bn_diff);

Def KF2 = GetValue (KFF, -bn_diff);

Def Data11 = (Dane1 kf1-1) * 100, Def Data22 = (Data2 kf2-1) * 100, Def AV1 = średnia (Data11, 50);

Def AV2 = średnia (Data22, 50);

Def minus = suma (AbsValue (AV1, AV2), 450) / 450;

addLabel (tak, minus, color. cYAN);

Z przyczyn mi nieznanych, funkcja GetValue () nie działa dla niektórych użytkowników, która jest integralną częścią kodu. Dlatego też, jeśli działa dla ciebie - super, jeśli nie - masz pecha (Sam kod jest wyświetlany w lewym górnym rogu (patrz wyżej) wartość t. value postać, podczas gdy w okolicy na giełdowy powinien być.. umieścić kilka (ticker1-ticker2).

Cóż, tutaj jest wszystko, jak filtrować parę matematycznie konserwującego wzroku i nerwów, powiedziałem, reszta należy do Ciebie:)

Komentarze, pytania i krytyka są mile widziane. Czekamy na przyszłych wydaniach:)