{"id":926,"date":"2016-05-26T01:23:06","date_gmt":"2016-05-25T23:23:06","guid":{"rendered":"http:\/\/hobbykeller.spdns.de\/?p=926"},"modified":"2021-06-12T14:25:11","modified_gmt":"2021-06-12T12:25:11","slug":"was-man-von-panini-ueber-derivatpricing-und-broker-lernen-kann","status":"publish","type":"post","link":"https:\/\/hobbykeller.spdns.de\/?p=926","title":{"rendered":"Was man von Panini \u00fcber Derivatpricing und Broker lernen kann"},"content":{"rendered":"<figure id=\"attachment_928\" aria-describedby=\"caption-attachment-928\" style=\"width: 200px\" class=\"wp-caption alignleft\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-928\" src=\"http:\/\/hobbykeller.spdns.de\/wp-content\/uploads\/2016\/05\/panini.jpg\" alt=\"Blick auf den Wohnzimmertisch\" width=\"200\" height=\"200\" srcset=\"https:\/\/hobbykeller.spdns.de\/wp-content\/uploads\/2016\/05\/panini.jpg 200w, https:\/\/hobbykeller.spdns.de\/wp-content\/uploads\/2016\/05\/panini-150x150.jpg 150w\" sizes=\"auto, (max-width: 200px) 100vw, 200px\" \/><figcaption id=\"caption-attachment-928\" class=\"wp-caption-text\">Blick auf den Wohnzimmertisch<\/figcaption><\/figure>\n<p>Wer Kinder im Grundschulalter hat, erf\u00e4hrt zwangsl\u00e4ufig, dass ein fu\u00dfballerisches Gro\u00dfereignis naht. Sobald die Abziehbildchen aus dem Hause Panini (oder zumindest die leeren R\u00fcckseiten) wild in der gesamten Wohnung verstreut liegen, wei\u00df man: Es ist wieder soweit. F\u00fcr Eltern (und Lehrer), denen dieser Sammelwahn ein Dorn im Auge ist, gibt es aber zumindest eine tr\u00f6stliche Nachricht: Wer sich ein wenig mit dem Panini-Universum besch\u00e4ftigt, lernt dabei mehr \u00fcber das Investment-Banking als in so manch einem Universit\u00e4tsseminar (zumindest wenn es sich um ein Seminar der BWL handelt&#8230;)<!--more--><\/p>\n<h1>Was kostet das klebrige Vergn\u00fcgen?<\/h1>\n<p>Aufmerksam auf die Gemeinsamkeiten zwischen Panini und Investment-Banking wurde ich j\u00fcngst durch einen <a href=\"http:\/\/www.welt.de\/sport\/fussball\/em-2016\/article155477726\/So-teuer-ist-ein-volles-Panini-Album-zur-EM-2016.html\" target=\"_blank\" rel=\"noopener noreferrer\">Beitrag in der Welt<\/a>, der sich damit besch\u00e4ftigt, wie hoch der Erwartungswert der Ausgaben ist, die man t\u00e4tigen muss, um das Sammelalbum zu komplettieren. In Kurzform lauten die &#8220;Spielregeln&#8221; wie folgt:<\/p>\n<ul>\n<li>Es gibt 680 Klebebildchen, Panini beteuert, dass jedes Bild in gleichen Mengen produziert wird und die Wahrscheinlichkeit, dass ein Bild in einem T\u00fctchen enthalten ist, f\u00fcr jeden Spieler identisch ist (sogar f\u00fcr Christiano Ronaldo&#8230;)<\/li>\n<li>Das Sammelalbum selbst kostet 2 EUR.<\/li>\n<li>Eine 5er-Packung Bildchen kostet 70 Cent, wobei niemals ein Bild mehrfach in einer Packung enthalten ist.<\/li>\n<\/ul>\n<h2>Zwei Experten, zwei Meinungen<\/h2>\n<p>Der besagte Artikel in der Welt zitiert zwei Experten, die gleich zwei unterschiedliche Antworten geben: Ein Experte kommt zu dem Ergebnis, dass im Schnitt 522 EUR verausgabt werden, bis das Album komplett ist, ein zweiter Experte kommt auf ein Ergebnis von 672 EUR.<\/p>\n<p>Nanu?!? &#8211; Werden Sie sich denken. Hier handelt es sich doch um eine mathematische Problemstellung, f\u00fcr die es eine &#8211; und nur eine &#8211; korrekte L\u00f6sung geben kann. Mal ganz nebenbei: Es ist ein weit verbreiteter Irrtum, dass mathematische Probleme immer nur eine einzige richtige Antwort haben. Jenseits der Schulmathematik hei\u00dft es oft &#8220;kommt drauf an&#8221; &#8211; so zum Beispiel bei <a href=\"https:\/\/youtu.be\/_FTYrQtrDps?t=846\" target=\"_blank\" rel=\"noopener noreferrer\">Bertrand&#8217;s Paradox<\/a>. Unser Panini-Problem ist gef\u00fchlt allerdings noch im Bereich der &#8220;eindeutigen&#8221; Mathematik &#8211; ein Experte muss sich also irren. Interessanterweise haben die beiden Mathematikprofessoren unterschiedliche Pfade beschritten: Der erste Professor hat versucht, die Aufgabe mit Hilfe des <a href=\"http:\/\/www.walesonline.co.uk\/sport\/football\/football-news\/maths-genius-worked-out-exactly-11120318\" target=\"_blank\" rel=\"noopener noreferrer\">klassischen Instrumentariums der Wahrscheinlichkeitsrechnung<\/a> zu l\u00f6sen.<\/p>\n<p>Der zweite Professor hat einen g\u00e4nzlich anderen Weg eingeschlagen:<\/p>\n<blockquote><p>Behrends habe dies mit einer Computersimulation herausgefunden, in der er eine Million Mal den Versuch durchspielen lie\u00df, ein komplettes Album zu f\u00fcllen.<\/p><\/blockquote>\n<h1><\/h1>\n<h1>Die Monte-Carlo-Simulation<\/h1>\n<p>Der zweite Professor hat damit genau auf das &#8220;Toolkit&#8221; zur\u00fcckgegriffen, was im Investmentbanking unter dem Begriff &#8220;Monte Carlo Simulation&#8221; bekannt ist. Es eignet sich besonders dann, wenn eine detailgetreue Modellierung komplexer Problemstellungen erforderlich ist und ist aus dem modernen Derivatpricing nicht mehr wegzudenken.<\/p>\n<h2>Grunds\u00e4tzliche Idee<\/h2>\n<p>Kernst\u00fcck dieser L\u00f6sung ist ein Zufallszahlengenerator und die Erkenntnis, dass eine (hier durch den Mittelwert) normierte unabh\u00e4ngig identisch verteilte Zufallsvariable wie z.B. die Kosten, die bis zur Komplettierung des Sammelalbums anfallen, bei ausreichend h\u00e4ufiger Wiederholung des Experiments gegen den Erwartungswert konvergiert, sofern dieser endlich ist. (Das ist mein Versuch, das zweite kolmogorovsche Gesetz der gro\u00dfen Zahlen griffig zu formulieren &#8211; Vollblutmathematiker h\u00e4tten zu dieser Formulierung gewiss noch die eine oder andere Verbesserung&#8230;)<\/p>\n<h2>Vorgehensweise<\/h2>\n<p>Ein einzelner Simulationslauf umfasst folgende Schritte:<\/p>\n<ol>\n<li>Mit Hilfe eines Zufallszahlengenerators l\u00e4sst man ein Computerprogramm jeweils 5 \u00fcberschneidungsfreie Zahlen aus dem Bereich 1 bis 680 ziehen. Dies simuliert den Kauf einer Packung Panini-Bilder. Man kann sich das auch als Lottoziehung von 5 aus 680 Kugeln vorstellen.<\/li>\n<li>Dies f\u00fchrt man so lange durch, bis jedes der 680 Bilder einmal gezogen wurde. Jeder simulierte Kauf eines Panini-P\u00e4ckchens erh\u00f6ht die Ausgaben um 0,70 EUR.<\/li>\n<li>Die bis zur Komplettierung des Albums aufgelaufene Summe der Ausgaben stellt somit eine Realisation der Zufallsvariable &#8220;Kosten f\u00fcr ein komplettes Album&#8221; dar.<\/li>\n<\/ol>\n<p>Die Schritte 1-3 werden nun massenhaft (z.B. 1 Mio. mal) durchgef\u00fchrt, die Summe der Ausgaben aus Schritt 3 jeweils aufaddiert und am Ende durch die Anzahl der Simulationsl\u00e4ufe geteilt (mithin: gemittelt). Damit erh\u00e4lt man einen ziemlich guten Sch\u00e4tzer f\u00fcr die Ausgaben, mit denen man im Schnitt f\u00fcr ein Panini Album rechnen muss.<\/p>\n<p>Ein solches Monte-Carlo-Programm k\u00f6nnen ge\u00fcbte Programmierer in weniger als einer Stunde aufsetzen. Ich habe das Problem mal in Python ausprogrammiert, da diese Sprache komfortablerweise bereits alle n\u00f6tigen &#8220;Bauteile&#8221; (Zufallsgenerator, Listenverwaltung usw.) bereith\u00e4lt.<\/p>\n<pre class=\"lang:default decode:true \" title=\"Python-Listing Panin-EM2016 (einfach)\">import random\n\nNUMSTICKERS = 680\nSTICKERS_IN_PACKAGE = 5\nPRICE_PER_PACKAGE = 0.7\nBOOKLET_PRICE = 2.0\nNUMCOLLECTORS = 1\nSIMULATION_RUNS = 10000\n\nALL_STICKERS = tuple(range(NUMSTICKERS))\n\nclass Collection(object):\n    def __init__(self):\n        self.totalCost = BOOKLET_PRICE\n        self.needed = [1] * NUMSTICKERS\n        self.doubles = [0] * NUMSTICKERS\n        \n    def isComplete(self):\n        for n in self.needed:\n            if n==1:\n                return False\n        return True         \n                \nclass Collector():\n    def __init__(self):\n        self.collection = Collection()\n        self.isActive = True\n        \n    def buyPackage(self):\n        self.collection.totalCost += PRICE_PER_PACKAGE\n        stickersBought = random.sample(ALL_STICKERS, STICKERS_IN_PACKAGE)\n        for sticker in stickersBought:\n            if self.collection.needed[sticker] == 1:\n                self.collection.needed[sticker] = 0\n            else:\n                self.collection.doubles[sticker] += 1\n        if self.collection.isComplete():\n            self.isActive = False\n\nsum = 0.0\nfor i in range(SIMULATION_RUNS):\n    c = Collector()\n    while c.isActive:\n        c.buyPackage()\n    sum += c.collection.totalCost\nprint(\"Estimator for expected value:\", sum\/SIMULATION_RUNS)<\/pre>\n<p>Der Nachteil von Python besteht allerdings darin, dass es nicht sonderlich schnell l\u00e4uft. Das Komplettieren eines einzelnen Albums ben\u00f6tigt auf meinem Celeron 877 Prozessor rund 40 ms, so dass ich mich auf 10&#8217;000 Simulationsl\u00e4ufe beschr\u00e4nke.<\/p>\n<p>Der Erwartungswert f\u00fcr das Komplettieren eines Albums (inklusive Erwerb des leeren Sammelhefts f\u00fcr 2 EUR) bel\u00e4uft sich dabei auf 677 EUR, was schon recht nah an den 672 EUR des zweiten Professors liegt.<\/p>\n<p>Die Ergebnisse der Monte-Carlo-Simulation wurden mittlerweile auch durch eine analytische Herleitung best\u00e4tigt. Dem ersten Professor ist demnach ein Fehler bei der Modellierung der 5er-P\u00e4ckchen unterlaufen. Eine korrigierte Rechnung, die auf im Mittel rund 963 P\u00e4ckchen (also 963 x 0,7 = 674 EUR) kommt, findet sich bei <a href=\"http:\/\/stats.stackexchange.com\/questions\/208756\/expectation-of-collecting-stickers-in-groups\" target=\"_blank\" rel=\"noopener noreferrer\">Stackexchange<\/a>.<\/p>\n<h1>Warum sind Broker n\u00fctzlich?<\/h1>\n<p>Bislang enthalten alle Simulationen eine ziemlich realit\u00e4tsfremde Annahme: ein Sammler kauft f\u00fcr sich alleine so lange Bilder, bis sein Album schlie\u00dflich komplett ist. Doppelte Bilder wandern umgehend in den M\u00fcll &#8211; das sind bei 963 P\u00e4ckchen, die im Mittel erforderlich sind, 6 von 7 gekauften Bildern.<\/p>\n<p>Die Wirklichkeit sieht jedoch so aus, dass diese Bilder mit anderen getauscht werden. Hat man erst einmal das Grundprogramm geschrieben, so lassen sich diese Details aus der Wirklichkeit durch einige kleine Erweiterungen einbauen:<\/p>\n<pre class=\"lang:default decode:true \" title=\"PaniniSim mit Tausch\">import random\nimport itertools\n\nNUMSTICKERS = 680\nSTICKERS_IN_PACKAGE = 5\nPRICE_PER_PACKAGE = 0.7\nBOOKLET_PRICE = 2.0\nSTICKERS_ORDERABLE_DIRECTLY = 0\nMAIL_ORDER_COST = 10.0\n\nNUMCOLLECTORS = 5\nSIMULATION_RUNS = 100\n\nALL_STICKERS = tuple(range(NUMSTICKERS))\n\nclass Collection(object):\n    def __init__(self):\n        self.totalCost = BOOKLET_PRICE\n        self.needed = [1] * NUMSTICKERS\n        self.doubles = [0] * NUMSTICKERS\n        \n    def isComplete(self):\n        if sum(self.needed) &lt;= STICKERS_ORDERABLE_DIRECTLY:\n            return True\n        return False\n                \nclass Collector():\n    def __init__(self, group):\n        self.isActive = True\n        self.collection = Collection()\n        self.circle = group\n        self.enrollGroup()\n        self.moneySpent = BOOKLET_PRICE\n        \n    def buyPackage(self):\n        self.moneySpent += PRICE_PER_PACKAGE\n        stickersBought = random.sample(ALL_STICKERS, STICKERS_IN_PACKAGE)\n        for sticker in stickersBought:\n            if self.collection.needed[sticker] == 1:\n                self.collection.needed[sticker] = 0\n            else:\n                self.collection.doubles[sticker] += 1\n        if self.collection.isComplete():\n            if STICKERS_ORDERABLE_DIRECTLY &gt; 0:\n                self.moneySpent += MAIL_ORDER_COST\n            self.circle.groupAmountSpent += self.moneySpent\n            self.leaveGroup()\n\n    def enrollGroup(self):\n        if not self in self.circle.collectors:\n            self.circle.collectors.append(self)\n        \n    def leaveGroup(self):\n        self.isActive = False\n        if self in self.circle.collectors:\n            self.circle.collectors.remove(self)\n\nclass Group():\n    \n    @staticmethod\n    def produceIndexSet(countArray):\n        \"\"\"Helper function which produces a set of numbers from index array\"\"\"\n        indexSet = set()\n        for i, val in enumerate(countArray):\n            if (val&gt;0):\n                indexSet.add(i)\n        return indexSet\n    \n    def __init__(self):\n        self.collectors = []\n        self.cardsTraded = 0\n        self.groupAmountSpent = 0.0\n        \n    def hasActiveCollectors(self):\n        return len(self.collectors) &gt; 0\n\n    def bilateralExchange(self):\n        combos = list(itertools.combinations(self.collectors, 2))\n        for participant in combos:\n            aHas = Group.produceIndexSet(participant[0].collection.doubles)\n            aNeeds = Group.produceIndexSet(participant[0].collection.needed)\n            bHas = Group.produceIndexSet(participant[1].collection.doubles)\n            bNeeds = Group.produceIndexSet(participant[1].collection.needed)\n            aCouldGiveToB = list(aHas &amp; bNeeds)\n            bCouldGiveToA = list(aNeeds &amp; bHas)\n            numberOfTradableCards = min(len(aCouldGiveToB), len(bCouldGiveToA))\n            for cardNumber in aCouldGiveToB[:numberOfTradableCards]:\n                participant[0].collection.doubles[cardNumber] -= 1\n                participant[1].collection.needed[cardNumber] = 0\n            for cardNumber in bCouldGiveToA[:numberOfTradableCards]:\n                participant[1].collection.doubles[cardNumber] -= 1\n                participant[0].collection.needed[cardNumber] = 0\n            self.cardsTraded += numberOfTradableCards\n\nfor i in range(SIMULATION_RUNS):\n    theHood = Group()\n    folks = [Collector(theHood) for i in range(NUMCOLLECTORS)]\n    while(theHood.collectors):\n        for folk in theHood.collectors:\n            folk.buyPackage()\n        theHood.bilateralExchange()\n\nprint('Number of internally traded cards:', theHood.cardsTraded)\nprint('Average amount spent', theHood.groupAmountSpent\/NUMCOLLECTORS)<\/pre>\n<p>Bereits bei 2 Tauschpartnern erhalte ich (bei 1000 Simulationsl\u00e4ufen mit Tauschen) einen deutlich niedrigeren Sch\u00e4tzer f\u00fcr den Erwartungswert der Kosten eines vollst\u00e4ndigen Albums i.H.v. 567 EUR. Finden sich 5 Tauschpartner so verringern sich die mittleren Ausgaben auf 255 EUR.<\/p>\n<p>Voraussetzung f\u00fcr einen schnellen und optimalen Tausch ist allerdings, dass es jemanden gibt, der nachh\u00e4lt, welche doppelten Bilder jeder Teilnehmer hat und welche Bilder jeder noch ben\u00f6tigt. Genau diese Funktion erf\u00fcllt der Kursmakler (neuhochdeutsch &#8220;Broker&#8221;). Die einzelnen Marktteilnehmer melden Positionen, die sie an- oder verkaufen wollen und der Broker f\u00fchrt passende Meldungen zusammen.<\/p>\n<h2>Makler sind &#8220;KM-Systeme&#8221;<\/h2>\n<p>Die Simulationsergebnisse verdeutlichen zwei Sachverhalte:<\/p>\n<ol>\n<li>Durch Tauschen k\u00f6nnen die Sammelkosten deutlich gesenkt werden.<\/li>\n<li>Je mehr Mitglieder untereinander tauschen, desto st\u00e4rker ist die Ersparnis jedes einzelnen Mitgliedes.<\/li>\n<\/ol>\n<p>Insbesondere der zweite Punkt hatte eine besondere Bedeutung f\u00fcr den Konzentrationsprozess bei den Kursmaklern. Broker sind Kritische-Masse-Systeme: je mehr Kunden das System nutzen, desto besser funktioniert es &#8211; und das nicht etwa nur weil die Fixkosten auf mehr Gesch\u00e4fte umgelegt werden k\u00f6nnen, sondern vielmehr weil der unter 2. beschriebene Netzwerkeffekt sich entfaltet. Es ist \u00e4hnlich wie bei WhatsApp: Es gibt eine Menge von Instant Messenging Systemen die mindestens genauso komfortabel wie WhatsApp sind und dabei weniger ausfall- oder spionageanf\u00e4llig sind. Die Vorteilhaftigkeit von WhatsApp f\u00fcr jeden einzelnen ergibt sich vielmehr daraus, dass alle anderen dieses System nutzen.<\/p>\n<p>Gewiefte Broker wie Michael Spencer erkannten dies Ende der 90er Jahre und begannen, ihren Kundenkreis dadurch zu erweitern, dass sie in gro\u00dfem Stil kleine Maklerfirmen aufkauften und deren Kunden an das eigene Netzwerk anschlossen.<\/p>\n<h2>Die Fintechs sind die neuen Broker<\/h2>\n<p>Wie so oft im Prozess der kreativen Zerst\u00f6rung wird jedoch das Gesch\u00e4ftsmodell der klassischen &#8220;Voice Brokerage&#8221;, bei dem die Gesch\u00e4fte per Standleitung gemakelt werden, vom technischen Fortschritt bedroht: Wie auch im Panini-Spiel wird der Leistungskern &#8211; n\u00e4mlich die Verwaltung und Auswertung der Informationen durch die IT erbracht. Die Software h\u00e4lt Buch dar\u00fcber, welcher Sammler welche Bilder doppelt hat und welche er noch ben\u00f6tigt. Und es ist die Software, die schneller als jeder Mensch passende Tauschpartner zusammenf\u00fchrt.<\/p>\n<p>Nichts anderes widerfuhr auch bei den Brokern: Die Makler selbst waren lediglich die Schnittstelle, \u00fcber die die Banken ihre Suchmeldungen ins System einspeisten. Es war nur ein kleiner Schritt, die bestehende Software um eine Internetschnittstelle zu erweitern, \u00fcber die nunmehr die Banken ihre Auftr\u00e4ge in direkt in das Matching-System der Makler einspeisen konnten.<\/p>\n<p>Obgleich die gro\u00dfen Voice-Broker eigentlich in einer idealen Lage gewesen w\u00e4ren, diesen Wandel zu vollziehen &#8211; sie verf\u00fcgten bereits \u00fcber Kunden und Matching-Software &#8211; haben sie diese Entwicklung jedoch weitgehend verschlafen &#8211; vermutlich auch deshalb, weil die Voice Broker als etablierte und ges\u00e4ttigte Senior Partner der gro\u00dfen Maklergesellschaften keine besondere Lust versp\u00fcrten, sich durch eine Mitwirkung am neuen elektronischen Handel noch schneller \u00fcberfl\u00fcssig zu machen. Abger\u00e4umt haben den Markt Firmen wie TradeWeb (\u00fcber die ein Gro\u00dfteil des Interbanken-Zinshandels l\u00e4uft) oder 360T (Devisengesch\u00e4fte).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer Kinder im Grundschulalter hat, erf\u00e4hrt zwangsl\u00e4ufig, dass ein fu\u00dfballerisches Gro\u00dfereignis naht. Sobald die Abziehbildchen aus dem Hause Panini (oder zumindest die leeren R\u00fcckseiten) wild in der gesamten Wohnung verstreut<span class=\"more-button\"><a href=\"https:\/\/hobbykeller.spdns.de\/?p=926\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\">Was man von Panini \u00fcber Derivatpricing und Broker lernen kann<\/span><\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,64],"tags":[189,188,191,187,186,132,190],"class_list":["post-926","post","type-post","status-publish","format-standard","hentry","category-derivate","category-linux","tag-broker","tag-derivatpricing","tag-fintechs","tag-monte-carlo-simulation","tag-panini","tag-python","tag-tausch"],"_links":{"self":[{"href":"https:\/\/hobbykeller.spdns.de\/index.php?rest_route=\/wp\/v2\/posts\/926","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hobbykeller.spdns.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hobbykeller.spdns.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hobbykeller.spdns.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hobbykeller.spdns.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=926"}],"version-history":[{"count":11,"href":"https:\/\/hobbykeller.spdns.de\/index.php?rest_route=\/wp\/v2\/posts\/926\/revisions"}],"predecessor-version":[{"id":1506,"href":"https:\/\/hobbykeller.spdns.de\/index.php?rest_route=\/wp\/v2\/posts\/926\/revisions\/1506"}],"wp:attachment":[{"href":"https:\/\/hobbykeller.spdns.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=926"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hobbykeller.spdns.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=926"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hobbykeller.spdns.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}