Jump to content
Tom Next - Daytrading Community

Datenauswertung mit R


Krümel

Recommended Posts

Download und Installation

 

Download des Opensource-Projekts R ist relativ einfach. Man gehe auf http://cran.r-project.org/ und suche sich die geeignete Betriebssystemvariante aus. Möglich sind Windows, Linux und Mac. Die Linux-Variante kenne ich nicht, aber die Mac-Variante ist um Welten besser als die Windows-GUI-Variante. Aber ich fürchte, das ist Absicht, dass Windows so vernachlässigt wird. Na ja, zum Programmieren reichts aber und es gibt mittlerweile diverse Editoren (u.a. Emacs), die R Syntaxhiglighting beherrschen.

 

Ich entscheide mich für die :sad:

 

In die Konsole tippere ich also ein: '5+5' . Als Ergebnis bekomme ich '10' angezeigt. Das sollte laut Überschlag im Kopf auch in etwa richtig sein.

 

'5+5' ist ein Ausdruck, der von R ausgewertet wird, was soviel heißt wie: er rechnet 5+5 aus. Wie für einen Ausdruck typisch (sagt zumindest der obige Kursivtext), wird das Ergebnis in die Konsole geschrieben, die 10 verschwindet jedoch im Datennirwana, nachdem wir sie uns einmal angucken durften.

 

R_start1.PNG

Ok, damit hat man jetzt einen einfachen Taschenrechner, aber das wäre den Aufwand nicht wert, ein Tutorial zu schreiben.

 

Was ist also der Charme von R? Na ja, bleibt ja nur noch die zweite Variante - die Zuweisung.

 

Bsp: x=5+5

 

Anmerkung: Kommandos in der Konsole bedürfen zu ihrer Ausführung des finalen Peitschenknalls, was in der R-Welt ein bzw. ist.

R_start2.PNG

 

Hier sieht man jetzt (Wenn ich fies wäre, würde ich jetzt schreiben: "Wie für den aufmerksamen Leser klar ersichtlich ist..." :wink2: ) eventuell, dass das Ergebnis NICHT mehr in der Konsole steht, sondern der Wert '10' in die Variable namens 'x' geschrieben wurde bzw. der Variable x zugewiesen wurde.

 

Gibt man im Folgeschritt 'x ' ein, wird der Wert angezeigt. Die '10' bleibt uns jetzt solange erhalten, wie der Wert in der Variable x nicht überschrieben wurde durch eine andere Zuweisung (z.B. x=5+6, danach hätte x den Wert 11). Hier empfehle ich, mit dem Tool einfach ein bisschen zu spielen, um ein Gefühl dafür zu bekommen. Übung ist alles, Intelligenz ist nichts oder nur nen Bruchteil zumindest.

R_start3.PNG

 

Wie sind Variablen-, Funktionsnamen zu formulieren ?

 

R ist sensitiv für Groß- und Kleinschreibung. D.h. ein Symbol/Variable/Funktion namens 'A' ist nicht identisch mit 'a'. Zeichen, die verwendet werden dürfen sind betriebssystem- und landesspezifisch. Normalerweise sind aber sämtliche alphanumerischen Zeichen erlaubt, zusätzlich noch ‘.’ and ‘_’. Einschränkung: ein Name muss mit ‘.’ or einem Buchstaben beginnen, oder, falls er er mit ‘.’ beginnt, darf danach als 2. Zeichen keine Ziffer folgen.

 

 

Variablen

Der erfahrene MT-Programmierer stutzt sicherlich, wenn er sieht, wie ich x=5+5 schreibe. Jaaahaaa, so einfach kann es gehen ! *schaut triumphierend auf gequälte MQL-Programmierer herab* R ist intelligent genug, sich den richtigen Datentypen, der nach Anwendung des +-Operators auf 2 Zahlen entsteht rauszusuchen und x implizit zu deklarieren.

 

Durch Abfrage mittels class(x) bekommen wir mitgeteilt, dass x "numeric ist". Zu den Datentypen lasse ich mich später noch detaillierter aus. An der Stelle will ich dies nur als enorme Erleichterung erwähnen, dass man sich eigentlich sehr selten um sowas "Niederes" wie Datentypen kümmern muss.

 

Schreibe ich 'x=1', dann ist x vom Typ (bzw. der Klasse "numeric"), schreibe ich im Anschluss 'x="Hallo"', dann wird x wie durch Zauberhand zum String (bzw. "character"). Wenn ich geschickt programmiere, kann ich wahrscheinlich auch mit einer einzigen Variable hochkomplexe Programme schreiben, indem ich sie immer und immer wieder nachnutze. Das sollte man aber nicht machen, sonst trägt man schneller enggeschnittene weiße Jäckchen, die nicht mehr vorn zu öffnen sind als einem lieb ist.

 

 

