Der optimale gleitenden Durchschnitt

Gleitende Durchschnitte als sogenannte Trendindikatoren spielen eine große Rolle in der technischen Analyse von Finanzmarktdaten. Der einfache gleitende Durchschnitt (SMA) ist nur für eine visuelle Analyse geeignet, da er in trendschwachen Phasen durch häufige Richtungsänderungen falsche Signale erzeugt. Der einfache exponentielle Durchschnitt (EMA) hat eine von der Größe des gewählten Glättungsmaßes abhängige Filterwirkung mit den entscheidenden Nachteilen, dass a) das Glättungsmaß nicht adaptiv ist und b) eine Trendumkehr angezeigt wird, sobald der aktuelle Wert der Zeitreihe seinen gleitenden Durchschnitt kreuzt, was wiederum zu einer Fülle von Fehlsignalen führt. Der EMA ist wie der SMA nur für visuelle Analysen geeignet. Dieses gilt dann auch für alle Indikatoren, die auf einer einfachen Mittelwertbildung oder auf einer konstanten Glättung nach den Prinzip des EMA basieren.

Die Stärke des optimalen gleitenden Durchschnitts (OMA) besteht darin, dass der aktuelle Wert der Zeitreihe einen von der momentanen Volatilität abhängigen Schwellenwert überschreiten muss, damit der Filter steigt bzw. fällt, wodurch Fehlsignale in trendschwachen Phasen vermieden werden.

Wer Intresse an der vollständigen Herleitung oder den Codes für Tradestation bzw. Metastock hat, kann mich anschreiben.

Gast

@wuelle
Da ist kein Unterschied. Korrigiert klingt besser als optimal.
@YingYang
Ich wollte Dir noch einen Fall zeigen, wo man nicht ohne die Schleife auskommt. Der "Min. Lag Corrected Average". Wenn man "v4" auf ein 1 zurücksetzt hat man wieder den alten CA.

{Min. Lag Corrected Average (CA), A.Uhl, Oct. 27, 2005}

vars:
CA(0),SA(0),n(0),
v1(0),v2(0),v3(0),v4(0),
e(0),tol(0),Kold(0),K(0);

inputs:
Price(Close),length(35);

tol=Power(10,-5);

if CurrentBar=1 then
CA=Price
else
begin

if CurrentBar<length then
n=CurrentBar
else
n=length;

SA=Average(Price,n);
v1=Square(StdDev(Price,n));
v2=Square(CA[1]-SA);
v3=iff(v1=0 OR v2=0,1,v2/(v1+v2));
v4=1/n;

{calculate current gain factor K}
e=1;
Kold=1;
while e>tol begin
K=v3*(1-Square(v4)*Square(1-Kold)/Square(v4+Kold*(1-v4)));
e=Kold-K;
Kold=K;
end;
CA=(v4*CA[1]+K*(SA-v4*CA[1]))/(v4+K*(1-v4));
end;

Plot1(CA,"Min. Lag Corrected Average",Red,White,3);
Plot2(SA,"Simple Average",Blue,White,1);

YingYang
Mitglied seit 10 Jahre 9 Monate

@DrUhl

Ohne Gewähr:
Es gibt drei Lösungen für K
1.Lösung
K= 0

2. Lösung
K= 1/2/(1-2*v4+v4^2)*(-2*v4+v3-2*v3*v4+2*v4^2+(4*v3*v4-4*v3*v4^2+v3^2-4*v3^2*v4+4*v3^2*v4^2)^(1/2))

3.Lösung
K= 1/2/(1-2*v4+v4^2)*(-2*v4+v3-2*v3*v4+2*v4^2-(4*v3*v4-4*v3*v4^2+v3^2-4*v3^2*v4+4*v3^2*v4^2)^(1/2))

Bitte testen.

Gast

@YingYang
stimmt natürlich. Das sind die 3 Lösungen der kubischen Gleichung, von denen nur eine sinnvoll ist (0<K<1). Ich habe die iterative Lösung gewählt, weil man mit den Startwert K=1 automatisch zur sinnvollen Lösung kommt.

wuelle
Mitglied seit 10 Jahre 9 Monate

