VoraussetzungenEinleitungHidden Markov Modelle für SentimentanalyseHandeln mit Hilfe eines Hidden Markov ModellsDiskussionAusblickQuellenangabenVoraussetzungenInstallation von RR ist eine freie Programmiersprache, welche sich auf Statistik spezialisiert hat (
https://de.wikipedia.org/wiki/R_(Programmiersprache)):
https://www.r-project.org/Dies ist auch das Minimum der benötigten Software und alle folgenden Codesnippets sollten damit ausführbar sein. Zusätzlich bietet es sich jedoch an Rstudio zu installieren:
https://www.rstudio.com/Rstudio ist eine Entwicklungsumgebung für R und erleichtert das Verwalten von Daten und sowie im Besonderen das Programmieren in R.
Todo: Vielleicht noch eine genauere Anleitung der installation von R auf einem OS ...
Installation von notwendigen R-PaketenDer folgende Code, ausgeführt in R, installiert Pakete, welche direkt benötigt werden oder später von Vorteil sind:
install.packages(c("zoo", "anytime", "data.table", "depmixS4"));
Geladen werden die Pakete in R via:
library(zoo);
library(anytime);
library(data.table);
library(depmixS4);
EinleitungBeispiel mit idealem und gezinktem WürfelDas 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, welcher dem offiziellen WM-Würfel möglichst ähnlich sieht. 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:
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:
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:
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.Ein HMM, dessen Parameter bekannt sind, nennt man auch
Markov-Kette. Eine Markov-Kette, interpretiert als Modell für einen bestimmten (stochastischen) Prozess, bildet diesen Prozess mathematisch nach und stellt somit so etwas wie eine Simulation desselbigen dar. In unserem Beispiel wäre dies die Simulation der geworfenen Augenzahlen eines fairen Spielers oder die eines Betrügers während der Mensch-ärgere-Dich-nicht-Weltmeisterschaft.
Somit ist ein HMM ein
Automat, also ein Graph mit mehreren Knoten (Zuständen) und Kanten (Zustandsänderungen) und einem ausgezeichnetem Knoten, welcher den Zustand definiert, in welchem sich der Automat gerade befindet. Die Kanten sind mit Wahrscheinlichkeiten gelabelt sodass die Summe der ausgehenden Kanten die Wahrscheinlichkeit von P=1.0 ergibt. Der Automat springt dann in diskreten Schritten von Knoten zu Knoten entlang der Kanten, entsprechend der an den Kanten angegebenen Wahrscheinlichkeiten. Da die Summe der Wahrscheinlichkeiten an den ausgehenden Kanten gleich 1.0 ist, so wechselt der Automat in jedem Schritt seinen Zustand, wobei der neue Zustand gleich dem alten sein kann. War der HMM vorher in Zustand A und ist danach in Zustand B (mit A != B), so hat man eine (echte) Zustandsänderung.
Die Parameter des Modells, also die Wahrscheinlichkeiten an den Kanten des Automaten sind im Falle des HMM zu Beginn nicht bekannt und müssen mit einem speziellen Optimierungskriterium über entsprechende Daten rückgeschlossen werden. Dies nennt man auch das
Fitten des Modells an die Daten und das Resultat nennt man schlicht den
gefittete HMM (zumindest ich). Hat man die optimalen Parameter gefunden, so kann man den wahrscheinlichsten Pfad in der Zeit über die Knoten durch den Graphen berechnen. Die Sequenz der Knoten, welche der Automat durchläuft nennt man
hidden States (versteckte/unbekannte Zustände) und diese möchte man wissen. In unserem Beispiel bestehen die Daten NUR aus den geworfenen Augenzahlen eines Mitspielers. Die versteckten Zustände entsprechen der Nutzung der Würfel, d.h. wann ein idealer und wann ein gezinkter Würfel in der Sequenz der geworfenen Augenzahlen genutzt wurde. Und der Name ist gut gewählt, da die Beobachter bei der Mensch-ärgere-Dich-nicht-Weltmeisterschaft nur die geworfenen Augenzahlen zu Gesicht bekommen, aber ansonsten den idealen Würfel nicht vom Gezinkten unterscheiden können.
Nun erzeugen wir eine simulierte manipulierte Sequenz an Augenzahlen, welche unsere Bedingungen erfüllt (viele geworfene Augenzahlen und ausreichend viele Würfelwechsel), und versuchen die Wechsel der Würfel mit Hilfe eines gefitteten HMMs ausfindig zu machen:
set.seed(1); # setze Randomseed damit Plots immer gleich aussehen
# 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:
# 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);
Zum Erzeugen eines aussagekräftigen Plots benötigen wir etwas mehr Code:
dev.new(width=19, height=3.5); # erzeuge Plot
matplot(post_probs[,-1], type="l", col=c("blue", "red"), lty = c(1,1), xaxt="n"); # plote die entsprechenden posterior Wahrscheinlichkeiten
axis(1, at = 10000*(0:18), labels = 10000*(0:18)); # passe die x-Achse an
legend("left", legend = c("ideal", "gezinkt"), col = c("blue", "red"), lty = c(1,1), lwd = 1 , xpd = T ); # Legende
title("Würfel-HMM mit zwei Zuständen"); # Titel
# erzeuge Sequenz der HMM-Zustände
for (i in 1:nrow(post_probs)){rect(i-1, 0, i, -0.1, col=c("blue", "red")[post_probs[i,1]], border=NA)}
# Übergangswahrscheinlichkeiten
summary(hmmfit);
hmmfit@transition;
Das Resultat sollte wie folgt aussehen:
Auf der x-Achse ist die Sequenz der Zustände als farbliches horizontales Band angegeben. Die Kurven im Plot stellen die (A-posteriori-)Wahrscheinlichkeit für den entsprechenden Würfel am gegebenen Zeitpunkt dar. Man beachte, dass der HMM die Zustände nicht perfekt wiedergibt (vgl. andere Fenstergrössen). Dies ist statistsichen Fluktuationen geschuldet, d.h., dass die blaue Verteilung auch ab und zu mal wie die Rote aussehen kann (und vice versa). Wegen des Fensters gibt es natürlich weniger als 180000 Zustände (179501). An die echten Übergangswahrscheinlichkeiten kommt man wegen numerischer Ungenauigkeiten nur über den Befehl hmmfit@transition. Der Befehl summary(hmmfit) reicht nicht, da er offenbar die Wahrscheinlichkeiten rundet! Der entsprechende HMM ist dann durch folgenden Graphen gegeben:
Diskussion der ErgebnisvariablenTodo: Diskussion der Ergebnisvariablen
Vergleich und Auswahl von ModellenVermutet man nun, dass ein Mitspieler während der Mensch-ärgere-Dich-nicht-Weltmeisterschaft betrügt, so muss man seinen Verdacht auch quantifizieren können. Man muss also quantifizieren, wie wahrscheinlich es ist, dass der Verdächtige eine gezinkten anstatt eines idealen Würfels nutzt. Im einfachsten Fall vergleicht man dafür zwei unterschiedliche Modelle des Verdächtigen: Die
Nullhypothese (H0) ist, dass der Verdächtige einen idealen Würfel nutzt; Die
Alternativhypothese (H1) ist, dass der Verdächtige einen zusätzlichen gezinkten Würfel nutzt. H0 wird verworfen wenn H1 viel wahrscheinlicher ist. Natürlich kann man noch zusätzliche Modelle mit steigender Komplexität erzeugen (H2, ..., Hn), z.B. die Annahme hinzunehmen, dass der Verdächtige verschiedene gezinkte Würfel mit unterschiedlichen Parametern genutzt hat. Für eines dieser Modelle muss man sich nun entscheiden und zwar derart, dass die Wahrscheinlichkeit minimiert wird, einen Unschuldigen von der Weltmeisterschaft auszuschliessen.
Genauso wie man Graphen in ihren Parametern, d.h. der Anzahl der Knoten, Kanten und somit in ihrer Topologie (Struktur), variieren kann, so kann man verschiedene HMMs, d.h. verschiedene angenommene Modelle der Wirklichkeit (H0, ..., Hn), generieren und versuchen, diese an den gleichen Datensatz zu fitten. Jeder so gefittete HMM hat dann eine gewisse
Likelihood. Die Likelihood ist hierbei die "Wahrscheinlichkeit" des HMM gegeben die Daten und man kann sie als eine Art Wahrscheinlichkeit interpretieren. Diese Interpretation wird dem Begriff aber nicht vollständig gerecht, doch soll diese Frage hier nicht weiter diskutiert werden. Es gibt weiterhin andere aber zur Likelihood analoge Konzepte deren Behandlung sich nur marginal unterscheiden. Die bekanntesten sind das
AIC (Akaike Information Criterion) und das
BIC (Bayesian Information Criterion). Es existiert nun eine Belegung der (versteckten) Zustände (bzw. ein Verhalten des HMM-Automaten über die Zeit), welche, gegeben die Daten, am "wahrscheinlichsten" (most likely) ist. Hat man nun verschiedene mögliche HMMs zur Auswahl, welche die Daten erklären könnten, so muss man nun entscheiden, welchen man für weitere Analysen auswählt.
Der naive Ansatz besteht nun darin, einfach den HMM zu wählen, der die höchste Likelihood aufweist. Dieser Ansatz hat aber das Problem, dass ein Modell mit mehr Parametern in der Regel IMMER die höhere Likelihood hat. Gleichzeitig jedoch verliert das Modell an allgemeiner Aussagekraft und wird zudem schwieriger zu interpretieren. Für die Menge der zu untersuchenden HMMs bedeutet dies, dass die entsprechenden Modellparameter, also die Anzahl der Zustände "vernünftig" gewählt werden. Doch selbst in diesem Szenario kann die Wahl des HMMs mit der höchsten Likelihood schlecht sein, da einfachere Modelle mit weniger Parametern, also HMMs mit weniger Zuständen, "ähnlich" hohe Likelihoods aufweisen können. In dieser Situation sollte man aus der Menge der HMMs mit "ähnlich" hoher Likelihood wie der mit der Höchsten den auswählen, der am wenigsten Zustände hat (Ockhams Rassiermesser). Wie man das im Detail macht kann man z.B. hier erfahren:
https://stats.stackexchange.com/questions/81427/aic-guidelines-in-model-selection.
Selbst durch neuen Daten kann sich die Likelihood für ein und den selben HMM ändern und somit einen vollständig anderen Fit erzeugen. Der EM-Algorithmus (Expectation-Maximization Algorithmus) findet nämlich garantiert lokale Maxima aber nicht notwendigerweise das globale Maximum (Reihenfolge bei der Berechnung eines HMM-Fits: EM-Algorithmus und daraufhin Viterbi-Algorithmus <= diese Aussage basiert aktuell nur auf Halbwissen). Wenn man nun mit verschiedenen Randomseeds ein Modell fittet so kann man auf verschiedenen lokalen Maxima landen. Man kann dann einfach den Randomseed als neuen Parameter auffassen und behandelt dann diesen Fall wie im letzten Absatz beschrieben. (Quelle:
https://bitcointalksearch.org/topic/m.45063876)
Grenzen eines ModellsIch möchte nicht viele Worte zu den Grenzen eines Modells verlieren. Als Ersatz dafür verlinke ich eine Dokumentation wo imho alles Wichtige zusammengefasst ist (The Midas Formula). Zwar bezieht sich das Video nicht explizit auf die Grenzen von Modellen, aber die Grundaussage sollte am Ende klar sein. Das Video ist leider auf englisch. D.h., wenn ihr es nicht gucken könnt, weil euer Englisch nicht so gut ist, dann meldet euch bitte und ich schreibe noch ein paar Worte dazu. Wichtig ist es, das Video GANZ zu schaun:
https://vimeo.com/28554862Hidden Markov Modelle für SentimentanalyseEin Preis-Return Hidden Markov ModellDer
Return eines bestimmten Zeitintervalls t, z.B. einer bestimmten Woche, ist die Differenz zwischen Schlusspreis und Öffnungspreis geteilt durch den Schlusspreis:
return[t] <- (x$CLOSE_PRICE[t] - x$OPEN_PRICE[t])/x$CLOSE_PRICE[t] # in R entspricht "<-" einem ":=" oder "=" in anderen Programmiersprachen
Ist der Schlusspreis größer dem Öffnungspreis, so ist der Return positiv, ist der Öffnungspreis größer dem Schlusspreis, so ist der Return negativ und ist der Schlusspreis gleich dem Öffnungspreis, so ist der Return Null. Der Return eines Assets, welches durchgehend um einen bestimmten Mittelwert variiert (z.B. wie Tether um US$ 1), ohne mittel- bis langfristige Ausschläge nach unten oder oben, kann mit einer (Normal)Verteilung mit Mittelwert Null modelliert werden. Bei einem Asset wo hingegen zusätzlich Marktlagen existieren, in denen der Preis auch langfristig fällt oder steigt (z.B. Bären- und Bullenmarkt beim Bitcoin), macht es Sinn diese drei Marktlagen mit mindestens drei unterschiedlichen Verteilungen zu modellieren: die Verteilung des Bärenmarkts hat dann einen negativen Mittelwert, die Verteilung des Bullenmarkts hat einen positiven Mittelwert und die Verteilung der Seitwärtsbewegung hat einen Mittelwert gleich Null. Diese drei Verteilungen würden drei unterschiedlichen Würfeln bei der Mensch-ärgere-Dich-nicht-Weltmeisterschaft entsprechen: einem gezinkten Würfel wo die Wahrscheinlichkeit eine Sechs zu werfen kleiner 1/6 ist, ein idealer Würfel und ein gezinkter Würfel wo die Wahrscheinlichkeit eine Sechs zu werfen größer 1/6 ist.
Unter
https://github.com/trantute/sentiment-hmm sind zwei exemplarische HMMs implementiert. Der erste HMM modelliert vier Zustände: Bärisch, Seitwärts, Bullisch und Blase (siehe unterer Plot). Der Zweite modelliert fünf Zustände: Tot, Bärisch, Seitwärts, Bullisch und Blase.
Die Zustände des HMM über die Zeit sind als farbliches Band unten auf der x-Achse im oberen Plot aufgetragen. Die Posteriorwahrscheinlichkeiten sowie der logarithmierte Preis (auf 1.0 normiert) und der logarithmierte MA203 (auf 1.0 normiert) sind als Kurven im Plot enthalten. Das Sentiment ist farblich, wie oben beschrieben, dargestellt und in der Legende auf der linken Seite im Plot beschrieben.
StabilitätsanalyseEs stellt sich die Frage, wie vertrauenswürdig die Vorhersage des Sentiments für die aktuelle Woche ist. Simulationen mit historischen Daten haben gezeigt, dass die Vorhersagen relativ stabil sind, wenn der Markt mittel- bis langfristig nicht volatil ist (Seitwärtsphase) oder sich in einer mittel- bis langfristigen Ab- bzw. Aufwärtsspirale befindet (nicht gezeigt). Simulationen mit historischen Daten haben aber auch gezeigt, dass ein extremer Ausschlag des Preises, welcher eine signifikante Wirkung auf den wöchentlichen Return hat, die Sentimentvorhersage nachträglich ändern kann:
Die Zustände des HMM über die Zeit sind als farbliches Band unten auf der x-Achse im oberen Plot aufgetragen. Wie man dort auf der rechten Seite sieht, ist ein Zustand insbesondere dann instabil, wenn der HMM gerade seinen Zustand geändert hat bzw. wenn unterschiedliche Zustände für die aktuelle Woche eine ähnliche Likelihood aufweisen. Die Posteriorwahrscheinlichkeiten für die unterschiedlichen Zustände (die Kurven im Plot) können hierüber Auskunft geben. Haben alle Zustände Posteriorwahrscheinlichkeiten ungleich 0.0 - wie im oberen Plot auf der rechten Seite - dann ist der aktuelle Zustand instabiler, als wenn ein Zustand die Posteriorwahrscheinlichkeit nahe 1.0 hat und die anderen nahe 0.0.
Andere VariantenDer Return als Proxy für das Sentiment ist nur eine Möglichkeit einen HMM aufzusetzen. Andere Variablen können auch genutzt werden insofern sie eine Korrelation mit dem Sentiment aufweisen. Z.B. lassen sich die Kommentare auf bitcointalk.org pro Zeitintervall als Proxy nutzen. Entsprechender Code ist auf
https://github.com/trantute/sentiment-hmm zu finden.
Handeln mit Hilfe des Hidden Markov ModellsWenn einem das Sentiment bekannt ist bzw. wenn man in der Lage ist, dass Sentiment ausreichend genau einzuschätzen, dann kann man dieses Wissen nutzen um mit Werten entsprechend zu handeln. Die Idee ist, dass man zu Beginn eines Aufwärtstrends long und zu Beginn eines Abwärtstrends short geht. Für das unten gezeigte Beispiel (
https://bitcointalksearch.org/topic/m.47574581) bedeutet dies z.B.: Bärisch (rot) => short; Blase (grün) => long; Seitwärts (schwarz) => long; und "Bullenfalle" (violett) => long. Zusätzlich enthält der Plot noch den auf 1.0 normalisierten logarithmierten Bitcoin Preis (US$, Bitstamp) für die entsprechenden Zeitpunkte (blau) und den MA203 (Moving average für 203 Tage = 29 Wochen, orange) was in etwa dem MA200 entspricht aber besser zu berechnen ist (
https://bitcointalksearch.org/topic/m.44868087).
Solch ein Wechsel macht in diesem Beispiel natürlich nur Sinn, wenn das Sentiment von Grün, Schwarz oder Violett auf Rot wechselt oder vice versa. Dafür muss man jeweils zwei Wochen im Auge behalten, d.h. nehmen wir an heute ist ein Montag, gestern war Sonntag und der HMM hat eine Zustandsänderung vorhergesagt, relativ zum Sonntag davor. Jetzt tauscht man seinen Wert entsprechend der genannten Regeln. Und zwar zum Opening Price der aktuellen Woche, also dem aktuellen Montag. (Quelle:
https://bitcointalksearch.org/topic/m.43234811)
Todo: Code
Todo: Test mit historischen Daten
Tauschverhältnisse können zusätzlich optimiert werden. Das Beispiel ist ja ziemlich naiv: 0:100, 100:0, 100:0 und 100:0. Sodass es sich hier nur um vier Parameter handelt. Man kann also den Raum der Verhältnisse absuchen. Bei 10% Sprüngen sind das nur 10000 Möglichkeiten und man wählt dann die Verhältnisse welche den maximalen Wertoutcome (in Dollar oder BTC) erzeugen. Insbesondere unter der Annahme, dass man NUR long oder short gehen kann, d.h. all in oder all out, ist der Rechenaufwand überschaubar, da die Tauschverhältnisse dann binäre Variablen wären. D.h. bei n=4 Zuständen gäbe es gerade mal 2^4 = 16 Möglichkeiten. Solch ein Verfahren kann auch nützlich sein, den besten Parametersatz des HMMs zu finden wobei man jedoch Gefahr läuft, dass das Modell durch overfitting an historische Daten an allgemeiner Aussagekraft verliert. (Quelle:
https://bitcointalksearch.org/topic/m.43256510)
DiskussionTodo: Diskussion von dem Geraffel
AusblickTodo: Ideensammlung hier rein
Quellenangabenhttps://www.wikipedia.org/https://api.bitcoincharts.com/v1/csv/http://web.stanford.edu/class/stats366/exs/HMM1.htmlhttps://www.quantstart.com/articles/hidden-markov-models-for-regime-detection-using-rhttps://www.fool.com/knowledge-center/how-to-calculate-return-on-indices-in-a-stock-mark.aspxhttps://stats.stackexchange.com/questions/81427/aic-guidelines-in-model-selection