Mehr als ein Befehl ?

Verschiedene Kommandos werden entweder durch ';' oder Zeilenumbruch voneinander getrennt. Letzeres passiert ja automatisch beim Enterdrücken in der Konsole. Wenn man aber Sequenzen von Ausdrücken in ner Datei speichert, sollte man drauf achten, dass entweder nur ein Befehl pro Zeile steht oder aber die Befehle innerhalb einer Zeile durch Semikolon getrennt werden.

 

Bsp. x=5+5;print(x);x=5+6;print(x)

 

Der letzte Befehl innerhalb einer Zeile darf ohne ';' auskommen, die Befehle müssen durch ';' getrennt werden.

 

Man kann prinzipiell komplette Programme in eine einzige Zeile pressen. Guter Programmierstil beinhaltet aber m.M.n. auch, dass man zumindest am rechten Bildschirmrand mal den einen oder anderen Zeilenumbruch einfügt.

R_intro.PNG

 

 

Kommentarzeichen

Kommentarzeichen sind nicht die bei MT oder C/C++, Java und C# oder ähnlichem benutzten // oder /**/, sondern mal was ganz anderes - das oft vernachlässigte und völlig zu Unrecht total unterschätzte :sad: Rautezeichen '#', welches bedauerlicherweise aber nur für die eine Zeile gilt (ähnlich dem // bei MQL und ähnlichen Sprachen ).

 

Bsp.

#Hier steht ein Kommentar

#Hier steht ein weiterer.

R_start.PNG

Link to comment
Share on other sites

Funktionen in R

 

Eine Funktion in R sieht z.B. wie folgt aus:

 

show.me

{

print(paste(text,mehr.text));

return ("Fertig")

}

show.me ist der Funktionsname, '

 

Eine Funktion zählt in R wie auch eine Variable als Objekt und muss R bekannt gemacht werden. Am einfachsten geht das, wenn man sich über Datei->Neues Skript eine neue leere Datei erstellt, die Funktion dahinein tippert, markiert und dann im Kontextemenü auf "Ausführen" geht. Wie man sieht, wird dabei der Text in die Konsole kopiert (der Text in Rot) und dem Objekt show.me zugewiesen. (class(show.me) ergibt im Anschluss "function", d.h. das Objekt show.me ist vom Typ "function". )

 

Im folgenden kann jetzt der Inhalt von show.me abgefragt werden, indem man lediglich den Objektnamen + Enter in die Kommandozeile tippert.

 

R_function.PNG

 

Um die Funktion aber auszuführen, muss man die () und die (optionalen) Parameter zusätzlich miteingeben.

 

show.me()

wirft eine Fehlermeldung aus, da der Parameter text gesetzt sein muss. Der zweite Parameter mehr.text hingegen hat von mir in der Funktionsbeschreibung (siehe obenstehende Codebox) einen Default-Wert bekommen, so dass er nun als optional gilt. Wird er beim Funktionsaufruf nicht angegeben, wird der Defaultwert benutzt.

show.me("Hallo") und show.me("Hallo",mehr.text="Chef") funktionieren hingegen. Btw.: auch show.me("Hallo","Chef") würde funktionieren. Der Parametername muss immer dann angegeben werden, wenn beim Aufruf nicht alle Parameter in der richtigen Reihenfolge belegt werden.

 

Bsp: show.me(mehr.text="Chef",text="Hallo") funktioniert ebenfalls korrekt, auch wenn die Parameternamen "vertauscht" sind.

 

Das macht die Programmierung der Funktionen doch recht flexibel. Man benützt nur die Parameter, die man wirklich braucht beim Funktionsaufruf. In den Standard-R-Funktionen sind die meisten Parameter mit brauchbaren Defaultwerten versehen. Welche das sind, steht jeweils in der Hilfedatei. Wie man in das heilige Buch Einblick bekommt, erkläre ich weiter unten.

Die Möglichkeit, die Parameternamen mit anzugeben erhöht darüberhinaus die Codelesbarkeit, finde ich.

 

Funktionsrückgabewert

show.me("Hallo") ist wie oben beschrieben ein Ausdruck, dessen Ergebnis - "Fertig" - ausgegeben wird, um hinterher verloren zu sein.

 

R_function2.PNG

 

