Post
Topic
Board Trading und Spekulation
Re: Methoden und Algorithmen zur fortgeschrittenen Kursanalyse
by
trantute2
on 03/08/2018, 06:15:37 UTC
Moin Waikoloa16,

Poste mal die Fehlermeldungen. R ist nicht sonderlich gesprächig und informativ was Fehler angeht. Aber wenn man ein Weilchen damit arbeitet, dann bekommt man ein Gefühl dafür. Und ja, ich muss das nochmal vollständig überarbeiten und die ganzen neuen Sachen mit übernehmen. Das könnte sich aber etwas ziehen ...

Aber wie schon weiter oben irgendwo erwähnt, Du musst zu Beginn die entsprechenden Pakete installieren (falls Du das noch nicht gemacht hast):

Code:
install.packages("anytime");
install.packages("data.table");
install.packages('depmixS4');

Dies fehlt in oberen Codesnippets. Desweiteren kann es sein, dass das Betriebssystem Bibliotheken bereitstellen muss, welche R wiederum benötigt um die Pakete zu kompilieren. Bei Windows ist das nicht nötig soweit ich weiss. Also nochmals, poste mal die Fehlermeldungen.

Hallo Trantute,
Vielen Dank für die schnelle Antwort.

Hier mal die Fehlermeldungen:

Code:
>  install.packages("anytime");
versuche URL 'https://ftp.fau.de/cran/bin/macosx/el-capitan/contrib/3.5/anytime_0.3.1.tgz'
Content type 'application/x-gzip' length 879140 bytes (858 KB)
==================================================
downloaded 858 KB


Die heruntergeladenen Binärpakete sind in
/var/folders/vd/lyd0z2f97wbb0xvrlgb1khwh0000gn/T//RtmpJdsmFy/downloaded_packages
> install.packages("data.table");
versuche URL 'https://ftp.fau.de/cran/bin/macosx/el-capitan/contrib/3.5/data.table_1.11.4.tgz'
Content type 'application/x-gzip' length 1700724 bytes (1.6 MB)
==================================================
downloaded 1.6 MB


Die heruntergeladenen Binärpakete sind in
/var/folders/vd/lyd0z2f97wbb0xvrlgb1khwh0000gn/T//RtmpJdsmFy/downloaded_packages
> install.packages('depmixS4');
versuche URL 'https://ftp.fau.de/cran/bin/macosx/el-capitan/contrib/3.5/depmixS4_1.3-3.tgz'
Content type 'application/x-gzip' length 828506 bytes (809 KB)
==================================================
downloaded 809 KB


Die heruntergeladenen Binärpakete sind in
/var/folders/vd/lyd0z2f97wbb0xvrlgb1khwh0000gn/T//RtmpJdsmFy/downloaded_packages
> x <- cbind(x, "CLOSE_PRICE"=close$PRICE);
Fehler in cbind(x, CLOSE_PRICE = close$PRICE) : Objekt 'x' nicht gefunden
>
> # berechne return eines Tages
> x <- cbind(x, "RETURN"=(x$CLOSE_PRICE - x$OPEN_PRICE)/x$OPEN_PRICE);
Fehler in cbind(x, RETURN = (x$CLOSE_PRICE - x$OPEN_PRICE)/x$OPEN_PRICE) :
  Objekt 'x' nicht gefunden
>
> # nicht so wichtig, gibt im Chart an ob Eröffungspreis über oder unter Schlusspreis liegt bzw. vice versa (das Rot und Grün auf bitcoinwisdom)
> change <- c(NA, as.integer(diff(x$MEAN_PRICE) > 0));
Fehler in diff(x$MEAN_PRICE) : Objekt 'x' nicht gefunden
> color <- as.integer(x$CLOSE_PRICE-x$OPEN_PRICE > 0);
Fehler: Objekt 'x' nicht gefunden
>
> # Spalten anfügen
> x <- cbind(x, "CHANGE"=change);
Fehler in cbind(x, CHANGE = change) : Objekt 'x' nicht gefunden
> x <- cbind(x, "COLOR"=color);
Fehler in cbind(x, COLOR = color) : Objekt 'x' nicht gefunden
>
> # build and fit the HMM mit 3 States stellvertretend für bärsich, bullisch und seitwärts
> hmm <- depmix(RETURN ~ 1, family = gaussian(), nstates = 3, data=x);
Fehler in depmix(RETURN ~ 1, family = gaussian(), nstates = 3, data = x) :
  Objekt 'x' nicht gefunden
