Monday, 27 November 2017

Ważony ruchomy średni filtr c


Ważona średnia ruchoma to średnia z danych wyliczana w pewnym okresie czasu, gdzie większa waga jest związana z najnowszymi danymi. The Weighted Moving Average może być używana z dowolną ceną, w tym ceną Hi, Low, Open lub Close, i może być zastosowana również do innych wskaźników. Średnia ważona ruchoma wygładza serię danych, która jest ważna na niestabilnym rynku, ponieważ pomaga znacznie łatwiej identyfikować trendy. Ważenie jest obliczane na podstawie sumy dni. Dundas Chart for Windows Forms ma cztery typy średnich kroczących, w tym Simple. Wykładniczy. Trójkątny. i ważone. Najważniejszą różnicą między powyższymi ruchomymi wartościami jest to, jak ważą swoje punkty danych. Zalecamy przeczytanie sekcji Korzystanie z formuł finansowych przed kontynuowaniem. Korzystanie z formuł finansowych dostarcza szczegółowych wyjaśnień na temat używania formuł, a także wyjaśnia różne opcje dostępne podczas stosowania formuły. Wykres liniowy jest dobrym wyborem przy wyświetlaniu ważonej średniej kroczącej. Interpretacja finansowa: ważona średnia krocząca służy do porównywania wartości ze średnią ważoną średnią ruchomą i daje większy wpływ na ostatnie dane i mniejszy wpływ na wcześniejsze dane. Najważniejszym elementem wykorzystywanym do obliczenia średniej ruchomej jest okres, który powinien być równy obserwowanemu cyklowi rynkowemu. Ważona średnia krocząca jest wskaźnikiem opóźniającym i zawsze będzie za ceną. Gdy cena podąża za trendem, ważona średnia krocząca jest bardzo zbliżona do ceny. Kiedy cena rośnie, ważona średnia krocząca najprawdopodobniej pozostanie w dół ze względu na wpływ danych historycznych. Obliczenia: ważoną średnią kroczącą oblicza się za pomocą sumy indeksów okresów (punktów danych). Masa za każdy okres jest obliczana jako indeks (liczba punktów danych). Poniższa tabela pokazuje, jak obliczyć 5-dniową średnią ważoną średnią ruchomą: Czy możliwe jest zaimplementowanie średniej ruchomej w C bez potrzeby okna z próbkami, które udało mi się zoptymalizować, wybierając rozmiar okna, który jest potęgą dwa, aby umożliwić przesunięcie bitowe zamiast dzielenia, ale nie wymagające bufora byłoby miłe. Czy istnieje sposób wyrażenia nowego wyniku średniej kroczącej tylko jako funkcję starego wyniku i nowej próbki Zdefiniuj przykładową średnią ruchomą w oknie 4 próbek: Dodaj nową próbkę e: Średnia ruchoma może zostać zaimplementowana rekurencyjnie , ale do dokładnego obliczenia średniej ruchomej trzeba zapamiętać najstarszą próbkę wejściową w sumie (tj. a w twoim przykładzie). Dla długości N średniej ruchomej obliczamy: gdzie yn jest sygnałem wyjściowym, a xn jest sygnałem wejściowym. Eq. (1) może być napisany rekurencyjnie jako Więc zawsze musisz zapamiętać próbkę xn-N w celu obliczenia (2). Jak wskazał Conrad Turner, można zamiast tego użyć (nieskończenie długiego) okna wykładniczego, które pozwala obliczyć wyjście tylko z poprzedniego wyjścia i bieżącego wejścia: ale nie jest to standardowa (nieważona) średnia ruchoma, ale wykładniczo ważona średnia ruchoma, gdzie próbki w przeszłości mają mniejszą masę, ale (przynajmniej teoretycznie) nigdy niczego nie zapominasz (ciężary stają się mniejsze i mniejsze dla próbek daleko w przeszłości). Zaimplementowałem średnią ruchomą bez pamięci pojedynczych elementów dla programu do śledzenia GPS, który napisałem. Zaczynam od 1 próbki i dzielę przez 1, aby uzyskać aktualną średnią. Następnie dodaję próbkę anothe i dzielę przez 2 do aktualnej avg. To trwa, dopóki nie osiągnę długości średniej. Za każdym razem dodawam nową próbkę, otrzymuję średnią i usuwam tę średnią z całości. Nie jestem matematykiem, ale wydawało mi się, że to dobry sposób. Pomyślałem, że to zmieni żołądek prawdziwego matematyka, ale okazuje się, że jest to jeden z akceptowanych sposobów robienia tego. I działa dobrze. Pamiętaj tylko, że im większa długość, tym wolniej podążasz za tym, co chcesz obserwować. To może nie mieć większego znaczenia, ale jeśli podążacie za satelitami, jeśli będziecie wolni, trasa może być daleko od rzeczywistej pozycji i będzie wyglądać źle. Możesz mieć przerwę między sob i końcowymi kropkami. Wybrałem długość 15 aktualizacji 6 razy na minutę, aby uzyskać odpowiednie wygładzenie i nie za bardzo oddalić się od faktycznej pozycji siedzącej z wygładzonymi kropkami. odpowiedziała 16 listopada 16 o 23:03 zainicjalizuj całość 0, count0 (za każdym razem, gdy zobaczysz nową wartość Następnie jedno wejście (scanf), jedno dodaj totalnewValue, jeden przyrost (count), jedna średnia dzieląca (totalcount) Byłaby to średnia ruchoma ponad wszystkie wejścia Aby obliczyć średnią tylko z ostatnich 4 wejść, wymagałyby 4 zmiennych wejściowych, być może skopiowania każdego wejścia do starszej zmiennej wejściowej, a następnie obliczenia nowej średniej ruchomej jako sumy 4 zmiennych wejściowych, podzielonej przez 4 (prawe przesunięcie 2 byłoby dobrze, jeśli wszystkie dane wejściowe były dodatnie, aby uzyskać średnią obliczoną odpowiedź 3 lutego 15 o 4:06 To faktycznie obliczyć całkowitą średnią, a NIE średnią ruchomą. Jak liczba staje się większa wpływ nowej próbki wejściowej staje się znikały małe ndash Hilmar lutego 3 15 at 13:53 Your Answer 2017 Stack Exchange, Inc Próbuję obliczyć średnią ruchomą sygnału Wartość sygnału (podwójna) jest aktualizowana losowo razy Szukam niezawodnego sposobu obliczyć jego średnią ważoną w czasie ove r okno czasowe 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 określonym przedziale czasowym, 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 spadnie z okna, ale nie pojawią się 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 związane ze stabilnością, do których nawiązuje starsza odpowiedź, 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 nie jest to 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 Dec 15 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 at 12: 35A Simple Moving Average to średnia z danych wyliczanych w danym okresie. Średnia krocząca jest najpopularniejszym wskaźnikiem cen wykorzystywanym w analizach technicznych. Ta średnia może być używana z każdą ceną, w tym Hi, Low, Open lub Close, i może być zastosowana również do innych wskaźników. Średnia ruchoma wygładza serię danych, co jest bardzo ważne na niestabilnym rynku, ponieważ pomaga zidentyfikować istotne trendy. Dundas Chart dla ASP ma cztery typy średnich kroczących, w tym Simple, Exponential. Trójkątny. i ważone. Najważniejszą różnicą między powyższymi ruchomymi wartościami jest to, jak ważą swoje punkty danych. Zalecamy przeczytanie sekcji Korzystanie z formuł finansowych przed kontynuowaniem. Korzystanie z formuł finansowych dostarcza szczegółowych wyjaśnień na temat używania formuł, a także wyjaśnia różne opcje dostępne podczas stosowania formuły. Wykres liniowy jest dobrym wyborem przy wyświetlaniu prostej średniej kroczącej. Interpretacja finansowa: Średnia ruchoma służy do porównywania cen papierów wartościowych z średnią ruchomą. Najważniejszym elementem wykorzystywanym do obliczenia średniej ruchomej jest okres, który powinien być równy obserwowanemu cyklowi rynkowemu. Średnia krocząca jest wskaźnikiem opóźniającym i zawsze będzie za ceną. Kiedy cena podąża za trendem, średnia krocząca jest bardzo zbliżona do ceny papierów wartościowych. Kiedy cena rośnie, średnia ruchoma prawdopodobnie pozostanie niższa ze względu na wpływ danych historycznych. Obliczenia: Średnia ruchoma jest obliczana przy użyciu następującej formuły: W poprzedniej formule wartość n oznacza okres czasu. Najczęstsze okresy to: 10 dni, 50 dni i 200 dni. Średnia ruchoma przemieszcza się, ponieważ po dodaniu każdego nowego punktu danych upuszczany jest najstarszy punkt danych. Prosta średnia ruchoma daje taką samą wagę do każdej ceny punktu danych. Ten przykład pokazuje, jak obliczyć 20-dniową średnią ruchomą przy użyciu metody Formula.

No comments:

Post a Comment