Skip to content

Instantly share code, notes, and snippets.

@dmasad
Created January 22, 2014 01:16
Show Gist options
  • Save dmasad/8551851 to your computer and use it in GitHub Desktop.
Save dmasad/8551851 to your computer and use it in GitHub Desktop.
Code for Zero Intelligence Traders in the Jungle. http://davidmasad.com/blog/zi-traders-in-the-jungle/
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"%matplotlib inline"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from __future__ import division\n",
"\n",
"from ZI_Model import Market\n",
"\n",
"# For plotting and analysis:\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas\n",
"\n",
"matplotlib.rcParams['figure.figsize'] = [12, 6]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"market_size = 50 # Number of buyer, seller agents\n",
"max_value = 100 # Maximum agent valuation\n",
"max_strength = 100 # Maximum agent strength\n",
"max_iterations = 10000 # Iterations to equilibrium\n",
"\n",
"market = Market(max_value, max_strength, True, market_size, market_size, max_iterations) "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"market_data = market.find_supply_demand()\n",
"q_est = market_data[\"q\"] # Estimated equilibrium quantity\n",
"p_est = market_data[\"p\"] # Estimated equilibrium price \n",
"\n",
"# Supply and demand curves; quantity implicit in the index.\n",
"supply = market_data[\"supply\"] \n",
"demand = market_data[\"demand\"]\n",
"\n",
"q_line = range(1, market_size+1)\n",
"\n",
"print \"Estimated quantity:\", q_est\n",
"print \"Estimated price:\", p_est\n",
"\n",
"fig = plt.figure(figsize=(6,6))\n",
"ax = fig.add_subplot(111)\n",
"plot = ax.step(q_line, supply, q_line, demand)\n",
"vline = ax.axvline(x=q_est, ymin=0, ymax=p_est/max_value, color='k', linestyle='--')\n",
"hline = ax.axhline(y=p_est, xmin=0, xmax=q_est/market_size, color='k', linestyle='--')\n",
"label = ax.set_xlabel(\"Quantity\", fontsize=14)\n",
"label = ax.set_ylabel(\"Price\", fontsize=14)\n",
"legend = ax.legend(plot, [\"Supply\", \"Demand\"], loc=(1.03, 0))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Estimated quantity: 26\n",
"Estimated price: 57.009779338\n"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nm8vpdKpLly564IEHdMcddxgdWsiQoIEwoBc3GqKuBBwocdudw+HQihUrNHjwYJWXlys/P1+PPPKI\n/vGPf+j3v/+90eGFBCVuIAy4zAoInrZt2yotLU1Lly7V/PnztXfvXp04cULTpk3TNddcI7fbrUmT\nJun48eOSpPz8fMXHx+uVV17Rz372M/Xo0UNr167Vp59+qn79+ql9+/bKycnxf/7GjRs1YMAAXXHF\nFerYsaMeeughVVVV+bdHRUXp7bffVnJyslwulx588EH/ttOnT2vatGmKjY1VSkpKk/p1k6ABAJbU\nr18/derUSZs2bdITTzyhrVu3auXKlVq/fr127dql3/72t/7X/vjjj/r666+1adMm3X333brnnns0\nf/58LVmyRO+++65mz57tT8LR0dGaP3++Dh06pD//+c96//339Yc//KHGdy9atEhLlizRmjVr9Oab\nb2r16tWSpD/96U/Ky8vTli1btHbtWi1cuLDerUQvRIkbAFBvwSixB/Ma706dOun777/Xq6++qo8+\n+kg9e/aUJD3yyCOaOnWq5syZI+nMyHbGjBmKiYnR+PHjNX36dI0bN04JCQlKSEhQp06d9Le//U0e\nj0d9+vTxf/7AgQN17733at26dXrkkUf8z0+ePFndunXzv2bbtm0aNmyY3nnnHY0ePVpxcXGSpKys\nLH322WeN+t1I0ACAegtmcg2GwsJCdejQQZWVlbrtttv8z/t8vhorpzt27KiYmBhJktvtliT17t3b\nv93tduvgwYOSpN27d2vq1Kn68ssvVVlZqVOnTqlv3741vjc5ObnGZ1dUVEiSioqKamxLSUlp9O9G\niRsAYElffPGFioqKlJqaqtatW2v16tXyer3yer06fPiwjh492qjPnTRpkjp06KC9e/fqyJEjevTR\nR+t9mVTHjh21ZcsW/8+bN29uVAwSCRoICxaJIVjOXoJV28OV4zI6vJA62xbz6NGjWrFihcaMGaOH\nHnpI//qv/6qJEydq+vTp2rx5s06fPq3CwkJ99NFHjfqeNm3ayOl0KioqSp988onefPPNS8Z1Nra7\n7rpL77zzjgoLC+X1evXWW281KgaJBA2ExaxZs4wOATZR9niZfDN8tT68x71GhxdSaWlpuvzyy9Wr\nVy/NnTtXc+bM0QsvvCBJysnJ0XXXXac77rhDV1xxhW6++Wbt3r3b/94LF2rVtXBr5syZ2rp1q+Lj\n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\n",
"text": [
"<matplotlib.figure.Figure at 0x1094aa310>"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Traditional (non-coercive) model"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Traditional ZI Traders model\n",
"\n",
"market.coercion = False\n",
"all_prices = []\n",
"all_quantities = []\n",
"all_surplus = []\n",
"\n",
"for i in range(100):\n",
" market.reset_market()\n",
" market.run_market()\n",
" prices = [sale[2] for sale in market.transactions]\n",
" all_quantities.append(len(prices))\n",
" all_prices += prices\n",
" all_surplus += market.get_surplus()\n",
" \n",
"fig = plt.figure(figsize=(14,6))\n",
"ax1 = fig.add_subplot(121)\n",
"hist = ax1.hist(all_prices, bins=range(0,105,5))\n",
"xlab = ax1.set_xlabel(\"Price\", fontsize=14)\n",
"ylab = ax1.set_ylabel(\"Count\", fontsize=14)\n",
"\n",
"ax2 = fig.add_subplot(122)\n",
"hist = ax2.hist(all_quantities, bins=range(20,40,1))\n",
"xlab = ax2.set_xlabel(\"Quantity traded per run\", fontsize=14)\n",
"ylab = ax2.set_ylabel(\"Count\", fontsize=14)\n",
"\n",
"print \"Mean price:\", np.mean(all_prices)\n",
"print \"Mean quantity:\", np.mean(all_quantities)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Mean price: 55.461523649\n",
"Mean quantity: 27.19\n"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\njb4o2WvO7lNDhw5lLfaw2vpddna2oqOjlZiYqMTERK1du9a3hfqpX375Rb1791ZCQoKSk5OVk5Mj\niWPYnWqbY45h93PH736G6QfvFK2qqtI111zjdO2IN99807Z/qSspKVFJSYkSEhJUVlam7t27a926\ndXrttdfUtm1bzZgxQ7Nnz9aRI0c0a9YsX5frE3PnztUXX3yh8vJyrVy5UjNmzGBuJGVlZal///4a\nM2aMKisrdfz4cf3hD3+w/dwcPnxYSUlJ+uqrr9SkSRMNGjRIkyZN0scff2zLufn000/VvHlz3X33\n3dq5c6ck1fozVFBQoBEjRmjLli0qKipSWlqadu/eraAgS/3dzSNYiz2vtjl+++23FRYWpqlTp/q6\nRL934sQJNW3aVCdPnlRSUpLef/99LVy4kGPYjVzN8bJlyziG3cwdv/v5Rec6+9oRoaGhjmtH2FX7\n9u2VkJAgSWrbtq169uypoqIirVy5UllZWZJqfgFevny5L8v0mQMHDmj16tUaN26c4wxRzI30008/\n6dNPP9WYMWMk1WwLatGiBXMjqUmTJjJNUz/99JN+/vlnnThxQi1btrTt3PTt21etWrVy+lptc7Fi\nxQplZmYqNDRUMTExio2NVX5+vtdr9gXWYs+rbY4lzgDoLk2bNpUkVVRUqKqqSo0bN+YYdrOz57iy\nslKNGzeWxDHsTu763c8vgpGra0ecWRjtbu/evdq1a5eSk5NVWlqqyMhISVJkZKRKS0t9XJ1vTJky\nRc8995zTX6yZG6mwsFDt2rXTqFGj1L17d91zzz06ceIEc6OaYPTSSy8pJiZG7du314033qjevXsz\nN2epbS4OHjzodGY2u67PrMWed2aO+/TpI0lasGCBunbtqrFjx+ro0aM+rs5/VVdX67rrrlNkZKQm\nTJigTp06cQy72dlzfP/996tTp06SOIbdyV2/+/lFMOICYa5VVFRo+PDhysnJUfPmzZ1uMwzDlvO2\natUqRUREKDExsda/xNh1biorK7VlyxYNGzZMW7Zs0cmTJ/XOO+843ceuc/PPf/5T9913nwoKCrRv\n3z5t3rxZq1atcrqPXefGlYvNhd3mibXY886e42bNmum+++5TYWGhNm/erODgYE2bNs3XJfqtoKAg\nbd++XXv37tWLL76oL7/80ul2juGGczXHHMPu487f/fwiGHHtiPOdPn1aw4YN01133aXbbrtNUk0a\nLikpkSQVFxcrIiLClyX6xKZNm7Ry5UpdeeWVyszM1CeffKKRI0cyN6r5S36bNm00ePBgNWnSRJmZ\nmVq7dq3at29v+7nJz89XcnKyYmNj1aZNG91xxx369NNPOW7OUttcnLs+HzhwQFFRUT6p0RdYiz3P\n1RxHRETIMAy1aNFCEyZMsM32TU+KiYlRenq61q9fzzHsIWfPMcew+7jzdz+/CEZcO8KZaZoaO3as\nunXr5jh7liRlZGRo6dKlkqSlS5dqyJAhvirRZ5555hnt379fhYWFys3N1YABA/T6668zN6rZqx8b\nG6vPP/9c1dXV+uCDD3TTTTdp8ODBtp+bvn37auvWrTp8+LBOnjypNWvWaODAgRw3Z6ltLjIyMpSb\nm6tTp06psLBQe/bsUa9evXxZqtewFntebXNcXFwsqeaV8GXLljmdQRGXrqyszLGF69ChQ1qzZo3i\n4uI4ht2otjk+8ws7x3DDufV3P9NP5OXlmQkJCWb37t3NefPm+bocn/r0009NwzDM6667zkxISDAT\nEhLMNWvWmMeOHTNvu+02My4uzhwyZIhZXl7u61J9Ki8vzxw8eLBpmiZz86tvvvnG7N27t9mlSxdz\nyJAhZkVFBXPzq9dee83s16+fef3115uPPfaYWVVVZdu5GT58uNmhQwezUaNGZnR0tLl48eILzsXz\nzz9vdu/e3UxISDA3bNjgw8q9i7XY81zN8erVq82RI0eacXFxZlJSkjllyhSzpKTE16X6pR07dpiJ\niYlmfHy8OXDgQPPVV181TZOe6U61zTHHsGc09Hc/vzhdNwAAAAB4kl9spQMAAAAATyIYAQAAALA9\nghEAAAAA2yMYAQAAALA9ghHgBaNGjdLgwYN9XQYAwCL8uS/cf//9Sk1NbdAYZWVlCgoK0oYNG9xU\nFdBwBCOgjkaNGqWgoCAFBQWpUaNG6tKli6ZPn64TJ07U+pgFCxbojTfe8GKVAGBPP/30kyZNmqTr\nrrtOYWFhio+P1wMPPKBjx475pJ68vDwFBQXp8OHDTl8/ty+kpKRo4sSJDX6+7Oxsr1wTxzAMjz8H\n4G0EI6CODMPQ7373O5WUlOjrr7/WhAkTNG/ePE2fPv28+1ZWVkqSwsLCFB4e7u1SAcBWiouLFRcX\np/Xr1+vZZ5/V9u3bNWvWLG3YsEFxcXEqLS31WW3nXh3F133h9OnTDXq8P1/t5UxvvpiGzhH8D8EI\nqCPTNNWoUSNFRESoS5cumjp1qgYOHKjly5dr5syZiouL04oVK3T99derWbNmOn78uMstEwsXLlRi\nYqKaN2+ujh076pFHHnHcdujQIY0ePVpXXHGFWrdurUGDBmnv3r3e/lYBwK9MmzZNpmlq8+bNSk9P\nV+fOnZWenq5NmzapqqpKU6dOddzX1Ss0567Va9euVd++fdW6dWu1adNGt9xyi/7v//7Pcfu+ffsU\nFBSktWvXaujQoWrTpo26deumjz76yHH7gAEDJEnt2rVTUFCQxowZc95zjRo1Shs2bNALL7ygoKAg\nBQcHa9++fYqNjdWcOXOcatyzZ4+CgoK0bdu2877/JUuW6KmnntKuXbscOxv+8pe/SJLj85EjR6pD\nhw569NFHVV1drbFjx6pz585q2rSprr76aj333HPnhZ4nn3xSHTt21JVXXqmZM2e6nPuXX37Z6VW6\nc3dJFBQUqG/fvmrVqpVSU1Od5rE2Z/6PHn/8cV155ZXq1KmTnnrqKaf7VFZW6umnn9a1116rsLAw\n9erVS//zP//juP3MK3abNm1SWlqawsPDnW4/m6s5cvWK35n/93/84x9Oz5Gfn6+0tDS1bNlSPXv2\n1JdffnnR7xHWQjAC6uHcLQTNmzfXyZMnJUnff/+9XnnlFb366qv68ssvddlll8kwDKfHPPvss5ox\nY4YmTZqknTt36r333tMVV1whqWaR79+/v44dO6aFCxdq1apVuuyyy5SWlqaff/7Ze98kAPiRkydP\n6p133tGECRPUpEkTp9uaNm2q8ePH6+2333a8WnDuuuzqaydOnNDUqVO1ZcsW5ebmyjAMDR48+LxX\nEiZPnqz+/fvrww8/VJcuXTR8+HAdP35cnTp10rvvviupJhiUlJRo3rx55z3X/Pnz1adPH40ZM0Yl\nJSUqLi5Wp06dNG7cOL322mtOz7V48WIlJiYqISHhvDkYPny4pk2bpmuuuUYlJSUqKSnRf/7nfzpu\nf+ihh5SamqrNmzdrwoQJqq6uVnR0tN555x1t27ZNEydO1BNPPOH0nM8995zmzZunnJwcrV27VmVl\nZXrzzTed5mnWrFmaPXu2HnjgAf39739XVlaWxowZo9WrV0uSKioqlJqaqssvv1yfffaZHn74Yd17\n770X+u90WLZsmX766Sd9+OGHmjNnjubOnaucnBzH7ffff7/ee+89Pf744/rss880cOBA/du//Zt2\n7NjhNM6ECRP00EMPaceOHerVq1etz3f2HI0fP/6Sajxj/PjxyszM1KpVq9SoUSPdeeeddXo8LMAE\nUCdZWVnmoEGDTNM0zV9++cVcvny52bRpU3P48OFmdna2aRiG+Y9//OOCj2nSpIn5yiuvuBz/r3/9\nq9m2bVuzvLzc8bWysjLzsssuM99++20PfVcA4N927txpGoZhLl++3OXt7733nmkYhllQUGCapmmm\npKSYEydOdLrP2Wu1K99++60ZFBRkfvbZZ6ZpmmZhYaFpGIb58MMPO+6zZcsW0zAMx33WrVtnGoZh\nHjp06ILP5aqe4uJiMzQ01Pz73/9umqZpVlZWmpdffrn5wgsv1Frjk08+aXbv3v28rxuGYWZkZNT6\nuLPrSktLc/y7Q4cO5r333uv49+nTp83mzZubqamppmma5smTJ81mzZqZb775ptM4w4YNM9PT003T\nNM1XXnnFNAzDLCkpcdz+zDPPmIZhmOvXr6+1lv79+5vh4eFmZWWl42v/9V//ZUZHR5umaZo//PCD\nGRwcbG7evNnpcUlJSeb48eNN0/xt/ufOnXvR793VHLn6/zvz//7FF1843efsvv7OO++YhmGYRUVF\nF31eWAevGAH1sHbtWoWFhalFixYaNmyYbr31Vi1YsECmaapt27ZKTEys9bF79uzRL7/8optuusnl\n7du3b9fRo0fVoUMHhYWFKSwsTDExMTp9+rS+++47T31LAGALp06duuT7fvvttxoxYoRiY2PVokUL\nXXfddTJNUz/88IPT/W6++WbH52fW/x9//LHBtbZv316DBg3S4sWLJdX0niNHjtT7lYiBAwee97WX\nX35Z119/vSIiIhQWFqbc3Fzt379fUs2JLEpKSpSWlua4f0hIiPr16+f49969e3XixAmNGzfO0bPC\nwsK0atUqR8/6+uuv1a1bN0VGRjoeV1sPPFe/fv0UHBzs9LiioiJVVFRo586dqq6u1u9+9zun596x\nY8d5/dLV9+7Kpd7PFU8dB/CeEF8XAPij/v37689//rNCQ0N1+eWXOy3aZy/89VFVVaWEhAS99dZb\n593WqlWrBo0NAIHqqquuUnBwsHbt2qXbbrvtvNsLCgoUHByszp07S6p5P0lVVZXTfSoqKpz+PWjQ\nIIWHh+vPf/6zoqKidPr0aSUmJp4XrsLCwhyfn+kH1dXVbvm+xo0bpxEjRuj555/X4sWLdfvtt6tF\nixb1GqtDhw5O/37rrbc0fvx4/fGPf9SAAQMUHh6u5557TmvXrr3gOOZZ70E6M4erVq1Sp06dnO4X\nGhrq8jF1caHHVVVVyTAMbd261em5JJ23nfLc7702594vKKjmNYSz/z/PPU7O8ORxAO/gFSOgHpo0\naaLOnTurY8eOTqHoUlx11VVq0qSJ482550pISNDevXvVpk0bde7c2emDYAQArjVu3Fj/8R//oRdf\nfPG8yyccP35cL7zwgoYOHer45bVdu3ZOJzA4deqUPvroI8d7Zw4dOqRvvvlGDz30kAYMGKBrrrlG\nX3/99Xlh6mIaNWokSRd9XKNGjVyeLe3mm29WeHi4XnrpJa1atcpx8oYLjXOpNW7cuFHdu3fX1KlT\nlZCQoM6dO2vDhg2OOWjRooU6dOjg1K9Onz7tdO2hq6++Wk2aNNG+ffvO61kdO3aUJHXt2tXxHqsz\nPv7440uqccOGDU7z8vHHHysqKkrNmzdXfHy8pJqzEZ773JcahC6mXbt2kuR0IoUPPvjALWPDeghG\ngJc1btxYjzzyiB5++GEtWbJE3377rfLz8/Xyyy9LkjIzM3XFFVfotttu04YNG1RYWKgNGzbowQcf\n5Mx0AHABc+bMUXBwsPr06aMPPvhAe/fu1erVq3XDDTcoPj5eixYtctx3wIAB2rp1q1566SVt2rRJ\nd999t0JCQhyvULRq1Upt27bVokWLtG3bNq1fv145OTkKCanbZpsrrrhChmHorbfeUklJiY4fP+7y\nfjExMfr888/11VdfqayszFFHcHCwxowZo4cffljR0dGOs9zV5sorr9T333+vDRs2qKys7IJbB8+E\nvTfffFPffPONnnrqKZWWljq9SjNp0iTl5ubq3Xff1TfffKNp06apcePGjvs0btxY2dnZevDBB/Xa\na69p79692rZtm15++WUtXLhQkjRixAi1bdtWkydPVkFBgf73f/9Xubm5lzR/ISEhmjZtmnbv3q2/\n/e1vevvttzVlyhTH3N57770aNWqU3n33XX333XfaunWr/vjHP+r999+/pPEv5qqrrlLHjh01e/Zs\nbd68WS+++CLXJQxgBCOgjlydyehit5379UcffVR/+MMfNHfuXMXFxenf//3fVVRUJKmmCeTl5al7\n9+4aM2aMunbtqlGjRuno0aO8YgQAF9C+fXvt3LlTKSkpevjhh9WtWzcNGjRIHTp00OrVq522Oo0Z\nM0b33HOPnnjiCWVlZal3794aPHiwY60OCgrS8uXL1ahRIw0YMECPPvqocnJy1LhxY6fnvNiFTqOi\nojRz5kw988wzioqKcpwi/Ny+8OCDD6px48bq3bu3IiMjHe/zOVPr6dOnNXr06IvOwbBhw5Senq4h\nQ4YoIiLiggHk97//vR555BFlZ2fr5ptv1pEjRzRjxgynuqZPn66JEydq8uTJGjhwoFq2bKkRI0ac\nd5+5c+fqxRdfVGJiogYOHKj333/fsW2xWbNmWrdunYqKinTDDTfo6aef1p/+9KeLzp1hGLrrrrvU\nvHlzpaWlacqUKZo0aZIjGEk1F8qdNGmSnnrqKcXFxWnw4MHauHGjYmJinMapr5CQEOXm5urQoUO6\n5ZZbtGLFCr3wwgsuz2joqn74F8Os76ZPAAAAi3vhhRc0bdo0/e1vf9OgQYN8XU69fP755/rXf/1X\nFRYWKjo62tfleE1qaqri4uI0f/58X5cCm+DkCwAAIGBNmDBBERER+uqrr5SWlqbLLrvM1yVdslOn\nTumHH37QY489pttvv91WoUiqOfECf7+HNxGMAABAQLvjjjt8XUK9LFu2TL///e+VmpqquXPn+roc\nr7vQ1nXAE9hKBwAAAMD2OPkCAAAAANsjGAEAAACwPYIRAAAAANsjGAEAAACwPYIRAAAAANsjGAEA\nAACwvf8HvmYZPUE5HDgAAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x109600c50>"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fig = plt.figure(figsize=(14,6))\n",
"ax1 = fig.add_subplot(121)\n",
"hist = ax1.hist(all_prices, bins=range(0,105,5))\n",
"xlab = ax1.set_xlabel(\"Price\", fontsize=14)\n",
"ylab = ax1.set_ylabel(\"Count\", fontsize=14)\n",
"\n",
"ax2 = fig.add_subplot(122)\n",
"hist = ax2.hist(all_surplus, bins=range(0, 105, 5))\n",
"xlab = ax2.set_xlabel(\"Surplus\", fontsize=14)\n",
"ylab = ax2.set_ylabel(\"Count\", fontsize=14)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nCpuYmBitWbNG+/fv129/+1s9/PDDeu+997RixQpNnDhR+/btU15enlauXBnuVMPmySefVHp6uvek\navZNlwULFnj/g7dv3z5df/317BtJx44d06OPPqo//vGP2rVrlw4cOKA//OEPEbtvSktLtX379m73\n+doXtbW12rBhg3bv3q3Nmzdrzpw56uzsDEfaYUWd6o46dXHUqZ5Rp3pGneou6HXK0we8/vrrni9/\n+cve3x977DHPY489FsaMzOXWW2/1/PGPf/Rcd911npaWFo/H4/E0Nzd7rrvuujBnFh4NDQ2e6dOn\ne1566SXPrbfe6vF4POwbj8dz4sQJzzXXXHPe/ewbj+fkyZOeq6++2tPY2Ohpa2vzTJkyxfPmm29G\n9L6pr6/3jBs3zvu7r33x6KOPelatWuV93pe//GXPG2+8EdpkTYA6dWHUqe6oUz2jTvlGnTpfMOtU\nnziC1NO1JxobG8OYkXkcPHhQ+/fvV15enlwul6xWqyTJarXK5XKFObvweOCBB/T4448rKuqTtzf7\nRqqvr9fIkSM1Z84cjRs3TvPnz9fJkyfZN5IGDx6sp556SikpKUpMTNRNN92k8ePHs28+xde+aGpq\n6raSW6SOz9Qp36hT56NO9Yw65Rt16uICWaf6RIPUXy46FWhtbW268847tWbNGsXGxnZ7zGKxROR+\n27p1qxISEpSVleXzeiSRum86Ojq0a9cu3X777dq1a5dOnz6t3/zmN92eE6n75v3339c999yj2tpa\nHTp0SG+88Ya2bt3a7TmRum96crF9EYn7KRJf86WgTp2POuUbdco36tRn42+d6hMNEteeON+ZM2d0\n++2366677tJtt90mqatbbmlpkSQ1NzcrISEhnCmGxeuvv67q6mpdc801Ki4u1ksvvaSSkhL2jbq+\nMRk+fLhmzZqlwYMHq7i4WNu3b1diYmLE75uamhrl5eUpLS1Nw4cP1x133KFXX32V982n+NoX547P\nhw8fVlJSUlhyDCfq1PmoUz2jTvlGnfKNOnVxgaxTfaJB4toT3Xk8Hs2bN09jx471rmIiSQUFBaqo\nqJAkVVRUqLCwMFwphs2jjz6qhoYG1dfXq7KyUtOmTdPGjRvZN5ISExOVlpamt956S52dnXr++ec1\nffp0zZo1K+L3zaRJk/T222/r2LFjOn36tLZt26YZM2bwvvkUX/uioKBAlZWVam9vV319verq6pSb\nmxvOVMOCOtUddco36pRv1CnfqFMXF9A6FeDzpYLG6XR6MjMzPePGjfM8+eST4U4nrF599VWPxWLx\nfPGLX/RkZmZ6MjMzPdu2bfO0trZ6brvtNk9GRoansLDQ43a7w51qWDmdTs+sWbM8Ho+HfWP429/+\n5hk/frwnNTXVU1hY6Glra2PfGH7xi194Jk+e7Lnhhhs8S5Ys8Zw9ezZi982dd97pGTVqlGfgwIGe\n5ORkz4YNGy64L9auXesZN26cJzMz0/PKK6+EMfPwok59gjp1aahT56NO+Uad+kSw65TF4/ExARYA\nAAAAIkyfmGIHAAAAAKFAgwQAAAAABhokAAAAADDQIAEAAACAgQYJCIE5c+Zo1qxZ4U4DAIBeO3To\nkKKiovSXv/wl3KkAQUWDBHxGc+bMUVRUlKKiojRw4EClpqbqoYce0smTJ31us27dOv36178OYZYA\ngP7o/fff14IFC3TNNdfosssuU2JiovLz8/WnP/0p3KkB/UZ0uBMA+hqLxaIvfelL2rhxo9xut6qq\nqvTwww/r5MmT+vGPf9ztuR0dHYqOjlZcXFyYsgUA9Ce333673n//fT366KPKzc3V8ePHtWPHDh07\ndqzXMdvb2zVw4MAAZgn0bRxBAj4jj8ejgQMHKiEhQampqVq0aJFmzJihLVu2aPny5crIyFBVVZVu\nuOEGXXHFFfrwww97nGK3fv16ZWVlKTY2VqNHj9Z3v/td72NHjx5VaWmprr76ag0bNky33nqrDh48\nGOqXCgAwkRMnTmjnzp1avny5iouLlZqaqhtuuEEPPvig/u3f/k2SlJKSoieeeKLbdna7Xd/85je9\nv6ekpGj16tVauHChUlJSVFJSon/84x+KiorS1q1bdcstt2jYsGG64YYb9Prrr/vMx+l0Kioqqltz\ndu40vDNnzuiRRx7RTTfdpMsvv1xXXXWVvvOd7wRytwABR4ME9ILFYun2e2xsrE6fPi1J+sc//qGf\n/vSn+vnPf649e/bosssuk8Vi6bbNY489psWLF2vhwoV69913tXnzZl199dWSuo46TZkyRa2trVq/\nfr22bt2qyy67TPn5+froo49C9yIBAKYSGxur2NhYbdu2zVtzznVuvfF133/9139p9OjReumll/To\no4/K4/FIkr75zW9q3rx5evPNNzVhwgR96UtfUlNTU69zLisr0w9/+EN997vfVW1trZ599lldf/31\nvY4HhAJT7IBe+LiQnD59Wtu3b9dzzz2ngoICSVJbW5v+8z//U5mZmd2e/+ltVqxYobVr12rOnDmS\npGuuuUY33nijJOnZZ5+Vy+XSm2++qdjYWEnSddddp+TkZG3dulV33HFHqF4mAMBEoqOjVV5ervnz\n56uyslJZWVm66aabdMcddyg3N/czxUpOTta3vvUt7++HDh2SJN1888366le/Kklas2aNysvL9dRT\nT2nFihW9yrm1tVVjxozRv/7rv0rqOno1YcKEXsUCQoUjSEAvbN++XXFxcRoyZIhuv/123XLLLVq3\nbp08Ho9GjBihrKwsn9vW1dXp1KlTmj59eo+P7927VydOnNCoUaMUFxenuLg4paSk6MyZM/r73/8e\nrJcEAOgDvvKVr6ipqUnPPfecZsyYoeeee055eXl67LHHLjmGxWLRjBkzenwsPz/f+3N0dLQmT56s\n2traXud79913q6WlRV/4whf0jW98Qy+88IL3C0PArDiCBPTClClT9LOf/UwxMTH63Oc+pwEDBngf\ns1qtfsU+e/asMjMz9eyzz5732NChQ/2KDQDo+wYNGqT8/Hzl5+dr2bJlKioq0rJly/Stb31LUVFR\n6uzs7PZ8t9t9XoxRo0Zd0t/yeDznTc/7WFRU1/fsn/57bW1t3Z6Tmpqq//3f/9XWrVu1fft2ORwO\nTZkyRb/97W8v6e8D4cARJKAXBg8erGuvvVajR4/u1hxdis9//vMaPHiwzyVZMzMzdfDgQQ0fPlzX\nXntttxsNEgDgXJ///Od19uxZnTp1SiNHjtSePXu8j7W0tOidd9655Fifrk1nzpzRK6+8ojFjxvT4\n3JEjR0pSt7/3/PPPn/e8qKgoFRQU6Cc/+Yk2bdqkLVu2yOVyXXJOQKhxBAkIsUGDBum73/2uvvOd\n72jQoEGaNGmSjh49qr/85S/6+te/ruLiYj3xxBO67bbb9Mgjj2j06NFqaGhQdXW1vv71rystLS3c\nLwEAEAZHjx7VHXfcoXnz5ikjI0MWi0Wvvvqq/vu//1vTp09XXFycpk2bpp/97Gf69a9/rVGjRunx\nxx9XfHz8JU9re/HFF/W73/1O48aN049//GN5PB7dc889PT43LS1No0eP1urVqxUbG6s9e/acd82/\nH/7wh/rc5z6nL37xi/roo49UUVHhnaIOmBUNEvAZ9bQa0MUeO/f+733vexo2bJh++MMfasGCBRox\nYoQcDoekrjnfTqdTS5Ys0dy5c9XY2KhRo0Zp2rRpHEECgAgWFxenCRMm6Mknn9TBgwd1+vRpJScn\n69///d+1ZMkSSdJ3vvMdHTp0SN/4xjeUlJSk733vezp16pTPunWutWvX6kc/+pFqamqUmpqqF198\nUZ/73Oe8j386TkxMjCorK7VgwQLdfPPNysvL049//GPZ7Xbvc+Lj4/X444+rrq5Ow4cPV35+vl58\n8UVddtllgdkpQBBYPJwpBwAAENEOHTqka6+9Vm+//bays7PDnQ4QVpyDBAAAAAAGGiQAAABc8jQ8\noL9jih0AAAAAGDiCBAAAAAAGGiQAAAAAMNAgAQAAAICBBgkAAAAADDRIAAAAAGCgQQIAAAAAw/8H\n4sKdDqCFw/gAAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x109e3ad10>"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print \"Total surplus:\", sum(all_surplus)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Total surplus: 118627.346531\n"
]
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Coercive model"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"market.coercion = True\n",
"all_prices = []\n",
"all_quantities = []\n",
"all_surplus = []\n",
"\n",
"for i in range(100):\n",
" market.reset_market()\n",
" market.run_market()\n",
" prices = [sale[2] for sale in market.transactions]\n",
" all_quantities.append(len(prices))\n",
" all_prices += prices\n",
" all_surplus += market.get_surplus()\n",
" \n",
"fig = plt.figure(figsize=(14,6))\n",
"ax1 = fig.add_subplot(121)\n",
"hist = ax1.hist(all_prices, bins=range(0,105,5))\n",
"xlab = ax1.set_xlabel(\"Price\", fontsize=14)\n",
"ylab = ax1.set_ylabel(\"Count\", fontsize=14)\n",
"\n",
"ax2 = fig.add_subplot(122)\n",
"hist = ax2.hist(all_surplus, bins=range(-100, 105, 5))\n",
"xlab = ax2.set_xlabel(\"Surplus\", fontsize=14)\n",
"ylab = ax2.set_ylabel(\"Count\", fontsize=14)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nPjOGDx/uXNfasTh06JAxYsQIo66uzigtLTWio6ONhoYGr9TtaYcPHzb+/ve/G8nJycb+/fud61s6\nJo2NjYZhGMaoUaOMoqIiwzAM49577zW2b9/uldq7o5ycHOOll166Zr0/vwZdjb+33CMqKso4ffp0\ns3X+2l9cxRN9yufOJLWE+1I0Fx4ervj4eEnSgAEDNGrUKFVUVKigoEBZWVmSpKysLG3evNmbZXpN\neXm5tm3bpvnz5ztnmuLYSOfOndPu3bs1d+5cSU3Dhm6++WaOjaS+ffvKMAydO3dO3377rWpra3XL\nLbf47bGZMGGC+vXr12xda8diy5YtysjIUFBQkKKiohQTE6Pi4mKP1+wNQ4YM0V133XXN+paOSVFR\nkSorK+VwOJyfJM+ePdtvXlOuYrQwe6A/vwZdjb+33Ofq166/9hdX8USf6hYhqaX7UlRUVHixIt9x\n9OhRHTp0SElJSaqqqpLNZpMk2Ww2VVVVebk671i4cKFWrVqlgIDvXt4cG6m0tFQDBw7UnDlzNHz4\ncD388MOqra3l2KgpJL3++uuKiopSeHi4xo8frzFjxnBsTFo7FsePH282uxvvz60fk6vXR0RE+P2x\nul7r1q1TbGys5s2bp7Nnz0riNehK/L3lHhaLRZMnT1ZCQoLWr18vib9L3MHVfapbhKT27kvhr2pq\navTggw9q9erVCg4ObvaYxWLxy+O2detWhYWFKSEhodX7lfjrsamvr9fevXs1Y8YM7d27VxcvXtQ7\n77zTbBt/PTYnT57Uo48+qpKSEh07dkx/+ctftHXr1mbb+OuxaUl7x6InHad77rlHcXFx1yzvvfee\nt0vrkVo73gUFBXr00UdVWlqqv/zlL+rVq5d++tOftrqfnvQa9CSOm3t88skn+vzzz/XWW29p+fLl\n2r17d7PH6S+u54o+5VOz27WG+1Jc69KlS5oxY4ZmzZqlBx54QFJTaj5x4oTCw8NVWVmpsLAwL1fp\neZ9++qkKCgq0bds2XbhwQdXV1crMzOTYqOmTk/79+zsns8jIyNDvf/97hYeH+/2xKS4uVlJSkmJi\nYiRJM2fO1O7du3ndmLR2LK5+fy4vL1dERIS3ynS5P/7xj9f9nJaOSWRkpCIiIlReXt5sfU86Vq7Q\nkeN9880360c/+pFmzZolqee/Bj2Jv7fcY9CgQZKkoUOHKj09XcXFxfQXN3B1n+oWZ5K4L0VzhmFo\n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\nAAAAAMDk/wEz9Jo+Vm7aqAAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x109e01090>"
]
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fig = plt.figure(figsize=(7,6))\n",
"ax1 = fig.add_subplot(111)\n",
"hist = ax1.hist(all_prices, bins=range(0,105,5))\n",
"xlab = ax1.set_xlabel(\"Price\", fontsize=14)\n",
"ylab = ax1.set_ylabel(\"Count\", fontsize=14)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nTp8+rcLCQqWlpSkpKUn79+9nu/XBxo0bNWPGDGVkZOihhx6SxJ+37ixatEhOp1MpKSn+63raViUl\nJXK5XEpPT9fevXt7XX/QhfByvji/cPPmzaqtrdWLL76ogwcPBnusQSksLEzr1q3TRx99pL/97W96\n7LHHdPDgQa1cuVIzZsxQXV2dMjMztWrVqmCPOiitX79eSUlJ/hdusd16d//99/v/A1tXV6cpU6aw\n3Xrx6aef6plnntEbb7yhmpoaHTp0SH//+9/Zbt0oLi7W9u3bL7quu21VX1+v0tJS1dbWavPmzSoq\nKlJXV1fP38AaAvbt22fdeeed/q9Xr15trV69OogTDR1z58613njjDWvy5MlWa2urZVmW1dLSYk2e\nPDnIkw0+TU1N1pw5c6wdO3ZYc+fOtSzLYrv14uTJk9akSZMuuZ7t1rMzZ85YEydOtDwej+Xz+axZ\ns2ZZ7733HtutB42NjdbUqVP9X3e3rZ555hlrzZo1/vvdeeed1rvvvtvj2kNij/By5xd6PJ4gTjQ0\nHD58WB999JEyMzPl9XrldDolSU6nU16vN8jTDT5Lly7Vs88+q5CQL/9asN161tjYqPHjx6uoqEhT\np07V4sWLdebMGbZbL0aNGqUXXnhB8fHxiomJ0a233qqbb76Z7fYNdLetjh49etHZBn3pxZAIYW/n\nF+JSPp9PCxYs0Lp16xQREXHRbQ6Hg236NVu3blV0dLTS0tK6PV+V7Xapjo4O1dTUaP78+aqpqdHZ\ns2f1yiuvXHQfttulPvnkE/3sZz9TfX29jhw5onfffVdbt2696D5st77rbVv1th2HRAg5v/CbOXfu\nnObPn6977rlH8+bNk3T+f0ytra2SpJaWFkVHRwdzxEFn3759qqqq0qRJk5Sfn68dO3aooKCA7daL\nuLg4jR07Vjk5ORo1apTy8/O1fft2xcTEsN16UF1drczMTCUmJmrs2LG6++679fbbb/Pn7Rvoblt9\nvRfNzc2KjY3tca0hEULOL+w7y7J07733Kjk52f9KNEnKzc1VeXm5JKm8vFxutztYIw5KzzzzjJqa\nmtTY2KhNmzbptttuU0VFBdutFzExMUpMTNT+/fvV1dWl1157TXPmzFFOTg7brQczZ87U+++/r08/\n/VRnz57Vtm3bdMcdd/Dn7Rvoblvl5uZq06ZNam9vV2NjoxoaGjR9+vSeFwv4TzRtsmvXLis1NdWa\nOnWqtX79+mCPM2i9/fbblsPhsG688UYrNTXVSk1NtbZt22adOnXKmjdvnpWSkmK53W6rra0t2KMO\nWrt27bJycnIsy7LYbn3w73//27r55puthIQEy+12Wz6fj+3WBy+99JL1gx/8wLrpppusJ5980urs\n7GS7dWPBggXWhAkTrPDwcCsuLs4qLS3tcVs999xz1tSpU63U1FRrz549va7vsCzewBMAYK4hcWgU\nAAC7EEIAgNEIIQDAaIQQAGA0QggMIUVFRf43BAcQGIQQCJKioiKFhIQoJCRE4eHhSkhI0COPPKIz\nZ850+5gNGzbor3/96wBOCQx/hBAIEofDodtvv12tra06ePCgHnjgAa1fv16PPPLIJfft6OiQJI0e\nPVqRkZEDPSowrBFCIEgsy1J4eLiio6OVkJCghx9+WHfccYe2bNmip556SikpKaqsrNRNN92ka665\nRqdPn77sodGNGzcqLS1NERERuu666/T444/7bzt+/LiKi4s1ceJERUVFae7cuTp8+PBAP1VgUCOE\nQBB9/c2AIyIidPbsWUnSxx9/rD/+8Y/685//rA8++EAjR4685M2FV69erWXLlunBBx/Uhx9+qM2b\nN2vixImSzu9Fzpo1S6dOndLGjRu1detWjRw5UtnZ2frss88G7kkCg1xosAcATPbFGzudPXtW27dv\n16uvvup/H12fz6enn35aqampF93/q49ZuXKlnnvuORUVFUmSJk2apGnTpkmSXn75ZXm9Xr333nv+\nTyCZPHmy4uLitHXrVt19990D9TSBQY0QAkG0fft2jR49WufOnVNHR4fcbrc2bNig559/XuPGjVNa\nWlq3j21oaNDnn3+uOXPmXPb2AwcO6OTJk5owYcJF1587d07//e9/A/o8gKGMEAJBNGvWLP3pT39S\nWFiYvv3tb2vEiBH+27740NEr1dnZqdTUVL388suX3DZmzJh+rQ0MJ4QQCKJRo0bpu9/97hU99vrr\nr9eoUaP05ptvKiEh4ZLbU1NTVVpaqrFjx+raa6/t76jAsMWLZYAh6qqrrtLjjz+uX/7ylyorK9N/\n/vMfVVdX6w9/+IMkKT8/XxMnTtS8efO0Z88eNTY2as+ePfrFL37BK0eBryCEQJB8/RWgfbnt69c/\n8cQTevrpp/X73/9eKSkp+tGPfiSPxyNJCg0N1a5duzR16lQtWrRISUlJKioq0smTJzk0CnwFn0cI\nADAae4QAAKMRQgCA0QghAMBohBAAYDRCCAAwGiEEABjt/wEuMMzLiYkTgQAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x109e48e90>"
]
}
],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fig = plt.figure(figsize=(7,6))\n",
"ax2 = fig.add_subplot(111)\n",
"hist = ax2.hist(all_surplus, bins=range(-100, 105, 5))\n",
"xlab = ax2.set_xlabel(\"Surplus\", fontsize=14)\n",
"ylab = ax2.set_ylabel(\"Count\", fontsize=14)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAcgAAAGACAYAAAApqvLrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtU1HX+x/HXIJRtQmnKYDP+lg1qk2QUTEI9tmhk1irB\ntu6JTkjYZbd7bWuX1Vrs4mXbLmK3s5bBsnXsdNajZtq2Xcios5BlWWFJG3a4b16KQS1Evr8/WCfJ\nDzLC3Biej3PmHPjOZ77f98ww8+L7+X6+n6/NsixLAACgi4hgFwAAQCgiIAEAMCAgAQAwICABADAg\nIAEAMCAgAQAw8FtAzp07V3a7XcnJyZ5l8+bN0+jRo5WamqpbbrlF3377ree+oqIiuVwupaamqry8\n3LN827ZtOuecc+RyuTR//nx/lQsAQBd+C8iCggK98sorXZZNnz5dn376qTZv3qy9e/dq8eLFkqSq\nqiqtXLlS77//vlavXq0rrrhCh07PzM/P1/Lly7V161Zt2bLliHUCAOAPfgvIKVOmaOjQoV2WnX/+\n+YqIiFBERIQuuOAC1dXVSZLWrl2r3NxcRUVFKT4+XomJiaqoqFBjY6PcbrfS0tIkSXPmzNGaNWv8\nVTIAAB6RwdrwihUrdNVVV0mSGhoalJ6e7rnP6XSqvr5eUVFRcjqdnuUOh0P19fVHrMtms/m/YABA\nv9LXieKCMkjngQceUHR0tGbPnu2zdVqWxS2Itz/96U9Br4Eb70Oo3Hgfgn/zhYDvQRYXF2vDhg16\n/fXXPcscDodqa2s9v9fV1cnpdMrhcHi6YQ8tdzgcAa0XADAwBXQP8pVXXtGDDz6odevWafDgwZ7l\nWVlZWrVqldra2lRTU6Pq6mqlpaUpLi5OMTExqqiokGVZKi0tVXZ2diBLBgAMUH7bg8zNzdVbb72l\nnTt3atSoUVq4cKEWL16strY2ZWZmSpImTpyoJ554QklJSSooKND48eMVGRmp4uJiz3HFZ599VgUF\nBdq3b59mzpypGTNm+Ktk9EFGRkawS4B4H0IF70N4sFm+6qwNIpvN5rM+ZwBA/+eLXGAmHQAADAhI\nAAAMCEgAAAwISAAADAhIAAAMCEgAAAwISAAADAhIAAAMCEgAAAwISAAADAhIAAAMCEgAAAwISAAA\nDAhIAAAMCEgAAAwISAAADAhIAAAMCEgAAAwISAAADAhIAAAMCEgAAAwISAAADAhIAAAMCEgAAAwI\nSAAADAhIAAAMCEggjMTEDJPNZuvxFhMzLNilAiHPZlmWFewi+spmsykMngbQZzabTZI3nwU+Mwhv\nvsgF9iABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEA\nMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADDwW0DOnTtXdrtdycnJnmVu\nt1vZ2dlyuVzKyclRa2ur576ioiK5XC6lpqaqvLzcs3zbtm0655xz5HK5NH/+fH+VCwBAF34LyIKC\nAr3yyitdlt13332aNGmStm7dqvT0dN1///2SpKqqKq1cuVLvv/++Vq9erSuuuEKWZUmS8vPztXz5\ncm3dulVbtmw5Yp0AAPiD3wJyypQpGjp0aJdl69atU35+vqTO4FuzZo0kae3atcrNzVVUVJTi4+OV\nmJioiooKNTY2yu12Ky0tTZI0Z84cz2MAAPCnyEBurLm5WXa7XZJkt9vV3NwsSWpoaFB6erqnndPp\nVH19vaKiouR0Oj3LHQ6H6uvrjesuLCz0/JyRkaGMjAzfPwEAQEgqKytTWVmZT9cZ0IA8nM1mk81m\n89n6Dg9IAMDA8uMdo4ULF/Z5nQEdxWq329XU1CRJamxsVGxsrKTOPcPa2lpPu7q6OjmdTjkcDtXV\n1XVZ7nA4AlkyAGCACmhAZmVlqaSkRJJUUlKi7Oxsz/JVq1apra1NNTU1qq6uVlpamuLi4hQTE6OK\nigpZlqXS0lLPYwAA8Ce/dbHm5ubqrbfe0q5duzRq1Cjde++9uvvuu5WXlyeXy6WEhASVlpZKkpKS\nklRQUKDx48crMjJSxcXFnu7XZ599VgUFBdq3b59mzpypGTNm+KtkAAA8bNah8yn6MZvNpjB4GkCf\ndf5j6c1ngc8MwpsvcoGZdAAAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICAB\nADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAw\nICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAg\nAQAwICABADAgIAEAMCAgAQAwICABADAgIIEBKVI2m63HW0zMsGAXCgSNzbIsK9hF9JXNZlMYPA2g\n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\nOpSXl6cvv/xSCQkJKi0t9Uxrt2zZMj399NOKjIxUUVGRpkyZ0vVJMEgHkMQgHeCQgI5ifeONN1RV\nVSWbzaakpCRNnTq1Txv2JQIS6ERAAp0CMop1165duvDCC7V582ZFR0dLktxutyZMmKCNGzdq2LBh\nfSoAQH8X6dW8zNHRQ9XSsjsA9QC+0eNMOjfffLMGDRqkN998Uzt37tTOnTv1xhtvyGaz6aabbgpE\njQBCWrs69zKPfnO79wStQqA3euxiHTlypNavX6/x48d3Wb5582bNnDlTTU1Nfi3QG3SxAp2C1cXq\n7br4nCJQAjZZuan7hEtdAQDCWY8BOXXqVN10001699131dHRoY6ODr3zzju6+eabNW3atEDUCABA\nwPXYxfrf//5XF1xwgT766CPP1TtaWlo0btw4/fOf/9SIESMCUujR0MUKdKKLFegUsNM8Ojo69Prr\nr2vbtm2SpKSkJGVmZvZpw75EQAKdCEigk18DcuPGjZozZ44+//zzI07l2Llzp0aPHq3nnntO06dP\n71MBvkBAAp0ISKCTXwfpLF++XHfeeafxPMfhw4dr/vz5WrZsWZ82DgBAqOo2ILdu3XrElG6Hmzx5\nsj788EO/FAUAQLB1G5AtLS0aOnRotw+MiYmR2+32S1EAAARbtwH585//XB999FG3D/z44491xhln\n+KUoAACCrduAzMzM1D333KN9+/Ydcd/evXt19913h9RIVgAAfKnbUax79+7VWWedpYMHD+r666/X\n6NGjJUlVVVV67LHHFBkZqaqqKp144okBLdiEUaxAJ0axAp38fh5kc3Ozbr31Vr344os6ePCgJGnQ\noEGaPXu2HnnkEdnt9j5t3FcISKATAQl0CthEAW1tbdq+fbsk6fTTT9fxxx/fp436GgEJdCIggU4B\nvWByKCMggU4EJNApYFfzAABgoCEgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICAB\nADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAw\nICABADAgIAEAMCAgAQAwICABBEikbDZbj7eYmGHBLhSQJNksy7KCXURf2Ww2hcHTAPrMZrNJ8uaz\n4Mt2vt8mn2f0lS9ygT1IAAAMCEgAAAwISAAADAhIAAAMCEgAAAyCEpAHDx5USkqKZs2aJUlyu93K\n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\neEOLFi3yTLt444036sorr9S///1vTZw4Ueeff74aGhp6XXNRUZEefvhh/fGPf1RVVZVeeOGFIybi\nBsIVAQnyd2aUAAAC5ElEQVQESGRkpIqLi7Vu3TqdfPLJmjRpkubNm9er62Q6nU794Q9/0GmnnaaE\nhATP8hkzZujXv/61zjjjDD3yyCOKiIjQk08+2euaW1paNHr0aP3yl79UfHy8Jk6c6LneHhDuCEgg\ngH71q1+poaFBL730kqZPn66XXnpJ6enpWrx4sdfrsNlsmj59uvG+zMxMz8+RkZE699xzVVVV1et6\n58yZo6amJp1xxhm64YYbtGHDBuMFsoFwREACAXb88ccrMzNThYWF+uyzz3TxxRersLBQBw4cUERE\nhDo6Orq0P3SliMMdurxSTyzL6va6dxERnR//w7fX2trapU1CQoL+85//6C9/+Ys6OjqUn5+v2bNn\ne7VtoL8jIIEgO/3003Xw4EF99913GjFihLZs2eK5r6mpSR9++KHX6zr8dJEDBw5o06ZNGj16tLHt\niBEjJKnL9l5++eUj2kVERCgrK0tPPPGEnn/+ea1Zs8ZzpXYgnHGaBxAgu3bt0uzZs3XllVcqOTlZ\nNptNb7/9tp566imdd955io6O1rRp0/TXv/5Vzz33nEaOHKkHH3xQMTExXndrvvrqq/rHP/6hMWPG\n6PHHH5dlWbr22muNbRMTEzVq1CgtXbpUQ4YM0ZYtW/Tcc891afPwww/r1FNP1dixY7V//36VlJQo\nOjpaJ510Up9fDyDUEZBAgERHR2vixIlatmyZvvjiC33//fdyOp265pprtGDBAknSXXfdpR07duiG\nG26Qw+HQ/Pnz9d1333XbTfpjjz76qB577DFVVlYqISFBr776qk499VTP/YevJyoqSqtWrdJ1112n\nGTNmKD09XY8//rgyMjI8bWJiYvTggw+qurpap5xyijIzM/Xqq69q8ODBvnlRgBDG9SCBMLBjxw6d\ndtpp2rx5s1JTU4NdDhAWOAYJAIABAQmECW+7YQF4hy5WAAAM2IMEAMCAgAQAwICABADAgIAEAMCA\ngAQAwICABADA4P8Bhe1HsW21y8QAAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x109e35d10>"
]
}
],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"all_quantities = np.array(all_quantities)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"all_quantities[all_quantities<50]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 18,
"text": [
"array([49])"
]
}
],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"np.mean(all_prices)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 16,
"text": [
"54.031060930989533"
]
}
],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print \"Total surplus:\", sum(all_surplus)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Total surplus: 5006.92947474\n"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"5006.92947474 / 118627.346531"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 13,
"text": [
"0.04220721124729513"
]
}
],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"all_surplus = np.array(all_surplus)\n",
"np.sum(all_surplus[all_surplus>0])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 14,
"text": [
"157676.06928695814"
]
}
],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"157676.06928695814/118627.346531"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 15,
"text": [
"1.329171341160816"
]
}
],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"len(all_surplus[all_surplus>0])/len(all_surplus)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 21,
"text": [
"0.6265253050610122"
]
}
],
"prompt_number": 21
}
],
"metadata": {}
}
]
}
'''
Jungle Equilibrium with Zero-Intelligence Traders
==================================================
Based on the Gode & Sunder (1993) paper on ZI traders, and Piccione and
Rubinstein (2007) on Jungle Equilibrium.
'''
from __future__ import division # Ensure that int/int isn't coerced to int
import random
class Seller(object):
'''
A seller agent.
Attributes:
max_cost: The maximum cost the seller may have.
cost: The seller's actual cost, drawn from a uniform distribution
s.t. 0 <= cost < max_cost
units: The number of units the seller has to sell; initialized at 1
sale_price: The price the agent sold at; set to None before a sale.
surplus: The difference between the sale price and the cost
max_strength: The maximum coercive strength that an agent may have
strength: The seller's actual strength, drawn from a uniform dist.
s.t. 0 <= strength <= max_strength
'''
def __init__(self, max_cost, max_strength):
'''
Instantiate a new Seller Agent.
Args:
max_cost: The maximum allowed cost the agent may have
'''
self.max_cost = max_cost
self.cost = random.random() * max_cost
self.strength = random.random() * max_strength
self.units = 1
self.sale_price = None # Hold the price the unit is finally sold at
self.surplus = None
def ask_price(self):
'''
Form the asking price in a negotiation.
Returns:
An asking price for the unit for sale, drawn from a uniform
distribution s.t.:
cost <= asking_price < max_cost
'''
profit = random.random() * (self.max_cost - self.cost)
return self.cost + profit
def make_trade(self, sale_price):
'''
Close the sale: set remaining units to 0, and record the sale price.
Args:
sale_price: The price the unit was sold at.
'''
self.units = 0
self.sale_price = sale_price
self.surplus = self.sale_price - self.cost
def reset(self):
'''
Return the seller agent to its initial condition.
'''
self.units = 1
self.sale_price = None
self.surplus = None
class Buyer:
'''
A Buyer agent.
Attributes:
max_value: The maximum value the buyer may have.
value: The buyer's actual cost, drawn from a uniform distribution
s.t. 0 <= value < max_value
units: The number of units the buyer has; initialized at 0.
sale_price: The price the agent bought at; set to None before a sale.
surplus: The difference between the valuation and sale price.
max_strength: The maximum coercive strength that an agent may have
strength: The seller's actual strength, drawn from a uniform dist.
s.t. 0 <= strength <= max_strength
'''
def __init__(self, max_value, max_strength):
'''
Instantiate a new Buyer Agent.
Args:
max_value: The maximum allowed value to an agent.
'''
self.max_value = max_value
self.value = random.random() * max_value
self.strength = random.random() * max_strength
self.units = 0
self.sale_price = None # Hold the price the unit is finally bought at.
self.surplus = None
def bid_price(self):
'''
Form a bid price in a negotiation.
Returns:
A bid price drawn from a uniform distribution s.t.:
0 <= bid_price < value
'''
return random.random() * self.value
def make_trade(self, buy_price):
'''
Close the sale: set units to 1, and record the sale price.
Args:
buy_price: The price the unit was bought at.
'''
self.units = 1
self.sale_price = buy_price
self.surplus = self.value - self.sale_price
def reset(self):
'''
Returns the buyer to its initial state.
'''
self.units = 0
self.sale_price = None
self.surplus = None
class Market:
'''
A simulated 'jungle' market between a set of Buyer and Seller agents.
A given Market instance holds a population of agents set at initializations,
from which multiple trading processes may be realized via different random
pairings of agents.
Attributes:
max_value: The maximum value both buyers and sellers will place on
their goods.
num_buyers: The number of buyer agents in the market.
num_sellers: The number of seller agents in the market.
max_rounds_wo_trade: The number of pairings NOT resulting in a trade
before the market is considered in equilibrium
(i.e. no more trades are possible).
transactions: A list of tuples recording successful transactions, of
the form: (seller_id, buyer_id, transaction_price)
'''
def __init__(self, max_value, max_strength, coercion,
num_buyers, num_sellers, max_rounds_wo_trade):
'''
Initialize a new market.
Args:
max_value: The maximum value both buyers and sellers will place on
their goods.
max_strength: The maximum coercive strength that both buyers and
sellers may have.
num_buyers: The number of buyer agents in the market.
num_sellers: The number of seller agents in the market.
max_rounds_wo_trade: The number of pairings NOT resulting in a trade
before the market is considered in equilibrium
(i.e. no more trades are possible).
'''
# Set market constants:
self.max_value = max_value
self.max_strength = max_strength
self.coercion = coercion
self.num_buyers = num_buyers
self.num_sellers = num_sellers
self.max_rounds_wo_trade = max_rounds_wo_trade
# Create agents:
self.buyers = [Buyer(self.max_value, self.max_strength)
for i in range(self.num_buyers)]
self.sellers = [Seller(self.max_value, self.max_strength)
for i in range(self.num_sellers)]
# Initiate market counters:
self.rounds_wo_trade = 0 # Counter of rounds where no trade occured.
self.transactions = []
def reset_market(self):
'''
Resets the market back to its starting state.
Does not change the agents' valuations.
'''
self.rounds_wo_trade = 0
self.transactions = []
for agent in self.buyers + self.sellers:
agent.reset()
def find_supply_demand(self):
'''
Find the (non-coercive) supply/demand curves, and their intersection.
Returns:
A dictionary containing the summary of the market, as follows:
{
"supply": An ordered asceding list of seller costs,
"demand": An ordered descending list of buyer values,
"p": The estimated mean price, where the supply and demand
curves meet,
"q": The estimated number of trades, where the supply and demand
curves meet.
}
If the supply and demand curves do not cross, p and q are set to
None.
'''
# The supply and demand curves:
supply = [seller.cost for seller in self.sellers]
demand = [buyer.value for buyer in self.buyers]
supply.sort()
demand.sort(reverse=True)
# Estimate their intersection
market_size = min(self.num_buyers, self.num_sellers)
for i in range(market_size):
if supply[i] == demand[i]:
est_trades = i + 1 # From index to count
est_price = supply[i]
break
if demand[i] <= supply[i] and demand[i-1] > supply[i-1]:
est_trades = i+1
# Compute the middle of the range in overlap:
max_price = min(supply[i], demand[i-1])
min_price = max(supply[i-1], demand[i])
est_price = (min_price + max_price)/2
break
else: # If no intersection found, leave the values undefined.
est_trades = None
est_price = None
# Build the return dictionary:
market_summary = {
"supply": supply,
"demand": demand,
"p": est_price,
"q": est_trades
}
return market_summary
def try_trade(self, coercion=False):
'''
A single tick of the market.
Match up a random buyer and seller and see if a trade occurs.
Args:
coercion: (default=False) Whether trades occurs by coercion or
mutual benefit
Returns
None if no trade occurs
Otherwise, a transaction tuple
(seller_id, buyer_id, transaction_price)
'''
# Choose a seller and a buyer
seller_id = random.randint(0, self.num_sellers-1)
buyer_id = random.randint(0, self.num_buyers-1)
buyer = self.buyers[buyer_id]
seller = self.sellers[seller_id]
# If the buyer or seller are out of the market, no trade:
if buyer.units == 1 or seller.units == 0:
return None
if coercion:
# The stronger agent determines the trade price:
if seller.strength > buyer.strength:
transaction_price = seller.ask_price()
else:
transaction_price = buyer.bid_price()
else:
# Without coercion, the trade occurs only if mutually beneficial:
ask_price = seller.ask_price()
bid_price = buyer.bid_price()
if ask_price > bid_price: return None
transaction_price = ask_price + random.random() * (bid_price - ask_price)
# The coerced trade goes forward:
buyer.make_trade(transaction_price)
seller.make_trade(transaction_price)
return (seller_id, buyer_id, transaction_price)
def run_market(self):
'''
Run the market to equilibrium and populate the transactions list.
'''
while self.rounds_wo_trade < self.max_rounds_wo_trade:
transaction = self.try_trade(self.coercion)
if transaction is None:
self.rounds_wo_trade += 1
else:
self.transactions.append(transaction)
self.rounds_wo_trade = 0
def get_surplus(self):
'''
Return a list with the buyer and seller surpluses after trading.
'''
surpluses = []
for agent in self.buyers + self.sellers:
if agent.surplus is not None:
surpluses.append(agent.surplus)
return surpluses
if __name__ == "__main__":
market = Market(30, 100, True, 50, 50, 1000)
market.run_market()
market = Market(30, 100, False, 50, 50, 1000)
market.run_market()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment