Ölzeilen in R

    "Preischarts sind großartig, um die Vergangenheit vorherzusagen."
    Peter Lynch



    Ich hatte irgendwie nie die Gelegenheit, mich in der Praxis mit Zeitreihen auseinanderzusetzen . Natürlich habe ich darüber gelesen und im Rahmen der Schulung eine Vorstellung davon gehabt, wie die Analyse im Allgemeinen durchgeführt wird, aber es ist allgemein bekannt, dass die in den Lehrbüchern über Statistik und maschinelles Lernen enthaltenen Informationen nicht immer die tatsächliche Situation widerspiegeln.

    Wahrscheinlich beobachten viele mit Interesse die Pirouetten, die die Ölpreiskurve hervorbringt . Der Zeitplan sieht chaotisch oder zu regelmäßig aus, und einige Vorhersagen zu treffen, ist eine sehr undankbare Aufgabe. Natürlich können Sie die volle Leistungsfähigkeit statistischer, wirtschaftlicher, mathematischer und fachlicher Methoden in Zeitreihen einbinden, aber lassen Sie uns versuchen, die technische Analyse zu behandeln - natürlich basierend auf R.

    Wenn Sie mit normalen Zeitreihen arbeiten, können Sie den Standardansatz verwenden:

    1. Visuelle Analyse
    2. Die Erweiterung der Serie und die Untersuchung ihrer Komponenten: Saisonalität, Zyklizität, Trend
    3. Aufbau eines mathematischen Modells und Vorhersage



    Es gibt eine sehr praktische Datenquelle - Quandl ; es stellt eine Schnittstelle zu Matlab, Python, R. Für R ausreichend , um ein einzelnes Paket zu etablieren: install.packages("Quandl"). Ich interessiere mich für den Spot-Preis für Brent-Rohöl in Europa - den Spot-Preis für Brent-Rohöl (im Folgenden werden drei Datensätze mit unterschiedlichen Details verwendet).

    library(Quandl)
    oil.ts <- Quandl("DOE/RBRTE", trim_start="1987-11-10", trim_end="2015-01-01", type="zoo")
    oil.tsw <-Quandl("DOE/RBRTE", trim_start="1987-11-10", trim_end="2015-01-01", type="zoo", collapse="weekly")
    oil.tsm <-Quandl("DOE/RBRTE", trim_start="1987-11-10", trim_end="2015-01-01", type="ts", collapse="monthly")
    plot(oil.tsm, xlab="Year", ylab="Price, $", type="l")
    lines(lowess(oil.tsm), col="red", lty="dashed")
    



    Wenn wir die Preise in einem jahrzehntelangen Maßstab betrachten, können wir mehrere Spitzen und Rückgänge sowie die Richtung des Trends erkennen. Im Allgemeinen ist es jedoch schwierig, signifikante Schlussfolgerungen zu ziehen. Daher untersuchen wir die Komponenten der Serie.

    plot(decompose(oil.tsm, type="multiplicative"))
    




    Mit dem Trend scheint alles klar zu sein - im 21. Jahrhundert gab es bis vor kurzem einen stetigen Aufwärtstrend (mit Ausnahme interessanter Jahre), eine Reihe von nicht stationären - dies wird durch den erweiterten Dickey-Fuller-Test bewiesen :

    >library(tseries)
    >library(forecast)
    >adf.test(oil.tsm, alternative=c('stationary'))
    	Augmented Dickey-Fuller Test
    data:  oil.tsm
    Dickey-Fuller = -2.7568, Lag order = 6, p-value = 0.2574
    alternative hypothesis: stationary
    

    Andererseits kann mit einem ziemlich hohen Maß an Sicherheit argumentiert werden, dass die Differenzen erster Ordnung der Reihe stationär sind, d.h. Dies ist eine integrierte Zeitreihe erster Ordnung (aufgrund dieser Tatsache können wir in Zukunft die Box-Jenkins-Methode anwenden ).

    >adf.test(diff(oil.tsm), alternative=c('stationary'))
    	Augmented Dickey-Fuller Test
    data:  diff(oil.tsm)
    Dickey-Fuller = -8.0377, Lag order = 6, p-value = 0.01
    alternative hypothesis: stationary
    > ndiffs(oil.tsm)
    [1] 1
    

    Darüber hinaus stellt sich heraus, dass es auch eine saisonale Komponente gibt, die auf dem allgemeinen Chart schwer zu erkennen ist. Wenn Sie genau hinschauen, können Sie neben einer relativ hohen Volatilität zwei Preiserhöhungen im Laufe des Jahres feststellen (die möglicherweise auf einen erhöhten Ölverbrauch in der Winterperiode und in der Ferienzeit zurückzuführen sind). Andererseits gibt es eine zufällige Komponente, deren Gewicht insbesondere in kritischen Jahren zunimmt (zum Beispiel die Finanzkrise von 2008).
    Manchmal ist es vorzuziehen, nach der Ein-Parameter-Box-Cox-Transformation mit Daten zu arbeiten , um die Varianz zu stabilisieren und die Daten in eine normalere Form zu bringen:

    L <- BoxCox.lambda(ts(oil.ts, frequency=260), method="loglik")
    Lw <- BoxCox.lambda(ts(oil.tsw, frequency=52), method="loglik")
    Lm <- BoxCox.lambda(oil.tsm, method="loglik")
    

    Bezüglich des schlüpfrigsten Themas, nämlich der Extrapolation, stellen die Autoren des Artikels „Prognosetechniken für den Rohölpreis: eine umfassende Überprüfung der Literatur“ fest, dass die Anwendbarkeit der Modelle je nach Länge des Zeitraums wie folgt ist:

    1. mittel- und langfristig sind nichtlineare Modelle besser geeignet - dieselben neuronalen Netze, Referenzvektormaschinen;
    2. Kurzfristig übertrifft ARIMA häufig neuronale Netze.

    Schließlich verwenden die Formalitäten nur in der Verpackung vorhanden forecastFunktion nnetar(), mit der Sie die Neuralnetzwerkmodells Serie ohne die Verwirrung zu bauen. Gleichzeitig werden wir dies für drei Serien tun - von detaillierter (nach Tagen) bis weniger detailliert (nach Monaten). Gleichzeitig wollen wir sehen, was mittelfristig passieren wird - zum Beispiel über 2 Jahre (dies ist in den Diagrammen blau dargestellt).
    Versteckter Text
    # Fit NN for long-run
    fit.nn <- nnetar(ts(oil.ts, frequency=260), lambda=L, size=3)
    fcast.nn <- forecast(fit.nn, h=520, lambda=L)
    fit.nnw <- nnetar(ts(oil.tsw, frequency=52), lambda=Lw, size=3)
    fcast.nnw <- forecast(fit.nnw, h=104, lambda=Lw)
    fit.nnm <- nnetar(oil.tsm, lambda=Lm, size=3)
    fcast.nnm <- forecast(fit.nnm, h=24, lambda=Lm)
    par(mfrow=c(3, 1))
    plot(fcast.nn, include=1040)
    plot(fcast.nnw, include=208)
    plot(fcast.nnm, include=48)
    




    Was sich im oberen Diagramm als gut herausgestellt hat, ist die Umschulung : Das neuronale Netz hat das letzte Muster in der Reihe abgefangen und mit dem Kopieren begonnen. In einem durchschnittlichen Diagramm kopiert das Netzwerk nicht nur das letzte Muster, sondern kombiniert es auch gut mit dem Trend, was der Prognose einen gewissen Realismus verleiht. In der unteren Grafik stellte sich heraus, dass es sich um eine Art dunkle Kurve handelte. Die Grafiken veranschaulichen gut, wie sich Vorhersagen in Abhängigkeit von der Datenglättung ändern. In jedem Fall können Prognosen für einen solchen Zeitraum für Produkte mit hoher (aus verschiedenen Gründen) Volatilität nicht als vertrauenswürdig eingestuft werden. Daher wenden wir uns sofort dem kurzfristigen Zeitraum zu und vergleichen gleichzeitig verschiedene Modelle - ARIMA , tbatsund neuronales Netzwerk. Wir werden die Daten der letzten sechs Monate verwenden und den Monat Dezember in der short.test-Reihe zu Testzwecken besonders hervorheben.
    Versteckter Text
    # Fit ARIMA, NN and ETS for short-run
    short <- ts(oil.ts[index(oil.ts) > "2014-06-30" & index(oil.ts) < "2014-12-01"], frequency=20)
    short.test <- as.numeric(oil.ts[index(oil.ts) >= "2014-12-01",])
    h <- length(short.test)
    fit.arima <- auto.arima(short, lambda=L)
    fcast.arima <- forecast(fit.arima, h, lambda=L)
    fit.nn <- nnetar(short, size=7, lambda=L)
    fcast.nn <- forecast(fit.nn, h, lambda=L)
    fit.tbats <-tbats(short, lambda=L)
    fcast.tbats <- forecast(fit.tbats, h, lambda=L)
    par(mfrow=c(3, 1))
    plot(fcast.arima, include=3*h)
    plot(fcast.nn, include=3*h)
    plot(fcast.tbats, include=3*h)
    




    Das neuronale Netzwerk war nach der Umschulung etwas astralisiert, und ARIMA zeigte eine sehr interessante Abhängigkeit - interessant in Bezug auf die Nähe zum realen Bild. Nachfolgend finden Sie einen Vergleich der Vorhersagen für jedes Modell mit den tatsächlichen Daten im Dezember und dem mittleren absoluten prozentualen Fehler :
    Versteckter Text
    par(mfrow=c(1, 1))
    plot(short.test, type="l", col="red", lwd=5, xlab="Day", ylab="Price, $", main="December prices",
         ylim=c(min(short.test, fcast.arima$mean, fcast.tbats$mean, fcast.nn$mean),
                max(short.test, fcast.arima$mean, fcast.tbats$mean, fcast.nn$mean)))
    lines(as.numeric(fcast.nn$mean), col="green", lwd=3,lty=2)
    lines(as.numeric(fcast.tbats$mean), col="magenta", lwd=3,lty=2)
    lines(as.numeric(fcast.arima$mean), col="blue", lwd=3, lty=2)
    legend("topright", legend=c("Real Data","NeuralNet","TBATS", "ARIMA"), 
           col=c("red","green", "magenta","blue"), lty=c(1,2,2,2), lwd=c(5,3,3,3))
    grid()
    




    Versteckter Text
    mape <- function(r, f){
      len <- length(r)
      return(sum( abs(r - f$mean[1:len]) / r) / len * 100)
    }
    mape(short.test, fcast.arima)
    mape(short.test, fcast.nn)
    mape(short.test, fcast.tbats)
    


    ARIMANNetTBATS
    1,99%18,26%4,00%


    Anstelle einer Schlussfolgerung


    Ich werde Langzeitprognosen nicht kommentieren: Es ist offensichtlich, dass sie in dieser Situation bereits falsch und falsch sind. ARIMA zeigte jedoch kurzfristig sehr gute Ergebnisse. Beachten Sie auch die folgenden Fakten. Öl fiel im Preis:

    1. für September um 5%;
    2. für Oktober - um 10%;
    3. im November - um 15%;
    4. für Dezember ...?

    Dies scheint uns darauf hinzudeuten, dass der Prozess der Änderung der Ölpreise weit von einem Prozess entfernt ist, der durch zufällige Parameter reguliert wird.

    Jetzt auch beliebt: