Post
Topic
Board Trading und Spekulation
Re: Methoden und Algorithmen zur fortgeschrittenen Kursanalyse
by
Waikoloa16
on 09/08/2018, 20:49:20 UTC
Anmerkung: Das Folgende bis zur horizontalen Linie dient der Überarbeitung. Die Überarbeitung ist NICHT vollständig. Alles darunter stellt den alten Beitrag dar.

Voraussetzungen
Einleitung
Ein Hidden Markov Modell für Sentimentanalyse
Handeln mit Hilfe eines Hidden Markov Modells
Quellenangaben

Voraussetzungen

Installation von R

...

Installation von notwendigen R-Paketen

...

Einleitung

Beispiel mit idealem und gezinktem Würfel

Das folgende Beispiel ist so gewählt, dass es analog zu einer entsprechenden Chartanalyse ist.

Angenommen man nimmt an der Mensch-ärgere-Dich-nicht-Weltmeisterschaft teil. Für dieses Spiel benötigt man einen Würfel. Wer eine Sechs würfelt darf daraufhin nochmal würfeln. Desweiteren hat derjenige mit der Sechs die Wahl rauszukommen oder normal zu ziehen. Eine Sechs zu würfeln ist also von Vorteil. Für einen idealen Würfel ist die Wahrscheinlichkeit exakt 1/6, so wie für die anderen Zahlen auch. Man könnte nun versuchen dem Glück mit einem gezinkten Würfel auf die Sprünge zu helfen. Da wäre es gut, wenn man bei der Mensch-ärgere-Dich-nicht-Weltmeisterschaft zumindest im Nachhinein feststellen könnte, wann ein gezinkter Würfel genutzt wurde. Die entsprechenden Spieler würden dann gesperrt.

Zu Beginn betrachten wir den idealen Würfel und vergleichen ihn mit dem Gezinkten. Der gezinkte Würfel soll den Wurf einer Sechs wahrscheinlicher gestalten. Deshalb ist hier im Beispiel die Wahrscheinlichkeit für eine Sechs mit dem gezinkten Würfel 2/7 und für die anderen Zahlen jeweils 1/7. Wir lassen nun beide Würfel sehr oft werfen und notieren uns die jeweilige Sequenz der Augenzahlen:

Code:
library(zoo);
library(depmixS4);

# idealer Würfel
x_ideal <- floor(runif(1000000)*6)+1; # würfle oft
x_manip <- floor(runif(1000000)*7)+1; x_manip[x_manip==7] <- 6; # würfle oft

Um ein Gefühl für die Verteilungen zu bekommen fassen wir jetzt immer 500 Würfe durch ein Schiebefenster auf beiden Sequenzen zusammen (vgl. hierzu auch andere Fenstergrössen), notieren uns den jeweiligen Mittelwert der Augenzahlen und erzeugen daraus einen Plot der entsprechenden Mittelwertsverteilung:

Code:
y_ideal <- rollapply(x_ideal, width=500, FUN=mean);  # fasse fünfhundert Würfe zusammen
h_ideal <- hist(y_ideal, 50, plot=FALSE); # erzeuge Histogramm
h_ideal$density <- h_ideal$counts/sum(h_ideal$counts);  # passe Dichte an

y_manip <- rollapply(x_manip, width=500, FUN=mean);  # fasse fünfhundert Würfe zusammen
h_manip <- hist(y_manip, 50, plot=FALSE); # erzeuge Histogramm
h_manip$density <- h_manip$counts/sum(h_manip$counts);  # passe Dichte an

plot(h_ideal, col=rgb(0,0,1,1/4), xlim=c(3.3, 4.1), freq=FALSE, main="Mittelwert der Augenzahl von 500 Würfen mit\nidealem (links) und gezinktem Würfel (rechts)", xlab="Mittelwert", ylab="Häufigkeit");  # erstes Histogramm
plot(h_manip, col=rgb(1,0,0,1/4), xlim=c(3.3, 4.1), freq=FALSE, add=TRUE); # zweites Histogramm

z <- seq(3.3, 4.1, 0.001); # Punkte auf x-Achse
lines(z, dnorm(z, mean(y_ideal), sqrt(var(y_ideal)))/100, col="blue");  # plotte Normalverteilung mit Parametern von Simulation
lines(z, dnorm(z, mean(y_manip), sqrt(var(y_manip)))/100, col="red");  # plotte Normalverteilung mit Parametern von Simulation
abline(v=mean(y_ideal), col="blue"); # markiere Mittelwert
abline(v=mean(y_manip), col="red"); # markiere Mittelwert

Das Ergebnis ist im unteren Plot zu sehen:

https://i.imgur.com/piSHAVe.png

Es handelt sich also offensichtlich um zwei Normalverteilungen. Wurde eine Sequenz mit dem idealen Würfel erzeugt, dann sollten die Mittelwerte aus 500 geworfenen Würfen aus der linken Verteilung stammen. Wurde eine Sequenz mit dem gezinkten Würfel erzeugt, so stammen die Mittelwerte aus der rechten Verteilung. Wurde eine Sequenz mit beiden Würfeln erzeugt, dann sollten die Mittelwerte entweder aus der einen oder der anderen Verteilung stammen. Ob also ein Sequenz mit einem oder mit zwei unterschiedlichen Würfeln erzeugt wurde, d.h. ob während des Spiels die Würfel ausgetauscht wurden, dies lässt sich nun mit einem Hidden Markov Modell (HMM) erkennen. Eine Voraussetzung für dieses Beispiel ist, dass die Anzahl der aufeinanderfolgenden Würfe mit dem jeweiligen Würfel gross (z.B. 10000) gegenüber der Fenstergrösser (500) ist.

Ein HMM mit nur einem Würfel besteht aus einem Knoten und einer Kante. Der Knoten wird im Fall des idealen Würfels durch obere blaue Normalverteilung realisiert. Der Knoten erzeugt dann Augenzahlen derart, dass die Verteilung der Mittelwerte aus 500 Würfen der blauen Normalverteilung folgt. Da es nur eine Kante mit der Wahrscheinlichkeit P=1.0 gibt, so MUSS der neue Zustand des HMM nach jedem Wurf der alte sein:


Wird der ideale Würfel nun während des Spiels, d.h. beim Erzeugen der Sequenz an Augenzahlen, durch einen Gezinkten ausgetauscht, so besteht der entsprechende HMM mindestens aus zwei Knoten. Einem Knoten, welcher die Verteilung des idealen Würfels generiert und einem Knoten, welcher die Verteilung des gezinkten Würfels generiert:


Die Kanten mit den Wahrscheinlichkeiten P(Blau nach Blau), P(Blau nach Rot), P(Rot nach Rot) und P(Rot nach Blau) hängen dann davon ab, wann und wie oft die Würfel getauscht wurden. Hierbei sollte die Sequenz an Augenzahlen lang genug sein, dass mehr als zwei Austausche (Zustandsänderungen) stattfanden! Je mehr desto besser.

Nun erzeugen wir eine simulierte manipulierte Sequenz an Augenzahlen, welche unsere Bedingungen erfüllt (dick), und versuchen die Wechsel der Würfel mit Hilfe eines HMM ausfindig zu machen:

Code:
# erzeuge Sequenz an Würfelergebnissen, mit idealem und manipuliertem Würfel
a <- floor(runif(10000)*6)+1;
b <- floor(runif(50000)*7)+1; b[b==7] <- 6;
c <- floor(runif(20000)*6)+1;
d <- floor(runif(10000)*7)+1; d[d==7] <- 6;
e <- floor(runif(30000)*6)+1;
f <- floor(runif(20000)*7)+1; e[e==7] <- 6;
g <- floor(runif(40000)*6)+1;

sequence <- c(a,b,c,d,e,f,g);
mseq <- as.data.frame(t(t(rollapply(sequence, width=500, FUN=mean))));
colnames(mseq) <- c("MEAN");

Das Erzeugen des HMM, der Fit des Modells an die Daten und die Extraktion relevanter Daten ist in R ein Dreizeiler:

Code:
# erzeuge und fitte das Hidden Markov Modell
hmm <- depmix(MEAN ~ 1, family = gaussian(), nstates = 2, data=mseq);
hmmfit <- fit(hmm, verbose = FALSE);
post_probs <- posterior(hmmfit);


Todo: Plot, Diskussion der Ergebnissvariablen und Modellvergleiche.

Ein Hidden Markov Modell für Sentimentanalyse

....

Handeln mit Hilfe des Hidden Markov Modells



Hallo Trantute,

Wieder eine sehr schöne und m.E. auch für mich als interessierten Laien dennoch verständliche Darstellung. Nochmal vielen Dank für die Mühe! Der Thread entwickelt sich zu meinem Lieblingsthread und ich bin schon sehr auf die weiteren Punkte gespannt, die lt. Übersicht (hoffentlich) noch ausgearbeitet werden. Planst Du zum Punkt "Handeln mit Hilfe des Hidden Markov Modells" vielleicht eine Darstellung eines konkreten aber fiktiven Handelsablaufs? Dann würde ich meine Frage zum konkreten Handel nämlich noch solange zurückstellen, bis Deine Darstellung dazu abgeschlossen ist.

Tolle Arbeit! Ich kann mir vorstellen, dass es für jemanden mit einem mathematischen Hintergrund oder auch einem Informatiker schwer fällt, sich so weit herunter zu formatieren, bis auch ein Laie den Grundgedanken und Mechanisem des HMM folgen kann.

Wie gesagt freue ich mich schon auf die weitere Darstellung!

Aloha, W.