result=show.me("Hallo") hingegen bewahrt das "Fertig" bis in alle Ewigkeit. Also dem Ende der R Sitzung, falls man den Workspace (die Arbeitsumgebung) nicht speichert (Abfrage bei Beendigung von R oder über Datei->Sichere Workspace) oder bis man der Variable result einen neuen Wert zuweist.

 

Abfragen kann man den Wert von 'result' durch Eingeben des Namens und - once again - .

 

Natürlich kann man eine Funktion auch ohne Rückgabewert programmieren:

 

show.me

{

print(paste(text,mehr.text));

}

 

Danach muss man R die Änderung bekanntmachen, indem man die Funktion erneut markiert und auf "Ausführen Zeile oder Auswahl" geht.

R_function3.PNG

 

Das Schöne ist, dass man sich nach jedem Schritt die Änderungen in den Variablen anschaun kann durch Abfrage in der Konsole und Programmieren so viel schneller lernt als bei komplexeren Sprachen wie C/C++ usw., die grade Programmieranfängern doch noch einen viel größeren Berg an Problemen entgegenschleudern.

Man hat auch bedeutend mehr Erfolgserlebnisse, was für die Anfangsmotivation eine nicht unbedeutende Rolle spielt.

:wink2:

 

 

Alternativ kann man in der Konsole einfach den Text der Funktion runterschreiben. R erkennt automatisch, dass man noch was zu sagen hat (eigentlich wartet es nur auf die schließende Klammer, aber pssssst :pfue:), was an den roten '+' Zeichen und dem ausbleibendem Promptsymbol '>' erkennbar ist.

R_konsole.png

Kriegt man irgendwann Panik, weil man vergessen hat, ob man ne Klammer/Anführunsgstriche bei Zeichenketten schon gesetzt hat oder nicht - was bei längeren Programmen der Fall sein kann - erlaubt der rote Stop-Knopf (s. Pfeil) einen Abbruch der Eingabe. Der Stop-Knopf hat sich auch bei Programmen, die zu lange laufen oder sich in Endlos-While-Schleifen aufhäkeln bewährt.

Link to comment
Share on other sites

Bleibt zu Ergänzen: In einer der letzten Ausgaben des Computermagazins-C't ist ein Artikel erschienen, der sich ebenfalls mit 'R' beschäftigt und einen kurzen Einblick in die Programmierung von "R" gewährt.

 

 

"R-leuchtung"

c't 13/2009, S. 166

Quelle: www.heise.de

Link to comment
Share on other sites

Literaturempfehlungen kommen zwar meist ganz am Ende, da ich aber noch nicht abschätzen kann, wann das sein wird, schieb' ich diese an der Stelle mal ein. Was bei mir zu Hause steht (allerdings noch nicht komplett gelesen ist :wink2:, dennoch für "gut" befunden werden kann):

 

"The R Book" ist ne recht gute Übersicht mit anschließendem Statistik-Anwendungsteil, sehr anwendungsfreundlich, allerdings in Englisch. Das kann ja für einige eine Hürde darstellen. Das meiste ist aber Quellcode, von daher spielt die Sprache da nicht so die große Rolle, finde ich.

 

Deutsche Literatur zum Thema R kann ich nicht empfehlen, da ich schlichtweg keine habe. Wenn man bei Amazon in

ic.arrow.right.png Einführung in R: Ein Kochbuch zur statistischen Datenanalyse mit R blättert, könnte das für Einsteiger geeignet sein.

 

 

 

Die Offtopic-Postings findet Ihr zukünftig ic.arrow.right.png hier.

Link to comment
Share on other sites

Krümel, klasse wie du das hier mit R machst. Danke.

 

Habe hier noch ein deutschsprachiges Forum gefunden:

linked.gif

 

und die Website vom deutschsprachigen Autor:

linked.gif

 

Einführung in die Statistik mit R

kommt im 4.Q 2009

Neu in der 2. Auflage

Neben vielen neuen, wirtschaftsorientierten Beispielen werden nun auch die Paneldatenanalyse und Stichprobentheorie anschaulich erläutert.

 

 

WIKI:

http://de.wikibooks.org/wiki/GNU_R

 

Beste Grüße

Jürgen

... aus dem PKW

Link to comment
Share on other sites

Datentypen

Kann sein, dass ich welche vergessen habe. Nein, ist sehr wahrscheinlich, dass ich welche vergessen habe, denn R ist ein Molloch, auch wenn es nach dem ersten Programmstart so harmlos aussieht. Die gängigsten Typen sollten aber zumindest genannt sein, zusammen mit ein paar Funktionen, die sich für mich in der täglichen Arbeit als nützlich erwiesen haben. Für mehr Infos verweise ich gern auf "The R Book" linked.gif.

 


  • numeric (integer,double,real)
    Bsp.:
    x=1; class(x)
    x=0.1; class(x)
     
    Standardmäßig sind derartige Objekte vom Typ "numeric". Wer es spezieller mag, muss eine der Umwandlungsfunktionen benutzen, die vom Format as. sind. Mir reicht für gewöhnlich numeric als Typ völlig aus.
     
    In R sind alles Objekte, auch Funktionen, wie ich zuvor schon gezeigt habe. Abfrage des aktuellen Typs erfolgt mittels der Funktion class(), Testen auf einen speziellen Datentyp kann man mittels einer Funktion im Format is. und umwandeln kann man mittels as. .
     
    Mit as.integer(1) erzeugt man also einen "echten" Ganzzahlwert, wenn man allerdings as.integer(0.1) macht, kommt auch ne echte ganze Zahl raus, nämlich 0 :wink2:.
     
     

  • character: die handelsübliche Zeichenkette.
     
    Bsp: x="hallo welt"
     
    Zusammensetzung mehrerer Zeichenketten ist mittels der Funktion paste() möglich ('+' geht leider nicht :sad:).
     
    x=paste("hallo","welt") ergibt "hallo welt". Per Default werden die einzelnen Strings, wovon beliebig viele in paste eingegeben werden können durch ein einfaches Leerzeichen verbunden. Will man ein anderes Zeichen, muss man zusätzlich den Parameter sep (für Seperator bzw. Trennzeichen) benutzen.
     
    paste("hallo","welt",sep='\t') verbindet die einzelnen Zeichenketten z.B. mittels 1 Tabulatorzeichens.
     
    Um sich mehrere Variablen innerhalb einer Zeile in der Konsole vom Programm ausgeben zu lassen, ist leider ebenfalls der Umweg über paste() zu gehen. Zumindest ist mir kein anderer bekannt. :sad:
     
    x=1
    y="hallo"
    print(paste(y,x))
     
    [1] "hallo 1"
     
     

  • logical (was bedeutet: Boolesch)
     
    Werte: TRUE (oder T), FALSE (oder F)
    Entsteht immer als Ergebnis einer Vergleichsoperation wie '>=','',' 

  • factor
    Lass ich hier mal unter den Tisch fallen, ist aber für die komplexeren statistischen Verfahren ein echter Nutzen.
     

  • function
    Damit kann man auch richtig fiese Sachen machen, aber das geht hier zu weit vom Thema weg.
     

  • list
    Listen sind ideal, um alles zu verstauen, was sonst keiner haben will .... hätte ich beinahe geschrieben. Aber nein, Listen sind ideal, um als Rückgabetyp von Funktionen benutzt zu werden, die mehr als nur einen Rückgabewert haben sollen.
     
    Mittels list() (hmm, wir originell) legt man eine leere Liste an und fügt anschließend ein, was man aus einer Funktion raustransportieren will. Call-By-Reference geht meines Wissens nach nicht in R, von daher muss man zum Beispiel über ne Liste alles reinbringen in ne Funktion, was man haben will und über dieselbe Liste auch per return wieder raus.
     
    In Listen kann man alles einbauen, was man haben will: weitere Listen, Matrizen, Arrays, Dataframes....
     
    liste=list()
    liste$elements=1:10
    liste$elements2=seq(from=20,by=-2,to=0)
     
    liste
    $elements
    [1] 1 2 3 4 5 6 7 8 9 10
     
    $elements2
    [1] 20 18 16 14 12 10 8 6 4 2 0
     

  • Array (Vektor)
    Arrays/Vektoren sind Anreihungen von Elementen desselben Typs.
    Man erstellt einen leeren Vektor mittels c() (soll wahrscheinlich für Collection stehen).
    x=c()
    x=c(1,2,3)
     
    Für bestimmte Inkrementierungen/Dekrementierungen gibt es den seq-Befehl, der das Hoch- bzw. Runterzählen für einen übernimmt.
    x=seq(from=0,by=1,to=5) erstellt denselben Vektorinhalt in x wie x=c(0,1,2,3,4,5), kürzer geht es noch mit x=0:5.
     
    mit rep() kann man sich Elemente wiederholen (repeat) lassen:
     
    rep(1,times=3)
    [1] 1 1 1
     
    rep(c(1,2,3),times=2)
    [1] 1 2 3 1 2 3
     
    rep(c(1,2,3),each=2)
    [1] 1 1 2 2 3 3
     
    Man kann natürlich auch "Artfremdes" zusammenpacken wie z.B. mittels c(1,1
    c(1,1[1] "1" "TRUE" "A"
    So auch in diesem Fall (wie überraschend :pfue:).
     
    Ähnliche Überraschungen erwarten einen auch bei dem 2-dimensionalen Array namens "matrix" (3- und mehrdimensionale Arrays gibt es ebenfalls in R. Sie haben jedoch keinen speziellen Namen). Zum Vermeiden solcher Zwangskonvertierungen muss man dann schon auf nen Dataframe oder noch besser auf ne Liste zurückgreifen.
     
    Auf die einzelnen Elemente in dem Array kann man über den Spaltenindex (die Spaltennummer) zugreifen. R zählt dabei von 1 an und nicht von 0 !
     
    x=c(1,2,3)
    x[2]
     
    [1] 2
     
    Man kann den Spalten auch Namen geben mittels der Funktion names() und dann zusätzlich auch über diesen Namen "indizieren":
    x=c(1,2,3)
    names(x) = c("A","B","C") #Namen vergeben
    x["B"] ergibt dann ebenfalls 2.

Link to comment
Share on other sites

Da mir die Boardsoftware nur eine bestimmte Anzahl an Quote-Tags/Posting erlaubt, nun die Fortsetzung:

 


  • Matrix
    Ein 2-dimensionales Array muss man explizit anlegen mittels matrix-Befehl.
     
    Bsp.: matrix(0,nrow=4,ncol=3) erzeugt als Ergebnis eine Matrix, die nur 0en enthält mit 4 Zeilen und 3 Spalten, die wie folgt aussieht:
    [,1] [,2] [,3]
    [1,] 0 0 0
    [2,] 0 0 0
    [3,] 0 0 0
    [4,] 0 0 0
     
    Es geht natürlich auch mit Zeichenketten:
     
    matrix("Test",nrow=3,ncol=2)
     
    [,1] [,2]
    [1,] "Test" "Test"
    [2,] "Test" "Test"
    [3,] "Test" "Test"
     
    Oder wie wäre es, einen Vektor/Array in eine Matrix umzuwandeln ?
    v = c(1,2,3,4,5,6,7,8,9,10)
    m=matrix(v,ncol=2,nrow=5)
    m
    [,1] [,2]
    [1,] 1 6
    [2,] 2 7
    [3,] 3 8
    [4,] 4 9
    [5,] 5 10
     
    oder auch
    v = c(1,2,3,4,5,6,7,8,9,10)
    m=matrix(v,ncol=2,nrow=5,byrow=T)
     
     
    [,1] [,2]
    [1,] 1 2
    [2,] 3 4
    [3,] 5 6
    [4,] 7 8
    [5,] 9 10
     
     
    Transponieren (Vertauschen von Zeilen und Spalten) geht auch recht flink:
    t(m)
    [,1] [,2] [,3] [,4] [,5]
    [1,] 1 2 3 4 5
    [2,] 6 7 8 9 10
     
     
    Mittels colnames() und rownames() kann ich sowohl Namen für die Spalten als auch die Zeilen vergeben.
    R_matrix.PNG
     
     
    Zugriff auf die einzelnen Elemente bekommt man mittels Indizierung.
    m[1,2] liefert das Element der ersten Zeile und der 2. Spalte.
    Wenn mittels colnames()/rownames() Namen (analog zu der names()-Funktion bei einfachen Arrays) vergeben wurden, können diese ebenfalls benutzt werden.
     
    m["A","B"] liefert dann das Element, welches in der Zeile A und Spalte B stand.
     
    Zugriff auf mehrere Elemente bekommt man durch Eingabe von Index-Vektoren, welches aber auch die Namen sein können anstelle der Spalten-/Zeilennummern. Dadurch erhöht sich meist die Codelesbarkeit.
     
    m[c("A","C"),c("B","A")]
     
    B A
    A 6 1
    C 8 3
    Man kann sich damit also auch Spalten und Zeilen beliebig rausgreifen/umsortieren.
     
    Zeilenanhängen mittels rbind, Spaltenanhängen mittels cbind:
     
    m=matrix(v,ncol=2,nrow=5)
    m=rbind(m,c(11,12))
    m
    [,1] [,2]
    [1,] 1 6
    [2,] 2 7
    [3,] 3 8
    [4,] 4 9
    [5,] 5 10
    [6,] 11 12
     
    m=cbind(m,13:18)
    m
    [,1] [,2] [,3]
    [1,] 1 6 13
    [2,] 2 7 14
    [3,] 3 8 15
    [4,] 4 9 16
    [5,] 5 10 17
    [6,] 11 12 18
     
     
     

  • Dataframe
     
    Mein Lieblingsdatentyp in R :wink2: ist der Dataframe. Vergleichbar ist er mit ner Exceltabelle und kann auch in etwa so verwendet werden. Wenn man sich in die Materie mal richtig tief reingefummelt hat, kann man mit Dataframes arbeiten wie mit Datenbank-Tabellen. Zum Großteil ist das auch recht performant.
     
    Dataframes sind recht ähnlich zu Matrizen, können aber pro Spalte einen anderen Typ haben - den jedoch für die gesamte Spalte. Damit sind Dataframes DER ideale Datentyp, um Kursdaten (Zahlen und Zeichenketten) zu speichern.
     
    Für Dataframes können rbind (Zeilen anhängen), cbind (Spalten anhängen), colnames (Spaltennamen abfragen oder vergeben), rownames (Zeilennamen abfragen oder vergeben) analog zu den Matrix-Funktionen eingesetzt werden.
     
    d=data.frame(Time=c("1 Uhr","2 Uhr","3 Uhr"),Kurs=c(1000,1200,1300),stringsAsFactors=F)
     
    d
    Time Kurs
    1 1 Uhr 1000
    2 2 Uhr 1200
    3 3 Uhr 1300
     
    Zugriff auf die Elemente erhält man entweder über den Zeilen-/Spaltenindex und ebenfalls über den Namen, allerdings hat man hier 2 Varianten.
    m[,"Time"] oder auch m$Time liefern beide den Inhalt der Spalte "Time". Oder man nimmt die Zeilen-/Spaltennummer - das klappt sowieso immer. Hier wäre das d[,1], um ebenfalls die erste Spalte mit den Time-Werten abzufragen.

Link to comment
Share on other sites

Aber so kompliziert soll es ja hier nicht werden.

 

Was soll nachgeprüft werden ?

 

....die folgende Aussage linked.gif:

Untersuchungen der historischen XETRA DAX Daten führten zu dem Ergebnis, dass seit 2003 bei einer durchschnittlichen VDAX Schwankungsbreite von 15-25 die morgendlichen Kurslücken zu 90% unter 35 Punkten notierten.

 

Ich brauche also Xetra-Dax-Daten und VDax-Daten möglichst bis zum Jahr 2003 zurückliegend.

 

 

Wo kriege ich kostenlos Daten her ? :sad:

 

Kostenlose EOD-Daten für den Xetra-Dax und den VDax gibt es bei http://de.finance.yahoo.com:

    [*]Dax: :sad:), reichen meiner Erfahrung nach eine Handvoll Funktionen für den Anfang völlig aus, auf die ich mich hier beschränken werde.

     

     

     

    1. Dateneinlesen

    Im ersten Schritt meines "Wir glauben keiner Statistik, die wir nicht selbst gefälscht haben"-Feldzugs :pfue: sollen die heruntergeladenen Xetra- und VDax-Dax-Daten im CSV-Format aus den Textdateien eingelesen werden. Und zwar in jeweils einen Dataframe. Prinzipiell hält R eine recht mächtige Funktion bereit, die sich read.table nennt und mit gefühlten 10 Millionen Parametern einherkommt, von denen ich ca. 5 regelmäßig benutze.

     

    Für das gängige CSV-Format gibt es jedoch eine einfachere Funktion, die sich read.csv nennt.

     

    Um mehr über eine Funktion zu erfahren, kann man z.B. mal einen Blick in die Hilfedatei werfen mittels

    help(). Um in die Hilfedatei zu schauen (möglich ist ebenfalls eine HTML-Variante, das entscheidet man bei der Installation), tippe ich help(read.csv) in die Kommandozeile.

     

    R_help.PNG

     

    Wenn man noch weniger weiß über die Funktion (z.B. keinen Namen hat, sondern nur ne Idee), gibt es noch eine Reihe anderer Funktionen wie help.search(), find () oder apropos().

     

    Die Hilfe/Dokumentation von R ist - typisch für ein Opensource-Projekt - recht *hust* gewöhnungsbedürftig. Das muss man ignorieren und beim Lesen der Hilfedateien stoisch vor sich hinmurmeln "Ich bin nicht dumm, ich bin nicht dumm", denn sonst kann einem doch ab und an das Selbstbewusstsein verlassen. Das ist keine böse Absicht, sondern Programmierer programmieren in der Regel gern, schreiben aber höchst ungern Dokumentationen, v.a. wenn es derart schlecht bezahlt wird wie in einem Opensource-Projekt :wink2:. Zum Glück gibt es mittlerweile schon eine Reihe guter R-Bücher zu kaufen, was zu tun ich auch schwer empfehlen würde.

Link to comment
Share on other sites

read.csv(file, header = TRUE, sep = ",", quote="\"", dec=".", fill = TRUE, comment.char="", ...)

 

 

read.csv() erwartet vor allem einen Dateinamen file. Dies sollte ein vollständiger sein, also mit kompletten Pfad, wenn das aktuelle Arbeitsverzeichnis - der Standardsuchpfad sozusagen - nicht das Verzeichnis ist, indem die beiden Datendateien schlummern.

 

Variante 1: mit kompletten Pfad.

 

Bei mir ist das 'E:/Privat/Boerse/R/analyses/tutorial/data'. Achtung bei den '/' ! R mag entweder '/' (Windowstypisch ist allerdings '\') oder '//'.

path="E:/Privat/Boerse/R/analyses/tutorial/data/"

file.name=paste(path,"Dax_EOD.csv",sep='')

dax=read.csv(file=file.name)

 

oder kürzer durch Verschachtelungen:

dax=read.csv(file=paste("E:/Privat/Boerse/R/analyses/tutorial/data/","Dax_EOD.csv",sep=''))

 

Jetzt mal vorsichtig nachschauen, ob die Daten tatsächlich eingelesen wurden:

str(dax)

 

ergibt:

'data.frame': 4711 obs. of 7 variables:

$ Date : Factor w/ 4711 levels "1990-11-26","1990-11-27",..: 4711 4710 4709 4708 4707 4706

$ Open : num 5234 5129 5099 5041 5014 ...

$ High : num 5302 5259 5138 5141 5064 ...

$ Low : num 5202 5101 5050 5027 5008 ...

$ Close : num 5229 5247 5122 5094 5030 ...

$ Volume : int 30435400 29287400 24780000 23944300 21907700 30019000 26740800

$ Adj.Close: num 5229 5247 5122 5094 5030 ...

Mit str() kann man sich die Structure eines R-Objektes anschauen.

 

Oder doch lieber nen Blick auf die ersten 10 Datensätze riskieren :pfue: ?

dax[1:10,]

 

Date Open High Low Close Volume Adj.Close

1 2009-07-24 5233.85 5301.91 5202.02 5229.36 30435400 5229.36

2 2009-07-23 5129.22 5258.84 5101.26 5247.28 29287400 5247.28

3 2009-07-22 5098.84 5137.51 5050.40 5121.56 24780000 5121.56

4 2009-07-21 5041.19 5141.36 5027.30 5093.97 23944300 5093.97

5 2009-07-20 5014.50 5063.60 5007.95 5030.15 21907700 5030.15

6 2009-07-17 4980.01 5017.60 4960.65 4978.40 30019000 4978.40

7 2009-07-16 4920.77 4998.68 4904.24 4957.19 26740800 4957.19

8 2009-07-15 4799.25 4928.45 4798.69 4928.44 28678300 4928.44

9 2009-07-14 4734.20 4802.98 4705.91 4781.69 24792000 4781.69

10 2009-07-13 4564.94 4722.34 4524.01 4722.34 23699200 4722.34

 

Sieht ja bislang recht ordentlich aus.

nrow(dax) teilt uns mit, dass dax 4711 Zeilen enthält und ncol(dax) das da 7 Spalten sind. Dasselbe sagt aber auch die von mir fettmarkierte Zeile bei str(dax) aus. Als "obs." gelten dabei die "observations", was gleichbedeutend mit den Zeilen ist, als "variables" werden die Spalten des Dataframes bezeichnet.

 

 

Variante 2: mit Änderung des "working directories" (Standardsuchpfad).

path="E:/Privat/Boerse/R/analyses/tutorial/data/"

setwd(path)

dax=read.csv(file="Dax_EOD.csv")

ist ebenso erfolgreich. Das gesetzte working directory kann man zuvor mit getwd() erfragen, falls die Neugierde zu sehr drückt. Danach gilt dann aber bis zum nächsten R-Start bzw. zur Änderung mittels setwd() das gesetzte Verzeichnis. Um nur eine einzige Datei einzulesen lohnt es meist nicht und man kommt besser mit Variante 1. Aber das muss man selbst rausfinden, was einem mehr liegt.

R bietet für alle komplexeren Lösungen meist mehrere Wege, auf denen man sich gen Rom vorkämpfen kann.

 

 

Sieht die einzulesende Datei im Format anders aus als unsere Dateien, kann man noch an diversen Parametern schrauben, entweder in read.csv() selbst oder aber in einer der anderen Einlesefunktionen (siehe help(read.csv)). Bislang gab es keine Datei, die ich nicht einlesen konnte, auch wenn es manchmal etwas kniffelig sein kann, v.a. bei exotischen Formaten.

 

 

Das Ganze macht man jetzt analog für die VDax-Daten:

path="E:/Privat/Boerse/R/analyses/tutorial/data/"

file.name=paste(path,"VDax_EOD.csv",sep='')

vdax=read.csv(file=file.name)

 

str(vdax)

 

'data.frame': 933 obs. of 7 variables:

$ Date : Factor w/ 933 levels "2005-11-16","2005-11-17",..: 933 932 931 930 929 928 927 926 925 924 ...

$ Open : num 24.9 24.8 25.4 25.4 25.4 ...

$ High : num 24.9 24.8 25.4 25.4 25.4 ...

$ Low : num 24.9 24.8 25.4 25.4 25.4 ...

$ Close : num 24.9 24.8 25.4 25.4 25.4 ...

$ Volume : int 0 0 0 0 0 0 0 0 0 0 ...

$ Adj.Close: num 24.9 24.8 25.4 25.4 25.4 ..

 

Wie man sieht sind hier nur 933 Datensätze vorhanden, beim Dax sind es 4711.

 

Da ich aber korrespondierende Daten brauche - zu jedem Dax-Close soll es auch nen VDax-Close geben - muss ich die überflüssigen Dax-Daten entfernen.

Dies mache ich durch "Mergen" (Vermischen) der beiden Dataframes. Dabei sollen auch gleich alle anderen Spalten von vdax wegfallen, die keine Close-Daten enthalten.

 

merged.data =merge(x=dax[,c("Date","Open","High","Low","Close")],

y=vdax[,c("Close","Date")],by="Date",suffixes=c("",".VDax"))

 

str(merged.data)

 

'data.frame': 932 obs. of 6 variables:

$ Date : Factor w/ 4711 levels "1990-11-26","1990-11-27",..: 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 ...

$ Open : num 5108 5098 5129 5140 5179 ...

$ High : num 5115 5130 5163 5180 5183 ...

$ Low : num 5064 5090 5109 5127 5161 ...

$ Close : num 5081 5100 5124 5171 5175 ...

$ Close.VDax: num 14.6 14.5 14.3 13.6 13.7 ...

 

Man gibt also 2 Dataframes in die merge() - Funktion hinein. Mittels des by-Parameters teilt man der Funktion mit, welche Spalte (es gehen auch mehrere) als gemeinsames Kriterium benutzt werden sollen, um Datensätze zu vermischen, die sich in den Werten des by-Parameters gleichen (in unserem Falle ist das die Spalte "Date"). Die doppelte Spalte wird dabei ebenfalls entfernt, sprich: man hat letztendlich nur noch eine Spalte "Date" .

 

Da ich gesehen habe, dass die Volumen-Spalten z.T. keine und manchmal merkwürdige Daten enthalten haben, habe ich sie aus beiden Datensätzen entfernt, indem die Dataframes in den Parametern x und y nur noch die "guten" Spalten enthalten.

suffixes ist ein weiterer Parameter, den man benutzen kann, um merge() mitzuteilen, wie Spalten mit doppelten Namen, die in beiden Dataframes auftauchen (hier: Spalte "Close") umbenannt werden sollen bzw. welches Suffix angehängt werden soll. Bei den Dax-Close-Daten soll nichts angehängt werden (daher ""), bei den VDax-Closes ".VDax".

 

 

Zum Abschluss nochmal schnell der komplette Code zum Einlesen mit Variante 1 (komplette Dateinamen):

#Verzeichnis mit den Daten

path="E:/Privat/Boerse/R/analyses/tutorial/data/"

 

#Dateinamen bilden

file.name=paste(path,"Dax_EOD.csv",sep='')

 

#Dax-CSV-Datei einlesen

dax=read.csv(file=file.name)

 

#Dateinamen bilden für die VDax-Daten

file.name=paste(path,"VDax_EOD.csv",sep='')

 

#VDax-Daten einlesen

vdax=read.csv(file=file.name)

 

#Vermischen der beiden Tabellen, damit man zu einem Datum sowohl Dax- als auch VDax-(Close)Kurse hat

merged.data =merge(x=dax[,c("Date","Open","High","Low","Close")],

y=vdax[,c("Close","Date")], by="Date", suffixes=c("",".VDax"))

 

To be continued :wink2:.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...