Заказать разработку web-приложений любого уровня сложности и для любых бизнес-задач можно здесь: контакты HDService
Задача:
Разработать примитивный веб-калькулятор для расчета цен опциона. В ТЗ сказано «для работы через браузер», наверное функционал будут куда-то встраивать… Приведены два скриншота из учебника по «мат.вышке» = формула — есть, а описания переменных — нет…
Стиль = CSS от заказчика…
Реализация:
Стек: Python, Flask, Математические методы финансового анализа (учебное пособие для ВУЗов, 2е издание)
Сроки реализации: 2 рабочих дня (один из которых на поиск того, что такое функция N).
Калькулятор, согласно требованиям, передан заказчику в виде исходного кода.
Создано исполняемое *.exe приложение под Windows, в которое был «завернут» web-сервер и сам калькулятор. Можно скачать архив и «полюбоваться» на программу )
Результат:
Код:
Т.к. найти (добыть) решение для «уравнения со всеми неизвестными» — это был отдельный увлекательный процесс в этом проекте, я решил оставить код доступным для всех (вдруг, кому-то понадобится).
По сути, 18 часов подряд искалось вот это: norm.cdf(d2)
…
import math
from flask import Flask, render_template, request
from scipy.stats import norm
app = Flask(__name__, template_folder='.')
@app.route('/', methods=['POST', 'GET'])
def calc():
if request.method == 'POST':
try:
d = float(request.form.get('d').replace(',', '.'))
K = float(request.form.get('K').replace(',', '.'))
S = float(request.form.get('S').replace(',', '.'))
b = float(request.form.get('b').replace(',', '.'))
u = float(request.form.get('u').replace(',', '.'))
r = float(request.form.get('r').replace(',', '.'))
a1 = round((math.log(S / K) + (u + math.pow(b, 2) / 2) * d) / (b * math.sqrt(d)), 5)
a2 = round((math.log(S / K) + (u - math.pow(b, 2) / 2) * d) / (b * math.sqrt(d)), 5)
d1 = round((math.log(S / K) + (r + math.pow(b, 2) / 2) * d) / (b * math.sqrt(d)), 5)
d2 = round((math.log(S / K) + (r - math.pow(b, 2) / 2) * d) / (b * math.sqrt(d)), 7)
resCevr = round(S * norm.cdf(a1) - K * math.pow(math.e, -0.03) * norm.cdf(a2), 4)
resC = round(S * norm.cdf(d1) - K * math.pow(math.e, -0.03) * norm.cdf(d2), 4)
except:
ERR = 'Ошибка заполнения вводных данных'
pass
return render_template('index.html', ERR=ERR, resC=resC, resCevr=resCevr, d=d, K=K, S=S, b=b, u=u, r=r)
if __name__ == '__main__':
app.run()
Шаблон страницы:
{% extends 'base.html' %}
{% if ERR %}
<em>{{ ERR }}</em>
{% endif %}
<form action="/" method="POST">
<p><i>Введите</i> <strong>все</strong> <i>необходимые значения и нажмите "рассчитать": </i></p>
<fieldset>
<legend>Входные данные</legend>
<label for="d">Срок исполнения опциона</label>
<input id="d" name="d" placeholder="{% if d %}{{ d }}{% endif %}"><br>
<label for="K">Цена исполнения</label>
<input id="K" name="K" placeholder="{% if K %}{{ K }}{% endif %}"><br>
<label for="S">Текущая цена актива</label>
<input id="S" name="S" placeholder="{% if S %}{{ S }}{% endif %}"><br>
<label for="b">Волатильность актива</label>
<input id="b" name="b" placeholder="{% if b %}{{ b }}{% endif %}"><br>
<label for="u">Ожидаемая доходность</label>
<input id="u" name="u" placeholder="{% if u %}{{ u }}{% endif %}"><br>
<label for="r">Безрисковая ставка</label>
<input id="r" name="r" placeholder="{% if r %}{{ r }}{% endif %}"><br>
</fieldset>
<p><input type="submit" value="РАССЧИТАТЬ"></p>
</form>
<fieldset>
<legend>Результаты</legend>
<label>Эвристическая цена опциона: <em>{% if resCevr %}{{ resCevr }}{% endif %}</em></label>
<label>Безарбитражная цена опциона: <em>{% if resC %}{{ resC }}{% endif %}</em></label>
</fieldset>