230 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			230 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| {
 | ||
|  "cells": [
 | ||
|   {
 | ||
|    "cell_type": "markdown",
 | ||
|    "metadata": {},
 | ||
|    "source": [
 | ||
|     "## Load Packages and Extra Functions"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "code",
 | ||
|    "execution_count": 1,
 | ||
|    "metadata": {},
 | ||
|    "outputs": [
 | ||
|     {
 | ||
|      "data": {
 | ||
|       "text/plain": [
 | ||
|        "printyellow (generic function with 1 method)"
 | ||
|       ]
 | ||
|      },
 | ||
|      "execution_count": 1,
 | ||
|      "metadata": {},
 | ||
|      "output_type": "execute_result"
 | ||
|     }
 | ||
|    ],
 | ||
|    "source": [
 | ||
|     "using Printf, Distributions, OffsetArrays, FiniteDiff\n",
 | ||
|     "\n",
 | ||
|     "include(\"jlFiles/OptionsCalculations.jl\")\n",
 | ||
|     "include(\"jlFiles/printmat.jl\")"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "code",
 | ||
|    "execution_count": 2,
 | ||
|    "metadata": {},
 | ||
|    "outputs": [],
 | ||
|    "source": [
 | ||
|     "using Plots\n",
 | ||
|     "#pyplot(size=(600,400))\n",
 | ||
|     "gr(size=(480,320))\n",
 | ||
|     "default(fmt = :svg)"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "markdown",
 | ||
|    "metadata": {},
 | ||
|    "source": [
 | ||
|     "# The Black-Scholes Model\n",
 | ||
|     "\n",
 | ||
|     "The next cell calculates call `C` and put prices `P` from the Black-Scholes formula.\n",
 | ||
|     "\n",
 | ||
|     "The key parameters are:\n",
 | ||
|     "`(S,K,m,y,σ) = (current undelying price, strike price,time to expiration,interest rate, volatility)`"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "code",
 | ||
|    "execution_count": 3,
 | ||
|    "metadata": {},
 | ||
|    "outputs": [
 | ||
|     {
 | ||
|      "name": "stdout",
 | ||
|      "output_type": "stream",
 | ||
|      "text": [
 | ||
|       "call price at K=42:      2.893         \n",
 | ||
|       "\n",
 | ||
|       "put price at K=42:       1.856         \n",
 | ||
|       "\n"
 | ||
|      ]
 | ||
|     }
 | ||
|    ],
 | ||
|    "source": [
 | ||
|     "(S,K,m,y,σ) = (42,42,0.5,0.05,0.2)\n",
 | ||
|     "\n",
 | ||
|     "C = OptionBlackSPs(S,K,m,y,σ)\n",
 | ||
|     "printlnPs(\"call price at K=$K: \",C,\"\\n\")\n",
 | ||
|     "\n",
 | ||
|     "P = OptionBlackSPs(S,K,m,y,σ,0,true)\n",
 | ||
|     "printlnPs(\"put price at K=$K:  \",P,\"\\n\")"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "markdown",
 | ||
|    "metadata": {},
 | ||
|    "source": [
 | ||
|     "# Task 1\n",
 | ||
|     "\n",
 | ||
|     "For a range of different prices of the underlying asset `S=30.0:60.0`, calculat the call and put prices and plot them (with `S` on the hoizontal axis)."
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "markdown",
 | ||
|    "metadata": {},
 | ||
|    "source": [
 | ||
|     "# The Binomial Option Pricing Model\n",
 | ||
|     "\n",
 | ||
|     "The next cell contains functions to implement a binomial option pricing model for European style (exercise at expiration only) and American style (exercise any day) options. We use the CRR (Cox-Ross-Rubinstein) parameterisation.\n",
 | ||
|     "\n",
 | ||
|     "The key parameters are the same as before, but also `n` which is the number of time steps used in the calculations (which defaults to 250)."
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "code",
 | ||
|    "execution_count": 4,
 | ||
|    "metadata": {},
 | ||
|    "outputs": [
 | ||
|     {
 | ||
|      "data": {
 | ||
|       "text/plain": [
 | ||
|        "BOPM_American (generic function with 3 methods)"
 | ||
|       ]
 | ||
|      },
 | ||
|      "execution_count": 4,
 | ||
|      "metadata": {},
 | ||
|      "output_type": "execute_result"
 | ||
|     }
 | ||
|    ],
 | ||
|    "source": [
 | ||
|     "\"\"\"\n",
 | ||
|     "CRRparams(σ,m,n,y)\n",
 | ||
|     "\n",
 | ||
|     "    BOPM parameters according to CRR\n",
 | ||
|     "\"\"\"\n",
 | ||
|     "function CRRparams(σ,m,y,n)\n",
 | ||
|     "    h = m/n                 #time step size (in years)\n",
 | ||
|     "    u = exp(σ*sqrt(h))      #up move\n",
 | ||
|     "    d = exp(-σ*sqrt(h))     #down move\n",
 | ||
|     "    p = (exp(y*h) - d)/(u-d) #rn prob of up move\n",
 | ||
|     "    return h,u,d,p\n",
 | ||
|     "end    \n",
 | ||
|     "\n",
 | ||
|     "function BOPM_European(S,K,m,y,σ,isPut=false,n=250)\n",
 | ||
|     "    (h,u,d,p) = CRRparams(σ,m,y,n)\n",
 | ||
|     "    STree     = BuildSTree(S,n,u,d)\n",
 | ||
|     "    price     = EuOptionPrice(STree,K,y,h,p,isPut)[0][]\n",
 | ||
|     "    return price\n",
 | ||
|     "end\n",
 | ||
|     "\n",
 | ||
|     "function BOPM_American(S,K,m,y,σ,isPut=false,n=250)\n",
 | ||
|     "    (h,u,d,p) = CRRparams(σ,m,y,n)\n",
 | ||
|     "    STree     = BuildSTree(S,n,u,d)\n",
 | ||
|     "    price     = AmOptionPrice(STree,K,y,h,p,isPut)[1][0][1]\n",
 | ||
|     "    return price\n",
 | ||
|     "end"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "code",
 | ||
|    "execution_count": 5,
 | ||
|    "metadata": {},
 | ||
|    "outputs": [
 | ||
|     {
 | ||
|      "name": "stdout",
 | ||
|      "output_type": "stream",
 | ||
|      "text": [
 | ||
|       "call (Eu)     2.891\n",
 | ||
|       "put (Eu)      1.854\n",
 | ||
|       "call (Am)     2.891\n",
 | ||
|       "put (Am)      1.954\n",
 | ||
|       "\n",
 | ||
|       "\u001b[31m\u001b[1mNotice that c_e=c_a but that p_a>=p_e\u001b[22m\u001b[39m\n"
 | ||
|      ]
 | ||
|     }
 | ||
|    ],
 | ||
|    "source": [
 | ||
|     "c_e = BOPM_European(S,K,m,y,σ,false)            #call price, European style\n",
 | ||
|     "p_e = BOPM_European(S,K,m,y,σ,true)             #put price, European\n",
 | ||
|     "\n",
 | ||
|     "c_a = BOPM_American(S,K,m,y,σ,false)            #call, American\n",
 | ||
|     "p_a = BOPM_American(S,K,m,y,σ,true)             #put, American\n",
 | ||
|     "\n",
 | ||
|     "printmat([c_e,p_e,c_a,p_a],rowNames=[\"call (Eu)\",\"put (Eu)\",\"call (Am)\",\"put (Am)\"])\n",
 | ||
|     "\n",
 | ||
|     "printred(\"Notice that c_e=c_a but that p_a>=p_e\")"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "markdown",
 | ||
|    "metadata": {},
 | ||
|    "source": [
 | ||
|     "# Task 2\n",
 | ||
|     "\n",
 | ||
|     "Redo the calculation of p_e and p_a for `S=30:60` and plot the prices."
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "markdown",
 | ||
|    "metadata": {},
 | ||
|    "source": [
 | ||
|     "# Delta\n",
 | ||
|     "\n",
 | ||
|     "To hedge an option contract (eg. if we are short one option contract), we buy $\\Delta$ units of the underlying asset, where $\\Delta$ is the partial derivative of the option price with respect to the price of the underlying asset.\n",
 | ||
|     "\n",
 | ||
|     "Calculate $\\Delta$ for both the European and American puts, using the BOPM function. Do the calculation for each value in `S_range` and plot the results.\n",
 | ||
|     "\n",
 | ||
|     "To calculate the derivatives we could use, for instance,  \n",
 | ||
|     "`FiniteDiff.finite_difference_derivative(the function,an S value)`"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "code",
 | ||
|    "execution_count": null,
 | ||
|    "metadata": {},
 | ||
|    "outputs": [],
 | ||
|    "source": []
 | ||
|   }
 | ||
|  ],
 | ||
|  "metadata": {
 | ||
|   "@webio": {
 | ||
|    "lastCommId": null,
 | ||
|    "lastKernelId": null
 | ||
|   },
 | ||
|   "anaconda-cloud": {},
 | ||
|   "kernelspec": {
 | ||
|    "display_name": "Julia 1.6.3",
 | ||
|    "language": "julia",
 | ||
|    "name": "julia-1.6"
 | ||
|   },
 | ||
|   "language_info": {
 | ||
|    "file_extension": ".jl",
 | ||
|    "mimetype": "application/julia",
 | ||
|    "name": "julia",
 | ||
|    "version": "1.6.3"
 | ||
|   }
 | ||
|  },
 | ||
|  "nbformat": 4,
 | ||
|  "nbformat_minor": 4
 | ||
| }
 |