@ DrUhl [#39]

Ich habe mit dem Code, den Du hier veröffentlicht hast, im Board von eSignal eine Anfrage an einen Programmierer geschickt:

Frage:

“The following Code of a moving average is published in a bulletin board by Andreas Uhl. ... Is it possible to code this in eSignal efs?”

Antwort von eSignal kam prompt:

As I think the study could be of interest to this community I went ahead and coded the indicator. You can find a basic version of the study here
At some point I may add it to the amStudies library so that it can be used just like an eSignal builtin study.

Alexis C. Montenegro

Man kann den MA in der Programmierung von Alexis von verschiedenen Werten, wie close, high, low, HL/2 usw. berechnen.

Vielen Dank für den Code!

.

steppel
Mitglied seit 10 Jahre 9 Monate

Hallo,

ich habe mal den Indikator in Amibrokers AFL umgesetzt - für alles die es mögen.

price = ParamField("field");
n = Param("periods",35);
SA=MA(Price,n);
v1=(StDev(Price,n))^2;

Ca=Null;
Ca[n]=sa[n];

for(i=n+1; i<BarCount;i++){
v2[i]=(CA[i-1]-SA[i])^2;
k[i]=IIf(V2[i]<V1[i],0,1-V1[i]/V2[i]);
CA[i]=CA[i-1]+K[i]*(SA[i-1]-CA[i-1]);
}
Plot(Ca,"CMA("+WriteVal(n,1.0)+")",colorYellow,styleThick);
//Ende CMA/////////////////////////////////////////////////
Col = IIf(BarsSince(Ref(Ca,-1)>Ca)>BarsSince(Ref(Ca,-1)<Ca),colorBrightGreen,colorRed);
Plot(C,"",Col,styleBar);

YingYang
Mitglied seit 10 Jahre 9 Monate

@DrUhl

ich habe noch einen Vorschlag zur Codeoptimierung

v1=Square(StdDev(Price,n));

das Quadrat der Standardabweichung ist doch die Varianz, dann kann man gleich mit der Varianz rechnen, das läuft schneller.

YingYang
Mitglied seit 10 Jahre 9 Monate

Ich habe da eine Idee

Der Code von DrUhl lautet:
if v2<v1 then
K=0
else
K=1-v1/v2;
CA=CA[1]+K*(SA-CA[1]);
end;
in #40 habe ich darauf hingewiesen, die folgende Scgreibweise vorzuziehen:
CA=SA - v1/v2*(SA-CA[1])

Das gibt den Code
if v2<v1 then
K=0
else
{K=1-v1/v2;}
{CA=CA[1]+K*(SA-CA[1]);}
CA=SA - v1/v2*(SA-CA[1]);
end;

Diese Formel zeigt schön CA in Abhängigkeit von SA.

Was liegt näher, als SA durch andere Durchschnitte zu ersetzen, gleitender Durchschnitt, gewogener Durschschnitt.....

Möglicherweise erhält man so eine neue Klasse von optimierten Durchschnitten.

YingYang
Mitglied seit 10 Jahre 9 Monate

Das habe ich vergessen, es reicht, in dieser Zeile andere Durchschnitte einzusetzen.

SA=Average(Price,n);

Gast

Hier sind noch die Codes für MetaStock

{Filtered Moving Average, Min. Lag}
period:=Input("Period",2,200,13);
MA:=Mov(CLOSE,period,S);
R:=Pwr(Stdev(CLOSE,period),2);
FMA1:=If(Cum(1)<=period,MA,
MA+R/(R+Pwr(PREV-MA,2))*(PREV-MA));
FMA1;
MA;

{Filtered Moving Average, Max. Lag}
period:=Input("Period",2,200,13);
MA:=Mov(CLOSE,period,S);
R:=Pwr(Stdev(CLOSE,period),2);
FMA2:=If(Cum(1)<=period,MA,
MA+Min(1,R/Pwr(PREV-MA,2))*(PREV-MA));
FMA2;

YingYang
Mitglied seit 10 Jahre 9 Monate

Hier zum Vergleich: SMA (oben) EMA (unten).

Rückrufservice
Beschreiben Sie bitte Ihr Anliegen, damit wir uns auf den Rückruf vorbereiten können.
Ja, ich habe die Datenschutzerklärung zur Kenntnis genommen und willige ein, dass die von mir angegebenen Daten inklusive der Kontaktdaten zwecks Bearbeitung der Anfrage und für den Fall von Anschlussfragen elektronisch erhoben und gespeichert werden. Meine Daten werden dabei nur streng zweckgebunden zur Bearbeitung meiner Anfrage genutzt und nicht ohne Einwilligung weitergegeben. Diese Einwilligung kann jederzeit mit Wirkung für die Zukunft widerrufen werden.

Jetzt registrieren

Jetzt registrieren und ZMP Live+ 14 Tage kostenlos testen!
  • Dauerhaft kostenfrei
  • Keine Zahlungsinformationen erforderlich