Оптимизация портфеля

link: https://minisite.mpfa.org.hk/mpfie/en/decision-points/which-funds/
  • Выбор портфеля MPF и оптимизация
  • Оптимизация портфеля с помощью квантовых вычислений
  • Оптимизация портфеля на основе Python (функция минимизации)
  • Многоцелевая оптимизация портфеля

Выбор портфеля MPF и оптимизация

Практический пример того, как можно создавать хорошо диверсифицированные портфели, минимизируя риск с помощью Python и CVXPY

Предисловие

Я новичок в Medium в качестве блоггера, а также энтузиаста, который всегда хочет поделиться своими мыслями / идеями по темам количественных финансов, науки о данных, обучения с подкреплением и математики. Я работаю исследователем ИИ в области инженерии и учусь в магистратуре в области науки о данных. Одно из моих решений в 2022 году состояло в том, чтобы писать блоги, связанные с вышеуказанными темами. Я рад, что наконец-то начал в начале 2023 года, ха-ха. Надеюсь, эта статья может навести на вас некоторые мысли о том, как вы актуализируете математические приложения, изученные в школе, и действительно пачкаете руки. 😀

Что касается этой темы, я столкнулся с проблемой, когда был новым выпускником, и мне пришлось выбрать некоторые средства из «очень всеобъемлющего» (многословного) резюме, в котором записаны безумно подробные результаты работы каждого фонда. В конце концов, я последовал правилу Парето, также известному как правило 80-20, без каких-либо предварительных финансовых знаний, но с максимальной уверенностью из ниоткуда.

Знакомство

Обязательный резервный фонд (MPF) — это обязательная схема накопления денег для выхода на пенсию в Гонконге. Большинство работников и работодателей по закону обязаны ежемесячно вносить взносы в MPF, предоставляемые утвержденными частными финансовыми корпорациями.

Люди должны получать 5% (или более) каждый месяц от своей зарплаты, и их работодатели вносят такой же процент в MPF. Например, если человек зарабатывает 20 000 долларов в месяц, он должен платить 5% от своей зарплаты, то есть 1000 долларов, и его работодатель также должен делать то же самое. Таким образом, каждый месяц на счет MPF поступает 2,000 долларов наличными.

Они должны выбирать свои собственные портфели на основе их уровней толерантности к риску и их ожиданий доходности. Согласно Управлению по схемам обязательных резервных фондов (MPFA), они предлагают 80-20 (80% портфеля вносится в фонд акций, который, как известно, более рискованный, но более высокий доход, а остальная часть инвестируется в фонд облигаций) для агрессивных людей, или более консервативные вкладчики могут рассмотреть большую часть в менее рискованном фонде, таком как облигации Гонконга и облигации США.

Мы, как розничные инвесторы, не хотим вкладывать слишком много усилий в наш MPF и постоянно менять вселенную активов. В то же время мы также не склонны к риску и любим зарабатывать как можно больше. Фактически, мы можем использовать прошлую информацию в качестве ориентира для построения портфеля, предполагая, что фонд продолжает вести себя хорошо, если он вел себя хорошо в прошлом.

Прежде чем представить методологию, я хотел бы задать несколько вопросов: Насколько эффективен ваш текущий портфель? Можно ли заработать больше, неся риск или волатильность?

Предпосылка

Чтобы сделать мой отрывок более дружелюбным для читателей, я думаю, что необходимо кратко представить вам некоторые термины, формулы и теории, прежде чем мы начнем.

Картинка Google

Ожидаемая доходность и стандартное отклонение — это два статистических показателя, которые можно использовать для анализа портфеля. Ожидаемая доходность портфеля — это ожидаемая сумма доходности, которую может принести портфель, что делает его средним (средним) возможного распределения доходности портфеля. Стандартное отклонение портфеля, с другой стороны, измеряет величину, на которую доходность отклоняется от своего среднего значения, что делает его показателем риска портфеля.

Мы можем оценить ожидаемую доходность, используя n выборок доходности и вычислив среднее значение.

Дисперсия портфеля используется для измерения того, как совокупная доходность набора ценных бумаг, составляющих портфель, колеблется с течением времени. Обычно мы рассчитываем ковариационную матрицу, чтобы зафиксировать стандартное отклонение, а также корреляцию каждой пары ценных бумаг в портфеле. Затем мы объединяем его с весом и вычисляем дисперсию портфеля (она упоминается ниже, когда речь идет о проблеме минимизации рисков).

Дисперсия предназначена для измерения риска актива. Ковариация содержит корреляцию каждой пары активов.

Выпуклость является наиболее фундаментальным и существенным понятием в выпуклой оптимизации. Его можно использовать для описания набора значений или функции.

Определение выпуклого множества:

Определение выпуклого множества (выпуклая оптимизация Бойда и Ванденберга)

Приведу простой пример выпуклого множества. В геометрии для 2D-пространства можно выделить любые две точки в выпуклом множестве и соединить их непрерывной линией. На непрерывной линии вы произвольно выбираете точку, и эта точка все еще находится в наборе.

Пример выпуклого множества (Google Image). (A) — выпуклые множества, а (B) — невыпуклые множества на рисунке.

Определение выпуклой функции:

Определение выпуклой функции (выпуклая оптимизация Бойда и Ванденберга)

Можно провести линию, соединяющую любые две точки выпуклой функции, причем линия всегда находится поверх линии функции или накладывается на линию функции.

Выпуклая (вогнутая) функция — это функция с положительной (отрицательной) кривизной, позволяющая получить множество оптимальных точек и минимизированных (максимизированных) значений функции.

Пример выпуклой и вогнутой функции (изображение Google)

Коэффициент Шарпа — это показатель для измерения относительной доходности с поправкой на риск. Он сравнивает доходность инвестиций по отношению к инвестиционному эталону с их риском:

Портфельная теория Марковица (MPT)

Гарри Марковиц — американский экономист, удостоенный Нобелевской премии за вклад в современную портфельную теорию. Он представил MPT в своей статье «Выбор портфеля» и опубликовал ее в 1952 году в Journal of Finance.

Это практический и математический метод выбора инвестиций, основанный на рассмотрении приемлемого риска и доходности. Используя ожидаемую доходность, а также соответствующую подверженность риску каждой комбинации активов, вы можете визуализировать следующую модель Марковица.

Каждая синяя точка представляет собой индивидуальную комбинацию активов на рисунке. Например, точка может быть смесью 10% актива A и 20% актива B и 70% актива C.

Эффективная граница, проведенная оранжевой линией, представляет собой набор оптимальных портфелей, которые предлагают наибольшую ожидаемую доходность при определенном уровне риска или самый низкий риск при данном уровне ожидаемой доходности. Другими словами, это наиболее эффективный и действенный способ инвестирования с более низким уровнем риска, когда вы зарабатываете примерно такую же сумму ожидаемой прибыли.

Например, на приведенном выше графике мы видим, что вы можете заработать примерно 0,01 ожидаемо как безопасный игрок с наименьшим допустимым риском (около 0,475), в то время как вы можете страдать от гораздо большего риска (около 0,71), но с тем же ожиданием.

Модель Марковица предполагает, что мы можем (или должны) зарабатывать более ожидаемо, когда мы можем взять на себя больший риск, и почему диверсификация портфеля играет очень важную роль в инвестициях, поскольку риск будет хорошо диверсифицирован. Поэтому никогда не кладите все яйца в одно ведро.

Проблема оптимизации портфеля

Есть два основных способа оптимизировать свой портфель: либо минимизировать риск, либо максимизировать ожидаемую доходность. Я собираюсь включить простейшие формы обеих постановок задачи.

Целевая функция или функция потерь — это цель, которую вы хотите достичь. Он должен быть выпуклым для задачи минимизации или вогнутым для задачи максимизации. Ограничения являются ограничениями значений или параметров, которые добавляются к задаче, а также должны быть выпуклой функцией. Область, которая является возможным значением переменной в задаче, должна быть выпуклым множеством.

Предполагается, что есть K доступных активов. w и r — K-мерные векторы, представляющие веса и ожидаемую доходность K активов соответственно, а Σ — ковариационная матрица K x K, хранящая волатильности и корреляции пар активов.

Проблема 1: Максимизация ожидаемой отдачи (квадратичное ограниченное квадратичное программирование)

Целевая функция является аффинной функцией w и выпуклая. Мы собираемся максимизировать ожидаемую доходность портфеля.

Для первого квадратичного ограничения Σ всегда является положительной полуопределенной матрицей. Таким образом, это выпуклая функция w. Обратите внимание, что максимум σ² является максимально допустимым риском инвестора.

Для второго и третьего ограничений, поскольку мы должны потратить все наши деньги на инвестиции MPF, вектор веса должен быть элементарно суммирован к 1, и каждый вес в векторе должен быть больше или равен 0. Это долгосрочный портфель. Область w представляет собой полупространство, которое представляет собой выпуклое множество.

Проблема 2: Минимизация дисперсии портфеля, также известной как риск (квадратичное программирование)

Различия между проблемами заключаются в следующем:

  1. Целевой функцией становится минимизация риска портфеля. Это квадратичная функция w, которая является выпуклой функцией.
  2. Первое ограничение задачи 2 состоит в том, чтобы установить приемлемую ожидаемую доходность портфеля, и осуществимая w должна удовлетворять тому, что скалярное произведение должно быть больше, чем r min. Это аффинная функция w, и она выпуклая.

Реализация

Будучи человеком, сильно не склонным к риску, я продемонстрирую, как построить проблему минимизации риска с помощью python и библиотеки CVXPY. Данные представляют собой 10-летние ежедневные цены каждого фонда, предоставленные Manulife (поскольку у меня есть неуправляемый портфель MPF в Manulife из-за моей лени 🙁 ) и загруженные на терминал Bloomberg.

Небольшой совет: вы можете использовать «копировать данные в буфер обмена» в Bloomberg, чтобы получать данные без каких-либо ограничений на загрузку данных. Таким образом, они являются последней ценой каждого дня.

Загрузка библиотек

import numpy as np
import cvxpy as cp
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

Считывание данных

df = pd.read_csv('MANULIFE_MPF_10Y_DATA.csv')
# Equity Funds
eq_funds = ['MAMMGCV', 'MAMMGHC', 'MAMMGEE', 'MAMMGNE',
'MAMMGHE', 'MAMMGHS', 'MAMMGPE']
# Bond Funds
bd_funds = ['MAMMGPB', 'MAMMGCP', 'MAMMGHB', 'MAMMGIB']

# choose the columns I want to keep
df = df[['Date'] + eq_funds + bd_funds]
df
MANULIFE_MPF_10Y_DATA.csv (Вы можете отправить мне электронное письмо, чтобы запросить данные, если вы хотите сделать это самостоятельно :D)

Для построения вектора доходности, содержащего ожидаемую доходность каждого фонда, и ковариационной матрицы фондов, хранящей информацию о волатильности:

daily_ret_matrix = df[eq_funds + bd_funds].pct_change(-1).dropna()
# expected daily return and covariance matrix
daily_r_vec = daily_ret_matrix.mean(axis=0)
daily_r_cov = daily_ret_matrix.cov()
# turn into annual data
r_annualized = daily_r_vec * 252
cov_annualized = np.array(daily_r_cov * 252)

Проведя моделирование с 10000 пар рандомизированных весов, мы можем затем оценить производительность на основе коэффициента Шарпа и модели Марковица.

ret = []
std = []

num_simulation = 10000
num_funds = len(daily_r_vec)

W = np.random.normal(1, 3, (num_simulation, num_funds))
W[W<0] = 0 # long only

for i in range(num_simulation):
w = W[i]
if sum(w):
# set the weight vector elementarily sum to 1
w = w * (1 / np.sum(w))
else:
w = np.random.uniform(0, 1, (num_funds,))
w = w * (1 / np.sum(w))

ret.append(w @ r_annualized)
std.append((w @ cov_annualized @ w.T) ** 0.5)

ret = np.array(ret)
std = np.array(std)

# the current 10 years Treasury rate as the risk free rate (rf)
rf = 0.0339
sharpe = (ret - rf) / std

print('Desriptive summary of the sharpe ratios of the randomly generated portfolios')
print(pd.Series(sharpe).describe())

print('Best performance among the randomized weights\n')
print(f' Sharpe Ratio: {np.max(sharpe):.4f}')
print(f' Annualized Expected Return (%): {ret[np.argmax(sharpe)]:.4f}')
print(f' Annualized Risk (%): {std[np.argmax(sharpe)]:.4f}')

plt.figure()
plt.scatter(std, ret)
plt.ylabel('Expected Return (%)', fontsize=14)
plt.xlabel('Risk (%)', fontsize=14)
plt.show()
Вы можете нести очень высокий риск, но в то же время не получать относительную доходность, если ваш портфель неэффективен.
Таблица коэффициента Шарпа. Наилучшая производительность в коэффициенте Шарпа составляет примерно 0,36.

Постройте задачу минимизации рисков (ожидая, что годовая доходность составит не менее 0,09)

# set your own parameter: e.g. my expected min return is 0.09% per year
r_min_annualized = 0.09

# create cvxpy variable to minimize
w = cp.Variable(num_funds)
r_min = r_min_annualized / 252

# construct the objective function and constraints
obj = cp.Minimize(w.T @ cov @ w)
const = [
cp.sum(w) == 1, w >= 0,
w.T @ r - r_min >= 0
]

# solve it!
prob = cp.Problem(obj, const)
opt_v = prob.solve()

risk_opt = (opt_v * 252) ** 0.5
w_opt = w.value

print('optimal risk (%):', risk_opt)
print('optimal proportion:', np.round(w_opt, 4))
Результат задачи оптимизации.

Вы можете видеть, что если мы хотим 0,09 ожидаемой годовой доходности, в соответствии с оптимальным риском, портфель относится к классу 5.

Результат тестирования на истории (начальный капитал $100)

notional = 100
cumprod_mat = (ret_vec + 1).iloc[::-1].cumprod().iloc[::-1]

