2026-01-05 15:02:00 +00:00
{
"cells": [
{
"cell_type": "markdown",
"id": "9162ed1c",
"metadata": {},
"source": [
"# Validus Risk Management Case Study"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "004f0ed6",
"metadata": {},
"outputs": [],
"source": [
"import math as m\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt \n",
"import seaborn as sns\n",
"import numpy_financial as npf"
]
},
{
"cell_type": "markdown",
"id": "a9b3921a",
"metadata": {},
"source": [
"# Monte Carlo Simulation for GBPHUF FX Spot Rate\n",
"\n",
"The formula for Geometric Brownian Motion takes the following form:\n",
"\n",
"$$\n",
"dS_t = \\mu S_t \\, dt + \\sigma S_t \\, dW_t\n",
"$$\n",
"\n",
"where:\n",
"\n",
"- $ S_t $ is the asset price at time t \n",
"- $ \\mu $ is the drift \n",
"- $ \\sigma $ is the volatility \n",
"- $ W_t $ is a Wiener process\n",
"\n",
"\n",
"We can apply Ito's Lemma to $ f(t,S) = ln(S) $ to get the dynamic of $ ln(S_t) $. This yields:\n",
"\n",
"$$\n",
"S_t\n",
"=\n",
"S_0\n",
"\\exp\\!\\left(\n",
"\\left(\\mu - \\tfrac{1}{2}\\sigma^2\\right)(t - 0)\n",
"+ \\sigma (W_t - W_0)\n",
"\\right)\n",
"$$\n",
"\n",
"For our simulation we must discretize time with a time step $ \\delta t $. We also use properties of a Wiener process to get:\n",
"\n",
"$$\n",
"S_{t+\\delta t}\n",
"=\n",
"S_t \\exp\\!\\left[\n",
"\\left(\\mu - \\tfrac{1}{2}\\sigma^2\\right)\\delta t\n",
"+ \\sigma \\epsilon \\sqrt{\\delta t}\\, \n",
"\\right],\n",
"\\quad \\epsilon \\sim \\mathcal{N}(0,1)\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "adf3b3f2",
"metadata": {},
"outputs": [],
"source": [
"GBPHUF = 455.25 #start amount\n",
"sigma = 0.093 #this is the annual volatility \n",
"mu = 0 #drift\n",
"nr = 1000 #number of simulations\n",
"T = 5 #time to maturity \n",
"n = 5*252 #number of time steps\n",
"\n",
"nu = mu - 0.5 * sigma**2\n",
"dt = 1/252\n",
"\n",
"GBPHUF_val = np.zeros((nr,n+1))\n",
"epsilon = np.random.randn(nr,n)\n",
"\n",
"GBPHUF_val[:,0] = GBPHUF\n",
"for i in range(nr): \n",
" for j in range(1,n+1): \n",
" GBPHUF_val[i,j] = GBPHUF_val[i,j-1] * m.exp(nu*dt + sigma * dt**0.5 * epsilon[i,j-1])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "1d6367c9",
"metadata": {},
"outputs": [
{
"data": {
2026-01-11 21:22:18 +00:00
"image/png": "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
2026-01-05 15:02:00 +00:00
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure()\n",
"for i in range(nr):\n",
" plt.plot(GBPHUF_val[i,:])\n",
"plt.title('Monte Carlo Method simulations - GBM Paths');"
]
},
{
"cell_type": "markdown",
"id": "1b78657a",
"metadata": {},
"source": [
"## Question (a)\n",
"\n",
"The GBPHUF FX Spot rate tells us the amount of HUF for 1 GBP. E.g. At t = 0, 455.25 HUF can be exchanged for 1 GBP. We can therefore convert HUF cashflows to GBP cashflows using the following:\n",
"\n",
"$$\n",
"GBP_{CF} = \\frac{HUF_{CF}}{S}\n",
"$$\n",
"\n",
"$GBP_{CF}$ is our required cashflow in GBP, $HUF_{CF}$ is our cashflow in HUF and $S$ is our GBPHUF FX spot rate.\n",
"\n",
"In order to do this calculation we will find the GBPHUF FX spot rate at the required time in our simulation and divide the HUF cashflows at that date by the rate. \n",
"\n",
"Then we calculate the IRR, which is a measure of an investments profatibility, in GBP terms using the formula below.\n",
"\n",
"$$0 = \\text{NPV} = \\sum_{t=1}^{T} \\frac{C_t}{(1 + \\text{IRR})^t} - C_0$$\n",
"\n",
"where:\n",
"\n",
"- $ C_{\\text{t}} $ is the net cash inflow during the period t \n",
"- $ C_{\\text{0}} $ is the total initial investment costs\n",
"- $ t $ is the number of time periods"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "6aef8790",
"metadata": {},
"outputs": [],
"source": [
"data = pd.read_excel(r\"C:\\Users\\roryx\\Downloads\\Junior_Quant_Case_Study_Aug_2025_-_Cashflow_Model.xlsx\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "4acdc665",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Date</th>\n",
" <th>Fund</th>\n",
" <th>Cashflow Type</th>\n",
" <th>Cashflow Amount (in Local Asset Currecny)</th>\n",
" <th>Local Asset Currency</th>\n",
" <th>Fund Currency</th>\n",
" <th>Base Case IRR</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2025-08-01</td>\n",
" <td>Validus V</td>\n",
" <td>Equity</td>\n",
" <td>-100000000</td>\n",
" <td>HUF</td>\n",
" <td>GBP</td>\n",
" <td>0.149914</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2026-08-01</td>\n",
" <td>Validus V</td>\n",
" <td>Proceeds</td>\n",
" <td>15000000</td>\n",
" <td>HUF</td>\n",
" <td>GBP</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2027-08-01</td>\n",
" <td>Validus V</td>\n",
" <td>Proceeds</td>\n",
" <td>15000000</td>\n",
" <td>HUF</td>\n",
" <td>GBP</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2028-08-01</td>\n",
" <td>Validus V</td>\n",
" <td>Proceeds</td>\n",
" <td>15000000</td>\n",
" <td>HUF</td>\n",
" <td>GBP</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2029-08-01</td>\n",
" <td>Validus V</td>\n",
" <td>Proceeds</td>\n",
" <td>15000000</td>\n",
" <td>HUF</td>\n",
" <td>GBP</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>2030-08-01</td>\n",
" <td>Validus V</td>\n",
" <td>Proceeds</td>\n",
" <td>115000000</td>\n",
" <td>HUF</td>\n",
" <td>GBP</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Date Fund Cashflow Type \\\n",
"0 2025-08-01 Validus V Equity \n",
"1 2026-08-01 Validus V Proceeds \n",
"2 2027-08-01 Validus V Proceeds \n",
"3 2028-08-01 Validus V Proceeds \n",
"4 2029-08-01 Validus V Proceeds \n",
"5 2030-08-01 Validus V Proceeds \n",
"\n",
" Cashflow Amount (in Local Asset Currecny) Local Asset Currency \\\n",
"0 -100000000 HUF \n",
"1 15000000 HUF \n",
"2 15000000 HUF \n",
"3 15000000 HUF \n",
"4 15000000 HUF \n",
"5 115000000 HUF \n",
"\n",
" Fund Currency Base Case IRR \n",
"0 GBP 0.149914 \n",
"1 GBP NaN \n",
"2 GBP NaN \n",
"3 GBP NaN \n",
"4 GBP NaN \n",
"5 GBP NaN "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "fd8da1f8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Year 0 is after 0 Working Days\n",
"Year 1 is after 252 Working Days\n",
"Year 2 is after 504 Working Days\n",
"Year 3 is after 756 Working Days\n",
"Year 4 is after 1008 Working Days\n",
"Year 5 is after 1260 Working Days\n"
]
}
],
"source": [
"Years = []\n",
"for i in range(0,6):\n",
" Years.append(i*252)\n",
" print(f'Year {i} is after {i*252} Working Days')"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "a827c35e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0, 252, 504, 756, 1008, 1260]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Years"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "8955700b",
"metadata": {},
"outputs": [],
"source": [
"GBPHUF_val_aug = GBPHUF_val[:, Years] #These are the simulated spot rate values as at the date of the cashflow"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "06c632d4",
"metadata": {},
"outputs": [],
"source": [
"#Converting HUF Cashflows to GBP\n",
"GBP_CF = np.zeros_like(GBPHUF_val_aug)\n",
"for i in range(6):\n",
" GBP_CF[:, i] = data.iloc[i,3]/GBPHUF_val_aug[:,i]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "7940bb90",
"metadata": {},
"outputs": [],
"source": [
"#IRR Calculation\n",
"irr = np.zeros(len(GBP_CF))\n",
"for i in range(len(GBP_CF)):\n",
" irr[i] = npf.irr(GBP_CF[i,:])"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "632f8b1f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2026-01-11 21:22:18 +00:00
"5th Percentile: 0.07799262116281874\n",
"50th Percentile: 0.15586083188072664\n",
"95th Percentile: 0.23716705852217057\n"
2026-01-05 15:02:00 +00:00
]
}
],
"source": [
"#Finding the percentiles\n",
"p5, p50, p95 = np.percentile(irr, [5, 50, 95])\n",
"\n",
"print(f\"5th Percentile: {p5}\")\n",
"print(f\"50th Percentile: {p50}\")\n",
"print(f\"95th Percentile: {p95}\")"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "ed00cf04",
"metadata": {},
"outputs": [
{
"data": {
2026-01-11 21:22:18 +00:00
"image/png": "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
2026-01-05 15:02:00 +00:00
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#Plotting the distribution\n",
"plt.hist(irr, bins=40, color='teal', edgecolor='black')\n",
"plt.axvline(p5, color='blue', linestyle='--', label='5th Pctl')\n",
"plt.axvline(p50, color='black', linestyle='-', label='50th Pctl')\n",
"plt.axvline(p95, color='red', linestyle='--', label='95th Pctl ')\n",
"plt.xlabel('Internal Rate of Return')\n",
"plt.ylabel('Frequency')\n",
"plt.title('Distribution Of IRR Values - Unhedged Portfolio')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "0a8f0245",
"metadata": {},
"source": [
"## Question (b)\n",
"\n",
"The payoff for a European Put Option is as such \n",
"$$\n",
"\\text{Payoff} = \\max(K - S_T,\\, 0)\n",
"$$\n",
"\n",
"This means the specified option will be in the money when the GBPHUF spot rate is less than the strike price of 455.25. Therefore we are protecting againt the HUF strenghtening vs the GBP.\n",
"\n",
"For our GBPHUF option we will use the following formula:\n",
"$$\n",
"\\text{Payoff}_{\\text{HUF}} = N_{\\text{GBP}} \\max(K - S_T,\\, 0)\n",
"$$\n",
"\n",
"where:\n",
"\n",
"- $ N_{\\text{GBP}} $ is the nominal amount in GBP \n",
"- $ K $ is the strike\n",
"- $ S_T $ is the GBPHUF Spot rate at 01/08/2029\n",
"\n",
"We then convert the payoff into GBP by dividing the payoffs calculated above by the spot rate at that time. \n",
"\n",
"Then to get the price of the option we use the Fundamental Theorm of Asset pricing. $f(S_T)$ is the option payoff in GBP.\n",
"\n",
"$$\n",
"f_0 = e^{-rT}\\mathbb{E}^{\\mathbb{Q}}[f(S_T)] \\approx e^{-rT}\\frac{1}{N}\\sum_{i=1}^N f(S_T^{(i)})\n",
"$$\n",
"\n",
"As the risk-free rates are 0%, Our discount factor ($e^{-rT}$) is 1. Therefore:\n",
"\n",
"$$\n",
"Option Price = \\mathbb{E}[Payoff_T]\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "742951e8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2026-01-11 21:22:18 +00:00
"The price of our Put Option in GBP is: 20721.234535433607\n"
2026-01-05 15:02:00 +00:00
]
}
],
"source": [
"S_T = GBPHUF_val_aug[:,4]\n",
"K = 455.25\n",
"N_HUF = 100000000\n",
"N_GBP = N_HUF/K\n",
"\n",
"FinPayOff_HUF = N_GBP * np.maximum(K-S_T, 0) #N_GBP*np.maximum((K-S_T), 0)\n",
"FinPayOff_GBP = FinPayOff_HUF/S_T\n",
"\n",
"price_gbp = FinPayOff_GBP.mean()\n",
"\n",
"print(f\"The price of our Put Option in GBP is: {price_gbp}\")"
]
},
{
"cell_type": "markdown",
"id": "096f1eb3",
"metadata": {},
"source": [
"## Question (c)\n",
"\n",
"The hedged portfolio cashflows consist of:\n",
"\n",
"-The original fund cashflows <br>\n",
"-The option premium paid at t = 0 <br>\n",
"-The option payoff received at expiry (t = 4) <br>\n",
"\n",
"The IRR will then be calculated similarly to above and the two portfolios will be compared"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "0515f794",
"metadata": {},
"outputs": [],
"source": [
"#New Cashflows of the Hedged Portfolio\n",
"H_GBP_CF = GBP_CF.copy()\n",
"H_GBP_CF[:,0] = GBP_CF[:,0] - price_gbp\n",
"H_GBP_CF[:,4] = GBP_CF[:,4] + FinPayOff_GBP "
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "d6ce7fc0",
"metadata": {},
"outputs": [],
"source": [
"#IRR Calculation\n",
"irr_hp = np.zeros(len(H_GBP_CF))\n",
"for i in range(len(H_GBP_CF)):\n",
" irr_hp[i] = npf.irr(H_GBP_CF[i,:])"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "1c534a68",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2026-01-11 21:22:18 +00:00
"5th Percentile of Hedged Portfolio: 0.05. 5th Percentile of Unhedged Portfolio: 0.08.\n",
"50th Percentile of Hedged Portfolio: 0.13. 50th Percentile of Unhedged Portfolio: 0.16.\n",
2026-01-05 15:02:00 +00:00
"95th Percentile of Hedged Portfolio: 0.25. 95th Percentile of Unhedged Portfolio: 0.24.\n"
]
}
],
"source": [
"hp5, hp50, hp95 = np.percentile(irr_hp, [5, 50, 95])\n",
"\n",
"print(f\"5th Percentile of Hedged Portfolio: {hp5:.2f}. 5th Percentile of Unhedged Portfolio: {p5:.2f}.\")\n",
"print(f\"50th Percentile of Hedged Portfolio: {hp50:.2f}. 50th Percentile of Unhedged Portfolio: {p50:.2f}.\")\n",
"print(f\"95th Percentile of Hedged Portfolio: {hp95:.2f}. 95th Percentile of Unhedged Portfolio: {p95:.2f}.\")"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "8a91b56e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2026-01-11 21:22:18 +00:00
"The standard deviation of the Hedged Portfolio is: 0.06233\n",
"The standard deviation of the Unhedged Portfolio is: 0.04870\n"
2026-01-05 15:02:00 +00:00
]
}
],
"source": [
"std_dev_hp = np.std(irr_hp)\n",
"std_dev_p = np.std(irr)\n",
"print(f\"The standard deviation of the Hedged Portfolio is: {std_dev_hp:.5f}\")\n",
"print(f\"The standard deviation of the Unhedged Portfolio is: {std_dev_p:.5f}\")"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "fc6d45ee",
"metadata": {},
"outputs": [
{
"data": {
2026-01-11 21:22:18 +00:00
"image/png": "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
2026-01-05 15:02:00 +00:00
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.hist(irr_hp, bins=40, color='teal',alpha=0.5, label='Hedged IRR', edgecolor='black')\n",
"plt.hist(irr, bins=40, color='blue',alpha=0.5, label='Unhedged IRR', edgecolor='black')\n",
"plt.xlabel('Internal Rate of Return')\n",
"plt.ylabel('Frequency')\n",
"plt.title('Distribution Of IRR Values - Hedged vs Unhedged Portfolio')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "229fb326",
"metadata": {},
"source": [
"We can see from these results that the choice of a European Put Option as a hedge is incorrect. It doesnt protect against a weakening HUF, which leads to a decrease in our GBP Cashflows. <br> \n",
"It instead pays out when $S_t < K$ which means the HUF has strengthened and our cashflows have increased in GBP i.e. we are getting a payout in an already favourable situation. This is why the 95th percentile of the Hedged Portfolio is greater than that of the Unhedged Portfolio. <br> \n",
"We also see the 5th percentile and 50th percentile of the Hedged Portfolio is lower than the Unhedged Portfolio due to the option price. This means that our Hedged Portfolio performs worse in adverse scenarios.<br> \n",
"The standard deviation of the Hedged Portfolio is also higher, meaning IRR results are more volatile with the purchase of the Put option. These are not things we want from a hedge.\n",
"\n",
"The correct hedging option would be a GBPHUF European Call. We will quickely compare the distributions below."
]
},
{
"cell_type": "code",
2026-01-11 21:22:18 +00:00
"execution_count": 21,
2026-01-05 15:02:00 +00:00
"id": "05186de4",
"metadata": {},
"outputs": [
{
"data": {
2026-01-11 21:22:18 +00:00
"image/png": "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
2026-01-05 15:02:00 +00:00
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"FinPayOffCall_HUF = N_GBP * np.maximum(S_T-K, 0) \n",
"FinPayOffCall_GBP = FinPayOffCall_HUF/S_T\n",
"\n",
"pricecall_gbp = FinPayOffCall_GBP.mean()\n",
"\n",
"Call_GBP_CF = GBP_CF.copy()\n",
"Call_GBP_CF[:,0] = GBP_CF[:,0] - pricecall_gbp\n",
"Call_GBP_CF[:,4] = GBP_CF[:,4] + FinPayOffCall_GBP \n",
"\n",
"irr_call = np.zeros(len(Call_GBP_CF))\n",
"for i in range(len(Call_GBP_CF)):\n",
" irr_call[i] = npf.irr(Call_GBP_CF[i,:])\n",
" \n",
"plt.hist(irr, bins=40, color='teal',alpha=0.5, label='Unhedged IRR', edgecolor='black')\n",
"plt.hist(irr_call, bins=40, color='blue',alpha=0.5, label='Call Hedged IRR', edgecolor='black')\n",
"plt.xlabel('Internal Rate of Return')\n",
"plt.ylabel('Frequency')\n",
"plt.title('Distribution Of IRR Values- Hedged vs Unhedged Portfolio')\n",
"plt.legend()\n",
"plt.show()"
]
},
2026-01-11 21:22:18 +00:00
{
"cell_type": "code",
"execution_count": 48,
2026-01-12 11:01:45 +00:00
"id": "1937fed9",
2026-01-11 21:22:18 +00:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5th Percentile of Call Hedged Portfolio: 0.103. 5th Percentile of Unhedged Portfolio: 0.08.\n",
"50th Percentile of Call Hedged Portfolio: 0.142. 50th Percentile of Unhedged Portfolio: 0.16.\n",
"95th Percentile of Call Hedged Portfolio: 0.219. 95th Percentile of Unhedged Portfolio: 0.24.\n"
]
}
],
"source": [
"hpc5, hpc50, hpc95 = np.percentile(irr_call, [5, 50, 95])\n",
"\n",
"print(f\"5th Percentile of Call Hedged Portfolio: {hpc5:.3f}. 5th Percentile of Unhedged Portfolio: {p5:.2f}.\")\n",
"print(f\"50th Percentile of Call Hedged Portfolio: {hpc50:.3f}. 50th Percentile of Unhedged Portfolio: {p50:.2f}.\")\n",
"print(f\"95th Percentile of Call Hedged Portfolio: {hpc95:.3f}. 95th Percentile of Unhedged Portfolio: {p95:.2f}.\")"
]
},
{
"cell_type": "code",
"execution_count": 49,
2026-01-12 11:01:45 +00:00
"id": "208b613a",
2026-01-11 21:22:18 +00:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The standard deviation of the Call Hedged Portfolio is: 0.03667\n",
"The standard deviation of the Unhedged Portfolio is: 0.04870\n"
]
}
],
"source": [
"std_dev_hpc = np.std(irr_call)\n",
"std_dev_p = np.std(irr)\n",
"print(f\"The standard deviation of the Call Hedged Portfolio is: {std_dev_hpc:.5f}\")\n",
"print(f\"The standard deviation of the Unhedged Portfolio is: {std_dev_p:.5f}\")"
]
},
2026-01-05 15:02:00 +00:00
{
"cell_type": "markdown",
"id": "22dfd26d",
"metadata": {},
"source": [
"We can see from the comparison of the distributions that we are much better protected against adverse scenarios with a GBPHUF Call option. This is because a Call Option pays out when $S_t > K$, which corresponds to a weakening HUF and a decrease in our projects cashflow in GBP.\n",
"\n",
"We will also notice a lower standard deviation. This means our portfolio is less risky."
]
},
{
"cell_type": "markdown",
"id": "0219ab38",
"metadata": {},
"source": [
"## Question (d)\n",
"\n",
"This forward contract will allow us to exchange 115,000,000 HUF for GBP at a fixed rate of K = 455.25. Again as the risk-free rates are 0%, our discount factor is 1.\n",
"\n",
"Mark-to-Market is the current market value of the forward contract.\n",
"\n",
"We agree to Pay N HUF and receive $\\frac{N}{K}$ GBP. At time t The market may give us $\\frac{N}{S_t}$ GBP. The difference between these to values is the MTM:\n",
"\n",
"$$\n",
2026-01-12 11:01:45 +00:00
"MTM_t^{GBP} = N (\\frac{1}{K} - \\frac{1}{S_t})\n",
2026-01-05 15:02:00 +00:00
"$$\n",
"\n",
2026-01-11 21:22:18 +00:00
"A margin call is triggered whenever the value of the MTM exceeds the GBP 70,000 threshold."
2026-01-05 15:02:00 +00:00
]
},
{
"cell_type": "code",
2026-01-12 11:01:45 +00:00
"execution_count": 55,
2026-01-05 15:02:00 +00:00
"id": "3533aa3b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2026-01-12 11:01:45 +00:00
"The probability of at least one margin call over the life of the trade is 20.60%\n"
2026-01-05 15:02:00 +00:00
]
}
],
"source": [
"GBPHUF_val_2029 = GBPHUF_val[:, 0:1009] \n",
"sim, time = GBPHUF_val_2029.shape\n",
"N = 115000000\n",
"threshold = 70000\n",
"\n",
"margin_call = np.zeros(sim, dtype=bool)\n",
"\n",
"for i in range(sim):\n",
" for j in range(time):\n",
2026-01-12 11:01:45 +00:00
" mtm = N * (1/K - 1/GBPHUF_val_2029[i, j])\n",
2026-01-11 21:22:18 +00:00
" if mtm < -threshold:\n",
2026-01-05 15:02:00 +00:00
" margin_call[i] = True \n",
" break\n",
"\n",
"prob_margin_call = margin_call.mean()*100 \n",
"\n",
"print(f\"The probability of at least one margin call over the life of the trade is {prob_margin_call:.2f}%\")"
]
},
2026-01-11 21:22:18 +00:00
{
"cell_type": "code",
2026-01-12 11:01:45 +00:00
"execution_count": 54,
"id": "8542193d",
2026-01-11 21:22:18 +00:00
"metadata": {},
"outputs": [
{
"data": {
2026-01-12 11:01:45 +00:00
"image/png": "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
2026-01-11 21:22:18 +00:00
"text/plain": [
"<Figure size 720x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"\n",
2026-01-12 11:01:45 +00:00
"MTM = N * (1 / K - 1 / GBPHUF_val_2029)\n",
2026-01-11 21:22:18 +00:00
"\n",
2026-01-12 11:01:45 +00:00
"n_paths_to_plot = 10\n",
2026-01-11 21:22:18 +00:00
"paths = np.random.choice(MTM.shape[0], n_paths_to_plot, replace=False)\n",
"\n",
"plt.figure(figsize=(10, 5))\n",
"\n",
"for i in paths:\n",
" if np.any(MTM[i, :] < -70000):\n",
" plt.plot(MTM[i, :], color=\"red\", alpha=0.8)\n",
" else:\n",
" plt.plot(MTM[i, :], color=\"teal\", alpha=0.8)\n",
" \n",
"# margin thresholds\n",
"plt.axhline(-70000)\n",
"\n",
"plt.xlabel(\"Time step\")\n",
"plt.ylabel(\"MTM (GBP)\")\n",
"plt.title(\"Forward MTM Paths and Margin Call Thresholds\")\n",
"plt.show()"
]
},
2026-01-05 15:02:00 +00:00
{
"cell_type": "markdown",
"id": "308f60aa",
"metadata": {},
"source": [
"### Notes\n",
"\n",
"Approximate time spent: 6 hours. <br>\n",
"Use of AI: Latex syntax for formulas, Reference for MTM theory, Improving graphs, Introduction to numpy_financial IRR method."
]
}
],
"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.8.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}