> hmmfit <- fit(hmm, verbose = FALSE); # entält den Akaike-Score des Modells, braucht man um Modelle zu vergleichen
Fehler in fit(hmm, verbose = FALSE) : Objekt 'hmm' nicht gefunden
> post_probs <- posterior(hmmfit); # berechnet welcher Zustand wann aktiv war
Fehler in posterior(hmmfit) : Objekt 'hmmfit' nicht gefunden
>
> matplot(post_probs[,-1], type="l"); # Bildchen                                                                                                                                                                              hmmfit <- fit(hmm, em.control=em.control(maxit=5000), verbose = FALSE);                                                                                                                                                          # extrahiere ersten und letzten Tag der Woche
Fehler in matplot(post_probs[, -1], type = "l") :
  Objekt 'post_probs' nicht gefunden
> x <- cbind(x, "WEEK_DAY"=((1:nrow(x))%%7));
Fehler in cbind(x, WEEK_DAY = ((1:nrow(x))%%7)) :
  Objekt 'x' nicht gefunden
> open <- x$OPEN_PRICE[x$WEEK_DAY==1];
Fehler: Objekt 'x' nicht gefunden
> close <- x$CLOSE_PRICE[x$WEEK_DAY==0];
Fehler: Objekt 'x' nicht gefunden
>
> # passe die Länge der Vektoren an sodass es für jeden Tag eine Entsprechung gibt, einer der Fälle ist glaube ich unnötig
> if (length(open) > length(close)) open <- open[1:length(close)];
> if (length(open) < length(close)) close <- close[1:length(open)];
>
> # erzeuge Datenframe für Wochen
> y <- data.frame("OPEN_PRICE"=open, "CLOSE_PRICE"=close);
Fehler in as.data.frame.default(x[[i]], optional = TRUE) :
  cannot coerce class ‘"function"’ to a data.frame
> y <- cbind(y, "RETURN"=(y$CLOSE_PRICE - y$OPEN_PRICE)/y$OPEN_PRICE);
Fehler in cbind(y, RETURN = (y$CLOSE_PRICE - y$OPEN_PRICE)/y$OPEN_PRICE) :
  Objekt 'y' nicht gefunden
>
> #####################
>
> # HMM für 2 Zustände
> hmm2 <- depmix(RETURN ~ 1, family = gaussian(), nstates = 2, data=y);
Fehler in depmix(RETURN ~ 1, family = gaussian(), nstates = 2, data = y) :
  Objekt 'y' nicht gefunden
> hmmfit2 <- fit(hmm2, verbose = FALSE);
Fehler in fit(hmm2, verbose = FALSE) : Objekt 'hmm2' nicht gefunden
> post_probs2 <- posterior(hmmfit2);
Fehler in posterior(hmmfit2) : Objekt 'hmmfit2' nicht gefunden
>
> matplot(post_probs2[,-1], type="l");
Fehler in matplot(post_probs2[, -1], type = "l") :
  Objekt 'post_probs2' nicht gefunden
>
> # HMM für 3 Zustände
> hmm3 <- depmix(RETURN ~ 1, family = gaussian(), nstates = 3, data=y);
Fehler in depmix(RETURN ~ 1, family = gaussian(), nstates = 3, data = y) :
  Objekt 'y' nicht gefunden
> hmmfit3 <- fit(hmm3, verbose = FALSE);
Fehler in fit(hmm3, verbose = FALSE) : Objekt 'hmm3' nicht gefunden
> post_probs3 <- posterior(hmmfit3);
Fehler in posterior(hmmfit3) : Objekt 'hmmfit3' nicht gefunden
>
> matplot(post_probs3[,-1], type="l");
Fehler in matplot(post_probs3[, -1], type = "l") :
  Objekt 'post_probs3' nicht gefunden
>

Ach und wegen dem Betriebssystem: Ich benutze einen Mac mit MacOS High Sierra 10.13.6

Vielleicht hilft das ja schon mal weiter.

Die Frage scheint leicht zu beantworten zu sein und Dein R scheint alles bereitzustellen. Aber Du hast die Bitstamp-Daten noch gar nicht geladen. Probiere mal folgenden Code aus (wobei Du die Pakete eigentlich gar nicht mehr installieren musst, da Du das ja schon gemacht hast ...):

Code:
install.packages("anytime");
install.packages("data.table");
install.packages("depmixS4");

library(anytime); # für Zeitumrechnung
library(data.table); # für Tabellenkonvertierung
library(depmixS4); # für HMMs

# erst Pfad anpassen, für das Einlesen der Daten
table <- read.csv(file="/bitstampUSD.csv"); # <=== hier Deinen Pfad angeben!!!
# Benennung der Spalten
colnames(table) <- c("EPOCH", "PRICE", "VOLUME");

# Anfügen einer neuen Spalten mit den Daten (Datums), da ansonsten Epochs
table <- cbind(table, "DATE"=anydate(table[,1]));

DT <- data.table(table); # anderer Tabellentyp

# berechne den gewichteten Mittelwert des Preises eines Tages
x <- DT[,list(MEAN_PRICE = weighted.mean(PRICE,VOLUME)),by=DATE];