# for agggressively weighted (advice from MPFA :) fingercrossed my friend)
w_agg = np.array([0.8, 0, 0, 0, 0, 0, 0, 0.2, 0, 0, 0])
agg_cumprod = (cumprod_mat @ (w_agg * notional))
agg_cumprod = agg_cumprod.iloc[::-1].reset_index(drop=True)

# for equally weighted
w_equal = np.array([1/len(r)]*len(r))
equal_cumprod = (cumprod_mat @ (w_equal * notional))
equal_cumprod = equal_cumprod.iloc[::-1].reset_index(drop=True)

# for optimially weighted
w_opt = w.value
opt_cumprod = (cumprod_mat @ (w_opt * notional))
opt_cumprod = opt_cumprod.iloc[::-1].reset_index(drop=True)

# date
date = df.Date[cumprod_mat.index]
date = pd.to_datetime(date, format="%d/%m/%Y")
date = date.iloc[::-1].reset_index(drop=True)

# plot the difference
plt.plot(date, opt_cumprod, label='opt')
plt.plot(date, equal_cumprod, label='eql')
plt.plot(date, agg_cumprod, label='agg')
plt.yscale('log')
plt.ylabel('Cummulative Wealth', fontsize=14)
plt.xlabel('Date', fontsize=14)
plt.legend()
Показатели этих трех портфелей за последние 10 лет. OPT — оптимизированный, EQL — равновзвешенный, AGG — агрессивно взвешенный (правило 80–20).
Эффективность трех стратегий

Заключение

Оптимизация портфеля с помощью современной портфельной теории может быть эффективным способом достижения более высокой доходности и лучшего управления рисками. В этом анализе мы сравнили три портфеля MPF, основанные на исторической доходности и волатильности, и обнаружили, что оптимально взвешенный портфель превзошел два других портфеля почти в два раза по сравнению с совокупной доходностью за последние 10 лет. Кроме того, коэффициент Шарпа оптимально взвешенного портфеля был в 9 раз больше, чем коэффициенты Шарпа двух других портфелей, что указывает на лучшую доходность с поправкой на риск.

Однако важно отметить, что современная портфельная теория имеет некоторые недостатки, в том числе тот факт, что портфели оцениваются по дисперсии, а не по риску снижения. Это означает, что, хотя оптимизация портфеля может улучшить общую производительность, она не обязательно может защитить от экстремальных рыночных событий или рисков снижения. Кроме того, важно помнить, что прошлые результаты не обязательно являются руководством к будущим результатам. Таким образом, результаты этого анализа следует рассматривать как ориентир для выбора лучшего портфеля MPF в будущем, а не как гарантию будущей доходности.

Помните, что:

«Все модели неверны, но некоторые полезны». Джордж Бокс.

Хотя современная портфельная теория имеет ограничения, она остается полезным инструментом для инвесторов, стремящихся диверсифицировать свои портфели и улучшить управление рисками.

Оптимизация портфеля с помощью квантовых вычислений

Я сосредоточился на оптимизации портфеля и прогнозировании с использованием подмодулей, предлагаемых qiskit. Я также сравнил классический и квантовый подходы друг с другом, тем самым дав краткое представление о том, как методы квантовых вычислений могут быть использованы для решения NP-трудных задач (в данном случае задачи оптимизации средней дисперсии) Черпая вдохновение из моего предыдущего проекта по моделированию временных рядов методом Монте-Карло, я расширил дискуссию до квантовых методов, поскольку мне было любопытно посмотреть, как они работают по сравнению с классическими методами.

Убедитесь, что вы прочитали мою предыдущую статью, чтобы получить краткое представление о симуляции Монте-Карло, это поможет вам в этой статье.

Обо всем по порядку

Импорт необходимых библиотек для анализа портфелей

Yfinance для получения данных

Qiskit для алгоритмов квантовых вычислений, пакетов

Время для записи затраченного времени

Получение данных и предварительная обработка

Давайте разберемся, что происходит в этом фрагменте

1) Сначала выбираем, на какие компании будет ориентироваться инвестор, их список хранится в тикерах

2) Мы используем модуль yfinance для получения данных в течение требуемых временных рамок (ч/б даты начала и окончания)

3) Мы решили сосредоточиться на «Adj Close», поскольку он помогает инвесторам узнать справедливую стоимость акций после объявления корпоративного действия, а также помогает вести точный учет того, где начинается цена акций и где она заканчивается, поэтому мы выбираем ее анализ, а не цену закрытия.

4) Вычисляем ежедневное процентное изменение и отбрасываем из него столбцы NaN

5) Находим матрицу cov и corr возвратов

6) и исправить risk_free_rate (который можно изменить, и мы увидим, как его изменение повлияет на нашу оптимизацию позже)

Но почему Adjusted Close?

Здесь наше основное внимание сосредоточено на разделе данных «Скорректированное закрытие», который означает денежную стоимость последней транзакционной цены перед закрытием рынка. Скорректированная цена закрытия относится ко всему, что может повлиять на цену акций после закрытия рынка в течение дня.

Скорректированная цена закрытия акций помогает инвесторам узнать справедливую стоимость акций после объявления корпоративного действия, а также помогает вести точный учет того, где начинается цена акций и где она заканчивается, поэтому мы выбираем ее анализ, а не цену закрытия.

Визуализация того, как активы связаны друг с другом и как изменение одного из них влияет на другие

Для этого мы используем ковариационную и корреляционную матрицы, чтобы понять, как активы портфеля связаны друг с другом, это важно, потому что мы хотим, чтобы наш портфель был диверсифицирован, представьте, что происходит крах рынка, и все активы связаны одинаковым образом, следовательно, инвестор понесет только убыток, в то время как если активы связаны противоположным образом, то некоторые активы могут принести огромную прибыль, которая уравновесит убытки, понесенные большая часть активов.

Но в то же время, если бы все было нормально, движение в направлении, противоположном направлению потока, могло бы быть рискованным шагом. Таким образом, это составляет основу оптимизации соотношения риска и доходности.

Тепловая карта для наглядной демонстрации матриц

Но какие выводы мы делаем из тепловых карт?

Корреляция в финансовой и инвестиционной отраслях — это статистика, которая измеряет степень, в которой две ценные бумаги движутся по отношению друг к другу, значения ограничены диапазоном от -1 до +1.

Корреляция +1 означает положительную связь, т.е. если корреляция между активом А и активом Б равна 1, если актив А увеличивается, актив Б увеличивается. Корреляция, равная 0, означает отсутствие связи.

Ковариация говорит о том, что две переменные изменяются одинаково, в то время как корреляция показывает, как изменение одной переменной влияет на изменение другой.

Давайте перейдем к оптимизации портфеля

Квантовый регистр: Схема инициализируется квантовым регистром, содержащим num_assets кубитов. В данном примере num_assets — количество активов в портфеле.

Адамар Гейтс (Д): Для каждого кубита в регистре применяется вентиль Адамара (H). Ворота Адамара создают суперпозицию базисных состояний. Другими словами, он переводит каждый кубит в состояние, в котором он с равной вероятностью находится в состоянии |0> или |1>. Это ключевой шаг в квантовых алгоритмах, поскольку он позволяет квантовой системе исследовать несколько состояний одновременно.

