Рассчёт внутренней стоимости акции

Внутренняя стоимость состоит из 2 частей:

Исходя из этого определения, у нас есть 2 цели обучения:

  • Рассчитать внутреннюю стоимость 2 способами
  • Обсудите недостатки и средства правовой защиты от этих 2 методов

Рассчитайте внутреннюю стоимость простым способом

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

  1. Дивиденды за следующие 10 лет, как правило, остаются такими же, как и за предыдущие 10 лет
  2. Балансовая стоимость имеет тенденцию расти с постоянной скоростью, которая может быть рассчитана с использованием балансовой стоимости 10-летней давности и текущей балансовой стоимости.

Давайте загрузим переформатированные финансовые данные (скачать здесь) из предыдущего руководства и начнем расчет. Я продолжу использовать акции Apple для демонстрации.

(1) Дивиденды

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

dvd_avg = aapl['dividend_rate'].mean()
print(dvd_avg)# Output:
# 2.1222222222222222

Итак, теперь мы можем ожидать, что акции Apple будут приносить инвесторам 2,12 доллара в год. Однако, как упоминалось в учебнике Престона Пиша, 2,12 доллара за 10 лет не эквивалентны 2,12 доллара сегодня. Потому что у нас есть национальная облигация, которую можно считать «безрисковой». Итак, мы берем ставку 10-летних национальных облигаций и используем ее в качестве учетной ставки, чтобы рассчитать, сколько стоят будущие деньги сегодня. Как указано на этом веб-сайте, процентная ставка по 10-летним национальным облигациям сегодня составляет 1,79%. (Ставка часто колеблется, поэтому вы можете проверить ее перед расчетом.) Теперь давайте посчитаем, сколько доза через 3 года стоит 2,12 доллара сегодня.

risk_free_rate = 0.0179
dvd_avg/(1+risk_free_rate)**3# Output:
# 2.0122202476874578

Результат означает, что если мы используем 2,01 доллара для покупки 10-летних национальных облигаций сегодня, они увеличатся до 2,12 доллара через 3 года из-за процентов.

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

dvd_total = 0for i in range(1,11):
dvd_total = dvd_total + dvd_avg/(1+risk_free_rate)**iprint(dvd_total)# Output:
# 19.27420500514451

Итак, у нас есть оценка следующих 10-летних дивидендов от Apple, это 19,27.

Прежде чем мы перейдем к следующему разделу, вы можете обратить внимание на эти две вещи. Во-первых, функция range(1,11) дает значение от 1 до 10, 11 не включено. Во-вторых, вы, возможно, заметили, что в нашем наборе данных есть значения NaN, что указывает либо на отсутствие данных, либо на то, что Apple не выплачивала дивиденды в этом году. В наших вычислениях Pandas автоматически сбросили эти значения. Но вы должны знать о ситуации, мы вернемся к этому вопросу в следующем способе.

Теперь перейдем к балансовой стоимости.

(2) Балансовая стоимость одной акции

Как вы заметили, последнее значение столбца даты — «TTM», что означает «последние 12 месяцев», дальнейшее объяснение здесь. Для удобства я пока проигнорирую эту строку и расскажу о способах ее использования позже.

Согласно нашему второму предположению, мы можем рассчитать упрощенные темпы роста за последние 10 лет следующим образом:

book_value = aapl['book_value_per_share']

growth_rate_of_9y= book_value['2019-09']/book_value['2010-09']avg_growth_rate = growth_rate_of_9y**(1/9)print(avg_growth_rate)# Output:
# 1.126189582316940

Здесь мы сначала рассчитали темп роста с 2010 по 2019 год по делению, а затем вычислили его 9-й корень, чтобы получить средний темп роста. Внимание, хотя у нас есть данные за 10 лет, интервал с 2010 по 2019 год составляет 9 лет. Вот почему мы используем 9-й корень, а не 10-й корень.

Затем мы можем предсказать будущую балансовую стоимость следующим образом:

bvps_pred = book_value['2019-09']*(growth_rate**10)
print(bvps_pred)# Output:
# 63.26497986577179

(3) Заключительный шаг

Пока что у нас есть 2 компонента внутренней стоимости. Просто сложив их, мы можем получить внутреннюю стоимость акций Apple.

aapl_intrinsic = bvps_pred + dvd_total
print(aapl_intrinsic)# Output:
# 82.5391848709163

По сравнению с текущей ценой (312,91 доллара) это очень мало. Это может быть либо люди по какой-то причине переоценивают Apple на данный момент, либо мы что-то упустили в наших расчетах.

(4) Ограничения

Давайте сначала поговорим о недостатках первого расчета.

Во-первых, давайте посмотрим на дивиденды Apple за последние 10 лет. Pandas настолько удобен, что вы можете просто использовать функцию .plot() для визуализации данных.

aapl['dividend_rate'].plot()

И это дает нам такой сюжет:

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

Кроме того, давайте посмотрим на балансовую стоимость Apple. Мы можем визуализировать это таким же образом, и это дает следующий сюжет.

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

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

Лучший подход — линейная регрессия

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

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

В Python линейная регрессия на самом деле состоит из 3 строк кода, вам просто нужно отформатировать данные так, как того требует функция линейной регрессии, а затем ввести данные в функцию. Если у вас нет опыта работы с линейной регрессией, я рекомендую вам ознакомиться с этим практическим руководством из Towards Data Science, прежде чем переходить к следующему разделу.

