Задачи финансового моделирования
Это руководство было изначально предоставлено Арпитом Бхатией (Arpit Bhatia).
Модели оптимизации играют все более важную роль в принятии финансовых решений. Многие вычислительные финансовые задачи можно эффективно решать с помощью современных методов оптимизации.
В этом руководстве рассматриваются два таких примера, взятых из работы Cornuejols2018.
В этом руководстве используются следующие пакеты.
using JuMP
import HiGHS
Краткосрочное финансирование
Корпорации регулярно сталкиваются с проблемой финансирования краткосрочных денежных обязательств, например:
Месяц | Янв | Фев | Мар | Апр | Май | Янв |
---|---|---|---|---|---|---|
--150 |
--100 |
200 |
--200 |
50 |
300 |
Чистые потребности в денежных средствах указаны в тысячах долларов. У компании есть следующие источники финансирования.
-
Кредитная линия на сумму до 100 тыс. долларов по процентной ставке 1 % в месяц.
-
В любой из первых трех месяцев она может выпустить 90-дневные биржевые облигации с общей процентной ставкой 2 % за три месяца.
-
Излишки средств можно инвестировать под процентную ставку 0,3 % в месяц.
Наша задача — найти наиболее экономичный способ использования этих трех источников, чтобы к концу июня получить наибольшую сумму денег.
Задача моделируется следующим образом:
Мы используем следующие переменные решения:
-
сумма , взятая из кредитной линии в месяце ;
-
сумма биржевых облигаций, выпущенных в месяце ;
-
излишки средств в месяце .
Здесь имеются три типа ограничений:
-
в каждом месяце поступление денежных средств равно их расходу;
-
верхние границы для ;
-
неотрицательность переменных решения , и .
Наша цель — просто максимизировать капитал компании в июне, который мы представляем переменной .
financing = Model(HiGHS.Optimizer)
@variables(financing, begin
0 <= u[1:5] <= 100
0 <= v[1:3]
0 <= w[1:5]
m
end)
@objective(financing, Max, m)
@constraints(
financing,
begin
u[1] + v[1] - w[1] == 150 # Январь
u[2] + v[2] - w[2] - 1.01u[1] + 1.003w[1] == 100 # Февраль
u[3] + v[3] - w[3] - 1.01u[2] + 1.003w[2] == -200 # Март
u[4] - w[4] - 1.02v[1] - 1.01u[3] + 1.003w[3] == 200 # Апрель
u[5] - w[5] - 1.02v[2] - 1.01u[4] + 1.003w[4] == -50 # Май
-m - 1.02v[3] - 1.01u[5] + 1.003w[5] == -300 # Июнь
end
)
optimize!(financing)
@assert is_solved_and_feasible(financing)
objective_value(financing)
92.49694915254233
Комбинаторные аукционы
На многих аукционах цена, которую покупатель предлагает за набор предметов, может быть не равна сумме цен, предлагаемых за отдельные предметы.
Примерами могут служить торговля акциями, рынки электроэнергии, аукционы по продаже прав на загрязнение и аукционы по продаже посадочных мест в аэропортах.
Учитывая это, комбинаторные аукционы позволяют участникам торгов делать ставки на комбинации предметов.
Пусть — это набор предметов, которые должен продать организатор аукциона. Ставка — это пара , где — непустой набор предметов, а — предлагаемая цена за набор.
Предположим, что организатор аукциона получил ставок Цель этой задачи — помочь организатору аукциона определить победителей с максимальной прибылью для себя.
Мы моделируем эту проблему, беря переменную решения для каждой ставки. Кроме того, мы добавляем ограничение, согласно которому каждый предмет продается не более одного раза. В результате получается следующая модель:
bid_values = [6 3 12 12 8 16]
bid_items = [[1], [2], [3 4], [1 3], [2 4], [1 3 4]]
auction = Model(HiGHS.Optimizer)
@variable(auction, y[1:6], Bin)
@objective(auction, Max, sum(y' .* bid_values))
for i in 1:6
@constraint(auction, sum(y[j] for j in 1:6 if i in bid_items[j]) <= 1)
end
optimize!(auction)
@assert is_solved_and_feasible(auction)
objective_value(auction)
21.0
value.(y)
6-element Vector{Float64}:
1.0
1.0
1.0
-0.0
-0.0
0.0