Drawing Drawing


Notebook zur

Anwendung Emergenzbasierter Statistik I:

Geldmengenaggregate, Aktienindizes, Häuserpreise - eine empirische Analyse makroökonomischer Größen mithilfe Emergenzbasierter Statistik


http://zes.dhbw-vs.de
von André Kuck und Hans Frischhut


Das folgende Notebook gibt einen Einblick in die Möglichkeiten des Einsatzes emergenzbasierter Statistik am Beispiel der Analyse makroökonomischer Daten. Es soll als Lehrmaterial zur Vermittlung emergenter Methoden dienen.
Es ist in sehr kurzer Zeit entstanden und wir bitten daher um Nachsicht wegen sicher vorhandener orthographischer und anderer formaler Fehler.

Inhalt

  • Einführung: Ein erstes emergentes Gesetz über Geldmengenwachstum
  • Schritt 1: Einlesen der Meta-Gesetze
  • Schritt 2: Generierung von endogenen Variablen und Features
  • Schritt 3: Erstellung eines KnowledgeNets
  • Schritt 4: Erstellung von Emergenten Modellen
  • Zusammenfassung: Wie können diese Ergebnisse verwendet werden

Das Notebook lässt sich auf dem Methoden-Server des ZES nachrechnen und weiterentwickeln.

Einführung: Ein erstes emergentes Gesetz über Geldmengenwachstum

Um noch einmal kurz die Grundbegriffe der emergenzbasierten Statistik zu rekapitulieren, wollen wir mit einem kleinen emergenten Gesetz über das Geldmengenwachstum beginnen.

Lesen wir zuerst die ML-Toolbox und die Datenbank ein,

In [1]:
from ML_Tool_029 import *
set_global_rel(0.8,plot_rel=False)
source="C:/Users/Frischhut/Desktop/Lehrveranstaltung Emergente Gesetze/Projektarbeit_Ruth/Projektarbeit Yannik Ruth_1.csv"
#source='C:/Users/Kuck/Documents/kuck/Python/YannikRuth/Projektarbeit Yannik Ruth_1.csv' #Hier liegt die Datei
data = pd.read_csv(source,sep=',',parse_dates=False)
data=copy.deepcopy(data.loc[~data.M1_US.isnull()])
change_cent=False
def add_century(x):
    global change_cent
    if x[4:]=="00":
        change_cent=True
    if change_cent:
        return x[:4]+"20"+x[4:]
    else:
        return x[:4]+"19"+x[4:]
data["DATE"]=data["DATE"].apply(add_century)
data["DATE"]=pd.to_datetime(data["DATE"],format="%b-%Y")
data.index=data["DATE"]
#data=copy.deepcopy(data.loc[~data.C_REX.isnull()])
#data.index=np.arange(len(data))
data['C']=True
data['null']=False
Data-Source ../../Daten
Models are saved to Directory: ../Models_temp/
Global RelLevel 0.8
Global MinObs 16

und werfen einen kurzen Blick auf den Verlauf der einzelnen Zeitreihen:

In [26]:
df=data
zeile=1
spalte=1
pl=0
plt.figure(figsize=(20, 15))
dataseries=['C_SU', 'Case_home', 'Case_10', 'C_DJ', 'M1_US', 'M2_US',
       'C_DAX', 'C_KDAX', 'C_REX', 'M1_DE', 'M2_DE', 'M3_DE', 'C_FT', 'M1_GB',
       'M2_GB', 'M3_GB', 'C_NI', 'M0_JP']
