GeorgM Candletalk - Datenexploration




Datum: 10.8.2014
Letzte Änderung: 10.8.2014, 18:19 UIhr


Autor: Krümel.

GeorgM hat mit Hilfe von PT alias Norbert Gundeler eine Exceltabelle online gestellt, die ich mir als Ascii runtergeladen (bzw. rauskopiert)  habe und mal einige Untersuchungen anstellen möchte.

In[1]:=

GeorgMDataExploration_1.gif

In[2]:=

GeorgMDataExploration_2.gif

Out[3]=

GeorgMDataExploration_3.gif

In[5]:=

GeorgMDataExploration_4.gif



Ich plotte mal für einen ersten Überblick die 2 mMn wichtigsten Spalten Volatility versus G/V:

In[8]:=

GeorgMDataExploration_5.gif

Out[8]=

GeorgMDataExploration_6.gif

In 2 D gefällt mir das nicht so gut,da die Punktewolken keine echten sind, sondern auf den Vola-Werte zu sehr verschmiert. Der Listplot ist daher nicht so gut geeignet.


Ich schau mir das daher in 3-D an, da sieht man auch die Anzahl pro Kombination/ Wertepaar Vola/GV.

In[9]:=

GeorgMDataExploration_7.gif

Out[9]=

GeorgMDataExploration_8.gif

Für die höheren Vola-Werte hat man eindeutig zu wenig Daten, für die niedrigen Volawerte sieht es eher nach 2 ineinanderverschobenen Verteilungen pro Vola-Rasterpunkt aus. Theoretisch könnte man da einen Stopp reinpacken und so die ollen Verluste vermeiden. Praktisch kann ich das leider nicht machen, da ich nicht weiß, wie groß Intraday der Buchverlust geworden ist, bevor das Tagesergebnis generiert wurde. Da ich auch nicht weiß, wie das Tagesergebnis zustandegekommen ist (ein oder mehrere Trades), lassen sich an der Stelle keine weiteren Ideen ableiten, da mir die Informationen fehlen.


Ein einfaches vola-unabhängiges Histogramm zeigt etwas ähnliches:

In[10]:=

GeorgMDataExploration_9.gif

Out[10]=

GeorgMDataExploration_10.gif

Irgendwie verleitet diese mehrgipflige Verteilung zum Abschneiden links. Geht aber leider nicht, da keine Informationen über Intratrade-Drawdowns vorliegen. Muss also ohne weitergehen *grummel*.
Aber der Erwartungswert ist tatsächlich positiv ? Oder ?

In[11]:=

GeorgMDataExploration_11.gif

Out[11]=

GeorgMDataExploration_12.gif

Ok, 50% aller Werte sind kleiner gleich 0. Die 0 trennt perfekt, tzz, das findet man so auch selten. Der Mittelwert dürfte aber leicht rechts verschoben sein, der sackt ja regelmäßig in die Richtung vom Verteilungspeak.

In[12]:=

GeorgMDataExploration_13.gif

Out[12]=

GeorgMDataExploration_14.gif

Na ja, 6,6 Punkte ist ja besser als nichts. Man müsste es schaffen, die dicken Verluste links abzuschneiden, die Verteilung sieht so schlecht gar nicht aus. Ich schau mal weiter...


Kumulierte Dichteverteilung ( zum Nachlesen, was man daraus ableiten kann : http://www.statistics4u.info/fundstat_germ/cc_cumulative_frqdist.html  ):

In[13]:=

GeorgMDataExploration_15.gif

Out[13]=

GeorgMDataExploration_16.gif

Na, da sieht man auch gut, dass 50% aller Tage kleiner/gleich 0 enden.

In[14]:=

GeorgMDataExploration_17.gif

Out[14]=

GeorgMDataExploration_18.gif

25% aller Werte liegen unter -70, 50% liegen unter/gleich 0 (ok, und für Optimisten: 50% liegen über/gleich 0), 25% aller Werte sind größer als 72 Punkte.
Wenn man diie Gebühren mit einrechnet, verschiebt sich das ganz natürlich leicht. Man muss also an der Verteilung links was machen, da kommt man nicht drum herum.  



Anteile Gewinner/Verlierer/0-Tage

Ich suche mal die Gewinner-, Verlierer- und GV-0-Tage raus.

In[15]:=

GeorgMDataExploration_19.gif

In[18]:=

GeorgMDataExploration_20.gif

Out[18]=

GeorgMDataExploration_21.gif

In[19]:=

GeorgMDataExploration_22.gif

Out[19]=

GeorgMDataExploration_23.gif

In[20]:=

GeorgMDataExploration_24.gif

Out[20]=

GeorgMDataExploration_25.gif


Gesamtdatenlänge:

In[21]:=

GeorgMDataExploration_26.gif

Out[21]=

GeorgMDataExploration_27.gif


Jetzt ist die Frage, ob man die 0-Trades aus der Rechnung weglässt oder den “Gewinnern” hinzurechnet. Man kann aber auch gemein sein und den Verlierern hinzurechnen, denn unter Berücksichtung etwaiger Gebühren werden aus den neutralen Werten ja negative (0 minus Gebühren).


Ich bestimme die Prozente mal separat, das ist am fairsten, finde ich. Die 0-Tage kann man streng genommen auch weglassen, denn die tragen weder zum Gewinnteil noch zum Verlustteil was bei, sondern blähen nur künstlich auf.

In[22]:=

GeorgMDataExploration_28.gif

Out[22]=

GeorgMDataExploration_29.gif

In[23]:=

GeorgMDataExploration_30.gif

Out[23]=

GeorgMDataExploration_31.gif

In[24]:=

GeorgMDataExploration_32.gif

Out[24]=

GeorgMDataExploration_33.gif




Wie sieht die Struktur der Handelstagsergebnisse aus ? Erkennt man eine Systematik ?

In[25]:=

GeorgMDataExploration_34.gif

Out[25]=

GeorgMDataExploration_35.gif

Leider nein, eher die typische Vola-Clusterbildung, die man auch bei normalen Rendite-Untersuchungen vorfindet.  Ist ja doch immer recht auffällig und unterscheidet sich von echten normalverteilten Random-Daten.

Mal zum Vergleich: (ich nehm die Daxdaten mal vorweg (das passt hier aber gut hin, Erklärungen kommen weiter unten)

In[26]:=

GeorgMDataExploration_36.gif

Out[31]=

GeorgMDataExploration_37.gif

Hmm, sieht nicht nach nem echten Systemvorteil aus verglichen mit nem einfachen Verlauf der Dax-Renditen. Oh weia, da dreht man mir mit Sicherheit im Forum nen Strick draus (“Hängt den Ketzer auf ! Brennen soll er !”). Zum Glück hab ich meinen Account ja löschen lassen. Da können sie mich aus der Ferne hassen. :D



Kumuliert (also Tag für Tag aufgerechnet) ergibt sich dasselbe Bild wie bei trash.

In[32]:=

GeorgMDataExploration_38.gif

In[33]:=

GeorgMDataExploration_39.gif

Out[33]=

GeorgMDataExploration_40.gif

Bei der Darstellung gehe ich von 0 Startkapital aus.

In[34]:=

GeorgMDataExploration_41.gif

Out[34]=

GeorgMDataExploration_42.gif

In[35]:=

GeorgMDataExploration_43.gif

Out[35]=

GeorgMDataExploration_44.gif

Endwert:

In[36]:=

GeorgMDataExploration_45.gif

Out[36]=

GeorgMDataExploration_46.gif



Wenn ich jetzt Georgs Startwert von 2000 Euro ansetze:

In[37]:=

GeorgMDataExploration_47.gif

Out[38]=

GeorgMDataExploration_48.gif

In[39]:=

GeorgMDataExploration_49.gif

Out[39]=

GeorgMDataExploration_50.gif

Endwert:

In[40]:=

GeorgMDataExploration_51.gif

Out[40]=

GeorgMDataExploration_52.gif


Und noch der Plot dazu:

In[41]:=

GeorgMDataExploration_53.gif

Out[41]=

GeorgMDataExploration_54.gif


Na ja, durch die Konstante verschiebt sich die gesamte Kurve in der Höhe, mehr passiert da allerdings nicht.



Abschließend mal wieder ein Plausibilitäts/Korrektheuitscheck:

In[42]:=

GeorgMDataExploration_55.gif

Out[42]=

GeorgMDataExploration_56.gif

In der Abbildung ist die rote Linie die von mir berechnete kumulierte G/V-Kurve, und die blauen Punkte sind die aus der von PT gehosteten Tabelle. Passt also.
Man kann aber noch nen Extratest machen, um wirklich sicher zu sein. Bei Differenzbildung beider Kurven muss jeder Wert 0 sein.


Das sieht nach kumulierten Rundungsfehlern aus ?

In[43]:=

GeorgMDataExploration_57.gif

Out[43]=

GeorgMDataExploration_58.gif

Wo geht die 1 los und was für Werte stehen da in beiden Listen:

In[44]:=

GeorgMDataExploration_59.gif

In[45]:=

GeorgMDataExploration_60.gif

Out[45]//TableForm=

2012-02-29 23 140 6195 8195
2012-03-01 23 -163 6031 8031
2012-03-02 23 89 6120 8120

In der Textdatei findet man an der Stelle:
2012-02-28    23    70    6,055    8,055
2012-02-29    23    140    6,195    8,195
2012-03-01    23    -163    6,031    8,031
2012-03-02    23    89    6,120    8,120
2012-03-05    23    140    6,260    8,260

In[46]:=

GeorgMDataExploration_61.gif

Out[46]=

GeorgMDataExploration_62.gif



Ok, das ist vermutlich so ein echt mieser subtiler Fehler in den Datenformaten, die hat man zum Glück recht selten. Mal prüfen:

In[47]:=

GeorgMDataExploration_63.gif

In[49]:=

GeorgMDataExploration_64.gif

Out[49]=

GeorgMDataExploration_65.gif

Hmm, das geht auch nicht (Umwandeln in einfache Zahlen statt Symbols), die Unterschiede bleiben.


Also nochmal in die Originaldaten schauen und Old School vergleichen.  Im Google-Spreadsheet stand:

GeorgMDataExploration_66.gif

In[50]:=

GeorgMDataExploration_67.gif

Out[50]=

GeorgMDataExploration_68.gif

Nöö, dann ist es kein Rundungsfehler, sondern in der Tabelle steht tatsächlich ein falscher Wert. Sowas kommt vermutlich noch 2 mal vor, damit kumuliert sich das auf die maximal 3 Punkte Unterschied aus der obigen Liste. Kann auch vom Google erzeugt worden sein, ich weiß ja  nicht, wer die reinkodiert hat.

Solange die Fehler kein größeres Ausmaß annehmen, ist es ja harmlos. Da hab ich schon Datentabellen mit erheblich mehr Fehlern bearbeitet.



Ergänzende Betrachtung durch Hinzunahme der Dax-Kursdaten


Ich nehm’ erstmal den “normalen” Daxperformance-Index aus der Mathematica-Datenbank. Das ist natürlich nicht der korrekte Datensatz, aber als erster Anhaltspunkt sollte es schon mal Ideen liefern, hoffe ich.


Ich benötige dazu Start- und Enddatum, damit ich nur diese Daten gezielt aus der Datenbank abrufen kann. Format: date,O,H,L,C,V,

In[51]:=

GeorgMDataExploration_69.gif

Out[51]=

GeorgMDataExploration_70.gif

In[52]:=

GeorgMDataExploration_71.gif

Out[52]=

GeorgMDataExploration_72.gif

Man muss auch das Format des Datums nicht anpassen, das ist ja schon mal schön.

Mal sehen, was beim Dax in dem Zeitraum für Daten drin sind:

In[53]:=

GeorgMDataExploration_73.gif

Out[53]=

Graphics:None

Na ja, ist ja alles dabei: starke Abwärtsbewegung, kleinere und größere Korrekturen , und auch schöne Aufwärtsbewegungen. Wobei vermutlich die Aufwärtsbewegungen insgesamt dominieren dürften.

Das schau ich mir mal an.

In[54]:=

GeorgMDataExploration_75.gif

Out[54]=

GeorgMDataExploration_76.gif

Anzahl Handelstage im untersuchten Zeitraum:

In[55]:=

GeorgMDataExploration_77.gif

Out[55]=

GeorgMDataExploration_78.gif


Zum Vergleich die Anzahl von Georgs Daten:

In[56]:=

GeorgMDataExploration_79.gif

Out[56]=

GeorgMDataExploration_80.gif

Hmm, da passt ja was nicht.

Ich schau mal, welche Datumsangaben nicht passen (Intersection = Schnittmenge bilden, das ist die Menge, in der die Datumswerte aus beiden Tabellen enthalten sind, dann die Komplementärmenge bilden. Letztere ist die Menge, die alle übrigen Werte enthält, die in einer der beiden Tabellen zuviel drin sind).


Dazu muss ich aber entgültig die Datumsformate angleichen. Ich nehme dafür das Format von Mathematica.

Aus

In[57]:=

GeorgMDataExploration_81.gif

Out[57]=

GeorgMDataExploration_82.gif

muss also

In[58]:=

GeorgMDataExploration_83.gif

Out[58]=

GeorgMDataExploration_84.gif

werden.
Und noch die 3 0en hinten entfernen.

In[59]:=

GeorgMDataExploration_85.gif

Out[59]=

GeorgMDataExploration_86.gif

Schick. Dann muss man das jetzt elementweise auf den Datumswerten aus Georgs Tabelle machen.

In[60]:=

GeorgMDataExploration_87.gif

Die ersten 10 Elemente (wegen der Übersichtlichkeit) mal gegenchecken (erste Spalte = orginal, 2. Spalte = umgewandelt)

In[61]:=

GeorgMDataExploration_88.gif

Out[61]//TableForm=

2010-01-04
2010
1
4
2010-01-05
2010
1
5
2010-01-06
2010
1
6
2010-01-07
2010
1
7
2010-01-08
2010
1
8
2010-01-11
2010
1
11
2010-01-12
2010
1
12
2010-01-13
2010
1
13
2010-01-14
2010
1
14
2010-01-15
2010
1
15

Passt.
Nun die Schnittmenge bilden aus Georgs Datumswerten und denen aus dem Dax von Mathematica:

In[62]:=

GeorgMDataExploration_89.gif

Out[63]=

GeorgMDataExploration_90.gif

Die Menge enthält also 1005  Elemente. D.h. es sind in beiden Tabellen Datumswerte drin (und die dazugehörigen Records), die nicht in der anderen Tabelle enthalten sind.



Welche Datumswerte sind in Georgs Tabelle , aber nicht in der Dax-Datentabelle von Mathematica ?

In[64]:=

GeorgMDataExploration_91.gif

Out[64]=

GeorgMDataExploration_92.gif

In[65]:=

GeorgMDataExploration_93.gif

Out[65]=

GeorgMDataExploration_94.gif

23 Werte sind “zuviel”.


Welche Datumsangaben sind in der Mathematica-Datenbank, aber nicht in Georgs Tabelle ?

In[66]:=

GeorgMDataExploration_95.gif

Out[66]=

GeorgMDataExploration_96.gif

In[67]:=

GeorgMDataExploration_97.gif

Out[67]=

GeorgMDataExploration_98.gif

Ok, das sind also die üblichen Verdächtigen (Feiertage usw.), aber auch andere Tage.
Hab mal stichprobenartig in der Textdatei nachgesehen, Die Werte fehlen an den Tagen tatsächlich.  Warum ist ja egal, ich kann leider nur nicht die Kursverläufe und Georgs Daten 1:1 aufeinanderpacken. Ich entschließe mich daher, die überhängigen Daten aus beiden Tabellen später zu ignorieren und arbeite nur noch auf den synchronisierten Werten weiter. Kann ja immer mal vorkommen, dass Daten fehlen und es sind ja auch nicht so viele, dass es ins Gewicht fallen sollte (könnte man natürlich auch noch prüfen, aber ich pack das erstmal auf die Todo-Liste mit geringerer Priorität).


In Georgs Liste müssen aber doppelte Datumsangaben enthalten sein, anders kann ich mir die Differenzen in den Listenlängen nicht erklären. Von 1040 bis 1005 fehlen doch 35 Werte und nicht nur 23.
Ich entferne daher die Duplikate und zähle nochmal:

In[68]:=

GeorgMDataExploration_99.gif

Out[69]=

GeorgMDataExploration_100.gif

Das ergibt jetzt tatsächlich 23.


Welche Werte sind denn betroffen ?

In[70]:=

GeorgMDataExploration_101.gif

Out[71]=

GeorgMDataExploration_102.gif

Ich habe den Plot mal gemacht, weil die Datentabelle zu lang ist und man sich sonst tot sucht. In der Grafik sieht man die Problemzone viel schneller.

Gezieltes Anzeigen der Werte:

In[72]:=

GeorgMDataExploration_103.gif

Out[72]=

GeorgMDataExploration_104.gif

Im Juli 2013 sind die Daten also doppelt. Ich vermute mal, da liegt ein Fehler vor, denn im Dax sind genau die Juni-Daten überhängig, in Georgs Liste fehlen die Juni-Daten aber. Vermutlich muss man die korrigieren, ein Teil der Juli-2013-Daten sind eigentlich Juni-2013-Daten. Dann könnte man auch mehr Daten synchronisieren. Ist manuell auch schnell zu erledigen.

Ich verzichte aber mal darauf, denn ich kann nur annehmen, dass die zeitlich früheren die Juni-Daten sind, aber vielleicht ist die Annahme auch falsch. Kann ich also nicht entscheiden, lasse die problematischen Daten lieber insgesamt weg, denn es sind ja nicht soviele.


Synchronisierte Kurs-Handelsttagsdaten

Angeblich hau’n ja die berüchtigten Trendtage zu stark rein, weil man sie nicht im Vornherein erkennen können soll.  Also mal schaun, ob die tatsächlich die Übeltäter sind.
Ich nehme nur die Datensätze, deren Datumswerte in der Schnittmenge enthalten ist.

Nachfolgende Datumswerte werden gelöscht.

In[73]:=

GeorgMDataExploration_105.gif

Out[73]=

GeorgMDataExploration_106.gif

In[74]:=

GeorgMDataExploration_107.gif

Out[75]=

GeorgMDataExploration_108.gif

In[76]:=

GeorgMDataExploration_109.gif

Out[76]=

GeorgMDataExploration_110.gif

In[77]:=

GeorgMDataExploration_111.gif

Out[77]=

GeorgMDataExploration_112.gif


Jetzt noch Georgs Daten bereinigen um die überhängigen Daten:

In[78]:=

GeorgMDataExploration_113.gif

In[79]:=

GeorgMDataExploration_114.gif

Out[79]=

GeorgMDataExploration_115.gif

In[80]:=

GeorgMDataExploration_116.gif


Die Daten kann man jetzt synchronisieren:  

In[81]:=

GeorgMDataExploration_117.gif

In[84]:=

GeorgMDataExploration_118.gif


Als visueller Test im Plot: High-Low-ranges müssen immer positive Werte haben, da der High-Wert immer größer/gleich dem Low-Wert ist.

In[85]:=

GeorgMDataExploration_119.gif

Out[85]=

GeorgMDataExploration_120.gif

Ok, die Berechnung der Ranges war gut, keine negativen Werte. Ansonsten sieht das komisch aus. Wobei die dicken Verluste tatsächlich mehrheitlich von den High-Range-Tagen generiert werden.


Ich plotte das auch nochmal gegen die Close-Open-Differenz (diese kann natürlich auch negative Werte annehmen):

In[86]:=

GeorgMDataExploration_121.gif

In[87]:=

GeorgMDataExploration_122.gif

Out[87]=

GeorgMDataExploration_123.gif



Wenn man die absoluten Beträge der Open-Close-Range nimmt:

In[88]:=

GeorgMDataExploration_124.gif

Out[89]=

GeorgMDataExploration_125.gif

... dann sieht man auch hier, dass die dickeren Verluste bei den Tagen mit den größeren Ranges auflaufen. Eigentlich ist das ja sowieso naheliegend *kopfkratz*, irgendwo müssen die Punkte ja herkommen, da das ja eher eine Wenig-Trades-Am-Tag-Strategie ist.

Und in 3 D kann man erkennen, dass die Fälle zwar nicht sehr häufig vorkommen, aber anscheinend dennoch es schaffen, die Performance zu zerbröseln. Das ist die Sache mit dem Minigrößen bei domestizierten Säugern und Vögeln und deren Generierung stickstoffhaltiger Nahrungsverwertungsüberbleibsel.  

In[90]:=

GeorgMDataExploration_126.gif

Out[90]=

GeorgMDataExploration_127.gif


Wie gut passt eigentlich der Vola-Wert aus Georgs Tabelle auf die "echte" Vola (gemessen in High-Low-Range bzw. Close-Open bzw. Close-CloseVortag).

In[91]:=

GeorgMDataExploration_128.gif

Out[91]=

GeorgMDataExploration_129.gif

Die Vola-Rasterung in Georgs Daten ist schon recht grob. Mal sehen, ob das in 3 D besser aussieht:

In[92]:=

GeorgMDataExploration_130.gif

Out[92]=

GeorgMDataExploration_131.gif

In[93]:=

GeorgMDataExploration_132.gif

Out[93]=

GeorgMDataExploration_133.gif



Hier drängt sich doch eher ein Box-Whisker-Chart auf:

In[94]:=

GeorgMDataExploration_134.gif

In[96]:=

GeorgMDataExploration_135.gif

Out[97]=

Graphics:Volatilität bei Georg vs. High-Low-Range Dax [Punkte]

PT steht ja so auf die Violin-Charts. Dann soll er sie haben ^^:

In[98]:=

GeorgMDataExploration_137.gif

Out[98]=

Graphics:Volatilität bei Georg vs. High-Low-Range Dax [Punkte]

Der Vola-Wert, den Georg zeigt tatsächlich auch einen  Zusammenhang zu den empirischen Vola-Werten.  Wenn man im obigen Plot eine Linie quer durchlegen würde, hätte die tatsächlich einen leicht positiven Anstieg. Allerdings ist die Varianz doch ganz schön groß.


Mal den Fit einer solchen Linie probieren (ich nehme im ersten Anlauf auf Gründen der Einfachheit an, dass der Zusammenhang tatsächlich linear ist, muss jedoch nicht sein !):

In[99]:=

GeorgMDataExploration_139.gif

Out[99]=

GeorgMDataExploration_140.gif

In[100]:=

GeorgMDataExploration_141.gif

Out[100]=

GeorgMDataExploration_142.gif

Das Vola-Maß ist also gar nicht so schlecht, zumindest im Mittel.... Es streut halt stark, aber eh man gar nichts hat....


[To be continued.... aber nicht unbedingt von mir, ich hab grad akut keine Lust mehr.]

Spikey Created with Wolfram Mathematica 8.0