{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"В задачах 1 и 2 есть замечания по их расширению/уличшению решения. Эти требования дополнительные. Решение будет полностью защитано и если если задача без учета замечания полностью решена. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Задача 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Напишите код, который используя метод Монте-Карло расчитывал бы цену опциона EKI/KO.\n",
"\n",
"EKI/KO опцион это Европейский опцион, для которого добавлено два барьера. Непрерывный барьер - действует точно так же как в KO опционе. EKI барьер действует только в момент экспирации опциона : для call опциона выплота происходит только если курс актива на момент экспирации больше уровня EKI, для опциона put выплата происходит только если курс ниже уровня EKI на момент экприрации.\n",
"\n",
"Сделайте расчет для опциона call с параметрами указанными ниже"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2019-11-04T10:41:22.415083Z",
"start_time": "2019-11-04T10:41:22.405162Z"
}
},
"outputs": [],
"source": [
"S0 = 80.; K = 85.; T = 1.0; r = 0.05; q = 0.0; sigma = 0.2\n",
"B = 110 # continues barrier level\n",
"EKI = 90 # EKI level\n",
"M = 360 # number of steps in time\n",
"I = 50000 # number of paths to generate"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**замечание**\n",
"\n",
"Код в задачах из лекции использует $O( M \\cdot I )$ памяти. Попробуйте сделать код, который использует $O( I )$ памяти."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Задача 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Модифицируйте функцию, разобранную на лекции, для расчета цены опциона через решения уравнения в частных производных таким образом, что бы можно было задавать верхний и/или нижний барьер.\n",
"\n",
"Возвращаемые значения функции оставить как в примере на лекции.\n",
"\n",
"Сигнатура модифицированной функции и прамеры и примеры расчетов, которые нужно сделать:\n",
"\n",
"**замечание**\n",
"\n",
"Можно ли вычислить PV и Delta опциона в одной функции не увеличив существенно колличечество вычислений? Если получится, то сделайте функцию, которая возвращает не только цену опциона, но и его дельту. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def priceWithPDE1(S0, K, r, T, sigma, M, N, DB=None, UB=None, Smax=None, is_call=True):\n",
" # TODO\n",
" return pv_0, grid, S\n",
"\n",
"S0 = 80.; K = 85.; T = 1.0; r = 0.05; sigma = 0.2\n",
"UB = 110\n",
"DB = 70\n",
"Smax = 160.\n",
"M=360; N=100\n",
"\n",
"print( priceWithPDE1(S0=S0, K=K, r=r, T=T, sigma=sigma,M=M, N=N, Smax=Smax, is_call=True)[0] )\n",
"print( priceWithPDE1(S0=S0, K=K, r=r, T=T, sigma=sigma,M=M, N=N, Smax=Smax, is_call=False)[0] )\n",
"print( priceWithPDE1(S0=S0, K=K, r=r, T=T, sigma=sigma,M=M, N=N, UB=UB, is_call=True)[0] )\n",
"print( priceWithPDE1(S0=S0, K=K, r=r, T=T, sigma=sigma,M=M, N=N, UB=UB, is_call=False)[0] )\n",
"print( priceWithPDE1(S0=S0, K=K, r=r, T=T, sigma=sigma,M=M, N=N, DB=DB, Smax=Smax, is_call=True)[0] )\n",
"print( priceWithPDE1(S0=S0, K=K, r=r, T=T, sigma=sigma,M=M, N=N, DB=DB, Smax=Smax, is_call=False)[0] )\n",
"print( priceWithPDE1(S0=S0, K=K, r=r, T=T, sigma=sigma,M=M, N=N, DB=DB, UB=UB, is_call=True)[0] )\n",
"print( priceWithPDE1(S0=S0, K=K, r=r, T=T, sigma=sigma,M=M, N=N, DB=DB, UB=UB, is_call=False)[0] )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Задача 3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Рассмотрим такую стратегию динамического хеджирования: в начальный момент времени мы покупаем базовый актив, в колличестве равном дельте call опциона. \n",
"Далее мы перебалансируем наш портфель с каким-то шагом по времени. На каждом шаге мы покупаем или продаем базовый актив из такого расчета, что бы у нас на балансе опять был базовый актив, в колличестве равном дельте call опциона, с учетом изменившегося курса актива.\n",
"\n",
"Используя симмуляции возможных реализаций процесса цены актива как в методе Монте-Карло сделайте код, который нарисует график для суммарной стоимости владания такой стратегией для некоторого кол-ва симмуляций.\n",
"\n",
"График должен представлят из себя диаграмму рассеяния (scatter plot) в координатах $x = S_T$, $y = Total Profit_T$\n",
"\n",
"\n",
"Параметры для расчета:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2019-11-04T10:41:28.558142Z",
"start_time": "2019-11-04T10:41:28.549708Z"
}
},
"outputs": [],
"source": [
"S0 = 80.; K = 85.; T = 1.0; r = 0.05; q = 0.0; sigma = 0.2\n",
"M = 360 # number of steps in time\n",
"I = 1000 # number of paths to generate"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2019-11-04T10:41:30.582729Z",
"start_time": "2019-11-04T10:41:30.296537Z"
}
},
"outputs": [],
"source": [
"# Значение spot на текущем шаге симуляции \n",
"S = np.full(I, S0)\n",
"# Значение payoff на текущем шаге симуляции \n",
"P = np.zeros(I)\n",
"\n",
"# TODO: set initial portfolio\n",
"#\n",
"dt = float(T) / M\n",
"for t in range(1, M + 1):\n",
" z = standard_normal(I)\n",
" S = S * np.exp((r - 0.5 * sigma ** 2) * dt + sigma * m.sqrt(dt) * z)\n",
" # TODO: rebalance portfolio for the current step\n",
" #"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2019-11-04T10:41:30.587193Z",
"start_time": "2019-11-04T10:41:28.571Z"
}
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import matplotlib\n",
"%matplotlib inline\n",
"\n",
"lw = 2.5 # line width\n",
"fs = 12 # fontsize\n",
"picWidth=12; picHeight=8;\n",
"\n",
"matplotlib.rcParams.update({'font.size': 22})\n",
"plt.figure(figsize=(picWidth, picHeight))\n",
"\n",
"plt.plot(S, P, 'bo', linewidth=lw)\n",
"plt.grid(True)\n",
"plt.xlabel('Spot at expiry')\n",
"plt.ylabel('Total payoff')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Задача 4\n",
"\n",
"Straddle это структура из опциона call и опционна put, у которых равны страйки.\n",
"\n",
"Напишите код, который находит такой страйк для структуры straddle, при котором delta структуры равна нулю. (Delta neutral straddle).\n",
"Для численного нахождения корней функции можно использовать любой метод из стантартных библиотек, например\n",
"https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.brentq.html\n",
"\n",
"Параметры для расчета:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2019-11-04T10:41:22.437404Z",
"start_time": "2019-11-04T10:41:22.419050Z"
}
},
"outputs": [],
"source": [
"S0 = 80.; K = 85.; T = 1.0; r = 0.05; q = 0.01; sigma = 0.2"
]
}
],
"metadata": {
"hide_input": false,
"kernelspec": {
"display_name": "Python 3 (system-wide)",
"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.6.9"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "204px"
},
"toc_section_display": true,
"toc_window_display": true
}
},
"nbformat": 4,
"nbformat_minor": 2
}