Иногда можно хотеть проверить либо свои входы, либо выходы задачи оптимизации портфеля. Хотя большая часть проверки ошибок, которая происходит во время фазы настройки задачи, ловит большинство трудностей с задачей оптимизации портфеля, процессы для проверки наборов портфелей и портфелей являются длительными и лучше всего выполняются в автономном режиме. Итак, инструменты оптимизации портфеля имеют специализированные функции для валидации портфельных наборов и портфелей. Для получения информации о рабочем процессе при использовании Portfolio
объекты, см. раздел Рабочий процесс объекта портфеля.
Поскольку необходимо и достаточно, чтобы ваш набор портфеля был непустым, закрытым и ограниченным набором, чтобы иметь действительную задачу оптимизации портфеля, estimateBounds
функция позволяет вам изучить набор портфеля, чтобы определить, является ли он непустым и, если он не пуст, ограничен ли он. Предположим, что у вас есть следующий набор портфелей, который является пустым набором, потому что начальный портфель в 0
слишком далеко от портфеля, удовлетворяющего ограничению бюджета и оборота:
p = Portfolio('NumAssets', 3, 'Budget', 1); p = setTurnover(p, 0.3, 0);
Если набор портфелей пуст, estimateBounds
возвращает NaN
ограничивает и устанавливает isbounded
флаг в []
:
[lb, ub, isbounded] = estimateBounds(p)
lb = NaN NaN NaN ub = NaN NaN NaN isbounded = []
Предположим, что вы создаете неограниченный набор портфелей следующим образом:
p = Portfolio('AInequality', [1 -1; 1 1 ], 'bInequality', 0); [lb, ub, isbounded] = estimateBounds(p)
lb = -Inf -Inf ub = 1.0e-08 * -0.3712 Inf isbounded = logical 0
estimateBounds
возвращает (возможно, бесконечные) границы и устанавливает isbounded
флаг в false
. Результат показывает, какие активы являются неограниченными, чтобы можно было при необходимости применить ограничения привязки.Наконец, предположим, что вы создали набор портфелей, который не пуст и не ограничен. estimateBounds
не только подтверждает набор, но и получает более жесткие ограничения, которые полезны, если вы имеете дело с фактической областью значений вариантов портфеля для отдельных активов в вашем наборе портфеля:
p = Portfolio; p = setBudget(p, 1,1); p = setBounds(p, [ -0.1; 0.2; 0.3; 0.2 ], [ 0.5; 0.3; 0.9; 0.8 ]); [lb, ub, isbounded] = estimateBounds(p)
lb = -0.1000 0.2000 0.3000 0.2000 ub = 0.3000 0.3000 0.7000 0.6000 isbounded = logical 1
В этом примере все, кроме второго актива, имеют более жесткие верхние границы, чем подразумевает входная верхняя граница.
Учитывая портфельный набор, заданный в Portfolio
объект, вы часто хотите проверить, являются ли определенные портфели допустимыми относительно набора портфелей. Это может происходить, например, с начальными портфелями и с портфелями, полученными из других процедур. checkFeasibility
функция определяет, является ли набор портфелей допустимым. Предположим, что вы выполните следующую оптимизацию портфеля и хотите определить, являются ли результирующие эффективные портфели допустимыми относительно измененной задачи.
Во-первых, настройте задачу в Portfolio
p объекта
, оценить эффективные портфели в pwgt
и затем подтвердите, что эти портфели выполнимы относительно начальной задачи:
m = [ 0.05; 0.1; 0.12; 0.18 ]; C = [ 0.0064 0.00408 0.00192 0; 0.00408 0.0289 0.0204 0.0119; 0.00192 0.0204 0.0576 0.0336; 0 0.0119 0.0336 0.1225 ]; p = Portfolio; p = setAssetMoments(p, m, C); p = setDefaultConstraints(p); pwgt = estimateFrontier(p); checkFeasibility(p, pwgt)
ans = 1 1 1 1 1 1 1 1 1 1
Затем настройте другую задачу портфеля, которая начинается с начальной задачи с дополнительного ограничения оборота и одинаково взвешенного начального портфеля:
q = setTurnover(p, 0.3, 0.25); checkFeasibility(q, pwgt)
ans = 0 0 0 1 1 0 0 0 0 0
q
. Решение второй задачи с помощью checkFeasibility
демонстрирует, что эффективный портфель для Portfolio
q объекта
является допустимым относительно начальной задачи:qwgt = estimateFrontier(q); checkFeasibility(p, qwgt)
ans = 1 1 1 1 1 1 1 1 1 1
checkFeasibility
| estimateBounds
| Portfolio