# berechne den Eröffnungspreis eines Tages
open <- aggregate(PRICE ~ DATE, table, function(x){return(head(x, 1))});
# berechne den Schlusspreis eines Tages
close <- aggregate(PRICE ~ DATE, table, function(x){return(tail(x, 1))});

# Spalten anfügen
x <- cbind(x, "OPEN_PRICE"=open$PRICE);
x <- cbind(x, "CLOSE_PRICE"=close$PRICE);

# berechne return eines Tages
x <- cbind(x, "RETURN"=(x$CLOSE_PRICE - x$OPEN_PRICE)/x$OPEN_PRICE);

# nicht so wichtig, gibt im Chart an ob Eröffungspreis über oder unter Schlusspreis liegt bzw. vice versa (das Rot und Grün auf bitcoinwisdom)
change <- c(NA, as.integer(diff(x$MEAN_PRICE) > 0));
color <- as.integer(x$CLOSE_PRICE-x$OPEN_PRICE > 0);

# Spalten anfügen
x <- cbind(x, "CHANGE"=change);
x <- cbind(x, "COLOR"=color);

# build and fit the HMM mit 3 States stellvertretend für bärsich, bullisch und seitwärts
hmm <- depmix(RETURN ~ 1, family = gaussian(), nstates = 3, data=x);
hmmfit <- fit(hmm, verbose = FALSE); # entält den Akaike-Score des Modells, braucht man um Modelle zu vergleichen
post_probs <- posterior(hmmfit); # berechnet welcher Zustand wann aktiv war

matplot(post_probs[,-1], type="l"); # Bildchen

Eine Empfehlung noch: Wenn Du den Code ausprobierst, paste mal nicht alles auf einmal in die Konsole, sondern immer Zeilenweise (die Kommentare zählen natürlich nicht als Zeile). So kann man besser sehen wo es zuerst hakt.

Und wieviel RAM sowie Swap (Auslagerungsdatei) stellt Dein Rechner bereit? Über 10 Gigabyte RAM und mindestens 16 Gigabyte Swap scheinen das Minimum zu sein. Nicht zum Berechnen des HMMs und zum Ploten wird das benötigt sondern zum Aggregieren der Bitstamp-Daten (gewichteter Mittelwert u.ä.). Man kann prinzipiell die DT-, table- und x-Variable, nach ihrem LETZTEN Gebrauch aus dem Speicher via

Code:
rm(DT); #löscht die Variable DT
gc(); # ruft Garbage Collector auf

löschen und den Speicher (mehr oder weniger) direkt wieder freigeben. Dies erleichtert das Arbeiten mit R im Anschluss.

Ich bin auch gespannt, wie sich Deine Methode in der Praxis schlagen wird. Ich rechne wie Du aber nicht damit, dass es eine Lizenz zum Gelddrucken ist. Das muss es auch nicht. Entscheidend für mich ist, dass ich eine objektive, marktbasierte Regel habe, die sich aus marktgenerierten Informationen speist, an der ich mich orientieren kann. Damit möchte ich die Emotionen aus dem Handel verbannen und auch das Herumgerate wie bei der Technischen Analyse vermeiden.

Die Methode macht ja eigentlich nichts anderes als Kauf- und Verkaufszeitpunkte anzugeben, wenn man die Zustände richtig interpretiert. Dass sie dies möglichst objektiv macht ist auch meine Hoffnung. Auch denke ich nicht, dass ich der Erste bin, der sowas anwendet. Die meisten Mathematiker gehen ja in die Finanzwirtschaft. Und HMMs sind für die Kinderkram.

Irgendwann muss ich mich nochmal mit dem Black-Scholes-Modell (https://de.wikipedia.org/wiki/Black-Scholes-Modell) auseinander setzen. Einer von den Beiden hat den Wirtschafts"nobelpreis" bekommen, der andere war da schon gestorben Sad. Deren Firma ist Ende der 90er in der Asienkrise (https://de.wikipedia.org/wiki/Asienkrise) pleite gegangen. Wenn ich mich richtig entsinne lag das daran, dass das Modell gut funktionierte, wenn die Märkte sich wie eine Brownsche Bewegung (https://de.wikipedia.org/wiki/Brownsche_Bewegung) verhielten was in der Asienkrise nicht der Fall war. Nagelt mich aber nicht auf diese Aussage fest, das ist jetzt nur Halbwissen. Vielleicht wäre da solch ein HMM von Vorteil gewesen, welcher das Modell an das Sentiment anpasst ...

Zum computerbasierten Handel kann ich vielleicht noch folgendes Buch empfehlen, auch wenn es mich teiweise überfordert hat:

Kevin J. Davey: Building Winning Algorithmic Trading Systems

Danke für die Empfehlung. Ich werde da mal reinschmökern.