Statistische Software Seminar Warum wir falsch liegen und trotzdem weitermachen Aktuelle Themen in Banken und Versicherungen von Martin Dörr betreut durch Sebastian Kaiser 31. August 2010 Inhaltsverzeichnis 1 Einleitung 2 2 Vorstellen der Statistikwerkzeuge 2.1 PASW (SPSS) . . . . . . . . . . . 2.1.1 Die Geschichte . . . . . . 2.1.2 Die Struktur . . . . . . . . 2.1.3 Vor- und Nachteile . . . . 2.2 SAS . . . . . . . . . . . . . . . . 2.2.1 Die Geschichte . . . . . . 2.2.2 Die Struktur . . . . . . . . 2.2.3 Vor- und Nachteile . . . . 2.3 Matlab . . . . . . . . . . . . . . . 2.3.1 Die Geschichte . . . . . . 2.3.2 Die Struktur . . . . . . . . 2.3.3 Vor- und Nachteile . . . . 2.4 R . . . . . . . . . . . . . . . . . . 2.4.1 Die Geschichte . . . . . . 2.4.2 Die Struktur . . . . . . . . 2.4.3 Vor- und Nachteile . . . . 2.5 Excel . . . . . . . . . . . . . . . . 2.5.1 Die Geschichte . . . . . . 2.5.2 Die Struktur . . . . . . . . 2.5.3 Vor- und Nachteile . . . . 2.6 weitere Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 ausgewählte Funktionen für Ökonometrie 4 Leistungsoptimierung 4.1 R und Matlab . . . . . . . . . . . . . . . . 4.1.1 Geschwindigkeit des Codes messen 4.1.2 synonymer Code . . . . . . . . . . 4.1.3 effizienter Arbeitsspeichergebrauch 4.2 SAS . . . . . . . . . . . . . . . . . . . . . 4.3 Excel . . . . . . . . . . . . . . . . . . . . . 4.4 abschließende Anmerkung . . . . . . . . . 5 Zusammenfassung 3 3 3 3 4 5 5 6 9 10 10 10 11 12 12 13 15 17 17 17 17 19 21 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 24 24 25 27 30 34 37 38 1 Kapitel 1 Einleitung Computergestützte Verfahren sind in der heutigen Statistik nicht mehr wegzudenken. So ermöglichen sie erst das schnelle Berechnen aufwendiger und meistens nur über numerische Algorithmen zu lösende Formeln z.B. bei der Parameterschätzung in (generalisierten) linearen Modellen. Des weiteren können verallgemeinerte Algorithmen ohne größere Umstände wiederkehrende Aufgaben lösen, ohne dafür stets den Lösungsweg neu zu erarbeiten, was besonders im Bereich von Simulationen, Bayes-Inferenz und Graphikerzeugung eine deutliche Arbeitserleichterung bedeutet. Auch nicht zu vernachlässigen ist die bequeme und zuverlässige Speicherung, Verwaltung und Abfrage von riesigen Datenmengen, die heutige Datenspeicher mühelos stemmen können. In dieser Arbeit sollen die bedeutensten Statistikwerkzeuge vorgestellt werden, wie optimale Lösungwege aussehen und kurz eingeführt werden, welche Funktionen sie für finanzökonometrische Fragestellungen bereit halten. 2 Kapitel 2 Vorstellen der Statistikwerkzeuge 2.1 2.1.1 PASW (SPSS) Die Geschichte • Die Firma SPSS wurde 1968 an der amerikanischen Universität Stanford von Norman H. Nie, C. Hadlai (Tex) Hull und Dale Bent gegründet. • Die Statistik-Software SPSS wurde im Jahr der Firmengründung in ihrer ersten Version veröffentlicht. • Anfänglich wurde die Software für Lochkarten-Systeme und Großrechner konzipiert. 1983 kam dann die erste PC-Version auf dem Markt. • SPSS Inc. wurde 2009 von IBM übernommen. • Seit 2010 wird die Statistiksoftware SPSS Statistics unter dem Namen PASW (Predictive Analysis SoftWare) vermarktet. Der Name SPSS hat im Laufe der 40-jährigen Geschichte eine große Wandlung durchgemacht. Ursprünglich stand SPSS als Abkürzung für Statistical Package for the Social Sciences, später für Superior Performing Software System und Statistical Product and Service Solutions. Heutzutage gilt SPSS als ein Markenname. 2.1.2 Die Struktur Die Software PASW ist ein modular aufgebautes Programmpaket zur statistischen Analyse von Daten. Das Basismodul ermöglicht das grundlegende Datenmanagement und umfangreiche statistische und grafische Datenanalysen mit den gängigsten statistischen Verfahren. Diese grundlegende Plattform ist in vier Einheiten unterteilt: dem Dateneditor, dem Syntaxeditor, Scripteditor und einem Ausgabenavigator. Im Dateneditor werden die für die Auswertung zugrunde liegenden Daten ähnlich einer relationalen Datenbank-Tabelle verwaltet. Die Variablenansicht dient der Definition von Variablen und deren Eigenschaften; hier wird also die Struktur der Daten festgelegt. In dieser Ansicht lassen sich auch jederzeit die Eigenschaften der vorhandenen Variablen ablesen und ändern, z.B. Typ, Label, fehlende Werte und 3 Meßniveau. Die Datenansicht zeigt die eingegebenen Werte der definierten Variablen. Hier besteht die Möglichkeit, nach Werten zu suchen oder sie zu verändern. Müssen die Daten für bestimmte Analysen umstrukturiert werden, so bietet PASW dafür ein leicht zu bedienendes Werkzeug an. Das Ausführen von statistischen Analysen erfolgt über eine Befehlssyntax. Diese bietet wie richtige Programmiersprachen Konstrukte wie Schleifen und Abfragen, Variablen dienen hier jedoch nur zur flexiblen Ansteuerung von Funktionen, aber nicht der Speicherung und Weiterverarbeitung von Ergebnissen. Eingegeben und ausgeführt wird er im Syntaxeditor. Da sich die Analysen auch über die Menüstruktur und benutzerfreundlichen Eingabemasken (GUI) bewerkstelligen lassen, deren Umfang an Einstellungsmöglichkeiten für die jeweiligen Befehle hier meist beschränkt sind, besteht bei diesem Auswertungsweg die Möglichkeit, die hinter der GUI verborgenen Befehlssyntaxi in den Syntaxeditor übertragen zu lassen, wo dann die fehlenden Einstellungen hinzugefügt werden können. Für Automatisierungen von Abläufen gibt es einen Scripteditor, der Visual Basic for Applications verwendet. Die meisten mit einer Prozedur erstellten Ergebnisse werden im Ausgabenavigator (Viewer) dargestellt. Die Ergebnisse können dort nicht nur betrachtet, sondern auch bearbeitet, formatiert, in ihrer Reihenfolge umstrukturiert oder auch gelöscht werden. Er besteht aus dem Inhaltfenster, wo die eigentlichen Ergebnisse der Prozeduren ausgegeben werden, und dem Gliederungsfenster, was übersichtlich alle Objekte, die durch die Auswertung entstanden sind, auflistet. Die Inhalte von Dateneditor, Syntaxeditor und Ausgabenavigator werden in getrennten Dateien abgespeichert. Zu beachten ist, daß Ausgabenavigator-Dateien, die mit der Version 16 und kleiner erstellt wurden, mit den Versionen 17 und größer nicht mehr gelesen werden können. Für spezielle Anwendungen gibt es Zusatzmodule, die auf dem Basismodul aufsetzen. So hat sich AMOS als Erweiterung zur Durchführung von Strukturgleichungsmodellen etabliert, mit Forecasting lassen sich Zeitreihenanalysen durchführen, und als Schnittstelle zu anderer Software (R, Python) dient das Modul Statistics Developer. Eine Einführung in PASW bietet unter anderem das Buch von Nagel und Hatzinger [1]. 2.1.3 Vor- und Nachteile Im folgenden sollen die wesentlichen Gründe genannt werden, warum sich viele Anwender für PASW als ihr statistisches Werkzeug entschieden haben: + Es ist weltweit das am meisten verbreitete Statistikprogramm, es wird in vielen Wissenschaftszweigen verwendet, z.B. in der Soziologie, Psychologie, Biologie, Medizin und BWL/VWL. + Da PASW ein ausführbares Programm ist, stehen die vorhandenen Analysemethoden in schnellem Maschinencode. + PASW beinhaltet eine vollständige graphische Benutzeroberfläche (Graphical User Interface, kurz GUI). Der Anwender kann jede Funktion bequem per Menünavigation erreichen. Das Einstellen von Parametern und Einbinden von Daten ist intuitiv. 4 Abbildung 2.1: Sitzungsbeispiel von PASW + Ein eigener und sehr guter Dateneditor gehört zur Basisausstattung dazu. + Die Ausgabe von Graphiken und Analyseergebnissen ist ohne weitere Bearbeitung publikumsreif. + Von ausgeführten Analysen kann auf Wunsch die entsprechende Befehlssyntax automatisch erstellt werden. + Schnittstellen zu R und Python sind im Modul Statistics Developer enthalten. + Umständliche Programmierung mit der Befehlssyntax wird nun durch Visual Basic for Applications vereinfacht. Automatisierungen sind damit gut gestaltbar. + Ein umfassendes Hilfesystem gehört zur Grundausstattung dazu. Den Vorteilen stehen folgende Nachteile gegenüber: - Es ist ein kommerzielles Programm, für dessen Nutzung jährliche Lizenzgebühren anfallen. - Jüngere statistische Methoden sind im Allgemeinen nicht implementiert. - Es bietet deutlich weniger (exotische) statistische Verfahren an als andere Software. 2.2 2.2.1 SAS Die Geschichte Der Name SAS stand ursprünglich als Abkürzung für Statistical Analysis System, ein Auswertungsprogramm zur Analyse von Daten aus der landwirtschaftlichen Forschung, das Anfang der 1970er Jahre von Jim Goodnight, John Sall und weiteren 5 Forschern an der NC State University entwickelt wurde. Als die Nachfrage nach dem Programm wuchs, wurde das Unternehmen SAS Institute 1976 gegründet, um die Software zu entwickeln und zu vertreiben. Heute wird der Name SAS nicht mehr als Abkürzung verwendet, sondern als Markenname. 2.2.2 Die Struktur Zu den Kerntechnologien von SAS gehören die Skriptsprache SAS-Language (einschließlich der Statistikprozeduren und -funktionen), die SAS-eigene Datenbank (SAS-Datasets), das Enginekonzept für den Zugriff auf unterschiedlichste Datenformate, die Multi Vendor Architecture, also die betriebssystemunabhängige und übergreifende Architektur sowie verschiedene Middlewarekonzepte (SAS-IntegrationTechnologies). SAS ist heute sehr stark auf das Gewinnen von Informationen und Wissen aus Unternehmensdaten ausgerichtet, also auf Datenintegration, Business Intelligence und deren Anwendungen in unterschiedlichsten betriebswirtschaftlichen Bereichen. Daher wurde seit 2004 die SAS Intelligence Platform aufgebaut, die es ermöglicht, geschäftliche Daten unternehmensweit zu verarbeiten und zu verwalten. Den Kern bildet die SAS Open Metadata Architecture für die durchgängige und einheitliche Speicherung von Metadaten für verschiedenste Anwendungsbereiche. Darum gruppiert sich eine Vielzahl von Anwendungen für die Datenintegration und -auswertung für ganz unterschiedliche Benutzerrollen in den Unternehmen. Eine dritte anwendungsorientierte Schicht stellen die Lösungen für verschiedene betriebswirtschaftliche (zum Beispiel Marketing) oder branchenspezifische (zum Beispiel Entwicklung von Medikamenten) Fragestellungen dar. Diese bauen auf den Kerntechnologien und auf der Intelligence Platform auf. Die SAS-Sprache (SAS-Language) Der aktive technische Kern der SAS-Software war immer und ist auch heute noch ein Interpreter (Prozessor) für die Skriptsprache SAS-Language. Diese besteht aus einer Vielzahl von Anweisungen (Statements), die jeweils mit einem Semikolon abgeschlossen werden. SAS-Code ist eine Aneinanderreihung von Anweisungen, die nacheinander vom Interpreter ausgeführt werden. Hinter den Anweisungen verbergen sich vorgefertigte Funktionalitäten zum Teil sogar weitere Programmiersprachen aus ganz unterschiedlichen Bereichen (in den 80er-Jahren hieß so etwas 4GL). In einem sogenannten Prozedurschritt (PROC STEP) können vorgefertigte Prozeduren mit typischerweise wenigen Zeilen Programmcode aufgerufen werden, um deskriptive und schließende Statistiken zu berechnen, Berichte und Grafiken in unterschiedlichsten Formaten zu erstellten sowie Daten und Konfigurationen zu verwalten. Insgesamt sind es über 350 Prozeduren, die je nach Anwendung und Lizenzstruktur zu zirka 20 Produkten zusammengefasst sind. Folgende Bestandteile enthält die SAS-Language: • Der sogenannte Datenschritt (DATA STEP), der in einer sehr mächtigen, SAS-eigenen Datendefinitions- und -manipulationssprache geschrieben wird, die bereits vor SQL existierte und wesentlich mächtiger, zum Teil aber auch umständlicher als SQL ist. Die Syntax lehnt sich ein wenig an die Programmiersprache PL/I an. Im Gegensatz zu SQL kennt der DATA STEP iterative 6 und bedingte Anweisungen sowie Arrays und viele weitere Konstrukte, die es erlauben Daten jedweder Art zu lesen, zu verarbeiten und zu speichern. • Eine umfangreiche Makro-Sprache, die nach dem Textersetzungsprinzip funktioniert und mit der man sehr flexible, unter Umständen aber auch schwer wartbare Programme schreiben kann. • Ein SAS-eigenes SQL, das einige Erweiterungen, aber auch einige Kürzungen gegenüber ANSI-SQL besitzt. Es ermöglicht den Zugriff auf das SAS-eigene relationale Datenbanksystem (s.u.) sowie, über die Datenschnittstellen von SAS/ACCESS (s.u.), auf die Datenbanksysteme verschiedenster Hersteller und auf die Standardschnittstellen OLEDB und ODBC. • Der Pass-Through auf die SQL-Sprachen verschiedenster Datenbanksysteme wie Microsoft SQLServer, Oracle, DB2 und MySQL, wobei direkt der jeweilige SQL-Dialekt verwendet werden kann. • Eine Matrixsprache namens IML (Interactive Matrix Language). Für die Ausführung dieser Skriptsprache steht schon immer Betriebssystemübergreifend die SAS-Fensterumgebung (SAS Windowing Environment, früher SAS Display Manager) zur Verfügung. Sie dient dazu, Programme zu schreiben und auszuführen und Daten, Ergebnisse und Protokolle anzusehen. Zusätzlich kann SASCode im Enterprise Guide (s.u.) entwickelt und ausgeführt werden. In einem Anwendungsentwicklungsszenario (s.u.) wird SAS-Code auf dem Server ausgeführt und die Ergebnisse in Client-Anwendungen angezeigt. Die SAS-eigene Datenbank SAS enthält mit dem SAS-Data-Set ein einfaches und effizientes internes Datenbankkonzept, das ganz auf die Erfordernisse der Informationsgewinnung ausgerichtet ist. Im Gegensatz zu transaktionsorientierten Datenbanken ist der Data Set auf hohe Geschwindigkeiten beim Lesen und Schreiben großer Datenmengen optimiert. Transaktionen finden nicht auf Satz-, sondern auf Tabellenebene statt. Man kann mit dieser Datenbank zwar arbeiten wie mit einer gewöhnlichen Datenbank, also mit den Mitteln der oben beschriebenen Skriptsprache per SQL oder DATA-Schritt Tabellen anlegen, Sätze einfügen, ändern und löschen und es gibt auch Indizierung, referentielle Integrität und Audit Trails. Häufiger werden allerdings Tabellen während der Verarbeitung einfach komplett neu geschrieben, daher gibt es auch das Konzept der Historisierung von Tabellen (Generation Data Sets). Die Ausrichtung auf die Informationsgewinnung zeigt sich auch in dem sehr sparsamen Typenkonzept, es gibt eigentlich nur zwei Datentypen: Fließkommazahlen und Zeichenketten fester Länge. Tabellen werden zu Bibliotheken (Libraries) zusammengefasst. Je nach Betriebssystem kann eine Bibliothek physisch durch ein Verzeichnis in einem hierarchischen Filesystem (unter Unix und Windows) oder durch ein anderes physisches Speicherkonzept (unter klassischem zOS) repräsentiert werden. Bibliotheken werden durch logische Namen (sogenannte Librefs) referenziert. Für den optimierten Betrieb sehr großer Datenbanken auf Basis des SAS-eigenen Speicherkonzepts gibt es ein eigenes Serverprodukt namens Scalable Performance Data Server (SPDS). 7 Für die Speicherung von Datenwürfeln (Cubes) gibt es einen eigenen OLAPServer von SAS. Der Zugriff auf externe Daten Der lesende und schreibende Zugriff auf und die Integration von Daten aus ganz unterschiedlichen Datenbanksystemen und Dateiformaten ist bei der Informationsgewinnung essentiell. Für den Zugriff auf relationale Daten gibt es das Konzept der SAS-Engine, das den Zugriff auf SAS-Datasets, XML-Daten und alle unterstützten fremden Datenbanksysteme über die einheitliche Schnittstelle der Library Engines bietet. Das Programmpaket SAS/ACCESS ermöglicht den Zugriff auf alle wichtigen Datenbanksysteme (nicht nur Oracle, DB2, Microsoft SQL Server, MySQL), auf Datenbanken über ODBC und OLEDB sowie auf Files in den Desktop-Formaten (Microsoft Excel und Access, dBase, CSV etc.), soweit sich diese als strikt relationale Tabellen auffassen lassen. Einen Überblick gibt die Einstiegsseite zur Dokumentation von SAS/ACCESS. Auf fremde relationale Datenbanksysteme kann, wie bereits erwähnt, auch über Pass Through zugegriffen werden, wobei die SQL-Syntax des jeweiligen RDBMS verwendet wird. Der lesende und schreibende Zugriff auf nicht-relationale Daten in den unterschiedlichsten Formaten ist äußerst flexibel über Anweisungen im DATA-Schritt möglich. Betriebssysteme Bereits in den 80er-Jahren konnte man SAS-Programme auf dem PC entwickeln und mit geringen Änderungen, die in erster Linie den unterschiedlichen Filesystemen geschuldet waren, auf dem Großrechner einsetzen (und umgekehrt). Heute kann SAS auf verschiedenen Varianten der Betriebssysteme Windows, Unix und zOS betrieben werden. Betriebssystemübergreifendes Client-Server-Computing war ebenfalls bereits in den 80er-Jahren mit Hilfe von SAS/CONNECT verfügbar. Dabei dient eine SASInstallation als Client und eine andere als Server. Dies ist auch heute noch verfügbar, tritt jedoch in den Hintergrund, da Anwendungen auf Basis von Java, Microsoft Windows sowie Webanwendungen die Rolle der Clients übernommen haben. Anwendungsentwicklung Eine eigene Entwicklungsumgebung namens SAS/AF mit der Programmiersprache SCL (SAS Component Language, früher SAS Screen Control Language) dient der Anwendungsentwicklung auf Basis von objektorientierter Software. Eine Besonderheit ist die Möglichkeit, eigene portable und betriebssystemübergreifende Anwendungen zu schreiben. Dies hat jedoch durch die weitreichenden Möglichkeiten der Java- und .NET-Plattformen mittlerweile stark an Bedeutung verloren. Für die Entwicklung von Webanwendungen mit SAS gab es zunächst SAS/Intrnet, das auf der Webserver-Erweiterung CGI basiert. Auch diese Technologie, bei der HTML-Seiten mit Hilfe verschiedener Programmierschnittstellen insbesondere im 8 DATA-Schritt erzeugt werden, gilt heute als veraltet und wird abgelöst durch die folgenden Technologien. Heute dienen Java EE und Microsoft .NET als Integrations- und Anwendungsentwicklungsplattformen. Hierzu gibt es SAS Integration Technologies mit Clientund Server-seitigen Komponenten. Client-seitig stehen Klassenbibliotheken für das Integrated Object Model (IOM) in Java und .NET zur Verfügung, die den Zugriff auf die verschiedenen Funktionalitäten der SAS-Server erlauben. Für die Entwicklung von Java-basierten Desktop- und Web-Anwendungen steht mit Appdev Studio eine eigene, Eclipse-basierte Entwicklungsumgebung zur Verfügung. Server-seitig gibt es den Workspace Server für langdauernde Sitzungen (ein Serverprozess pro Clientprozess), den Stored Process Server für die sequentielle Abarbeitung von ClientAnfragen (feste Anzahl von Serverprozessen mit Lastverteilung) den OLAP-Server für die Speicherung von Cubes sowie den Metadatenserver für die Speicherung von technischen, fachlichen und anwenderbezogenen Metadaten. Ein wichtiger Teil von Integration Technologies ist die SAS Web Infrastructure Platform, die als Basis für die Web-Anwendungen der SAS Intelligence Platform (siehe unten) fungiert. Integration Technologies enthält weitere Services, unter anderem auch die Möglichkeit, BI Web Services zu entwickeln. Intelligence Plattform Die SAS-Intelligence-Platform (seit SAS Version 9) gibt Unternehmen die Möglichkeit, komplexe Informationsgewinnungsprozesse in heterogenen IT-Infrastrukturen aufzubauen und sich dabei auf eine hochspezialisierte Softwarearchitektur und auf rollenspezifisch ausgerichtete Frontends zu stützen. Die SAS-Intelligence-Platform integriert einen großen Teil der oben genannten Komponenten der SAS Software und stellt zusätzlich Frontends unter anderem für Administratoren und DatenintegrationsEntwickler (Desktop-Java-Anwendungen), Power-User (Windows-Anwendungen, auch integriert in Microsoft Office), und Informationskonsumenten (Webanwendungen) zur Verfügung. Eine zentrale Komponente der Intelligence Platform ist der Metadatenserver für die anwendungsübergreifende Verwaltung von Metadaten. Die genaue Handhabung von SAS/STAT findet sich im User’s Guide von SAS [2]. 2.2.3 Vor- und Nachteile Im folgenden sollen die wesentlichen Gründe genannt werden, warum sich viele Anwender für SAS als ihr statistisches Werkzeug entschieden haben: + Es besitzt die leistungsfähigste Datenbankanbindung. Die Datenabfrage ist mächtiger als SQL, riesige Datenmengen kann es mühelos verarbeiten. + Es ist ein weit verbreitetes Statistikprogramm, vor allem in der Biologie und Medizin. + Da SAS ein ausführbares Programm ist, stehen die vorhandenen Analysemethoden in schnellem Maschinencode. bequem per Menünavigation erreichen. Das Einstellen von Parametern und Einbinden von Daten ist intuitiv. 9 Abbildung 2.2: Sitzungsbeispiel von SAS/STAT + Ein umfassendes Hilfesystem gehört zur Grundausstattung dazu. + Es bietet eine Schnittstelle zu R. Den Vorteilen stehen folgende Nachteile gegenüber: - Es ist ein kommerzielles Programm, für dessen Nutzung jährliche Lizenzgebühren anfallen. - Exotische statistische Methoden sind im Allgemeinen nicht implementiert. - SAS beinhaltet keine vollständige graphische Benutzeroberfläche (GUI). 2.3 2.3.1 Matlab Die Geschichte Matlab wurde Ende der 1970er Jahre von Cleve Moler an der Universität New Mexico entwickelt, um den Studenten die Fortran-Bibliotheken LINPACK und EISPACK für lineare Algebra von einer Kommandozeile aus ohne Programmier-Kenntnisse in Fortran zugänglich zu machen. Zusammen mit Jack Little und Steve Bangert gründete Moler 1984 The MathWorks und machte Matlab zu einem kommerziellen Produkt, das zusammen mit einer ersten Funktions-Sammlung, der Control System Toolbox, vor allem in der Regelungstechnik viele Anwender fand. 2.3.2 Die Struktur Das Programm Matlab ist ein Entwicklungssystem für die Programiersprache MATLAB, eine proprietäre Programmiersprache, die auf der jeweiligen Maschine (Computer) interpretiert wird. Diese ist speziell auf numerische Berechnungen und die grafische Ausgabe der Ergebnisse ausgelegt. Operationen mit (komplexwertigen) Vektoren und Matrizen stehen dabei im Mittelpunkt. 10 Abbildung 2.3: Sitzungsbeispiel von Matlab Die Java-Entwicklungsumgebung (Abb. 2.3) unterstützt den Programmierer durch ein Workspace-Fenster, indem alle erstellten Variablen mit ihrer Dimension aufgelistet werden, und durch eine Auflistung der letzten Befehle mit Ausführungsdatum. Da diese Java-Umgebung die reinen Matlab-Programme leicht ausbremst, sollte sie - wie ihr Name es andeutet - lediglich beim Entwickeln genutzt werden. Fertige Programme können in einer reinen Konsole ausgeführt werden. Toolboxes enthalten eine Sammlung an Funktionen für konkrete Aufgabenbereiche (entsprechend der Pakete in R), die kommerziell erhältlich sind. MATLAB bietet aus der objektorientierten Programmierung die Konzepte von Klassen, Vererbung, Pakete, Pass-by-Value Aufrufen und Pass-by-Reference Aufrufen. Den Arbeitsspeicher teilt sich Matlab, bedingt durch seine numerische Ausrichtung, in 8 Byte Blöcke ein. Das ist genau der Platzbedarf für eine Double-Variable, also einer Zahl mit 16 Stellen plus der Information über die Position des Kommas. Auf diese Weise werden die numerischen Operationen beschleunigt, allerdings auf Kosten des Arbeitsspeicherverbrauchs, da auch andere Zahlenformate (z.B. Integer) intern als Double verwaltet werden, die unter anderer Verwaltung mit deutlich weniger Speicherplatz auskämen. Eine allgemeine Einführung bietet das Buch von Schweizer [3]. 2.3.3 Vor- und Nachteile Matlab kann bei vielen Anwendern mit folgenden Eigenschaften punkten: + Bei Matlab handelt es sich um eine Programmiersprache. Dem Anwender liegt somit ein sehr flexibles Werkzeug in den Händen, mit dem leicht Automatisierungen, wiederholende Abläufe (notwendig bei Simulationen) oder gar neue Funktionen erstellt werden können. + Matlab läuft auf allen großen Betriebssystemen und Plattformen, also Windows, UNIX und Macintosh. 11 + Manche Nachteile von Matlab (siehe in der folgenden Auflistung) werden dadurch kompensiert, daß Matlab mannigfaltige Schnittstellen zu anderen Programmiersprachen (C, C++, FORTRAN) oder Datenbanksystemen bietet. + Eine große Zahl von höheren Funktionen und praktisch alle Standardfunktionen sind in das System integriert. + Grafische Ausgabefunktionen, bis hin zu Animationen und interaktiven Bedienelementen, sind in Matlab enthalten. + Das System läßt sich leicht erweitern. Sowohl durch Zukauf von Paketen, als auch durch eigene Programme. + Die Laufzeit von Operationen mit Matrizen oder Vektoren kann sich fast mit Compilersprachen messen. + Matlab-Programme laufen ohne Änderungen auf vielen Plattformen. + Für ein High-Level System ist die Verbreitung von Matlab sehr groß. + Um nach einer interessierenden Funktion oder Paket zu suchen, kann die sehr übersichtliche Internetseite http://... verwendet werden. Den Vorteilen stehen folgende Nachteile gegenüber: - Bei Matlab handelt es sich um einen Laufzeitinterpreter, d.h. die Befehle werden erst bei ihrer Ausführung in Maschinencode übersetzt. Dies läuft deutlich langsamer ab, als wenn der Code in einem separaten Schritt in Maschinencode umgewandelt (kompiliert) wurde und erst dann ausgeführt wird. Für neuere Versionen ist jedoch ein Compiler zusätzlich erhältlich, der MATLAB-Code in C-Code übersetzen kann. - Die Anforderungen an den Arbeitsspeicher sind sehr groß. - Neue Methoden werden häufig von den Methodenentwicklern selbst in R programmiert und als Paket für die Allgemeinheit zur Verfügung gestellt. Damit liegt R „am Puls der Forschung“. Durch dieses beständige Einbringen ist mittlerweile ein großer Pool an Paketen/Methoden verfügbar (Anzahl). - Es ist Lizenzsoftware. - Bei bereitgestellten Funktionen kann der Quellcode nicht eingesehen werden, was ein Nachvollziehen verhindert, auf welche Weise die Ergebnisse zustande kommen. 2.4 2.4.1 R Die Geschichte Der Pate für R findet sich in S wieder, einer Programmiersprache für Statistik, stochastische Simulation und Graphik, die seit 1976 in den Bell Laboratories bei AT&T (heute bei Lucent Technologies) entwickelt wird, die in der aktuellen Version 12 S-PLUS 7 für Microsoft Windows und einigen UNIX-Systemen (darunter LINUX) kommerziell vertrieben wird. R selbst wurde als Projekt von Ross Ihaka und Robert Gentleman ins Leben gerufen, um für Lehrzwecke eine freie Implementation zu schaffen. Es basiert auf den Ideen von der Programmiersprache S, jedoch nicht auf dessen Code. Die zeitliche Entwicklung von R soll in der folgenden Aufzählung kurz wiedergegeben werden: 1992 Beginn des R-Projects. 1993 Die erste Binärversion erscheint auf Statlib. 1997 Das R Development Core Team wird von Personen aus Forschung und Wirtschaft aus aller Welt gegründet. 1999 Die erste Distributed Statistical Computing Konferenz und gleichsam das Treffen aller Mitglieder des R Development Core Teams findet statt. Sie wird in einem zwei-Jahres-Rhythmus neu auferlegt. 2000 R-1.0.0 wird veröffentlicht, die erste vollständig kompatible Version zur Sprache S der Version 3. 2001 Die Zeitschrift R News wird erstmalig herausgegeben. 2004 Die erste R Anwenderkonferenz useR! wird abgehalten. 2010 ist die aktuelle Version R-2.11.0 (Stand: Mai 2010). Die Kernfunktionen lassen sich mittlerweile durch x Pakete erweitern. 2.4.2 Die Struktur Bei R handelt es sich um eine Programiersprache, die auf der jeweiligen Maschine (Computer) zur Laufzeit interpretiert wird. Diese ist speziell auf numerische Berechnungen und die grafische Ausgabe der Ergebnisse ausgelegt und für die Lehre konzipiert. Operationen mit (komplexwertigen) Vektoren und Matrizen stehen dabei im Mittelpunkt. R bietet aus der objektorientierten Programmierung die Konzepte von Klassen, Vererbung, Pakete und Pass-by-Value Aufrufen. Des weiteren ist R eine vektorbasierte Sprache. Jedes Objekt wird intern durch einen Vektor repräsentiert. Rechenoperationen sind auf diese Datenstruktur hin optimiert worden (siehe 4.1.2, Seite 25). Funktionen mit ähnlicher Thematik werden in so genannte Pakete (Libraries) gebündelt. Anwender können sich diese Pakete zur Grundausstattung hinzuinstallieren und so ihr R-System individualisieren. Ähnlich der Datenkapselung bei einzelnen Objekten gibt es in R eine Organisation des gesamten Arbeitsspeichers - sogenannte environments (Umgebungen), in denen Objekte, nahezu ohne Interaktionen zu anderen gleichzeitig existierenden Umgebungen, gebündelt werden können. Dies sorgt auch dafür, daß gleichnamige Objekte oder Datensätze, die in unterschiedlichen Umgebungen vorkommen, gegenseitig geschützt werden. So wird für jedes geladene Paket (Library) und jeden Funktionenaufruf eine eigene Umgebung geschaffen. Zudem gibt es den Workspace 13 (.GlobalEnv) als besondere Umgebung, in der alle Objekte, die direkt in der Konsole erzeugt werden, abgespeichert werden. Damit R (und der Anwender) weiß, auf welches Objekt zugegriffen wird, wenn Namensgleichheit herrscht, sind folgende Scoping Rules festgelegt worden, die unter anderem festlegen, in welcher Reihenfolge verschiedene Umgebung nach Objekten durchsucht werden: • Der Workspace .GlobalEnv steht im Suchpfad an Stelle 0 („in der Mitte“). • An letzter Stelle im Suchpfad (eine negative) steht das Paket base. • Zwischen dem Workspace und dem Paket base werden Objekte, die mit library() oder attach() eingehängt wurden, platziert. • Beim Aufruf einer Funktion wird eine Umgebung geschaffen, die dem bisherigen Suchpfad vorangestellt wird, also mit positiver Stelle . Wird im Code nun auf ein Objekt verwiesen, so läuft R den Suchpfad von oben (größte positive Stelle) nach unten (kleinste negative Stelle) soweit ab, bis es in einer Umgebung fündig wird. Auf diese Weise wird sichergestellt, daß immer das aktuellste (zuletzt definierte) Objekt unter gleichnamigen Objekten auch als Erstes gefunden wird. Der aktuelle Suchpfad kann mit der Funktion search() abgefragt werden. Beim Starten von R (Version 2.11.0) sieht dieser wie folgt aus: 0 -1 -2 -3 -4 -5 -6 -7 -8 .GlobalEnv package:stats package:graphics package:grDevices package:utils package:datasets package:methods Autoloads package:base Neu zu erzeugende Objekte müssen nicht zwangsläufig in der Umgebung erstellt werden, in der man sich augenblicklich befindet. Folgende drei Zuweisungsbefehle stehen dem Programmierer zur Verfügung, wobei die ersten zwei vorgestellten Befehle Sonderfälle vom dritten darstellen: <- Das neue Objekt wird lokal, also in der Umgebung erzeut, in der man sich befindet. Dieser Befehl dürfte für die alltägliche Programmierung ausreichen. <<- Das neue Objekt wird im Workspace (.GlobalEnv) erzeugt. assign() Erzeugung des neuen Objekts in der gewünschten Umgebung. Zusätzliche Regeln zu der oben beschriebenen üblichen Suchreihenfolge wurden durch die Einführung von Namespaces geschaffen. Namespaces definieren, welche Objekte für den Benutzer und andere Funktionen (im Suchpfad) sichtbar sind und welche nur innerhalb des eigenen Namespace sichtbar sind. Dies verhindert Konflikte zwischen Funktionen gleichen Namens in gleichzeitig benutzten Paketen. Den Arbeitsspeicher teilt sich R, genau wie Matlab, in 8 Byte Blöcke ein, was auch hier schnellere numerische Berechnungen und einen aufgeblähten Speicherverbrauch zur Folge hat. Weitere Informationen zu R finden sich in [4], [5] und [6]. 14 Abbildung 2.4: Sitzungsbeispiel von R 2.4.3 Vor- und Nachteile Im folgenden sollen die wesentlichen Gründe genannt werden, warum sich viele Anwender für R als ihr statistisches Werkzeug entschieden haben: + Bei R handelt es sich um eine Programmiersprache. Dem Anwender liegt somit ein sehr flexibles Werkzeug in den Händen, mit dem leicht Automatisierungen, wiederholende Abläufe (notwendig bei Simulationen) oder gar neue Funktionen erstellt werden können. + Einer der herausragenden Vorteile, auch gegenüber der anderen Statistik-Software, ist, daß es sich bei R um eine Open-Source-Software handelt und unter GPL lizenziert ist. Es ist möglich, sämtlichen Quellcode einzusehen, so daß es sich bei R an keiner Stelle um eine „Black Box“ handelt, denn es kann überall nachvollzogen werden, wie und was gerechnet wird. + Aufgrund der Open-Source-Struktur von R werden fehlerhafte Programmsequenzen von versierten Anwendern schnell aufgefunden, worauf hin ein korrigiertes Update in wenigen Tagen zur Verfügung gestellt werden kann. + Es ist kostenlos beziehbar unter www.r-project.org. + Das System läßt sich leicht auf die eigenen Bedürfnisse durch Installation bzw. Entwicklung von Paketen anpassen. + Die Laufzeit von Operationen mit Matrizen oder Vektoren kann sich fast mit Compilersprachen messen. + R läuft auf allen großen Betriebssystemen und Plattformen, also Windows, UNIX (Linux, Solaris, FreeBSD, AIX, ...) und Macintosh. 15 + R-Programme laufen ohne Änderungen auf vielen Plattformen. + Ein weiterer Vorteil ist der Support, der für R von vielen Freiwilligen, darunter die Mitglieder des R Core Teams, geleistet wird. Dazu gehört die meist sehr schnelle und kompetente Beantwortung von Fragen auf der Mailingliste R-help sowie die Unterstützung von Entwicklern auf der Mailingliste R-devel. + Neue Methoden werden häufig von den Methodenentwicklern selbst in R programmiert und als Paket für die Allgemeinheit zur Verfügung gestellt. Damit liegt R „am Puls der Forschung“. Durch dieses beständige Einbringen ist mittlerweile ein großer Pool an Paketen/Methoden verfügbar (Stand 02.07.2010: 2449). + Manche Nachteile von R (siehe in der folgenden Auflistung) werden dadurch kompensiert, daß R mannigfaltige Schnittstellen zu anderen Programmiersprachen (C, C++, FORTRAN), Datenbanksystemen (Paket RODBC) oder Graphiktools (Paket RGtk2, ggobi) bietet. + Um nach einer interessierenden Funktion oder Paket zu suchen, wurde eine Suchmaschine eingerichtet, die unter – http://finzi/.psych.upenn.edu/search.html bzw. – http://CRAN.R-project.org/search.html oder in R selbst mit der Funktion – RSiteSearch() aufgerufen werden kann. Den Vorteilen stehen folgende Nachteile gegenüber: - Bei R handelt es sich um einen Laufzeitinterpreter, d.h. die Befehle werden erst bei ihrer Ausführung in Maschinencode übersetzt. Dies läuft deutlich langsamer ab, als wenn der Code in einem separaten Schritt in Maschinencode umgewandelt (kompiliert) wurde und erst dann ausgeführt wird. - Die Anforderungen an den Arbeitsspeicher sind sehr groß. - Ein oftmals genannter Nachteil von R ist das Fehlen einer vollständigen graphischen Benutzeroberfläche (Graphical User Interface, kurz GUI), wie sie etwa in SPSS vorhanden ist. Das Paket Rcmdr bietet sehr eingeschränkt eine solche GUI. - Ebensowenig bietet R keinen eigenen Dateneditor an. Änderungen können nur umständlich über Zuweisungen im Programmcode oder mit Hilfe der Funktion fix() erfolgen. - Bei der Graphikausgabe erzeugt R weder dynamische (bei Änderung der zugrunde liegenden Daten aktualisiert sich die Graphik mit), noch interaktive (z.B. manuelles Rotieren einer 3D-Punktewolke) oder verknüpfte (z.B. Markierung eines Objektes in der einen Graphik führt zur Markierung desselben Objektes in allen weiteren Graphiken) Graphiken. 16 2.5 2.5.1 Excel Die Geschichte 1982 Als erstes Spreadsheet-Programm aus dem Hause Microsoft wird Multiplan für das System CP/M vermarktet. Unter MS DOS kann es sich gegen das Konkurrenzprodukt Lotus 1-2-3 nicht durchsetzen. 1985 Die erste Excel-Version für das Betriebssystem MacOS wird herausgegeben. 1987 Die erste MS Excel-Version wird für das Betriebssystem MS DOS und der Softwareumgebung Windows präsentiert. Um die Identität mit der Mac-Variante hervorzuheben, startet Excel unter DOS mit der Versionsnummer 2.05. 1993 Aufgrund der Namensgleichheit zu einem bereits existierenden Programm eines anderen Herstellers kommt es zu einem Trademark-Gerichtsstreit, in dem festgesetzt wird, daß Microsoft bei Pressemitteilungen und juristischen Dokumenten als offiziellen Warennamen „Microsoft Excel“ verwenden muß. 2.5.2 Die Struktur Bei MS Excel handelt es sich um ein Tabellenkalkulationsprogramm (SpreadsheetProgramm), die Eingabefelder (Zellen) sind als Tabelle angeordnet. Es steht dem Anwender völlig frei, wie er die Zellen für seine Aufgaben befüllt, formatiert oder mit Kommentaren versieht. Die Tabellenkalkulation findet hauptsächlich durch Referenzierung anderer Zellen statt, wobei dann deren Inhalt für die Berechnung von Formeln und Funktionen verwendet wird. Der Zellbezug ist dabei auf die aktuelle Tabelle nicht beschränkt; er kann auch auf andere Tabellen verweisen, die sogar in anderen Excel-Dateien stehen können. Die Ergebnisse lassen sich leicht in grundlegende Diagramme wie Zeitreihen-, Säulen- oder Kuchendiagramme graphisch aufbereiten. Die erstellten Diagramme können dabei entweder auf dem zugehörigen Tabellenblatt verankert oder als eigenständiges Objekt innerhalb der Datei abgelegt werden. Eine andere kompakte Darstellung der Daten bietet sich in der Erstellung von Pivot-Tabellen, die MS Excel ebenfalls unterstützt. Kompliziertere Berechnungen oder Interaktionen mit dem Benutzer lassen sich mit der Macro-Sprache Visual Basic for Applications bewerkstelligen. 2.5.3 Vor- und Nachteile Im folgenden sollen die wesentlichen Gründe genannt werden, warum es lohnend ist, sich in MS Excel einzuarbeiten: + Es ist weltweit das am meisten verbreitete Tabellenkalkulationsprogramm. + Die leichte und bequeme Dateneingabe macht MS Excel zu einem idealen Dateneditor für andere Programme (z.B. R). + MS Excel besitzt eine vollständige graphische Benutzeroberfläche. Sämtliche Befehle sind über das Menü zu erreichen. 17 Abbildung 2.5: Sitzungsbeispiel von MS Excel + Die erstellten Graphiken sind ohne größere Formatierungen publikumsreif. + Die Graphiken sind dynamisch, d.h. sie reagieren unmittelbar auf Veränderungen in ihren Datenzellen. + Reichlich Literatur ist zu dieser Software publiziert worden. Nachteile von MS Excel - MS Excel ist ein kommerzielles Programm, für das man einmalig einen (im Vergleich zu den anderen kommerziellen Statistikprogrammen) geringen Preis zahlen muß. - Bei den implementierten Funktionen handelt es sich um Black-Boxen. Der Anwender kann nicht nachvollziehen, wie die Ergebnisse zustande kommen. - Es fehlen viele grundlegende statistische Methoden. Dieser Nachteil soll in der 2010er Version reduziert werden. - Aufgrund der langsamen Rechengeschwindigkeit arbeiten die Algorithmen mit kleinen Rundungen, was die Rechengenauigkeit beeinträchtigt. - Matrizenrechnung kann, wenn überhaupt, nur sehr umständlich über Visual Basic for Applications erfolgen. - Es bietet kaum Schnittstellen zu anderer Software, die nicht zum Office-Paktet gehört. - Der zuverlässige Datumsbereich ist sehr begrenzt. So führen Daten vor 1900 häufig zu Problemen; das Jahr 1900 wird als Schaltjahr eingestuft. - Die Software-Hilfe von MS Excel behandelt nur ganz grundlegende Fragestellungen bezüglich der Bedienung. 18 - In MS Excel 2007 wurde ein historisierendes Menüsystem programmiert, was die Position der Befehle im Menü je nach Verwendung des einzelnen Benutzers abändert. Hilfestellungen in z.B. Online-Foren können dadurch keine konkrete Schrittabfolge (gehe in Menü ..., dann ...) angeben. Dies wurde in der 2010erVersion wieder abgeschafft. - Aufgrund der Tabellenkalkulationsstruktur bestehen enge Verknüpfungen von Daten, Rechenwegen und Ergebnissen, was das Anwenden der selbst erzeugten Routinen auf neue Daten verkompliziert. 2.6 weitere Software Weitere Software, deren Funktionen für Ökonomen interessant sind, sollen hier kurz vorgestellt werden. Eine Übersicht über Statistiksoftware jedweder Ausrichtung bietet die Internet-Seite http://de.wikipedia.org/wiki/Liste_von_Statistik-Software. EViews Die Software hat ihren Einsatzschwerpunkt in der Verarbeitung von Zeitreihen. Alle wichtigen Methoden der Zeitreihenanalyse von einfachen AR-, MA-, ARMA-, über ARIMA-, ARIMAX-, ARCH-, GARCH- hin zu State-SpaceModellen bzw. Zustandsraummodellen sind durchführbar. Sowohl Cross-Sections als auch longitudinalen Daten können deskriptiv und analytisch dargestellt werden. EViews beherrscht allgemeine ökonometrische und statistische Analysen, die Generierung von Vorhersagen und Modellsimulationen, sowie die Ausgabe von Graphen und Tabellen, z.B. für Veröffentlichungen. EViews ermöglicht Daten-Organisation inkl. Datenbankzugriffe. gretl gretl ist eine freie Statistik-Software, hauptsächlich für Ökonometrie. Der Name ist ein Akronym für Gnu Regression, Econometrics and Time-series Library. Sie kann mit anderen Statistik- und Ökonometrie-Paketen verwendet werden, z.B. X-12-ARIMA, TRAMO/SEATS oder R. Sie ist in C geschrieben und nutzt das GIMP-Toolkit für die grafische Benutzeroberfläche. Die Benutzeroberfläche ist in verschiedenen Sprachen verfügbar, auch in Deutsch. Für Ergebnisse wird Gnuplot für die Erstellung von Grafiken und unter anderem LaTeX für numerische Resultate und Modelle genutzt. Eine Kommandozeilenversion ist ebenfalls verfügbar. Limdep Limdep hat seinen Anwendungsschwerpunkt im Bereich Auswertung von Regressionsmodellen für diskret abhängige Variablen bzw. Zielgrößen (Logistische Regression). Alleinstellungsmerkmal der Software ist die verarbeitbare Modellkomplexität, die im Wesentlichen nur durch praktische Modellüberlegungen, Arbeitsspeicher und Rechenzeit begrenzt ist. Neben Logistischer Regression ist ein weiterer Anwendungsbereich der Software die Zeitreihenanalyse. Für die Software Limdep gibt es ein Erweiterungsmodul mit Namen Nlogit. Limdep findet verbreitet Anwendung in Forschung, Studium und Verwaltung. Es wird eingesetzt für die Paneldatenanalyse und in der Ökonometrie. Es sind Logit-, Probit-, Tobit-Modelle und „discrete choice“-Modelle rechenbar. RATS „Regression Analysis of Time Series“ bietet, wie der Name bereits beinhaltet, schwerpunktmäßig viele Werkzeuge für das Erstellen von Regressions19 und Zeitreihenmodellen, so zum Beispiel SUR-, ARIMA-, GMM-, ARCH-, GARCH- und VAR-Modelle. Gespeicherte Daten können aus Text-, Spreadsheet- oder Datenbankdateien entnommen werden. JMulTi JMulTi ist eine interaktive Software, die zum Analysieren von univariaten und multivariaten Zeitreihen entwickelt wurde. Es arbeitet mit einer JavaBenutzeroberfläche und verwendet eine externe Engine für die statistischen Berechnungen. Implementierte Features sind unter anderem GARCH-, VAR-, VEC- und ARIMA-Modelle. RiskLink-ALM RiskLink-ALM (Aggregate Loss Module) ist eine Anwendung zur Katastrophenmodellierung, die dahingehend entwickelt ist mit angesammelten Versicherungsdaten zu arbeiten. Es sind in dieser Anwendung bereits Katastrophengefahrmodelle von über 40 Gebieten weltweit enthalten. 20 Kapitel 3 ausgewählte Funktionen für Ökonometrie In diesem Abschnitt sollen zum einen Pakete/Toolboxes von Matlab und R vorgestellt werden, die sich mit Themen der Finanzökonometrie beschäftigen, und zum anderen aufgezeigt werden, welche Funktionen beider Systeme identische Aufgaben handhaben. Zusatzpakete Ein sehr weit gestecktes Feld der Finanzökonometrie deckt die Matlab Financial Toolbox ab. So ermöglicht sie u.a.: • Berechnung und Analyse von Prices, Yields und Sensitivities für Derivate und anderer Wertpapiere, und für Portfolios von Wertpapieren • Ausführen von Securities Industry Association (SIA) kompatiblem Fixed-Income Pricing, Yield und Sensitivity Analyse • Portfolios analysieren und verwalten • Hedging-Strategien gestalten und bewerten • Risiko erkennen, messen und kontrollieren • Analyse und Berechnung von Cash Flows, einschließlich Rates of Return und Depreciation Streams • Analyse und Vorhersage von ökonomischer Aktivität • Visualisierung und Analyse von finanziellen Zeitreihendaten • Gestaltung von strukturierten Finanzinstrumenten, einschließlich AuslandswährungsInstrumenten Die Matlab Financial Derivatives Toolbox schränkt sich auf folgende Finanzprodukte ein: [?]onds, Bond Options, Caps, Fixed-Rate Notes, Floating-Rate Notes, Floors, Swaps, Swaption, Callable und Puttable Bonds und Options (Asian, Barrier, Compound, Lookback und Vanilla Stock) Für R bietet die Organisation Rmetrics eine ganze Palette von finanzökonometrischen Paketen an: 21 fOptions, fExoticOptions, fAsianOptions, fAssets, fBonds, fPortfolio, fRegression, fExtremes, timeSeries, ... Da die Pakete gemäß der R-Philosophie kostenlos innerhalb der R-Konsole mit den Befehlen source("http://www.rmetrics.org/Rmetrics.R") install.Rmetrics() mit Quellcode beziehen lassen, die Organisation sich deshalb über die Veröffentlichung von Literatur bezüglich ihrer Funktionen finanziert, bleibt hier ein konkreter Aufgaben-Überblick wie bei den Matlab-Toolboxes verwehrt. synonyme Funktionen Bezüglich des Black-Scholes-Modells stehen unter anderem folgende Funktionen zur Verfügung: Matlab (Financial Toolbox) blsprice R (fOptions) GBSOption blsgamma blsdelta blslambda blsrho blstheta blsvega GBSGreeks SAS (?) BLKSHCLPRC BLKSHPTPRC GBSCharacteristics Während Matlab in der Funktion blsprice sowohl der Call-, als auch der PutPreis ausgegeben wird, zeigt die R-Funktion GBSOption lediglich denjenigen an, der per Parameter gesetzt wurde, und SAS bietet dafür zwei selbstständige Funktionen an. Bei den Griechen gibt es in Matlab jeweils eine eigenständige Funktion, in R wird dies erneut über einen Parameter einer gemeinsame Funktion gesteuert. Preisals auch Griechenberechnung kann unter R mit GBSCharacteristics durchgeführt werden. Bei der Call- und Put-Preisberechnung mit gleichen Parametern kommt es zu unterschiedlichen Ergebnissen zwischen Matlab (links) und R (rechts): blsprice( Price Strike Rate Time Volatility ) = = = = = GBSOption( TypeFlag S X b Time sigma r ) 100, 95, 0.1, 0.25, 0.5 = = = = = = = "c", #oder "p" 100, 95, 0.1, 0.25, 0.5, 0 Ergebnis: Callpreis = 14.04 Putpreis = 6.51 Ergebnis: Callpreis = 13.70 Putpreis = 6.35 22 Beim Heston-Nandi-Garch-Modell konnten bezüglich des Pricing und der Berechnung der Griechen nur Funktionen in R gefunden werden. Für die Parameterschätzung aus einem vorhandenen Pfad dienen die Funktionen ugarch aus Matlab und hngarchFit aus R. Um einen Pfad zu simulieren stehen die Funktionen ugarchsim (Matlab) und hngarchSim (R) zur Verfügung. Matlab (Financial Toolbox) ugarch ugarchsim R (fOptions, fExoticOptions) HNGOption HNGGreeks HNGCharacteristics hngarchFit hngarchSim Die letzte Auflistung befaßt sich mit exotischen Optionen: Matlab R (Financial (fExoticOptions) (Derivatives Toolbox) barrierbycrr StandardBarrierOption barrierbyeqp barrierbyitt ForwardStartOption 23 Kapitel 4 Leistungsoptimierung Numerische Berechnungen großen Ausmaßes können gewaltige Anforderungen an einen Rechner darstellen. Trotz der rapiden Verbesserungen in der Hardwareleistung kann hier auf Leistungsverbesserung von Softwarealgorithmen nicht verzichtet werden, da sie es erst ermöglichen, mit Hilfe der neusten Hardware detailgetreuere Berechnungen laufen zu lassen, die in realistischere Ergebnisse münden. Man bedenke zudem, daß manchmal eine simple Verdopplung der Geschwindigkeit bedeutet, daß Programme statt zweier Tage nur noch einen Tag Rechenzeit benötigen, oder daß Berechnungen statt über Nacht auch eben während der Mittagspause laufen können, daß sich also die Wartezeit auf benötigte Endergebnisse deutlich verkürzen läßt. Schließlich ist es in den meisten Fällen einfacher und kostengünstiger, einen verbesserten Algorithmus zu konzipieren, als sich einen höherwertigen Rechner zuzulegen. Gleiches gilt für den Speicherverbrauch von Programmen. Eine Verringerung des Speicherverbrauchs bringt auch Geschwindigkeit, vor allem, wenn vermieden werden kann, daß virtueller Speicher verwendet werden muß. Virtueller Speicher ist Speicher, der auf der Festplatte in sogenannten Swap-Bereichen erzeugt wird. Er erweitert virtuell den Hauptspeicher des Rechners - mit dem Nachteil, daß er um ein Vielfaches (Größenordnung: 103 ) langsamer als echter Hauptspeicher ist. Manchmal kann eine Verringerung des Speicherverbrauchs das Lösen von Problemen erst möglich machen, wenn sonst z.B. gar nicht genügend Hauptspeicher zur Verfügung stünde. Da beim Programmieren oder dem Aufrufen von Prozeduren oft unterschiedliche Wege zum gleichen Ziel führen, sollen in diesem Kapitel die konkurrierenden Strategien mit Empfehlung der effizienteren vorgestellt werden. 4.1 R und Matlab Da R und Matlab sehr ähnlich funktionieren und dementsprechend viele Leistungsverbesserungen auf gleichem Wege stattfinden, sollen beide Systeme hier gemeinsam behandelt werden. 4.1.1 Geschwindigkeit des Codes messen Bevor versucht wird, irgend einen Programmcode zu beschleunigen, muß zunächst herausgefunden werden, welche Teile davon besonders langsam laufen, denn minimale Verbesserungen von bereits recht schnellem Code rechtfertigen selten den 24 Aufwand, der beim Neukonzipieren der Programme anfällt. einfache Stoppuhr (R und Matlab) Eine einfache Zeitmessung geschieht in Matlab mit dem Befehlspaar tic und toc, von dem tic die Stoppuhr startet und toc die verstrichene Zeit ausgibt. Diese schlichte Implementation eignet sich gut fürs Vergleichen der Geschwindigkeit vom alten und neuen Code. In R erledigt die gleiche Aufgabe die Funktion system.time(). Beim Invertieren einer 1000 × 1000-Matrix zeigt sich z.B., daß beide Systeme in etwa gleich schnell arbeiten (links Matlab, rechts R): Y = zeros(1000, 1000); for i = 1:1000 for j = 1:1000 Y(i, j) = 1000 * (i - 1) + j; end end Y = sin(Y); Y = Y + eye(1000); x <- 1:1000000 Y <- matrix(data = sin(x), nrow = 1000, byrow = TRUE ) tic Z = Y^(-1); toc system.time(solve(Y)) Elapsed time is 1.733237 seconds. User 1.33 diag(Y) <- diag(Y) + 1 System verstrichen 0.00 1.42 Profiling (R und Matab) Eine wesentlich detailierte Darstellung der verwendeten Rechenzeit findet sich unter Matlab mit den beiden Befehlen profile on; und profile viewer;, die den zu optimierenden Code einrahmen. Nachdem der entsprechende Code ausgeführt wurde erscheint ein Fenster, das die Profiling-Informationen anzeigt. Beim Klicken auf self time gelangt man zu einer Tabelle, in der die ausgeführten Funktionen nach der tatsächlich benötigten Zeit sortiert sind. Wird nun eine Funktion angewählt, so wird gezeigt, welche Zeilen von ihr am längsten für ihre Ausführung brauchten. Zu beachten dabei ist, daß das Profiling zeilenweise und nicht befehlsweise arbeitet. Darum sollte immer nur ein Befehl pro Zeile stehen, um eindeutig bestimmen zu können, welcher Befehl welchen Zeitanteil hat. In R erledigt die Funktion Rprof() diese Tätigkeit. 4.1.2 synonymer Code Schleifen durch Vektoroperationen erstetzen (R und Matlab) R und MATLAB Programme werden erst zur Laufzeit interpretiert. Dies scheint sie auf den ersten Blick als unpassend für Berechnungen großen Ausmaßes zu machen. Die Stärke von R und MATLAB liegt nun darin, daß sie auf kompilierte Bibliotheken zurückgreifen, die dahingehend kodiert sind Operationen auf Daten, die als Vektoren gelagert sind, effizient auszuführen. Dies gilt auch für Matrizen, da sie intern als Vektor von Vektoren aufgefaßt werden. 25 Für Schleifenoperationen wurde derartiges nicht konzipiert, weswegen bei ihnen sich die langsame Laufzeitinterpretereigenschaft von R und MATLAB voll niederschlägt. Aus diesem Grund sollen - soweit möglich - Schleifen durch Vektoroperationen ersetzt werden. Das folgende Beispiel (in MATLAB-Code) greift solch eine Verbesserung auf. Hier wird zu einem konkreten Bogenmaß der entsprechende Sinuswert mit Hilfe einer Schleife berechnet: abstand bogen i = pi/30; = 0; = 1; while bogen x(i) = bogen = i = end <= 2*pi sin(bogen); bogen + abstand; i + 1; Und nun die wesentlich schnellere Variante in Vektorschreibweise: x = sin(0:(pi/30):(2*pi)); Verwendung geeigneter logischer Operatoren (R und Matlab) Bei logischen AND- oder OR-Operationen hat man in R und Matlab die Wahl von jeweils zwei Operanden: &, | führt ein logisches AND oder OR auf Arrays Element für Element durch &&, || führt ein logisches AND oder OR auf skalaren Werten mit Kurzausführung durch Bei if- und while-Ausdrücken ist es effizienter den Kurzausführungs-Operator (&& oder ||) zu verwenden. Ihr großer Vorteil besteht darin, daß nur so viel der Logikverknüpfung ausgewertet wird, wie zu einer konkreten Aussage benötigt wird. Es muß also meist nie die gesamte Logikverknüpfung abgearbeitet werden. Weiß man bei der Programmierung, daß eine Abfrage oft ein FALSE ergibt, so sollte sie am Anfang der Logikverknüpfung gestellt werden. Während im folgenden Beispiel bei der ersten Abfrage alle Aussagen ausgewertet werden, um zum Ergebnis FALSE zu gelangen if(FALSE & TRUE & TRUE & FALSE){...} bricht die Überprüfung im zweiten Beispiel bereits bei der ersten Aussage mit Ergebnis FALSE ab: if(FALSE && TRUE && TRUE && FALSE){...} Load and Save verwenden (Matlab) Load und Save sind gegenüber low-lewel Datei-I/O-Funktionen wie fread und fwrite dahingehend optimiert worden schneller zu laufen und Fragmentierungen im Arbeitsspeicher zu reduzieren. 26 parallele Programmierung (R und Matlab) Die Beschleunigung von Hardware wurde in den letzten Jahren nicht nur dahingehend verbessert, daß die Chips immer kleiner und der damit zeitfressende Weg zwischen ausführenden Einheiten verkürzt wurde, wodurch die Arbeitstaktung erhöht werden konnte, sondern auch, daß einem Benutzer mehrere unabhänige CPUs für die Ausführung seiner Software zur Verfügung standen (Stichworte: Mehr-KernRechner, Cluster-Netzwerk, Cloud-Computing). Üblicherweise versucht das Betriebssystem unabhängige Befehle zu erkennen und diese gleichzeitig an den parallelen Rechenarchitekturen auszuführen. Dies funktioniert deutlich effizienter, wenn dem Betriebssystem gesagt wird, welche Codeabschnitte diese Vorgehensweise zulassen. Eine Programmstruktur, die für parallele Auswertung besonders gut geeignet ist, sind Zählschleifen (for), da hier die Anzahl der Iterationen und die Werte der Schleifenvariable im Voraus bekannt sind. Greifen die einzelnen Schleifendurchläufe zudem lediglich auf konstante Variablen zurück, also solche, die in den vorausgehenden Schleifendurchläufen nicht verändert werden (und damit keine Konstanten!), so sind die jeweiligen Iterationen der Schleife unabhängig und können ohne Probleme parallel ausgeführt werden. Finden sich solche Zählschleifen im Code, so sollte man das Konstrukt parfor in Matlab und die Funktion runParallel() im R-Paket rparallel verwenden. Zum R-Paket rparallel ist allerdings zu erwähnen, daß es eine R-Version kleiner 2.10 benötigt (Stand Juni 2010). Code in C und FORTRAN programmieren (R und Matlab) Wenn alle bisherigen Schritte der Code-Optimierung ausgeschöpft sind und die Geschwindigkeit des Programms immer noch nicht gut genug ist, so bieten Matlab und R Schnittstellen für die Programmiersprachen C und FORTRAN an, dessen Code in reine Maschinensprache kompiliert wird. Kritisch dabei ist die Stelle der Variablenübergabe, da deren Verwaltung sich in C und FORTRAN deutlich zu R und Matlab unterscheiden - eine Variable wird einem festen Typ (Integer, Double, ...) zugewiesen, den sie im Verlauf des Programms nicht ändern kann. Zudem ist der kompilierte Maschinencode betriebssystemabhängig und funktioniert in der Regel auf alternativen Plattformen nicht. 4.1.3 effizienter Arbeitsspeichergebrauch .Last.value löschen (R) Das abschließende Ergebnis eines Top-Level-R-Ausdrucks wird stets in der Variablen .Last.value (aus dem Paket base) abgespeichert. Erst danach wird der folgende Code ausgeführt. Nachdem z.B. ein sehr großes Objekt erzeugt wurde, kann auf diese Weise sehr viel Arbeitsspeicher zusätzlich belegt werden. Unter Umständen führt dies dazu, daß bestimmte Daten aus dem Arbeitsspeicher in eine Auslagerungsdatei (Swap) auf der Festplatte verschoben werden müssen, damit genug Ressourcen für anschließende Berechnungen im Arbeitsspeicher wieder zur Verfügung stehen. Dieses Auslagern von Daten und das spätere Zugreifen auf ausgelagerte Daten benötigt extrem viel Zeit und sollte durch geschickte Programmierung vermieden werden. Ein Weg, dieses Auslagern zu vermeiden, ist, daß die Variable .Last.value nach ei- 27 nem arbeitsspeicherfressenden Top-Level-R-Ausdruck-Ergebnis umgehend aus dem Arbeitsspeicher gelöscht bzw. mit einem sehr kleinen Objekt überschrieben wird: ... # z.B. ein großes Objekt wird erzeugt BIG <- irgendeineFunktion(...) # .Last.value direkt aus Workspace löschen rm(.Last.value) # alternativ ein sehr kleines Objekt erzeugen, # wodurch .Last.value auch wenig RAM verbraucht dummy <- 1 # oder .Last.value direkt ein kleines Objekt zuweisen .Last.value <- 1 # erst jetzt weiteren Programmcode ausführen lassen ... Speicherplatz reservieren (R und Matlab) R und Matlab erzeugen Variablen on the fly: Speicherplatz wird erst dann reserviert, wenn die Variablen (mitten im Programm-Code) erzeut werden. Obwohl R und Matlab danach selbstständig die Speichergröße von Objekten wie z.B. Matrizen und Vektoren anpaßt, ist es in den meisten Fällen eine gute Idee, den letztlich benötigten Speicherplatz im voraus und mit Hilfe von Vektor-Ausdrücken zuzuweisen. Diese Prä-Allokation erhebt nur einmal die zeitlichen Kosten, die für das Zuweisen von Speicherplatz anfallen und es garantiert, daß benachbarte Vektor- und Matrizenelemente in aneinander grenzenden Orten im RAM gelagert werden, was bei späteren Operationen auf diesen Elementen erneut schnellere Zugriffszeiten ermöglicht. Ein Beispiel (was bestimmt nicht 1 zu 1 übernommen werden darf) dafür wäre das Auffinden von Literatur in einer Bibliothek; genauer: man sucht nach zwei Bänden derselben Zeitschriften-Reihe. Weiß man nun, daß die Bibliothek die ZeitschriftenReihen bündig und geordnet anbietet, so braucht man an der Information lediglich die Lagerdaten des ersten Bandes heraussuchen und kann von dessen Standpunkt aus unmittelbar den zweiten Band finden. Verwendet die Bibliothek die oben genannte Ordnung nicht, sondern präsentiert die Bände an zufälligen Stellen des Gebäudes, so müßte man nach dem Auffinden des ersten Bandes zur Information zurückkehren, um zusätzlich die Lagerdaten vom zweiten Band einzuholen; eine deutlich aufwändigere und langsamere Vorgehensweise. Zudem sollen, wenn möglich, größere Variablen zuerst erzeugt werden und danach kleinere. Würden zuerst kleinere Variablen in den Speicher geladen, so bestünde die Möglichkeit, daß diese derart unglücklich abgelegt werden, daß im Anschluß eine große Variable nur noch fragmentiert in die verbleibenden freien Bereiche paßt. In den folgenden Beispielen (in MATAB-Code) soll erneut der Sinus-Wert zu einem konkreten Bogen-Maß ermittelt und abgespeichert werden. Im ungünstig programmierten Fall wird bei jedem Schleifendurchlauf der Vektor x sukzessiv um ein Element verlängert: 28 abstand bogen i = pi/30; = 0; = 1; while bogen x(i) = bogen = i = end <= 2*pi sin(bogen); bogen + abstand; i + 1; Eine bessere Speicherbehandlung bietet der anschließende Code. Hier wird x durch eine Vektor-Funktion (zeros()) als Vektor mit 61 Nullen vorab erzeugt: abstand = pi/30; anzElemente = 61; x = zeros(1, anzElemente); % (2*pi)/(pi/30) + 1 % Prä-Allokation for i = 1:61 x(i) = sin(abstand * (x-1)); end Variablentyp beibehalten (R und Matlab) Das Abändern der Klasse einer bestehenden Variablen bremst R und Matlab aus, da extra Rechenzeit benötigt wird, diese Umstellung auszuführen. Darum ist es ratsam, anstatt eine bestehende Variable zu überschreiben die benötigten Daten in eine neue Variable zu schreiben. Die einzelnen Modi von Variablen sind logical, numeric, complex und character - in R abfragbar mit der Funktion mode(). Anstatt also eine Variable vom Typ numeric in eine vom Typ character abzuändern (in R-Code) x <- 1.64 ... x <- "95%-Quantil der NV" besser eine zweite Variable erzeugen: x.num <- 1.96 ... x.char <- "95%-Quantil der NV" Schleifen statt rekursive Funktionen (R und Matlab) Wie im Abschnitt Die Struktur von R und Die Struktur von Matlab vorgestellt wurde, wird beim Aufruf einer Funktion für diese eine Umgebung im Arbeitsspeicher erzeugt, also Speicherplatz belegt. Da eine rekursive Funktion sich immer wieder selbst aufruft und dabei eine neue Instanz von sich selbst erzeugt, ohne daß die vorherige beendet ist, wird also in jedem Rekursionsschritt eine zusätzliche Umgebung erzeugt. Wenn nun viele und/oder große Objekte innerhalb der Funktion erzeugt werden oder an sie übergeben werden, so summiert sich der Speicherverbrauch über 29 alle benötigten Rekursionsschritte, auch wenn die Objekte zum Teil identisch sind. Erst wenn der letzte benötigte Rekursionsschritt erreicht wurde, enden die erzeugten Instanzen der rekursiven Funktion in umgekehrter Reihenfolge ihrer Erzeugung und geben dabei den verwendeten Speicherplatz wieder frei. Bei Schleifen hingegen bleibt die Zahl der Variablen und damit einhergehend der benötigte Speicherplatz konstant. Sie werden lediglich bei jedem Schleifendurchlauf aktualisiert. Das folgende Beispiel (in R-Code) soll den Unterschied im Speicherverbrauch verdeutlichen. Dabei soll die Fakultät von n berechnet werden. Zunächst der Algorithmus bei einem rekursiven Ansatz: fak.rek <- function(n) { if(n == 1 || n == 0) return(1) else return(n * fak.rek(n - 1)) } Bei n = 100 und einem (vermuteten) Speicherbedarf von 10 Byte pro Instanz bedarf es an der extremsten Stelle ca. 1 MB. Bei der Schleifenlösung fak.it <- function(n) { if(n == 1 || n == 0) return(1) fakultaet <- 1 for(i in 2:n) { fakultaet <- fakultaet * i } return(fakultaet) } werden durchgehend (vermutet) lediglich 50 Byte benötigt. 4.2 SAS Zu den Optimierungsvorschlägen für SAS sei angemerkt, daß sie nicht immer zu schnelleren Programmlaufzeiten führen. Ressourcenkontrolle Mit Hilfe der folgenden beiden Systemoptionen kann man sich Informationen über den Ressourcenverbrauch von SAS Programmen verschaffen. FullSTimer Liefert Informationen über die Dauer, die verbrauchte CPU-Zeit und den Hauptspeicherverbrauch eines DATA oder PROC Steps. SASTrace Gibt Aufschluss darüber, wie der Zugriff auf relationale Datenbanksysteme (RDBMS) von der entsprechenden SAS ACCESS Engine durchgeführt und welche Befehlsteile direkt an die Datenbank weitergeleitet und welche Teile von SAS selbst ausgeführt wurden. 30 Steuerung von SAS-Systemoptionen Neben den Optionen zur Kontrolle von Ressourcenverbräuchen gibt es im SASSystem zahlreiche Systemoptionen, mit denen die Verwendung der Ressourcen gesteuert werden kann: CPUCount Setzt die Anzahl der Prozessoren, die SAS nutzen darf. MemSize Gibt an, wie viel Hauptspeicher SAS maximal verwenden darf. SortSize Reguliert den Anteil des Hauptspeichers, der für Sortierschritte reserviert werden soll. SumSize Legt fest, wie viel Hauptspeicher für Aggregationen bereitgestellt werden soll. BufSize Bestimmt die Größe eines Datenpaketes in einem Eingabe-Ausgabe-Schritt (Gegenstück zu BufNo). BufNo Bestimmt die Anzahl der Datenpakete in einem Eingabe-Ausgabe-Schritt (Gegenstück zu BufSize). Threads Aufteilung von SAS-Schritten in Threads (unabhängige Programmstücke, die zeitgleich ablaufen können). Komprimierung verwenden Bei großen Datensätzen mit vielen alphanumerischen Variablen lohnt es sich, die (globale) SAS-Option COMPRESS = CHAR einschalten und in Ausnahmefällen die (lokale) DATA-STEP-Option COMPRESS = NO zu nutzen, denn dies spart zum einen Speicherplatz, reduziert den Aufwand bei I/O-Operationen und SAS entscheidet selbst, wann sich ein Komprimieren der Daten lohnt. Trotz der höheren CPUAuslastung beim Dekomprimieren bleibt unterm Strich neben der Platzeinsparung auch ein Zeitgewinn, da die CPU stets (deutlich) schneller ist als I/O-Operationen. Im Beispielprogramm sollen aus der Urtabelle alle Benutzer herausgeschrieben werden, deren Nachname nicht mit „A“ beginnt. Im ersten Programmcode soll der Fall vorgestellt werden, wo ohne Komprimierung gearbeitet wird. Zunächst wird explizit die globale Komprimierungsoption ausgeschaltet. Der erste DATA-STEP kopiert die Urdaten Eins zu Eins in eine neue Datei (für sich allein nutzlos, hilfreich jedoch beim Zeitvergleich beider Alternativen). Dann werden im zweiten DATASTEP aus der unkomprimierten Zwischentabelle die gewünschten Datensätze herausgefiltert und in die unkomprimierte Endtabelle geschrieben. OPTIONS COMPRESS = NO; DATA ZwischentabelleUnkomprimiert; SET UrTabelle; RUN; DATA EndtabelleUnkomprimiert; SET ZwischentabelleUnkomprimiert; WHERE (Substr (BenutzerNachname, 1, 1) NE "A"); RUN; 31 Im optimierten Fall wird zunächst die Urtabelle mit Hilfe der lokalen Komprimierungsoption in eine kompakte Zwischentabelle Eins zu Eins übertragen. Im zweiten DATA-STEP wird aus der komprimierten Zwischentabelle eine komprimierte Endtabelle mit der gewünschten Selektion erstellt. DATA ZwischentabelleKomprimiert (COMPRESS = CHAR); SET UrTabelle; RUN; DATA EndtabelleKomprimiert (COMPRESS = CHAR); SET ZwischentabelleKomprimiert; WHERE (Substr (BenutzerNachname, 1, 1) NE "A"); RUN; Das gleiche Ergebnis wird erzielt, wenn zu Beginn die (globale) SAS-Option COMPRESS = CHAR gesetzt wird: OPTIONS COMPRESS = CHAR; DATA ZwischentabelleKomprimiert; SET UrTabelle; RUN; DATA EndtabelleKomprimiert; SET ZwischentabelleKomprimiert; WHERE (Substr (BenutzerNachname, 1, 1) NE "A"); RUN; sparsames Datensortieren Beim Sortieren von Daten mit PROC SORT reicht es oftmals aus, wenn die Datensätze bei gleichen Ausprägungen in den Sortiervariablen in zufälliger Reihenfolge aufgelistet und nicht nach zusätzlichen Kriterien weiter sortiert werden, was weniger Aufwand und somit ein Leistungsgewinn bedeutet. Dies kann erreicht werden, indem entweder die (globale) SAS-Option NOSORTEQUALS oder die (lokale) PROC SORT-Option NOEQUALS gesetzt wird. Zunächst das Beispiel mit lokaler Einstellung: PROC SORT NOEQUALS DATA = Urtabelle OUT = Zieltabelle; BY Strasse; RUN; Und hier das Beispiel mit globaler Einstellung und gleichem Ergebnis: OPTIONS NOSORTEQUALS; PROC SORT DATA = Urtabelle 32 OUT BY RUN; = Zieltabelle; Strasse; Datei in den Hauptspeicher laden Wird eine Datei wird im Gesamtablauf häufig gelesen bzw. modifiziert, so lohnt es sich, diese Datei mittels dem Befehl SASFILE in den Hauptspeicher zu laden, wodurch der Zugriff auf diese Datei sehr schnell von statten geht. Dies funktioniert natürlich nur, wenn die Datei nicht zu groß bzw. der Arbeitsspeicher genügend groß ist. Laden einer Datei in den Hauptspeicher: SASFILE Arbeitstabelle LOAD; Die Datei entladen und somit den verwendeten Hauptspeicher freigeben: SASFILE Arbeitstabelle CLOSE; Views statt Zwischentabellen Werden die Ursprungsdaten in aufeinander folgenden Schritten stark und auf komplexe Weise modifiziert, das Abspeichern von Zwischentabellen lohnt jedoch nicht, da sich z.B. die Ursprungsdaten über die Zeit zu sehr verändern, dann bieten sich Views an, deren Erstellung im Hauptspeicher und via schnellen temporären Tabellen stattfindet und praktisch keinen Speicherplatz benötigt. Nachteilig ist, daß bei jedem Zugriff auf die View die Ursprungsdaten erneut gelesen und gegebenenfalls komplex verarbeitet werden müssen, weshalb sich Views vor allem für einmaliges „Nachschlagen“ eignen - bei öfterem Nachschlagen könnte eine per SASFILE in den Hauptspeicher geladene Zwischentabelle effektiver sein. PROC SQL NOPRINT; CREATE VIEW ViewName AS SELECT ... FROM ... [WHERE ...] [GROUP BY ...] [ORDER BY ...] ; QUIT; Hash-Tabellen verwenden Soll in einem DATA STEP gleichzeitig nach mehreren Informationen in verschiedenen Tabellen nachschlagen werden, so kann die Verwendung von Hash-Tabellen (Streuwert-Tabellen) die Suche deutlich beschleunigen. Das dabei verwendete HashVerfahren ist ein Algorithmus zum Suchen von Datenobjekten in großen Datenmengen. Es basiert auf der Idee, daß eine mathematische Funktion die Position eines Objektes in einer Tabelle berechnet. Dadurch erübrigt sich das Durchsuchen vieler Datenobjekte, bis das Zielobjekt gefunden wird; der Suchaufwand bleibt konstant (O(1)) 33 - unabhängig davon, wie viele Datensätze die Tabelle enthält. Der große Vorteil von diesem Verfahren ist neben dem schnellen Zugriff, daß mehrere Hash-Tabellen gleichzeitig verwendet werden können und so mehrere Schlüssel-Spalten und DatenSpalten genutzt werden können. Ein schlecht gewählter Hash-Algorithmus erzeugt jedoch Kollisionen, eine besondere Situation, in der mehrere Datensätze denselben Hashwert erhalten. Dies benötigt eine spezielle Behandlung durch das Verfahren, was die Suchleistung deutlich senkt. Da die Verwendung von Hash-Tabellen nicht durch ein kurzes Beispiel erläutert werden kann, soll hier auf die Arbeit von Elena Muriel [7] verwiesen werden. 4.3 Excel Die Leistung von MS Excel bezüglich Tabellenkalkulation läßt sich auf verschiedene Weise verbessern. Zum einen können selbsterstellte Macros mit Visual Basic for Applications die verfügbare Funktionalität drastisch erhöhen, zum anderen bieten Add-Ins hilfreiche Erweiterungen, um mit der gewöhnlichen Zellbezugtechnik aufwendigere Lösungswege zu beschreiten. Den ersten Ansatz effizient zu verwenden ist nichts anderes, als was für Matlab und R im vorherigen Abschnitt vorgestellt wurde, weswegen hier dieser Ansatz nicht weiter vertieft wird (Eine Einführung in VBAProgrammierung findet sich auf den Seiten der Fernuni Hagen [8]). Zum zweiten Ansatz soll der Solver vorgestellt werden. Die gewöhnliche Tabellenkalkulation ist dahingehend ausgelegt, aus vorgegebenen Daten ein Ergebnis aus genau definierten Zwischenschritten zu formen. Dieser Ansatz scheitert, wenn zum Lösen des Problems Parameter verwendet werden müssen, die unbekannt sind und eine unendliche Vielfalt an möglichen Ausprägungen besitzen und sie nicht durch schlichte Formeln (z.B. arithmetisches Mittel) geschätzt werden können. Dieses Problem tritt u.a. bei generalisierten linearen Modellen auf, deren Lösung meist nicht geschlossen, sondern nur iterativ bestimmt werden kann. Im Folgenden soll gezeigt werden, wie mit Hilfe des Add-Ins Solver eine logistische Regression dennoch gefittet werden kann. Im Beispiel soll die Ausfallwahrscheinlichkeit von Krediten anhand von Scores gefittet werden. Zugrunde liegen dafür 100 beobachtete Scores mit der dazugehörigen Information, ob der vergebene Kredit zurückgezahlt wurde (1: Ausfall, 0: zurückgezahlt). Die Wahrscheinlichkeit, daß ein Kredit ausfällt, soll (wegen der logistischen Regression) mittels der logistischen Verteilungsfunktion erfolgen. Der Prädiktor enthält einen Intercept und einen linearen Einfluß des Scores: exp(β0 + β1 Score) 1 + exp(β0 + β1 Score) 1 = 1 + exp(−β0 − β1 Score) P (Ausfall = 1|Score) = Die untere Formel wird wegen ihrer höheren Stabilität verwendet. In Excel-ZellbezugNotation sieht für die erste Beobachtung des Beispiels die Wahrscheinlichkeitsformel in Zeile 5 und Spalte D wie folgt aus: = 1 / (1 + EXP(-$I$5 -$J$5 * A5)) Für die Parameter β0 und β1 in den Zellen I5 und J5 empfiehlt es sich, 0 als Startwert zu verwenden. Die optimale Parameterwahl für die obige Formel soll - wie im 34 Abbildung 4.1: Add-Ins-Manager von MS Excel GLM-Ansatz auch - über die Likelihood stattfinden. Unsere Zielgröße Ausfall ist bernoulliverteilt, deren Likelihood (für eine einzelne Beobachtung) für ihren Parameter π ist somit: L(π) = π Ausfall (1 − π)1−Ausfall Erneut in Excel-Zellbezug-Notation übersetzt sieht für die erste Beobachtung des Beispiels die Likelihood in Zeile 5 und Spalte E wie folgt aus: = D5^B5 * (1 - D5)^(1 - B5) Mit Rücksicht auf die Rechenstabilität soll für die Optimierung die log-Likelihood verwendet werden, deren Berechnung in Excel für die erste Beobachtung des Beispiels in Zeile 5 und Spalte F ganz einfach berechnet wird: = LOG(E5) Die gesamte log-Likelihood ergibt sich aus den Summen der Einzel-log-Likelihoods. In dem Beispiel steht damit in Zelle G5: = SUMME(F5:F104) Dies ist nun die Zelle, deren Wert maximiert werden soll. Soweit noch nicht geschehen wird der Solver spätestens jetzt über Menü Extras/Add-Ins-Manager installiert bzw. geladen (Abbildung 4.1) und kann dann im Menü Extras/Solver gestartet werden. Abbildung 4.2 zeigt, wie die Parameter für den Solver in diesem Beispiel gesetzt werden: die Zielzelle ist G5 (gesamte log-Likelihood), dieser Wert soll maximiert werden und die veränderbaren Zellen sind I5 und J5 (Parameter der logistischen Regression). Das Ergebnis zeigt Abbildung 4.3. Die zusätzliche Graphik zeigt zum einen die Datengrundlage (X-Werte: Zellen A5:A104, Y-Werte: B5:B104) und die Kurve der bedingten Wahrscheinlichkeiten für einen Kreditausfall gegeben dem Score (X-Werte: Zellen A5:A104, Y-Werte: D5:D104). Damit die Kurve der Wahrscheinlichkeiten einen optisch ansprechenden Verlauf vernimmt, müssen die Score-Werte in Spalte A geordnet aufgelistet sein. 35 Abbildung 4.2: Eingabefenster für Solver-Parameter Abbildung 4.3: mit Solver optimierte Lösung der logistischen Regression 36 4.4 abschließende Anmerkung Gelangt man beim Optimieren zu dem Punkt, an dem man sich den Kopf darüber zerbricht, ob der neu geschaffene Code die zu Grunde liegende Berechnung richtig ausführt, dann sollte man von dem Wunsch einer verbesserten Leistung lieber Abstand nehmen. Folgenden Spruch sollte man sich stets bei Optimierungen im Hinterkopf halten: Code, der ungenaue oder sogar falsche Ergebnisse liefert, ist unbrauchbar, egal wie schnell er ist! 37 Kapitel 5 Zusammenfassung Wegen des eigenen Dateneditors und der leichten Bedienung geeignet sich PASW gut für Statistik-Einsteiger und Standardanalysen. Durch seine leistungsstarke Datenbank-Engine bietet sich SAS vor allem für die Auswertung riesiger Datenmengen an, die zudem von unterschiedlichen Systemen erstellt und abgelegt wurden. Da R und Matlab als Programmiersprachen eine hohe Flexibilität aufweisen, eignen sie sich für selbstkonzipierte, rechenintensive Verfahren wie z.B. Simulationen. Bei den im Seminar besprochenen mathematischen und statistischen Modellen bieten beide Programme den größten Umfang an bereitgestellten Funktionen an. Excel ist aufgrund seiner Schlichtheit eher für einfache Berechnungen und Dateneingaben geeignet. 38 Literaturverzeichnis [1] H. Nagel and R. Hatzinger. PASW statistics. Pearson Education, 2009. [2] Sas Institute Inc. SAS/STAT 9.1 User’s Guide. SAS Publishing, 2004. [3] Wolfgang Schweizer. GmbH, 2008. MATLAB kompakt. Oldenbourg Wissenschaftsverlag [4] Uwe Ligges. Programmieren mit R. Springer Berlin Heidelberg New York, 2007. [5] Venables, Smith, R Development Core Team. Pfad]\doc\manual\R-intro.pdf, 2010. An Introduction to R. [R- [6] R Development Core Team. R Language Definition. [R-Pfad]\doc\manual\Rlang.pdf, 2010. [7] Elena Muriel. Hashing Performance Time with Hash http://www2.sas.com/proceedings/forum2007/039-2007.pdf, 2007. Tables. [8] Johannes Gogolok. VBA: Programmierung mit Excel. ftp://ftp.fernunihagen.de/pub/pdf/urz-broschueren/broschueren/b012.pdf, 1999. 39