Рассчитайте внутреннюю стоимость более эффективным способом

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

(1) Ведение

Прежде чем приступить к кодированию, необходимо провести некоторую работу по дому.

Во-первых, давайте сгенерируем новый столбец «year_order», который в основном присваивает [1,2,…,10] нашему индексу «2010–09», «2011–09»… Потому что жало времени озадачило бы линейную модель. Пока мы будем держать их в правильном порядке, мы будем в хорошей форме.

aapl['year_index'] = range(1, len(aapl) + 1)

Это способ добавить новый столбец в кадр данных Pandas. Если вы используете функцию .head() для наблюдения за данными, вы можете увидеть новый столбец.

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

aapl['intercept'] = 1

В-третьих, импортируйте библиотеку для линейной регрессии. Здесь мы будем использовать statsmodels, так же, как и в рекомендуемом руководстве.

import statsmodels.api as sm

Теперь все готово. На этот раз начнем с балансовой стоимости.

(2) Балансовая стоимость одной акции

Ниже описано, как мы строим линейную модель. Просто передавая результат и предикторы, и вызываем метод .fit().

bvps_model = sm.OLS(aapl['book_value_per_share'], aapl[['year_index','intercept']]).fit()

Теперь спрогнозируем балансовую стоимость через 10 лет. Поскольку порядок года «2019–09» равен 9, порядок года 2029 года должен быть 19.

bvps_pred_lr = bvps_model.predict([19,1])[0]
print(bvps_pred_lr)# Output:
# 41.81709090909092

Если конечная строка [0] вас озадачивает, то это всего лишь индекс. Наша модель возвращает массив с одним числом, это [0] просто извлекает это число, которое является предсказанием балансовой стоимости в ближайшие 10 лет.

Как вы можете видеть, балансовая стоимость значительно снизилась по сравнению с результатом нашего первого подхода. Это связано с тем, что недавнее снижение балансовой стоимости (после 2017 года), как показано в визуализации, повлиявшей на нашу модель, в результате сделало более «консервативную» оценку. Для меня это имеет больше смысла, чем просто предположение, что компания растет с постоянной скоростью, которая была рассчитана всего на основе 2 точек данных, в течение 10 лет.

(3) Дивиденды

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

aapl_new = aapl.dropna(subset = ['dividend_rate'])

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

Теперь мы можем построить модель и сделать прогноз.

dvd_model = sm.OLS(aapl_new['dividend_rate'], aapl_new[['year_index','intercept']]).fit()dvd_model.predict([19,1])[0]# Output:
# 5.84583333

Число 5,85 — это предполагаемые дивиденды в ближайшие 10 лет, что намного больше, чем среднее значение, используемое простым методом. Как и в предыдущем обсуждении, это логичный вывод из-за восходящей тенденции исторических дивидендов.

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

dvd_total_lr = 0
current_year_order = 9
for i in range(1,11):
dvd_new = dvd_model.predict([current_year_order + i,1])[0]
dvd_total_lr = dvd_total_lr + dvd_new/(1+risk_free_rate)**i
print(dvd_total_lr)# Output:
# 40.15163616617433

(4) Подведите итоги

Сложив 2 части, мы получаем окончательную оценку внутренней стоимости.

aapl_intrinsic_lr = dvd_total_lr + bvps_pred_lr
print(aapl_intrinsic_lr)# Output:
# 81.96872707526525

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

Ниже приведен мой код для этого урока. Вы можете нажать кнопку «Открыть в Colab» и поиграть с этими кодами онлайн. Дайте мне знать, если у вас есть какие-либо проблемы или идеи.

(5) Ограничения и средства правовой защиты

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

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

Решить эту проблему непросто, так как предсказать будущее сложно. Но, по крайней мере, мы могли бы знать, насколько модель уверена в своем прогнозе. Выходной параметр R-квадрат может быть хорошим индикатором, он в основном показывает, в какой степени наша модель может объяснить изменчивость данных. 1 означает идеальное соответствие, 0 или отрицательный означает ужасную оценку. Я бы порекомендовал вам использовать прогноз только с R-квадратом больше 0,8, что является довольно приличной оценкой.

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

В-третьих, я не использовал «TTM» в этом уроке, но он может быть информативным. Данные TTM поступают из квартальных финансовых отчетов, а не из годового финансового отчета. В то время как годовые отчеты являются более точными (они находятся под внешним аудитом), квартальный отчет дает более актуальную информацию. Мой подход к использованию этой точки данных можно разделить на следующие шаги: (1) Решите, каким кварталом является TTM, исходя из текущего месяца и финансового месяца компании. Например, если компания публикует годовой финансовый отчет в январе, а сейчас август, то я ожидаю, что данные TTM будут взяты из второго квартального отчета. (2) Назначьте порядок года для TTM, добавив 0.25 (первый квартал), 0.5 (второй квартал), 0.75 (третий квартал). Если дата последнего финансового отчета находится в пределах 3 месяцев от текущей даты, данные в TTM должны совпадать с данными его предыдущей строки, поскольку последний годовой отчет является последним отчетом. И это наш случай в этом уроке. В этом случае вы можете просто удалить строку TTM, так как она не предоставляет больше дополнительной информации.

Источник