Emergenzbasierte Anlagealgorithmen

Automatisierte Geldanlage auf Basis empirischer Gesetze über die emergente relative Vorteilhaftigkeit von Anlageregeln





André Kuck

Forschungsgruppe Emergenzbasierte Statistik
kuck@dhbw-vs.de

Inhalt

  1. Das Induktionsproblem
  2. Die Lösung des Induktionsproblems mit Hilfe emergenter Gesetze
    • 2.1. Emergente Gesetze und empirische Mengen
    • 2.2. Metagesetze - Gesetze über die Prognosegüte von emergenten Gesetzen
  3. Verwendung emergenter Gesetze zur Assetselektion
    • 3.1. Handlungsheuristiken
    • 3.2. Gesetze über die relative Performance von Handlungsheuristiken
    • 3.3. Spielstrategien auf Assetmärkten
    • 3.4. Konstruktion einer Gesamtstrategie
  4. Zusammenfassung

1. Das Induktionsproblem

Induktion von Beobachtungen auf ein allgemeines Gesetz, das zur Prognose verwendet werden kann:

Bisher sind alle Raben, die wir beobachtet haben, schwarz.

  • Induktionsschluss: Alle Raben sind schwarz.
  • Verwendung zur Prognose: Der nächste Rabe ist schwarz.

Probleme der induktiven Vorgehensweise:

  1. Es gibt bisher nicht "genug" Aussagen, die bisher immer wahr waren.
  2. Die Anwendung der Induktionsregel auf sich selbst ("Alles was wir bisher immer beobachtet haben, passiert immer") scheitert. Die Induktionsregel selbst ist empirisch falsifiziert.

Aus diesen Gründen verwendet man heute meist Wahrscheinlichkeitsaussagen:

Die Wahrscheinlichkeit, dass es morgen regnet, beträgt 50%.

Probleme der wahrscheinlichkeitsbasierten Vorgehensweise:

  1. Es gibt keine Beobachtung, die die Aussage verifiziert und keine, die sie falsifiziert.
  2. Es gibt keine Beobachtung, aus der sie objektiv abgeleitet werden kann.
  3. Rückgriff auf nicht überprüfbare „Verteilungsannahmen“ und die „Testtheorie“

→ Wir behaupten zur Zeit, alles mit "Wahrscheinlichkeit" zu wissen.

→ Leider können diese Behauptungen nur im Unendlichen und somit gar nicht objektiv überprüft werden!

2.1. Emergente Gesetze und empirische Mengen


Beispiel: Heimvorteil beim Fußball

Nach jeder Sequenz von T=256 Spielen war die Rate gewonnener Spiele der Heimmannschaft größer als die der Auswärtsmannschaft.

Die Wahrheit dieser Aussage ist bis jetzt DiV=55,63 mal bestätigt.

In [2]:
data,_,_=loaddata('soccer',True,1)
aktlaw=LLaws(data,'df.gewonnen_h',x='df.gewonnen_a',bed_y='df.C',bed_x='df.C')
aktlaw.PlotLaws('ct')
display(aktlaw.DescribeLaw()[['Target','Bench','Bed_y','R','Bed_x','TU_ct','Div(TU_ct)','Min(TU_ct)','Max(TU_ct)']])
Target Bench Bed_y R Bed_x TU_ct Div(TU_ct) Min(TU_ct) Max(TU_ct)
0 df.gewonnen_h df.gewonnen_a df.C > df.C 256 55.636719 0.035156 0.308594

Beispiel: Peer-to-Peer Kredite der Plattform "LendingClub"

Kreditportfolioauswahlregeln mit nach jeder Sequenz von 512 Krediten unterschiedlicher Rendite.

Eine Auswahl von Portfoliokonstruktionsstrategien auf Basis von Sharp-Ratio oder RAROC würde zur Wahl der von allen anderen dominierten Strategie führen.