Пример: Если имеется 3 актива (кубита), к каждому кубиту применяется вентиль Адамара, создавая суперпозицию из 8 возможных состояний: |000>, |001>, |010>, |011>, |100>, |101>, |110>, |111>. После применения вентилей Адамара измеряются все кубиты. Измерение сводит суперпозицию состояний к определенному результату. Каждый кубит с равной вероятностью даст либо |0>, либо |1>.

Определение серверной части симулятора- (backend = Aer.get_backend(‘qasm_simulator’))

Здесь серверная часть квантового симулятора определена с помощью модуля ‘Aer’ из Qiskit. «qasm_simulator» — это симулятор, который позволяет моделировать поведение квантовой схемы на классическом компьютере.

Транспилирование квантовой схемы (t_qc = transpile(qc, backend))

Функция ‘transpile’ используется для преобразования квантовой схемы (‘qc’) в форму, которая может быть выполнена на выбранном бэкенде. Он преобразует высокоуровневые абстрактные операции в ‘qc’ в специфический набор квантовых вентилей, поддерживаемых целевым устройством.

Запуск транспилированной цепи на симуляторе (result = backend.run(t_qc, shots=1000).result())

backend.run(t_qc, shots=1000)’ выполняет транспилированную квантовую схему ‘t_qc’ на выбранном бэкенде симулятора. Параметр shots определяет, сколько раз выполняется схема для сбора статистики.

В целом, этот блок кода отвечает за подготовку квантовой схемы к выполнению, выбор серверной части симулятора для выполнения, транспиляцию схемы для совместимости с серверной частью и запуск симуляции с заданным количеством выстрелов. Полученный результат представляет собой результаты измерений в квантовой схеме.

Просто для того, чтобы убедиться, что мы на одной волне

1.Transpile: это функция в Qiskit, которая принимает квантовую схему и преобразует ее в форму, пригодную для выполнения на конкретном квантовом устройстве или симуляторе.

2. Бэкенд: «бэкенд» относится к фактическому оборудованию или симулятору, на котором выполняется квантовая схема. Это может быть реальное квантовое устройство, а может быть классический симулятор, имитирующий поведение квантового компьютера.

3.qasm_simulator — это особый тип бэкенда, предоставляемый модулем Aer Qiskit. Это квантовый симулятор, который эмулирует поведение квантового компьютера на классическом компьютере.

4. Выстрелы: «выстрел» относится к одиночному выполнению квантовой схемы.

Классический подход

Вы можете обратиться к моей предыдущей статье, чтобы получить краткое представление о том, как работает классический подход.

Веса портфеля (w) вычисляются с помощью операций линейной алгебры. Он включает в себя скалярное произведение обратной ковариационной матрицы и ожидаемые доходы, нормализованные скалярным произведением массива единиц и результатом другой операции скалярного произведения.

Ожидаемая доходность портфеля рассчитывается как скалярное произведение весов портфеля (w) и ожидаемой доходности активов (mu).

Стандартное отклонение портфеля вычисляется с помощью операций линейной алгебры с использованием ковариационной матрицы (cov_matrix) и весов портфеля (w).

Функция возвращает весовые коэффициенты портфеля (w), ожидаемую доходность портфеля и стандартное отклонение портфеля.

Таким образом, он выполняет классическую оптимизацию портфеля, вычисляя оптимальные весовые коэффициенты для активов в портфеле, а также ожидаемую доходность и стандартное отклонение результирующего портфеля.

Рассчитайте время, необходимое для обоих подходов

Рассчитываем время, необходимое для оптимизации в обоих сценариях

Сравнение

В данном конкретном случае классический подход превосходит квантовый подход, но если мы рассматриваем более крупные портфели и более сложные отношения, то квантовый подход будет превосходить классическую аналогию.

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

Гистограмма, анализирующая разницу в выходных данных по обоим подходам

Дополнительно — Моделирование по методу Монте-Карло и прогнозирование цен на акции

Чем больше дисперсия, тем больше разброс, и тем меньше крутизна.

В контексте моделирования методом Монте-Карло сгенерированные случайные пути будут менее дифференцированными, если дисперсия меньше, и большей, если дисперсия больше, что приведет к более плоской кривой.

Куда двигаться дальше?

Вот несколько рекомендаций, которые вы можете использовать, чтобы разнообразить глубину анализа:

  1. Использование возвратов журнала вместо ежедневных возвратов для лучшей картины

2. Использование количественных показателей нормальности, чтобы понять, почему логарифмическая доходность лучше, чем простая доходность

3. Наблюдение за тем, как изменение фактора риска меняет оптимальный портфель

4. Использование различных показателей риска и доходности для построения эффективной границы (например, коэффициент Шарпа)

5. Как использование ABM через GBM влияет на конечный результат

Полную кодовую базу см. в моем https://github.com/beingamanforever/MCS-using-Quantum-Computing на GitHub

Использованные источники:

  1. Моя предыдущая статья
  2. Документация Qiskit по оптимизации портфеля
  3. https://youtu.be/5S38HYloiaY?si=aCkXUoEPU0sCEcTb

Оптимизация портфеля на основе Python (функция минимизации)

Использование Python для управления инвестициями путем выяснения наилучшего способа распределения денег между различными вариантами.

Привет! Привет!

Итак, держу пари, что вы знаете об идее диверсификации в инвестициях, просто о распределении ваших инвестиций по различным типам активов. Идея проста: если одна инвестиция не работает или сталкивается с трудностями, другие могут помочь сбалансировать ее.

Суть инвестиционного анализа заключается в том, чтобы найти золотую середину: сбалансировать риск и вознаграждение для достижения определенной целевой доходности.

Этот блог посвящен демонстрации того, как использовать Python для поиска оптимальных весов (пропорций или распределения средств) в портфеле для достижения определенной целевой доходности.

Мы начнем с некоторых основных концепций, прежде чем перейти к применению Python.

Веса? Зачем работать с гирями?

Если в вашем портфеле 30% акций Apple, 20% акций Tesla, 50% акций Airbnb; Тогда эти проценты (30%, 20%, 50%) считаются «весом». Простой!

На доходность вашего портфеля влияют следующие весовые коэффициенты:

Я не буду углубляться в происхождение формулы, просто имею в виду, что в данном примере:

Доходность вашего портфеля = 30% * доходность Apple + 20% * доходность Tesla + 50% доходность Airbnb

Главный вопрос: Как мы максимизируем доходность вашего портфеля?

Зная, в какие акции мы инвестируем, нам нужно оптимизировать весовые коэффициенты просто потому, что мы не можем контролировать доходность и риск отдельных акций. (30%, 20%, 50% могут быть не самыми лучшими весами)

Фреймворк SciPy для решения весовых коэффициентов | Портфель с несколькими активами

SciPy, мощная библиотека на Python, предлагает различные инструменты оптимизации, которые можно использовать для определения оптимальных весовых коэффициентов в портфеле.

В SciPy есть классный инструмент scipy.optimize.minimize -> этот инструмент может вычислить, сколько денег вложить в каждую инвестицию.

Другими словами, этот инструмент рассчитывает идеальные суммы для инвестирования в каждый актив для достижения желаемой доходности.

Я объясню и продемонстрирую применение этих инструментов с помощью кода, надеюсь, вам понравится !!

