Monday 6 February 2017

Gleitender Durchschnitt C Scharf

Um eine asymptotische Leistung von O (n) zu erreichen (wie die handkodierte Lösung tut), können Sie die Aggregate-Funktion wie in verwenden. Der akkumulierte Wert (implementiert als anonymer Typ) enthält zwei Felder: Ergebnis enthält die Ergebnisliste aufbauen bisher. Das Arbeiten enthält die letzten Perioden-1 Elemente. Die Aggregatfunktion fügt den aktuellen Wert der Arbeitsliste hinzu, baut den aktuellen Durchschnitt auf und fügt sie dem Ergebnis hinzu und entfernt dann den ersten (d. H. Ältesten) Wert aus der Arbeitsliste. Das Saatgut (d. h. der Anfangswert für die Akkumulation) wird aufgebaut, indem die ersten Perioden-1-Elemente in die Arbeits-und Initialisierungsergebnis zu einer leeren Liste gebracht werden. Folglich beginnt die Aggregation mit der Elementperiode (durch Überspringen (Perioden-1) - Elemente am Anfang). In der Funktionsprogrammierung ist dies ein typisches Verwendungsmuster für die Aggregat - (oder Falz-) Funktion, btw. Die Lösung ist nicht funktional sauber, da die gleichen Listenobjekte (Arbeit und Ergebnis) in jedem Schritt wiederverwendet werden. Im nicht sicher, wenn das Probleme verursachen könnte, wenn einige zukünftige Übersetzer versuchen, die Aggregate-Funktion automatisch zu parallellisieren (auf der anderen Seite Im auch nicht sicher, ob das möglich ist, nachdem alle.). Eine rein funktionale Lösung sollte bei jedem Schritt neue Listen anlegen. Beachten Sie außerdem, dass C keine leistungsfähigen Listenausdrücke aufweist. In einigen hypothetischen Python-C-gemischten Pseudocode könnte man die Aggregationsfunktion schreiben, die in meiner bescheidenen Meinung ein wenig eleganter wäre :) Beachte die Laufzeit von O (n2). Da Sie bei jedem Schritt immer mehr Elemente überspringen müssen (und afaik Skip (i) I mal IEnumerator. MoveNext aufrufen muss). Siehe meine Antwort für eine Lösung in O (n) Zeit. (Ich habe gerade bemerkt, der OP-Kommentar unten, dass heshe wird möglicherweise die Werte aus einer SQL-DB in der Zukunft. In diesem Fall würde ich jede starke entmutigen von dieser Lösung) ndash MartinStettner Mar 3 11 at 0:53 Für die effizienteste Art und Weise möglich Um einen Moving Average mit LINQ zu berechnen, sollten Sie LINQ nicht verwenden Ich schlage vor, eine Helper-Klasse zu erstellen, die einen gleitenden Durchschnitt auf eine möglichst effiziente Weise berechnet (mit einem kreisförmigen Puffer und einem kausalen gleitenden Durchschnittsfilter) und dann eine Erweiterungsmethode Zu LINQ. First up, der gleitende Durchschnitt Diese Klasse bietet eine sehr schnelle und leichte Implementierung eines MovingAverage-Filters. Es erzeugt einen kreisförmigen Puffer der Länge N und berechnet eine Addition, eine Subtraktion und eine Multiplikation pro angehängten Datenpunkt, im Gegensatz zu den N Multiplikations-Adds pro Punkt für die Brute-Force-Implementierung. Die oben genannten Erweiterungsmethoden wickeln die MovingAverage-Klasse und ermöglichen die Einfügung in einen IEnumerable-Stream. Um dies in einer funktionalen Weise zu tun, benötigen Sie eine Scan-Methode, die in Rx, aber nicht in LINQ. Lets schauen, wie es aussehen würde, wenn wed haben eine Scan-Methode Und heres die Scan-Methode, genommen und angepasst von hier: Dies sollte eine bessere Leistung als die Brute-Force-Methode haben, da wir eine laufende Summe verwenden, um die SMA berechnen. Um zu beginnen, müssen wir die erste Periode berechnen, die wir hier Samen nennen. Dann wird jeder nachfolgende Wert aus dem akkumulierten Samenwert berechnet. Dazu benötigen wir den alten Wert (das ist t-delta) und der neueste Wert, für den wir die Serie reihen, einmal von Anfang an und einmal durch das Delta verschoben. Am Ende führen wir einige Bereinigung durch Hinzufügen von Nullen für die Länge der ersten Periode und das Hinzufügen der anfänglichen Seed-Wert. Ich habe eine 4000-Menge-Daten der Aktie und tring, um den gleitenden Durchschnitt für alle Datenwerte zu berechnen, aber da der gleitende Durchschnitt auf früheren Daten basiert und ich kann nicht berechnen, die 15-Tage-SMA für die erste 14 Tage, überspringen Sie die ersten 14 Tage und berechnen die SMA auf den Rest der Daten. Und es ist zu LINQ verwenden, um zu erreichen. Kann jemand eine Probe geben oder Hinweis, wie man mit LINQ zu berechnen gleitenden Durchschnitt Die Ausgabe für die durchschnittlichen Werte sind alle um 500s Ich wirklich nicht verstehen, wie ist, dass möglich, dass hohe Wert zu bekommen. Verschieben Mittelwertbildner mit Summen-Array: 06072012 562,49 571,72 06082012 565,84 580,32 06112012 568,56 571,17 06122012 569,55 576,16 06132012 570,56 572,16 06142012 570,63 571,53 06152012 571,21 574,13 06182012 572,78 585,78 06192012 573,79 587,41 06202012 574,23 585,74 06212012 574,22 577,67 06222012 575,63 582,10 06252012 576,06 570,77 06262012 576,68 572,03 06272012 576,88 574,50 06.282.012 576,7 569,05 06.292.012 576,95 584,00 578,37 592,52 07.022.012 07.032.012 579,92 599,41 581,74 599,41 07.032.012 Herausgegeben von Leemx Freitag, 16. November 2012 02.59 Gerührt von Lisa Zhu Microsoft Kontingent Personal Montag, 19. November 2012 07.38 Linq (von : Visual C General) Um einen gleitenden Durchschnitt zu erstellen, würde ich zunächst einen Bereich von 0 bis (Länge der Datenliste - Länge der bewegten Periode) und dann für jeden Wert im Bereich erstellen Elemente x bis x 43 Länge der Bewegungsperiode auswählen und den Mittelwert berechnen. in einer schönen LINQ-Anweisung All: Beachten Sie, dass dies nicht sehr effizient ist, da man im Grunde über die Datenliste iterieren für jeden Wert im Bereich .. Hey, schauen Dieses System ermöglicht Unterschriften von mehr als 60 cha Herausgegeben von Arno Brouwer Freitag November 23, 2012 4:42 PM Als Antwort markiert von Alexander Sun Friday, December 07, 2012 4:41 PM Alle Antworten Eine Probe Ihrer LINQ-Anweisung würde helfen. quotPremature Optimierung ist die Wurzel allen evil. quot - Knuth einen gleitenden Durchschnitt zu erstellen, würde ich beginnen mit einem Bereich von 0 bis zu schaffen (Länge der Datenliste - Länge bewegter Zeit), dann für jeden Wert im Bereich von Auswahlelementen x Bis x 43 Länge der Bewegungsperiode und berechnen den Durchschnitt. in einer schönen LINQ-Anweisung All: Beachten Sie, dass dies nicht sehr effizient ist, da man im Grunde über die Datenliste iterieren für jeden Wert im Bereich .. Hey, schauen Dieses System ermöglicht Unterschriften von mehr als 60 cha Herausgegeben von Arno Brouwer Freitag November 23, 2012 4:42 PM Als Antwort markiert von Alexander Sun Freitag, den 07. Dezember 2012 um 04:41 Uhr Microsoft führt eine Online-Umfrage durch, um Ihre Meinung über die Msdn-Website zu verstehen. Wenn Sie sich für eine Teilnahme entscheiden, wird Ihnen die Online-Umfrage präsentiert, wenn Sie die Msdn-Website verlassen. Möchten Sie teilnehmen Helfen Sie uns, MSDN zu verbessern. Besuchen Sie unsere UserVoice-Seite zum Übermitteln und Abstimmen auf Ideen Dev-Center LernressourcenIch möchte die Berechnung für Aktienkurs gleitenden Durchschnitt zu entwickeln. Aber viel komplexe Berechnung wurden später geplant. Mein erster Schritt zu wissen, wie man Moving Average effizient zu berechnen. Ich muss wissen, wie die Input-und Return-Ausgang effizient zu nehmen. Als Eingabe Datum und Preis. Ausgegebenes Datum, Preis und gleitender Durchschnitt. Wenn ich 500 Datensätze haben und ich berechnen wollen Moving Durchschnitt für 5 Tage, was ist der effient Weg anstatt hin und her in das Array von Datum und Preis wieder bitte sugest, was ist der beste Weg, um Eingang (ArrayList, Tabelle, Array Etc) und Ausgang zurück. Anmerkung: Der heutige MA von 5 Tagen wird der Durchschnitt der letzten 5 Tage einschließlich heute Preis sein. Gestern ist MA durchschnittlich der letzten 5 Tage von gestern. Ich möchte die Tage halten, um flexibel zu sein anstatt 5 könnte es 9, 14, 20 etc. sein. Wenn Sie einfache Berechnung ohne Ihre Bemühung benötigen, als Sie TA-Lib verwenden können. Aber wenn Sie wollen, dass Ihre Rechnung effizienter ist als TA-Lib, dann können Sie Ihre eigene technische Indikator erstellen. TA-Lib ist groß, aber Problem ist, dass diese Bibliothek nur statische Methoden haben. Das bedeutet, wenn Sie SMA-Array-Werte auf Basis von 500 Preisleisten berechnen müssen, dann werden Sie das gesamte Array von Balken senden und es wird Array von SMA-Werten zurückgeben. Aber wenn Sie neue 501-st-Wert erhalten, dann sollten Sie wieder das gesamte Array und TA-Lib wieder berechnen und zurückgeben SMA-Array von Werten. Stellen Sie sich jetzt vor, Sie brauchen einen solchen Indikator für den realen Preis, und für jede Preisänderung benötigen Sie einen neuen Indikatorwert. Wenn Sie einen Indikator nicht ein großes Problem haben, aber wenn Sie Hunderte Indikatoren arbeiten, könnte es ein Leistungsproblem sein. Ich war in einer solchen Situation und beginnen die Entwicklung von Echtzeit-Indikatoren, die effizient sind und zusätzliche Berechnungen für neue Preisleiste oder für geänderte Preisleiste nur. Leider habe ich nie benötigt SMA-Indikator für meine Handelssysteme, aber ich habe solche für EMA, WMA, AD, und andere. Ein solcher Indikator AD ist in meinem Blog veröffentlicht und Sie können von dort sehen, was ist die grundlegende Struktur meiner Echtzeit-Indikator-Klasse. Ich hoffe, Sie benötigen kleine Änderungen, um SMA-Indikator zu implementieren, denn ist einer der einfachsten. Die Logik ist einfach. Zur Berechnung von SMA benötigen Sie nur die letzten Preiswerte. So Klasse Instanz haben Sammlung von Preisen, die Speicherung halten nur letzte n Anzahl der Preise als SMA definiert ist (in Ihrem Fall 5). Also, wenn Sie neue Bar haben, werden Sie älteste entfernen und neue hinzufügen und erstellen Berechnung. Donnerstag, 10. April 2008 16:04 Alle Antworten Es gibt eine Bibliothek namens TA-Lib, die alles für Sie erledigt und es ist Open Source. Es hat etwa 50 Indikatoren denke ich. Weve verwendet es in der Produktionsumgebung, und es ist sehr effizient und realible. Sie können es in C, Java, C, etc. verwenden. Wenn Sie einfache Berechnung ohne Ihren Aufwand benötigen, als Sie TA-Lib verwenden können. Aber wenn Sie wollen, dass Ihre Rechnung effizienter ist als TA-Lib, dann können Sie Ihre eigene technische Indikator erstellen. TA-Lib ist groß, aber Problem ist, dass diese Bibliothek nur statische Methoden haben. Das bedeutet, wenn Sie SMA-Array-Werte auf Basis von 500 Preisleisten berechnen müssen, dann werden Sie das gesamte Array von Balken senden und es wird Array von SMA-Werten zurückgeben. Aber wenn Sie neue 501-st-Wert erhalten, dann sollten Sie wieder das gesamte Array und TA-Lib wieder berechnen und zurückgeben SMA-Array von Werten. Stellen Sie sich jetzt vor, Sie brauchen einen solchen Indikator für den realen Preis, und für jede Preisänderung benötigen Sie einen neuen Indikatorwert. Wenn Sie einen Indikator nicht ein großes Problem haben, aber wenn Sie Hunderte Indikatoren arbeiten, könnte es ein Leistungsproblem sein. Ich war in einer solchen Situation und beginnen die Entwicklung von Echtzeit-Indikatoren, die effizient sind und zusätzliche Berechnungen für neue Preisleiste oder für geänderte Preisleiste nur. Leider habe ich nie benötigt SMA-Indikator für meine Handelssysteme, aber ich habe solche für EMA, WMA, AD, und andere. Ein solcher Indikator AD ist in meinem Blog veröffentlicht und Sie können von dort sehen, was ist die grundlegende Struktur meiner Echtzeit-Indikator-Klasse. Ich hoffe, Sie benötigen kleine Änderungen, um SMA-Indikator zu implementieren, denn ist einer der einfachsten. Die Logik ist einfach. Zur Berechnung von SMA benötigen Sie nur die letzten Preiswerte. So Klasse Instanz haben Sammlung von Preisen, die Speicherung halten nur letzte n Anzahl der Preise als SMA definiert ist (in Ihrem Fall 5). Also, wenn Sie neue Bar haben, werden Sie älteste entfernen und neue hinzufügen und erstellen Berechnung. Ich würde den gleitenden Durchschnitt in der Datenbank über eine gespeicherte Prozedur oder in einem Cube berechnen. Haben Sie sich Analysis Services angesehen, hat es die Möglichkeit, gleitende Mittelwerte zu berechnen. Donnerstag, 10. April 2008 16:05 Ja. TA-LIB ist gut, aber vielleicht nicht geeignet für mich. Wenn ich neuen Wert oder aktualisierten Wert für die Geschichte der Datensätze Ich werde die Berechnung in einer separaten Funktion nur für das neue Angebot und speichern Sie es in der Datenbank. Ich plane, das Zitat jede Stunde zu aktualisieren. Ich muss etwa 25 bis 30 technische Indikatoren für 2200 Aktien machen. Die Ausführungszeit eines TA-Lib-Aufrufs auf einem Array von 10000 Elementen beträgt etwa 15 Millisekunden (auf einem Intel Core Duo 2,13 Ghz). Dies ist der Durchschnitt aller Funktionen. Unter den schnellsten, nimmt SMA weniger als 2,5 Millisekunden. Der langsamste HTTRENDMODE benötigt 450 Millisekunden. Mit weniger Elementen ist es schneller. SMA benötigt ca. 0,22 Millisekunden für 1000 Eingangselemente. Die Geschwindigkeitsverstärkung ist fast linear (der Aufwand für die Ausführung des Funktionsaufrufs ist vernachlässigbar). Im Rahmen Ihrer Bewerbung ist TA-Lib höchstwahrscheinlich Ihr Engpass für die Geschwindigkeitsleistung. Auch ich in der Regel nicht empfehlen, solche quotlast nquot Lösung. Lesen Sie unten für Details. Zuerst eine Korrektur zur Boban. s-Anweisung Alle Funktionen in TA-Lib können auch einen einzigen letzten Wert berechnen, indem sie ein Minimum an Quell-nquot-Elementen verwenden. Sie können ein Array der Größe 10000 haben, die Daten nur für die ersten 500 Elemente initialisieren, ein Element hinzufügen und TA-Lib aufrufen, um die SMA nur für das neue Element zu berechnen. TA-Lib schaut nicht mehr als nötig (wenn SMA von 5, dann wird TA-Lib ein einzelnes SMA mit den letzten 5 Werten berechnen). Dies wird mit dem Parameter startIdx und endIdx ermöglicht. Sie können einen zu berechnenden Bereich oder einen einzelnen Wert angeben. In diesem Szenario würden Sie startIdx endIdx 500 machen, um das 501st-Element zu berechnen. Warum ist solch eine Quell-nquot-Lösung für einige gefährlich? Unabhängig von der Auswahl der Boban. s-Lösung oder TA-Lib bedenkt man, dass die Verwendung einer kleinen endlichen Anzahl von vergangenen Daten nicht gut funktioniert mit den meisten TA-Funktionen. Mit SMA, ist es offensichtlich, dass Sie nur n Element benötigen, um einen Durchschnitt über n Element zu berechnen. Es ist nicht so einfach mit EMA (und vielen anderen TA-Funktionen). Der Algo hängt oft vom vorherigen Wert ab, um den neuen Wert zu berechnen. Die Funktion ist rekursiv. Das bedeutet, dass alle vergangenen Werte einen Einfluss auf zukünftige Werte haben. Wenn Sie sich entscheiden, Ihr algo zu verwenden, um nur eine kleine Menge von Vergangenheit n Wert verwenden, erhalten Sie nicht das gleiche Ergebnis wie jemand, der über eine große Anzahl von vergangenen Werten berechnet. Die Lösung ist ein Kompromiss zwischen Geschwindigkeit und Präzision. Ich habe dies oft im Zusammenhang mit TA-Lib diskutiert (ich nenne es die quotquellierbare Periodquot in der Dokumentation und Forum). Um es einfach zu halten, meine allgemeine Empfehlung ist, wenn Sie nicht den Unterschied zwischen einem Algo mit einer endlichen Impulsantwort (FIR) aus einem Algo mit einer unendlichen Impulsantwort (IIR) machen können, werden Sie sicherer zu berechnen, über alle Daten, die Sie haben erhältlich. TA-Lib spezifizieren im Code, welche seiner Funktionen eine instabile Periode (IIR) haben. Bearbeitet von mfortier Freitag, 15. August 2008 04:25 Richtig english sentence Freitag, 15. August 2008 04:20


No comments:

Post a Comment