In [9]:
res=knowledge.evalnet(3426,'y_rend',select_obj="minT",MinT=4000)
display(res)
Used Objective: ['(df.y_rend)']
Reliability of Net: 0.95
Global RelLevel 0.95
Global MinObs 128
Peergroup 512.0
Necessary Size of closest objects: 3620.0 4644.0
Number of Objects: 4
Parsing Net:
id_learning_process id_knowledge_net Beispiel start_rel EstSample exmean greater_net AnzQuantile TimeSeries Random_Order objective_name
0 1095 3426 lending_club 0.95 0.75 0 True 5 True False (df.y_rend)
Global RelLevel 0.95
Global MinObs 128
Able to convert int_rate into float64
Able to convert revol_util into float64
Total Number of Objects in Net: 4 Calculated: 4 (((~(((categorize(df.int_rate,2)==1.0)|(categorize(df.int_rate,3)==2.0))|(categorize(df.in              
Objectives of the AND-Net
['(df.y_rend)']
Old number of objects in OR-Knowledge_Net 5
Creating AND-Net, run: 1                
Done: New number of objects in AND-Knowledge_Net 6
Number of objects in peergroup: 4
Calculate Object Number: 4       
id_object_name id_object obj Rel T Div min max mean obs EvalMin EvalMax EvalMean objective_name EvalObs
0 253572 6673739 (((~(((categorize(df.int_rate,2)==1.0)|(catego... 0.95 512 8.0 0.113970 0.180035 0.149148 4182 0.146157 0.185681 0.168326 (df.y_rend) 1447
1 253544 6673705 ((~(((categorize(df.int_rate,2)==1.0)|(categor... 0.95 512 8.0 0.080663 0.159280 0.127034 4132 0.135558 0.189442 0.163332 (df.y_rend) 2509
2 253557 6673720 (((categorize(df.int_rate,2)==1.0)|(categorize... 0.95 512 8.0 0.065564 0.116514 0.086110 4186 0.103391 0.125120 0.112931 (df.y_rend) 1371
3 253542 6673703 ((categorize(df.int_rate,5)==1.0)&(categorize(... 0.95 512 8.0 0.030531 0.081286 0.059954 4197 0.071053 0.086091 0.087303 (df.y_rend) 490

Emergente Gesetze lösen das Problem, dass man nur selten bisher immer wahre Aussagen findet.

Wir haben bereits Milliarden von empirischen Gesetzen über die relative Performance von Handlungsregeln aus den unterschiedlichsten Bereichen gefunden.

Weiterhin erfüllen die so konstruierten Objekte die Anforderungen an Elemente zur Konstruktion einer Menge, auf die sich die Theoreme der Mengenlehre anwenden lassen:

  1. Sie sind bisher immer beobachtbar gewesen.
  2. Sie sind bisher immer unterscheidbar gewesen.

So wird es zum ersten Mal möglich, empirisch eindeutig Mengen zu bestimmen, die bisher immer einen zutreffenden Anwendungsfall für die Mengenlehre und somit der Mathematik darstellen.

Es bleibt die Frage, ob die bei obigem Beispiel zu beobachtende gute Performance von Prognosen mit emergenten Gesetzen ein systematisches Phänomen ist.

Kann man das Konstruktionsprinzip emergenter Gesetze auch auf die Prognosen mit emergenten Gesetzen anwenden?

2.2. Gesetze über die Prognosegüte von emergenten Gesetzen - Metagesetze


Lerner suchen ab einem beliebigen Zeitpunkt nach Gesetzen über die relative Performance von Portfolioselektionsstrategien in den LendingClub-Daten.

Sie prognostizeren, dass die bis zum Zeitpunkt t in Fenstern der Größe T DiV-mal immer beobachtete Relation zwischen den Renditen der Strategien auch im Fenster t+T gilt.

Bei der Evaluierung der Prognosen ergeben sich die folgenden Zeitpfade der empirisch beobachteten Raten richtiger Prognosen (Rel) in Abhängigkeit von DiV:

In [3]:
knowledge.plotrel("lendingclub_rendite","0_3_C2b",10000,True,0)

Betrachtet man viele Prognoseprobleme, so kann man z. B. die folgenden emergenten Meta-Gesetze finden:

In [10]:
knowledge.show_overview_MetaLaws_1(Rels=["0.6","0.7","0.8","0.9","0.99","0.999"])
Global RelLevel 0.9
Global MinObs 32
credit 0_3_C2b does not exist. Replaced with 0_3_C1b 0_3_C1b File found.
homeside 0_3_C2b does not exist. Replaced with 0_3_C1b 0_3_C1b File found.
soccer_tordiff 0_3_C2b File found.
bike 0_3_C2b File found.
bank 0_3_C2b File found.
temp 0_3_C2b File found.
hum 0_3_C2b File found.
lendingclub_rendite 0_3_C2b File found.
lendingclub_pd 0_3_C2b File found.
C_SU 0_3_C2b File found.
C_DJ 0_3_C2b File found.
C_R2 0_3_C2b File found.
C_DAX 0_3_C2b File found.
C_FT 0_3_C2b File found.
C_NI 0_3_C2b File found.
SuP_Rend 0_3_C2b File found.
soccer_wgheim 0_3_C2b File found.
soccer_wgaus 0_3_C2b File found.
soccer_wgun 0_3_C2b File found.
Out[10]:
Reliability-Level 0.6 0.7 0.8 0.9 0.99 0.999
DiV-Group
1 16777216.0 NaN NaN NaN NaN NaN
2 134217728.0 8388608.0 NaN NaN NaN NaN
4 67108864.0 268435456.0 NaN NaN NaN NaN
8 8388608.0 67108864.0 67108864.0 NaN NaN NaN
16 8388608.0 4194304.0 33554432.0 16777216.0 NaN NaN
32 262144.0 524288.0 4194304.0 67108864.0 NaN NaN
64 65536.0 262144.0 4194304.0 4194304.0 2097152.0 NaN
128 262144.0 2097152.0 65536.0 524288.0 524288.0 NaN
256 16384.0 32768.0 32768.0 131072.0 131072.0 2097152.0
512 8192.0 16384.0 16384.0 32768.0 1048576.0 524288.0
1024 2048.0 4096.0 8192.0 16384.0 262144.0 131072.0
2048 1024.0 1024.0 2048.0 4096.0 65536.0 65536.0
4096 128.0 128.0 256.0 512.0 8192.0 8192.0
8192 16.0 16.0 32.0 64.0 512.0 4096.0
16384 8.0 16.0 32.0 64.0 512.0 4096.0
32768 8.0 8.0 16.0 32.0 256.0 2048.0
200000 4.0 4.0 8.0 16.0 128.0 1024.0

Beispiel für eine Klasse emergenter Meta-Gesetze:

Wenn eine Aussage A DiV-mal bestätigt wurde, dann gehört die Prognose, dass A beim nächsten Mal wieder auftreten wird, zu einer Kategorie von Prognosen, für die gilt:
In jeder Sequenz von Prognosen der Länge T>=TU war der Anteil wahrer Prognosen >=Rel.

  • Metagesetze über die Rate richtiger Prognosen zeigen, was man bisher immer richtig über die Güte von Prognosen mit emergenten Gesetzen sagen konnte. Sie erlauben die Anwendung des emergenten Induktionsprinzips auf Induktionsergebnisse und lösen so das Induktionsproblem.
  • Darüber hinaus existieren Metagesetze über die relative Performance von Modellbildungsprozessen, Modell-Updatestrategien etc.
  • Auf dieser Basis haben wir einen durch Metagesetze gesteuerten Lernprozess entwickelt.
  • Zentrale Konzepte sind hier:
    • Knowledge-Nets: Mengen von Objekten, die bisher bezüglich eines oder mehrerer Ziele immer verschiedene Mittelwerte aufwiesen.
    • Modelle: Sequenzen von Prognoseregeln, die bezüglich einer Bewertungsmetrik bisher immer zu einer Prognoseverbesserung geführt haben.
  • Die Modelle erreichen eine Prognoseperformance, die der von Deep-Neural-Nets oder XG-Boosting zumindest entspricht.
  • Dieses "Wissen darüber, was bisher immer wahr war" läßt sich strukturiert in einem Knowledge-Warehouse zusammentragen.
  • Da emergente Gesetze nie widersprüchlich sein können, bilden sie eine konsistente Menge von Aussagen innerhalb derer man bisher immer zutreffend hätte schließen können.

Screenshot einer Ansicht des KnowledgeWarehouse

3.1. Handlungsheuristiken


Über einer Menge aus europäischen Aktienindizes soll eine Regel zur Zusammenstellung eines performanten Portfolios gefunden werden.

Beipiel für die Ergebnisfunktion einer elementaren Auswahlstrategie:

logrend(df['EURO_df.C_10_.std()_max']).shift(-1)

Wähle immer das Asset (aus Gruppe Euro), das in den letzten 10 Handelstagen (C_10) die höchste (_max) Standardabweichung (.std()) hatte und berechne die stetige Rendite des nächsten Tages (logrend().shift(-1)).

In [4]:
data,frame,Endo=loaddata_assets('EURO',False,0.9)
BisT=int(len(data)*0.9)

print()
print()
print('Beispiele für einige verwendete Elemetarstrategien')
display(Endo[37:42])
[['CAC40', '^FCHI.csv', 'EURO', 'F'], ['DAX', '^GDAXI.csv', 'EURO', 'D'], ['ATX', '^ATX.csv', 'EURO', 'Oe'], ['MDAX', '^MDAXI.csv', 'EURO', 'D'], ['EuroStoxx50', '^STOXX50E.csv', 'EURO', 'EU'], ['TecDax', '^TECDAX.csv', 'EURO', 'D']]

Generating Strategies

 Total Strategies 80 calculated 80

Beispiele für einige verwendete Elemetarstrategien
["logrend(df['EURO_df.C_10_.mean()_min']).shift(-1)",
 "logrend(df['EURO_df.C_10_.std()_max']).shift(-1)",
 "logrend(df['EURO_df.C_10_.std()_min']).shift(-1)",
 "logrend(df['EURO_df.C_10_.quantile(0.5)_max']).shift(-1)",
 "logrend(df['EURO_df.C_10_.quantile(0.5)_min']).shift(-1)"]

3.2. Gesetze über die relative Performance von Handlungsheuristiken

Beispiel für ein Gesetz über die relative Performance von Elementarstrategien:

Die Summe der Renditen des Index mit der niedrigsten Volatilität der vorherigen 10 Tage war nach 3422 Handelstagen immmer größer als die Summe der Renditen des Index mit der höchsten 10 Tages-Volatilität (immer negative Risikoprämie).

Außerdem war die Summe der Renditen des Index mit niedrigster Volatilität nach 3422 Tagen immer größer als Null.

In [5]:
LLaws(data,"logrend(df['EURO_df.C_10_.std()_max']).shift(-1)",x="logrend(df['EURO_df.C_10_.std()_min']).shift(-1)",bed_x='df.C',bed_y='df.C').PlotLaws()

Gesucht werden Gesetze über die Performance der oben beschriebenen Handlungsregeln:

  • Dabei werden nur Gesetze mit einer Rel von mindestens 0.8 gesucht.
  • Es wird ein Prognosehorizont von 10 Jahren (2500 Handelstage) unterstellt.
  • Für welche der Heuristiken gab es immer eine Sequenzlänge T, für die die Summe der Renditen positiv war?
  • Wie sehen die Gesetze über die Varianz dieser Renditen aus?
  • Welche minimal optimalen Hebel lassen sich durch Kelly's Law aus den Durchschnittsrenditen und Varianzen deduzieren?
In [54]:
BisT=len(df)//10*9
lawdf,LawsForT=find_laws(df,Endo,2600,BisT)
display(LawsForT.loc[LawsForT['T']==2548,FieldList].sort_values('Mean(TG)',ascending=False))
 86 86 14 36            8                        
Target T Min(T) Max(T) Mean(TG) Min_Vola(T) Max_Vola(T) Lev_opt_min Lev_opt_max Mean_eval Obs_eval Min_eval_obj Max_eval_obj
22 logrend(df['EURO_df.C_125_.mean()_max']).shift... 2548 0.000024 0.000916 0.000429 0.000205 0.000247 0.096107 4.464651 0.000644 688.0 0.000095 0.000321
2 logrend(df['EURO_df.C_2_.std()_min']).shift(-1) 2548 0.000170 0.000746 0.000424 0.000117 0.000237 0.715794 6.366041 0.000565 688.0 0.000210 0.000425
28 logrend(df['EURO_df.C_125_.quantile(0.25)_max'... 2548 0.000226 0.000602 0.000415 0.000066 0.000187 1.210273 9.162861 0.000405 688.0 0.000143 0.000375
35 logrend(df['EURO_df.C_250_.quantile(0.25)_max'... 2548 0.000233 0.000615 0.000411 0.000065 0.000192 1.218163 9.493827 0.000613 688.0 0.000220 0.000456
32 logrend(df['EURO_df.C_250_.std()_min']).shift(-1) 2548 0.000239 0.000671 0.000401 0.000064 0.000180 1.326859 10.474259 0.000602 688.0 0.000128 0.000342
14 logrend(df['EURO_df.C_50_.mean()_max']).shift(-1) 2548 0.000060 0.000790 0.000393 0.000199 0.000252 0.239492 3.961886 0.000740 688.0 0.000255 0.000436
25 logrend(df['EURO_df.C_125_.std()_min']).shift(-1) 2548 0.000221 0.000578 0.000382 0.000063 0.000179 1.232272 9.210191 0.000730 688.0 0.000199 0.000366
5 logrend(df['EURO_df.C_3_.std()_min']).shift(-1) 2548 0.000114 0.000640 0.000346 0.000098 0.000221 0.518351 6.543967 0.000509 688.0 0.000129 0.000322
20 logrend(df['EURO_df.C_50_.quantile(0.25)_max']... 2548 0.000212 0.000607 0.000335 0.000081 0.000197 1.075750 7.520446 0.000463 688.0 0.000104 0.000323
17 logrend(df['EURO_df.C_50_.std()_min']).shift(-1) 2548 0.000128 0.000485 0.000310 0.000065 0.000180 0.709839 7.479199 0.000610 688.0 0.000181 0.000383
8 logrend(df['EURO_df.C_4_.std()_min']).shift(-1) 2548 0.000052 0.000480 0.000282 0.000090 0.000208 0.250841 5.310078 0.000824 688.0 0.000207 0.000356
12 logrend(df['EURO_df.C_20_.std()_min']).shift(-1) 2548 0.000072 0.000434 0.000270 0.000064 0.000183 0.393675 6.791862 0.000667 688.0 0.000218 0.000405
10 logrend(df['EURO_df.C_10_.std()_min']).shift(-1) 2548 0.000006 0.000389 0.000227 0.000067 0.000183 0.034370 5.789866 0.000635 688.0 0.000184 0.000354

Was wäre passiert, wenn man immer der Meta-Auswahlregel "Wähle immer die bis zum Zeitpunkt t nach dem Kriterium Mittelwert beste Anlagestrategie" gefolgt wäre?

Der Zeitpfad der erzielten Renditen bei Verwendung dieser "Follow-the-Leader Strategie" führt zu schlechteren Ergebnissen als die ex-post beste Strategie.
Ex-Ante ist die Ex-Post beste Strategie leider nicht bekannt.

In [27]:
a_1,b_1=follow_the_leader(data,Endo[0:],None,'Test')
plt.figure(figsize=(12,8))
plt.plot(data['Date'],logrend(data['DAX_Close']).expanding().sum(),label='DAX')
plt.plot(data['Date'],logrend(data['EURO_df.C_125_.mean()_max']).expanding().sum(),label='Ex-Post Best')
plt.plot(data['Date'],a_1.expanding().sum(),label='Follow the Leader')

plt.legend()
plt.show()

Die Strategie "Tue immer das, was bisher insgesamt das Beste war" ist aber nicht die einzig mögliche Verhaltensstrategie.

Auch Grundstrategien wie:

  • Tue immer das, was in den letzten T Tagen das Beste war.
  • Tue immer das, was bisher immer in T-Fenstern besser war als eine Benchmark.

scheinen durchaus plausibel.

Einen Hinweis darauf, welche Verhaltensstrategien auf Assetmärkten erfolgreich sein könnten, liefert der Vergleich der Rate wahrer Prognosen (Reliability) bei unterschiedlichen Arten von Prognoseproblemen:

Probleme mit naturwissenschaftlichem Charakter (z.B. relative Größe der Luftfeuchtigkeit in Washington DC)

  • Die Raten wahrer Prognosen sind sehr konstant.
  • Es existieren Gesetze mit hohem DiV.
In [6]:
knowledge.plotrel("hum","0_3_C2b",3000,True,0)

Probleme der Prognose der relativen Vorteilhaftigkeit von Handlungsheuristiken bei konstanter Lerngeschwindigkeit (Fussballwetten)

  • Die Raten wahrer Prognosen sind relativ konstant.
  • Es existieren keine Gesetze mit DiV>256.
  • Das größte DiV ist im Zeitablauf relativ konstant .
In [7]:
knowledge.plotrel("soccer_wgaus","0_3_C2b",1250,True,0)

Probleme der Prognose der relativen Vorteilhaftigkeit von Handlungsheuristiken bei variabler Lerngeschwindigkeit (Assetmärkte)

  • Die Raten wahrer Prognosen variieren im Zeitablauf.
  • Es existieren keine Gesetze mit DiV>256.
  • Das größte beobachtete DiV variiert im Zeitablauf.
In [13]:
knowledge.plotrel("C_SU","0_3_C2b",1250,True,0)

→ Es ist Aufgabe herauszufinden, wie lange man auf die Konstanz von Mustern vertrauen kann und was bei Falsifikation normalerweise geschieht.

→ Wir nennen Handlungsheuristiken, die Muster der Reaktion von Gegenspielern berücksichtigen "Spielstrategien".

→ Man kann zwischen Spielstrategien bei konstanter und variabler Lerngeschwindigkeit unterscheiden.

3.3. Spielstrategien auf Assetmärkten

Man kann versuchen, empirisch die Regeln zu finden, nach denen die Marktteilnehmer an den Börsen derzeit spielen. Dazu verwenden wir vier grundsätzlich verschiedene Spielstrategien zur Auswahl von elementaren Handelsstrategien zu einem Zeitpunkt t in Abhängigkeit von Performancemustern in der unmittelbaren Vergangenheit:

  1. Tue immer das, was aktuell in Fenstern der Länge T1 Div1-mal und vorher in Fenstern der Länge T2 Div2-mal funktioniert hat (kontinuierliche Regeln, Long_Long_T1_T2_Div1_Div2, Short_Short_T1_T2_Div1_Div2).

  2. Tue immer das, was aktuell in Fenstern der Länge T1 Div1 nicht immer, aber vorher in Fenstern der Länge T2 Div2-mal funktioniert hat (früher gültige Regel aktuell falsch, NichtLong_Long_T1_T2_Div1_Div2, NichtShort_Short_T1_T2_Div1_Div2).

  3. Tue immer das, was aktuell in Fenstern der Länge T1 Div1 nicht ins Gegenteil dreht, aber vorher in Fenstern der Länge T2 Div2-mal funktioniert hat (früher gültige Regel aktuell nicht das Gegenteil wahr, NichtShort_Long_T1_T2_Div1_Div2, NichtLong_Short_T1_T2_Div1_Div2).

  4. Tue immer das, was aktuell in Fenstern der Länge T1 Div1 immer und vorher in Fenstern der Länge T2 Div2-mal nicht funktioniert hat (Gegenteil einer früher gültigen Regel, Long_Short_T1_T2_Div1_Div2, Short_Long_T1_T2_Div1_Div2).

Alle gefundenen Elementarstrategien mit Mustern gleicher Art werden zu einem gleichgewichteten Portfolio kombiniert.

Mit den Parametern T1=4, T2=8, Div1=1 und Div2=2 ergibt sich folgender Renditeverlauf für die einzelnen Spielstrategien:

In [32]:
a=calc_div_t(df,Endo,4,8,1,2,'Test_')

3.4. Konstruktion einer Gesamtstrategie

Auf dieser Basis kann man alle Strategien auswählen, die bis zum Zeitpunkt t in T-Fenstern die folgenden Eigenschaften haben:

  • TB-Dominanz gegenüber der Benchmark: Sie waren immer besser als Bargeldhaltung (oder eine andere Benchmark wie die Verzinsung von Staatsanleihen mit Restlaufzeit T).
  • Nicht T-dominiert im Bezug auf die Rendite: Es gab keine andere Spielstrategie, die immer eine höhere Rendite hatte.
  • Nicht T-dominiert im Bezug auf die Volatilität: Es gab keine andere Spielstrategie, die immer eine niedrigere Volatilität hatte.

Für den Anlagezeitraum T=2524 (ca. 10 Jahre) findet man die folgenden 20 Strategien:

In [18]:
with open("./EURO_Laws_for_T.p","rb") as f:
    Strategies=pickle.load(f)
with open("./EURO_datenframe.p","rb") as f:
    data_s=pickle.load(f)
In [22]:
domstrategies_2524=Strategies.loc[(Strategies['T']==2524)].loc[(Strategies['Max(T)']>=Strategies['Min(T)'].max())].loc[(Strategies['Min_Vola(T)']<=Strategies['Max_Vola(T)'].min())].sort_values('Div(TU_ot)',ascending=False)
display(domstrategies_2524.loc[:,FieldList])
Target T Min(T) Max(T) Mean(TG) Min_Vola(T) Max_Vola(T) Lev_opt_min Lev_opt_max Mean_eval Obs_eval Min_eval_obj Max_eval_obj
209 df['R_Learn_DivT_NichtLong_Long_2_5_3_4'].shif... 2524 0.001041 0.002130 0.001488 0.000098 0.000183 5.673569 21.756895 0.001408 54.0 0.001087 0.001530
1878 df['R_Learn_DivT_NichtShort_Long_4_4_1.5_4'].s... 2524 0.001119 0.002264 0.001367 0.000086 0.000201 5.565390 26.476023 0.000891 80.0 0.000766 0.001250
140 df['R_Learn_DivT_NichtLong_Long_2_4_3_4'].shif... 2524 0.001153 0.002355 0.001400 0.000083 0.000218 5.293848 28.268908 0.000970 77.0 0.001045 0.001533
4270 df['R_Learn_DivT_NichtShort_Long_7_7_1.5_4'].s... 2524 0.001218 0.002041 0.001399 0.000097 0.000199 6.123116 21.110651 0.001555 122.0 0.001102 0.001542
1072 df['R_Learn_DivT_NichtLong_Long_3_4_2_4'].shif... 2524 0.001336 0.002406 0.001486 0.000087 0.000222 6.021181 27.657471 0.000999 77.0 0.001008 0.001487
215 df['R_Learn_DivT_NichtShort_Long_2_5_3_4'].shi... 2524 0.000756 0.001816 0.001275 0.000099 0.000175 4.325515 18.287009 0.001341 55.0 0.000927 0.001422
2849 df['R_Learn_DivT_NichtShort_Long_5_5_1.25_4'].... 2524 0.000718 0.002001 0.001350 0.000100 0.000179 4.001672 20.051102 0.000709 53.0 0.000906 0.001284
1979 df['R_Learn_DivT_NichtShort_Long_4_5_1.5_4'].s... 2524 0.000853 0.001886 0.001323 0.000099 0.000178 4.803491 19.052525 0.000676 53.0 0.000963 0.001363
3018 df['R_Learn_DivT_NichtLong_Long_5_7_2_4'].shif... 2524 0.001302 0.002255 0.001550 0.000097 0.000228 5.706708 23.172662 0.001685 117.0 0.001154 0.001597
1852 df['R_Learn_DivT_NichtLong_Long_4_4_1.25_4'].s... 2524 0.001132 0.002930 0.001808 0.000081 0.000221 5.123982 36.308550 0.000912 73.0 0.000505 0.001289
1973 df['R_Learn_DivT_NichtLong_Long_4_5_1.5_4'].sh... 2524 0.000969 0.002226 0.001497 0.000104 0.000203 4.764879 21.487452 0.001239 48.0 0.001019 0.001493
4263 df['R_Learn_DivT_NichtLong_Long_7_7_1.5_4'].sh... 2524 0.001114 0.001963 0.001300 0.000105 0.000209 5.338926 18.764818 0.001742 110.0 0.001200 0.001667
1952 df['R_Learn_DivT_NichtLong_Long_4_5_1.25_4'].s... 2524 0.001265 0.002457 0.001779 0.000101 0.000215 5.890596 24.257651 0.000294 46.0 0.001250 0.001651
2879 df['R_Learn_DivT_NichtLong_Long_5_5_2_3'].shif... 2524 0.000850 0.001913 0.001236 0.000102 0.000206 4.130709 18.792731 0.002223 108.0 0.000817 0.001384
1927 df['R_Learn_DivT_NichtLong_Long_4_5_1_4'].shif... 2524 0.000949 0.002386 0.001465 0.000092 0.000207 4.588690 25.794595 -0.000070 43.0 0.000380 0.001100
2818 df['R_Learn_DivT_NichtLong_Long_5_5_1_4'].shif... 2524 0.001403 0.003024 0.002039 0.000103 0.000245 5.720750 29.213527 0.000801 42.0 0.001672 0.002145
1365 df['R_Learn_DivT_NichtLong_Long_3_8_1_4'].shif... 2524 0.001142 0.002624 0.001630 0.000081 0.000254 4.493506 32.315271 0.001243 68.0 0.000711 0.001219
1224 df['R_Learn_DivT_NichtLong_Long_3_6_1.5_3'].sh... 2524 0.001113 0.002722 0.001640 0.000106 0.000213 5.230155 25.676415 0.000946 125.0 0.000949 0.001419
2921 df['R_Learn_DivT_NichtLong_Long_5_6_1_3'].shif... 2524 0.000896 0.002227 0.001328 0.000105 0.000215 4.177156 21.252863 0.001417 126.0 0.000938 0.001237
1109 df['R_Learn_DivT_NichtLong_Long_3_5_1_3'].shif... 2524 0.000903 0.002017 0.001285 0.000102 0.000200 4.522545 19.736791 0.001358 88.0 0.000808 0.001463

Kombiniert man die nicht dominierten Strategien zu einem gleichgewichteten Portfolio, so erhält man die folgenden Out-of-Sample Evaluierungsergebnisse (in den letzten 10% der Daten):

In [29]:
ges_rend,ges_rend_lev,ges_anz=makeportfolio(data_s,domstrategies_2524,logrend(data_s.DAX_Close.shift(1)),BisT,MinLev=1,Filter='_')
Target Return Lev 1 Lev_opt_min Return at Lev_opt_min
0 df['R_Learn_DivT_NichtLong_Long_2_5_3_4'].shif... 0.084149 5.673569 0.430396
1 df['R_Learn_DivT_NichtShort_Long_4_4_1.5_4'].s... 0.065138 5.565390 0.296328
2 df['R_Learn_DivT_NichtLong_Long_2_4_3_4'].shif... 0.065908 5.293848 0.289665
3 df['R_Learn_DivT_NichtShort_Long_7_7_1.5_4'].s... 0.212383 6.123116 1.174632
4 df['R_Learn_DivT_NichtLong_Long_3_4_2_4'].shif... 0.066740 6.021181 0.323037
5 df['R_Learn_DivT_NichtShort_Long_2_5_3_4'].shi... 0.083982 4.325515 0.337368
6 df['R_Learn_DivT_NichtShort_Long_5_5_1.25_4'].... 0.046717 4.001672 0.172974
7 df['R_Learn_DivT_NichtShort_Long_4_5_1.5_4'].s... 0.046684 4.803491 0.203052
8 df['R_Learn_DivT_NichtLong_Long_5_7_2_4'].shif... 0.219824 5.706708 1.149525
9 df['R_Learn_DivT_NichtLong_Long_4_4_1.25_4'].s... 0.076736 5.123982 0.342166
10 df['R_Learn_DivT_NichtLong_Long_4_5_1.5_4'].sh... 0.073571 4.764879 0.324009
11 df['R_Learn_DivT_NichtLong_Long_7_7_1.5_4'].sh... 0.214389 5.338926 1.058362
12 df['R_Learn_DivT_NichtLong_Long_4_5_1.25_4'].s... 0.023203 5.890596 0.113509
13 df['R_Learn_DivT_NichtLong_Long_5_5_2_3'].shif... 0.238351 4.130709 0.931344
14 df['R_Learn_DivT_NichtLong_Long_4_5_1_4'].shif... 0.014770 4.588690 0.054545
15 df['R_Learn_DivT_NichtLong_Long_5_5_1_4'].shif... 0.035873 5.720750 0.183826
16 df['R_Learn_DivT_NichtLong_Long_3_8_1_4'].shif... 0.121551 4.493506 0.510682
17 df['R_Learn_DivT_NichtLong_Long_3_6_1.5_3'].sh... 0.105250 5.230155 0.459943
18 df['R_Learn_DivT_NichtLong_Long_5_6_1_3'].shif... 0.168662 4.177156 0.646862
19 df['R_Learn_DivT_NichtLong_Long_3_5_1_3'].shif... 0.159060 4.522545 0.650442

4. Zusammenfassung

  • Viele in der ökonomischen Theorie unterstellten Gesetzmäßigkeiten sind empirisch falsch (Risikoprämie, Markteffizienz, Wirkung von Hedging, ...)
  • Asset-Auswahl auf mit Stochastik-basierten RAPMs führt oft zur Verwendung T-dominierter Strategien.
  • Empirische Gesetze über Lernmuster und Lerngeschwindigkeit der Marktteilnehmer aber auch emergenzbasierte Fundamentalanalyse sind die entscheidenden Bestandteile erfolgreicher Portfoliokonstruktion.
  • Zur Strategieauswahl auf Basis emergenter Gesetze werden nur der Anlagehorizont T und eine Benchmark B als Parameter benötigt.
  • Gewählt wird ein Portfolio aus zu einer Benchmark B TB-dominanten Anlagestrategien, die selbst nicht T-dominiert werden.
  • Da emergente Gesetze ggf. eindeutig und endgültig falsifiziert werden, läßt sich das KnowledgeWarehouse bei Live-Einsatz ständig überprüfen und falsifizierte Gesetze entfernen.
  • Es enthält so eine ständig aktuelle Sammlung bisher immer gültiger empirischer Gesetze und bisher immer performanter Handlungsheuristiken.