Wednesday 1 November 2017

Przenoszenie średnio pseudokodu


Wykładnicza średnia ruchoma - EMA ZMNIEJSZAJĄCA Średnia wykładnicza średnia ruchoma - EMA 12- i 26-dniowe EMA są najpopularniejszymi krótkoterminowymi wartościami średnimi i są używane do tworzenia wskaźników takich jak średnia ruchoma rozbieżność konwergencji (MACD) i procentowy oscylator ceny (PPO). Ogólnie rzecz biorąc, EMA o długości 50 i 200 dni są wykorzystywane jako sygnały długoterminowych trendów. Handlowcy, którzy stosują analizę techniczną, uważają, że średnie ruchome są bardzo użyteczne i wnikliwe, gdy są prawidłowo stosowane, ale tworzą spustoszenie, gdy są niewłaściwie używane lub są źle interpretowane. Wszystkie średnie ruchome powszechnie stosowane w analizie technicznej są ze swej natury wskaźnikami opóźniającymi. W związku z tym wnioski wyciągnięte z zastosowania średniej ruchomej do określonego wykresu rynkowego powinny potwierdzać ruch rynkowy lub wskazać jego siłę. Bardzo często, zanim linia średniej ruchomej wskazała zmianę, która odzwierciedla znaczący ruch na rynku, optymalny punkt wejścia na rynek już minął. EMA służy do złagodzenia tego dylematu w pewnym stopniu. Ponieważ obliczenia EMA kładą większy nacisk na najnowsze dane, to przyśpieszają akcję cenową, dzięki czemu reagują szybciej. Jest to pożądane, gdy EMA jest wykorzystywana do wyprowadzenia sygnału wejścia handlowego. Interpretacja EMA Podobnie jak wszystkie wskaźniki średniej ruchomej, są one znacznie lepiej dostosowane do trendów na rynkach. Kiedy rynek jest w silnym i utrzymującym się trendzie wzrostowym. linia wskaźnika EMA będzie również wykazywać trend wzrostowy i odwrotnie w przypadku trendu spadkowego. Czujny inwestor nie tylko zwróci uwagę na kierunek linii EMA, ale także na relację szybkości zmiany z jednego paska do drugiego. Na przykład, gdy akcja cenowa silnego trendu wzrostowego zaczyna się spłaszczać i odwracać, szybkość zmian EMA z jednego paska do następnego zacznie zmniejszać się do momentu, gdy linia wskaźnika spłaszczy się, a tempo zmiany wynosi zero. Z powodu efektu opóźnienia, w tym momencie, a nawet kilku taktów wcześniej, akcja cenowa powinna już się odwrócić. Wynika z tego, że obserwowanie konsekwentnego zmniejszania tempa zmian EMA mogłoby samo w sobie służyć jako wskaźnik, który mógłby dalej przeciwdziałać dylematowi wynikającemu z opóźnionego efektu ruchomych średnich. Wspólne zastosowania EMA EMA są powszechnie stosowane w połączeniu z innymi wskaźnikami, aby potwierdzić istotne ruchy na rynku i ocenić ich ważność. W przypadku handlowców, którzy handlują rynkami bieżącymi i szybko rozwijającymi się, EMA ma większe zastosowanie. Dość często inwestorzy używają EMA w celu określenia obciążenia handlowego. Na przykład, jeśli EMA na wykresie dziennym wykazuje silny trend wzrostowy, strategia handlowa w ciągu dnia może polegać na wymianie tylko długiej strony na wykresie intraday. Próbuję obliczyć średnią ruchomą sygnału. Wartość sygnału (podwójna) jest aktualizowana losowo razy. Szukam skutecznego sposobu obliczania jego średniej ważonej w czasie w oknie czasowym, w czasie rzeczywistym. Mógłbym to zrobić sam, ale jest to trudniejsze, niż myślałem. Większość zasobów znalezionych w Internecie oblicza średnią ruchomą okresowego sygnału, ale aktualizacje w czasie losowym. Czy ktoś zna dobre zasoby do tego Podstęp jest następujący: Otrzymujesz aktualizacje losowo razy poprzez aktualizację void (czas int, wartość float). Musisz jednak również śledzić, kiedy aktualizacja spadnie z okna czasowego, więc ustawiasz alarm, który wywoływał w czasie N, który usuwa poprzednie uaktualnienie, aby ponownie nie był uwzględniany w obliczeniach. Jeśli dzieje się to w czasie rzeczywistym, możesz poprosić system operacyjny o wywołanie metody void dropoffoldestupdate (int time), która ma być wywołana w czasie N Jeśli jest to symulacja, nie możesz uzyskać pomocy z systemu operacyjnego i musisz rób to ręcznie. W symulacji można wywołać metody z czasem podanym jako argument (który nie koreluje z czasem rzeczywistym). Jednak rozsądnym założeniem jest to, że połączenia są gwarantowane tak, że argumenty czasu rosną. W takim przypadku musisz posortować listę wartości czasu alarmu, a dla każdej aktualizacji i wywołania odczytu sprawdzić, czy argument czasu jest większy niż nagłówek listy alarmów. Podczas gdy jest on większy, wykonujesz przetwarzanie związane z alarmem (usuwając najstarszą aktualizację), usuń głowicę i sprawdź ponownie, aż wszystkie alarmy przed danym czasem zostaną przetworzone. Następnie wykonaj wywołanie aktualizacji. Do tej pory zakładałem, że jest oczywiste, co zrobiłbyś dla rzeczywistych obliczeń, ale rozwiążę je na wszelki wypadek. Zakładam, że masz metodę float read (int time), której używasz do odczytu wartości. Celem jest uczynienie tego połączenia tak efektywnym, jak to tylko możliwe. Więc nie obliczasz średniej ruchomej za każdym razem, gdy wywoływana jest metoda read. Zamiast tego oblicz wstępną wartość z ostatniej aktualizacji lub ostatniego alarmu i dostosuj tę wartość kilkoma operacjami zmiennoprzecinkowymi, aby uwzględnić upływ czasu od ostatniej aktualizacji. (i. e. stałą liczbę operacji, z wyjątkiem prawdopodobnie przetwarzania listy alarmów ułożonych w stos). Mam nadzieję, że jest to jasne - powinien to być dość prosty algorytm i dość wydajny. Dalsza optymalizacja. Jednym z pozostałych problemów jest sytuacja, w której duża liczba aktualizacji odbywa się w ramach okna czasowego, a następnie jest długi czas, w którym nie ma ani odczytów, ani aktualizacji, a następnie pojawia się odczyt lub aktualizacja. W takim przypadku powyższy algorytm będzie nieskuteczny przy stopniowej aktualizacji wartości każdej z aktualizacji, która spada. Nie jest to konieczne, ponieważ dbamy tylko o ostatnią aktualizację poza przedziałem czasowym, więc jeśli istnieje sposób, aby skutecznie usunąć wszystkie starsze aktualizacje, pomogłoby to. Aby to zrobić, możemy zmodyfikować algorytm do binarnego wyszukiwania aktualizacji, aby znaleźć najnowszą aktualizację przed upływem okna czasowego. Jeśli istnieje stosunkowo niewielka liczba aktualizacji, które należy usunąć, można stopniowo zwiększać wartość każdej upuszczonej aktualizacji. Ale jeśli istnieje wiele aktualizacji, które należy usunąć, można ponownie obliczać wartość od zera po usunięciu starych aktualizacji. Dodatek do obliczeń przyrostowych: Powinienem wyjaśnić, co mam na myśli przez przyrostowe obliczenia powyżej w zdaniu, poprawić tę wartość o kilka operacji zmiennoprzecinkowych, aby uwzględnić upływ czasu od ostatniej aktualizacji. Początkowe obliczenia nieinżynierskie: następnie wykonaj iterację nad odpowiednimi aktualizacjami w kolejności rosnącego czasu: moveaverage (sum lastupdate timesincelastupdate) windowlength. Teraz, jeśli dokładnie jedna aktualizacja wypadnie z okna, ale nie pojawią się żadne nowe aktualizacje, dostosuj sumę jako: (zauważ, że jest to priorupdate, którego znacznik czasu został zmodyfikowany do rozpoczęcia ostatniego okna). I jeśli dokładnie jedna aktualizacja wchodzi do okna, ale żadne nowe aktualizacje nie wypadają, należy skorygować sumę jako: Jak powinno być oczywiste, jest to szkic szorstki, ale mam nadzieję, że pokazuje on, jak można utrzymać średnią taką, że jest to operacja O (1) na aktualizację zgodnie z amortyzacją. Ale zanotuj dalszą optymalizację w poprzednim paragrafie. Należy również zwrócić uwagę na problemy ze stabilnością, które pojawiają się w starszej odpowiedzi, co oznacza, że ​​błędy zmiennoprzecinkowe mogą kumulować się w dużej liczbie takich operacji przyrostowych, tak że istnieje rozbieżność w wyniku pełnego obliczenia, który jest istotny dla aplikacji. Jeśli przybliżenie jest w porządku i tam jest minimalny czas między próbkami, możesz spróbować super-próbkowania. Posiadaj tablicę, która reprezentuje równomiernie rozmieszczone interwały czasowe, które są krótsze niż minimum, i dla każdego okresu przechowuj najnowszą próbkę, która została odebrana. Im krótszy przedział czasu, tym bliżej wartości średniej do rzeczywistej. Okres nie powinien być większy niż połowa minimum lub istnieje szansa na brak próbki. odpowiedziała 15 grudnia 11 o 18:12 odpowiedział 15 grudnia 11 o 22:38 Dziękuję za odpowiedź. Jedna poprawa, która byłaby potrzebna do faktycznego cytowania wartości całkowitej średniej, więc nie robimy pętli przez cały czas. Co więcej, może to być drobna kwestia, ale czy nie byłoby bardziej wydajne korzystanie z rachunku lub listy do przechowywania wartości, ponieważ zakładamy, że aktualizacja zostanie wprowadzona we właściwej kolejności. Wstawianie będzie szybsze niż na mapie. ndash Arthur Dec 16 11 o 8:55 Tak, możesz buforować wartość sumy. Odejmij wartości wymazanych próbek, dodaj wartości wstawianych próbek. Ponadto, tak, DequeltpairltSample, Dategtgt może być bardziej efektywny. Wybrałem mapę dla czytelności i łatwość wywoływania mapy :: górne. Jak zawsze, najpierw napisz poprawny kod, a następnie zmień profil i zmień przyrostowe. ndash Rob Dec 16 11 o 15:00 Uwaga: Najwyraźniej to nie jest sposób, aby do tego podejść. Pozostawiając to tutaj dla odniesienia, co jest nie tak z tym podejściem. Sprawdź komentarze. AKTUALIZACJA - na podstawie komentarza Olisa. nie jestem jednak pewien niestabilności, o której on mówi. Użyj posortowanej mapy czasów przyjazdu względem wartości. Po nadejściu wartości dodaj czas przybycia do posortowanej mapy wraz z jej wartością i zaktualizuj średnią ruchomą. ostrzeżenie to jest pseudo-kod: There. Nie w pełni rozwiązany, ale masz pomysł. Rzeczy do zapamiętania. Jak już powiedziałem, powyższy kod to pseudo kod. Musisz wybrać odpowiednią mapę. Nie usuwaj par podczas iteracji, ponieważ unieważnisz iterator i będziesz musiał zacząć od nowa. Zobacz także komentarz Olis poniżej. odpowiedziała 15 grudnia o 12:22 To nie działa: nie bierze pod uwagę, jaka część okna ma długość każdej wartości. Również to podejście dodawania, a następnie odejmowania jest stabilne tylko dla typów całkowitych, a nie dla zmiennych. ndash Oliver Charlesworth 15 grudnia 11 o 12:29 OliCharlesworth - przepraszam, że przegapiłem kilka kluczowych punktów w opisie (podwójne i ważone czasem). Zaktualizuję. Dzięki. ndash Dennis 15 grudnia 11 o 12:33 Ważenie czasu to kolejny problem. Ale nie o tym mówię. Miałem na myśli fakt, że kiedy nowa wartość wchodzi najpierw w okno czasowe, jej udział w średniej jest minimalny. Jego wkład stale rośnie, dopóki nie pojawi się nowa wartość. ndash Oliver Charlesworth Dec 15 11 o 12: 35I zasadniczo mają szereg wartości takich jak ta: powyższa tablica jest uproszczona, zbieram 1 wartość na milisekundę w moim prawdziwym kodzie i muszę przetworzyć wynik na algorytmie, który napisałem, aby znaleźć najbliższy szczyt przed punktem w czasie. Moja logika kończy się niepowodzeniem, ponieważ w moim przykładzie powyżej 0.36 jest prawdziwym szczytem, ​​ale mój algorytm będzie wyglądał wstecz i zobaczy ostatnią liczbę 0.25 jako szczyt, ponieważ przed nią jest spadek do 0.24. Celem jest przyjęcie tych wartości i zastosowanie do nich algorytmu, który wygładzi je nieco, tak żebym miał więcej wartości liniowych. (tj: Id jak moje wyniki być kręty, nie jaggedy) Powiedziano mi, aby zastosować wykładniczy filtr średniej ruchomej do moich wartości. Jak mogę to zrobić? Bardzo trudno jest mi czytać równania matematyczne, z kodem radzę sobie znacznie lepiej. Jak przetwarzać wartości w mojej tablicy, stosując wykładnicze obliczenia średniej ruchomej, aby je wyrównać zapytano 8 lutego 12 o 20:27 Obliczanie wykładniczej średniej kroczącej. musisz zachować pewien stan i potrzebujesz parametru strojenia. To wymaga małej klasy (zakładając, że korzystasz z Java 5 lub nowszej wersji): Utwórz instancję z żądanym parametrem zaniku (możesz ustawić strojenie od 0 do 1), a następnie użyj funkcji average () do filtrowania. Czytając stronę o nawrocie matematycznym, wszystko, co naprawdę trzeba wiedzieć, kiedy zamienia się ją w kod, jest takie, że matematycy lubią pisać indeksy w tablicach i sekwencjach z indeksami dolnymi. (Są też inne zapisy, które nie pomagają.) Jednak EMA jest dość prosta, ponieważ wystarczy zapamiętać jedną starą wartość, nie wymagającą skomplikowanych tablic stanów. odpowiedział 08 lutego 12 o 20:42 TKKocheran: Dość dużo. Czy to nie jest miłe, gdy rzeczy mogą być proste (jeśli zaczynasz z nową sekwencją, zdobądź nową średnią). Zauważ, że kilka pierwszych haseł w uśrednionej sekwencji będzie przeskakiwało trochę ze względu na efekty graniczne, ale dostajesz te z innymi ruchomymi średnimi także. Jednak dobrą zaletą jest to, że można zawinąć logikę średniej ruchomej do uśredniającego i eksperymentować, nie zakłócając zbytnio reszty programu. ndash Donal Fellows 09 lutego 12 o 0:06 Mam trudności ze zrozumieniem twoich pytań, ale i tak postaram się odpowiedzieć. 1) Jeśli twój algorytm znalazł 0.25 zamiast 0.36, to jest źle. Jest źle, ponieważ zakłada monotoniczny wzrost lub spadek (który zawsze rośnie lub zawsze spada). O ile nie wytypujesz WSZYSTKICH twoich danych, twoje punkty danych --- podczas ich prezentacji --- są nieliniowe. Jeśli naprawdę chcesz znaleźć maksymalną wartość pomiędzy dwoma punktami w czasie, podziel tablicę od tmin do tmax i znajdź maksimum tego podbarwa. 2) Teraz pojęcie średnich kroczących jest bardzo proste: wyobraź sobie, że mam następującą listę: 1.4, 1.5, 1.4, 1.5, 1.5. Mogę go wygładzić, biorąc średnią z dwóch liczb: 1.45, 1.45, 1.45, 1.5. Zauważ, że pierwsza liczba to średnia z 1,5 i 1,4 (druga i pierwsza liczba), druga (nowa lista) to średnia z 1,4 i 1,5 (trzecia i druga stara lista), a trzecia (nowa lista) to średnio 1,5 i 1,4 (czwarty i trzeci) i tak dalej. Mogłem zrobić okres trzy lub cztery, lub n. Zwróć uwagę, że dane są znacznie płynniejsze. Dobrym sposobem, aby zobaczyć średnie ruchome w pracy, jest przejście do Google Finance, wybór akcji (wypróbuj Tesla Motors pretty volatile (TSLA)) i kliknij technicznych na dole wykresu. Wybierz średnią ruchomą z danym okresem i wykładniczą średnią kroczącą, aby porównać różnice. Wykładnicza średnia krocząca jest tylko kolejnym rozwinięciem tego, ale waży starsze dane mniej niż nowe dane, jest to sposób na odchylenie wygładzania w kierunku tyłu. Proszę przeczytać wpis w Wikipedii. Jest to raczej komentarz niż odpowiedź, ale małe pole komentarza było niewielkie. Powodzenia. Jeśli masz problemy z matematyką, możesz użyć prostej średniej ruchomej zamiast wykładniczej. Wynik wyjściowy będzie więc ostatnim x terminami podzielonymi przez x. Nieprawdziwy kod pseudokodowy: pamiętaj, że będziesz musiał obsługiwać początkowe i końcowe części danych, ponieważ wyraźnie nie możesz uśrednić ostatnich 5 warunków, gdy jesteś na drugim punkcie danych. Ponadto istnieją skuteczniejsze sposoby obliczania tej średniej ruchomej (suma suma - najstarsze najnowsze), ale ma to na celu uzyskanie koncepcji na temat tego, co się dzieje. odpowiedział 08 lutego 12 o 20:41

No comments:

Post a Comment