-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
3d1cfc5
commit c03cf64
Showing
29 changed files
with
2,044 additions
and
0 deletions.
There are no files selected for viewing
227 changes: 227 additions & 0 deletions
227
.ipynb_checkpoints/Black-Scholes Calculator-checkpoint.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,227 @@ | ||
{ | ||
"cells": [ | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"# Black-Scholes Calculator" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 4, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"import scipy\n", | ||
"m = 6\n", | ||
"n = 61\n", | ||
"S0 = 70\n", | ||
"S1 = 130\n", | ||
"K = 100\n", | ||
"r = 0.12\n", | ||
"T = 1.0\n", | ||
"sigma = 0.10" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 7, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stderr", | ||
"output_type": "stream", | ||
"text": [ | ||
"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:6: RuntimeWarning: divide by zero encountered in true_divide\n", | ||
" \n", | ||
"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:6: RuntimeWarning: invalid value encountered in true_divide\n", | ||
" \n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"time = scipy.linspace(T, 0.0, m)\n", | ||
"S = scipy.linspace(S0, S1, n)\n", | ||
"logSoverK = scipy.log(S/K)\n", | ||
"n12 = (r + sigma **2/2) * (T - time)\n", | ||
"numerd1 = logSoverK[scipy.newaxis, :] + n12[:, scipy.newaxis]\n", | ||
"d1 = numerd1 / (sigma * scipy.sqrt(T - time)[:, scipy.newaxis])" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 9, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stderr", | ||
"output_type": "stream", | ||
"text": [ | ||
"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\stats\\_distn_infrastructure.py:879: RuntimeWarning: invalid value encountered in greater\n", | ||
" return (self.a < x) & (x < self.b)\n", | ||
"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\stats\\_distn_infrastructure.py:879: RuntimeWarning: invalid value encountered in less\n", | ||
" return (self.a < x) & (x < self.b)\n", | ||
"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\stats\\_distn_infrastructure.py:1738: RuntimeWarning: invalid value encountered in greater_equal\n", | ||
" cond2 = (x >= self.b) & cond0\n", | ||
"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:4: RuntimeWarning: divide by zero encountered in true_divide\n", | ||
" after removing the cwd from sys.path.\n", | ||
"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:6: RuntimeWarning: invalid value encountered in multiply\n", | ||
" \n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"from scipy.stats import norm\n", | ||
"Delta = norm.cdf(d1)\n", | ||
"denom1 = (scipy.sqrt(2 * scipy.pi) * sigma * scipy.sqrt(T - time))[:,scipy.newaxis]\n", | ||
"factor1 = 1/(denom1 * S)\n", | ||
"factor2 = scipy.exp(-d1 ** 2/2)\n", | ||
"Gamma = factor1 * factor2\n" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 15, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"data": { | ||
"text/plain": [ | ||
"array([[0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", | ||
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", | ||
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", | ||
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", | ||
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", | ||
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", | ||
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", | ||
" 0.00000000e+00, 0.00000000e+00, nan, 1.00000000e+00,\n", | ||
" 1.00000000e+00, 1.00000000e+00, 1.00000000e+00, 1.00000000e+00,\n", | ||
" 1.00000000e+00, 1.00000000e+00, 1.00000000e+00, 1.00000000e+00,\n", | ||
" 1.00000000e+00, 1.00000000e+00, 1.00000000e+00, 1.00000000e+00,\n", | ||
" 1.00000000e+00, 1.00000000e+00, 1.00000000e+00, 1.00000000e+00,\n", | ||
" 1.00000000e+00, 1.00000000e+00, 1.00000000e+00, 1.00000000e+00,\n", | ||
" 1.00000000e+00, 1.00000000e+00, 1.00000000e+00, 1.00000000e+00,\n", | ||
" 1.00000000e+00, 1.00000000e+00, 1.00000000e+00, 1.00000000e+00,\n", | ||
" 1.00000000e+00],\n", | ||
" [6.01382828e-14, 6.26955737e-13, 5.74204721e-12, 4.64334125e-11,\n", | ||
" 3.33133588e-10, 2.13023244e-09, 1.21945617e-08, 6.27574120e-08,\n", | ||
" 2.91526051e-07, 1.22712145e-06, 4.69802901e-06, 1.64181064e-05,\n", | ||
" 5.25553893e-05, 1.54617082e-04, 4.19430354e-04, 1.05245368e-03,\n", | ||
" 2.45038099e-03, 5.30973314e-03, 1.07404346e-02, 2.03409083e-02,\n", | ||
" 3.61744974e-02, 6.05906930e-02, 9.58694121e-02, 1.43729360e-01,\n", | ||
" 2.04810977e-01, 2.78287647e-01, 3.61747927e-01, 4.51421161e-01,\n", | ||
" 5.42712896e-01, 6.30917615e-01, 7.11924939e-01, 7.82749629e-01,\n", | ||
" 8.41784056e-01, 8.88762237e-01, 9.24501504e-01, 9.50528351e-01,\n", | ||
" 9.68694888e-01, 9.80863100e-01, 9.88693730e-01, 9.93540763e-01,\n", | ||
" 9.96429726e-01, 9.98089528e-01, 9.99009691e-01, 9.99502411e-01,\n", | ||
" 9.99757492e-01, 9.99885284e-01, 9.99947295e-01, 9.99976466e-01,\n", | ||
" 9.99989780e-01, 9.99995681e-01, 9.99998223e-01, 9.99999287e-01,\n", | ||
" 9.99999721e-01, 9.99999894e-01, 9.99999960e-01, 9.99999986e-01,\n", | ||
" 9.99999995e-01, 9.99999998e-01, 9.99999999e-01, 1.00000000e+00,\n", | ||
" 1.00000000e+00],\n", | ||
" [6.20562781e-07, 1.87590526e-06, 5.32503139e-06, 1.42304381e-05,\n", | ||
" 3.58880634e-05, 8.56098609e-05, 1.93599726e-04, 4.15929717e-04,\n", | ||
" 8.50670599e-04, 1.65954464e-03, 3.09408947e-03, 5.52327771e-03,\n", | ||
" 9.45715745e-03, 1.55590234e-02, 2.46377741e-02, 3.76132838e-02,\n", | ||
" 5.54512369e-02, 7.90696571e-02, 1.09226213e-01, 1.46401609e-01,\n", | ||
" 1.90698110e-01, 2.41772170e-01, 2.98815753e-01, 3.60593072e-01,\n", | ||
" 4.25529802e-01, 4.91842686e-01, 5.57690755e-01, 6.21326707e-01,\n", | ||
" 6.81228392e-01, 7.36195351e-01, 7.85402350e-01, 8.28409298e-01,\n", | ||
" 8.65133241e-01, 8.95792389e-01, 9.20833947e-01, 9.40857142e-01,\n", | ||
" 9.56540768e-01, 9.68581746e-01, 9.77648068e-01, 9.84346885e-01,\n", | ||
" 9.89206455e-01, 9.92669494e-01, 9.95094968e-01, 9.96765396e-01,\n", | ||
" 9.97897161e-01, 9.98651873e-01, 9.99147430e-01, 9.99467969e-01,\n", | ||
" 9.99672295e-01, 9.99800703e-01, 9.99880293e-01, 9.99928967e-01,\n", | ||
" 9.99958346e-01, 9.99975855e-01, 9.99986161e-01, 9.99992155e-01,\n", | ||
" 9.99995601e-01, 9.99997559e-01, 9.99998659e-01, 9.99999271e-01,\n", | ||
" 9.99999607e-01],\n", | ||
" [1.38233219e-04, 2.76901743e-04, 5.32583238e-04, 9.85218346e-04,\n", | ||
" 1.75575748e-03, 3.01897103e-03, 5.01608338e-03, 8.06504275e-03,\n", | ||
" 1.25657139e-02, 1.89971416e-02, 2.79044431e-02, 3.98739251e-02,\n", | ||
" 5.54966066e-02, 7.53222533e-02, 9.98079384e-02, 1.29266658e-01,\n", | ||
" 1.63822282e-01, 2.03376911e-01, 2.47595481e-01, 2.95910422e-01,\n", | ||
" 3.47546629e-01, 4.01564443e-01, 4.56916101e-01, 5.12509665e-01,\n", | ||
" 5.67273857e-01, 6.20217570e-01, 6.70478979e-01, 7.17360830e-01,\n", | ||
" 7.60350352e-01, 7.99124060e-01, 8.33539196e-01, 8.63614608e-01,\n", | ||
" 8.89504392e-01, 9.11467681e-01, 9.29837665e-01, 9.44992325e-01,\n", | ||
" 9.57328677e-01, 9.67241593e-01, 9.75107614e-01, 9.81273668e-01,\n", | ||
" 9.86050190e-01, 9.89707969e-01, 9.92477891e-01, 9.94552813e-01,\n", | ||
" 9.96090803e-01, 9.97219177e-01, 9.98038824e-01, 9.98628475e-01,\n", | ||
" 9.99048695e-01, 9.99345441e-01, 9.99553138e-01, 9.99697256e-01,\n", | ||
" 9.99796420e-01, 9.99864097e-01, 9.99909919e-01, 9.99940704e-01,\n", | ||
" 9.99961231e-01, 9.99974819e-01, 9.99983750e-01, 9.99989578e-01,\n", | ||
" 9.99993357e-01],\n", | ||
" [2.05422185e-03, 3.35277647e-03, 5.31315663e-03, 8.18547073e-03,\n", | ||
" 1.22746057e-02, 1.79371476e-02, 2.55723768e-02, 3.56068042e-02,\n", | ||
" 4.84724713e-02, 6.45801093e-02, 8.42890929e-02, 1.07876801e-01,\n", | ||
" 1.35510367e-01, 1.67223819e-01, 2.02903177e-01, 2.42281365e-01,\n", | ||
" 2.84943753e-01, 3.30344080e-01, 3.77829402e-01, 4.26671899e-01,\n", | ||
" 4.76104743e-01, 5.25359033e-01, 5.73698908e-01, 6.20452327e-01,\n", | ||
" 6.65035679e-01, 7.06971062e-01, 7.45895881e-01, 7.81565044e-01,\n", | ||
" 8.13846640e-01, 8.42712306e-01, 8.68223761e-01, 8.90516966e-01,\n", | ||
" 9.09785302e-01, 9.26262966e-01, 9.40209524e-01, 9.51896265e-01,\n", | ||
" 9.61594780e-01, 9.69567898e-01, 9.76062967e-01, 9.81307286e-01,\n", | ||
" 9.85505431e-01, 9.88838144e-01, 9.91462463e-01, 9.93512754e-01,\n", | ||
" 9.95102372e-01, 9.96325705e-01, 9.97260384e-01, 9.97969533e-01,\n", | ||
" 9.98503917e-01, 9.98903951e-01, 9.99201491e-01, 9.99421420e-01,\n", | ||
" 9.99582996e-01, 9.99701003e-01, 9.99786696e-01, 9.99848578e-01,\n", | ||
" 9.99893022e-01, 9.99924775e-01, 9.99947344e-01, 9.99963305e-01,\n", | ||
" 9.99974539e-01],\n", | ||
" [1.02586924e-02, 1.48186897e-02, 2.09233905e-02, 2.89068792e-02,\n", | ||
" 3.91148918e-02, 5.18875894e-02, 6.75396707e-02, 8.63392451e-02,\n", | ||
" 1.08487174e-01, 1.34098690e-01, 1.63189010e-01, 1.95664332e-01,\n", | ||
" 2.31319171e-01, 2.69840391e-01, 3.10817706e-01, 3.53759846e-01,\n", | ||
" 3.98115129e-01, 4.43294885e-01, 4.88697995e-01, 5.33734882e-01,\n", | ||
" 5.77849434e-01, 6.20537669e-01, 6.61362284e-01, 6.99962642e-01,\n", | ||
" 7.36060143e-01, 7.69459214e-01, 8.00044461e-01, 8.27774671e-01,\n", | ||
" 8.52674460e-01, 8.74824375e-01, 8.94350226e-01, 9.11412321e-01,\n", | ||
" 9.26195149e-01, 9.38897952e-01, 9.49726457e-01, 9.58885927e-01,\n", | ||
" 9.66575589e-01, 9.72984408e-01, 9.78288093e-01, 9.82647208e-01,\n", | ||
" 9.86206213e-01, 9.89093262e-01, 9.91420591e-01, 9.93285337e-01,\n", | ||
" 9.94770647e-01, 9.95946964e-01, 9.96873398e-01, 9.97599098e-01,\n", | ||
" 9.98164581e-01, 9.98602979e-01, 9.98941173e-01, 9.99200814e-01,\n", | ||
" 9.99399218e-01, 9.99550141e-01, 9.99664441e-01, 9.99750633e-01,\n", | ||
" 9.99815360e-01, 9.99863770e-01, 9.99899835e-01, 9.99926600e-01,\n", | ||
" 9.99946390e-01]])" | ||
] | ||
}, | ||
"execution_count": 15, | ||
"metadata": {}, | ||
"output_type": "execute_result" | ||
} | ||
], | ||
"source": [ | ||
"Delta" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": null, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [] | ||
} | ||
], | ||
"metadata": { | ||
"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.7.0" | ||
} | ||
}, | ||
"nbformat": 4, | ||
"nbformat_minor": 2 | ||
} |
124 changes: 124 additions & 0 deletions
124
.ipynb_checkpoints/Finding the implied volatility-checkpoint.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
{ | ||
"cells": [ | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 5, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"# http://www.codeandfinance.com/finding-implied-vol.html\n", | ||
"import numpy as np\n", | ||
"import pandas as pd\n", | ||
"import math\n", | ||
"from scipy.stats import norm\n", | ||
"import datetime" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 16, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"def find_vol(target_value, call_put, S, K, T, r):\n", | ||
" MAX_ITERATIONS = 100\n", | ||
" PRECISION = 1.0e-5\n", | ||
" i = 0\n", | ||
" sigma = 0.5\n", | ||
" for i in range(0, MAX_ITERATIONS):\n", | ||
" price = bs_price(call_put, S, K, T, r, sigma)\n", | ||
" vega = bs_vega(call_put, S, K, T, r, sigma)\n", | ||
"\n", | ||
" price = price\n", | ||
" diff = target_value - price # our root\n", | ||
"\n", | ||
" print (i, sigma, diff)\n", | ||
"\n", | ||
" if (abs(diff) < PRECISION):\n", | ||
" return sigma\n", | ||
" sigma = sigma + diff/vega # f(x) / f'(x)\n", | ||
" i = i + 1\n", | ||
"\n", | ||
" # value wasn't found, return best guess so far\n", | ||
" return sigma" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 17, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"n = norm.pdf\n", | ||
"N = norm.cdf\n", | ||
"\n", | ||
"def bs_price(cp_flag,S,K,T,r,v,q=0.0):\n", | ||
" d1 = (np.log(S/K)+(r+v*v/2.)*T)/(v*np.sqrt(T))\n", | ||
" d2 = d1-v*np.sqrt(T)\n", | ||
" if cp_flag == 'c':\n", | ||
" price = S*np.exp(-q*T)*N(d1)-K*np.exp(-r*T)*N(d2)\n", | ||
" else:\n", | ||
" price = K*np.exp(-r*T)*N(-d2)-S*np.exp(-q*T)*N(-d1)\n", | ||
" return price\n", | ||
"\n", | ||
"def bs_vega(cp_flag,S,K,T,r,v,q=0.0):\n", | ||
" d1 = (np.log(S/K)+(r+v*v/2.)*T)/(v*np.sqrt(T))\n", | ||
" return S * np.sqrt(T)*n(d1)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 19, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"0 0.5 -21.669539271534063\n", | ||
"1 0.21879739316064523 0.03217154881230044\n", | ||
"2 0.21921383628613422 1.9891615465894574e-08\n", | ||
"Implied vol: 21.92%\n", | ||
"Market price = 17.50\n", | ||
"Model price = 17.50\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"V_market = 17.5\n", | ||
"K = 585\n", | ||
"T = (datetime.date(2014,10,18) - datetime.date(2014,9,8)).days / 365.\n", | ||
"S = 586.08\n", | ||
"r = 0.0002\n", | ||
"cp = 'c' # call option\n", | ||
"\n", | ||
"implied_vol = find_vol(V_market, cp, S, K, T, r)\n", | ||
"\n", | ||
"print('Implied vol: %.2f%%' % (implied_vol * 100))\n", | ||
"print('Market price = %.2f' % V_market)\n", | ||
"print('Model price = %.2f' % bs_price(cp, S, K, T, r, implied_vol))" | ||
] | ||
} | ||
], | ||
"metadata": { | ||
"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.7.0" | ||
} | ||
}, | ||
"nbformat": 4, | ||
"nbformat_minor": 2 | ||
} |
Oops, something went wrong.