├── README.md
└── VaR.ipynb
/README.md:
--------------------------------------------------------------------------------
1 | # Value_at_Risk_Python
2 |
3 | The Value at Risk (VaR) calculation, Python version
4 |
5 | # Model description
6 | Volatility model: GARCH(1,1)
7 |
8 | VaR model: historical simulation with volatility updating
9 |
10 | Backtesting: binomial test
11 |
--------------------------------------------------------------------------------
/VaR.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "name": "VaR.ipynb",
7 | "provenance": [],
8 | "include_colab_link": true
9 | },
10 | "kernelspec": {
11 | "name": "python3",
12 | "display_name": "Python 3"
13 | }
14 | },
15 | "cells": [
16 | {
17 | "cell_type": "markdown",
18 | "metadata": {
19 | "id": "view-in-github",
20 | "colab_type": "text"
21 | },
22 | "source": [
23 | "
"
24 | ]
25 | },
26 | {
27 | "cell_type": "code",
28 | "metadata": {
29 | "id": "av5Mm9F_0egA",
30 | "colab_type": "code",
31 | "outputId": "5b89f591-decd-42a7-8f8e-cfa99a2c630e",
32 | "colab": {
33 | "base_uri": "https://localhost:8080/",
34 | "height": 309
35 | }
36 | },
37 | "source": [
38 | "pip install arch"
39 | ],
40 | "execution_count": 1,
41 | "outputs": [
42 | {
43 | "output_type": "stream",
44 | "text": [
45 | "Collecting arch\n",
46 | "\u001b[?25l Downloading https://files.pythonhosted.org/packages/b7/05/241c4238e9ee8cfb78b2053c059fb5ce6d1bc32a1266eb99a39e96a00069/arch-4.10.0-cp36-cp36m-manylinux1_x86_64.whl (710kB)\n",
47 | "\u001b[K |████████████████████████████████| 716kB 2.8MB/s \n",
48 | "\u001b[?25hRequirement already satisfied: statsmodels>=0.9 in /usr/local/lib/python3.6/dist-packages (from arch) (0.10.1)\n",
49 | "Requirement already satisfied: cython>=0.29 in /usr/local/lib/python3.6/dist-packages (from arch) (0.29.13)\n",
50 | "Collecting property-cached>=1.6.2\n",
51 | " Downloading https://files.pythonhosted.org/packages/c0/11/6e91ff5fe0476492f023cebad434a1a34fc513cfa98ddb1f3e5c856d2d99/property_cached-1.6.3-py2.py3-none-any.whl\n",
52 | "Requirement already satisfied: pandas>=0.22 in /usr/local/lib/python3.6/dist-packages (from arch) (0.25.2)\n",
53 | "Requirement already satisfied: scipy>=1.0 in /usr/local/lib/python3.6/dist-packages (from arch) (1.3.1)\n",
54 | "Requirement already satisfied: numpy>=1.14 in /usr/local/lib/python3.6/dist-packages (from arch) (1.17.3)\n",
55 | "Requirement already satisfied: patsy>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from statsmodels>=0.9->arch) (0.5.1)\n",
56 | "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.22->arch) (2018.9)\n",
57 | "Requirement already satisfied: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.22->arch) (2.6.1)\n",
58 | "Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from patsy>=0.4.0->statsmodels>=0.9->arch) (1.12.0)\n",
59 | "Installing collected packages: property-cached, arch\n",
60 | "Successfully installed arch-4.10.0 property-cached-1.6.3\n"
61 | ],
62 | "name": "stdout"
63 | }
64 | ]
65 | },
66 | {
67 | "cell_type": "code",
68 | "metadata": {
69 | "id": "XC7Ce1A_zoF_",
70 | "colab_type": "code",
71 | "colab": {}
72 | },
73 | "source": [
74 | "# example of ARCH model\n",
75 | "import numpy as np\n",
76 | "from random import gauss\n",
77 | "from random import seed\n",
78 | "from matplotlib import pyplot\n",
79 | "from arch import arch_model\n",
80 | "import pandas as pd\n",
81 | "from scipy.stats import binom"
82 | ],
83 | "execution_count": 0,
84 | "outputs": []
85 | },
86 | {
87 | "cell_type": "markdown",
88 | "metadata": {
89 | "id": "TlKwBVLjQqUY",
90 | "colab_type": "text"
91 | },
92 | "source": [
93 | "Read and preprocess the data such as calculating the continously compounded return."
94 | ]
95 | },
96 | {
97 | "cell_type": "code",
98 | "metadata": {
99 | "id": "e_-w3EY12eHo",
100 | "colab_type": "code",
101 | "colab": {}
102 | },
103 | "source": [
104 | "# here we use the USD YEN exchange rate as an example\n",
105 | "# Data is downloaded from https://www.macrotrends.net/2550/dollar-yen-exchange-rate-historical-chart\n",
106 | "data = pd.read_csv(\"dollar-yen-exchange-rate-historical-chart.csv\", header = 8) "
107 | ],
108 | "execution_count": 0,
109 | "outputs": []
110 | },
111 | {
112 | "cell_type": "code",
113 | "metadata": {
114 | "id": "EjaJZtf7Kt7A",
115 | "colab_type": "code",
116 | "colab": {
117 | "base_uri": "https://localhost:8080/",
118 | "height": 204
119 | },
120 | "outputId": "4c3abf6a-2a64-4af9-8756-b9403bb906f2"
121 | },
122 | "source": [
123 | "data.tail()"
124 | ],
125 | "execution_count": 4,
126 | "outputs": [
127 | {
128 | "output_type": "execute_result",
129 | "data": {
130 | "text/html": [
131 | "
\n",
132 | "\n",
145 | "
\n",
146 | " \n",
147 | " \n",
148 | " | \n",
149 | " date | \n",
150 | " value | \n",
151 | "
\n",
152 | " \n",
153 | " \n",
154 | " \n",
155 | " | 12385 | \n",
156 | " 2019-10-26 | \n",
157 | " 108.6650 | \n",
158 | "
\n",
159 | " \n",
160 | " | 12386 | \n",
161 | " 2019-10-28 | \n",
162 | " 108.9695 | \n",
163 | "
\n",
164 | " \n",
165 | " | 12387 | \n",
166 | " 2019-10-29 | \n",
167 | " 108.8665 | \n",
168 | "
\n",
169 | " \n",
170 | " | 12388 | \n",
171 | " 2019-10-30 | \n",
172 | " 108.8185 | \n",
173 | "
\n",
174 | " \n",
175 | " | 12389 | \n",
176 | " 2019-10-31 | \n",
177 | " 108.1675 | \n",
178 | "
\n",
179 | " \n",
180 | "
\n",
181 | "
"
182 | ],
183 | "text/plain": [
184 | " date value\n",
185 | "12385 2019-10-26 108.6650\n",
186 | "12386 2019-10-28 108.9695\n",
187 | "12387 2019-10-29 108.8665\n",
188 | "12388 2019-10-30 108.8185\n",
189 | "12389 2019-10-31 108.1675"
190 | ]
191 | },
192 | "metadata": {
193 | "tags": []
194 | },
195 | "execution_count": 4
196 | }
197 | ]
198 | },
199 | {
200 | "cell_type": "code",
201 | "metadata": {
202 | "id": "MpLgfW9CI6fZ",
203 | "colab_type": "code",
204 | "colab": {
205 | "base_uri": "https://localhost:8080/",
206 | "height": 224
207 | },
208 | "outputId": "4526912e-964c-4165-8634-c3031afd8555"
209 | },
210 | "source": [
211 | "# preprocessing the data\n",
212 | "df=data[(data['date'] >= '2009-10-31') & (data['date'] <= '2019-10-31')]\n",
213 | "df.rename(columns={' value':'value'}, inplace=True)\n",
214 | "df['return']=df.value.pct_change()\n",
215 | "# define a new list which ignore the first (index 0) NAN value\n",
216 | "return_list=df['return'].tolist()[1:]"
217 | ],
218 | "execution_count": 5,
219 | "outputs": [
220 | {
221 | "output_type": "stream",
222 | "text": [
223 | "/usr/local/lib/python3.6/dist-packages/pandas/core/frame.py:4238: SettingWithCopyWarning: \n",
224 | "A value is trying to be set on a copy of a slice from a DataFrame\n",
225 | "\n",
226 | "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
227 | " return super().rename(**kwargs)\n",
228 | "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:3: SettingWithCopyWarning: \n",
229 | "A value is trying to be set on a copy of a slice from a DataFrame.\n",
230 | "Try using .loc[row_indexer,col_indexer] = value instead\n",
231 | "\n",
232 | "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
233 | " This is separate from the ipykernel package so we can avoid doing imports until\n"
234 | ],
235 | "name": "stderr"
236 | }
237 | ]
238 | },
239 | {
240 | "cell_type": "markdown",
241 | "metadata": {
242 | "id": "41E2WxK-P9RO",
243 | "colab_type": "text"
244 | },
245 | "source": [
246 | "GARCH(1,1) model is used to determined the volatility."
247 | ]
248 | },
249 | {
250 | "cell_type": "code",
251 | "metadata": {
252 | "id": "E-RHDDEcN7bf",
253 | "colab_type": "code",
254 | "outputId": "3d9c580f-56c8-404f-a281-73d3214e68f1",
255 | "colab": {
256 | "base_uri": "https://localhost:8080/",
257 | "height": 768
258 | }
259 | },
260 | "source": [
261 | "# Using GARCH(1,1) to determine the volatility\n",
262 | "model = arch_model(return_list, mean='Zero', vol='GARCH', p=1, q=1)\n",
263 | "model_fit = model.fit()\n",
264 | "volatility = model_fit.conditional_volatility\n",
265 | "print(model_fit.summary())"
266 | ],
267 | "execution_count": 6,
268 | "outputs": [
269 | {
270 | "output_type": "stream",
271 | "text": [
272 | "Iteration: 1, Func. Count: 5, Neg. LLF: -10085.986032212\n",
273 | "Positive directional derivative for linesearch (Exit mode 8)\n",
274 | " Current function value: -10085.986035013902\n",
275 | " Iterations: 5\n",
276 | " Function evaluations: 5\n",
277 | " Gradient evaluations: 1\n",
278 | " Zero Mean - GARCH Model Results \n",
279 | "==============================================================================\n",
280 | "Dep. Variable: y R-squared: 0.000\n",
281 | "Mean Model: Zero Mean Adj. R-squared: 0.000\n",
282 | "Vol Model: GARCH Log-Likelihood: 10086.0\n",
283 | "Distribution: Normal AIC: -20166.0\n",
284 | "Method: Maximum Likelihood BIC: -20148.3\n",
285 | " No. Observations: 2646\n",
286 | "Date: Fri, Nov 01 2019 Df Residuals: 2643\n",
287 | "Time: 08:55:04 Df Model: 3\n",
288 | " Volatility Model \n",
289 | "============================================================================\n",
290 | " coef std err t P>|t| 95.0% Conf. Int.\n",
291 | "----------------------------------------------------------------------------\n",
292 | "omega 6.5006e-07 3.058e-11 2.126e+04 0.000 [6.500e-07,6.501e-07]\n",
293 | "alpha[1] 0.0500 7.916e-03 6.317 2.674e-10 [3.449e-02,6.551e-02]\n",
294 | "beta[1] 0.9300 7.033e-03 132.234 0.000 [ 0.916, 0.944]\n",
295 | "============================================================================\n",
296 | "\n",
297 | "Covariance estimator: robust\n",
298 | "\n",
299 | "WARNING: The optimizer did not indicate successful convergence. The message was\n",
300 | "Positive directional derivative for linesearch. See convergence_flag.\n"
301 | ],
302 | "name": "stdout"
303 | },
304 | {
305 | "output_type": "stream",
306 | "text": [
307 | "/usr/local/lib/python3.6/dist-packages/arch/univariate/base.py:260: DataScaleWarning: y is poorly scaled, which may affect convergence of the optimizer when\n",
308 | "estimating the model parameters. The scale of y is 3.25e-05. Parameter\n",
309 | "estimation work better when this value is between 1 and 1000. The recommended\n",
310 | "rescaling is 1000 * y.\n",
311 | "\n",
312 | "This warning can be disabled by either rescaling y before initializing the\n",
313 | "model or by setting rescale=False.\n",
314 | "\n",
315 | " DataScaleWarning)\n",
316 | "/usr/local/lib/python3.6/dist-packages/arch/univariate/base.py:605: ConvergenceWarning: The optimizer returned code 8. The message is:\n",
317 | "Positive directional derivative for linesearch\n",
318 | "See scipy.optimize.fmin_slsqp for code meaning.\n",
319 | "\n",
320 | " ConvergenceWarning)\n"
321 | ],
322 | "name": "stderr"
323 | }
324 | ]
325 | },
326 | {
327 | "cell_type": "markdown",
328 | "metadata": {
329 | "id": "gXxF-vwnUFfU",
330 | "colab_type": "text"
331 | },
332 | "source": [
333 | "Estimate the Volatility in the next date with the GARCH(1,1) model"
334 | ]
335 | },
336 | {
337 | "cell_type": "code",
338 | "metadata": {
339 | "id": "e3EuHIKqUFGf",
340 | "colab_type": "code",
341 | "colab": {
342 | "base_uri": "https://localhost:8080/",
343 | "height": 34
344 | },
345 | "outputId": "2df7562d-c1c0-4d8f-8ed7-35878213f98b"
346 | },
347 | "source": [
348 | "# Estimate the volatility in the next date\n",
349 | "omega = model_fit.params['omega'] \n",
350 | "alpha = model_fit.params['alpha[1]']\n",
351 | "beta = model_fit.params['beta[1]']\n",
352 | "vola_estimate = omega + alpha * np.power(return_list[-1] , 2) + beta * np.power( volatility[-1] , 2 )\n",
353 | "vola_estimate = np.sqrt(vola_estimate)\n",
354 | "print('The volatility in the next date=', vola_estimate )\n",
355 | "#return_scienarios = []\n",
356 | "#for i in range(0,return_list)"
357 | ],
358 | "execution_count": 7,
359 | "outputs": [
360 | {
361 | "output_type": "stream",
362 | "text": [
363 | "vola= 0.0038338334199308896\n"
364 | ],
365 | "name": "stdout"
366 | }
367 | ]
368 | },
369 | {
370 | "cell_type": "markdown",
371 | "metadata": {
372 | "id": "4KJXGsPbLYov",
373 | "colab_type": "text"
374 | },
375 | "source": [
376 | "Value at Risk Calculation: historical simulation with volatility updating"
377 | ]
378 | },
379 | {
380 | "cell_type": "code",
381 | "metadata": {
382 | "id": "V_5xkz4Wl1Pz",
383 | "colab_type": "code",
384 | "colab": {}
385 | },
386 | "source": [
387 | "# calculate the predicted value in the next date under different scenario and inporporate volatility updating\n",
388 | "Market_scienarios = []\n",
389 | "N_history = len(return_list)\n",
390 | "Value_current = df.loc[df.index[-1], 'value']\n",
391 | "df.loc[df.index[-1], 'value']\n",
392 | "for i in range(0, N_history ):\n",
393 | " Market_value = Value_current * ( 1 + return_list[i] * vola_estimate/volatility[i] )\n",
394 | " Market_scienarios.append(Market_value)"
395 | ],
396 | "execution_count": 0,
397 | "outputs": []
398 | },
399 | {
400 | "cell_type": "code",
401 | "metadata": {
402 | "id": "jg2kWLUWl1CM",
403 | "colab_type": "code",
404 | "colab": {
405 | "base_uri": "https://localhost:8080/",
406 | "height": 34
407 | },
408 | "outputId": "49688cf9-4221-40db-e352-4e120e34d6d3"
409 | },
410 | "source": [
411 | "# Value at Risk (VaR) determination\n",
412 | "# CL_Var: condifence level for VaR\n",
413 | "CL_VaR = 95\n",
414 | "Value_current = df.loc[df.index[-1], 'value']\n",
415 | "Value_at_Risk = np.percentile(Market_scienarios,100-CL_VaR) - Value_current\n",
416 | "print(\"The 1 day\", CL_VaR,\"% VaR:\", -Value_at_Risk)"
417 | ],
418 | "execution_count": 11,
419 | "outputs": [
420 | {
421 | "output_type": "stream",
422 | "text": [
423 | "The 1 day 95 % VaR: 0.64802029956887\n"
424 | ],
425 | "name": "stdout"
426 | }
427 | ]
428 | },
429 | {
430 | "cell_type": "code",
431 | "metadata": {
432 | "id": "ZLxs5LYPl04T",
433 | "colab_type": "code",
434 | "colab": {
435 | "base_uri": "https://localhost:8080/",
436 | "height": 295
437 | },
438 | "outputId": "706029cf-b809-49e8-8fa0-d62d6d632966"
439 | },
440 | "source": [
441 | "# Make the histogram of loss for the scenaros considered between current date and the next date\n",
442 | "import matplotlib.pyplot as plt\n",
443 | "mss = np.asarray(Value_current - Market_scienarios )\n",
444 | "\n",
445 | "plt.xlim([min(mss), max(mss)])\n",
446 | "\n",
447 | "plt.hist(mss, bins='auto', alpha=0.5)\n",
448 | "plt.title('Plot of loss for the scenaros')\n",
449 | "plt.xlabel('Loss')\n",
450 | "plt.ylabel('Frequency')\n",
451 | "plt.axvline( -Value_at_Risk , color='k', linestyle='dashed', linewidth=1)\n",
452 | "min_ylim, max_ylim = plt.ylim()\n",
453 | "plt.text(-Value_at_Risk*1.1, max_ylim*0.9, '{}% VaR: {:.2f}'.format(CL_VaR ,-Value_at_Risk))\n",
454 | "plt.show()"
455 | ],
456 | "execution_count": 24,
457 | "outputs": [
458 | {
459 | "output_type": "display_data",
460 | "data": {
461 | "image/png": "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\n5557sn79+q3mef755+nZsydnnXUWgwcPZvz48bzxxhuN7nNbkllSkLSzpEclPSbpCUnTkvL9JD0i\naYWkX0jaKSl/XzK+IpneP6vYzKxlRo0atdX4IYccwsUXX8wJJ5zAsGHDGDRoEJ07dwYK3+CfffZZ\nli5dSu/evbnooosAGDRoEIsXL+bBBx/kueeeo3fv3kQEo0eP5nOf+xxr167dZrujR4/m9ttvZ8uW\nLds0Hc2dO5chQ4YwePBgnnjiCZ588snitNNPP5399tuP6dOnc9555xXLf/zjH7f43RCbN29myZIl\nnHPOOfzxj39kt91244orrmh0n9uSLGsKbwHHRcQRwCBgmKSjgf8Ero6IA4BXgHHJ/OOAV5Lyq5P5\nzKyVGzduHLW1tSxatIju3btz4IGFB/B69epF586d6dSpExMmTODRRx/darmI4PLLL+cb3/gG06ZN\n4zvf+Q4TJkzguuuu22Yb/fr1Y7/99uOhhx7ijjvuYPTo0UDhW/uVV17JwoULWbZsGZ/+9Kf5+9//\nXlzu1ltv5bnnnmPs2LFccMEFTe5LVVVVsaazefNmXn31Vfbaa6+t5unbty99+/blqKOOAgrNTEuW\nLEm1z21BZkkhCl5PRrsmnwCOA25Pym8C6ut0JybjJNM/LklZxWdmO8bLL78MwF/+8hfuvPNOPvvZ\nzwJb95N01113cdhhh2213M0338zw4cPp0aMHmzZtolOnTnTq1IlNmzaV3c6YMWOYPHky+++/P337\n9gVg48aN7Lbbbuy5556sXbuWX/7yl9ssJ4lvfetbLF68mKeeeqrRfRk1ahQ33VQ4Dd1+++0cd9xx\nNDwN7bPPPvTr14+nn34agIULFzJw4MBU+9wWZNrNhaTOQC1wAPB94FlgQ0RsTmZZBVQlw1XASoCI\n2CzpVWAv4K8N1jkRmAjwgQ98IMvwzayBGTNmbFP2b//2b6xfv56uXbvy/e9/v3jR9atf/SpLly5F\nEv37999q2U2bNjF79mzuu+8+AC688EKGDx/OTjvtxG233VZ226eccgpf/OIXuf7664tlRxxxBIMH\nD+bggw+mX79+fPjDHy677C677MJFF13Ed7/7XW688UbGjx/PF77whW2akMaNG8cZZ5zBAQccQI8e\nPYrXMVavXs348eOLt5hef/31nH766bz99tvsv//+/PSnP21yn9sKNbyynslGpG7AXcA3gNlJExGS\n+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\n",
462 | "text/plain": [
463 | ""
464 | ]
465 | },
466 | "metadata": {
467 | "tags": []
468 | }
469 | }
470 | ]
471 | },
472 | {
473 | "cell_type": "markdown",
474 | "metadata": {
475 | "id": "GdR_yJpCELCA",
476 | "colab_type": "text"
477 | },
478 | "source": [
479 | "Value-at-Risk backtesting:\n",
480 | "here the binomial one-tailed test is used"
481 | ]
482 | },
483 | {
484 | "cell_type": "code",
485 | "metadata": {
486 | "id": "XCj_nmDdEKAJ",
487 | "colab_type": "code",
488 | "colab": {
489 | "base_uri": "https://localhost:8080/",
490 | "height": 51
491 | },
492 | "outputId": "cec7515f-fb18-45c7-a580-e206caef50f7"
493 | },
494 | "source": [
495 | "# Confidence level for backtesting\n",
496 | "CL_backtesting = 95\n",
497 | "# The probability of the VaR beeing exceeded on given day\n",
498 | "p = 1 - CL_VaR/100\n",
499 | "N_confidence = binom.ppf( CL_backtesting*0.01, N_history, p)\n",
500 | "N_exceeded = sum( v < Value_at_Risk + Value_current for v in Market_scienarios)\n",
501 | "\n",
502 | "print(\"We look at total\", N_history,\"days. VaR level is reached at\", N_exceeded , \"days.\")\n",
503 | "if N_exceeded <= N_confidence:\n",
504 | " print (\"This VaR model is accepted at\", CL_backtesting,\"% confidence level.\")\n",
505 | "else:\n",
506 | " print (\"This VaR model is rejected at\", CL_backtesting,\"% confidence level.\")"
507 | ],
508 | "execution_count": 26,
509 | "outputs": [
510 | {
511 | "output_type": "stream",
512 | "text": [
513 | "We look at total 2646 days. VaR level is reached at 133 days.\n",
514 | "This VaR model is accepted at 95 % confidence level.\n"
515 | ],
516 | "name": "stdout"
517 | }
518 | ]
519 | }
520 | ]
521 | }
--------------------------------------------------------------------------------