2

Ich versuche, den Hurst-Exponenten einer Zeitreihe in Python zu berechnen, einem Wert, der einige Merkmale einer Zeitreihe für das quantitative Finanzwesen bestimmt. Ich habe eine Zeitreihe beliebiger Länge genommen und gewählt, sie in Stücke von Daten zu zerlegen, ein Prozess, der ein Teil der Berechnung des Hurst-Exponenten ist (eine von mehreren Methoden). Ich schreibe das als eine Funktion. Stellen Sie sich vor ich die Zeitreihe (Preise eines Sicherheits) haben als „y“ und die Anzahl der Stücke I als „n“ wollen:Berechnen des 2D-Mittelwerts eines 3D-gezackten NumPy-Arrays

def hurst(y,n): 

    y = array_split(y,n) 

Das Problem ist, dass jetzt wird das Array in Stücke aufgeteilt, wobei einer der Die Stücke sind nicht gleich groß wie die anderen. Ich möchte den Mittelwert, die Standardabweichung, die mean-zentrierte Reihe, die kumulative Summe der mittleren zentrierten Reihe und den Bereich der kumulativen Summe für jeden Chunk finden. Aber da das Array nicht einheitlich in der Größe ist, habe ich keinen Weg gefunden, dies zu erreichen. Grundsätzlich, wenn ich versuche,

mean(y,axis=0) 

Oder 1 oder 2, für die Achse, bekomme ich einen Fehler. Bei der Verwendung von n = 20 ist die Form des Arrays als

gegeben
(20,) 

Ich dachte, vielleicht „vectorize“ ihr helfen könnte? Aber ich habe nicht recht verstanden, wie man es benutzt. Ich versuche, das Durchlaufen der Daten zu vermeiden.

Beispieldaten, nachdem sie gespalten ist:

[array([[ 1.04676], 
    [ 1.0366 ], 
    [ 1.0418 ], 
    [ 1.0536 ], 
    [ 1.0639 ], 
    [ 1.06556], 
    [ 1.0668 ]]), array([[ 1.056 ], 
    [ 1.053 ], 
    [ 1.0521 ], 
    [ 1.0517 ], 
    [ 1.0551 ], 
    [ 1.0485 ], 
    [ 1.05705]]), array([[ 1.0531], 
    [ 1.0545], 
    [ 1.0682], 
    [ 1.08 ], 
    [ 1.0728], 
    [ 1.061 ], 
    [ 1.0554]]), array([[ 1.0642], 
    [ 1.0607], 
    [ 1.0546], 
    [ 1.0521], 
    [ 1.0548], 
    [ 1.0647], 
    [ 1.0604]]) 

Typ list Daten

+0

Was gelöst Typ 'y'? Bitte geben Sie ein Beispiel für einfache Daten –

+0

'y' beginnt als Pandas Datenrahmen. Dann verwende ich 'as_matrix', um es in eine Array-Form zu bringen. Dann verwende ich 'array_split' darauf. Ich denke, die endgültige Form ist 'liste'. Ich bin sehr neu in Python – denbjornen505

+0

Wenn Sie den Typ einer Variablen 'a' wissen möchten, können Sie 'print (Typ (a))' –

Antwort

1

Um eine Liste von mittelt machen Sie einfach list comprehension verwenden können:

[mean(x[axis]) for axis in range(len(x))] 

es geht über die Achsen und Berechnen Sie den Mittelwert jedes Teils.

+0

Ich habe dies versucht, aber ich bin richtig, dass es nur den Mittelwert der zurückgegeben indexierter Brocken? In diesem Fall gibt es nur einen Wert für den Chunk mit Index 0 zurück? Ich brauche den Mittelwert jedes Stückes in Listenform. – denbjornen505

+0

@ user22393 Ich ändere das für Sie. Aber Sie müssen wirklich wissen, welchen Typ Sie verwenden –

+0

es ist wichtig, dass ich die Daten in Stücke aufteilen, die möglicherweise nicht gleich sind, abhängig von der Gesamtlänge der Zeitreihe. Gibt es eine bessere Möglichkeit, die Daten in ungleiche Blöcke aufzuteilen als 'array_split', die den' list' Typ ergibt? – denbjornen505

0

Für alle, die sich über diese stolpert, habe ich das Problem und gelöst mit einem Pandas Datenrahmen statt ...

def hurst(y,n): 

y = prices.as_matrix() 
y = array_split(y,n) 
y = pd.DataFrame.from_records(y).transpose() 
y = y.dropna() 

# Mean Centered Series 

m = y.mean(axis='columns') 

Y = y.sub(m,axis = 'rows') 


# Standard Deviation of Series 

S = y.std(axis='columns') 

# Cumulative Sum Series 

Z = Y.cumsum() 

# Range Series 

R = Z.max(axis='columns')-Z.min(axis='columns') 

# Rescale Range 

RS = R/S 
RS = RS.sort_values() 

# Time Period 

s = shape(y) 

t = linspace(1,s[0],s[0]) 

# Log Scales 

logt = log10(t) 
logRS = log10(RS) 

print len(t),len(logRS) 

# Regression Fit 

slope, intercept, r_value, p_value, std_err = stats.mstats.linregress(logt, logRS) 

# Hurst Exponent 

H = slope/2 

return H, logt, logRS