{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "%pylab inline\n", "lecture = 12" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "#Lecture 12: Numerical Methods for Partial Differential Equations\n", "\n", "## Topics\n", "\n", "* I. Introduction\n", " * Second Order PDE Classification\n", " * Initial and Boundary Conditions\n", " * Black-Scholes Equation" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* II. Finite Difference Methods for Solving PDEs\n", " * Discretization\n", " * Finite Difference Methods\n", " * The Explicit Methods\n", " * Consistency, Stability and Convergence\n", " * The Implicit Methods\n", " * The Crank-Nicholson Method\n", " \n", "* III. Numerical Examples\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# I. Introduction\n", "\n", "\n", "* In finance, most partial differential equations (PDE) we encounter are of the second order (the highest derivative)\n", "\n", "$$\n", "\\renewcommand{PDut}{\\frac{\\partial u}{\\partial t}}\n", "\\renewcommand{PDux}{\\frac{\\partial u}{\\partial x}}\n", "\\renewcommand{PDutt}{\\frac{\\partial ^2u}{\\partial t^2}}\n", "\\renewcommand{PDuxx}{\\frac{\\partial ^2u}{\\partial x^2}}\n", "\\renewcommand{PDuyy}{\\frac{\\partial ^2u}{\\partial y^2}}\n", "a(x,t)\\PDutt + 2b(x,t)\\frac{\\partial ^2u}{\\partial t\\partial x} + c(x,t)\\PDuxx + d(x,t)\\PDut + e(x,t)\\PDux = f(t,x,u)\n", "$$\n", "\n", "* It can be classified into three categories: **Hyperbolic, Parabolic and Elliptic**\n", "\n", "* In general, the different types of equations make a big difference in how the solutions behave and\n", "\n", "* on how we can solve them more effectively" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Classification\n", "\n", "### Hyperbolic \n", "\n", "* $b^2(x,t) - a(x,t)c(x,t) > 0 $\n", " $\\;$\n", "\n", "* The canonical form:\n", "$$\n", "\\large{\n", "\\PDutt = c^2 \\PDuxx\n", "}\n", "$$\n", "\n", "* No steady state and no diffusion, mostly referred to as the **Wave equation** or **Advection equation**\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Parabolic \n", "\n", "\n", "* $b^2(x,t) - a(x,t)c(x,t) = 0 $\n", " $\\;$\n", "\n", "* The canonical form:\n", "$$\n", "\\large{\n", "\\PDut = d \\;\\PDuxx\n", "}\n", "$$\n", "\n", "\n", "* Evolving to a steady state due to diffusion, referred to as the **Heat equation**\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Elliptic \n", "\n", "\n", "* $b^2(x,y) - a(x,y)c(x,y) < 0 $\n", " $\\;$\n", "\n", "* The canonical form:\n", "$$\n", "\\large{\n", "\\PDuxx + \\PDuyy = f(x,y)\n", "}\n", "$$\n", "\n", "\n", "* Steady state (time independent), mostly referred to as the **Laplace** ($f(x,y) = 0$) or **Poisson** equation." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Initial and Boundary Conditions \n", "\n", "\n", "* Depending on the problem, we usually have **initial conditions (IC)**\n", "\n", "$$\n", "\\large{\n", "u(x, t=0) = u_0(x)\n", "}\n", "$$\n", "\n", "* and/or **boundary conditions (BC)**\n", "\n", "$$\n", "\\large{\n", "a \\; u + b\\; \\PDux = c, \\;\\forall \\; x \\in \\partial Q, \\;\\forall \\; t\n", "}\n", "$$\n", "\n", "* and the BC is called **Dirichlet** if $b = 0$, **Neumann** if $a = 0$, or **Robin** if $a\\cdot b \\neq 0$ ." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## **Black-Scholes** Equation\n", "\n", "$$\n", "\\renewcommand{PDuS}{\\frac{\\partial u}{\\partial S}}\n", "\\renewcommand{PDuSS}{\\frac{\\partial ^2u}{\\partial S^2}}\n", "\\PDut + \\frac{1}{2}\\sigma^2S^2\\PDuSS + rS\\PDuS - ru = 0\n", "$$\n", "\n", "* It belongs to the parabolic type, and can be converted into the standard Heat equation form by a change-of-variables" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* For **European Call** option, the \"initial\" (the payoff function) and boundary conditions are\n", "\n", "\\begin{aligned}\n", "&u(S,T) = \\max(S-K, 0);\n", "\\\\\n", "&u(0,t) = 0; \n", "\\\\\n", "&u(S,t) = S - Ke^{-r(T-t)}, \\;\\mbox{as } \\; S \\rightarrow \\infty\n", "\\end{aligned}" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* For **European Put** option, the \"initial\" (the payoff function) and boundary conditions are\n", "\n", "\\begin{aligned}\n", "\\renewcommand{FDut}{\\frac{u_{i,k+1}-u_{i,k}}{\\triangle t}}\n", "\\renewcommand{FDutb}{\\frac{u_{i,k}-u_{i,k-1}}{\\triangle t}}\n", "\\renewcommand{FDutc}{\\frac{u_{i,k+1}-u_{i,k-1}}{2\\triangle t}}\n", "\\renewcommand{FDutt}{\\frac{u_{i,k+1}-2u_{i,k}+u_{i,k-1}}{\\triangle t^2}}\n", "\\renewcommand{FDux}{\\frac{u_{i+1,k}-u_{i,k}}{\\triangle x}}\n", "\\renewcommand{FDuxb}{\\frac{u_{i,k}-u_{i-1,k}}{\\triangle x}}\n", "\\renewcommand{FDuxc}{\\frac{u_{i+1,k}-u_{i-1,k}}{2\\triangle x}}\n", "\\renewcommand{FDuxx}{\\frac{u_{i+1,k}-2u_{i,k}+u_{i-1,k}}{\\triangle x^2}}\n", "&u(S,T) = \\max(K-S, 0);\n", "\\\\\n", "&u(0,t) = Ke^{-r(T-t)}; \n", "\\\\\n", "&u(S,t) = 0, \\;\\mbox{as } \\; S \\rightarrow \\infty\n", "\\end{aligned}\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# II. Finite Difference Methods for Solving PDEs\n", "\n", "\n", "* Very rare that the PDEs have closed form solutions, in general, can only be solved numerically.\n", "\n", "\n", "* Will focus on the finite difference method (FDM): other numerical methods exist and can be more appropriate---very much depends on the actual problems at hand.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "\n", "## Discretization\n", "\n", "\n", "* First step in solving PDEs using FDM is to represent the solution $u(x,t)$ as a discrete collection of values at a well distributed grid points in space and time in the proper domain.\n", "\n", "\n", "* For example, for the rectangular domain in space and time with $t \\in [0, T]$ and $x\\in [x_{min}, x_{max}]$, we can represent the points simply as \n", "\n", "$$t_0 = 0, t_1, t_2, \\cdots, t_M = T$$\n", "\n", "in time and \n", "\n", "$$x_0 = x_{min}, x_1, x_2, \\cdots, x_N = x_{max}$$\n", "\n", "in space. The grid is uniform, i.e. $t_{k+1} = t_k + \\triangle t, \\;\\triangle t = \\frac{T}{M}$ and $x_{i+1} = x_i + \\triangle x, \\;\\triangle x = \\frac{x_{max}-x_{min}}{N}$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "* The discretized version of the solution will be represented by the values of\n", "\n", "$$\n", "u_{i,k} = u(x_i, t_k), \\;\\mbox{for } i = 0,1,\\cdots,N, \\mbox{ and } k = 0,1,\\cdots,M\n", "$$\n", "\n", "\n", "* The values of $u(x,t)$ at any other desired points can be approximated via interpolation.\n", "\n", "\n", "* A uniform mesh may not necessary be the most efficient form to work with, in fact, it rarely is.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* A greatly simplified rule-of-thumb: the mesh needs to be refined around the region where the function varies a lot\n", "\n", "\n", "* On the other hand, the mesh can be relatively coarse if the function is smooth and changing slowly\n", "\n", "\n", "* In finance, the time grid is well advised to keep the **important** dates as grid points: such as cash flow dates, contractual schedule dates, etc. The spacing of these dates is most likely not uniform.\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "## Finite Difference Methods(FDM)\n", "\n", "* Toolkit for finite difference approximation\n", "\n", "| Partial Derivative | Finite Difference | Type | Order | \n", "| :------: | :-----: | :-----: | :-----: | \n", "| $\\PDux$ | $\\FDux$ | forward | 1st in $x$ | \n", "| $\\PDux$ | $\\FDuxb$ | backward | 1st in $x$ | \n", "| $\\PDux$ | $\\FDuxc$ | central | 2nd in $x$ | \n", "| $\\PDuxx$ | $\\FDuxx$ | symmetric | 2nd in $x$ | \n", "| $\\PDut$ | $\\FDut$ | forward | 1st in $t$ | \n", "| $\\PDut$ | $\\FDutb$ | backward | 1st in $t$ | \n", "| $\\PDut$ | $\\FDutc$ | central | 2nd in $t$ | \n", "| $\\PDutt$ | $\\FDutt$ | symmetric | 2nd in $t$ | \n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## The Explicit Method \n", "\n", "* For convenience, reverse the time for Black-Scholes notation: $ t \\leftarrow T - t$\n", "\n", "$$\n", "\\small\n", "\\PDut - \\frac{1}{2}\\sigma^2S^2\\PDuSS - rS\\PDuS + ru = 0\n", "$$\n", "\n", "* Approximate the Black-Scholes Eqn by\n", "\n", "$$\n", "\\small\n", "\\FDut - \\frac{1}{2} \\sigma^2 x_i^2 \\FDuxx - r x_i \\FDuxc + r u_{i,k} = 0\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* This can be rewritten simply as\n", "\n", "\\begin{aligned}\n", "\\small\n", "u_{i,k+1} & = \\left\\{ \\frac{1}{2}\\sigma^2 x_i^2 \\frac{\\triangle t}{\\triangle x^2} - r x_i \\frac{\\triangle t}{2\\triangle x} \\right\\} u_{i-1,k}\n", "\\\\\n", "& + \\left\\{ 1 - \\sigma^2 x_i^2 \\frac{\\triangle t}{\\triangle x^2} -r \\triangle t \\right\\} u_{i,k}\n", "\\\\\n", "& + \\left\\{ \\frac{1}{2}\\sigma^2 x_i^2 \\frac{\\triangle t}{\\triangle x^2} + r x_i \\frac{\\triangle t}{2\\triangle x} \\right\\} u_{i+1,k}\n", "\\end{aligned}" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Consistency, Stability and Convergence\n", "\n", "* For any FDM that are used to solve practical problems, we should ask\n", "\n", " * 1) How accurate is the method? \n", " \n", " * 2) Does it converge? \n", " \n", " * 3) What is the best choice of step sizes?\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Consistency \n", "\n", "* For the explicit method above, the local truncation error is\n", "\n", "$$\n", "T(x,t) = O(\\triangle x^2 + \\triangle t)\n", "$$\n", "\n", "\n", "\n", "* Taylor series expansion can verify this (or one can simply read this off of the Toolkit Table).\n", "\n", "\n", "* So the explicit method above is consistent of order 1 in time and order 2 in spatial variable.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Von Neumann Stability Analysis\n", "\n", "* The Von Neumann method of analyzing the stability of FDM boils down to substitute $u_{j,k}$ with\n", "\n", "$$\n", "\\epsilon_{j,k} = e^{a t_k}e^{il_mx_j}\n", "$$\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "\n", "* The logic behind this: assuming $v_{j,k}$ is the solution of the FDM that did not suffer from finite precision arithmetic and is without the round off error, then the error \n", "\n", "$$\n", "\\epsilon_{j,k} = v_{j,k} - u_{j,k}\n", "$$\n", "\n", "$\\hspace{0.2in}$ again satifies the FDM due to linearity.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "\n", "\n", "* Looking for $\\epsilon_{j,k} $ in the Fourier expansion representation,\n", "\n", "$$\n", "\\epsilon(x,t) = \\sum_{m= 1}^{M} e^{at}e^{il_mx}\n", "$$\n", "\n", "where $e^{at}$ is a special form of the amplitude, and $l_m$ is the wavelength: $l_m = \\frac{\\pi m}{L}, m = 1, \\cdots, M,\n", "\\mbox{ and } \n", "M = \\frac{L}{\\triangle x}$\n", "\n", "\n", "* Due to linearity again, the error analysis can be performed (without any loss of generality) by looking at a single term of the expansion\n", "\n", "$$\n", "e^{at_k}e^{il_mx_j}\n", "$$\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "* In fact, we are really interested in the amplification of the error,\n", "\n", "$$\n", "\\frac{\\epsilon_{j,k+1}}{\\epsilon_{j,k}} = e^{a\\triangle t}\n", "$$\n", "\n", "* The stability analysis in the Von Neumann method is simply to analyze the form of $e^{a\\triangle t}$ so that \n", "\n", "$$\n", "||e^{a\\triangle t}|| < 1\n", "$$\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* For the explicit method,\n", "\n", "\\begin{aligned}\n", "e^{a (t_k + \\triangle t)}e^{il_mx_j} & = \\left\\{ \\frac{1}{2}\\sigma^2 x_j^2 \\frac{\\triangle t}{\\triangle x^2} - r x_j \\frac{\\triangle t}{2\\triangle x} \\right\\} e^{a t_k}e^{il_mx_{j-1}}\n", "\\\\\n", "& + \\left\\{ 1 - \\sigma^2 x_j^2 \\frac{\\triangle t}{\\triangle x^2} -r \\triangle t \\right\\} e^{a t_k}e^{il_mx_j}\n", "\\\\\n", "& + \\left\\{ \\frac{1}{2}\\sigma^2 x_j^2 \\frac{\\triangle t}{\\triangle x^2} + r x_j \\frac{\\triangle t}{2\\triangle x} \\right\\} e^{a t_k}e^{il_mx_{j+1}}\n", "\\end{aligned}\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "\n", "\n", "* Simplify it into,\n", "\n", "\\begin{aligned}\n", "e^{a\\triangle t} & = \\left\\{ \\frac{1}{2}\\sigma^2 x_j^2 \\frac{\\triangle t}{\\triangle x^2} - r x_j \\frac{\\triangle t}{2\\triangle x} \\right\\} e^{-il_m\\triangle x}\n", "\\\\\n", "& + \\left\\{ 1 - \\sigma^2 x_j^2 \\frac{\\triangle t}{\\triangle x^2} -r \\triangle t \\right\\}\n", "\\\\\n", "& + \\left\\{ \\frac{1}{2}\\sigma^2 x_j^2 \\frac{\\triangle t}{\\triangle x^2} + r x_j \\frac{\\triangle t}{2\\triangle x} \\right\\} e^{il_m\\triangle x}\n", "\\end{aligned}\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "* Looking at the simple case that $r = 0$,\n", "\n", "\\begin{aligned}\n", "e^{a\\triangle t} & = \\frac{1}{2}\\sigma^2 x_j^2 \\frac{\\triangle t}{\\triangle x^2} e^{-il_m\\triangle x}\n", "\\\\\n", "& + 1 - \\sigma^2 x_j^2 \\frac{\\triangle t}{\\triangle x^2} \n", "\\\\\n", "& + \\frac{1}{2}\\sigma^2 x_j^2 \\frac{\\triangle t}{\\triangle x^2} e^{il_m\\triangle x}\n", "\\end{aligned}\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "* which is\n", "\n", "\\begin{aligned}\n", "e^{a\\triangle t} &= \\sigma^2 x_j^2 \\frac{\\triangle t}{\\triangle x^2} \\cos(l_m\\triangle x) + 1 - \\sigma^2 x_j^2 \\frac{\\triangle t}{\\triangle x^2} \n", "\\\\\n", "& = 1 - \\sigma^2 x_j^2 \\frac{\\triangle t}{\\triangle x^2} \\cdot 2\\sin^2(l_m\\triangle x/2)\n", "\\end{aligned}\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "* The stability condition will be satisfied if\n", "\n", "$$\n", "|| 1 - \\sigma^2 x_j^2 \\frac{\\triangle t}{\\triangle x^2} \\cdot 2\\sin^2(l_m\\triangle x/2) || < 1\n", "$$\n", "\n", "* Or if\n", "\n", "$$\n", "\\triangle t < \\frac{\\triangle x^2}{ \\sigma^2 x_{max}^2 }\n", "$$\n", "\n", "\n", "* This is the CFL condition for the explicit method, which says, in order for the explicit method to be stable, the time step size needs to be really small.\n", "\n", "\n", "* $r\\neq 0$ case?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Lax Theorem: Consistency + Stability = Convergence\n", "\n", "\n", "* The **Lax equivalence theorem** holds for PDE as well.\n", "\n", "\n", "* Takeaway: when implementing FDM for PDEs, study the **CFL (Courant–Friedrichs–Lewy)** stability condition before building your discretization grid.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## The Implicit Method \n", "\n", "* Approximate the Black-Scholes Eqn by\n", "\n", "$$\n", "\\small\n", "\\FDutb - \\frac{1}{2} \\sigma^2 x_i^2 \\FDuxx - r x_i \\FDuxc = - r u_{i,k}\n", "$$\n", "\n", "* Which can be rewritten as\n", "\n", "\\begin{aligned}\n", "\\small\n", "u_{i,k-1} & = \\left\\{ -\\frac{1}{2}\\sigma^2 x_i^2 \\frac{\\triangle t}{\\triangle x^2} + r x_i \\frac{\\triangle t}{2\\triangle x} \\right\\} u_{i-1,k}\n", "\\\\\n", "& + \\left\\{ 1 + \\sigma^2 x_i^2 \\frac{\\triangle t}{\\triangle x^2} + r \\triangle t \\right\\} u_{i,k}\n", "\\\\\n", "& + \\left\\{ -\\frac{1}{2}\\sigma^2 x_i^2 \\frac{\\triangle t}{\\triangle x^2} - r x_i \\frac{\\triangle t}{2\\triangle x} \\right\\} u_{i+1,k}\n", "\\end{aligned}\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "* The local truncation error\n", "\n", "$$\n", "T(x,t) = O(\\triangle x^2 + \\triangle t)\n", "$$\n", "\n", "\n", "* And the amplification factor for $r=0$\n", "\n", "\n", "$$\n", "e^{a\\triangle t} = \\frac{1}{1 + \\sigma^2 x_j^2 \\frac{\\triangle t}{\\triangle x^2} \\cdot 2\\sin^2(l_m\\triangle x/2)}\n", "$$\n", "\n", "\n", "* So the implicit method is unconditionally stable.\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## The Crank-Nicholson Method \n", "\n", "* Crank-Nicholson is an average of the explicit and implicit scheme:\n", "\n", "\\begin{aligned}\n", "\\small\n", "\\FDut & = \\frac{1}{4} \\sigma^2 x_i^2 \\left\\{ \\FDuxx + \\frac{u_{i+1,k+1}-2u_{i,k+1}+u_{i-1,k+1}}{\\triangle x^2} \\right\\}\n", "\\\\ \n", " & + \\frac{1}{2} r x_i \\left\\{ \\FDuxc + \\frac{u_{i+1,k+1}-u_{i-1,k+1}}{2\\triangle x} \\right\\} \n", "\\\\\n", " & - \\frac{1}{2} r \\left\\{ u_{i,k} + u_{i,k+1} \\right\\} \n", "\\end{aligned}\n", "\n", "\n", "* The local truncation error is (Note: expanding the Taylor series at $(i, k+\\frac{1}{2})$)\n", "\n", "$$\n", "T(x,t) = O(\\triangle x^2 + \\triangle t^2)\n", "$$\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# III. Numerical Examples \n", "\n", "* Will go through the Black Scholes example in next lecture.\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Homework \n", "\n", "* Derive the CFL condition for the Crank-Nicholson method for the Black-Scholes PDE, assuming $r=0$.\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Reference\n", "\n", "* L. Andersen and V. Piterbarg, Chapter 4 of Interest Rate Modeling, Volumn I, Atlantic Financial Press, 2010.\n", "\n", "* D. Duffy, Finite Difference Method in Financial Engineering, John Wiley & Sons, 2006." ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3", "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.6.5" } }, "nbformat": 4, "nbformat_minor": 1 }