Импорт библиотеки

# Import package
import pandas as pd
import numpy as np
from scipy.optimize import minimize

Давайте посмотрим на наши данные

df = pd.read_csv(’15stocks_price.csv’)
df.set_index(‘date_gsheets’, inplace=True) #Set date as index
df.head()

У нас есть 15 акций и 1509 строк, но они довольно размыты, если все показаны, поэтому я покажу их часть.

Таким образом, мы имеем ежедневную цену продажи 15 акций.

Посмотрим, насколько вернутся эти акции

Вызов pct_change() для этой серии вычисляет процентное изменение от каждого значения к следующему.returns_df = df.pct_change(1).dropna()
returns_df.head()

Теперь можно увидеть дневную доходность этих акций следующим образом:

После того, как у нас есть все доходы, мы, наконец, можем перейти к задаче оптимизации, мы будем использовать Scipy Minimize.

Требования заключаются в том, чтобы определить оптимальные весовые коэффициенты (пропорции или распределение 15 акций) в нашем портфеле для достижения конкретной целевой доходности (определенной позже).

scipy.optimize.minimize

Эта функция рассчитывает идеальные суммы для инвестирования в каждый актив для достижения желаемой доходности. Документ функции — scipy.optimize.minimize

Функция:
scipy.optimize. minimize(funx0args=(), method=None, jac=None, hess=None, hessp=None, bounds=Noneconstraints=(), tol=None, callback=Noneoptions=None )

Таким образом, этот метод принимает множество различных параметров, однако единственный аргумент, который нам нужен, это:

1. fun (сокращение от function): целевая функция, для чего мы оптимизируем

2. x0: случайная догадка (в нашем случае связанная с весом отдельных акций)

3. Границы: где мы устанавливаем критерии для весовых коэффициентов
(мы хотим, чтобы он был в диапазоне от 0 до 1, что означает 0< веса < 1)

4. Ограничения: ограничьте возможные решения, которые может найти оптимизатор.

Это может быть немного запутанно, но просто наберитесь терпения, так как это станет более понятным после шагов приложения (я объясню детали позже). Сейчас мы будем использовать эту функцию, и нам понадобятся эти 4 аргумента.

> Помните, что мы пытаемся оптимизировать весовые коэффициенты, чтобы получить целевую отдачу

Давайте углубимся в эти параметры для функции

1. Параметр fun

fun аргумент в scipy.optimize.minimize обозначает целевую функцию. Эта функция представляет то, что вы хотите оптимизировать или минимизировать.

То, что мы хотим оптимизировать, — это ожидаемая доходность портфеля, которая также является выходом этой целевой функции.
def getPortReturn(weights):
«»»
Returns the Annualised Expected Return of a portfolio.
Annualises the return using the ‘crude’ method.
«»»
exp_ret_portfolio = np.dot(np.transpose(weights), returns_df.mean()) * 250

return exp_ret_portfolio

  1. np.transpose(weights) Эта часть транспонирует массив весов. Для расчетов портфеля транспонирование весов может привести его в соответствие с размерностями других массивов.
  2. returns_df.mean(): Эта функция вычисляет среднее значение доходности для каждого актива в returns_df DataFrame. Это даст вектор средней доходности для каждого актива.
  3. np.dot(np.dot(np.transpose(weights), returns_df.mean()): Эта операция вычисляет взвешенную сумму средней доходности для каждого актива в портфеле.
  4. * 250: Умножение на 250 масштабирует ожидаемую доходность от ежедневной доходности к годовой.

Целевая функция в оптимизации портфеля похожа на вашу цель. Это то, что вы пытаетесь сделать как можно лучше. В этой конкретной формуле это выяснение того, сколько денег вы можете заработать на своих инвестициях в течение года.

2. Укажите вес — начальный (предполагаемый) вес для x0

# Create a vector of equal weights as the initial (init) guess
num_stocks = len(returns_df.columns)
init_weights = [1 / num_stocks] * num_stocks
#the * is not multiply, this create a vector as below:

Все акции изначально имеют одинаковый вес 6,66%

Здесь вы также можете запустить целевую функцию для начального веса, чтобы увидеть начальную ожидаемую доходность до оптимизации.

В этом случае ожидается ожидаемая доходность, если отдельные акции будут равномерно распределены по одинаковому весу (6,666%)# Calculate the expected return on the portfolio of equal weights
getPortReturn(init_weights)

На рисунке ниже видно, что ожидаемая доходность до оптимизации составляет всего 0,205, а все индивидуальные веса — 6,666%.

Мы установим целевую доходность равной 0.4 (это будет использовано в ограничениях позже -> мы предоставим функцию target, чтобы она могла оптимизироваться)

3. Настройка привязки

Ограничения, наложенные на весовые коэффициенты, присвоенные различным активам в портфеле.

bounds — это список кортежей, представляющих нижнюю и верхнюю границы, укажите минимальное и максимальное значения для каждого веса.# Create the constraint that the weight of any asset i must be between 0 and 1 inclusive.
bounds = tuple((0, 1) for i in range(num_stocks))
bounds

Это также можно считать первым ограничением даже его в связанном параметре (я знаю, что это сбивает с толку).

Остальные 2 ограничения могут быть созданы и переданы в аргумент ‘constraints’ в методе минимизации SciPy.

4. Ограничения

Мы устанавливаем следующие ограничения, чтобы убедиться, что:

  • Общее распределение по активам составляет 100%
  • Ожидаемая доходность портфеля соответствует желаемой целевой доходности,

-> поэтому у нас есть словари (каждый из которых представляет собой ограничение)# Setup the other 2 constraints
cons = (
# Sum of weights must equate to 1
{‘type’ : ‘eq’, ‘fun’ : lambda w : np.sum(w) — 1},

# Difference between expected return and target must be equal to 0.
{‘type’ : ‘eq’, ‘fun’ : lambda x : x.dot(returns_df.mean()) * 250 — target_return})

First constraints({‘type’: ‘{'type': 'eq', 'fun': lambda w: np.sum(w) - 1}):

  • Гарантирует, что сумма весовых коэффициентов, присвоенных всем активам в портфеле, равна 1. Установка суммы равной 1 означает распределение 100% ресурсов портфеля между активами.
  • Гарантирует, что все инвестиции (100%) будут распределены по активам, предотвращая избыточное или недостаточное распределение.

Вторые ограничения ({‘type’: ‘{'type': 'eq', 'fun': lambda x: x.dot(returns_df.mean()) * 250 - target_return}):

  • Это ограничение задает целевой показатель ожидаемой доходности портфеля.
  • x представляет вектор весовых коэффициентов, присвоенных каждому активу.
  • returns_df.mean() вычисляет среднюю доходность активов в DataFrame.
  • Скалярное произведение x.dot(returns_df.mean()) * 250 вычисляет ожидаемую годовую доходность портфеля на основе выделенных весовых коэффициентов.
  • target_return – желаемая целевая доходность портфеля (0,4).
  • Ограничение гарантирует, что разница между рассчитанной ожидаемой доходностью и предопределенной целевой доходностью (0,4) равна 0.
  • > Это условие направляет процесс оптимизации для поиска весовых коэффициентов, которые приводят к ожидаемой доходности портфеля, близкой к заданному целевому показателю (0,4).

Почему вы видите минус в конце обоих ограничений?
Помните, что мы стараемся сделать так, чтобы ожидаемая доходность портфеля была равна целевой доходности. Если ожидаемая доходность портфеля равна целевой доходности — 0,4 (это то, что мы хотим), то разница между ожидаемой доходностью и целевой доходностью должна быть равна 0.

Те же принципы применимы и к первому ограничению (убедитесь, что сумма всех весов равна 1–> 100% использованного ресурса)

Теперь мы определили все параметры, давайте запустим функцию scipy.optimize.minimize

-> Помните, что мы пытаемся оптимизировать весовые коэффициенты, чтобы получить целевую отдачуresults = minimize(fun=getPortReturn, # being the objective function
x0=init_weights, # being the initial guess

# bounds: the first constraint that the weight of any
# asset i must be between 0 and 1 inclusive
bounds=bounds,
# being the other 2 constraints
constraints=cons)
print(results)

Теперь мы можем увидеть результат после оптимизации.

  • Функция return the fun, которая очень близка (может быть круглой) к нашей целевой доходности -> того, чего мы хотим достичь (ожидаемая доходность)
  • x, как правило, представляет собой оптимальные весовые коэффициенты, присвоенные различным акциям в нашем портфеле (!!! это то, что мы ищем)

Давайте поместим наш x (оптимальные веса) во фрейм данных, чтобы легко увидеть:

Теперь попробуем протестировать новый вес, чтобы убедиться, что он оптимален (если он оптимален, то целевая функция должна возвращать нашу целевую доходность (0.4).

Ну и округлить до 0,4 -> весов оптимально

Давайте посмотрим на окончательные веса после добавления названия акции в сторону# Set the tickers as the index of `optimised_weights`
# by using the column names of `returns_df`.
optimised_weights.index = returns_df.columns
optimised_weights

Это наши оптимальные веса для всех наших отдельных акций, эти оптимальные веса помогут нам достичь целевой доходности портфеля 0,4 (проверено).

Многоцелевая оптимизация портфеля

«Жонглирование инвестициями похоже на выступление в цирке: стремление к тройному выигрышу: прибыль, рост и избегание пирогов в лицо!»

Представьте, что вы бегун, собирающийся пробежать марафон. У вас есть несколько целей:

1. Вы хотите закончить гонку как можно быстрее (это все равно, что пытаться заработать много денег, когда вы инвестируете).

2. Вы также должны быть уверены, что не слишком устанете и не поранитесь во время гонки (не хотите слишком рисковать).

3. Но у вас есть какие-то особые вещи, которые вас волнуют. Вы хотите бегать экологично, чтобы не навредить окружающей среде (например, не мусорить). Вы также хотите быть хорошим другом и помогать другим бегунам, если они в этом нуждаются (например, делиться с ними своей водой).

Вот в чем проблема: вы не можете просто сосредоточиться на финише гонки, забыв о других факторах. Вы должны найти лучший способ бега, который не только позволит вам быстро закончить, но и останется безопасным, экологически чистым и в то же время хорошим другом для других.

Итак, вы бежите в хорошем темпе, не слишком быстро, чтобы утомить себя, но и не слишком медленно. Вы можете носить с собой многоразовую бутылку для воды, чтобы быть экологичным и помогать другим, делясь своей водой, когда это необходимо.

Многокритериальная оптимизация портфеля (MOPO) использует ту же концепцию. Речь идет о том, чтобы найти лучший способ инвестировать свои деньги в различные вещи (например, акции, облигации или даже сбережения на будущее), чтобы вы могли достичь нескольких целей одновременно, точно так же, как вы хотите пробежать марафон быстро и ответственно. Речь идет о том, чтобы найти баланс, который оставит вас счастливым, гордым и удовлетворенным, одновременно достигая своей цели.

Многокритериальная оптимизация портфеля – сложная и ответственная задача в области финансов и оптимизации. Он включает в себя выбор комбинации активов или инвестиций, которые максимизируют несколько конфликтующих целей одновременно. Эти цели часто включают в себя максимизацию прибыли, минимизацию риска и достижение других финансовых целей. Основная идея заключается в том, чтобы найти баланс между различными целями, так как улучшение одной цели может привести к компромиссу с другой.

При традиционной оптимизации портфеля с одной целью является либо максимизация доходности при заданном уровне риска, либо минимизация риска при заданном уровне доходности. В многокритериальной оптимизации может быть более двух целей, связанных с доходностью, риском, ликвидностью и другими финансовыми показателями. Ограничения могут включать в себя ограничения на распределение активов, подверженность риску в секторе или любые другие нормативные или специфические требования для инвесторов.

Короче говоря

История (причина, почему бы и нет)

Многокритериальную оптимизацию портфеля можно представить как финансовое приключение во времени. Все началось примерно в 1950-х годах с финансового волшебника по имени Гарри Марковиц. У него была дикая мысль найти идеальное сочетание инвестиций, которое дало бы вам больше денег, сохраняя при этом минимальный риск их потери.

Затем, в 80-х и 90-х годах, появились компьютеры, которые значительно упростили жизнь. Люди начали использовать компьютерные программы, чтобы понять, как наиболее разумно вложить свои деньги. Как будто у вас есть супер-умный помощник, который все делает за вас.

Более того, в наши дни речь идет не только о зарабатывании денег, но и о других вещах, таких как забота о планете (так называемое ESG-инвестирование) или уплата меньшего количества налогов. Так что теперь это похоже на попытку испечь тот же самый торт, но вы также хотите, чтобы он был здоровым (например, экологически чистым) и не слишком дорогим (например, экономия налогов).

Переходя к настоящему, нам помогают не только компьютеры, но и суперумные машины, которые могут обрабатывать миллиарды единиц информации, чтобы помочь вам сделать лучший инвестиционный выбор (так называемое машинное обучение). Это похоже на то, как если бы у вас был супергеройский помощник в мире финансов, который следил бы за тем, чтобы ваши деньги усердно работали на вас.

Учитывая рыночные риски, внимательно читайте все документы, связанные со схемой xD

Математическая оптимизация (Честно говоря, очень скучно)

Математическая формулировка многокритериальной оптимизации портфеля включает в себя определение целевых функций, переменных решения и ограничений. Ниже приведено упрощенное представление математической модели для многокритериальной оптимизации портфеля:

Целевые функции:

Для математической части рассмотрим k различных целевых функций f1(x), f2(x), …,fk(x), где x — вектор переменных решения, представляющих весовые коэффициенты портфеля.

Как правило, цели включают в себя максимизацию прибыли и минимизацию риска, но они также могут включать другие финансовые или нефинансовые цели. Этими целями являются:

  • F1(X): Целевая доходность, например, максимизация ожидаемой доходности портфеля.
  • F2(X): Цель риска, например, минимизация риска портфеля (дисперсия или стандартное отклонение).
  • F3(X): представляет собой дополнительные цели, такие как достижение целевого уровня доходности с поправкой на риск, ограничения по отраслевому риску или другие конкретные критерии.

Переменные решения:

Пусть x — вектор переменных решения, представляющих весовые коэффициенты портфеля, присвоенные каждому активу в портфеле. Сумма этих весов должна быть равна 1, чтобы гарантировать, что портфель полностью инвестирован.

sum(x1;x2; ….., xn) = 1

Где xi — вес i-го актива в портфеле, а n — общее количество активов.

Ограничения целостности:

  • Сумма всех весов всегда должна быть равна 1.
  • Минимальные и максимальные инвестиционные лимиты для всех активов, их вес должен быть xmin ≤ x ≤ xmax
  • Другие ограничения, такие как ограничения на подверженность риску сектора, подверженность классу активов или другие специфические требования.

Решение проблемы:

Для решения многокритериальной задачи необходимо найти набор весовых коэффициентов портфеля (x), оптимизирующий одновременно несколько целевых функций. Это часто связано с компромиссами между целями, и для решения этого вопроса могут использоваться различные математические методы, такие как методы скаляризации.

Распространенный подход заключается в использовании скаляризации для преобразования многокритериальной задачи в однокритериальную задачу с помощью взвешенных комбинаций целей. Например, можно создать взвешенную сумму целей:

Z = w1⋅f1(x) + w2⋅f2(x) +……. + wk⋅fk(x)

Затем мы максимизируем функцию Z, регулируя весовые коэффициенты w1, w2, .., wk

Здесь w1, w2, .., wk — весовые коэффициенты, представляющие важность каждой цели.

Корректировка этих весовых коэффициентов позволяет исследовать компромиссы между целями и находить различные решения на фронте Парето.

Фронт Парето представляет собой набор решений, в которых одна цель не может быть улучшена, не ухудшив другую. Он иллюстрирует компромиссы между конфликтующими целями.

Пример

Для простоты понимания возьмем две цели, а не больше.

Далее мы переходим к следующим шагам:

Шаг 1: Определите целевую функцию:

Целевая функция — это математическое выражение, которое количественно определяет, что требуется максимизировать или минимизировать. Как правило, он включает в себя переменные решения.

Для наших активов:

  • W1: Вес актива 1
  • W2: Вес актива 2
  • m1: Ожидаемая доходность актива 1
  • m2: Ожидаемая доходность актива 2
  • s1: Стандартное отклонение актива 1
  • s2: Стандартное отклонение актива 2
  • c: Корреляция между активом 1 и активом 2

Наши целевые функции:

Максимизировать: f1(w) = m1*w1+m2*w2 (Максимизировать математическое ожидание)

Минимизация: f2(w) = w12 * s12 + w22 *s22 + 2*c*w1*w2*s1*s2 (Минимизация дисперсии портфеля. c — коэффициент корреляции между активом 1 и активом 2)

Шаг 2: Определите переменные принятия решений:

Переменные решения — это параметры, которые необходимо оптимизировать. Они часто обозначаются символами (например, x, y, w) и могут представлять количества, распределения или действия.

Шаг 3: Укажите ограничения:

Ограничения — это условия или ограничения, которые должны быть выполнены. Это могут быть уравнения или неравенства, включающие переменные решения.

Здесь ограничения следующие:

  • w1 + w2 = 1: Сумма весов равна 1.
  • w1,w2 >=0: Ограничение неотрицательности для каждого веса

Шаг 4: Сформулируйте задачу оптимизации:

Объедините целевую функцию и ограничения, чтобы создать комплексное математическое выражение.

Наш общий вопрос:

Максимизировать: Z = a*f1(w) — (1-a)*f2(w) {где a — весовой параметр}

Подверженный:

  1. П1 + П2 = 1
  2. w1,w2 >=0

Шаг 5: Выберите метод оптимизации:

Выберите подходящий метод оптимизации для решения задачи. Распространенные методы включают линейное программирование (LP), квадратичное программирование (QP), смешанно-целочисленное линейное программирование (MILP), нелинейное программирование (NLP) и многое другое.

Шаг 6. Решаем задачу оптимизации:

Примените выбранную методику оптимизации, чтобы найти оптимальное решение. Можно использовать программные пакеты, такие как MATLAB, Python (с использованием библиотек, таких как SciPy), или специализированные решатели оптимизации.

Шаг 7: Оцените решение:

После решения задачи оптимизации вы получите значения переменных решения. Оцените целевую функцию, чтобы определить оптимальное значение.

В нашем примере мы предположили:

  • М1 = 0,08, М2 = 0,12
  • s1 = 0,15, s2 = 0,27
  • с = 0,3

Оптимальное решение (wi*):

П1* = 0,321, П2* = 0,679

Оптимальное значение: z* = 0,065

Запустите полную математическую модель, код которой прикреплен здесь: Модель

Шаг 8: Интерпретируйте результаты:

Понимание последствий оптимального решения в контексте вашей проблемы. Имеет ли это смысл, учитывая ваши цели и ограничения?

Описанные выше шаги дают упрощенное представление о процессе. На практике задачи оптимизации могут быть гораздо более сложными, связанными с нелинейными целевыми функциями, множественными ограничениями и дискретными переменными. Конкретные формулы и методы будут зависеть от характера задачи и выбранного метода оптимизации.

Если вы дочитали до этого места и читаете это предложение, я искренне ценю ваше терпение. Позвольте нам вознаградить вас, показав, как вы можете применить это к своему портфолио.

Реализация (т.к. этоне заведет вас далеко)

Мы заглянули в историю и определение. Теперь давайте познакомимся с реализацией многокритериальной оптимизации портфеля.

Шаг 1: Определите свои цели и связанные с ними ограничения

— Начните с перечисления своих инвестиционных целей. Например, мы хотим максимизировать прибыль и минимизировать риски, но вы можете настроить цель в соответствии со своими требованиями.

— Укажите необходимые ограничения, такие как общая сумма инвестиций, лимиты распределения активов и целевая минимальная доходность.

Шаг 2: Сбор данных

— Соберите исторические данные об активах, которые вы хотите включить в свой портфель. Эти данные должны включать в себя все прошлые доходности и риски (стандартные отклонения) по каждому активу.

Шаг 3: Рассчитайте ожидаемую доходность и риски

— Рассчитайте ожидаемую доходность и риск для каждого актива на основе исторических данных. Ожидаемая доходность, как правило, представляет собой среднюю историческую доходность, а риск — это стандартное отклонение доходности.

Шаг 4: Создайте портфолио

— Создайте таблицу с различными случайными комбинациями активов портфеля. Варьируйте проценты распределения (вес) для каждого актива, чтобы охватить широкий спектр возможностей.

— Рассчитайте доходность и риск портфеля для каждой комбинации, используя средневзвешенные значения.

Шаг 5: Эффективный рубеж

— Создайте точечную диаграмму с риском портфеля (ось x) и доходностью (ось y).

— Постройте каждую комбинацию портфеля в виде точки на графике.

— Используйте наиболее подходящую линию или кривую, чтобы соединить точки, представляющие наилучший компромисс между риском и доходностью. Эта кривая известна как эффективная граница*.

* Граница эффективности — это концепция в финансах, которая представляет собой набор оптимальных портфелей, предлагающих самую высокую ожидаемую доходность при данном уровне риска или самый низкий риск при данном уровне ожидаемой доходности. Он иллюстрирует компромисс между риском и прибылью при оптимизации портфеля.

Шаг 6: Оптимизация

— Реализуйте математические алгоритмы оптимизации (например, квадратичное, линейное программирование), чтобы найти портфели на Efficient Frontier, которые наилучшим образом соответствуют вашим целям и ограничениям.

— Эти портфели известны как портфели Парето-оптимального.

Шаг 7: Построение портфелей, оптимальных по Парето

— На графике Efficient Frontier постройте Парето-оптимальные портфели, полученные в результате оптимизации. Это портфели, которые представляют собой наилучшее соотношение доходности к риску.

Шаг 8: Выберите портфолио

— В зависимости от вашей толерантности к риску и требований к доходности выберите один из портфелей по Парето-оптимальному портфелю на графике.

— Выбранный портфель будет оптимальным распределением активов, которое соответствует вашим требуемым целям и ограничениям.

Реализация кода MOPO:

Общие сведения о коде

Прежде чем перейти к полной реализации кода, давайте посмотрим на обзор того, что мы пытаемся сделать с кодом, а затем перейдем к самому коду.

  1. Начнем с импорта необходимых библиотек, таких как numpy, matplotlib и cvxpy. Cvxpy используется для постановки и решения задач выпуклой оптимизации.

2. Затем мы решаем, сколько активов(‘n_assets‘) мы хотим рассмотреть, а затем сохраняем их ожидаемую доходность (‘expected_returns’) в массиве. Мы сохранили ковариацию между активами в матрице (‘cov_matrix’)

3. Затем мы определили максимально допустимый риск (дисперсию) портфеля, который составляет «risk_tolerance», и желаемый уровень ожидаемой доходности портфеля «target_return».

4. Веса активов в портфеле представлены «весами» и декларируются как cvxpy. Переменная.

5. Затем мы определяем ‘expected_return’, который рассчитывается как сумма ожидаемой доходности, взвешенной по весам портфеля, а ‘portfolio_risk’ определяется с помощью квадратичной формы для расчета риска (дисперсии) портфеля.

6. Затем мы устанавливаем ограничения для обучаемой модели. Ограничения:

  • Сумма всех весов должна быть равна 1 (полностью инвестированный портфель)
  • Все веса должны быть больше 0 (только длинные позиции)
  • Ожидаемая доходность должна быть больше или равна целевой доходности
  • Риск портфеля должен быть меньше толерантности к риску.

7. Определена цель, которая заключается в максимизации ожидаемой прибыли.

8. Создайте эту проблему с помощью команды ‘cvxpy. Проблема» и аргументы как «объективные» и «ограничения».

9. Решите задачу многокритериальной оптимизации с помощью ‘problem.solve()’. При этом определяются весовые коэффициенты портфеля, которые максимизируют ожидаемую доходность и при этом удовлетворяют ограничениям. Извлечение и печать весовых коэффициентов портфеля, ожидаемой доходности и риска (стандартного отклонения) портфеля.

10. Извлеките и распечатайте веса портфеля, ожидаемую доходность и риск (стандартное отклонение) портфеля.

11. Рассчитайте и постройте эффективную границу.

Так вот, КОД (буквально)

  • Во-первых, для формирования ковариационной матрицы мы взяли акции Apple и Tesla и импортировали данные об их ценах закрытия из Yahoo Finance.
  • Затем мы взяли процентную разницу в ценах между соседними ячейками строк с помощью pct_change.
  • Для расчета ожидаемой доходности мы применили приведенную ниже формулу (.shift(1) сдвигает данные вниз на одну строку вниз, так как изменение доходности вычисляется по формуле ret(t+1)-ret(t)/ret(t))
  • Затем мы рассчитали среднее значение и использовали формулу ковариации, упомянутую выше, чтобы рассчитать дисперсию, а также ковариацию для обеих акций. Точно так же мы можем вычислить ковариацию между несколькими другими акциями.
  • Импортируем необходимые библиотеки, определяем совокупные активы и берем математическую ожидаемую доходность, а также ковариационную матрицу (здесь мы взяли 5 других акций для нашего портфеля и рассчитали их ковариационную матрицу, а также ожидаемую доходность)
  • Определение доходности, риска, переменных весов, а также задача оптимизации (установка общей суммы весов=1)
  • Решение проблем и печать оптимизированного распределения веса
  • Построение эффективной границы (комбинация максимального риска и доходности)

Другие результаты (развитие наших навыков визуализации tbh)

  • Построив график зависимости доходности от риска с использованием случайно сгенерированных весовых коэффициентов, мы находим всю возможную область с крайней левой границей в качестве эффективной границы.
  • Принимая все больше и больше очков на каждом шаге, вот моделирование графика зависимости доходности от риска со случайно сгенерированными весами для лучшей визуализации эффективной границы.
Моделирование показывает зависимость ожидаемой доходности от риска для случайно сгенерированных весовых коэффициентов, крайняя левая граница является эффективной границей.

Запустите полный код здесь: CODE-MOPO

Заключение и выводы

  • В отличие от одноцелевой оптимизации портфеля, MOPO не существует единственного оптимального решения, а есть ряд решений с различными рисками и доходностью.
  • Он не оптимизирует риск и доходность напрямую, но включает в себя множество полезных функций, чтобы удовлетворить предпочтения инвестора.
  • Он может учитывать не только цели, связанные с финансовыми показателями, но и конкретное богатство, готовность к выходу на пенсию или благотворительные цели.
  • Инвесторы могут попробовать протестировать различные экономические рынки, чтобы увидеть, как работают портфели.
  • Инвесторы могут исследовать эффективные границы для нескольких целей одновременно, часто имея противоречащие друг другу цели.
  • Он также имеет динамическую настройку, которая помогает ему быть в курсе тенденций.
  • MOPO учитывает торговые издержки, а также ограничения ликвидности, чего не делает одноцелевая оптимизация портфеля.

Несмотря на то, что MOPO сам по себе является похвальным и мощным инструментом, у него есть и некоторые недостатки.

  • Сложность- Из-за своей многокритериальной способности для реализации этого требуются специализированные инструменты и алгоритмы.
  • Двусмысленность — Результатом MOPO является ряд решений с различными парието-оптимальными решениями, выбор наилучшего решения может быть сложным.
  • Точность данных- Входные данные (доходность, волатильность, корреляции) очень чувствительны и существенно влияют на результаты оптимизации.
  • Время выполнения — Решение задач MOPO может быть ресурсоемким, особенно для больших портфелей и сложных задач.

В целом, многоцелевая оптимизация портфеля пересматривает инвестиционные решения, гармонизируя риск, доходность и различные цели. С помощью Pareto-Efficient Solutions он помогает портфелю иметь сбалансированный компромисс, тем самым помогая ему/ей создавать персонализированные, оптимальные и обоснованные стратегии.

На этом мы подошли к концу этой простой, но элегантной концепции. Надеюсь, ребята, вы нашли это чтение проницательным. Мы вернемся с новыми новостями, так что следите за обновлениями!

Ссылки

Источник

Источник

Источник

Источник