2016-06-20 41 views
2

Beim Versuch, den exponentiellen gleitenden Durchschnitt (EMA) aus Finanzdaten in einem Datenrahmen zu berechnen, scheint der ewm-Ansatz der Pandas falsch zu sein.Berechnen Pandas ewm falsch?

Die Grundlagen sind in den folgenden Link erläutert: http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages

Wann Pandas Erklärung gehen, genommen ist der Ansatz wie folgt (mit dem Parameter als False "justieren"):

weighted_average[0] = arg[0]; 
    weighted_average[i] = (1-alpha) * weighted_average[i-1] + alpha * arg[i] 

Das ist meiner Meinung nach falsch. Der "arg" sollte (zum Beispiel) der Schlusswert sein, aber arg [0] ist der erste Durchschnitt (dh der einfache Durchschnitt der ersten Datenreihe der Länge des gewählten Zeitraums), aber NICHT der erste Schlusswert . arg [0] und arg [i] können daher niemals aus denselben Daten stammen. Die Verwendung des Parameters "min_periods" scheint dies nicht zu beheben.

Kann mir jemand erklären, wie (oder ob) Pandas verwendet werden können, um die EMA von Daten richtig zu berechnen?

+1

Verwandte Github Ausgabe: https://github.com/pydata/pandas/issues/13638 – naught101

Antwort

3

Es gibt mehrere Möglichkeiten, einen exponentiellen gleitenden Durchschnitt zu initialisieren, also würde ich nicht sagen, Pandas macht es falsch, nur anders.

Hier wäre eine Möglichkeit, es zu berechnen, wie Sie wollen:

In [20]: s.head() 
Out[20]: 
0 22.27 
1 22.19 
2 22.08 
3 22.17 
4 22.18 
Name: Price, dtype: float64 

In [21]: span = 10 

In [22]: sma = s.rolling(window=span, min_periods=span).mean()[:span] 

In [24]: rest = s[span:] 

In [25]: pd.concat([sma, rest]).ewm(span=span, adjust=False).mean() 
Out[25]: 
0   NaN 
1   NaN 
2   NaN 
3   NaN 
4   NaN 
5   NaN 
6   NaN 
7   NaN 
8   NaN 
9  22.221000 
10 22.208091 
11 22.241165 
12 22.266408 
13 22.328879 
14 22.516356 
15 22.795200 
16 22.968800 
17 23.125382 
18 23.275312 
19 23.339801 
20 23.427110 
21 23.507635 
22 23.533520 
23 23.471062 
24 23.403596 
25 23.390215 
26 23.261085 
27 23.231797 
28 23.080561 
29 22.915004 
Name: Price, dtype: float64 
2

Sie EWMA berechnen kann alpha oder Koeffizienten (span) in Pandas ewm Funktion.

Formel für die Verwendung von alpha: (1 - alpha) * previous_val + alpha * current_val wo alpha = 1/period

Formel für die Verwendung von Koeff: ((current_val - previous_val) * coeff) + previous_val wo coeff = 2/(period + 1)

Hier ist, wie Sie Pandas zur Berechnung über Formeln verwenden können:

con = pd.concat([df[:period][base].rolling(window=period).mean(), df[period:][base]]) 

if (alpha == True): 
    df[target] = con.ewm(alpha=1/period, adjust=False).mean() 
else: 
    df[target] = con.ewm(span=period, adjust=False).mean() 
+0

Ich verstehe nicht, was "Basis" in dir ist R-Code, Sie brauchen es wahrscheinlich überhaupt nicht. Außerdem wäre es sicherer, die Periode zu floaten, insbesondere für Python 2. Ansonsten gute Antwort – FLab

+0

Entschuldigung dafür, mehrdeutig zu sein. "base" ist die Basisspalte in DataFrame, auf der EWMA berechnet werden soll. – arkochhar

+0

kleine Korrektur df [Ziel] = con.ewm (Alpha = 1.0/Periode, anpassen = Falsch) .mean() – AbhijitG