Web-калькулятор - HDService
Перейти к содержанию

Web-калькулятор

Заказать разработку web-приложений любого уровня сложности и для любых бизнес-задач можно здесь: контакты HDService

Задача:

Разработать примитивный веб-калькулятор для расчета цен опциона. В ТЗ сказано «для работы через браузер», наверное функционал будут куда-то встраивать… Приведены два скриншота из учебника по «мат.вышке» = формула — есть, а описания переменных — нет…

Стиль = CSS от заказчика…

Реализация:

Стек: Python, Flask, Математические методы финансового анализа (учебное пособие для ВУЗов, 2е издание)

Сроки реализации: 2 рабочих дня (один из которых на поиск того, что такое функция N).

Калькулятор, согласно требованиям, передан заказчику в виде исходного кода.

Создано исполняемое *.exe приложение под Windows, в которое был «завернут» web-сервер и сам калькулятор. Можно скачать архив и «полюбоваться» на программу )

Результат:

HDService

Код:

Т.к. найти (добыть) решение для «уравнения со всеми неизвестными» — это был отдельный увлекательный процесс в этом проекте, я решил оставить код доступным для всех (вдруг, кому-то понадобится).

По сути, 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>

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

13 + 3 =