for asset in dataseries:
    #print(asset,df[asset].pct_change().mean())
    zeilen=(len(dataseries)//3)+1
    spalten=3
    #print(pl+1,zeile,spalte)
    plt.subplot(zeilen,spalten,pl+1)
    plt.plot(df.loc[~df[asset].isnull()]['DATE'],df[asset].loc[~df[asset].isnull()],label=asset)
    pl=pl+1
    plt.legend()
plt.show()

Die Daten in diesem Beispiel bestehen aus Monatsdaten einer kleinen Auswahl von unterschiedlichen Assets:

  • 'C_SU': S&P500 Aktienindex
  • 'C_DJ': Dow Jones Aktienindex
  • 'Case_home': Case-Shiller Home Price Index (Häuserpreisindex in den USA)
  • 'Case_10': Case-Shiller Home Price Index für die 10 größten Städte der USA
  • 'C_DAX': DAX Aktienindex
  • 'C_KDAX': Kurs-DAX
  • 'C_REX': Deutscher Rentenindex
  • 'C_FT': FTSE500 Aktienindex
  • 'C_NI': Nikkei225 Aktienindex

Zusätzlich dazu werden Monatsdaten für eine kleine Anzahl von Geldmengenaggregaten verwendet:

  • M1_US und M2_US: Geldmengenaggregate M1/M2 der USA
  • M1_DE, M2_DE und M3_DE: Geldmengenaggregate M1/M2/M3 Deutschlands
  • M1_GB, M2_GB und M3_GB: Geldmengenaggregate M1/M2/M3 Großbritanniens
  • M0_JP: Geldmengenaggregat M0 Japans

Wenn wir nun die Frage nach den Wachstumsraten der Geldmenge M2 für Deutschland (M2_DE.pct_change()) stellen, so können wir feststellen, dass die Geldmenge in manchen Monaten gewachsen und in anderen geschrumpft ist:

In [27]:
plt.plot(data.DATE,data.M2_DE.pct_change())
plt.show()

Wenn wir aber nach einer Fenstergröße T suchen, für die die rollierende mittlere Wachstumsrate der Geldmenge immer größer (oder kleiner) ist als Null, dann stellen wir fest dass:

  • In jeder Sequenz der Länge 32 (und größer) die mittlere Wachstumsrate der Geldmenge größer ist als 0. Wir nennen die Länge der Sequenz, für die Aussage über eine Relation über Funktionen von Sequenzen immer wahr ist T, die Größe der Emergenzmenge.
  • Dies war bisher in 12.56+1 nicht überlappenden Sequenzen der Länge 32 der Fall. Die Anzahl von Bestätigungen des ersten Auftauchens eines solchen Musters nennen wir DiV, den Grad der Induktiven Bestätigung.

Eine solche bisher immer wahre Relation von Funktionen über Sequenzen von Messungen nennen wir ein emergentes Gesetz.

In [28]:
aktlaw=LLaws(data,'df.M2_DE.pct_change()',bed_y='df.C')
#aktlaw.create_emergence_movie('ot',fps=1,LagList=range(1,len(data)//2-1,10))
aktlaw.PlotLaws('ot')
display(aktlaw.DescribeLaw()[['Target','Bench','Bed_y','R','Bed_x','TU_ot','Div(TU_ot)','Min(TU_ot)','Max(TU_ot)']])
Target Bench Bed_y R Bed_x TU_ot Div(TU_ot) Min(TU_ot) Max(TU_ot)
0 df.M2_DE.pct_change() 0 df.C > None 32 12.5625 0.001077 0.010954

Wir haben an dieser Stelle die Größen DiV und T noch einmal kurz eingeführt, weil sie für die weitergehenden Berechnungen von zentraler Bedeutung sind.

Schritt 1: Einlesen der Meta-Gesetze

Eines der zentralen Ergebnisse der emergenzbasierten Statistik ist die Entdeckung von empirischen Gesetzen über die Güte von Prognoseprozessen.

Wenn man mit zum Zeitpunkt t DiV mal bestätigten Gesetzen mit Emergenzmenge T prognostiziert, dass das Muster zum Zeitpunkt t+T wieder zu beobachten sein wird, dann kann man zum Zeitpunkt t+T überprüfen, ob diese Prognose richtig war.

Dies haben wir für sehr viele Datensätze und Prognoseprobleme getan und die Anzahl von Gesetzen mit den Eigenschaften (DiV,T) und die Anzahl richtiger Prognosen gezählt.

Den Anteil bestätigter Prognosen an den gesamten Prognose nennen wir Rel oder Reliability. Man kann nun feststellen, dass es für Prognosen mit Gesetzen aus einer (DiV,T)-Klasse emergente Gesetze über die Mindestreliability nach einer bestimmten Anzahl von Prognosen gibt. Wir nennen diese Gesetze Meta-Gesetze.

Mit Hilfe dieser Meta-Gesetze können wir die Anforderungen an die Anzahl von notwendigen Bestätigungen einer T-Klasse von Gesetzen empirisch festlegen, wenn wir eine bestimmte Mindestreliability verlangen:

In [16]:
set_global_rel(0.8,plot_rel=True)
Global RelLevel 0.8
Global MinObs 16

Die erzeugte Grafik zeigt, wie häufig ein Muster - in Abhängigkeit von der Emergenzmenge T - aufgetreten sein muss, um in eine Kategorie zu fallen, die bisher immer eine bestimmte Mindestprognosegüte hatte (hier Reliability von 0.8 --> mindestens 80% richtige Vorhersagen nach einer bestimmten Anzahl von Prognosen mit Gesetzen dieser Art).

Ein Muster, dass (wie im obigen Beispiel) sich in Sequenzen der Länge T=32 immer finden ließ, muss also mindestens 9 mal aufgetreten (oder 8 mal bestätigt worden) sein, um zu den Gesetzen mit einer Reliability von 0.8 zu gehören. Wenn ein Muster nach 265 Beobachtungen emergiert so genügen bereits 4 Bestätigungen.

Bei unseren weiteren Berechnungen steuern die Meta-Gesetze im Hintergrund alle Berechnungen. Auf diese Art werden die Mindestanforderungen an die Anzahl von Bestätigungen von verwendeten Gesetzen festgelegt werden.

Eine genauere Erklärung und Beispiele von Meta-Gesetzen lassen sich auf unserer Internetseite finden.

Wir wollen an dieser Stelle noch einmal festhalten, dass

dieser Ansatz auf einem rein empirischen Fundament basiert:

Die Aussage, dass die durchschnittliche monatliche Wachstumsrate der Geldmenge M2 nach jeder Sequenz von $T=32$ Monaten größer ist als Null, ist eine rein empirische Aussage.

Weiterhin wissen wir aus unseren Metaanalysen, dass die Prognosen, dass ein Muster der Größe $T=32$ das $DiV=12,56$ mal bestätigt wurde, auch beim nächsten Mal wieder auftritt, (nach Sequenzen von mindestens 16384 Prognosen) bisher immer zumindest zu 80% richtig waren. Auch dies ist ein empirisches Faktum.

Wenn wir also die Reliability auf 80% setzen so stellen wir sicher, dass wir nur Gesetze finden, für die die Prognose, dass das Muster auch beim nächsten Mal zu beobachten sein wird, bisher immer in mindestens 80% der Fälle richtig war.

Schritt 2: Generierung von endogenen Variablen und Features

Aus den oben bereits dargestellten Größen erzeugen wir eine Reihe von Prognosezielen (endogene Variablen) und potentiell erklärenden Variablen oder Features.

Eine endogene Variable, also eine Variable, die man vorhersagen möchte, ist z.B. die Veränderung der M1-Geldmenge in Deutschland im nächsten Monat, oder aber die Wachstumsrate des DAX in den nächsten 2 Monaten usw.

Ein Beispiel für ein Feature ist die durchschnittliche Veränderung der M3-Geldmenge in den USA in den letzten 3 Monaten oder die durchschnittliche Wachstumsrate in den letzten 12 Monaten etc.
Die dahinterliegende Vermutung ist, dass evtl. in Abhängigkeit dieser Größe emergente Gesetze für endogene Variablen gefunden werden können.

In [2]:
IndexList=['C_SU','C_DJ','Case_home','Case_10','C_DAX','C_KDAX','C_REX','C_FT','C_NI'] #Liste der verwendeten Indizes
#GeldList=[['M1_US','M2_US'],['M1_US','M2_US'],['M1_US','M2_US'],['M1_US','M2_US'],['M1_DE','M2_DE','M3_DE'],['M1_DE','M2_DE','M3_DE'],['M1_DE','M2_DE','M3_DE'],['M1_GB','M2_GB','M3_GB'],['M0_JP']]
GeldL=[['M1_US','M2_US'],['M1_DE','M2_DE','M3_DE'],['M1_GB','M2_GB','M3_GB'],['M0_JP']] #Liste der Geldmengen
endo=[] #Initialisierung der Liste mit Größen, die prognostiziert werden sollen
exo=[]  #Initialisierung der Liste mit exogenen Variablen
for aktindex in IndexList:
    endo+=['df.'+aktindex+'.pct_change().shift(-1)'] #Ein-Monats-Rendite
    endo+=['df.'+aktindex+'.pct_change(2).shift(-2)'] #Zwei-Monats-Rendite
    endo+=['df.'+aktindex+'.pct_change(3).shift(-3)'] #Drei-Monats-rendite
    
    for lag in [1,2,3,4,5,6,8,12,16,24,36]:
        exo+=['df.'+aktindex+'.pct_change().rolling(window='+str(lag)+').mean()'] #Rollierende Mittelwerte
        if lag>2:
            exo+=['df.'+aktindex+'.pct_change().rolling(window='+str(lag)+').std()']
            exo+=['df.'+aktindex+'.pct_change().rolling(window='+str(lag)+').std()']#Rollierende Standardabweichungen 
        
for geld in GeldL:
    for aktgeld in geld:
        endo+=['df.'+aktgeld+'.pct_change().shift(-1)'] #Ein-Monatsveränderungsrate der Geldmente
        endo+=['df.'+aktgeld+'.pct_change(2).shift(-2)'] #Zwei-Monatsveränderungsrate der Geldmente
        endo+=['df.'+aktgeld+'.pct_change(3).shift(-3)']  #Drei-Monatsveränderungsrate der Geldmente

        for lag in [1,2,3,4,5,6,8,12,16,24,36]:
            exo+=['df.'+aktgeld+'.pct_change().rolling(window='+str(lag)+').mean()']
            if lag>2:
                exo+=['df.'+aktgeld+'.pct_change().rolling(window='+str(lag)+').std()']
                
    
exo=DataFrame(exo,columns=['Genstring'])
data.index=np.arange(len(data))
data['C']=True
data['null']=False

Die Daten werden in eine Stichprobe, die zur Suche nach Emergenten Gesetzen verwendet wird (within-sample Beobachtungen) und eine Stichprobe (out-of-sample Beobachtungen/Evaluierungsdaten), die für die Überprüfung der Gesetze verwendet wird, aufgeteilt.

Die Evaluierungsstichprobe umfassen die letzten 5 Jahre (2011 bis 2016) der Beobachtungen in der Datenbank. So können die gefundenen emergenten Gesetze anhand von bisher "ungesehenen Daten" überprüft werden und ein tatsächliches Anwendungsszenario simuliert werden.

In [5]:
BisT=len(data)-60 #Aufteilung: 5 Jahre (60 Monate) zur Evaluierung / Rest der Beobachtungen zur Schätzung 

# Größe, gesamte Anzahl Beobachtungen in Schätzstichprobe,Anzahl in Evaluierungsstichprobe, Gesamt
for feld in data.columns: 
    print(feld,data.iloc[:BisT][feld].count(),data.iloc[BisT:][feld].count(),data[feld].count())
DATE 627 60 687
C_SU 627 60 687
Case_home 435 60 495
Case_10 291 60 351
C_DJ 627 60 687
M1_US 627 60 687
M2_US 627 60 687
C_DAX 618 60 678
C_KDAX 280 60 340
C_REX 237 60 297
M1_DE 375 60 435
M2_DE 375 60 435
M3_DE 375 60 435
C_FT 327 60 387
M1_GB 294 60 354
M2_GB 290 60 350
M3_GB 290 60 350
C_NI 327 60 387
M0_JP 495 60 555
C 627 60 687
null 627 60 687

Schritt 3: Erstellung eines KnowledgeNets

Im nächsten Schritt wird auf Basis der Daten ein sog. KnowledgeNet berechnet.

Die verwendeten Ziele (endogene Variablen) für das KnowledgeNet sind in diesem Fall die zukünftigen prozentualen Veränderungen im nächsten Monat, in 2 Monaten und in 3 Monaten der oben bereits beschriebenen Größen.

df.C_SU.pct_change().shift(-1): Prozentuale Veränderung des S&P500 im nächsten Monat
df.C_SU.pct_change(2).shift(-2): Prozentuale Veränderung des S&P500 über die nächsten 2 Monate
df.C_SU.pct_change(3).shift(-3): Prozentuale Veränderung des S&P500 über die nächsten 3 Monate

  • KnowledgeNets sind Mengen von Objekten, die bisher bezüglich eines oder mehrerer Ziele in Peergroups immer verschiedene Mittelwerte aufwiesen.
  • Objekte sind Regeln zur Auswahl von Zeitpunkten - in diesem Beispiel werden einzelne Monate in den Daten ausgewählt.

Beispiel für ein solches Objekt ist in diesem Fall die Auswahl der Zeitpunkte anhand einer Regel wie dieser:
Man betrachtet nur die Monate, in denen die Veränderung der M1-Geldmenge in den USA im Schnitt im letzten Jahr im 80%-100% Quantil (expandierend berechnet) war, d.h. in den höchsten 20% der Veränderungsraten.

categorize(df.M1_US.pct_change().rolling(window=12).mean(),5)==5

Das expandierende Quantil wird mithilfe der categorize-Funktion berechnet. Im Netz werden noch deutliche komplizierte Objektregeln erzeugt.

  • Die Objektregeln werden während des Lernprozesses von unserem KnowledgeNet-Algorithmus durch kreative Suche erstellt.
  • In der Anwendung sind sie eine Menge von "interessanten", zumindest bezüglich einer Zielvariablen immer von anderen unterscheidbaren Objekten.
  • Sie haben sich als solides Fundament für Modellbildung und die Ableitung von Handlungsstrategien erwiesen. (Sie erfüllen so die Funktion der unsupervised learning layer in deep-neural-nets.)
  • Sie werden als fundamentale Regeln mit einer Reihe potentiell interessierender Eigenschaften im KnowledgeWarehouse abgespeichert.
  • Natives Multiziel-Lernen in KnowledgeNets ist möglich, d.h. es können ohne Probleme beliebig viele Ziele berücksichtigt werden:
    In diesem Beispiel werden eine Vielzahl von unterschiedlichen Zielen bearbeitet.

Eine etwas detailliertere Erklärung von KnowledgeNets findet man ebenfalls auf unserer Internetseite.

In [5]:
knet=Knowledge_Net(data.iloc[:BisT],endo,exo,file_name="makro_test",limitdepth=5,law_OR=True,eval_data=data)
In [ ]:
knet.create_unique_features()
Creation of Unique Features:
df.C_SU.pct_change().rolling(window=1).mean(): cardinal var without parameters
 categorization [1, 2, 3, 4, 5] 5
...
df.Case_home.pct_change().rolling(window=16).mean(): cardinal var without parameters
 categorization [1, 2, 3, 4, 5] 5
...
df.M0_JP.pct_change().rolling(window=36).std(): cardinal var without parameters
 categorization [1, 2, 3, 4, 5] 5

All Features 8820

Features 4638 Unique Feature No. 8820 (categorize(df.M0_JP.pct_change().rolling(window=3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
All Features: 8820 Unique Features: 4638

Am Anfang der Zellenausgabe erscheinen Meldungen zur Erstellung von exogenen Variablen (Features). Dabei wird jede Größe in die bereits angesprochenen expandierenden Quantile unterteilt, die als Ausgangsobjekte im Netz verwendet werden.

In [7]:
knet.create_net()
feature 4638 of 4638 (categorize(df.M0_JP.pct_change().rolling(window=36).std(),5)==3.0) feat-list 87                                                                                                                                                                                                                                                     
Evaluation Object No. 87

KnowledgeNet for the prediction goal(s)

Die grafische Übersicht am Ende der Ausgabe zeigt die gefundenen Objekte für alle im Netz verwendeten Ziele.

Jede einzelne Grafik zeigt Punkte, die Eigenschaften von Objekten graphisch darstellen: Den Durchschnittwert einer einzelnen endogenen Variablen für dieses Objekt und seine Größe.

In der oberen linken Grafik zeigen die Punkte z.B. die prozentuale Veränderung des S&P500 im nächsten Monat auf der Ordinate. (df.C_SU.pct_change().shift(-1)). An der Abszisse der Grafik ist jeweils die Größe des Objekts, d.h. die Anzahl Beobachtungen, die mit dieser Objektregel ausgewählt werden, abzulesen. Ein Wert von 125 ist so zu interpretieren, dass 125 Monate im Schätzsample durch die Regel ausgewählt wurden.

Es sei noch einmal erwähnt, dass diese Objekte sich dadurch auszeichnen, dass sie in Bezug auf den Rollierenden T-Mittelwert einer der endogenen Variablen gegenüber allen ungefähr "gleichgroßen" Objekten immer unterschieden haben.

Ein einfaches Beispiel eines Objekts oder einer Auswahlregel ist das Folgende:

'~((categorize(df.C_KDAX.pct_change().rolling(window=1).mean(),3)==1.0))'

Mit dieser Regel werden Monate ausgewählt, bei denen die prozentuale Veränderung des Kurs-DAX im letzten Monat nicht (~ Negation) im untersten Drittel (==1.0) der Beobachtungen lag (mit expandierenden Quantilen berechnet).


Man kann nun sehr leicht überprüfen, wie gut sich der Mittelwert der gefundenen Objekte für die einzelnen Ziele out-of-sample "übertragt", d.h. ob der Mittelwert mit den neuen/ungesehen Daten ähnlich hoch ist.

Dabei ist aber zu bedenken, dass Gesetze nur in Bezug auf die Rangordnung der Mittelwerte mindestens eines Ziels gefunden wurden. Es kann also gar nicht erwartet werden, dass sich die Größe der Mittelwerte 1:1 in die Zukunft überträgt.

Empirisch wissen wir nur, dass die Gesetze über die Ordnungsbeziehung der Mittelwerte zu einer Klasse von Gesetzen gehören, die sich (salopp formuliert) in mindestens 80% der Fälle wiederholt.

Wir suchen diese Objekte aber auch gar nicht mit dem Ziel, dass wir aus den Ergebnissen deduktiv etwas über zukünftige Werte der Ziele ableiten wollen. Sie sind nur in dem Sinne "interessant", dass wir so eine Menge von bisher immer unterschiedlicher Situationen charakterisieren können.

Trotzdem wollen wir an dieser Stelle eine Grafik erzeugen, die den Mittelwerten des jeweiligen Objekts in der Schätzstichprobe den Mittelwert in der Evaluierungsstichprobe gegenüberstellt.

Wir werden sehen, dass die Objekte Information über die relative und absolute Höhe der Mittelwerte der endogen Variablen in der Evaluierungsstichprobe enthalten. (Wir verfügen auch über Algorithmen, mit denen man Objekte aus KnowledgeNets direkt für die Entscheidungsfindung verwenden kann. Diese werden aber in diesem Notebook nicht vorgestellt.)

In [45]:
# Ausgabe der Scatterplotts zwischen Mittelwert eines Objekts in der 
# Schätzstichprobe und in der Evaluierungsstichprobe für alle Ziele
df=data
zeile=1
spalte=1
pl=0
plt.figure(figsize=(20, 45))
plt.subplots_adjust(hspace=0.4)
for goal in endo:
    zeilen=(len(endo)//3)+1
    spalten=3
    a=copy.deepcopy(knet.ResultsList[0]).sort_values(['objective','mean'],ascending=False)
    a=a.loc[(a.objective==goal)
    plt.subplot(zeilen,spalten,pl+1)
    plt.plot(a['mean'],a['EvalMean'],'.',label='Observed')
    plt.plot(a['mean'],a['mean'],'-',label='Bisector')
    text=str(a['mean'].cov(a['EvalMean'])/a['mean'].var())
    plt.title(goal+' b='+text)
    plt.ylabel('Evaluation')
    #plt.xlabel('Estimation')
    #plt.plot(df.loc[~df[asset].isnull()]['Date'],logrend(df[asset].loc[~df[asset].isnull()]).expanding().sum(),label=asset)
    pl=pl+1
    plt.legend()
plt.xlabel('Estimation')
plt.show()

In obiger Übersichtsgrafik, wird die Güte der Übertragung der Mittelwerte der Objekte für die einzelnen Ziele dargestellt.

Auf der Abszisse ist die Höhe des in-sample Mittelwerts des Objekts, auf der Ordinate die Höhe des out-of-sample Mittelwerts des Objekts dargestellt. Bei perfekter Übertragung liegt der Punkt auf der grünen Winkelhalbierenden, da in diesem Fall in-sample und out-of-sample Mittelwert identisch wäre.

Wie man anhand der einzelnen Grafiken sehen kann, variiert die Güte der Übertragbarkeit für das jeweilige Ziel bzw. für die einzelne Prognosedauer (jeweils 1 Monat/2 Monate/3 Monate in die Zukunft).

Auch wenn die Übertragung (wie auch nicht anders zu erwarten) nicht perfekt ist, zeigt die Übersichtsgrafik doch, dass sich die Mittelwerte der gefundenen Objekte für die vielen unterschiedlichen Ziele gut übertragen und es möglich ist Zusammenhänge für die Veränderung von Aktienindizes, Rentenindizes, Häuserpreisen und Geldmengen zu finden.

Bei einigen der untersuchten Aktienindizes ist es sogar möglich Objektregeln zu finden, die Monate auswählen mit einer im Schnitt negativen Rendite.

Vielleicht sei an dieser Stelle noch kurz erwähnt, warum gerade Multiziel-Oder-Netze ein so informationshaltiges Konstrukt sind. Es hat sich empirisch gezeigt, dass Objekte, die für ein bestimmtes Ziel immer anders sind als alle anderen, oft auch hilfreich bei der Suche nach Objekten für andere Ziele sind. In diesem Sinne leistet ein Multizielnetz dass, was die "unsupervised Layers" in "deep neural nets" leisten: Sie geben eine Zusammenfassung der in den Daten zu findenden Strukturen.

Schritt 4: Erstellung von Emergenten Modellen

Im nächsten Schritt werden auf Basis der gefundenen Objekte im Knowledge-Net Emergenzbasierte Modelle für die einzelnen endogenen Variablen erstellt.

  • Emergenzbasierte Modelle sind Sequenzen von Prognoseregeln, die bezüglich einer Bewertungsmetrik bisher immer zu einer Prognoseverbesserung geführt haben.
  • Jede einzelne Prognoseregel setzt sich aus einem Objekt (wählt den Anwendungsbereich der Regel, d.h. für welche Monate prognostiziert wird) und einer Prognose-Heuristik zusammen.

Ein Beispiel einer Prognoseheuristik ist z.B. die Schätzung mit dem Mittelwert, linearen kleinste-Quadrate Regression etc (alles expandierend berechnet).

  • Durch die Beschränkung der Suche auf Objekte aus KnowledgeNets wird die Modellbildung erst operabel.
  • Auf einem Netz können Modelle für viele interessierende Größen aufsetzen.
  • Da Modelle selbst wieder Sequenzen von emergenten Gesetzen sind, können sie ebenfalls im KnowledgeWarehouse abgelegt werden.

Eine etwas genauere Erklärung des Ablaufs und der Vorgehensweise können Sie in folgendem Notebook finden.

In der folgenden Zelle wird für das erste Ziel (prozentuale Veränderung des S&P500 im nächsten Monat) ein Emergenzbasiertes Modell mithilfe des hinterlegten KnowledgeNets makro_test_0 erstellt.

In der Ausgabe werden zunächst die Modellergebnisse mit in-sample Daten und anschließend die Ergebnisse mit out-of-sample Daten gezeigt.

In [4]:
#Erstellung eines Modells für die prozentuale Veränderung des S&P500 im nächsten Monat
aktvar="df.C_SU.pct_change().shift(-1)"
modellist_1=[]
print()
print(aktvar)
print()
aktmodel=Model(['makro_test_0'],"makro_test_0",aktvar,QAb,New_Y=False,Only_mean=False,load_directory="./")
aktmodel.addmodel(['makro_test_0'],'('+aktvar+')',addtype=2,GlobalRel=0.75,MaxIter=1,AddEst=True)
aktmodel.evalmodel(data)
modellist_1+=[aktmodel]
df.C_SU.pct_change().shift(-1)

0.0810997612486 -0.0318579190254
No 0-model found - estimated Benchmark yd=0



actual RelLevel =  0.75

 searched in: 87 of: 87 found: 4
 searched in: 4 no: 4 found: 1 obs: 221

actual RelLevel =  0.725

 searched in: 87 of: 87 found: 51
 searched in: 51 no: 51 found: 1 obs: 560
obj Rel heuristic T Div min max mean Krit AnzIterModel
0 ~((((categorize(df.Case_home.pct_change().roll... 0.750 estkq_eval((y-yd).loc[obj],df.C_KDAX.pct_chang... 44 5.0 0.000033 0.002330 0.000882 0.194984 1.0
1 ~(((~(((~((categorize(df.Case_home.pct_change(... 0.725 estkq_eval((y-yd).loc[obj],df.C_SU.pct_change(... 186 3.0 0.000020 0.000143 0.000076 0.042368 1.0
In sample results:
mean absolute prediction error:  0.028975303315531043
mean squared prediction error :  0.001510170184198542
root of mean squared prediction error :  0.038860908175164174
Correlation :  0.435296776785
Coefficient of determination :  0.189483283879
mean for yd>0:  0.013926756505256453 mean for yd<0 -0.01681083871697961
mean absolute percentage error 1.40368525477538

Quantiles, Estimate-min, Estimate-max, Actual-mean

< 0.1 63 -0.114204475725 -0.00724506318853 -0.03322429369269691
0.1  -  0.2 62 -0.00713905278312 -0.000506183321433 -0.004907805057147527
0.2  -  0.3 63 -0.000483089674556 0.000297186768394 0.0004448734851063545
0.3  -  0.4 62 0.000311989474656 0.00211104256645 0.004805555688945485
0.4  -  0.5 63 0.00213641473385 0.00332340650492 0.002210626003115094
0.5  -  0.6 62 0.00333448665848 0.00533991360845 0.004500071127566962
0.6  -  0.7 63 0.00534545606738 0.00695710454597 0.009822358485020223
0.7  -  0.8 62 0.0069891435363 0.0124472509797 0.019134586921813922
0.8  -  0.9 63 0.0126979602647 0.0208302638276 0.023301333588047014
>= 0.9 63 0.0208346764742 0.0909801518663 0.03389618960913428
Length of within-sample period: 627 Length of out-of-sample period: 60

Model no. : 1

 combined: 2 of: 2 verified: True
Out of sample results:

mean absolute prediction error:  0.026847348192550823
mean squared prediction error :  0.001236154673035024
root of mean squared prediction error :  0.035158991354062245
Correlation :  0.50583969055
Coefficient of determination :  0.255873792535
mean for yd>0:  0.02171763557283458 mean for yd<0 -0.011597131727433194
mean absolute percentage error 3.2064742742833925

Quantiles, Estimate-min, Estimate-max, Actual-mean

< 0.1 6 -0.0890694727079 -0.0308327768794 -0.02555635090444815
0.1  -  0.2 6 -0.0265813998714 -0.0185546692577 0.0036680188915373204
0.2  -  0.3 6 -0.0179109109791 -0.0117999249623 -0.039532240725773306
0.3  -  0.4 6 -0.0108121868808 -0.00734063616335 0.015032045828951365
0.4  -  0.5 6 0.00180822538001 0.00669504773849 0.008185739942021023
0.5  -  0.6 6 0.00905181129437 0.0142041984266 0.01804365899326993
0.6  -  0.7 6 0.0147084887388 0.0210041525088 0.01451802597062174
0.7  -  0.8 6 0.0231574543852 0.0268611938977 0.035325306998288473
0.8  -  0.9 6 0.0274432247974 0.0359952864694 0.01112428606052431
>= 0.9 6 0.0364393148228 0.0644022058774 0.043108795472282004

Die Interpretation der Ergebnisse soll anhand des ersten Modells für die prozentuale Veränderung des S&P500 im nächsten Monat (df.C_SU.pct_change().shift(-1)) verdeutlicht werden.

Die erste Grafik in der Ausgabe geben die vom Algorithmus endogen bestimmten Grenzen der prozentualen Veränderung des S&P500 an.

Anschließend werden die gefundenen Objekte aus dem Netz dahingehend untersucht, ob Prognoseregeln für die einzelnen Objekte gefunden werden können, die gesetzmäßig eine bestimmte Fehlermetrik immer verbessern (hier QAb: rollierender mittlerer quadratischer Prognosefehler).

Dies erfolgt iterativ für unterschiedliche Reliabilities (0.75 und 0.725).

Die Beschreibung des resultierenden Modells ist in der folgenden Zelle dargestellt:

In [49]:
# Beschreibung des Modells für das erste Ziel df.C_SU.pct_change().shift(-1):
modellist_1[0].LawList[0]
Out[49]:
AnzIterModel Div Krit Rel T heuristic max mean min obj EvalObs EvalKrit Verified EvalMin EvalMax StillTrue AbsAb_S QAb_S RootQAb_S R_S R2_S DDir_S Gini_S AUC_S AbsAb_E QAb_E RootQAb_E R_E R2_E DDir_E Gini_E AUC_E
0 1.0 5.0 0.194984 0.750 44 estkq_eval((y-yd).loc[obj],df.C_KDAX.pct_chang... 0.002330 0.000882 0.000033 ~((((categorize(df.Case_home.pct_change().roll... 60.0 0.000340 True -0.000125 0.002843 False 0.029640 0.001562 0.039527 0.421994 0.178079 0.012192 NaN NaN 0.028579 0.001275 0.035709 0.514983 0.265207 0.017758 NaN NaN
1 1.0 3.0 0.042368 0.725 186 estkq_eval((y-yd).loc[obj],df.C_SU.pct_change(... 0.000143 0.000076 0.000020 ~(((~(((~((categorize(df.Case_home.pct_change(... 44.0 0.000053 True 0.000036 0.000062 True 0.028934 0.001513 0.038891 0.432429 0.186995 0.013520 NaN NaN 0.026847 0.001236 0.035159 0.505840 0.255874 0.017669 NaN NaN

Jede Zeile in der Tabelle zeigt eine Objekt-Prognoseheuristik Kombination (obj: Objekt bzw. heuristic: Prognoseheuristik) und einige Charakteristika der gefundenen Ergebnisse.

Diese Objekt-Prognoseheuristik Kombinationen hatten immer in Fenstern der Länge T=44 (bzw. T=186) die Eigenschaft, dass die Fehlermetrik (hier QAb; Quadratischer Fehler) immer niedriger war als bei Prognosen mit dem bis dahin verwendeten Modell. Jede Zeile zeigt also eine Heuristik, die relativ zu vorherigen Verfahren immer zu einer Verbesserung der Schätzung (in Bezug auf die Zielmetrik) geführt hat.

Das erste Gesetz hat z.B. relativ zur universellen ersten Benchmark yd=0 in jeder Sequenz der Länge T=44 zu einer Verbesserung des mittleren quadrierten Prognosefehlers geführt. Dabei lag die Verbesserung in jeder Sequenz zwischen min=0.000033 und max=0.002330. Dieses emergente Gesetz über die Prognoseverbesserung mit dieser Heuristik ist DiV=5 mal bestätigt. Damit gehört die Prognose, dass bei Verwendung dieser Heuristik zur Schätzung im nächsten Fenster von T=44 Beobachtungen wieder eine durchschnittliche Verbesserung erreicht wird zu einer Klasse von Prognosen, von denen wir wissen das bisher mindestens 80% richtig waren.


Eine genauere Erklärung der gefundenen Objekte und Prognoseheuristiken wird weiter unten gegeben.


Anschließend werden in der Ausgabe einige within-sample Statistiken gezeigt:

mean absolute prediction error:  0.028975303315531043
mean squared prediction error :  0.001510170184198542
root of mean squared prediction error :  0.038860908175164174
Correlation :  0.435296776785
mean for yd>0:  0.013926756505256453 mean for yd<0 -0.01681083871697961

Quantiles, Estimate-min, Estimate-max, Actual-mean

< 0.1 63 -0.114204475725 -0.00724506318853 -0.03322429369269691
0.1  -  0.2 62 -0.00713905278312 -0.000506183321433 -0.004907805057147527
0.2  -  0.3 63 -0.000483089674556 0.000297186768394 0.0004448734851063545
0.3  -  0.4 62 0.000311989474656 0.00211104256645 0.004805555688945485
0.4  -  0.5 63 0.00213641473385 0.00332340650492 0.002210626003115094
0.5  -  0.6 62 0.00333448665848 0.00533991360845 0.004500071127566962
0.6  -  0.7 63 0.00534545606738 0.00695710454597 0.009822358485020223
0.7  -  0.8 62 0.0069891435363 0.0124472509797 0.019134586921813922
0.8  -  0.9 63 0.0126979602647 0.0208302638276 0.023301333588047014
>= 0.9 63 0.0208346764742 0.0909801518663 0.03389618960913428

Wir hoffen, dass diese Statistiken mehr oder weniger selbsterklärend sind.

Die darauf folgende Grafik zeigt den Zusammenhang zwischen Schätzung, tatsächlicher Größe und Zahl der Beobachtungen.

Da man in diesem Beispiel eine Schätzung yd>0 (yd<0) als long-(short-)Signal für den Kauf z.B. eines Futures auf den S&P500 interpretieren kann, sei noch kurz die die folgende Ergebniszeile etwas näher erläutert:

mean for yd>0:  0.013926756505256453 mean for yd<0 -0.01681083871697961

Hier wird der tatsächlich Mittelwert der prozentualen Veränderung für Schätzungen größer als 0 (yd>0) sowie der tatsächliche Mittelwert für Schätzungen kleiner als 0 (yd<0) angegeben.

War die Schätzung in der Schätzstichprobe größer als 0, so ist der S&P500 tatsächlich im Schnitt um 1.39% an im nächsten Monat gestiegen. War die Schätzung kleiner als 0 ist er im Schnitt um 1.68% gefallen.

Mit der Evaluierungsstichprobe wird dann das so entstandene Modell auf seine Güte hin überprüft und die Ergebnisse in derselben Form ausgegeben.

Nehmen wir wieder nur die oben erläuterte Zeile:

mean for yd>0:  0.02171763557283458 mean for yd<0 -0.011597131727433194

So erkennt man, dass sich dieses potentiell entscheidungsrelevante Muster in der Evaluierungsstichprobe wiederholt hat.

Es war also tatsächlich möglich, Monate zu identifizieren, in denen der S&P500 im Schnitt um 2.17% steigt bzw. um -1.16% fällt.

Auf Basis des Multiziel-KnowledgeNets lassen sich auch für die anderen Ziele einzelne Modelle berechnen.
Für diese Ziele wird auf eine ausführliche Ausgabe verzichtet und nur eine Auswahl von in-sample und out-of-sample Ergebnissen der Modelle ausgegeben.

Auch für die anderen untersuchten Größen (Aktienindizes, Häuserpreisindizes und Geldmengen) zeigen die Modellergebnisse eine gute Prognosequalität. Bei anderen Aktienindizes ist es ebenfalls möglich Monate zu identifizieren mit im Schnitt negativer Rendite.
Besonders gut lassen sich die prozentualen Veränderungen des Case-Shiller Häuser Preis Index vorhersagen. Hier sind Korrelationen zwischen Schätzung und tatsächlicher Veränderung von über 0.9 möglich.

In [5]:
#Erstellung von Modellen für alle restlichen Ziele auf Basis des Multi-Ziel-Netzes
for aktvar in endo[1:]:
    print()
    print(aktvar)
    aktmodel=Model(['makro_test_0'],"makro_test_0",aktvar,QAb,New_Y=False,Only_mean=False,load_directory="./",compact_output=True)
    aktmodel.addmodel(['makro_test_0'],'('+aktvar+')',addtype=2,GlobalRel=0.75,MaxIter=1,AddEst=True)
    aktmodel.evalmodel(data)
    modellist_1+=[aktmodel]
df.C_SU.pct_change(2).shift(-2)
 actual RelLevel = 0.725  searched in: 59 no: 59 found: 1 obs: 532
In sample results:
Correlation :  0.284009190936
mean for yd>0:  0.023220975519458696 mean for yd<0 0.002591949856512954
Out of sample results
Correlation :  0.288802183772

df.C_SU.pct_change(3).shift(-3)
 actual RelLevel = 0.725  searched in: 66 no: 66 found: 1 obs: 582
In sample results:
Correlation :  0.207479682972
mean for yd>0:  0.02397008915536388 mean for yd<0 -0.008311770655616033
Out of sample results
Correlation :  -0.270930864817
mean for yd>0:  0.022482232410723342 mean for yd<0 0.039029149861650236

df.C_DJ.pct_change().shift(-1)
 actual RelLevel = 0.725  searched in: 38 no: 38 found: 1 obs: 418
In sample results:
Correlation :  0.450861652297
mean for yd>0:  0.021958001448405963 mean for yd<0 -0.02521738309178001
Out of sample results
Correlation :  0.665217970951
mean for yd>0:  0.022770625121344295 mean for yd<0 -0.020067699295420575

df.C_DJ.pct_change(2).shift(-2)
 actual RelLevel = 0.725  searched in: 42 no: 42 found: 1 obs: 532
In sample results:
Correlation :  0.370327395698
mean for yd>0:  0.025546986059277414 mean for yd<0 -0.010070918409359919
Out of sample results
Correlation :  0.506737587278
mean for yd>0:  0.026315228577236324 mean for yd<0 -0.00917537080410862

df.C_DJ.pct_change(3).shift(-3)
 actual RelLevel = 0.725  searched in: 49 no: 49 found: 2 obs: 550
In sample results:
Correlation :  0.344375964893
mean for yd>0:  0.03259216805593677 mean for yd<0 -0.012444097664256578
Out of sample results
Correlation :  0.3549798485
mean for yd>0:  0.029110958017542165 mean for yd<0 -0.0038890829089749317

df.Case_home.pct_change().shift(-1)
 actual RelLevel = 0.725  searched in: 11 no: 11 found: 2 obs: 417
In sample results:
Correlation :  0.927645023034
mean for yd>0:  0.005986669305409608 mean for yd<0 -0.004686507957924391
Out of sample results
Correlation :  0.846066407763
mean for yd>0:  0.005811398493604894 mean for yd<0 -0.008006953923364686

df.Case_home.pct_change(2).shift(-2)
 actual RelLevel = 0.725  searched in: 16 no: 16 found: 3 obs: 433
In sample results:
Correlation :  0.892730761285
mean for yd>0:  0.011998166607171012 mean for yd<0 -0.007695011626208598
Out of sample results
Correlation :  0.765654913535
mean for yd>0:  0.01337525587993371 mean for yd<0 -0.004364434176593601

df.Case_home.pct_change(3).shift(-3)
 actual RelLevel = 0.725  searched in: 9 no: 9 found: 2 obs: 4322
In sample results:
Correlation :  0.85722512501
mean for yd>0:  0.0170500950782247 mean for yd<0 -0.013470974403426917
Out of sample results
Correlation :  0.399449594066
mean for yd>0:  0.014233991508994492 mean for yd<0 0.004897297301718497

df.Case_10.pct_change().shift(-1)
 actual RelLevel = 0.725  searched in: 8 no: 8 found: 2 obs: 2530
In sample results:
Correlation :  0.94897045326
mean for yd>0:  0.00812460121300889 mean for yd<0 -0.006261339204194479
Out of sample results
Correlation :  0.905696479815
mean for yd>0:  0.0069678033521856616 mean for yd<0 -0.006990480939448396

df.Case_10.pct_change(2).shift(-2)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0 obs: 289
In sample results:
Correlation :  0.922965894818
mean for yd>0:  0.016577612054714592 mean for yd<0 -0.011328178171728494
Out of sample results
Correlation :  0.865132861797
mean for yd>0:  0.0188062514218792 mean for yd<0 -0.002849105086865759

df.Case_10.pct_change(3).shift(-3)
 actual RelLevel = 0.725  searched in: 1 no: 1 found: 1 obs: 1688
In sample results:
Correlation :  0.863453550825
mean for yd>0:  0.022952790031159416 mean for yd<0 -0.01863071787334931
Out of sample results
Correlation :  0.666006086989
mean for yd>0:  0.01897212750570427 mean for yd<0 -0.0188399984062459

df.C_DAX.pct_change().shift(-1)
 actual RelLevel = 0.725  searched in: 5 no: 5 found: 1 obs: 5249
In sample results:
Correlation :  0.664290234861
mean for yd>0:  0.022708734424783772 mean for yd<0 -0.016626605176129745
Out of sample results
Correlation :  0.629672749697
mean for yd>0:  0.028056558773030697 mean for yd<0 -0.019019567111351072

df.C_DAX.pct_change(2).shift(-2)
 actual RelLevel = 0.725  searched in: 41 no: 41 found: 1 obs: 417
In sample results:
Correlation :  0.508458797388
mean for yd>0:  0.04000570199509255 mean for yd<0 -0.055635025035000944
Out of sample results
Correlation :  0.415400759123
mean for yd>0:  0.030403492152156878 mean for yd<0 -0.013485322392707711

df.C_DAX.pct_change(3).shift(-3)
 actual RelLevel = 0.725  searched in: 41 no: 41 found: 1 obs: 416
In sample results:
Correlation :  0.419576580099
mean for yd>0:  0.055910750545181735 mean for yd<0 -0.05188721931508223
Out of sample results
Correlation :  0.267242328121
mean for yd>0:  0.029059928750585516 mean for yd<0 -0.0062164636224702795

df.C_KDAX.pct_change().shift(-1)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0
df.C_KDAX.pct_change(2).shift(-2)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0
df.C_KDAX.pct_change(3).shift(-3)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0
df.C_REX.pct_change().shift(-1)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0bs: 186
In sample results:
Correlation :  0.245065138572
mean for yd>0:  0.0038950831577352304 mean for yd<0 -0.0012686615823459852
Out of sample results
Correlation :  0.30699198387
mean for yd>0:  0.0061805144214309654 mean for yd<0 0.0005651691310982199

df.C_REX.pct_change(2).shift(-2)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0bs: 218
In sample results:
Correlation :  0.351567519087
mean for yd>0:  0.007978247019605632 mean for yd<0 -0.0035342521588948425
Out of sample results
Correlation :  0.377567225124
mean for yd>0:  0.007337600362229027 mean for yd<0 0.002924235819156465

df.C_REX.pct_change(3).shift(-3)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0bs: 161
In sample results:
Correlation :  0.351942360985
mean for yd>0:  0.010364415755643024 mean for yd<0 -0.002392071492694515
Out of sample results
Correlation :  0.413817418317
mean for yd>0:  0.01310582016362453 mean for yd<0 0.0069533118618046695

df.C_FT.pct_change().shift(-1)
In sample results:
Correlation :  0.415869543696
mean for yd>0:  0.02042007431621818 mean for yd<0 -0.011117510537722959
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0 obs: 305
In sample results:
Correlation :  0.563099405496
mean for yd>0:  0.02825249589310754 mean for yd<0 -0.02045936547242
Out of sample results
Correlation :  0.385322771046
mean for yd>0:  0.012071600492509502 mean for yd<0 -0.008364114733070641

df.C_FT.pct_change(2).shift(-2)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0 obs: 232
In sample results:
Correlation :  0.408932582347
mean for yd>0:  0.036948643968852425 mean for yd<0 -0.015491835968381917
Out of sample results
Correlation :  0.422781552973
mean for yd>0:  0.021328933086984615 mean for yd<0 -0.008996116132454072

df.C_FT.pct_change(3).shift(-3)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0bs: 267
In sample results:
Correlation :  0.283148268095
mean for yd>0:  0.035781051032584214 mean for yd<0 -0.0060146951574543694
Out of sample results
Correlation :  0.287353356153
mean for yd>0:  0.014949817848936295 mean for yd<0 -0.011713466797051545

df.C_NI.pct_change().shift(-1)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0
df.C_NI.pct_change(2).shift(-2)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0
df.C_NI.pct_change(3).shift(-3)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0
df.M1_US.pct_change().shift(-1)
 actual RelLevel = 0.725  searched in: 7 no: 7 found: 6 obs: 6266
In sample results:
Correlation :  0.651041889915
mean for yd>0:  0.010032186892539652 mean for yd<0 -0.009171803993285422
Out of sample results
Correlation :  0.248872070083
mean for yd>0:  0.011876982381441229 mean for yd<0 0.002230829837969672

df.M1_US.pct_change(2).shift(-2)
 actual RelLevel = 0.725  searched in: 5 no: 5 found: 2 obs: 5145
In sample results:
Correlation :  0.673276113699
mean for yd>0:  0.013789276135229043 mean for yd<0 -0.011458505518869715
Out of sample results
Correlation :  0.363669005836
mean for yd>0:  0.022987603846730847 mean for yd<0 0.010916789509283134

df.M1_US.pct_change(3).shift(-3)
 actual RelLevel = 0.725  searched in: 60 no: 60 found: 7 obs: 624
In sample results:
Correlation :  0.593239766705
mean for yd>0:  0.01591191132267303 mean for yd<0 -0.013157112037311219
Out of sample results
Correlation :  0.431634546186
mean for yd>0:  0.0365048662246551 mean for yd<0 0.020504677714597328

df.M2_US.pct_change().shift(-1)
In sample results:
Correlation :  0.364391147562
mean for yd>0:  0.0055441949479914975 mean for yd<0 0.005404877810719633
 actual RelLevel = 0.725  searched in: 43 no: 43 found: 6 obs: 626
In sample results:
Correlation :  0.541329572008
mean for yd>0:  0.005987328971549684 mean for yd<0 -0.002149581258967369
Out of sample results
Correlation :  0.441293535709
mean for yd>0:  0.007034282807424954 mean for yd<0 -0.0004706297474739718

df.M2_US.pct_change(2).shift(-2)
 actual RelLevel = 0.725  searched in: 47 no: 47 found: 4 obs: 625
In sample results:
Correlation :  0.500662174926
mean for yd>0:  0.011242091625764318 mean for yd<0 -0.0013931713208426646
Out of sample results
Correlation :  0.431673627595
mean for yd>0:  0.011961710415752263 mean for yd<0 0.0008367503789621922

df.M2_US.pct_change(3).shift(-3)
 actual RelLevel = 0.725  searched in: 20 no: 20 found: 4 obs: 624
In sample results:
Correlation :  0.505380225823
Out of sample results
Correlation :  0.0805783915675

df.M1_DE.pct_change().shift(-1)
In sample results:
Correlation :  0.420184275769
mean for yd>0:  0.014181856027735683 mean for yd<0 -0.01103599540174784
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0
In sample results:
Correlation :  0.420184275769
mean for yd>0:  0.014181856027735683 mean for yd<0 -0.01103599540174784
Out of sample results
Correlation :  0.0555157310731
mean for yd>0:  0.007169350535976259 mean for yd<0 0.010648342985608438

df.M1_DE.pct_change(2).shift(-2)
In sample results:
Correlation :  0.42048092245
mean for yd>0:  0.0228879014186564 mean for yd<0 -0.01733471346171765
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0
In sample results:
Correlation :  0.42048092245
mean for yd>0:  0.0228879014186564 mean for yd<0 -0.01733471346171765
Out of sample results
Correlation :  0.0472527559542
mean for yd>0:  0.01555387178180825 mean for yd<0 0.002886223508442698

df.M1_DE.pct_change(3).shift(-3)
In sample results:
Correlation :  0.46202629441
mean for yd>0:  0.02659473812128119 mean for yd<0 -0.021108763167196218
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0
In sample results:
Correlation :  0.46202629441
mean for yd>0:  0.02659473812128119 mean for yd<0 -0.021108763167196218
Out of sample results
Correlation :  -0.0801872507305

df.M2_DE.pct_change().shift(-1)
In sample results:
Correlation :  0.216925650208
mean for yd>0:  0.005107383171972264 mean for yd<0 0.002933281762413502
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0bs: 91
In sample results:
Correlation :  0.413020949618
mean for yd>0:  0.006783161720549973 mean for yd<0 -0.003432506187540908
Out of sample results
Correlation :  0.210213562665
mean for yd>0:  0.005214348461004764 mean for yd<0 0.002165912107108

df.M2_DE.pct_change(2).shift(-2)
In sample results:
Correlation :  0.301983805581
mean for yd>0:  0.010447478576142484 mean for yd<0 0.002848029536011323
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0bs: 46
In sample results:
Correlation :  0.395500649893
mean for yd>0:  0.012254015344726983 mean for yd<0 -0.00327205463504916
Out of sample results
Correlation :  0.0703643016447
mean for yd>0:  0.009546347198978056 mean for yd<0 0.014077175352078619

df.M2_DE.pct_change(3).shift(-3)
In sample results:
Correlation :  0.226498043147
mean for yd>0:  0.015044537152708636 mean for yd<0 0.011964903220780278
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0 obs: 316
In sample results:
Correlation :  0.465123959672
mean for yd>0:  0.0175978849680008 mean for yd<0 -0.010397800946446597
Out of sample results
Correlation :  0.12906900297
mean for yd>0:  0.01473513143541088 mean for yd<0 0.015405903899468665

df.M3_DE.pct_change().shift(-1)
In sample results:
Correlation :  0.205104952528
mean for yd>0:  0.00512183311568934 mean for yd<0 0.0024834918116224012
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0bs: 164
In sample results:
Correlation :  0.284319721654
mean for yd>0:  0.00539299734378561 mean for yd<0 -0.0001925424119617558
Out of sample results
Correlation :  -0.0243174487313

df.M3_DE.pct_change(2).shift(-2)
In sample results:
Correlation :  0.295004206396
mean for yd>0:  0.010438020576863636 mean for yd<0 0.003919118822333037
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0
In sample results:
Correlation :  0.295004206396
mean for yd>0:  0.010438020576863636 mean for yd<0 0.003919118822333037
Out of sample results
Correlation :  0.31496858285

df.M3_DE.pct_change(3).shift(-3)
In sample results:
Correlation :  0.226140965702
mean for yd>0:  0.015129236460773783 mean for yd<0 0.007718387724320486
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0 obs: 176
In sample results:
Correlation :  0.397233865852
mean for yd>0:  0.016308750685991916 mean for yd<0 -0.008676186143374745
Out of sample results
Correlation :  0.413717737919
mean for yd>0:  0.014138056546624787 mean for yd<0 -0.0033506526479427424

df.M1_GB.pct_change().shift(-1)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0 obs: 284
In sample results:
Correlation :  0.286847004753
mean for yd>0:  0.009890787881499394 mean for yd<0 -0.004161721075299068
Out of sample results
Correlation :  0.138599837834
mean for yd>0:  0.006438920707666364 mean for yd<0 0.00668436715519638

df.M1_GB.pct_change(2).shift(-2)
In sample results:
Correlation :  0.0929617517093
mean for yd>0:  0.01650604185105462 mean for yd<0 0.023374408391549546
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0bs: 220
In sample results:
Correlation :  0.282755953834
mean for yd>0:  0.017090779755387482 mean for yd<0 0.03337624230818098
Out of sample results
Correlation :  0.128716260857
mean for yd>0:  0.011351837137876753 mean for yd<0 0.002790766141975265

df.M1_GB.pct_change(3).shift(-3)
In sample results:
Correlation :  0.177238613451
mean for yd>0:  0.02541967719384041 mean for yd<0 0.014642637117219295
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0bs: 184
In sample results:
Correlation :  0.226081395439
mean for yd>0:  0.026377879619258585 mean for yd<0 0.02858643632112367
Out of sample results
Correlation :  0.0286404935614

df.M2_GB.pct_change().shift(-1)
 actual RelLevel = 0.725  searched in: 4 no: 4 found: 1 obs: 2168
In sample results:
Correlation :  0.263677119965
mean for yd>0:  0.007754866107663669 mean for yd<0 -0.012507944387927739
Out of sample results
Correlation :  0.146525861051
mean for yd>0:  0.00116189772439768 mean for yd<0 0.00249705532802591

df.M2_GB.pct_change(2).shift(-2)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0 obs: 267
In sample results:
Correlation :  0.178796594762
Out of sample results
Correlation :  -0.0955033042862

df.M2_GB.pct_change(3).shift(-3)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0 obs: 266
In sample results:
Correlation :  0.221424921393
Out of sample results
Correlation :  -0.19549888305

df.M3_GB.pct_change().shift(-1)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0 obs: 268
In sample results:
Correlation :  0.107087883211
Out of sample results
Correlation :  0.00608405439174

df.M3_GB.pct_change(2).shift(-2)
 actual RelLevel = 0.725 searched in: 87 of: 87 found: 0 obs: 267
In sample results:
Correlation :  0.221540328357
Out of sample results
Correlation :  0.00612842967246

df.M3_GB.pct_change(3).shift(-3)
 actual RelLevel = 0.725  searched in: 7 no: 7 found: 2 obs: 2565
In sample results:
Correlation :  0.466626496645
mean for yd>0:  0.02325336464967643 mean for yd<0 0.011404996094009134
Out of sample results
Correlation :  -0.0889478577474
mean for yd>0:  0.0015870430658221546 mean for yd<0 0.024844246301237938

df.M0_JP.pct_change().shift(-1)
 actual RelLevel = 0.725  searched in: 44 no: 44 found: 1 obs: 416
In sample results:
Correlation :  0.587118761299
mean for yd>0:  0.021341802350733914 mean for yd<0 -0.01817542803946709
Out of sample results
Correlation :  -0.179604184934
mean for yd>0:  0.01562518756454104 mean for yd<0 0.025577566347914978

df.M0_JP.pct_change(2).shift(-2)
 actual RelLevel = 0.725  searched in: 44 no: 44 found: 3 obs: 493
In sample results:
Correlation :  0.673346708246
mean for yd>0:  0.033186555097688836 mean for yd<0 -0.026478653360432904
Out of sample results
Correlation :  0.100679934872
mean for yd>0:  0.03638671612212155 mean for yd<0 0.046424818639350336

df.M0_JP.pct_change(3).shift(-3)
 actual RelLevel = 0.725  searched in: 21 no: 21 found: 4 obs: 492
In sample results:
Correlation :  0.528565071373
mean for yd>0:  0.035203529911677335 mean for yd<0 -0.02139525321502854
Out of sample results
Correlation :  -0.235024254845
mean for yd>0:  0.045403644383646066 mean for yd<0 0.08165926503357777

In der nun folgenden Zelle werden die Einträge im Modell (Objekte und Prognoseheuristiken) für die prozentuale Veränderung des S&P500 sowie des Case-Shiller Index (der 10 größten Städte in den USA) vollständig ausgegeben.

Zusätzlich dazu werden die Ergebnisse der Anwendung dieser Prognoseregeln in Form der Korrelation zwischen Schätzung der zukünftigen monatlichen Veränderung und der tatsächlich eingetretenen Veränderung (in-sample sowie out-of-sample) dargestellt.

In [44]:
# Ausgabe einer Ergebnisszusammenfassung für df.C_SU.pct_change().shift(-1) und df.Case_10.pct_change().shift(-1)
for j in [0,9]:
    a=modellist_1[j]
    print("#################################")
    print(endo[j])
    print("#################################")
    for i in np.arange(len(a.LawList[0].obj)): 
        # Index, In-sample Korrelation, Out-of-sample Korrelation nach Anwendung der Prognosregel, Emergentes Gesetz gilt weiter
        print(i+1,a.LawList[0].R_S[i],a.LawList[0].R_E[i],a.LawList[0].Verified[i])
        display(a.LawList[0].obj[i])
        display(a.LawList[0].heuristic[i])
    print()
#################################
df.C_SU.pct_change().shift(-1)
#################################
1 0.42199383427 0.514982776096 True
'~((((categorize(df.Case_home.pct_change().rolling(window=16).mean(),3)==1.0)&(categorize(df.Case_home.pct_change().rolling(window=16).std(),3)==2.0))|(categorize(df.Case_10.pct_change().rolling(window=36).mean(),1)==0.0)))'
'estkq_eval((y-yd).loc[obj],df.C_KDAX.pct_change().rolling(window=1).mean().loc[obj],44,False,0.00636628374218,0.0,0.493132859707,Series(0,index=y.loc[obj].index,dtype=np.float64),Series(0,index=y.loc[obj].index,dtype=np.float64),eval_string)'
2 0.432429136357 0.50583969055 True
'~(((~(((~((categorize(df.Case_home.pct_change().rolling(window=16).mean(),3)==1.0)&(categorize(df.Case_home.pct_change().rolling(window=16).std(),3)==2.0)))&(categorize(df.Case_home.pct_change().rolling(window=24).mean(),4)==1.0))&(categorize(df.Case_home.pct_change().rolling(window=36).std(),3)==3.0)))&(categorize(df.C_KDAX.pct_change().rolling(window=1).mean(),3)==1.0)))'
'estkq_eval((y-yd).loc[obj],df.C_SU.pct_change().rolling(window=24).std().loc[obj],178,False,0.0401013683947,0.00761636603915,0.249157346608,None,None,eval_string)'
#################################
df.Case_10.pct_change().shift(-1)
#################################
1 0.5984454065 0.631383732093 True
'((categorize(df.Case_home.pct_change().rolling(window=16).mean(),3)==1.0)|(categorize(df.Case_home.pct_change().rolling(window=16).mean(),5)==2.0))'
'estkq_eval((y-yd).loc[obj],df.Case_home.pct_change().rolling(window=1).mean().loc[obj],17,False,-0.000871713355024,0.0,1.28679356599,Series(0,index=y.loc[obj].index,dtype=np.float64),Series(0,index=y.loc[obj].index,dtype=np.float64),eval_string)'
2 0.930541876603 0.91585583441 True
'~(((categorize(df.Case_home.pct_change().rolling(window=16).mean(),3)==1.0)|(categorize(df.Case_home.pct_change().rolling(window=16).mean(),5)==2.0)))'
'estkq_eval((y-yd).loc[obj],df.Case_10.pct_change().rolling(window=1).mean().loc[obj],14,False,0.00965859164067,0.00957444813941,0.892909940327,None,None,eval_string)'
3 0.936638435949 0.903402621196 False
'~(((((categorize(df.Case_home.pct_change().rolling(window=16).mean(),3)==1.0)&(~(categorize(df.Case_home.pct_change().rolling(window=16).std(),3)==2.0)))&(~(categorize(df.Case_home.pct_change().rolling(window=16).std(),5)==4.0)))&(categorize(df.Case_10.pct_change().rolling(window=3).std(),3)==3.0)))'
'estkq_eval((y-yd).loc[obj],df.M0_JP.pct_change().rolling(window=6).mean().loc[obj],49,False,0.00560838860939,0.0,0.0939543030066,Series(0,index=y.loc[obj].index,dtype=np.float64),Series(0,index=y.loc[obj].index,dtype=np.float64),eval_string)'
4 0.937057683368 0.905696479815 True
'~(((categorize(df.Case_home.pct_change().rolling(window=16).mean(),3)==1.0)&(~(categorize(df.Case_home.pct_change().rolling(window=16).std(),3)==2.0))))'
'estkq_eval((y-yd).loc[obj],df.C_DJ.pct_change().rolling(window=4).mean().loc[obj],35,False,0.00721255927999,0.0,0.0411660765222,Series(0,index=y.loc[obj].index,dtype=np.float64),Series(0,index=y.loc[obj].index,dtype=np.float64),eval_string)'

Anhand des ersten Eintrags in der Ausgabe soll die Bedeutung etwas genauer erklärt werden:

df.C_SU.pct_change().shift(-1)
1 0.42199383427 0.514982776096 True

'~((((categorize(df.Case_home.pct_change().rolling(window=16).mean(),3)==1.0)&(categorize(df.Case_home.pct_change().rolling(window=16).std(),3)==2.0))|(categorize(df.Case_10.pct_change().rolling(window=36).mean(),1)==0.0)))'

'estkq_eval((y-yd).loc[obj],df.C_KDAX.pct_change().rolling(window=1).mean().loc[obj],44,False,0.00636628374218,0.0,0.493132859707,Series(0,index=y.loc[obj].index,dtype=np.float64),Series(0,index=y.loc[obj].index,dtype=np.float64),eval_string)'

Zunächst wird das Ziel ausgegeben (df.C_SU.pct_change().shift(-1)) - hier die prozentuale Veränderung des S&P500 im nächsten Monat.

Anschließend wird die Indexnummer des Gesetzes (1), die in-sample Korrelation (0.4219) und die out-of-sample Korrelation (0.5149) gezeigt, die bei Anwendung der ersten Prognoseregel entsteht.

In den nachfolgenden beiden Zeilen werden das Objekt und die Prognoseheuristik ausgegeben, die zur Prognose verwendet werden.

Das Objekt wählt den Anwendungsbereich (also die Monate) aus, bei denen dann mithilfe der angegeben Prognoseheuristik eine Schätzung getroffen wird.

In diesem Fall wählt das Objekt Monate, anhand des Case-Shiller Home Prize Index aus.
Konkret werden Beobachtungen ausgewählt, bei denen der rollierende 16-Monats Mittelwert der prozentualen Veränderung des Case-Shiller Home Price Index nicht im expandierenden 0%-33% der Quantile der 16-Monats-Mittelwerte lag. Außerdem lag auch die rollierende 16-Monats-Standardabweichung nicht im expandierenden 33%-66% Quantil der Standardabweichungen.

Die Prognoseheuristik ist eine expandierende kleinste-Quadrate lineare Regression mit der prozentualen Veränderung des KDAX (Kurs-DAX) des vorigen Monats als Regressor.
In diesem Fall beträgt der Steigungskoeffizient der Regression 0.493132859707, d.h. für jedes zusätzliche Prozent der Veränderung des KDAX, steigt die Prognose für die prozentuale Veränderung des S&P500 um 0.49%.

Wird diese Prognoseheuristik für die ausgewählten Monate angewendet, ergibt sich eine in-sample Korrelation von 0.4219 der Schätzung mit der tatsächlichen prozentualen Veränderung des S&P500. Out-of-sample beträgt die Korrelation sogar 0.5149.

Die nachfolgende Ausgabe zeigt die Ergebnisse für die restlichen Ziele, beschränkt sich aber auf die in-sample bzw. out-of-sample Korrelation nach Anwendung der jeweiligen Prognoseregeln im Modell.

In [42]:
# Ausgabe einer zusammengefassten Ergebnisszusammenfassung für die restlichen Ziele
for j in [j for j in np.arange(len(endo)) if j not in [0,9]]:
    a=modellist_1[j]
    if len(a.LawList[0])>0:
        print("#################################")
        print(endo[j])
        print("#################################")
        for i in np.arange(len(a.LawList[0].obj)): 
            # Index, In-sample Korrelation, Out-of-sample Korrelation nach Anwendung der Prognosregel, Emergentes Gesetz gilt weiter
            print(i+1,a.LawList[0].R_S[i],a.LawList[0].R_E[i],a.LawList[0].Verified[i])
        print()
#################################
df.C_SU.pct_change(2).shift(-2)
#################################
1 0.300195072878 0.288802183772 True

#################################
df.C_SU.pct_change(3).shift(-3)
#################################
1 0.210630102786 -0.270930864817 False

#################################
df.C_DJ.pct_change().shift(-1)
#################################
1 0.402523297825 0.658582717476 True
2 0.448709347666 0.665217970951 True

#################################
df.C_DJ.pct_change(2).shift(-2)
#################################
1 0.313917469875 0.513414909446 True
2 0.369427684244 0.506737587278 True

#################################
df.C_DJ.pct_change(3).shift(-3)
#################################
1 0.207095801117 0.360750835808 True
2 0.229489533793 0.382098661089 False
3 0.317919965504 0.373038939314 True
4 0.337317797734 0.3549798485 False

#################################
df.Case_home.pct_change().shift(-1)
#################################
1 0.45221158326 0.490400059373 True
2 0.903864880497 0.871132858113 True
3 0.908972289477 0.855772651651 False
4 0.912729310149 0.845319886532 False
5 0.913288515595 0.846066407763 True

#################################
df.Case_home.pct_change(2).shift(-2)
#################################
1 0.477562108499 nan False
2 0.862928265761 0.689390947249 True
3 0.85905023974 0.740521888813 True
4 0.873529609902 0.763278751925 True
5 0.883076881543 0.769731837647 True
6 0.889443233901 0.75915787996 False
7 0.891881332691 0.765654913535 True

#################################
df.Case_home.pct_change(3).shift(-3)
#################################
1 0.825946379086 0.427032518743 True
2 0.846469618251 0.401249435661 False
3 0.859926469321 0.401428972851 False
4 0.862035972559 0.399449594066 False

#################################
df.Case_10.pct_change(2).shift(-2)
#################################
1 0.868404040696 0.890204853667 True
2 0.906556819897 0.890204853667 False
3 0.901216537095 0.889847594588 True
4 0.901116128743 0.868495632073 True
5 0.903934081038 0.865132861797 False

#################################
df.Case_10.pct_change(3).shift(-3)
#################################
1 0.764577626923 0.682091525473 True
2 0.793196237462 0.611239031874 False
3 0.808582318718 0.63768685763 True
4 0.860077156914 0.666006086989 False

#################################
df.C_DAX.pct_change().shift(-1)
#################################
1 0.62061721564 0.64716323872 True
2 0.659501326929 0.646757292185 True
3 0.666931383563 0.629672749697 False

#################################
df.C_DAX.pct_change(2).shift(-2)
#################################
1 0.470829576948 0.402414388075 True
2 0.50500232692 0.41310629945 False
3 0.513968654125 0.415400759123 True

#################################
df.C_DAX.pct_change(3).shift(-3)
#################################
1 0.383975899362 0.278330925092 False
2 0.421874809949 0.267242328121 True

#################################
df.C_REX.pct_change().shift(-1)
#################################
1 0.254140837501 0.30699198387 False

#################################
df.C_REX.pct_change(2).shift(-2)
#################################
1 0.352733915993 0.377567225124 False

#################################
df.C_REX.pct_change(3).shift(-3)
#################################
1 0.356989648652 0.413817418317 False

#################################
df.C_FT.pct_change().shift(-1)
#################################
1 0.411683919468 0.263215532719 False
2 0.562015550872 0.385322771046 True

#################################
df.C_FT.pct_change(2).shift(-2)
#################################
1 0.40566754889 0.422781552973 True

#################################
df.C_FT.pct_change(3).shift(-3)
#################################
1 0.27199003315 0.287353356153 True

#################################
df.M1_US.pct_change().shift(-1)
#################################
1 0.413316162663 0.3336883859 True
2 0.443672436069 0.340283150766 False
3 0.467162297645 0.378310944469 True
4 0.50404108585 0.378310944469 False
5 0.515999446224 0.370352795462 False
6 0.552477098139 0.28241588246 True
7 0.563168289096 0.273804978494 False
8 0.577238708553 0.273804978494 False
9 0.594084636512 0.258901287711 True
10 0.614434531772 0.231106340692 True
11 0.623697771835 0.248872070083 False

#################################
df.M1_US.pct_change(2).shift(-2)
#################################
1 0.391712519684 0.354816828611 True
2 0.429050790474 0.41170045146 False
3 0.472345983325 0.438620733113 False
4 0.550226009723 0.442121332374 False
5 0.57830023648 0.442121332374 False
6 0.61458156058 0.442121332374 False
7 0.649069452105 0.399654333604 True
8 0.666114194045 0.363669005836 True

#################################
df.M1_US.pct_change(3).shift(-3)
#################################
1 0.241376206798 nan False
2 0.30391660526 0.245584587427 False
3 0.433530329491 0.133143295586 False
4 0.468607948386 0.172256464769 True
5 0.474029229839 0.165910226607 True
6 0.504204280718 0.253489127965 True
7 0.517977692654 0.241568253675 False
8 0.595437308995 0.422328359267 False
9 0.609180875309 0.431634546186 False

#################################
df.M2_US.pct_change().shift(-1)
#################################
1 0.36097449547 0.311468877017 True
2 0.387914330219 0.344569296173 True
3 0.446788263981 0.248795014738 False
4 0.457968977297 0.354220087557 True
5 0.479049393373 0.419012576784 False
6 0.507354921479 0.446089512963 True
7 0.520002348632 0.452522445155 True
8 0.532882311475 0.441293535709 False

#################################
df.M2_US.pct_change(2).shift(-2)
#################################
1 -0.201373655232 3.52135635106e-17 True
2 0.339190176591 3.52135635106e-17 False
3 0.371037171882 0.335658686691 True
4 0.445962382816 0.223776776646 True
5 0.48832466006 0.306818226446 True
6 0.497897107578 0.365118039023 True
7 0.504146261975 0.431673627595 True

#################################
df.M2_US.pct_change(3).shift(-3)
#################################
1 0.256806044006 nan False
2 0.256806044006 -1.01100135095e-16 True
3 0.342384243459 0.16750502754 True
4 0.428555688114 -0.133462493845 True
5 0.44399649132 -0.141121977768 False
6 0.464350463343 0.0520257815181 True
7 0.497647922427 0.0805783915675 False

#################################
df.M1_DE.pct_change().shift(-1)
#################################
1 0.408533021736 0.0555157310731 True

#################################
df.M1_DE.pct_change(2).shift(-2)
#################################
1 0.42220791707 0.0472527559542 True

#################################
df.M1_DE.pct_change(3).shift(-3)
#################################
1 0.42577454162 -0.0801872507305 True

#################################
df.M2_DE.pct_change().shift(-1)
#################################
1 0.225086782446 0.00131207594246 True
2 0.414941422993 0.210213562665 True

#################################
df.M2_DE.pct_change(2).shift(-2)
#################################
1 0.31268920151 0.386707978994 True
2 0.411815707022 0.0703643016447 False

#################################
df.M2_DE.pct_change(3).shift(-3)
#################################
1 0.250960254527 0.50825788879 True
2 0.4107162229 0.285962129424 False
3 0.446788985912 0.131669222367 False
4 0.465257357175 0.12906900297 False

#################################
df.M3_DE.pct_change().shift(-1)
#################################
1 0.214249201981 -0.077215368221 True
2 0.300570042817 -0.0243174487313 True

#################################
df.M3_DE.pct_change(2).shift(-2)
#################################
1 0.303438624916 0.31496858285 True

#################################
df.M3_DE.pct_change(3).shift(-3)
#################################
1 0.252065055387 0.220986886382 True
2 0.409857172164 0.413717737919 True

#################################
df.M1_GB.pct_change().shift(-1)
#################################
1 0.263913337106 0.0943788896781 True
2 0.290751886628 0.138599837834 True

#################################
df.M1_GB.pct_change(2).shift(-2)
#################################
1 0.0887259229342 -0.166368017968 True
2 0.300288612622 0.128716260857 True

#################################
df.M1_GB.pct_change(3).shift(-3)
#################################
1 0.150290926496 0.0200406834964 True
2 0.233863756017 0.0286404935614 True

#################################
df.M2_GB.pct_change().shift(-1)
#################################
1 0.1474126246 0.145135912992 False
2 0.264161221959 0.146525861051 True

#################################
df.M2_GB.pct_change(2).shift(-2)
#################################
1 0.142513519794 -0.0955033042862 False

#################################
df.M2_GB.pct_change(3).shift(-3)
#################################
1 0.183036444592 -0.19549888305 False

#################################
df.M3_GB.pct_change().shift(-1)
#################################
1 0.0863231306423 0.00608405439174 False

#################################
df.M3_GB.pct_change(2).shift(-2)
#################################
1 0.212110933365 0.00612842967246 False

#################################
df.M3_GB.pct_change(3).shift(-3)
#################################
1 0.177264904637 -0.212582971043 False
2 0.317705238824 -0.218388771214 True
3 0.416104309337 -0.212755541439 True
4 0.432397721556 -0.0889478577474 True

#################################
df.M0_JP.pct_change().shift(-1)
#################################
1 0.408901263901 -0.207849698049 True
2 0.535229061898 -0.261181595372 False
3 0.57607084292 -0.134838875491 False
4 0.589943277263 -0.179604184934 False

#################################
df.M0_JP.pct_change(2).shift(-2)
#################################
1 0.485193971053 0.231894970281 True
2 0.559482482311 0.16813883964 False
3 0.567398240322 0.187985182153 False
4 0.580050010718 0.180741290047 False
5 0.611368712635 0.193845776543 True
6 0.617101828377 0.142336745961 False
7 0.620740082717 0.100679934872 False

#################################
df.M0_JP.pct_change(3).shift(-3)
#################################
1 0.462257551501 nan False
2 0.487515894408 -0.36526012844 False
3 0.493622455449 -0.394671354218 False
4 0.522576103218 -0.216150601038 True
5 0.527372008465 -0.235024254845 False

Zusammenfassung

Wie können diese Ergebnisse verwendet werden?

Bereits diese kleine Auswahl von Indizes (Aktien und Häuserpreise) und unterschiedlichen Geldmengenaggregaten zeigt sehr interessante Ergebnisse.

Für die korrekte Interpretation ist sicherlich noch eine tiefere Erklärung der einzelnen Schritte und Ergebnisse notwendig. Unsere Erfahrungen in Lehrveranstaltungen zeigen aber, dass bereits nach kurzer Einübung der Begriffe und Anleitungen zur richtigen Interpretation der Ergebnisse, interessante und entscheidungsrelevante Ergebnisse abgeleitet werden können.

Wie gezeigt können die erstellten Modelle direkt zur Ableitung von Entscheidungsregeln verwendet werden. Auch eine Erweiterung auf Sektorprognosen z.B. für Ratingsysteme oder detailliertere Prognosen für Investitionsentscheidungen (bzw. Asset-Allocation) auf dem Aktienmarkt sind ohne weiteres möglich.

Bald werden wir überprüfen, ob weitere Größen (wie z.B. Zinssätze auf dem Kapitalmarkt, Arbeitslosenzahlen usw.) die Prognosequalität noch weiter verbessern und die möglichen Anwendungsgebiete erweitern.

Außerdem scheint es uns sehr hilfreich emergente Gesetze über Gesamtwirtschaftliche Zusammenhänge im Rahmen von Lehrveranstaltungen zur Darstellungen von empirischen Zusammenhängen zu verwenden.


Kontakt

Unter den angegebenen E-Mail Adressen können Sie bei Fragen oder Anmerkungen gerne mit uns Kontakt aufnehmen.