HSG-MCS-HS21_Julia/Problemsets/PS10b_OptionDeltas.ipynb

230 lines
6.0 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"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
}