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