{ "cells": [ { "cell_type": "markdown", "id": "d14f8ea4", "metadata": {}, "source": [ "For most business users, they've been exposed to Monte Carlo methods in school through proprietary and expensive Excel Add-ins, and then they are set free into a work environment where those expensive add-ins are no longer available. This is usually the end of Monte Carlo for them, but it's quite trivial to do in Python.\n", "\n", "Repeated random sampling from a probability distribution in Python\n", "\n", "References:\n", "1. [Wikipedia, Monte Carlo Method](https://en.wikipedia.org/wiki/Monte_Carlo_method)\n", "2. [numpy.random.triangular](https://numpy.org/doc/stable/reference/random/generated/numpy.random.triangular.html)\n", " * `triangular(left, mode, right, size=None)`\n", "3. [Wikipedia, Triangular distribution](https://en.wikipedia.org/wiki/Triangular_distribution)\n", "4. [numpy.random.choice](https://numpy.org/doc/stable/reference/random/generated/numpy.random.choice.html)\n", " * `choice(a, size=None, replace=True, p=None)`" ] }, { "cell_type": "code", "execution_count": 1, "id": "38f712fc", "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "# set a seed for reproducibility\n", "np.random.seed(42)" ] }, { "cell_type": "markdown", "id": "75e2ad1c", "metadata": {}, "source": [ "We'll rely on numpy's methods to generate arrays of random samples. Two methods I'll focus on are using draws from a triangular distribution with `np.random.triangular` and a discrete distribution using `np.random.choice`. " ] }, { "cell_type": "markdown", "id": "4f189b71", "metadata": {}, "source": [ "## Drawing from a triangular distribution\n", "\n", "In a business setting, when dealing with uncertainty, domain experts will phrase their assessment of probabilities using terms like 'low-base-high case' or 'bull-base-bear case' (if you're in finance). In other words, they think about the extreme upper and lower possibilities and a 'most likely' case. This can be translated into a triangular distribution and can be generated quickly in `numpy`:" ] }, { "cell_type": "code", "execution_count": 2, "id": "0f806020", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([2.73098843, 4.37207839, 3.53574303, 3.20814841, 2.11720594,\n", " 2.11711958, 1.68166627, 3.96530641, 3.2136406 , 3.4717921 ])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.triangular(left=1, mode=3, right=5, size=10)" ] }, { "cell_type": "code", "execution_count": 3, "id": "e6507998", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "435 ms ± 3.02 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%%timeit\n", "samples = np.random.triangular(left=1, mode=3, right=5, size=10**7)\n", "plt.hist(samples, bins=500)" ] }, { "cell_type": "markdown", "id": "985cf141", "metadata": {}, "source": [ "10M samples takes about ~500 ms or about half a second." ] }, { "cell_type": "markdown", "id": "ffb782b7", "metadata": {}, "source": [ "## Drawing from a discrete distribution" ] }, { "cell_type": "code", "execution_count": 4, "id": "751daf53", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([3, 3, 3, 3, 1, 3, 5, 3, 3, 3])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "choices = [1, 3, 5]\n", "probabilities = [.1, .8, .1] # must sum to 1\n", "np.random.choice(a=choices, size=10, replace=True, p=probabilities)" ] }, { "cell_type": "code", "execution_count": 6, "id": "0fb1de9f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "46.2 ms ± 3.16 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%%timeit\n", "discrete_samples = np.random.choice(a=choices, size=10**6, replace=True, p=probabilities)\n", "plt.hist(discrete_samples, bins=3)" ] }, { "cell_type": "markdown", "id": "e9fb786a", "metadata": {}, "source": [ "`np.random.choice` takes significantly longer at 13 seconds at 10M samples, so we run it with 1M samples for now just to demo it." ] }, { "cell_type": "markdown", "id": "e7f3e016", "metadata": {}, "source": [ "## By Example\n", "\n", "Here's a simple example from corporate finance on when you'll use a Monte Carlo method. \n", "\n", "You are asked to estimate the potential costs that your company will incur if they decide to invest in a new project. We have our engineers estimate how long it'll take and how many resources they think they might need, and your job is to estimate the cost of the project. \n", "\n", "There are three variables in determining the cost of the project:\n", "* How many people it will take\n", "* How long it will take" ] }, { "cell_type": "code", "execution_count": 31, "id": "9b3d51b7", "metadata": {}, "outputs": [], "source": [ "people = np.random.choice(a=[1,2,3], size=10**7, replace=True, p=[.2,.6,.2])\n", "time = np.random.choice(a=[1,3,5], size=10**7, replace=True, p=[.2, .7, .1])\n", "labor_rate = 50" ] }, { "cell_type": "code", "execution_count": 32, "id": "cf7ce42c", "metadata": {}, "outputs": [], "source": [ "cost = people * time * labor_rate" ] }, { "cell_type": "code", "execution_count": 33, "id": "0f25121d", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.hist(cost, bins=20)" ] }, { "cell_type": "code", "execution_count": 34, "id": "4eb5e2d3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "279.898715" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(cost)" ] }, { "cell_type": "markdown", "id": "59f6635e", "metadata": {}, "source": [ "Now you could have calculated the average quite easily using your inputs (and this is typically where most analysts will stop), but the nice thing about Monte Carlo is that you can get additional numerical information from this simulation - like the median, standard deviation, mode, etc:" ] }, { "cell_type": "code", "execution_count": 35, "id": "5386fbf0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "300.0" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.median(cost)" ] }, { "cell_type": "code", "execution_count": 36, "id": "166c24c3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "143.475855429925" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.std(cost)" ] }, { "cell_type": "markdown", "id": "3ae0654f", "metadata": {}, "source": [ "And you can get confidence intervals:" ] }, { "cell_type": "code", "execution_count": 37, "id": "4c73049d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(100.0, 450.0)" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 80% confint\n", "(np.percentile(cost, 10), np.percentile(cost, 90))" ] }, { "cell_type": "markdown", "id": "7bbb4439", "metadata": {}, "source": [ "Now let's say that we want to add another variable - revenue. We ask our revenue analysts and they think the project could bring in either \\\\$10 or \\\\$15 per unit (it's a 50-50 chance of either) and volumes will be around 1800 units, with a best case of 2400 and worst case 1000. \n", "\n", "We'll model the price assumption as a discrete distribution and volumes as a triangular distribution:" ] }, { "cell_type": "code", "execution_count": 86, "id": "71a1f9d5", "metadata": {}, "outputs": [], "source": [ "price = [10, 15]\n", "price_probabilities = [0.5, 0.5]" ] }, { "cell_type": "code", "execution_count": 87, "id": "14fbc2df", "metadata": {}, "outputs": [], "source": [ "prices = np.random.choice(price, size=10**7, replace=True, p=price_probabilities)\n", "volumes = np.random.triangular(left=1000, mode=1800, right=2400, size=10**7)\n", "# Calculate the revenues\n", "revenue = prices * volumes" ] }, { "cell_type": "code", "execution_count": 88, "id": "324ffa8f", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.hist(revenue, bins=100)" ] }, { "cell_type": "markdown", "id": "0a5726ab", "metadata": {}, "source": [ "We can run our statistics again:" ] }, { "cell_type": "code", "execution_count": 89, "id": "2c6f1879", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "21666.70489902372" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(revenue)" ] }, { "cell_type": "code", "execution_count": 90, "id": "164b24b1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "20705.70824132701" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.median(revenue)" ] }, { "cell_type": "code", "execution_count": 91, "id": "41b8979b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5669.020124454094" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.std(revenue)" ] }, { "cell_type": "code", "execution_count": 92, "id": "8a3ac3f5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(14733.504705181971, 29852.175758982165)" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(np.percentile(revenue, 10), np.percentile(revenue, 90))" ] }, { "cell_type": "markdown", "id": "e8995dfb", "metadata": {}, "source": [ "Finally, we can take our results and check the expected profit margin from this effort: (imagine this is a digital product that doesn't have any costs)" ] }, { "cell_type": "code", "execution_count": 93, "id": "ef56c356", "metadata": {}, "outputs": [], "source": [ "margin = revenue - cost" ] }, { "cell_type": "code", "execution_count": 94, "id": "364d26d8", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.hist(margin, bins=300)" ] }, { "cell_type": "code", "execution_count": 95, "id": "5713f660", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "21386.806184023717" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(margin)" ] }, { "cell_type": "code", "execution_count": 96, "id": "f47957ae", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "20427.216630348783" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.median(margin)" ] }, { "cell_type": "code", "execution_count": 97, "id": "a1d84408", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5670.856944173494" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.std(margin)" ] }, { "cell_type": "code", "execution_count": 98, "id": "0f469693", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(14451.087496083595, 29574.72188314046)" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 80% confint\n", "(np.percentile(margin, 10), np.percentile(margin, 90))" ] }, { "cell_type": "markdown", "id": "c9c97e3f", "metadata": {}, "source": [ "So we see that it's pretty easy to do quick monte carlo simulations without the need for an expensive Excel add-in package, and it's trivial to add and change requirements to suit your needs." ] }, { "cell_type": "code", "execution_count": null, "id": "5b462428", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.11" } }, "nbformat": 4, "nbformat_minor": 5 }