Drücke „Enter”, um zum Inhalt zu springen.

Künstliche Intelligenz – Ein Versuch an Aktien

Christoph Hirte 0

Zu allererst: dieser Versuch wird live dokumentiert und ist aus Zeitgründen nicht vollständig. Es zeigt alle meine Irrungen und Wirrungen.

Die Idee, Aktienkurse vorauszusagen oder zumindestens die Richtung (fällt/steigt) ist Antrieb genug dem Themenfeld mit Python, Mathematik und evtl. künstlicher Intelligenz zu begegnen. Die Frage die mich treibt: Kann ich Momente aus einem Live-Datenfeed ableiten, welche mir verlässlich bei einem möglichst hohen Schwellenwert andeuten, dass der Kurs jetzt steigen wird?

Ok. Ich habe es nicht erst seit gestern vor. Die Idee trage ich schon viele Jahre mit mir herum. Seit November 2018 betreibe ich einen Server im Internet der mir täglich alle auf Tradegate ausgeführten Trades aller dort gehandelten deutschen ISINs runterlädt. Mittlerweile (September 2020) ist der Datenberg ca. 30 Millionen Einträge schwer. Jetzt ist die Zeit gekommen diesen zu durchforsten und nach Korrelationen zu suchen.

Zuerst steht also die Suche nach einem Modell (einem Baum oder einem Netz). Als erste Fingerübung in Python will ich die Korrelation der Preisbewegung von der Deutschen Bank AG und der Commerzbank AG untersuchen (mein Nachbar sagt: Wenn die Deutsche Bank steigt, dann steigt auch die Commerzbank. Stimmt das?)

Ich habe zu jedem Trade den Preis, die Menge und den Timestamp (Uhrzeit mit Millisekundenanteil) der Ausführung. Da beide Titel nicht gleich häufig gehandelt werden am Tag, muss ich sie irgendwie normalisieren, sodass ich zwei Vektoren gleicher Länge bekomme, die ich dann korrelieren kann. Das heißt, ich nehme einen Tag, von 8 – 22 Uhr, unterteile ihn in 840 Cluster womit jeder Cluster 60 Sekunden breit ist. Aus allen Trades die in einen Cluster fallen wird der Arithmetrische Durchschnitt gebildet und dieser steht dann als Einzelwert für diesen Cluster. Cluster ohne Trades bekommen den Durchschnitt aus den Werten des Vorgängers und nächstem Nachfolger-Cluster. So wird gewährleistet, dass sowohl der DB-Vektor 840 Preise enhält, wie auch der Coba-Vektor 840 Preise enthält. Anschließend wird mittels Numpy und corrcoef() der Pearson’sche Korrelationskoeffizient r gebildet mit (-1<r<1). Für das Jahr 2019 gibt es das folgende Ergebnis:

Zuerst wird der Monat ausgegeben, gefolgt vom durchschnittlichen Korrelationskoeffizienten in diesem Monat, gefolgt von einer Liste der Tages-Korrelationskoeffizienten in diesem Monat. Der Leser kann dies überprüfen indem er den Index eines Wertes aus der Liste ableitet und dann selbst überlegt, welcher Handelstag das in dem Monat war (Tradegate handelt auch am Samstag).

Correlation:
Month: 2019-1
r = 0.36888892137278334
[0.5088020677444972, 0.38484494736832636, 0.21052215008380792, 0.30986813984299244, 0.6063121159370897, 0.3131175251306154, 0.30045615582513313, 0.30725020965728483, 0.6287277898807181, 0.3374390563260576, 0.6703285943959661, 0.40782238368078116, 0.2504030104182819, 0.2105710929172898, 0.380617879206725, 0.18522815484062755, 0.41307704760665215, 0.5751491008539314, 0.3279433992757113, 0.23141947653435668, -0.15096090517386226, 0.29188659269941863, 0.7836192065216153]

Month: 2019-2
r = 0.3037696042396743
[0.256759311378592, 0.09134761179365601, 0.18937654951681906, 0.3597012626180828, 0.08805415933855652, -0.2791720745120411, 0.5617011380625914, 0.08285161802981317, -0.3143561518497316, -0.2542970923108727, 0.6192256625097163, 0.25509843316414355, 0.7908326092800129, 0.8003735893323413, 0.6015302542945805, 0.543227571191892, 0.14280386592562347, -0.044878802540474313, 0.6908186695039595, 0.894393900066226]

Month: 2019-3
r = 0.41408001538867073
[0.3300536304787692, 0.6235589731224747, 0.619684579714325, 0.37353233238544836, 0.8979602052883, 0.4807634342986567, 0.5444765298908606, 0.8143985596602814, 0.7409034973328836, 0.540744574510214, -0.6153834174866111, 0.7638640468649881, 0.24952682210655702, 0.10440641710928165, 0.23765825185934358, 0.6116608750766732, -0.051326545469328716, -0.042470120273481, 0.6910544524643023, 0.7121958855220601, 0.06841733870608623]

Month: 2019-4
r = 0.3438533082254566
[0.776707217139802, 0.6806334292004059, 0.03648870175936359, -0.010097872490516758, -0.2823571758613547, 0.4131112051382542, 0.06227850940391943, 0.6930581526420145, 0.8246154436608593, 0.4304418426138096, 0.4299361508029319, 0.20193259641025002, 0.2284357071302612, 0.6523535972832115, 0.6523535972832115, 0.5566682978566241, 0.5621941692136392, 0.10545189296414251, -0.21329703924838855, 0.11425013551414326, 0.30576091431800556]

