Thursday 21 December 2017

Vba calcul simple moving average


Średnia ruchoma Ten przykład pokazuje, w jaki sposób obliczyć średnią ruchomą szeregu czasowego w Excelu. Średnia ruchoma służy do łagodzenia nieprawidłowości (szczytów i dolin) w celu łatwego rozpoznawania trendów. 1. Najpierw przyjrzyjmy się naszej serii czasowej. 2. Na karcie Dane kliknij Analiza danych. Uwaga: nie można znaleźć przycisku Analiza danych Kliknij tutaj, aby załadować dodatek Analysis ToolPak. 3. Wybierz średnią ruchomą i kliknij OK. 4. Kliknij pole Input Range i wybierz zakres B2: M2. 5. Kliknij w polu Interwał i wpisz 6. 6. Kliknij pole Zakres wyjściowy i wybierz komórkę B3. 8. Narysuj wykres tych wartości. Objaśnienie: ponieważ ustawiliśmy przedział na 6, średnia ruchoma jest średnią z poprzednich 5 punktów danych i bieżącego punktu danych. W rezultacie szczyty i doliny są wygładzone. Wykres pokazuje rosnący trend. Program Excel nie może obliczyć średniej ruchomej dla pierwszych 5 punktów danych, ponieważ nie ma wystarczającej liczby poprzednich punktów danych. 9. Powtórz kroki od 2 do 8 dla przedziału 2 i odstępu 4. Wniosek: Im większy przedział, tym bardziej wygładzone są szczyty i doliny. Im mniejszy interwał, tym bliżej średnich ruchomych do rzeczywistych punktów danych. Jak obliczyć średnie kroczące w Excel Excel Analiza danych dla manekinów, 2. wydanie Komenda Analiza danych zapewnia narzędzie do obliczania ruchomych i wykładniczo wygładzonych średnich w Excelu. Załóżmy, na potrzeby ilustracji, że zebrałeś dzienne informacje o temperaturze. Chcesz obliczyć trzydniową średnią ruchomą 8212 średnią z ostatnich trzech dni 8212 w ramach prostego prognozowania pogody. Aby obliczyć średnie kroczące dla tego zestawu danych, wykonaj następujące kroki. Aby obliczyć średnią ruchomą, najpierw kliknij przycisk polecenia Data tab8217s Analiza danych. Gdy program Excel wyświetli okno dialogowe Analiza danych, wybierz pozycję Średnia ruchoma z listy, a następnie kliknij przycisk OK. Excel wyświetla okno dialogowe Średnia ruchoma. Wskaż dane, których chcesz użyć do obliczenia średniej ruchomej. Kliknij pole tekstowe Zakres wprowadzania w oknie dialogowym Średnia ruchoma. Następnie określ zakres wejściowy, wpisując adres zakresu arkusza lub za pomocą myszy, aby wybrać zakres arkusza roboczego. Odwołanie do zakresu powinno wykorzystywać bezwzględne adresy komórek. Bezwzględny adres komórki poprzedza literę kolumny i numer wiersza ze znakami, tak jak w A1: A10. Jeśli pierwsza komórka w zakresie wejściowym zawiera etykietę tekstową do identyfikacji lub opisu danych, zaznacz pole wyboru Etykiety w pierwszym wierszu. W polu tekstowym Odstęp, powiedz Excelowi, ile wartości ma zawierać obliczenie średniej ruchomej. Możesz obliczyć średnią ruchomą za pomocą dowolnej liczby wartości. Domyślnie program Excel używa ostatnich trzech wartości do obliczenia średniej ruchomej. Aby określić, że do obliczenia średniej ruchomej należy użyć innej liczby wartości, wprowadź tę wartość w polu tekstowym Odstęp czasu. Powiedz programowi Excel, gdzie umieścić dane średniej ruchomej. Użyj pola tekstowego Zakres wyników, aby określić zakres arkusza roboczego, w którym chcesz umieścić dane średniej ruchomej. W przykładzie z arkusza roboczego dane średniej ruchomej zostały umieszczone w zakresie arkusza roboczego B2: B10. (Opcjonalnie) Określ, czy chcesz wykres. Jeśli chcesz wykres przedstawiający średnią ruchomą, zaznacz pole wyboru Wynik wykresu. (Opcjonalnie) Wskaż, czy chcesz obliczać standardowe informacje o błędach. Jeśli chcesz obliczyć błędy standardowe dla danych, zaznacz pole wyboru Błędy standardowe. Program Excel umieszcza standardowe wartości błędów obok wartości średniej ruchomej. (Standardowa informacja o błędzie przechodzi do C2: C10.) Po zakończeniu określania, jakie średnie ruchome informacje mają zostać obliczone i gdzie chcesz je umieścić, kliknij OK. Program Excel oblicza średnią ruchomą. Uwaga: Jeśli program Excel nie ma wystarczająco dużo informacji do obliczenia średniej ruchomej dla błędu standardowego, umieszcza komunikat o błędzie w komórce. Możesz zobaczyć kilka komórek, które pokazują ten komunikat o błędzie jako wartość. Oto kod, który powinien być pomocny dla osób używających analizy technicznej w handlu i chcesz testować strategie w Excelu. Oblicza prostą, liniowo ważoną i wykładniczą średnią kroczącą. Następnie przedstawię i wyjaśnię kroki tworzenia formularza i kodu VBA. Wstawianie UserForm 8211 Nazwa: MAForm Dodaj cztery Etykiety z Przybornika Sterowania 8211 Napisy jak na powyższym ekranie drukowania Dodaj ComboBox do wyboru średniej ruchomej. Został nazwany comboTypeMA Dodaj dwie kontrolki RefEdit dla zakresu wejściowego i zakresu wyjściowego. Dodaj pole tekstowe do wyboru okresu średniej ruchomej Dodaj dwa przyciski: Nazwa: przycisk Podaj, Podpis: Prześlij i Nazwa: przycisk Anuluj, Podpis: Anuluj Aby wygenerować listę rozwijaną dla wyboru typu MA i załadować formularz użytkownika, nowy moduł zostanie wstawiony z poniższym kodem. Elementy ComboBox zostaną wypełnione ruchomymi typami średnimi, a formularz użytkownika zostanie załadowany. Option Explicit Sub loadMAForm () Z MAFormboTypeMA. RowSource. AddItem Simple. AddItem Weighted. AddItem Exponential End With MAForm. Show End Sub Poniżej znajduje się kod przypisany do przycisku Prześlij. Prywatny przycisk SubSubmitClick () Dim inputRange, outputRange As Range Parametr inputRange będzie zawierał serie cen wykorzystywane do obliczania MA, a outputRange będzie wypełnione ruchomymi wartościami średnimi. Dim inputPeriod As Integer Określa średnią ruchomą okres. Dim inputAddress, outputAddress As String Zakresy wejściowe i wyjściowe zadeklarowane jako łańcuch. Jeśli comboTypeMA. Value ltgt Exponential And comboTypeMA. Value ltgt Simple I comboTypeMA. Value ltgt Weighted True Then MsgBox Wybierz typ średniej ruchomej z listy. RefInputRange. SetFocus Exit Sub Ta część procedury wymusza pierwsze ograniczenia dotyczące przesłanych danych. Jeśli typ średniej ruchomej nie znajduje się na liście rozwijanej, procedura nie przejdzie do następnego kroku, a użytkownik zostanie poproszony o jej ponowne wybieranie. ElseIf RefInputRange. Value Then MsgBox Wybierz zakres wejściowy. RefInputRange. SetFocus Exit Sub ElseIf RefOutputRange. Value Następnie MsgBox Proszę wybrać zakres wyjściowy. RefOutputRange. SetFocus Exit Sub ElseIf RefInputPeriod. Value Następnie MsgBox Proszę wybrać okres średniej ruchomej. RefInputPeriod. SetFocus Exit Sub ElseIf Not IsNumeric (RefInputPeriod. Value) Następnie MsgBox Średnia ruchoma okresu musi być liczbą. RefInputPeriod. SetFocus Exit Sub End Jeśli zostaną utworzone inne ograniczenia. Zakres wejściowy, zakres wyjściowy i okres wejściowy nie mogą być puste. Również okres średniej ruchomej musi być liczbą. inputAddress RefInputRange. Value Ustaw zakres inputRange (inputAddress) outputAddress RefOutputRange. Value Set outputRange Zakres (outputAddress) inputPeriod RefInputPeriod. Value Argumenty dla zakresów inputRange i outputRange będą inputAddress i outputAddress zadeklarowane jako łańcuchy. If inputRange. Columns. Count ltgt 1 Następnie zakres wejściowy MsgBox może mieć tylko jedną kolumnę. RefInputRange. SetFocus Exit Sub Parametr inputRange musi zawierać tylko jedną kolumnę. ElseIf inputRange. Rows. Count ltgt outputRange. Rows. Count Then MsgBox Zakres wyjściowy ma inną liczbę rzędów niż zakres wejściowy. RefInputRange. SetFocus Exit Sub End If InputRange i outputRange muszą mieć taką samą liczbę wierszy. Dim RowCount As Integer RowCount inputRange. Rows. Count Dim cRow Jako Integer ReDim inputarray (1 To RowCount) Dla cRow 1 To RowFold inputarray (cRow) inputRange. Cells (cRow, 1). Wartość Next cRow inputarray jest zadeklarowany jako array i it8217s elements odpowiadają wartościom z każdego wiersza zakresu wejściowego. Jeśli inputPeriod gt RowCount Then MsgBox Liczba wybranych obserwacji to wzmacniacz RowCount amp, a okres to amp inputPeriod. Zakres wejściowy musi mieć większą lub równą liczbę elementów niż wybrany okres. RefInputRange. SetFocus Exit Sub End If Dodano inne ograniczenie 8211 Zakres wejściowy musi mieć większą lub równą liczbę elementów niż okres. Jeśli inputPeriod lt 0 Wtedy MsgBox Średnia ruchoma okresu musi być wyższa niż 0. RefInputPeriod. SetFocus Exit Sub End If Okres średniej ruchomej musi być wyższy od zera. ReDim outputarray (inputPeriod To RowCount) jako Variant Określane są również wymiary tablicy wyjściowej. Dolna granica tablicy to wartość inputPeriod, a górna granica to wartość RowCount (liczba elementów w parametrze inputRange). Poniżej części procedury obliczono prostą średnią ruchomą, jeśli wybór dla comboTypeMA jest prosty. SMA ----------------------------------------- Jeśli comboTypeMA. Value Simple Then Dim i , j Jako Integer Dim temp Jako Double For i inputPeriod To RowCount temp 0 Dla j (i - (inputPeriod - 1)) Do i temp temp inputarray (j) Następny j outputarray (i) temp inputPeriod outputRange. Cells (i, 1).Value outputarray (i) Next i outputRange. Cells (0, 1).Value SMA (amp inputPeriod amp) Zasadniczo procedura oblicza średnią ruchomą ostatnich x liczb (x jest równa inputPeriod), zaczynając od elementu inputarray równy inputPeriod. Poniżej znajduje się uproszczony przykład, który pokazuje każdy etap procedury. W tym przykładzie występują cztery liczby (no01, no02, no03 i no04) z wiersza 1 do wiersza 4, a średnia krocząca to 3. Po obliczeniu każdej nowej średniej ruchomej każda komórka parametru outputRange pobiera wartość z outputarray. Po obliczeniu średnich ruchomych w komórce powyżej OutputRange zostanie wstawiony tytuł zawierający typ i okres średniej ruchomej. W następnej części obliczona zostanie wykładnicza średnia ruchoma. EMA ------------------------------------------ ElseIf comboTypeMA. Value Exponential Then Dim alpha Jako Double alpha 2 (inputPeriod 1) Dla j 1 Wejściowy temper tymczasowy temp (j) Następny j outputarray (inputPeriod) temp inputPeriod Najpierw określana jest wartość alpha. Ponieważ w obliczeniach wartość EMA opiera się na poprzedniej EMA, pierwsza będzie prostą średnią ruchomą. Dla i inputPeriod 1 Do RowFray outputarray (i) outputarray (i - 1) alpha (inputarray (i) - outputarray (i - 1)) Dalej i Rozpoczynając od drugiej średniej ruchomej, będą obliczane na podstawie powyższej formuły: poprzedni EMA plus alfa pomnożony przez różnicę między bieżącą liczbą z wejścia i poprzednią wartością EMA. Dla i inputPeriod To RowCount outputRange. Cells (i, 1). Wartość outputarray (i) Next i outputRange. Cells (0, 1).Wartość EMA (amp inputPeriod amp) Podobnie jak kod dla SMA, outputarray zostanie wypełniona i komórka powyżej wyjścia będzie reprezentować typ i okres średniej ruchomej. Poniżej znajduje się kod obliczania ważonej średniej kroczącej. WMA ------------------------------------------ ElseIf comboTypeMA. Value Weighted Then Dim temp2 Jako Integer For i inputPeriod To RowCount temp 0 temp2 0 Dla j (i - (inputPeriod - 1)) Do i temp (wejście) temp (j) (j - i inputPeriod) temp2 temp2 (j - i inputPeriod) Następny j outputarray (i ) temp temp2 outputRange. Cells (i, 1). Wartość outputarray (i) Next i outputRange. Cells (0, 1). Wartość WMA (amp inputPeriod amp) End If Poniższa tabela zawiera kroki do obliczenia każdej zmiennej używanej dla Obliczenia WMA. Podobnie jak w poprzednim przykładzie, w tym przypadku są liczby dla parametru inputRange. a okres wejściowy to 3. Poniżej znajduje się ostateczny kod procedury, która rozładowuje formularz użytkownika. Rozładuj MAForm End Sub Poniższa procedura dotyczy przycisku Anuluj. Zostanie dodany w tym samym module. Private Sub buttonCancelClick () Wyładuj MAForm End SubMoving Obliczanie średnie Obliczanie średniej ruchomej Przeprowadzanie średniej obliczenia Próbuję obliczyć średnią ruchomą dla serii danych. Chcę wygenerować średnią ruchomą dla każdego punktu w danych, aby pokazać go na wykresie. W każdym razie, poniżej znajduje się przykład z MS Support. Podążyłem za tym listem, ale moja nie daje średniej ruchomej. Powtarza ten sam punkt danych (pierwszy punkt danych). Więc nie sądzę, że funkcja znajduje datę rozpoczęcia w linii MyRST. Seek, dlatego właśnie zwraca pierwszy punkt danych. W końcu (być może sprawi, że to naprawdę będzie łatwe) Jestem zdezorientowany, jak działają indeksy. Myślałem, że możesz mieć tylko jeden klucz podstawowy, ale najwyraźniej możesz utworzyć wiele ograniczeń pola. Próbowałem to zrobić za pomocą następującego zapytania definicji danych: ALTER TABLE Table1 ADD CONSTRAINT NoDupes UNIQUE (CurrencyType, TransactionDate) Przepraszamy za długość tego wpisu. Doceniam twoją pomoc. Następująca funkcja przykładowa oblicza średnie ruchome na podstawie tabeli z kluczem podstawowym z wieloma polami. Cotygodniowe wartości walut obcych są używane w tym przykładzie. Aby utworzyć przykładową funkcję, wykonaj następujące kroki: Utwórz poniższą tabelę i zapisz ją jako Tabela1: Tabela: Tabela1 --------------------------- -------------- Nazwa pola: CurrencyType Główny typ danych klucza: Rozmiar pola tekstowego: 25 Nazwa pola: TransactionDate Klucz podstawowy Typ danych: Forma daty Format: Data krótka Nazwa pola: Rodzaj danych: Waluta Miejsca dziesiętne: 4 Wyświetl tabelę w widoku arkusza danych i wprowadź następujące wartości: CurrencyType TransactionDate Rate ------------------------------- ------------- Yen 8693 0,0079 Yen 81393 0,0082 Jen 82093 0,0085 Jen 82793 0,0088 Jen 9393 0,0091 Mark 8693 0,5600 Mark 81393 0,5700 Mark 82093 0,5800 Mark 82793 0,5900 Mark 9393 0,6000 Otwórz nowy moduł i wpisz następujące funkcje: Funkcja MAvgs (Periods Integer, StartDate, TypeName) Dim MyDB jako DATABASE, MyRST As Recordset, MySum jako Double Dim i, x Ustaw MyDB CurrentDb () Ustaw MyRST MyDB. OpenRecordset (Table1) On Error Resume Next MyRST. Index PrimaryKey x Periods - 1 ReDim Store (x) MySum 0 For i 0 To x MyRST. MoveFirst MyRST. Seek, TypeName, StartDate Te dwie zmienne powinny być w tej samej kolejności, co pola klucza podstawowego w tabeli. Store (i) MyRSTRate If i lt x Then StartDate StartDate - 7 Tutaj 7 przyjmuje tygodniowe dane 1 dla codziennych danych. Jeśli StartDate lt 8693 Następnie MAvgs Null: Exit Function 8693 zostanie zastąpiony najwcześniejszą datą danych w twojej tabeli. MySum Store (i) MySum Next i MAvgs MySum Periods Funkcja końcowa MyRST. Close Utwórz następującą kwerendę na podstawie tabeli Table1: Query: Query1 --------------------- ---------------------------------- Pole: CurrencyType Pole: TransactionDate Pole: Pole stawki: Expr1: MAvgs (3 , TransactionDate, CurrencyType) UWAGA: To zapytanie wygeneruje trzytygodniową średnią ruchomą danych Rate. Aby obliczyć dłuższą lub krótszą średnią ruchomą, zmień liczbę 3 w kolumnie Zapytania EXTR1 na wartość, którą chcesz obliczyć. Uruchom zapytanie. Zwróć uwagę, że dla każdej waluty widzisz następującą trzytygodniową średnią kroczącą. Wartość Null wskazuje, że nie było wystarczająco dużo wcześniejszych wartości, aby obliczyć średnią tygodniową. CurrencyType TransactionDate Rate Expr1 Mark 080693 0.5600 Mark 081393 0.5700 Mark 082093 0.5800 0.57 Mark 082793 0.5900 0.58 Mark 090393 0.6000 0.59 Yen 080693 0.0079 Yen 081393 0.0082 Yen 082093 0.0085 0.0082 Yen 082793 0.0088 0.0085 Yen 090393 0.0091 0.0088 RE: Przeprowadzka Średnia kalkulacja dhookom (programista) 28 10 czerwca 21:15 Ile lat ma ten kod? Nie robi wyraźnego użytku z DAO i nie wspomina, że ​​to zadziała z połączonymi tabelami. Dim MyDB jako DAO. Database, MyRST jako DAO. Recordset. Chciałbym użyć podzapytania zamiast zestawu rekordów. Może to wyglądać tak: SELECT CurrencyType, TransactionDate, Rate, (SELECT Avg (Rate) FROM Table1 B WHERE A. CurrencyType B. CurrencyType AND A. TransactionDate MIĘDZY B. TransactionDate - 14 AND B. TransactionDate) FROM Table1 A RE: Moving Średnia kalkulacja To jest naprawdę doskonałe. Doceniam twoją pomoc. Jednak kod, który podałeś, oblicza średnią ruchomą z 14-dniowej średniej (umieszczając średnią ruchomą w rekordzie na dzień 1 średniej, gdzie chciałbym, aby była to średnia wsteczna, umieszczona w rejestrze 14). Zmieniłem się nieznacznie w następujący sposób i wygląda na to, że działa SELECT A. CurrencyType, A. TransactionDate, A. Rate, (SELECT Avg (Rate) FROM Table1 B WHERE A. CurrencyType B. CurrencyType AND B. TransactionDate BETWEEN A. TransactionDate - 14 AND A. TransactionDate) AS Expr1 Z tabeli 1 AS A Widzisz, wszystko, co zrobiłem, to wymieniłem A na B w klauzuli where. Jest to dla mnie naprawdę wielka pomoc i naprawdę to doceniam. Nigdy wcześniej nie widziałem takiego kodowania i szczerze mówiąc, naprawdę tego nie rozumiem. Nie wiem, jak SQL rozumie, czym są B i A. Zakładam, że tworzą one jakieś alternatywne odniesienie do Tabeli 1. Jeśli dasz radę, naprawdę to doceniam. Ponadto, być może jakieś odniesienie do materiału, na który mogłem spojrzeć, zawsze jestem bardzo podekscytowany, aby dowiedzieć się czegoś nowego o VBASQL, i naprawdę doceniam twoją pomoc. RE: Przenoszenie średniej kalkulacji PHV (MIS) 29 czerwca 10 12:22 rozumie, co B i A czy są to pseudonimy RE: Przenoszenie średniej kalkulacji Dziękujemy, PHV. Ma to sens już teraz RE: Przeprowadzka Średnia kalkulacja joshery420 (TechnicalUser) 6 lipca 10 15:06 Wow, nigdy nie patrzyłem na widok SQL wcześniej. Niezwykle pomocny. Staram się, aby ten kod działał w moim własnym zbiorze danych i utknąłem na jednym konkretnym problemie. pd2004, nie jestem pewien, czy nowy kod podkwerekcji działa tak samo jak twój stary kod VBA, czy nie, ale z moimi danymi nadal pokazuje średnią kroczącą, nawet jeśli nie ma wystarczającej liczby dni, aby utworzyć taką długość średniej. na przykład Jeśli Im wykonuje 7-dniową średnią kroczącą, dzień 1 pokazuje te same dane w kolumnie 7DayAvg, tak jak ma to miejsce w kolumnie danych dziennych. Dzień 2 pokazuje średnią dni 1 i 2 itd. Czy któryś z was wie, jak to naprawić przez przypadek Również dzięki za świetny poradnik PHV. RE: Przeprowadzka Średnia kalkulacja joshery420 (TechnicalUser) 6 lipca 10 15:08 Woops, ma na celu podziękować dhookom za wskazówkę dotyczącą kodu, a nie PHV. Ale hej, dzięki wam obojgu. XD RE: Przenoszenie średniej kalkulacji Zostawię najlepsze rozwiązania dla profesjonalistów tutaj, ale możesz zobaczyć w moim oryginalnym wpisie, jak przykład pomocy Microsoft próbuje sobie z tym poradzić. Oto kod: Jeśli StartDate lt 8693 Następnie MAvgs Null: Exit Function 8693 zostanie zastąpiony najwcześniejszą datą danych w twojej tabeli. Po prostu wychodzą z funkcji, jeśli data nie spełnia kryteriów. Nie wiem, czy mógłbyś włączyć coś takiego do kodu aliasów dostarczonego przez dhookem. Nie podoba mi się sposób ich obsługi i podejrzewam, że dhookem zapewni znacznie bardziej eleganckie rozwiązanie. Dla moich celów problem, który opisujesz, nie jest problemem, ale będę zainteresowany znalezieniem rozwiązań. RE: Moving Average Calculation dhookom (Programmer) 6 lipca 10 17:05 Możesz spróbować użyć IIf (), aby przetestować liczbę rekordów. Uwaga: nieprzetestowany kod notatnika: SELECT A. CurrencyType, A. TransactionDate, A. Rate, IIF ((SELECT Count (Rate) FROM Table1 C WHERE A. CurrencyType C. CurrencyType AND C. TransactionDate MIĘDZY A. TransactionDate - 14 AND A. TransactionDate) 7 (SELECT Avg (Rate) FROM Table1 B WHERE A. CurrencyType B. CurrencyType AND B. TransactionDate MIĘDZY A. TransactionDate - 14 AND A. TransactionDate), Null) AS Expr1 FROM Table1 AS A RE: Moving Average Calculation

No comments:

Post a Comment