Теория Марковица

  • Измерение риска и доходности — введение в теорию Марковица
  • Оптимизация портфеля: Марковиц с использованием Python
  • Использование CAPM с Марковицем для акций
  • Среднедисперсионная оптимизация портфеля: Марковиц в действии с использованием Python
  • Решение для эффективного фронтира в портфелях акций

Измерение риска и доходности — введение в теорию Марковица

На прошлой неделе, представляя «Как измерить позиционный риск — введение в метод VaR», было упомянуто, что риск портфеля не равен рискам отдельных активов и связан с их ценовой корреляцией. Возьмем в качестве примера два актива, если их положительная корреляция очень сильна, то есть они растут и падают вместе, то диверсификация инвестиций не снизит риск. Если существует сильная отрицательная корреляция, диверсифицированные инвестиции могут значительно снизить риск. Возникает естественный вопрос: как максимизировать доходность при определенном уровне риска при инвестировании в портфель? Это подводит нас к теории Марковица, которую мы сегодня представим.

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

Ключевое понятие теории Марковица

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

Где

– ожидаемая доходность портфеля,

— вес i-го актива в портфеле,

– ожидаемая доходность i-го актива.

Risk (Volatility or Standard Deviation): Используется для измерения неопределенности доходности инвестиций или волатильности инвестиций.

Где

представляет собой совокупный риск портфеля,

— ковариация актива i и актива j, которая измеряет зависимость изменения цены между этими двумя активами.

Ковариация: измеряет взаимную взаимосвязь между изменениями цен двух активов.

Где

– коэффициент корреляции актива i и актива j,

и

являются соответственно стандартными отклонениями актива i и актива j.

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

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

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

Пример кода на Python для поиска оптимальной комбинации с помощью метода моделирования

Расчет оптимального портфеля Марковица — это многоступенчатый процесс, включающий в себя несколько ключевых этапов, таких как подготовка данных, моделирование портфеля и расчет индикаторов. Пожалуйста, обратитесь к: https://plotly.com/python/v3/ipython-notebooks/markowitz-portfolio-optimization/

Получение рыночных данных:

С помощью функции get_data получить исторические данные о ценах выбранной цифровой валюты. Это необходимые данные для расчета доходности и рисков, которые используются для построения инвестиционных портфелей и расчета коэффициентов Шарпа.

Расчет коэффициента доходности и риска:

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

Рассчитать оптимальный портфель Марковица:

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

Целью всего процесса является поиск инвестиционного портфеля, который приносит наилучшую ожидаемую доходность при заданном уровне риска. Моделируя несколько возможных комбинаций, инвесторы могут лучше понять эффективность различных конфигураций и выбрать комбинацию, которая лучше всего соответствует их инвестиционным целям и толерантности к риску. Этот метод помогает оптимизировать инвестиционные решения, делая инвестиции более эффективными.import numpy as np
import pandas as pd
import requests
import matplotlib.pyplot as plt

# Obtain market data
def get_data(symbols):
data = []
for symbol in symbols:
url = ‘https://api.binance.com/api/v3/klines?symbol=%s&interval=%s&limit=1000’%(symbol,’1d’)
res = requests.get(url)
data.append([float(line[4]) for line in res.json()])
return data

def calculate_returns_risk(data):
returns = []
risks = []

for d in data:
daily_returns = np.diff(d) / d[:-1]
annualized_return = np.mean(daily_returns) * 365
annualized_volatility = np.std(daily_returns) * np.sqrt(365)

returns.append(annualized_return)
risks.append(annualized_volatility)

return np.array(returns), np.array(risks)

# Calculate Markowitz Optimal Portfolio
def calculate_optimal_portfolio(returns, risks):
n_assets = len(returns)
num_portfolios = 3000

results = np.zeros((4, num_portfolios), dtype=object)

for i in range(num_portfolios):
weights = np.random.random(n_assets)
weights /= np.sum(weights)

portfolio_return = np.sum(returns * weights)
portfolio_risk = np.sqrt(np.dot(weights.T, np.dot(np.cov(returns, rowvar=False), weights)))

results[0, i] = portfolio_return
results[1, i] = portfolio_risk
results[2, i] = portfolio_return / portfolio_risk
results[3, i] = list(weights) # Convert weights to a list

return results

symbols = [‘BTCUSDT’,’ETHUSDT’, ‘BNBUSDT’,’LINKUSDT’,’BCHUSDT’,’LTCUSDT’]
data = get_data(symbols)

returns, risks = calculate_returns_risk(data)
optimal_portfolios = calculate_optimal_portfolio(returns, risks)

max_sharpe_idx = np.argmax(optimal_portfolios[2])
optimal_return = optimal_portfolios[0, max_sharpe_idx]
optimal_risk = optimal_portfolios[1, max_sharpe_idx]
optimal_weights = optimal_portfolios[3, max_sharpe_idx]

# Output results
print(«Optimal combination:»)
for i in range(len(symbols)):
print(f»{symbols[i]} Weight: {optimal_weights[i]:.4f}»)

print(f»Expected return rate: {optimal_return:.4f}»)
print(f»Expected risk (standard deviation): {optimal_risk:.4f}»)
print(f»Sharpe ratio: {optimal_return / optimal_risk:.4f}»)

# Visualized investment portfolio
plt.figure(figsize=(10, 5))
plt.scatter(optimal_portfolios[1], optimal_portfolios[0], c=optimal_portfolios[2], marker=’o’, s=3)
plt.title(‘portfolio’)
plt.xlabel(‘std’)
plt.ylabel(‘return’)
plt.colorbar(label=’sharp’)
plt.show()

Окончательный результат:
Оптимальное сочетание:
Вес BTCUSDT: 0.0721
Вес ETHUSDT: 0.2704
Вес BNBUSDT: 0.3646
Вес LINKUSDT: 0.1892
Вес BCHUSDT: 0.0829
Вес LTCUSDT: 0.0209
Ожидаемый процент возврата: 0,4195
Ожидаемый риск (стандартное отклонение): 0,1219
Коэффициент Шарпа: 3.4403

От: https://blog.mathquant.com/2023/11/13/measuring-risk-and-return-an-introduction-to-markowitz-theory.html

Оптимизация портфеля: Марковиц с использованием Python

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

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

Во-первых, загрузите данные с помощью yahoo finance : Если yahoo finance не установлен, то установите с помощью !pip install yfinance

import numpy as np
import pandas as pd
import yfinance as yf
import warningswarnings.filterwarnings("ignore")pd.options.display.float_format = '{:.4%}'.format# Date rangestart = '2016-01-01'end = '2021-09-30'# Tickers of assetsassets = ['RELIANCE.NS','IRCTC.NS','ITC.NS','INFY.NS','BPCL.NS','TATAMOTORS.NS','ADANIENT.NS','ZOMATO.NS','SUNPHARMA.NS']assets.sort()# Downloading datadata = yf.download(assets, start = start, end = end)data = data.loc[:,('Adj Close', slice(None))]data.columns = assets

Для учебных целей я взял основные индийские акции, такие как Reliance, ITC, IRCTC, TATAMOTORS, ZOMATO, INFOSYS, ADANI, BPCL, SUNPHARMA. Как вы можете видеть, мой портфель разнообразен из разных отраслей, поэтому я надеюсь, что мой риск доходности должен быть регулируемым.

Вычисление возвратов

# Calculating returns
Y = data[assets].pct_change().dropna()
display(Y.head())

Оценка портфелей средней дисперсии

Расчет портфеля на основе коэффициента Шарпа

Коэффициент Шарпа оценивает взаимосвязь между доходностью инвестиций и риском. Идея о том, что избыточная доходность с течением времени может указывать на большую волатильность и риск, а не на инвестиционный опыт, выражается математически таким образом.
В результате своей работы над моделью ценообразования капитальных активов (CAPM) экономист Уильям Ф. Шарп ввел коэффициент Шарпа в 1966 году под названием «отношение вознаграждения к изменчивости».

За свою работу над CAPM Шарп получил Нобелевскую премию по экономике в 1990 году.

Для оптимизации я использую эффективный пакет под названием riskfolio-lib. Вы можете установить его, написав! pip установите riskfolio-lib в свой коллаб или ноутбук Jupiter.

import riskfolio as rp

# Building the portfolio object
port = rp.Portfolio(returns=Y)

# Calculating optimal portfolio

# Select method and estimate input parameters:

method_mu='hist' # Method to estimate expected returns based on historical data.
method_cov='hist' # Method to estimate covariance matrix based on historical data.

port.assets_stats(method_mu=method_mu, method_cov=method_cov, d=0.94)

# Estimate optimal portfolio:

model='Classic' # Could be Classic (historical), BL (Black Litterman) or FM (Factor Model)
rm = 'MV' # Risk measure used, this time will be variance
obj = 'Sharpe' # Objective function, could be MinRisk, MaxRet, Utility or Sharpe
hist = True # Use historical scenarios for risk measures that depend on scenarios
rf = 0 # Risk free rate
l = 0 # Risk aversion factor, only useful when obj is 'Utility'

w = port.optimization(model=model, rm=rm, obj=obj, rf=rf, l=l, hist=hist)

display(w.T)>> Sample output

Здесь вы можете видеть, что algo предлагает, мы не должны инвестировать в некоторые активы, такие как ADANI, BPCL, ZOMATO и TATAMOTORS.

Построение состава портфолио

# Plotting the composition of the portfolio

ax = rp.plot_pie(w=w, title='Sharpe Mean Variance', others=0.05, nrow=25, cmap = "tab20",
height=6, width=10, ax=None)

Расчет эффективной границы

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

points = 50 # Number of points of the frontier

frontier = port.efficient_frontier(model=model, rm=rm, points=points, rf=rf, hist=hist)

display(frontier.T.head())

Построение эффективной кривой

label = 'Max Risk Adjusted Return Portfolio' # Title of point
mu = port.mu # Expected returns
cov = port.cov # Covariance matrix
returns = port.returns # Returns of the assets

ax = rp.plot_frontier(w_frontier=frontier, mu=mu, cov=cov, returns=returns, rm=rm,
rf=rf, alpha=0.05, cmap='viridis', w=w, label=label,
marker='*', s=16, c='r', height=6, width=10, ax=None)

Оценка портфелей средних рисков

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

rm = 'CVaR' # Risk measure

w = port.optimization(model=model, rm=rm, obj=obj, rf=rf, l=l, hist=hist)

display(w.T)

Построение состава портфолио

ax = rp.plot_pie(w=w, title='Sharpe Mean CVaR', others=0.05, nrow=25, cmap = "tab20",
height=6, width=10, ax=None)

Расчет оптимальных портфелей по нескольким показателям риска

Далее я рассматриваю следующие меры риска для оптимизации моего портфеля.

# Risk Measures available:
#
# 'MV': Standard Deviation.
# 'MAD': Mean Absolute Deviation.
# 'MSV': Semi Standard Deviation.
# 'FLPM': First Lower Partial Moment (Omega Ratio).
# 'SLPM': Second Lower Partial Moment (Sortino Ratio).
# 'CVaR': Conditional Value at Risk.
# 'EVaR': Entropic Value at Risk.
# 'WR': Worst Realization (Minimax)
# 'MDD': Maximum Drawdown of uncompounded cumulative returns (Calmar Ratio).
# 'ADD': Average Drawdown of uncompounded cumulative returns.
# 'CDaR': Conditional Drawdown at Risk of uncompounded cumulative returns.
# 'EDaR': Entropic Drawdown at Risk of uncompounded cumulative returns.
# 'UCI': Ulcer Index of uncompounded cumulative returns.rms = ['MV', 'MAD', 'MSV', 'FLPM', 'SLPM', 'CVaR',
       'EVaR', 'WR', 'MDD', 'ADD', 'CDaR', 'UCI', 'EDaR']

w_s = pd.DataFrame([])

for i in rms:
    w = port.optimization(model=model, rm=i, obj=obj, rf=rf, l=l, hist=hist)
    w_s = pd.concat([w_s, w], axis=1)
    
w_s.columns = rmsw_s.style.format("{:.2%}").background_gradient(cmap='YlGn')

fig = plt.gcf()
fig.set_figwidth(14)
fig.set_figheight(6)
ax = fig.subplots(nrows=1, ncols=1)

w_s.plot.bar(ax=ax)Plotting a comparison of assets weights for each portfolio

Использование CAPM с Марковицем для акций

Модель ценообразования капитальных активов с моделью Марковица по индийским акциям с коэффициентом Шарпа 2,4 и доходностью 40%.

Знакомство

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

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

Кроме того, мы рассмотрим, как эти принципы могут быть применены к другим типам инвестиций, таким как акции США, криптовалюта и облигации, в следующих частях этой статьи в качестве расширения.

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

Что такое акции?

Акции, также известные как акции, представляют собой собственность в публично торгуемой компании. Когда вы покупаете акции, вы становитесь акционером компании и имеете право претендовать на часть ее активов и доходов. Акции можно покупать и продавать на фондовых биржах, таких как Нью-Йоркская фондовая биржа (NYSE) и NASDAQ.

Как инвестировать в акции?

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

Вот несколько примеров известных международных и индийских брокерских фирм:

Международные:

  1. Charles Schwab
  2. Fidelity Investments
  3. E-Trade Financial
  4. TD Ameritrade
  5. Morgan Stanley

Индия:

  1. Kotak Securities
  2. ICICI Securities
  3. Groww
  4. Zerodha
  5. Sharekhan

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

Преимущества инвестиций на фондовом рынке по сравнению с другими инвестициями в активы

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

Сколько акций в BSE и NSE индийского фондового рынка

По состоянию на 2021 год насчитывается около 5,500 акций, котирующихся на Бомбейской фондовой бирже (BSE), и около 1,800 акций, котирующихся на Национальной фондовой бирже (NSE) Индии.

Насколько актуально инвестировать в акции с меньшим риском и большей доходностью по сравнению с традиционными инвестициями

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

Что такое «фундаментальный анализ» и ключевой фундаментальный анализ, который использует большинство финансовых аналитиков в целом

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

  1. Прибыль на акцию (EPS): Он измеряет чистую прибыль компании на акцию в обращении, что является показателем прибыльности. Более высокая прибыль на акцию указывает на то, что компания генерирует больше прибыли на акцию и, следовательно, более привлекательна для инвесторов.
  2. Отношение цены к прибыли (P/E): Он измеряет цену акций компании по отношению к ее прибыли, что является показателем того, насколько дороги или недороги акции. Более низкий коэффициент P/E указывает на то, что акции недооценены, и может быть хорошей возможностью для покупки.
  3. Соотношение цены и продаж (P/S): Он измеряет цену акций компании по отношению к ее выручке, что является показателем того, насколько хорошо компания генерирует продажи. Более низкий коэффициент P/S указывает на то, что компания генерирует больший доход на акцию и, следовательно, более привлекательна для инвесторов.
  4. Отношение долга к собственному капиталу (D/E): Это измеряет долг компании по отношению к ее собственному капиталу, который является показателем финансового рычага и риска компании. Более низкий коэффициент D/E указывает на то, что компания имеет меньший долг и, следовательно, менее рискованна.
  5. Рентабельность собственного капитала (ROE): Он измеряет чистую прибыль компании в процентах от ее акционерного капитала, что является показателем того, насколько эффективно компания использует свои активы для получения прибыли. Более высокий ROE указывает на то, что компания генерирует больше прибыли на доллар акционерного капитала и, следовательно, более привлекательна для инвесторов.
  6. Соотношение цены к книге (соотношение PB): Он измеряет цену акций компании по отношению к ее балансовой стоимости, которая представляет собой стоимость ее активов за вычетом обязательств. Он рассчитывается путем деления текущей рыночной цены за акцию на балансовую стоимость одной акции. Более низкий коэффициент PB указывает на то, что акции недооценены, а более высокий коэффициент PB указывает на то, что акции переоценены.
  7. Альфа: Альфа — это показатель эффективности акции или портфеля по отношению к эталонному индексу, такому как S&P 500/NIFTY. Это показатель доходности акций с поправкой на риск, который рассчитывается путем вычитания доходности эталонного индекса из доходности акций. Положительное значение Alpha указывает на то, что акции показали лучшие результаты, чем эталонный индекс, в то время как отрицательное значение Alpha указывает на то, что акции показали худшие результаты, чем эталонный индекс.
  8. Бета-версия: Бета — это мера волатильности акций по отношению к рынку в целом. Он рассчитывается путем сравнения доходности акций с доходностью эталонного индекса, такого как S&P 500 / NIFTY. Значение бета, равное 1, указывает на то, что доходность акций тесно коррелирует с эталонным индексом, в то время как значение бета больше 1 указывает на то, что акция более волатильна, чем эталонный индекс, а значение бета менее 1 указывает на то, что акция менее волатильна, чем эталонный индекс. Акции с более высоким бета-значением считаются более рискованными, чем акции с более низким бета-значением.
  9. EBITDA: EBITDA расшифровывается как прибыль до вычета процентов, налогов, износа и амортизации. Это финансовый показатель, который рассчитывает прибыль компании до учета определенных расходов. Идея EBITDA заключается в том, чтобы измерить прибыльность компании без влияния финансовых и бухгалтерских решений, а также неденежных расходов.

EBITDA рассчитывается путем добавления процентов, налогов, износа и амортизации к чистой прибыли. Формула: EBITDA = Чистая прибыль + Проценты + Налоги + Износ + Амортизация

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

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

Формула для EPS, PE, PS, DE, ROE, PB, Alpha, Beta, EBITDA:

Прибыль на акцию (EPS): Прибыль на акцию = Чистая прибыль / Акции в обращении

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

Отношение цены к прибыли (P/E): P/E = Рыночная цена на акцию / Прибыль на акцию

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

Соотношение цены и продаж (P/S): P/S = Рыночная цена за акцию / Выручка на акцию

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

Отношение долга к собственному капиталу (D/E): D/E = Общий долг / Акционерный капитал

  • Коэффициент D/E — это показатель финансового рычага и риска компании, он показывает долю финансирования компании, которая поступает от долга по сравнению с собственным капиталом. Более низкий коэффициент D/E указывает на то, что компания имеет меньший долг и, следовательно, менее рискованна.

Рентабельность собственного капитала (ROE): ROE = Чистая прибыль / Акционерный капитал

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

Соотношение цены к книге (соотношение PB): Коэффициент PB = Рыночная цена за акцию / Балансовая стоимость за акцию

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

Альфа: Alpha = (доходность акций — доходность эталонного индекса)

  • Альфа — это показатель эффективности акции или портфеля по отношению к эталонному индексу, такому как S&P 500. Положительное значение Alpha указывает на то, что акции показали лучшие результаты, чем эталонный индекс, в то время как отрицательное значение Alpha указывает на то, что акции показали худшие результаты, чем эталонный индекс.

Бета-версия: Бета = ковариация (доходность акций, эталонная доходность) / дисперсия (эталонная доходность)

  • Бета — это мера волатильности акций по отношению к рынку в целом. Значение бета, равное 1, указывает на то, что доходность акций тесно коррелирует с эталонным индексом, в то время как значение бета больше 1 указывает на то, что акция более волатильна, чем эталонный индекс, а значение бета менее 1 указывает на то, что акция менее волатильна, чем эталонный индекс. Акции с более высоким бета-значением считаются более рискованными, чем акции с более низким бета-значением.

EBITDA: EBITDA = Чистая прибыль + Проценты + Налоги + Износ + Амортизация

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

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

Как сайт tickertape можно использовать для фундаментального анализа?

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

ссылка: https://www.tickertape.in/screener/equity

Что такое модель Марковица

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

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

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

  1. Определите набор активов, которые будут включены в портфель
  2. Оцените ожидаемую доходность и волатильность (стандартное отклонение) каждого актива
  3. Рассчитайте ковариационную матрицу доходности между всеми парами активов
  4. Используйте алгоритм математической оптимизации, чтобы найти весовые коэффициенты портфеля, которые оптимизируют ожидаемую доходность портфеля при заданном уровне риска или минимизируют риск при заданном уровне ожидаемой доходности
  5. Перебалансируйте портфель по мере необходимости для поддержания оптимального веса

Ниже приведен пример кода Python, реализующего модель Марковица:

import numpy as np
from scipy.optimize import minimize
# Define the set of assets
assets = ['Asset 1', 'Asset 2', 'Asset 3']# Estimate expected returns and volatilities
expected_returns = np.array([0.1, 0.2, 0.15])
volatilities = np.array([0.15, 0.25, 0.20])# Calculate the covariance matrix of returns
cov_matrix = np.array([[0.025, 0.01, 0.0075],
[0.01, 0.0625, 0.005],
[0.0075, 0.005, 0.04]])# Define a function to minimize risk for a given level of expected return
def portfolio_risk(weights, return_target):
portfolio_return = np.sum(weights * expected_returns)
portfolio_volatility = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
return portfolio_volatility# Define the optimization constraints
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1},
{'type': 'ineq', 'fun': lambda x: np.dot(x, expected_returns) - return_target})# Set the initial guess for the portfolio weights
initial_guess = [1/3, 1/3, 1/3]# Set the return target
return_target = 0.18# Minimize the risk for the given return target
optimal_weights = minimize(portfolio_risk, initial_guess, args=return_target, constraints=constraints)# Print the optimal portfolio weights
print(optimal_weights.x)

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

MPT, CAPM и как markowitz можно использовать для CAPM на примере

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

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

Ожидаемая доходность = Безрисковая ставка + (Ожидаемая рыночная доходность — Безрисковая ставка) * Бета

Где:

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

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

  1. Оцените ожидаемую доходность, волатильность и бета-коэффициент для каждого актива
  2. Используйте формулу CAPM для оценки требуемой доходности для каждого актива
  3. Используйте модель Марковица для нахождения весов портфеля, которые оптимизируют ожидаемую доходность портфеля при заданном уровне риска

Ниже приведен пример кода Python, реализующего модель Марковица с CAPM:

import numpy as np
from scipy.optimize import minimize
# Define the set of assets
assets = ['Asset 1', 'Asset 2', 'Asset 3']# Estimate expected returns, volatilities, and betas
expected_returns = np.array([0.1, 0.2, 0.15])
volatilities = np.array([0.15, 0.25, 0.20])
betas = np.array([1.2, 1.0, 0.8])# Set the risk-free rate and expected market return
risk_free_rate = 0.03
expected_market_return = 0.1# Calculate the required returns using the CAPM formula
required_returns = risk_free_rate + (expected_market_return - risk_free_rate) * betas# Calculate the covariance matrix of returns
cov_matrix = np.array([[0.025, 0.01, 0.0075],
[0.01, 0.0625, 0.005],
[0.0075, 0.005, 0.04]])# Define a function to minimize risk for a given level of expected return
def portfolio_risk(weights, return_target):
portfolio_return = np.sum(weights * required_returns)
portfolio_volatility = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
return portfolio_volatility# Define the optimization constraints
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1},
{'type': 'ineq', 'fun': lambda x: np.dot(x, required_returns) - return_target})# Set the initial guess for the portfolio weights
initial_guess = [1/3, 1/3, 1/3]# Set the return target
return_target = 0.18# Minimize the risk for the given return target
optimal_weights = minimize(portfolio_risk, initial_guess, args=return_target, constraints=constraints)

Шаги, которые я выполнил

Шаг — 1:

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

tickertape screener to do fundamental analysis and short list Indian stocks as needed
тикерлента для проведения фундаментального анализа и составления короткого списка индийских акций по мере необходимости

Шаг — 2:

Перешел по ссылке Yahoo Finance — https://finance.yahoo.com/quote/SPLPETRO.NS?p=SPLPETRO.NS&.tsrc=fin-srch

и добавил в код соответствующие названия акций

stocks = [ 'GORANIN.BO', 'BRPL.BO', 'RITESHIN.BO', 'SHISHIND.BO', 'GOLKUNDIA.BO', 'CRSTCHM.BO', 'UVDRHOR.BO', 'GARGFUR.BO', 'BRADYM.BO', 'RAMAPPR-B.BO', 'ORIENTTR.BO', 'RATNABHUMI.BO' ]

Шаг — 3:

Считается, что торговых дней 252 в году и взято 10000 случайных генерируемых портфелей с разным весом по каждой акции, что в сумме составляет до 100% в целом.

# on average there are 252 trading days in a year
NUM_TRADING_DAYS = 252
# we will generate random w (different portfolios)
NUM_PORTFOLIOS = 10000

Рассмотрены данные start_date и end_date за 5 лет

# historical data - define START and END dates
start_date = '2017-12-31'
end_date = '2022-12-31'

импортировал несколько библиотек для выполнения операций и загрузил данные с помощью Yahoo Finance Tikcer, Scipy для расчета оптимальных результатов путем случайной генерации различных результатов optimize_portfolio метода, и ниже показано, что я использовал для построения графика и нормализации всех данных различных акций в единые сопоставимые показатели calculate_return(data)

import numpy as np
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import scipy.optimize as optimization

def download_data():
# name of the stock (key) - stock values (2010-1017) as the values
stock_data = {}

for stock in stocks:
# closing prices
ticker = yf.Ticker(stock)
stock_data[stock] = ticker.history(start=start_date, end=end_date)['Close']

return pd.DataFrame(stock_data)


def show_data(data):
data.plot(figsize=(10, 5))
plt.show()


def calculate_return(data):
# NORMALIZATION - to measure all variables in comparable metric
log_return = np.log(data / data.shift(1))
return log_return[1:]


def show_statistics(returns):
# instead of daily metrics we are after annual metrics
# mean of annual return
print(returns.mean() * NUM_TRADING_DAYS)
print(returns.cov() * NUM_TRADING_DAYS)


def show_mean_variance(returns, weights):
# we are after the annual return
portfolio_return = np.sum(returns.mean() * weights) * NUM_TRADING_DAYS
portfolio_volatility = np.sqrt(np.dot(weights.T, np.dot(returns.cov()
* NUM_TRADING_DAYS, weights)))
print("Expected portfolio mean (return): ", portfolio_return)
print("Expected portfolio volatility (standard deviation): ", portfolio_volatility)


def show_portfolios(returns, volatilities):
plt.figure(figsize=(10, 6))
plt.scatter(volatilities, returns, c=returns / volatilities, marker='o')
plt.grid(True)
plt.xlabel('Expected Volatility')
plt.ylabel('Expected Return')
plt.colorbar(label='Sharpe Ratio')
plt.show()

generate_portfolios(returns) используется для определения среднего значения, уровня риска через дисперсию и возможных весов, подходящих для каждой акции

def generate_portfolios(returns):
portfolio_means = []
portfolio_risks = []
portfolio_weights = []

for _ in range(NUM_PORTFOLIOS):
w = np.random.random(len(stocks))
w /= np.sum(w)
portfolio_weights.append(w)
portfolio_means.append(np.sum(returns.mean() * w) * NUM_TRADING_DAYS)
portfolio_risks.append(np.sqrt(np.dot(w.T, np.dot(returns.cov()
* NUM_TRADING_DAYS, w))))

return np.array(portfolio_weights), np.array(portfolio_means), np.array(portfolio_risks)
def statistics(weights, returns):
portfolio_return = np.sum(returns.mean() * weights) * NUM_TRADING_DAYS
portfolio_volatility = np.sqrt(np.dot(weights.T, np.dot(returns.cov()
* NUM_TRADING_DAYS, weights)))
return np.array([portfolio_return, portfolio_volatility,
portfolio_return / portfolio_volatility])


# scipy optimize module can find the minimum of a given function
# the maximum of a f(x) is the minimum of -f(x)
def min_function_sharpe(weights, returns):
return -statistics(weights, returns)[2]


# what are the constraints? The sum of weights = 1 !!!
# f(x)=0 this is the function to minimize
def optimize_portfolio(weights, returns):
# the sum of weights is 1
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
# the weights can be 1 at most: 1 when 100% of money is invested into a single stock
bounds = tuple((0, 1) for _ in range(len(stocks)))
return optimization.minimize(fun=min_function_sharpe, x0=weights[0], args=returns
, method='SLSQP', bounds=bounds, constraints=constraints)


def print_optimal_portfolio(optimum, returns):
print(f"Optimal portfolio: {optimum['x'].round(4)*100}%" )
print("Expected return, volatility and Sharpe ratio: ",
statistics(optimum['x'].round(3), returns))


def show_optimal_portfolio(opt, rets, portfolio_rets, portfolio_vols):
plt.figure(figsize=(10, 6))
plt.scatter(portfolio_vols, portfolio_rets, c=portfolio_rets / portfolio_vols, marker='o')
plt.grid(True)
plt.xlabel('Expected Volatility')
plt.ylabel('Expected Return')
plt.colorbar(label='Sharpe Ratio')
plt.plot(statistics(opt['x'], rets)[1], statistics(opt['x'], rets)[0], 'g*', markersize=20.0)
plt.show()

Как приведено в комментариях, выведена возможная доходность на основе данных, а волатильность рассчитывается с использованием ковариационной матрицы с комбинированными весами. Коэффициент Шарпа равен «portfolio_return / portfolio_volatility»

Ключевое ограничение, которое следует заметить, заключается в том, что сумма всех активов всегда равна 1 (т.е. 100%)

Заключительный шаг:

Запустите все методы, чтобы получить график, а также результат, как показано ниже в командной строке. Мы также можем запустить его на ноутбуке Jupiter или Google Colab, я предпочел запускать его напрямую через командную строку на своем ноутбуке с Windows.

Normalized Distribution using log returns
Нормализованное распределение с использованием возвратов журналов
Expected Returns Vs Expected Volatility compared to Sharpe Ratio
Ожидаемая доходность и ожидаемая волатильность по сравнению с коэффициентом Шарпа

Результат:

Optimal portfolio: [11.15  0.   13.12 10.71  8.62  9.11 11.49 15.01  6.66  4.03  9.19  0.92]%
Expected return, volatility and Sharpe ratio: [0.40539076 0.1668275 2.42999966]

Заключение:

Из приведенного выше исполнения видно, что

Доходность = 40,54% (приблизительно)

Волатильность = 16.68% (приблизительно)

Коэффициент Шарпа = 2,43 (приблизительно)

Доходность портфеля:

‘GORANIN.BO’ = 11.15%,

‘BRPL.BO’ = 0,

‘RITESHIN.BO’ = 13.12%,

‘SHISHIND.BO’ = 10.71%,

‘GOLKUNDIA.BO’ = 8.62%,

‘CRSTCHM.BO’ = 9.11%,

‘UVDRHOR.BO’ = 11.49%,

‘GARGFUR.BO’ = 15.01%,

‘BRADYM.BO’ = 6.66%,

‘RAMAPPR-B.BO’ = 4.03%,

‘ORIENTTR.BO’ = 9.12%,

‘RATNABHUMI.BO’ = 0.92%

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

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

Sp, комбинируя оба метода, мы получили более высокий коэффициент Шарпа 2,4+ с доходностью 40%+ годовых, превзойдя рыночную эталонную доходность.

Patreon — https://patreon.com/pppicasso

Среднедисперсионная оптимизация портфеля: Марковиц в действии с использованием Python

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

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

Во-первых, загрузите данные с помощью yahoo finance: Если yahoo finance не установлен, установите с помощью !pip install yfinanceimport numpy as np
import pandas as pd
import yfinance as yf
import warningswarnings.filterwarnings(«ignore»)pd.options.display.float_format = ‘{:.4%}’.format# Date rangestart = ‘2016-01-01’end = ‘2021-09-30’# Tickers of assetsassets = [‘RELIANCE.NS’,’IRCTC.NS’,’ITC.NS’,’INFY.NS’,’BPCL.NS’,’TATAMOTORS.NS’,’ADANIENT.NS’,’ZOMATO.NS’,’SUNPHARMA.NS’]assets.sort()# Downloading datadata = yf.download(assets, start = start, end = end)data = data.loc[:,(‘Adj Close’, slice(None))]data.columns = assets

Для учебных целей я взял основные индийские акции, такие как Reliance, ITC, IRCTC, TATAMOTORS, ZOMATO, INFOSYS, ADANI, BPCL, SUNPHARMA. Как видите, мой портфель разнообразен из разных отраслей, поэтому я надеюсь, что мой риск доходности должен быть скорректированным.

Расчет доходности# Calculating returns
Y = data[assets].pct_change().dropna()
display(Y.head())

Оценка портфелей средней дисперсии

Расчет портфеля на основе коэффициента Шарпа

Коэффициент Шарпа оценивает взаимосвязь между доходностью инвестиций и риском. Идея о том, что избыточная доходность с течением времени может указывать на большую волатильность и риск, а не на инвестиционную экспертизу, выражается математически таким образом.
В результате своей работы над моделью ценообразования капитальных активов (CAPM) экономист Уильям Ф. Шарп в 1966 году ввел коэффициент Шарпа под названием коэффициент вознаграждения к изменчивости.

За свою работу над CAPM Шарп получил Нобелевскую премию по экономике в 1990 году.

Для оптимизации я использую эффективный пакет под названием riskfolio-lib. Вы можете установить его, написав ! pip install riskfolio-lib в вашей совместной работе или записной книжке Jupiter.import riskfolio as rp

# Building the portfolio object
port = rp.Portfolio(returns=Y)

# Calculating optimal portfolio

# Select method and estimate input parameters:

method_mu=‘hist’ # Method to estimate expected returns based on historical data.
method_cov=‘hist’ # Method to estimate covariance matrix based on historical data.

port.assets_stats(method_mu=method_mu, method_cov=method_cov, d=0.94)

# Estimate optimal portfolio:

model=‘Classic’ # Could be Classic (historical), BL (Black Litterman) or FM (Factor Model)
rm = ‘MV’ # Risk measure used, this time will be variance
obj = ‘Sharpe’ # Objective function, could be MinRisk, MaxRet, Utility or Sharpe
hist =True# Use historical scenarios for risk measures that depend on scenarios
rf = 0 # Risk free rate
l = 0 # Risk aversion factor, only useful when obj is ‘Utility’

w = port.optimization(model=model, rm=rm, obj=obj, rf=rf, l=l, hist=hist)

display(w.T)>> Sample output

Здесь вы можете видеть, что алгоритм предлагает, мы не должны инвестировать в некоторые активы, такие как ADANI, BPCL, ZOMATO и TATAMOTORS.

Построение графика состава портфолио# Plotting the composition of the portfolio

ax = rp.plot_pie(w=w, title=‘Sharpe Mean Variance’, others=0.05, nrow=25, cmap = «tab20»,
height=6, width=10, ax=None)

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

Набор идеальных портфелей, известный как эффективная граница, обеспечивает либо самый низкий риск, либо наилучшую прогнозируемую доходность при определенном уровне риска. Поскольку они не обеспечивают достаточную доходность для степени риска, портфели, которые находятся ниже границы эффективности, не являются идеальными. Поскольку они имеют большую степень риска для указанной нормы прибыли, портфели, которые группируются справа от эффективной границы, не идеальны.points = 50 # Number of points of the frontier

frontier = port.efficient_frontier(model=model, rm=rm, points=points, rf=rf, hist=hist)

display(frontier.T.head())

Построение эффективной кривойlabel = ‘Max Risk Adjusted Return Portfolio’ # Title of point
mu = port.mu # Expected returns
cov = port.cov # Covariance matrix
returns = port.returns # Returns of the assets

ax = rp.plot_frontier(w_frontier=frontier, mu=mu, cov=cov, returns=returns, rm=rm,
rf=rf, alpha=0.05, cmap=‘viridis’, w=w, label=label,
marker=‘*’, s=16, c=‘r’, height=6, width=10, ax=None)

Оценка портфелей среднего риска

В этой части я рассчитаю оптимальные портфели для нескольких мер риска. Сначала я собираюсь рассчитать портфель, который максимизирует доходность с поправкой на риск, когда CVaR (условное значение под риском) является мерой риска, затем я собираюсь рассчитать портфели, которые максимизируют доходность с поправкой на риск для всех доступных мер риска.rm = ‘CVaR’ # Risk measure

w = port.optimization(model=model, rm=rm, obj=obj, rf=rf, l=l, hist=hist)

display(w.T)

Построение графика состава портфолиоax = rp.plot_pie(w=w, title=‘Sharpe Mean CVaR’, others=0.05, nrow=25, cmap = «tab20»,
height=6, width=10, ax=None)

Рассчитайте оптимальные портфели для нескольких показателей риска

Далее я рассматриваю возможность следования мерам риска, чтобы оптимизировать свой портфель# Risk Measures available:
#
# ‘MV’: Standard Deviation.
# ‘MAD’: Mean Absolute Deviation.
# ‘MSV’: Semi Standard Deviation.
# ‘FLPM’: First Lower Partial Moment (Omega Ratio).
# ‘SLPM’: Second Lower Partial Moment (Sortino Ratio).
# ‘CVaR’: Conditional Value at Risk.
# ‘EVaR’: Entropic Value at Risk.
# ‘WR’: Worst Realization (Minimax)
# ‘MDD’: Maximum Drawdown of uncompounded cumulative returns (Calmar Ratio).
# ‘ADD’: Average Drawdown of uncompounded cumulative returns.
# ‘CDaR’: Conditional Drawdown at Risk of uncompounded cumulative returns.
# ‘EDaR’: Entropic Drawdown at Risk of uncompounded cumulative returns.
# ‘UCI’: Ulcer Index of uncompounded cumulative returns.rms = [‘MV’, ‘MAD’, ‘MSV’, ‘FLPM’, ‘SLPM’, ‘CVaR’,
‘EVaR’, ‘WR’, ‘MDD’, ‘ADD’, ‘CDaR’, ‘UCI’, ‘EDaR’]

w_s = pd.DataFrame([])

for i in rms:
w = port.optimization(model=model, rm=i, obj=obj, rf=rf, l=l, hist=hist)
w_s = pd.concat([w_s, w], axis=1)

w_s.columns = rmsw_s.style.format(«{:.2%}»).background_gradient(cmap=’YlGn’)

fig = plt.gcf()
fig.set_figwidth(14)
fig.set_figheight(6)
ax = fig.subplots(nrows=1, ncols=1)

w_s.plot.bar(ax=ax)Plotting a comparison of assets weights for each portfolio

Спасибо, что прочитали эту статью 🙂

Код доступен в моем профиле git @AIM-IT4

Решение для эффективного фронтира в портфелях акций

На вершине эффективного фронтира MidJourney 11.2023

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

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

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

Подготовка среды

Подготовьте среду jupyter и pip установите следующие библиотеки:

  • Нумпи
  • Панды
  • Ифинансы

Вам понадобится доступ к analysis_utils библиотеке для общих функций.

Прежде чем начать, давайте загрузим две некоррелированные ценные бумаги из последнего постковидного рыночного режима (2020–2023 гг.) для формирования тестового портфеля:tickers = [«DIS», «AAPL»]

START_DATE = «2021-01-01»
END_DATE = «2022-12-31»
tickers_orig_df = load_ticker_prices_ts_df(tickers, START_DATE, END_DATE)
tickers_df = tickers_orig_df.dropna(axis=1).pct_change().dropna() # first % is NaN
# 1+ to allow the cumulative product of returns over time, and -1 to remove it at the end.
tickers_df = (1 + tickers_df).cumprod() — 1
plt.figure(figsize=(16, 8))
for ticker in tickers_df.columns:
plt.plot(tickers_df.index, tickers_df[ticker] * 100.0, label=ticker)
plt.xlabel(«Date (Year-Month)»)
plt.ylabel(«Cummulative Returns(%»)
plt.legend()
plt.show()

Для каждой акции, указанной выше (i), нас интересуют:

  • Средняя историческая доходность, которую мы будем использовать в качестве ожидаемой доходности E(Ri) (наивное, но распространенное предположение в MPT).
  • Дисперсия var(i) или sigma(i)² и нормализованное стандартное отклонение sigma(i).
  • Ценовые веса Xi, которые мы будем выделять или вычислять на протяжении всей этой статьи.

mean_returns = tickers_df.mean()
highest_returns = tickers_df.max()
lowest_returns = tickers_df.min()
std_deviation = tickers_df.std()
summary_table = pd.DataFrame(
{
«Highest ret (%)»: highest_returns * 100.0,
«Average ret (%)»: mean_returns * 100.0,
«Lowest ret (%)»: lowest_returns * 100.0,
«Deviation (%)»: std_deviation * 100.0,
}
)
summary_table.transpose()

Инвестиционные предпочтения с кривыми безразличия

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

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

Предположите следующие возможности:

  1. У нас 5% безрисковая доходность (на момент написания статьи 11.2023)
  2. У нас есть выбор: не рисковать 5% или рисковать ~40% для получения ~140% прибыли с AAPL.

Предположим, что это инвестор, не склонный к риску, мы смоделируем его с помощью этой функции полезности:

  • x — риск от 1 до 100%
  • A² и Bx — это квадратичные (создание вогнутой кривой, так как мы наказываем риск) и линейные члены (чувствительность к дисперсии с положительным наклоном, мы хотим большей доходности при большем риске).
  • c — константа возрастающей полезности или удовлетворенности, увеличивая ее на 10 для создания 3 кривых.

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

Оптимальным выбором является ситуация, когда линия набора возможностей является касательной к кривой, в нашем случае к умеренной кривой полезности, что дает нам 70% доходности при 10% риска.def utility_fn(x, a=0.15, b=0.1, c=1):
return a * x**2 + b * x + c

plt.figure(figsize=(16, 8))
x_values_1 = np.linspace(0, 40, 100)
y_values_1 = utility_fn(x_values_1, c=10)
plt.plot(x_values_1, y_values_1, label=»Low Utility», alpha=0.6)
x_values_2 = np.linspace(0, 35, 100)
y_values_2 = utility_fn(x_values_2, c=24)
plt.plot(x_values_2, y_values_2, label=»Moderate Utility», color=»g», alpha=0.6)
x_values_3 = np.linspace(0, 30, 100)
y_values_3 = utility_fn(x_values_3, c=35)
plt.plot(x_values_3, y_values_3, label=»High Utility», color=»r», alpha=0.6)
plt.plot([0, 40], [5, 140], label=»Opportunity Set», color=»b», linewidth=2)
plt.plot([2, 2], [0, 12], linestyle=»—«, color=»b», alpha=0.6, linewidth=2)
plt.plot([0, 2], [12, 12], linestyle=»—«, color=»b», alpha=0.6, linewidth=2)
plt.plot([10, 10], [0, 40], linestyle=»—«, color=»g», alpha=0.6, linewidth=2)
plt.plot([0, 10], [40, 40], linestyle=»—«, color=»g», alpha=0.6, linewidth=2)
plt.plot([20, 20], [0, 72], linestyle=»—«, color=»b», alpha=0.6, linewidth=2)
plt.plot([0, 20], [72, 72], linestyle=»—«, color=»b», alpha=0.6, linewidth=2)
plt.xlabel(«Risk %»)
plt.ylabel(«Returns %»)
plt.title(«Utility Curves (Risk Free VS AAPL)»)
plt.legend()
plt.grid()
plt.xlim(0, 25)
plt.ylim(0, 100)
plt.show()

Портфели со средней дисперсией

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

Где:

  • E(Rp) — ожидаемая доходность портфеля.
  • E(i) – ожидаемая доходность актива i.
  • Wi – вес актива i в портфеле. В данном случае у нас есть только два актива.

Сначала мы преобразуем DIS и AAP в годовую доходность и ковариации:

  • n представляет количество точек данных в нашем временном ряду.
  • Ri представляет доходность для каждого периода. Мы +1, чтобы получить абсолютную доходность.
  • N — общее количество торговых дней в году (обычно 252 для ежедневной доходности).

Мы в годовом исчислении, чтобы представить полный год риска/доходности, например:

  • Ежедневная доходность: 0.005 (0.5% доходности)
  • Годовая доходность: 0,005 * 252 = 1,26 (126% годовой доходности)

TRADING_DAYS_IN_YEAR = 252

tickers_df = tickers_orig_df.dropna(axis=1).pct_change().dropna()
rets = ((1 + tickers_df).prod() ** (TRADING_DAYS_IN_YEAR / len(tickers_df))) — 1
cov_matrix = tickers_df.cov() * TRADING_DAYS_IN_YEAR
summary_table = pd.DataFrame(
{
«Annualized Returns (%)»: round(rets * 100.0, 2),
«Annualized Covariances (%)»: [
round(cov_matrix.iloc[1, 0] * 100.0, 2),
round(cov_matrix.iloc[0, 1] * 100.0, 2),
],
}
)
summary_table.transpose()

Портфель — это взвешенная совокупность активов. Мы можем создать несколько портфелей с произвольными весами, которые мы случайным образом протестируем ниже:RISK_FREE_RATE = 0.05
MAX_PORTS = 10000
MAX_WEIGHT = 1.05

def port_generator(rets, cov_matrix):
port_rets = []
port_risks = []
port_sharpes = []
port_weights = []
for _ in range(MAX_PORTS):
# weights = np.random.random(len(rets))
weights = np.random.uniform(-MAX_WEIGHT, MAX_WEIGHT, len(rets))
weights /= np.sum(weights) # Normalize weights to 1
if any(weights > MAX_WEIGHT):
continue
port_weights.append(weights)
port_ret = np.dot(weights, rets)
port_rets.append(port_ret)
port_risk = np.sqrt(weights.T @ cov_matrix @ weights)
port_risks.append(port_risk)
port_sharpe = (port_ret — RISK_FREE_RATE) / port_risk
port_sharpes.append(port_sharpe)
port_rets = np.array(port_rets)
port_risks = np.array(port_risks)
plt.scatter(
port_risks * 100.0,
port_rets * 100.0,
c=port_sharpes,
cmap=»viridis»,
alpha=0.75,
)
plt.xlabel(«Risk (%)»)
plt.ylabel(«Expected Returns (%)»)
plt.colorbar(label=»Sharpe Ratio»)
plt.grid()
return port_risks, port_rets, port_sharpes

plt.figure(figsize=(16, 8))
plt.title(«Random Portfolios»)
port_generator(rets, cov_matrix)
plt.show()

Уже сейчас мы видим, как формируется граница.

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

где:

  • Rp — доходность портфеля.
  • Rf – безрисковая ставка. По состоянию на 11.2023 это 5%
  • sigma — стандартное отклонение доходности портфеля.

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

В поисках инвестиционной вселенной

Чтобы упростить процесс формирования портфелей и границ, мы будем игнорировать безрисковое кредитование и заимствование и предполагать, что возможны неограниченные короткие продажи — это означает, что вы увидите отрицательные веса и веса, превышающие 100%. Все это в сумме составит 100%, если вы включите отрицательные веса, так как мы будем «кредитное плечо» для наших длинных позиций с доходом от коротких продаж, например, -20% DIS и 100% AAPL:

  • Мы открываем длинную позицию на 100% AAPL, продаем на понижение 20% DIS, получая дополнительные средства за счет процентов и возврата акций контрагенту (что мы также упрощаем),
  • Мы используем дополнительные 20% для покупки еще 20% акций AAPL.

Следующие разделы лучше описать с более широким набором инструментов на более крупном таймфрейме для диверсификации:tickers = [
«AAPL»,
«DIS»,
«MSFT»,
«AMZN»,
«GOOG»,
]
START_DATE = «2014-01-01»
END_DATE = «2022-12-31»

tickers_orig_df = load_ticker_prices_ts_df(tickers, START_DATE, END_DATE)
tickers_df = tickers_orig_df.dropna(axis=1).pct_change().dropna() # first % is NaN
rets = ((1 + tickers_df).prod() ** (TRADING_DAYS_IN_YEAR / len(tickers_df))) — 1
cov_matrix = tickers_df.cov() * TRADING_DAYS_IN_YEAR
plt.figure(figsize=(16, 8))
plt.title(«Random Portfolios»)
port_risks, port_rets, port_sharpes = port_generator(rets, cov_matrix)
plt.show()

Теперь построим 2 портфеля в качестве бенчмарков:

  1. Портфель минимальной дисперсии (MVP) — MVP — это вершина границы и наименее волатильный портфель с адекватной доходностью, любой портфель под ним обеспечивает меньшую полезность для инвестора с точки зрения его риска.
  2. Tangency Portfolio (TAN) — Рыночный портфель на линии рынка капитала (CML), который является наивысшей точкой тагении, максимизирующей коэффициент Шарпа и, следовательно, доходность с поправкой на риск.

Чтобы добраться до этих портфелей, мы аппроксимируем обратную ковариацию (называемую матрицей точности), чтобы получить min_risk_vect и expect_ret_vect скалярные произведения, которые будут способствовать корректировке риска.

Решение MVP простое, все атрибуты портфолио настраиваются min_risk_vect.

TAN тот же, но скорректирован на вектор expect_ret_vect.# Equal-weighted portfolio useful for matrix operations
equal_weights = np.ones(len(rets))

rets = ((1 + tickers_df).prod() ** (TRADING_DAYS_IN_YEAR / len(tickers_df))) — 1
cov_matrix = tickers_df.cov() * TRADING_DAYS_IN_YEAR
# Min variance weights
inv_cov_matrix = np.linalg.pinv(cov_matrix)
min_risk_vect = equal_weights @ inv_cov_matrix
expect_ret_vect = inv_cov_matrix @ rets
# Minimum variance portfolio
# Weights are normalized to sum to 1, and risk to std deviation.
mvp_weights = min_risk_vect / np.sum(min_risk_vect)
mvp_ret = mvp_weights @ rets
mvp_risk = np.sqrt(mvp_weights.T @ cov_matrix @ mvp_weights)
# Tangency portfolio
tan_weights = expect_ret_vect / np.sum(expect_ret_vect)
tan_ret = tan_weights @ rets
tan_risk = np.sqrt(tan_weights.T @ cov_matrix @ tan_weights)
summary_data = {
«Asset»: tickers,
«MVP Weights»: mvp_weights,
«TAN Weights»: tan_weights,
}
print(f»mvp_ret: {mvp_ret*100:0.02f}%, mvp_risk {mvp_risk*100:0.02f}%»)
print(f»tan_ret: {tan_ret*100:0.02f}%, tan_risk {tan_risk*100:0.02f}%»)
summary_df = pd.DataFrame(summary_data)
summary_df.T

Создадим кривую риска, определив риск портфеля для MVP и ожидаемую доходность:

Где:

  • W mvp — это весовые коэффициенты всех активов в MVP.
  • E(R) — это весовые коэффициенты, связанные с ожидаемой доходностью для всех портфелей вдоль кривой.
  • Sigma² MVP — это дисперсия доходности MVP.
  • Сигма² E(R) — дисперсия ожидаемой доходности всех портфелей.
  • Cov — это ковариация между доходностью MVP и ожидаемой доходностью всех портфелей.

Вышесказанное нормируется служебной функцией и квадратным корнем.

Наконец, мы добавим линию рыночного капитала (MCL), чтобы представить рыночный риск и доходность на момент этого анализа, любой портфель под этой линией может быть переоценен и неоптимален, любой более высокий может быть недооценен из-за своего риска.

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

Где:

  • E(Rp): Ожидаемая доходность портфеля i.
  • Rf: Безрисковая ставка, представленная постоянным сроком c.
  • Sigma i и Sigma m: Дисперсия портфеля i. В нашем случае это обратная рыночная доходность с поправкой на риск, рассчитанная в квадратичных слагаемых a.
  • E(RM)-Rf: произведение доходности и MVP, рассчитанное в линейном члене b.

При сопоставлении с ожидаемой доходностью CML перехватывает эффективную границу в портфеле TAN, который является наиболее оптимальным рыночным портфелем.MAX_RETS = 0.51
TEN_BASIS_POINTS = 0.0001 * 10

c = np.sum(equal_weights * min_risk_vect) # Constant term
b = np.sum(rets * min_risk_vect) # Linear term
a = np.sum(rets * expect_ret_vect) # Quadratic term
utility_func = (a * c) + (-(b**2)) # U(X) to penalize risk
# The frontier curve & MCL, scaled by utility function
exp_rets = np.arange(0, MAX_RETS, TEN_BASIS_POINTS)
ports_risk_frontier = np.sqrt(
((c * (exp_rets**2)) — (2 * b * exp_rets) + a) / utility_func
)
mcl_vector = exp_rets * (1 / np.sqrt(a))
plt.figure(figsize=(12, 6))
plt.plot(
ports_risk_frontier,
exp_rets,
linestyle=»—«,
color=»blue»,
label=»Efficient Frontier»,
linewidth=2,
alpha=0.6,
)
plt.plot(
mcl_vector,
exp_rets,
label=»MCL»,
linewidth=2,
alpha=0.6,
color=»black»,
)
plt.scatter(mvp_risk, mvp_ret, color=»green», label=»MVP»)
plt.annotate(
f»MVP\nRisk: {mvp_risk*100:.2f}%\nReturn: {mvp_ret*100:.2f}%»,
(mvp_risk, mvp_ret),
textcoords=»offset points»,
xytext=(-30, 10),
)
plt.scatter(tan_risk, tan_ret, color=»red», label=»TAN»)
plt.annotate(
f»Tangency\nRisk: {tan_risk*100:.2f}%\nReturn: {tan_ret*100:.2f}%»,
(tan_risk, tan_ret),
textcoords=»offset points»,
xytext=(10, 10),
)
plt.legend(loc=»upper left», fontsize=10)
plt.xlabel(«Risk %»)
plt.ylabel(«Returns %»)
plt.tight_layout()
plt.show()

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

Мы предполагаем, что целевая доходность никогда не бывает меньше, чем доходность MVP:TARGET_RET = 0.3

pt_port = None
opt_risk = None
opt_ret = None
mvp_weights = (a — (b * TARGET_RET)) / utility_func
tan_weights = ((c * TARGET_RET) — b) / utility_func
opt_port_weights = (mvp_weights * min_risk_vect) + (tan_weights * expect_ret_vect)
opt_ret = np.sum(opt_port_weights * rets)
opt_risk = np.sqrt(((c * (opt_ret**2)) — (2 * b * opt_ret) + a) / utility_func)
plt.figure(figsize=(12, 6))
plt.plot(
ports_risk_frontier,
exp_rets,
linestyle=»—«,
color=»blue»,
label=»Frontier»,
linewidth=2,
alpha=0.6,
)
plt.scatter(opt_risk, opt_ret, color=»green», label=»Min Variance»)
plt.annotate(
f»Optimal \nRisk: {opt_risk*100:.2f}%\nReturn: {opt_ret*100:.2f}%»,
(opt_risk, opt_ret),
textcoords=»offset points»,
xytext=(-30, 10),
)
plt.legend(loc=»upper left», fontsize=10)
plt.xlabel(«Risk %»)
plt.ylabel(«Returns %»)
plt.tight_layout()
plt.show()

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

Заключение

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

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

Имейте в виду, что если вы запустите приведенный выше код только на текущем режиме рынка (после ковида 2020–2023), вы увидите неожиданные результаты или экстремальные весовые коэффициенты MVP или TAN, это связано с высокой волатильностью, которую рынок испытывал в этот период. Это также указывает на слабые стороны фронтира, поскольку он зависит от прошлых результатов и слеп к рыночным событиям и изменениям в рыночном режиме.

Источник

Источник

Источник

Источник

Иточник