Month: 2019-5
r = 0.21797475587172876
[0.6011424232252797, 0.6657580568479646, 0.7371153720107111, 0.14451021647115422, 0.18930452108077733, -0.1068462678585878, 0.011837669193450355, 0.33540653689485955, 0.132747164887246, 0.3989712243060827, 0.42187183396102523, 0.24263244666108835, 0.1119966741179075, 0.08991628972299574, -0.10315809381130368, 0.41660992682213194, -0.020049489121746495, 0.38836370831237604, -0.16411269183345512, 0.24664996398281505, 0.06824743380167146, -0.00971494476015123, 0.21421941013546947]

Month: 2019-6
r = 0.11633751975148185
[0.09482963612180519, 0.34538803218399644, 0.04713815936317579, 0.4012264471959619, -0.31511015209453397, -0.36203166595924363, 0.23367725678849394, 0.14209017158254783, 0.43895675628799574, -0.002904614169715285, 0.2374191307400468, 0.5042095691225069, 0.19936023772537276, 0.10990620160218158, 0.0003623390058839082, 0.27566069745523103, 0.3143455102265165, -0.34110095081201547, 0.23001785738794384, -0.22669022472451505]

Month: 2019-7
r = 0.1813651991352416
[0.12759016650093888, 0.20397120351793468, 0.0772327400967056, 0.26156660488157785, -0.2144873265761233, 0.4208426246766166, 0.22859482265933997, 0.007032589380964241, 0.2093186859773575, -0.1917114235347178, -0.3345805708853443, 0.18650447695199127, 0.3475274143803054, 0.21280601599427112, 0.46169764911973815, 0.4576917206016511, 0.19045169690370395, 0.4143002212015763, -0.015134411504866092, -0.08008326059817827, 0.1671267573585733, 0.7738865331870198, 0.25925464981952034]

Month: 2019-8
r = 0.414188733741554
[0.26648616068501246, -0.11403368951852827, 0.40035813642458645, 0.511410845614627, -0.0021237631688843456, 0.31799609752075353, 0.28211199552099325, 0.5676706271576273, 0.903770209399976, 0.6117617092416475, 0.5310869690148445, 0.2352193234536688, 0.35919670307125556, 0.38541007600829225, 0.4571925848291285, 0.826271251315196, 0.8912474629264671, 0.5004444663130563, 0.3553819453689335, 0.223968535246365, 0.2704108740612629, 0.330913621827908]

Month: 2019-9
r = 0.31560311904991484
[-0.3280280319524599, 0.2719737581807733, 0.5071485467579866, 0.3162764272372444, -0.04521170965459446, 0.14977075652144697, 0.15229777419533816, 0.3610820347534121, -0.20042326879805217, 0.3719364890279151, 0.4861388143752879, 0.7132268740902482, 0.5176311710725661, 0.27298277286924555, 0.13308348934349892, 0.2813498822217434, 0.8352339636968545, 0.7405097755670103, 0.06831455003970505, 0.45601613068135377, 0.566355299821688]

Month: 2019-10
r = 0.49506660659788754
[0.8688922997248641, 0.6660569786486987, 0.32302680533973926, 0.04952657291757867, 0.7694200440532046, 0.8293533541450407, 0.5057592077555181, 0.916728491942352, 0.6823205455924486, 0.8494580745037299, 0.5900859544138988, 0.45140176452516934, 0.49036390039576155, 0.5802101612262782, 0.6993982980752163, 0.22967023756208915, 0.5861096670783075, 0.80314526581482, 0.062456488858710725, -0.11951415290138655, -0.20309387705899373, 0.47789045874912717, 0.2778654103892381]

Month: 2019-11
r = 0.384474950196278
[0.1370208527025824, 0.281760426775766, 0.26178981126628836, 0.7517240336719779, 0.11893642761288396, 0.5205916833524895, 0.6831492637480213, 0.33229229286579703, 0.4239136182750724, 0.5689705688717989, 0.4033975503942082, 0.5975579011241883, 0.7739710442965351, 0.3160045097622518, 0.7590345645300762, 0.4841773292813243, 0.2393671866804945, -0.13132669677639416, -0.10978872926546396, 0.14941387637993533, 0.512016438572005]

Month: 2019-12
r = 0.39657760657067237
[0.6762389407115127, 0.7913148461892758, 0.47944842817641414, 0.491397249303933, 0.6291214156165994, 0.4278838235670666, -0.13182843655957455, 0.13733894943345412, 0.5278306955311638, 0.665263964282371, 0.252785438104404, -0.12456965225951133, 0.34055421826234084, -0.19444287101027422, 0.5042857676228135, 0.5829143575853527, 0.767189545824535, 0.767189545824535, 0.767189545824535, 0.31445362910098895, 0.4199604201029211, -0.36681247668006495]

Das Ergebnis: Mein Nachbar hat bedingt Recht. Aber im Großen und Ganzen hat er eher kein Recht mit der Behauptung („Wenn die DB steigt, dann steigt auch die Coba.“). Ein Korelationskoeffiziet von 0,3 gilt als schwach positiv korreliert. Dennoch gibt es Tage, da ist die Korrelation z.B. 0.916728491942352 was als stark positiv korelliert gewertet werden kann. Aber das ist eher die Ausnahme als die Regel.

Und jetzt? Vielleicht ist das Modell zu detailiert. Vielleicht sollte ich pro Aktie nur 3 Werte am Tag (First, Mid, Last) miteinander vergleichen. Und/oder: Ich nehme ein Zeitfenster von evlt 10 Minuten und schiebe es über den Tag (die 840 Cluster) und korrelieren dann die beiden Aktien. Vielleicht ergeben sich in den Morgenstunden eines Handelstages höheren Korrelationskoeffizienten.

t.b.c

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert