Mit Gewicht Vektor Ich meine den Vektor mit Gewichten, die Sie haben, um die Beobachtungen in das Fenster, das gleitet über Ihre Daten mit so, wenn Sie diese Produkte zusammen addieren, gibt es den Wert der EMA auf der rechten Seite des Fensters. Für einen linear gewichteten gleitenden Durchschnitt ist die Formel für das Finden des Gewichtsvektors: (1: n) Summe (1: n) (im R-Code). Diese Reihe von Länge n fügt bis zu 1. Für n10 wird es sein 0.01818182 0.03636364 0.05454545 0.07272727 0.09090909 0.10909091 0.12727273 0.14545455 0.16363636 0.18181818 die Zahlen 1 bis 10 55, mit 55 die Summe der Zahlen 1 bis 10. Wie berechnen Sie den Gewicht Vektor Für einen exponentiellen gleitenden Durchschnitt (EMA) der Länge n, wenn n die Länge des Fensters ist, dann alphalt-2 (n1) und ilt-1: n so EmaWeightVectorlt - ((alpha (1-alpha) (1-i) ) Ist das richtig Auch wenn die EMA nicht wirklich auf ein Fenster mit einem Anfang und einem Ende beschränkt ist, sollten nicht die Gewichte bis zu 1 genau wie bei der LWMA Danke Jason, irgendwelche Hinweise, wie man den EMA-Filter auf jede gewünschte Präzision zu approximieren Durch Annäherung an einen lang genug FIR-Filter Es gibt ein Perl-Skript auf en. wikipedia. orgwikihellip, die das Bild des EMA-Gewichtsvektors gemacht hat, aber ich verstehe es nicht: Wenn sie die Anzahl der Gewichte auf 15 setzen, warum gibt es dort 20 Rot Stäbe statt 15 ndash MisterH Dez 19 12 bei 22: 40Stock-Markt-Investing: Moving-Mittelwerte (SMA, EMA, MACD) Dies ist eine Referenzseite von dem, was ich über Bewegungsdurchschnitte in Börseninvestitionen kenne. Dazu gehören einfache gleitende Durchschnitte. Exponentielle gleitende Durchschnitte. Und wie man diese Daten verwendet, um den Kauf und Verkauf von Aktien zu unterstützen. Ich berühre auch MACD. Hintergrund Im Allgemeinen glaube ich an einen Warren Buffett Stil zu investieren, wo Sie: Denken Sie über den Kauf einer Aktie, als ob Sie gehen, um das gesamte Geschäft zu kaufen Sie basieren Ihre Kaufentscheidung über den Wert der Aktie Wenn Sie das tun, halten Sie die Lager für immer Die Theorie ist, dass von Zeit zu Zeit eine Aktie aus der Gunst mit der Börse fallen wird, und wenn ihr Preis zu einem bestimmten Tiefpunkt kommt, wird es ein Wert zu kaufen. Du kannst an diese Strategie denken, wie es ist, ein neues Auto zu kaufen. Wenn Sie ein neues Auto kaufen, wenn seine erste eingeführt, und das Modell ist sehr beliebt, wird der Händler wird eine Menge Geld für sie wollen. Umgekehrt, wenn Sie warten und kaufen, dass Modell 11 Monate später, wenn das nächste neue Modell ist in Kürze kommen youll in der Lage sein, das gleiche Auto für einen viel niedrigeren Preis zu kaufen. Ich erwähne dies, weil ich im Begriff bin, über gleitende Durchschnitte zu schreiben. Und gleitende Durchschnitte haben nichts mit einem Warren Buffett Stil zu investieren zu tun. Durchgehende Durchschnitte können gut für Leute sein, die viel Trades machen, und sie können auch verwendet werden, um Decken - und Bodenpreise von Aktien zu identifizieren. Eine wichtige Idee ist, dass der Bodenpreis einer Aktie mit einem gleitenden Durchschnitt verwendet werden kann, um einen Stop-Loss auf einer Aktie zu setzen. Weil ich im Allgemeinen dem Buffett-Stil des Investierens folge, verwende ich keine gleitenden Durchschnitte als Hauptwerkzeug, aber ich weiß gern, wie sie arbeiten, und ich benutze sie als eine Möglichkeit, meine andere Forschung zu unterstützen. Vor kurzem habe ich festgestellt, dass sie nett sind, weil ich auf eine Reihe von Ausgängen von Finviz oder anderen Seiten schauen kann und sehe, dass die 20 Tage SMA für eine Aktie 2,8 ist. Das sagt mir auf einen Blick, dass der Aktienkurs hochkommt. Denn ich benutze keine gleitenden Durchschnitte viel, diese Seite ist nicht ganz gründlich. Bitte beachten Sie die Investopedia Seiten, auf die ich mich für weitere Informationen verständige. Das ist nur eine Erinnerungsseite für mich. Angesichts dieses Hintergrundes, Heres, was ich über Bewegungen im Durchschnitt weiß. Definition: Was ist ein einfacher Moving Average (SMA) Mit ein paar Bearbeitungen von mir, Investopedia definiert SMA wie folgt: Ein einfacher gleitender Durchschnitt (SMA) ist ein arithmetisches Mittel, das durch Hinzufügen des Schlusskurses der Sicherheit für eine Anzahl von berechnet wird Zeiträume und dann diese Summe durch die Anzahl der Zeiträume dividiert. Kurzfristige Mittelwerte reagieren schnell auf Veränderungen des Kurses des Basiswertes, während Langzeitdurchschnitte langsam zu reagieren sind. Später geht es weiter: Mit anderen Worten: Dies ist der durchschnittliche Aktienkurs über einen bestimmten Zeitraum. Beachten Sie, dass jeder Tagespreis gleiche Gewichtung gegeben wird. Ein Nachteil eines SMA ist, dass es jedem Gewicht, der zur Berechnung seines Wertes verwendet wird, gleichgewichtig ist. Also in einer 20-tägigen SMA hat der Aktienkurs ab 20 Tagen das gleiche Gewicht wie der Preis gestern. Für einige Zwecke ist es sinnvoller, wenn der jüngste Preis ein höheres Gewicht hat (mehr Wert), und als Ergebnis haben die Menschen die EMAs erfunden. Definition: Was ist ein Exponential Moving Average (EMA) Diese Investopedia Seite beschreibt EMA wie folgt: Ein exponentieller gleitender Durchschnitt (EMA) ist eine Art von gleitenden Durchschnitt, der ähnlich einem einfachen gleitenden Durchschnitt ist, außer dass mehr Gewicht auf die neuesten gegeben wird Daten. Sie fügen später hinzu: Diese Art von gleitendem Durchschnitt reagiert schneller auf aktuelle Preisänderungen als ein SMA. Die 12- und 26-Tage-EMAs sind die beliebtesten Kurzzeitdurchschnitte, und sie werden verwendet, um Indikatoren wie die gleitende durchschnittliche Konvergenzdivergenz (MACD) und den prozentualen Preisoszillator (PPO) zu erzeugen. EMA Vorteile gegenüber SMAs: EMAs reagieren schneller auf Preisänderungen als SMAs. Zurück nach obenVorteile der gleitenden Durchschnitte (MA) Die allgemeinen Vorteile der MA-Werte sind die Gründe, die sie haben: Sie filtern das Lärm der Aktienkursschwankungen aus. Sie zeigen Trends. Kurzfristige SMAs (5 bis 20 Tage) zeigen kurzfristige Trends und langfristige SMAs (20 bis 200 Tage) zeigen langfristige Trends. Eine aufsteigende MA zeigt einen Aufwärtstrend (Preiserhöhung oder Stier) an. Ein fallendes MA zeigt einen Abwärtstrend an (Preisabnahme oder Bär). Längere SMAs können Unterstützung zeigen, was der niedrigste Preis eines Bestandes theoretisch sein sollte, d. h. seinen Boden. Andere Werkzeuge, die Ill bald erklären, einschließlich Crossover, Decken und Fußböden. Zurück nach obenDie Vorteile der Verwendung von gleitenden Durchschnitten Bevor Sie in die Verwendung von gleitenden Durchschnitten kommen, um Aktien zu kaufen und zu verkaufen, ist es wichtig zu wissen, dass sie einige Nachteile haben: Sie basieren nur auf historischen Daten (Trends). Sie sind nicht wirklich prädiktiv. Sie sind nur gut mit starken Trends, die nach oben oder unten gehen. Sie sind nicht sinnvoll, wenn ein Aktienkurs seitwärts geht. Sie können falsche Positives bekommen, besonders wenn Sie kürzere Zeitrahmen betrachten. Diese Aussagen werden mehr Sinn machen, wie ich erkläre, wie Händler die gleitenden Durchschnitte verwenden. Verwendung: Trends anzeigen Bewegliche Mittelwerte können verwendet werden, um Trends zu zeigen. Ihr Wert in dieser Hinsicht ist, dass sie glätten den Lärm, wenn ein Bestand ist ein wenig flüchtig. Verwendung: Kauf und Verkauf von Signalen (Crossover und Trends) Preis Crossover Einige Investoren verwenden gleitende Durchschnitte, um nach dem Kauf und Verkauf von Signalen zu suchen. In der einfachsten Form, wenn ein täglicher Aktienkurs über oder unter einem gleitenden Durchschnitt bewegt, wird dies als Preisübergang bezeichnet, und es kann ein Buysell-Signal angeben: Wenn der Aktienkurs unter einen gleitenden Durchschnitt verschoben wird, kann er eine Zeit zum Verkauf angeben . Wenn sich der Aktienkurs über einen gleitenden Durchschnitt bewegt, kann er eine Zeit zum Kauf angeben. Wenn mehrere bewegte Durchschnitte kreuzen Ein anderes Signal ist, wenn ein kurzfristiger gleitender Durchschnitt über einen langfristig gleitenden Durchschnitt kreuzt: Wenn die kürzere MA über die längere MA kreuzt, ist dies ein Kaufsignal und ist als goldenes Kreuz markiert. Wenn die kürzere MA unterhalb der längeren MA kreuzt, ist dies ein Verkaufssignal und wird als Todeskreuz bezeichnet. Drei SMA-Signale Dieses Beispiel von Yahoo Finance für Volkswagen zeigt drei SMA-Signale und wie ihre Crossover verwendet werden könnten, um VLKAY zu kaufen und zu verkaufen. Beachten Sie, dass ich in der Regel eine rote Farbe verwenden, um den kürzesten Zeitrahmen (seine heiße), eine gelbe Farbe für den mittelfristigen Zeitrahmen und eine blaue Farbe für die längste Zeitspanne (seine cool) zu zeigen: SMA Signal vs EMA Signal Dies Das zweite Beispiel zeigt, wie ein SMA-20 im Vergleich zu einem EMA-20 für VLKAY aussieht: Wie ich schon erwähnt habe, kaufe ich nicht wirklich Aktien so, also bin ich kein Experte auf welcher Zeitspanne am besten ist. Zum Beispiel kann es besser sein, eine kurze EMA (20 Tage) gegen eine längere SMA (50 Tage) zu verwenden. Eine Aktie gilt als Aufwärtstrend, wenn (a) der aktuelle Preis über einem gleitenden Durchschnitt liegt und (b) der Durchschnitt nach oben geneigt ist. Back to topUse: Unterstützung und Widerstand (Decken und Fußböden) Diese Investopedia-Seite bietet diese Definitionen der Unterstützung und des Widerstands in Bezug auf gleitende Durchschnitte: Unterstützung wird festgestellt, wenn ein Preis nach unten tendiert. Es gibt einen Punkt, an dem der Verkaufsdruck nachlässt und Käufer bereit sind, einzutreten. Mit anderen Worten, ein Boden ist etabliert. Resistance passiert, wenn ein Preis nach oben tendiert. Es kommt ein Punkt, wenn die Kaufkraft abnimmt und die Verkäufer eintreten. Das ist eine Decke. Die Theorie ist, dass Aktien in der Regel aus dem Boden oder Decke hüpfen, aber es ist wichtig zu wissen, dass dies nicht immer der Fall ist. Die 200-Tage-SMA scheint allgemein als Decke und Boden verwendet zu werden. Verwendung: Lager-Screener In den letzten Monaten habe ich gleitende Durchschnitte als Aktie mit der Barchart-Website verwendet. Dieses Bild zeigt, wie Barchart VLKAY gerade zeigt (24. April 2016): Wie Sie sehen können, zeigt Barchart auf einer Seite eine Vielzahl von Stocksignalen. Ich persönlich kaufe oder verkaufe nichts, indem ich diese Seite betrachte, aber ich benutze sie als Signal oder als Screener. Volkswagen ist auf meinem Radar, weil sie gefunden wurden, um Betrüger auf ihre Emissionsprüfungen letzter Sommerfall zu sein, die ihren Vorrat tranken. Also meine aktuellen Interessen sind: Wird der Aktienkurs zurückkommen Wenn ja, kommt es jetzt zurück Diese Signale geben mir einen Hinweis in Bezug auf diese zweite Frage. Moving Average ConvergenceDivergenceDivergence (MACD) Schnelle Zusammenfassung Ich benutze MACD nicht sehr oft und ich bin kein Experte auf die Verwendung, aber hier sind einige schnelle Notizen: Wenn MACD positiv ist, liegt der kurzfristige Durchschnitt über dem langfristigen Durchschnitt. Dies zeigt aufwärts Preisdynamik (Preis steigt). Ein negativer Wert zeigt an, dass der aktuelle Impuls nach unten geht. Ein Umzug über Null kann einen Kauf anzeigen, und ein Umzug unter Null kann auf einen Verkauf hinweisen. MACD kann auch mit einer Signalleitung verwendet werden. Aber das habe ich noch nicht benutzt. MACD Details MACD ist komplizierter als mit einfachen gleitenden Durchschnitten, aber sobald Sie es verstehen, hilft es, Trends besser zu zeigen, als gleitende Mittelwerte allein. (Ich bin noch kein MACD-Experte, da ich in der Regel keine Trades auf diesen Theorien basiere, die ich sie nur benutzt habe, um meine andere Forschung zu unterstützen.) Diese Investopedia-Seite definiert MACD so: MACD ist ein Trend-Impuls-Indikator, der die zeigt Verhältnis zwischen zwei gleitenden Durchschnittswerten. Die MACD wird (üblicherweise) berechnet, indem sie den 26-Tage-exponentiellen gleitenden Durchschnitt (EMA) von der 12-tägigen EMA subtrahiert. Diese Investopedia Seite beschreibt es ein wenig besser: Das Konzept hinter dem MACD ist ziemlich einfach. Im Wesentlichen berechnet es den Unterschied zwischen einem Instrument 26-Tage und 12 Tage exponentielle gleitende Durchschnitte (EMA). Von den beiden gleitenden Durchschnitten, die den MACD ausmachen, ist die 12-tägige EMA offensichtlich die schnellere, während der 26-Tage langsamer ist. Sie gehen auf dieser Seite weiter: Auf dem MACD-Chart ist auch eine neun-tägige EMA des MACD selbst aufgetragen und dient als Auslöser für Kauf - und Verkaufsentscheidungen. Der MACD erzeugt ein zinsbullisches Signal, wenn es sich über seine eigene neun-tägige EMA bewegt, und es sendet ein Verkaufsschild, wenn es unter seinem neun-Tage-EMA bewegt. Sie müssen wirklich auf Diagramme zu verstehen, um MACD zu verstehen, also schlage ich vor, diese beiden Links zu betrachten. Weitere Anmerkungen aus dem ersten Link: Crossovers - Wenn der MACD unter die Signalleitung fällt, ist es ein bärisches Signal, was darauf hinweist, dass es Zeit zum Verkauf sein kann. Umgekehrt, wenn der MACD über die Signalleitung steigt, gibt der Indikator ein zinsbullisches Signal, was darauf hindeutet, dass der Preis des Vermögenswertes wahrscheinlich eine Aufwärtsbewegung erfahren wird. Viele Händler warten auf ein bestätigtes Kreuz über der Signalleitung, bevor sie in eine Position eintreten, um zu vermeiden, dass sie sich zu früh auskommt oder in eine Position eintritt, wie es der erste Pfeil zeigt. Divergenz - Wenn der Sicherheitspreis vom MACD abweicht. Es signalisiert das Ende des aktuellen Trends. Dramatischer Aufstieg - Wenn der MACD dramatisch ansteigt - das heißt, der kürzere gleitende Durchschnitt zieht sich von dem längerfristigen gleitenden Durchschnitt ab - es ist ein Signal, dass die Sicherheit überkauft ist und bald wieder normal wird. Die Popularität der MACD ist vor allem auf ihre Fähigkeit zu helfen, schnell erkennen, kurzfristige Dynamik. Viele Händler werden auf einen kurzfristigen gleitenden Durchschnitt achten, um über einen längerfristigen gleitenden Durchschnitt zu überqueren und damit eine zunehmende Aufwärtsbewegung zu signalisieren. Diese bullische Crossover deutet darauf hin, dass der Preis vor kurzem mit einer schnelleren Rate steigt, als es in der Vergangenheit hat, also ist es ein allgemeines technisches Kaufzeichen. (Betrachten des Graphen auf diesem Link) Beachten Sie, wie sich die gleitenden Mittelwerte in Abbildung 1 von einander abweichen, wenn die Stärke des Impulses zunimmt. Die MACD wurde entworfen, um von dieser Divergenz zu profitieren, indem sie den Unterschied zwischen den beiden exponentiellen gleitenden Durchschnitten analysierte. Insbesondere wird der Wert für den langfristigen gleitenden Durchschnitt von dem kurzfristigen Durchschnitt subtrahiert, und das Ergebnis wird auf ein Diagramm aufgetragen. (Gleichung für jeden Tag EMA12 - EMA26) Ein positiver MACD-Wert, der erzeugt wird, wenn der kurzfristige Durchschnitt über dem längerfristigen Durchschnitt liegt, wird verwendet, um eine zunehmende Aufwärtsschwelle zu signalisieren. Dieser Wert kann darauf hindeuten, dass Händler vielleicht von kurzen Positionen absehen wollen, bis ein Signal darauf hindeutet, dass es angemessen ist. Auf der anderen Seite deuten negative MACD-Werte darauf hin, dass der Abwärtstrend stärker wird und dass es nicht die beste Zeit zum Kauf sein kann. Es ist Standard geworden, einen separaten gleitenden Durchschnitt neben dem MACD zu zeichnen, der verwendet wird, um ein klares Signal des Schaltimpulses zu erzeugen. MACD-Vorteile Signale werden leicht interpretiert Kann in jede kurzfristige Handelsstrategie integriert werden Hilft Händler sicherstellen, dass kurzfristige Richtung zu ihren Gunsten arbeitet MACD-Nachteile Falsch-Positives, was die Investopedia-Seite einen Whipsaw-Effekt anruft Nach obenDer Glaube, dass eine Veränderung Wird es leicht sein, richtig zu machen, macht es weniger wahrscheinlich, dass die Änderung korrekt durchgeführt wird. Ein XP-Programmierer schreibt einen Unit-Test, um seine Absichten zu klären, bevor er eine Änderung vornimmt. Wir nennen diese Test-driven Design (TDD) oder Test-First-Programmierung. Weil ein API39s Design und Umsetzung von seinen Testfällen geführt werden. Der Programmierer schreibt den Test so, wie er will, dass die API arbeitet, und er implementiert die API, um die Erwartungen zu erfüllen, die durch den Test festgelegt wurden. Test-driven Design hilft uns erfinden testbare und nutzbare Schnittstellen. In vielerlei Hinsicht sind Testbarkeit und Usability eins in der gleichen. Wenn Sie einen Test für eine API schreiben können, ist es wahrscheinlich schwierig zu bedienen und umgekehrt. Test-driven Design gibt Rückmeldung über Usability, bevor die Zeit verschwendet wird auf die Umsetzung einer ungünstigen API. Als Bonus, der Test dokumentiert, wie die API funktioniert, zum Beispiel. Alle oben genannten sind gute Dinge, und wenige würden mit ihnen streiten. Eine offensichtliche Sorge ist, dass Test-driven Design könnte verlangsamen Entwicklung. Es dauert Zeit, um Tests zu schreiben, aber durch das Schreiben der Tests zuerst, erhalten Sie Einblick in die Umsetzung, die Geschwindigkeit beschleunigt. Das Debugging der Implementierung ist auch schneller, dank der sofortigen und reproduzierbaren Rückmeldung, die nur ein automatisierter Test bieten kann. Vielleicht die größte Zeitersparnis von Unit-Testing kommt ein paar Monate oder Jahre, nachdem Sie den Test schreiben, wenn Sie die API verlängern müssen. Der Unit-Test bietet Ihnen nicht nur eine zuverlässige Dokumentation für die Funktionsweise der API, sondern auch die Annahmen, die in das Design der API eingegangen sind. Sie können ziemlich sicher sein, dass eine Änderung nichts verpasst hat, wenn die Änderung alle Maßstäbe, die vor ihr geschrieben wurden, überschreitet. Änderungen, die mit fundamentalen API-Annahmen verhalten, verursachen die kostspieligsten Fehler zu debuggen. Eine umfassende Unit-Test-Suite ist wahrscheinlich die effektivste Verteidigung gegen solche unerwünschten Änderungen. Dieses Kapitel führt ein testgetriebenes Design durch die Implementierung eines exponentiellen gleitenden Durchschnitts (EMA) ein, eine einfache, aber nützliche mathematische Funktion. In diesem Kapitel wird auch erläutert, wie die CPAN-Module Test :: More und Test :: Exception verwendet werden. Unit-Tests Ein Unit-Test validiert die Programmierer-Ansicht der Applikation. Dies unterscheidet sich von einem Akzeptanztest, der aus der Perspektive des Kunden geschrieben wird und die Endbenutzer-Funktionalität prüft, in der Regel über die gleiche Schnittstelle, die ein normaler Benutzer verwendet. In constrast übt ein Unit-Test eine API aus, die formal als Einheit bekannt ist. Normalerweise testen wir ein ganzes Perl-Paket mit einem einzigen Unit-Test. Perl hat eine starke Tradition der Unit-Tests, und praktisch jedes CPAN-Modul kommt mit einem oder mehreren Unit-Tests. Es gibt auch viele Test-Frameworks von CPAN. Diese und nachfolgende Kapitel verwenden Test :: More. Ein populäres und gut dokumentiertes Testmodul.2 Ich benutze auch Test :: Exception, um Abweichungsfälle zu testen, die zu Anrufen führen, um zu sterben .3 Test First, By Intention Test-getriebenes Design nimmt Unit-Tests bis zum Extrem. Bevor du den Code schreibst, schreibst du einen Unit-Test. Zum Beispiel hierfür der erste Testfall für das EMA-Modul (exponentielles gleitender Durchschnitt): Dies ist der minimale Test :: Mehr Test. Sie sagen Test :: Mehr wie viele Tests zu erwarten, und Sie importieren das Modul mit useok als der erste Testfall. Die BEGIN stellt sicher, dass die Module Protokolle und Funktionen während der Kompilierung des Restes des Gerätetests zur Verfügung stehen. Der nächste Schritt ist, diesen Test auszuführen, um sicherzustellen, dass es scheitert: In diesem Stadium könnte man denken, Duh Natürlich scheitert es. Test-driven Design beinhaltet viele Duhs am Anfang. Die Baby-Schritte sind wichtig, weil sie helfen, setzen Sie in die Mentalität des Schreibens ein kleiner Test gefolgt von gerade genug Code, um den Test zu befriedigen. Wenn Sie Wartungs-Programmierkenntnisse haben, können Sie sich bereits mit diesem Verfahren vertraut machen. Wartungsprogrammierer wissen, dass sie einen Test benötigen, um sicherzustellen, dass ihre Änderung behebt, was sie denken, ist gebrochen. Sie schreiben den Test und führen ihn vor der Festsetzung alles, um sicherzustellen, dass sie ein Versagen verstehen und dass ihre Fix funktioniert. Test-driven Design nimmt diese Praxis bis zum Extrem durch Klärung Ihrer Verständnis für alle Änderungen, bevor Sie sie machen. Nun, da wir die Notwendigkeit eines Moduls namens EMA (Duh) geklärt haben, implementieren wir es: Und Duh, der Test geht: Yeeha Zeit, mit einem Doppelcappuccino zu feiern, damit wir nicht einschlafen. Das ist alles, was es gibt, um die Test-driven Design-Schleife: Schreiben Sie einen Test, sehen Sie es scheitern, befriedigen Sie den Test, und beobachten Sie es passieren Für die Kürze, die restlichen Beispiele verlassen die Test-Ausführung Schritte und die begleitenden Duhs und yeehas. Allerdings ist es wichtig, sich daran zu erinnern, diese einfachen Schritte bei der Test-first-Programmierung einzuschließen. Wenn Sie sich nicht erinnern, wird Ihr Programmierpartner wahrscheinlich.4 Exponential Moving Average Unser hypothetischer Kunde für dieses Beispiel möchte einen laufenden Durchschnitt der Schlusskurse für ihre Website beibehalten. Eine EMA wird hierfür häufig verwendet, weil es eine effiziente Möglichkeit ist, einen laufenden Durchschnitt zu berechnen. Sie können sehen, warum, wenn Sie die grundlegende Berechnung für eine EMA betrachten: heute39s Preis x Gewicht gestern39s Durchschnitt x (1 - Gewicht) Dieser Algorithmus erzeugt einen gewichteten Durchschnitt, der die jüngste Geschichte begünstigt. Die Wirkung eines Preises im Durchschnitt zerfällt exponentiell im Laufe der Zeit. Es ist eine einfache Funktion, die nur zwei Werte beibehalten muss: gestern39s Durchschnitt und das Gewicht. Die meisten anderen Arten von gleitenden Durchschnitten erfordern mehr Datenspeicherung und komplexere Berechnungen. Das Gewicht, allgemein genannt Alpha. Wird in Form von einheitlichen Zeiträumen berechnet (Tage in diesem Beispiel): 2 (Anzahl der Tage 1) Für die Effizienz wird Alpha gewöhnlich einmal berechnet und zusammen mit dem aktuellen Wert des Durchschnitts gespeichert. Ich entschied mich, ein Objekt zu verwenden, um diese Daten und eine einzige Methode zu halten, um den Durchschnitt zu berechnen. Teste Dinge, die vielleicht brechen Da der erste Schnitt Design fordert eine stateful Objekt, müssen wir es instanziieren, um es zu benutzen. Der nächste Fall testet die Objekterstellung: Manchmal vergisst du, die Instanz (Selbst) zurückzugeben, damit der Test ok aufruft, um zu überprüfen, dass neue einen Wert ungleich Null zurückgibt. Dieser Fall testet, was ich denke, könnte brechen. Ein alternativer, umfangreicherer Test ist: In diesem Fall wird überprüft, dass neu eine gesegnete Referenz der Klasse EMA zurückgibt. Für mich ist dieser Test unnötig komplex. Wenn neu etwas zurückgibt, ist es wahrscheinlich eine Instanz. Es ist vernünftig, sich auf den einfacheren Fall auf dieser Basis allein zu verlassen. Darüber hinaus gibt es andere Testfälle, die die Instanz verwenden werden, und diese Tests werden fehlschlagen, wenn neue doesn39t eine Instanz der Klasse EMA zurückgeben. Dieser Punkt ist subtil, aber wichtig, denn die Größe einer Unit-Test-Suite ist wichtig. Je größer und langsamer die Suite, desto weniger nützlich ist es. Eine langsame Einheit Test-Suite bedeutet Programmierer zögern, bevor Sie alle Tests, und es wird mehr Checkins, die Einheit und Abnahme-Tests zu brechen. Denken Sie daran, Programmierer sind faul und ungeduldig, und sie sind nicht wie zurückgehalten von ihrer Programmierumgebung. Wenn Sie nur testen, was könnte brechen, wird Ihre Unit-Test-Suite bleiben ein leichtes und effektives Entwicklungs-Tool. Bitte beachten Sie, dass, wenn Sie und Ihr Partner neu sind, um Test-getriebenen Design, it39s wahrscheinlich besser zu irren auf der Seite der Vorsicht und zu viel zu testen. Mit Erfahrung erfahren Sie, welche Tests überflüssig sind und welche besonders hilfreich sind. Hier gibt es keine magischen Formeln. Testen ist eine Kunst, die Zeit braucht, um zu meistern. Satisfy The Test, Don39t Trick Es Rückkehr zu unserem Beispiel, die Umsetzung von neuen, die diesen Fall erfüllt ist: Dies ist der minimale Code, der die oben genannten Test erfüllt. Die Länge muss nicht gespeichert werden, und wir müssen nicht Alpha berechnen. Wir kommen zu ihnen, wenn wir müssen. Aber warten Sie, sagen Sie, würde der folgende Code den Test nicht befriedigen, ja Sie können jeden Test trick machen. Allerdings ist es nett, Programmierer wie Erwachsene zu behandeln (obwohl wir es nicht immer so handeln). Niemand wird über die Schulter schauen, um sicherzugehen, dass ihr keinen eigenen Test betrügt. Die erste Implementierung von neu ist die richtige Menge an Code, und der Test reicht aus, um diese Implementierung zu führen. Das Design fordert ein Objekt, den Zustand zu halten, und eine Objekterstellung ist das, was benötigt wird, um codiert zu werden. Test Base Cases Erste Was wir bisher getestet haben, sind die Basisfälle. Das heißt, Tests, die die grundlegenden Annahmen der API validieren. Wenn wir zunächst Grundannahmen testen, arbeiten wir uns auf die volle Komplexität der kompletten Umsetzung und machen den Test auch lesbarer. Test-first Design funktioniert am besten, wenn die Umsetzung zusammen mit den Testfällen wächst. Es gibt zwei Basisfälle für die Berechnungsfunktion. Der erste Basisfall ist, dass der Anfangswert des Durchschnitts nur die Zahl selbst ist. Es gibt auch den Fall der Eingabe eines Wertes gleich dem Durchschnitt, der den Durchschnitt unverändert lassen sollte. Diese Fälle sind wie folgt codiert: Die Funktion von Test :: More lässt uns skalare Werte vergleichen. Beachten Sie die Änderung des Instanziierungs-Testfalls, mit der wir die Instanz (ema) für nachfolgende Fälle verwenden können. Wiederverwendung von Ergebnissen der vorherigen Tests verkürzt den Test und macht es leichter zu verstehen. Die Implementierung, die diese Fälle erfüllt, ist: Die Initialisierung von alpha wurde zu neu hinzugefügt. Denn berechnen braucht den Wert. New initialisiert den Zustand des Objekts und berechnet den EMA-Algorithmus. Selbst-gt ist anfänglich undef, so dass Fall erkannt werden kann. Obwohl die Implementierung fertig ist, haben wir getestet. Der obige Code ist möglicherweise defekt. Beide berechnen Testfälle verwenden den gleichen Wert, und der Test würde passieren, auch wenn zB Selbst-gt und Wert versehentlich umgestellt wurden. Wir müssen auch testen, dass sich die durchschnittlichen Änderungen bei unterschiedlichen Werten ergeben. Der Test, wie er steht, ist zu statisch, und es dient nicht als ein gutes Beispiel dafür, wie ein EMA funktioniert. Wählen Sie selbstverständliche Daten In einer testgesteuerten Umgebung verwenden Programmierer die Tests, um zu erfahren, wie die API funktioniert. Sie können hören, dass XPers keine Dokumentation haben. Das ist nicht ganz richtig. Was wir bevorzugen, ist die Selbstvalidierung der Dokumentation in Form von Tests. Wir kümmern uns um Tests zu schreiben, die lesbar sind und zeigen, wie man die API benutzt. Ein Weg, um lesbare Tests zu erstellen, ist, gute Testdaten auszuwählen. Allerdings haben wir ein kleines Bootstrapping-Problem: Um gute Testdaten auszuwählen, benötigen wir gültige Werte aus den Ergebnissen einer EMA-Berechnung, aber wir brauchen eine EMA-Implementierung, um uns diese Werte zu geben. Eine Lösung besteht darin, die EMA-Werte von Hand zu berechnen. Oder wir könnten eine andere EMA-Implementierung nutzen, um die Werte zu finden. Während einer dieser Entscheidungen funktionieren würde, müsste ein Programmierer, der die Testfälle liest, ihnen vertrauen oder sie neu berechnen, um zu überprüfen, ob sie richtig sind. Nicht zu erwähnen, dass wir die Präzision genau richtig für unsere Zielplattform bekommen müssen. Verwenden Sie den Algorithmus, Luke Eine bessere Alternative ist, rückwärts durch den Algorithmus zu arbeiten, um herauszufinden, einige selbstverständliche Testdaten.5 Um dies zu erreichen, behandeln wir den EMA-Algorithmus als zwei Gleichungen durch die Festsetzung einiger Werte. Unser Ziel ist es, ganzzahlige Werte für die Ergebnisse zu haben, damit wir Fließpunktpräzisionsprobleme vermeiden. Darüber hinaus machen ganzzahlige Werte es dem Programmierer leichter, dem zu folgen, was los ist. Wenn wir die Gleichungen betrachten, sehen wir Alpha ist der am meisten eingeschränkte Wert: heute39s Durchschnitt heute39s Preis x Alpha gestern39s Durchschnitt x (1 - alpha) alpha 2 (Länge 1) Daher ist es sinnvoll zu versuchen und herauszufinden, einen Wert von Alpha, dass Kann Integer-Ergebnisse mit ganzzahligen Preisen produzieren. Ausgehend von der Länge 1 nehmen die Alpha-Werte wie folgt ab: 1, 23, 12, 25, 13, 27 und 14. Die Werte 1, 12 und 25 sind gute Kandidaten, da sie genau im Binär-Gleitpunkt dargestellt werden können . 1 ist ein degenerierter Fall, der Durchschnitt eines einzelnen Wertes ist immer selbst. 12 ist nicht ideal, weil alpha und 1 - alpha identisch sind, was eine Symmetrie in der ersten Gleichung erzeugt: heute39s Durchschnitt heute39s Preis x 0,5 gestern39s durchschnittlich x 0,5 Wir wollen asymmetrische Gewichte, so dass Defekte, wie zum Beispiel Swapping heute39s Preis und gestern39s durchschnittlich, Wird erkannt. Eine Länge von 4 ergibt ein Alpha von 25 (0,4) und macht die Gleichung asymmetrisch: heute39s Durchschnitt heute39s Preis x 0,4 gestern39s Durchschnitt x 0,6 Mit Alpha bei 0,4 fixiert, können wir Preise, die heute39s durchschnittlich eine ganze Zahl machen. Speziell, Vielfache von 5 arbeiten schön. Ich mag Preise, um zu steigen, also wählte ich 10 für heute39s Preis und 5 für gestern39s Durchschnitt. (Der Anfangspreis). Dies macht heute39s durchschnittlich gleich 7, und unser Test wird: Wiederum habe ich die Basisfälle überarbeitet, um den Test kurz zu halten. Jeder Wert in den Basisfällen wird funktionieren, damit wir auch die Testzeit durch Wiederverwendung sparen können. Unsere Prüfung und Umsetzung sind im Wesentlichen abgeschlossen. Alle Wege durch den Code werden getestet, und EMA könnte in der Produktion verwendet werden, wenn es richtig verwendet wird. Das heißt, EMA ist komplett, wenn alles, was wir uns interessieren, konformes Verhalten ist. Die Implementierung ignoriert derzeit, was passiert, wenn neu ein ungültiger Wert für die Länge gegeben wird. Obwohl EMA ist ein kleiner Teil der Anwendung, kann es einen großen Einfluss auf die Qualität haben. Zum Beispiel, wenn neu eine Länge von -1 übergeben wird, wirft Perl eine Trennzeichen von Null, wenn Alpha berechnet wird. Für andere ungültige Werte für Länge. Wie z. B. -2, neu akzeptiert den fehlerhaften Wert, und berechtigt zuverlässig nicht-sinnliche Werte (negative Mittelwerte für positive Preise). Wir können diese Fälle einfach ignorieren. Wir müssen eine Entscheidung darüber treffen, was zu tun ist, wenn die Länge ungültig ist. Ein Ansatz wäre, Müll-in Müll-out zu übernehmen. Wenn ein Anrufer -2 für Länge liefert. Es ist das Problem des Anrufers. Doch das ist nicht das, was Perl39s die Funktion trennt, und es ist nicht das, was passiert, wenn du versuchst, einen Skalar zu dezitieren, der keine Referenz ist. Der Perl-Interpreter ruft an. Und ich habe bereits im Kapitel Coding Style erwähnt, dass ich es vorziehe, schnell zu fehlen, anstatt zu warten, bis das Programm einen echten Schaden erledigen kann. In unserem Beispiel würde die Website des Kunden39s einen ungültigen gleitenden Durchschnitt anzeigen, und eine ihrer Kunden könnte eine falsche Investitionsentscheidung auf der Grundlage dieser Informationen machen. Das wäre schlecht Es ist besser für die Website, eine Server-Fehlerseite zurückzugeben, als irreführende und falsche Informationen anzuzeigen. Niemand mag Programmabstürze oder Serverfehler. Dennoch ist es ein effizienter Weg, um semantische Grenzen (Kopplungen) innerhalb der Anwendung zu kommunizieren. Der UI-Programmierer kann in unserem Beispiel nicht wissen, dass eine EMA39s-Länge eine positive ganze Zahl sein muss. Er findet heraus, wann die Anwendung stirbt. Er kann dann das Design seines Codes und der EMA-Klasse ändern, um diese Grenze für den Endbenutzer sichtbar zu machen. Fail schnell ist ein wichtiger Feedback-Mechanismus. Wenn wir einem unerwarteten Würfel begegnen. Es sagt uns, dass das Anwendungsdesign verbessert werden muss. Deviance Testing Um für eine API zu testen, die schnell fehlschlägt, müssen wir in der Lage sein, Anrufe zu sterben und dann anzurufen, um zu bestätigen, dass der Anruf tatsächlich in einer Ausnahme endet. Die Funktion stirbt im Modul Test :: Exception macht das für uns. Da dies unsere letzte Gruppe von Testfällen in diesem Kapitel ist, hier39s der gesamte Unit-Test mit den geänderten für die neuen Abweichungsfälle hervorgehoben: Es gibt jetzt 9 Fälle im Unit-Test. Der erste Abweichungsfall bestätigt, dass die Länge negativ sein kann. Wir wissen bereits, dass ich mit einer Trennungs-by-Null-Ausnahme sterben wird. -2 ist eine bessere Wahl. Der Nullfall prüft die Randbedingung. Die erste gültige Länge ist 1. Längen müssen ganze Zahlen sein und 2,5 oder eine beliebige andere Gleitkommazahl ist nicht erlaubt. Länge hat keine explizite Obergrenze. Perl konvertiert automatisch ganze Zahlen in Gleitkommazahlen, wenn sie zu groß sind. Der Test prüft bereits, dass Gleitkommazahlen nicht erlaubt sind, so dass keine explizite Obergrenze überprüft wird. Die Implementierung, die diesen Test erfüllt, folgt: Die einzige Änderung ist die Hinzufügung eines Aufrufs, um mit einer Nicht-Klausel zu sterben. Diese einfache Fail Fast Klausel doesn39t komplizieren den Code oder verlangsamen die API, und doch verhindert es subtile Fehler durch die Umwandlung einer Annahme in eine Behauptung. Nur Test Die neue API Einer der schwierigsten Teile der Prüfung ist zu wissen, wann zu stoppen. Sobald Sie Test-infiziert worden sind, können Sie auf Hinzufügen Fälle, um sicherzustellen, dass die API ist perfekt. Zum Beispiel wäre ein interessanter Testfall, eine NaN (keine Nummer) zu berechnen. Aber das ist kein Test von EMA. Die Gleitkomma-Implementierung von Perl verhält sich in besonderer Weise in Bezug auf NaNs6. Und Bivio :: Math :: EMA wird diesem Verhalten entsprechen. Testen, dass NaNs richtig behandelt werden, ist ein Job für die Perl Interpreter39s Test Suite. Jede API setzt auf eine ungeheure Menge an vorhandenem Code. Es gibt noch genügend Zeit, um alle vorhandenen APIs und deiner neuen API zu testen. So wie eine API sollte Sorgen zu trennen, so muss ein Test. Beim Testen einer neuen API sollte dein Anliegen diese API und keine anderen sein. Solid Foundation In XP machen wir die einfachste Sache, die vielleicht funktionieren könnte, damit wir so schnell wie möglich den Geschäftswert liefern können. Sogar als wir den Test und die Umsetzung schreiben, werden wir sicher, dass sich der Code ändert. Wenn wir einer neuen Kundenanforderung begegnen, refactor der Code, falls nötig, um die zusätzliche Funktion zu erleichtern. Dieser iterative Prozess wird als kontinuierliches Design bezeichnet. Das ist das Thema des nächsten Kapitels. Es ist wie das Renovieren Ihres Hauses, wenn sich Ihre Bedürfnisse ändern. 7 Ein System oder Haus braucht ein solides Fundament, um eine kontinuierliche Renovierung zu unterstützen. Unit-Tests sind die Grundlage für ein XP-Projekt. Bei der kontinuierlichen Gestaltung stellen wir sicher, dass das Haus nicht durch die Durchführung von Unit-Tests herunterfällt, um alle Annahmen über eine Implementierung zu validieren. Wir wachsen auch das Fundament, bevor wir neue Funktionen hinzufügen. Unsere Test-Suite gibt uns das Vertrauen, um Veränderung zu umarmen. Qualitäts-Software-Management: Vol. 1 Systeme denken. Gerald Weinberg, Dorset House, 1991, p. 236. Teil der Test-Einfache Verteilung, verfügbar bei search. cpan. orgsearchqueryTest-Simple Ich habe Version 0.47 für dieses Buch verwendet. Nur eine freundliche Erinnerung, um in Paaren zu programmieren, besonders wenn man etwas Neues versucht. Danke an Ion Yadigaroglu für die Lehre mich diese Technik. In einigen Implementierungen wird die Verwendung von NaNs zu einem Laufzeitfehler führen. In anderen werden sie alle nachfolgenden Ergebnisse zu einem NaN führen. Don39t ließ den Gedanken der ununterbrochenen Hausrenovierung Sie erschrecken. Programmierer sind viel ruhiger und weniger chaotisch als Bauarbeiter.
No comments:
Post a Comment