Поиск базовой стоимости акции

Простое руководство по реализации подхода CCA в Python для оценки акций

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

Прежде чем перейти к изучению статьи, убедитесь, что вы знакомы со следующими финансовыми концепциями: выручка, рыночная капитализация, стоимость предприятия (EV), коэффициент P/E, EBITDA, EBIT, а также некоторые основы программирования на Python.

Сравнительный анализ компании (CCA)

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

  • Объединение похожих компаний: Это первая и главная задача, которую мы должны решить, следуя подходу ОАС. CCA — это сравнение одной акции с кучей других, и очень важно, чтобы мы выбирали правильные похожие акции. В противном случае мы можем в конечном итоге переоценить или недооценить акции. Например, если мы пытаемся рассчитать внутреннюю стоимость Tesla, мы должны принять во внимание акции, которые принадлежат только автомобильному сектору, но не акциям других секторов, таких как Apple или Intel.
  • Выбор правильных мультипликаторов оценки: Это не что иное, как процесс выбора показателей, которые используются для сравнения акций. Как и в первом процессе выбора акций, выбор неправильных мультипликаторов может привести либо к недооценке, либо к переоценке акций. Наиболее распространенными используемыми мультипликаторами являются коэффициент P/E, EV/EBITDA и так далее и тому подобное.

В этой статье мы определим внутреннюю стоимость акций Apple, сначала объединив правильные аналогичные акции, которые относятся к технологическому сектору, и рассмотрев мультипликаторы оценки: коэффициент P/E, EV/EBITDA, EV/EBIT и EV/выручка. Вот и все о подходе CCA. Теперь давайте перейдем к программированию, где мы будем использовать Python для кодирования всего подхода. Прежде чем двигаться дальше, примечание об отказе от ответственности: единственная цель этой статьи — просвещать людей, и ее следует рассматривать как информационный материал, а не как инвестиционный совет или что-то в этом роде.

Реализация на Python

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

1. Importing Packages
2. Extracting the Financial Metrics with IEX Cloud
3. Formatting the Extracted Data
4. Calculating the Valuation Multiples
5. Calculating the Average and Difference of Multiples
6. Determining the Underlying Value

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

Шаг 1: Импорт пакетов

Импорт необходимых пакетов в среду python — это шаг, который нельзя пропустить. Первичными пакетами будут Pandas для работы с кадрами данных, манипулирования данными и т. д., Запросы для выполнения вызовов API, NumPy для работы с массивами и для научных функций. Вторичным пакетом будет Termcolor для настройки шрифта (необязательный, но отличный для использования). Давайте импортируем все эти пакеты в нашу среду Python.

Реализация Python:

# IMPORTING PACKAGES

import pandas as pd
import requests
import numpy as np
from termcolor import colored as cl

Теперь, когда мы импортировали все необходимые пакеты в наш python. Давайте извлечем некоторые финансовые показатели группы технологических акций вместе с Apple с мощными конечными точками API IEX Cloud.

Шаг 2: Извлечение финансовых показателей с помощью IEX Cloud

На этом этапе мы извлечем финансовые показатели (цена акций, рыночная капитализация, коэффициент P/E, EBITDA, EBIT, выручка и стоимость предприятия) десяти технологических акций (Microsoft, Amazon, Google, Facebook, Alibaba, Nvidia, PayPal, Intel, Netflix и Apple) с помощью нескольких конечных точек API, предоставляемых IEX Cloud.

Вот примечание о IEX Cloud: IEX Cloud предоставляет обширное количество конечных точек API, которые включают рыночные данные об акциях, товарах, форексе, опционах и криптовалюте. Данные надежны, и их API легко использовать на любых языках программирования. API поставляется с настраиваемыми параметрами, которые могут помочь получить желаемую информацию, и одна вещь, которую я действительно ценю в IEX Cloud, — это объем работы и времени, которые они вложили в создание замечательной документации. Кроме того, убедитесь, что у вас есть учетная запись разработчика в IEX Cloud, только тогда вы сможете получить доступ к своему ключу API (жизненно важный элемент для извлечения данных с помощью API). С учетом сказанного, давайте вытащим некоторые данные.

Реализация Python:

# EXTRACTING THE FINANCIAL METRICS

ticker = ['MSFT', 'AMZN', 'GOOGL', 'FB', 'BABA', 'NVDA', 'PYPL', 'INTC', 'NFLX', 'AAPL']

def get_metrics(stock):
iex_api_key = 'YOUR SANDBOX API KEY'
fundamentals = []

# 1. PRICE

price_url = f'https://sandbox.iexapis.com/stable/stock/{stock}/price?token={iex_api_key}'
raw_price = requests.get(price_url)
price = raw_price.json()
fundamentals.append(price)

# 2. MARKET CAP

marketcap_url = f'https://sandbox.iexapis.com/stable/stock/{stock}/stats?token={iex_api_key}'
raw_marketcap = requests.get(marketcap_url)
marketcap = raw_marketcap.json()['marketcap']
fundamentals.append(marketcap)

# 3. PE RATIO

peRatio_url = f'https://sandbox.iexapis.com/stable/stock/{stock}/stats?token={iex_api_key}'
raw_peRatio = requests.get(peRatio_url)
peRatio = raw_peRatio.json()['peRatio']
fundamentals.append(peRatio)

# 4. EBITDA

ebitda_url = f'https://sandbox.iexapis.com/stable/time-series/fundamentals/{stock}/quarterly?token={iex_api_key}'
raw_ebitda = requests.get(ebitda_url)
ebitda = raw_ebitda.json()[0]['ebitdaReported']
fundamentals.append(ebitda)

# 5. EBIT

ebit_url = f'https://sandbox.iexapis.com/stable/time-series/fundamentals/{stock}/quarterly?token={iex_api_key}'
raw_ebit = requests.get(ebit_url)
ebit = raw_ebit.json()[0]['ebitReported']
fundamentals.append(ebit)

# 6. REVENUE

revenue_url = f'https://sandbox.iexapis.com/stable/time-series/fundamentals/{stock}/quarterly?token={iex_api_key}'
raw_revenue = requests.get(revenue_url)
revenue = raw_revenue.json()[0]['revenue']
fundamentals.append(revenue)

# 7. ENTERPRISE VALUE

entvalue_url = f'https://sandbox.iexapis.com/stable/stock/{stock}/advanced-stats?token={iex_api_key}'
raw_entvalue = requests.get(entvalue_url)
entvalue = raw_entvalue.json()['enterpriseValue']
fundamentals.append(entvalue)

print(cl(f'Extracted {stock} Fundamentals', attrs = ['bold']))

return fundamentals

msft_fundamentals = get_metrics(ticker[0])
amzn_fundamentals = get_metrics(ticker[1])
googl_fundamentals = get_metrics(ticker[2])
fb_fundamentals = get_metrics(ticker[3])
baba_fundamentals = get_metrics(ticker[4])
nvda_fundamentals = get_metrics(ticker[5])
pypl_fundamentals = get_metrics(ticker[6])
intc_fundamentals = get_metrics(ticker[7])
nflx_fundamentals = get_metrics(ticker[8])
aapl_fundamentals = get_metrics(ticker[9]))

Выпуск:

Extracted MSFT Fundamentals
Extracted AMZN Fundamentals
Extracted GOOGL Fundamentals
Extracted FB Fundamentals
Extracted BABA Fundamentals
Extracted NVDA Fundamentals
Extracted PYPL Fundamentals
Extracted INTC Fundamentals
Extracted NFLX Fundamentals
Extracted AAPL Fundamentals

Пояснение к коду: Сначала мы определяем функцию с именем ‘get_metrics’, которая принимает символ акции в качестве параметра. Внутри функции мы сначала определяем переменную с именем «iex_api_key», в которой мы храним ключ API. Вы могли заметить, что я упомянул SANDBOX API KEY, который является не чем иным, как ключом Sandbox API, предоставленным нам IEX Cloud. Чтобы было более понятно, пока мы создаем учетную запись разработчика IEX Cloud, команда предоставит нам два типа ключей API: один — это ключ Cloud API, который помогает нам взаимодействовать с облачной средой, а другой — ключ API песочницы, который помогает нам извлекать данные из среды песочницы.

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

После сохранения ключа API мы создаем еще одну переменную под названием «fundamentals», в которой хранится пустой список, к которому будут добавлены значения каждой финансовой метрики. Далее идет процесс извлечения каждой финансовой метрики с использованием соответствующей конечной точки API, предоставляемой IEX Cloud. Я не собираюсь здесь объяснять код для извлечения каждого из них, а только первый, который извлекает метрику цены акций, поскольку структура кода аналогична. В коде для извлечения метрики цены акций мы сначала сохраняем URL-адрес API в переменной ‘price_url’. Используя «get_function», предоставляемый запросами, мы вызываем API, а затем сохраняем данные в переменную «цена» в формате JSON.

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

Шаг 3: Форматирование данных

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

Реализация Python:

# FORMATTING THE DATA

raw_data = [msft_fundamentals, amzn_fundamentals, googl_fundamentals, fb_fundamentals, baba_fundamentals,
nvda_fundamentals, pypl_fundamentals, intc_fundamentals, nflx_fundamentals, aapl_fundamentals]

fundamentals = pd.DataFrame(columns = ['price', 'marketcap', 'pe', 'ebitda', 'ebit', 'revenue', 'ev'])
fundamentals.iloc[:,0] = range(0, 10)

for i in range(len(fundamentals)):
fundamentals.iloc[i] = raw_data[i]

fundamentals['symbol'] = ticker
fundamentals = fundamentals.set_index('symbol')
fundamentals

Выпуск:

Изображение автора

Пояснение к коду: Во-первых, мы создаем переменную с именем «raw_data», в которой мы храним все извлеченные финансовые показатели десяти акций. Затем мы создаем новые «основы» кадра данных для хранения всех необработанных данных. Следующая строка кода не имеет большого значения, а просто заполняет числа в диапазоне от 0 до 10 и соответствует своей длине переменной «raw_data». На следующем шаге мы создаем цикл for, который заполняет «фундаментальные» данные фактическими финансовыми показателями каждой акции и выдает результат, как показано в приведенных выше выходных данных. Весь этот процесс очистки и форматирования данных облегчает нам работу и помогает нам легко разобраться в них.

Шаг 4: Расчет мультипликаторов оценки

На этом шаге мы собираемся рассчитать мультипликаторы оценки, которые представляют собой коэффициент P/E, EV/EBITDA, EV/EBIT и EV/Revenue, с помощью фрейма данных, который мы очистили и отформатировали ранее. Эти мультипликаторы оценки затем будут использоваться в качестве основных компонентов на дальнейших этапах.

Реализация Python:

# VALUATION MULTIPLES CALCULATION

valuation_multiples = fundamentals.copy().iloc[:, 2:].drop('ev', axis = 1)
valuation_multiples = valuation_multiples.rename(columns = {'ebitda':'ev/ebitda', 'ebit':'ev/ebit', 'revenue':'ev/revenue'})

valuation_multiples.iloc[:, 1] = fundamentals['ev'] / fundamentals['ebitda']
valuation_multiples.iloc[:, 2] = fundamentals['ev'] / fundamentals['ebit']
valuation_multiples.iloc[:, 3] = fundamentals['ev'] / fundamentals['revenue']

valuation_multiples

Выпуск:

Изображение автора

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

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

Шаг 5: Вычисление среднего значения и разности кратных

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

Реализация Python:

# AVERAGE AND DIFFERENCE OF MULTIPLES

index = ['avg', 'diff']
avg_diff = pd.DataFrame(columns = ['pe', 'ev/ebitda', 'ev/ebit', 'ev/revenue'])
avg_diff.iloc[:, 0] = np.arange(0,2)

avg_diff.iloc[0] = valuation_multiples[:9].sum() / 10
avg_diff.iloc[1] = valuation_multiples.iloc[9] / avg_diff.iloc[0]
avg_diff['avg/diff'] = index
avg_diff = avg_diff.set_index('avg/diff')
avg_diff

Выпуск:

Изображение автора

Пояснение к коду: В первых трех строках ничего особенного не происходит, когда мы просто создаем новый кадр данных с именем «avg_diff», где будут храниться вычисленные показания, и мы временно заполняем кадр данных числами в диапазоне от 0 до 2, чтобы соответствовать длине, вместо пустого кадра данных, чтобы нам было полезно добавить значения, которые мы будем вычислять.

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

Шаг 6: Определение базовой стоимости

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

Реализация Python:

# CALCULATING THE INTRINSIC VALUE

price_diff = raw_data[9][0] / avg_diff.iloc[1]
intrinsic_price = round((sum(price_diff) / 4), 2)
percentage_difference = round(((raw_data[9][0] / intrinsic_price) * 100), 2)

print(cl(f'The listed price of Apple : {raw_data[9][0]}', attrs = ['bold']))
print(cl(f'The intrinsic value of Apple : {intrinsic_price}', attrs = ['bold']))
if intrinsic_price > raw_data[9][0]:
print(cl(f'The Underlying Value of Apple stock is {percentage_difference}% Higher than the Listed price', attrs = ['bold']))
else:
print(cl(f'The Underlying Value of Apple stock is {percentage_difference}% Lower than the Listed price', attrs = ['bold']))

Выпуск:

The listed price of Apple : 133.8
The intrinsic value of Apple : 181.21
The Underlying Value of Apple stock is 73.84% Higher than the Listed price

Пояснение к коду: Код, который здесь имеет значение, — это только первые три строки, а все остальные являются необязательными (но рекомендуемыми). В первой строке мы определяем переменную с именем «price_diff» для хранения соотношения между текущей котируемой ценой Apple и показаниями ранее рассчитанной разницы (отношение между мультипликаторами оценки Apple и средним значением всех мультипликаторов оценки). Затем мы вычисляем внутреннюю или базовую стоимость акций Apple, просто беря среднее значение «price_diff», которое мы только что рассчитали. В следующей строке кода мы определяем процентную разницу между фактической ценой и базовой стоимостью акций Apple и сохраняем ее в «percentage_difference».

Из вывода видно, что текущая или последняя торгуемая цена акций Apple составляет 133,8 доллара США, а базовая стоимость — 181,21 доллара США, что на 73,84% выше, чем у текущей торгуемой цены. Это захватывающие цифры, не так ли? Наблюдая за показаниями, которые мы получили от нашего подхода, мы могли бы пойти на длинную позицию (покупать), поскольку акции Apple в настоящее время недооценены и могут продемонстрировать существенный рост в будущем (не инвестиционный совет, а просто мои мысли о результатах).

Заключительные мысли!

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

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

Полный код:

# IMPORTING PACKAGES

import pandas as pd
import requests
import numpy as np
from termcolor import colored as cl

# EXTRACTING THE FINANCIAL METRICS

ticker = ['MSFT', 'AMZN', 'GOOGL', 'FB', 'BABA', 'NVDA', 'PYPL', 'INTC', 'NFLX', 'AAPL']

def get_metrics(stock):
iex_api_key = 'YOUR SANDBOX API KEY'
fundamentals = []

# 1. PRICE

price_url = f'https://sandbox.iexapis.com/stable/stock/{stock}/price?token={iex_api_key}'
raw_price = requests.get(price_url)
price = raw_price.json()
fundamentals.append(price)

# 2. MARKET CAP

marketcap_url = f'https://sandbox.iexapis.com/stable/stock/{stock}/stats?token={iex_api_key}'
raw_marketcap = requests.get(marketcap_url)
marketcap = raw_marketcap.json()['marketcap']
fundamentals.append(marketcap)

# 3. PE RATIO

peRatio_url = f'https://sandbox.iexapis.com/stable/stock/{stock}/stats?token={iex_api_key}'
raw_peRatio = requests.get(peRatio_url)
peRatio = raw_peRatio.json()['peRatio']
fundamentals.append(peRatio)

# 4. EBITDA

ebitda_url = f'https://sandbox.iexapis.com/stable/time-series/fundamentals/{stock}/quarterly?token={iex_api_key}'
raw_ebitda = requests.get(ebitda_url)
ebitda = raw_ebitda.json()[0]['ebitdaReported']
fundamentals.append(ebitda)

# 5. EBIT

ebit_url = f'https://sandbox.iexapis.com/stable/time-series/fundamentals/{stock}/quarterly?token={iex_api_key}'
raw_ebit = requests.get(ebit_url)
ebit = raw_ebit.json()[0]['ebitReported']
fundamentals.append(ebit)

# 6. REVENUE

revenue_url = f'https://sandbox.iexapis.com/stable/time-series/fundamentals/{stock}/quarterly?token={iex_api_key}'
raw_revenue = requests.get(revenue_url)
revenue = raw_revenue.json()[0]['revenue']
fundamentals.append(revenue)

# 7. ENTERPRISE VALUE

entvalue_url = f'https://sandbox.iexapis.com/stable/stock/{stock}/advanced-stats?token={iex_api_key}'
raw_entvalue = requests.get(entvalue_url)
entvalue = raw_entvalue.json()['enterpriseValue']
fundamentals.append(entvalue)

print(cl(f'Extracted {stock} Fundamentals', attrs = ['bold']))

return fundamentals

msft_fundamentals = get_metrics(ticker[0])
amzn_fundamentals = get_metrics(ticker[1])
googl_fundamentals = get_metrics(ticker[2])
fb_fundamentals = get_metrics(ticker[3])
baba_fundamentals = get_metrics(ticker[4])
nvda_fundamentals = get_metrics(ticker[5])
pypl_fundamentals = get_metrics(ticker[6])
intc_fundamentals = get_metrics(ticker[7])
nflx_fundamentals = get_metrics(ticker[8])
aapl_fundamentals = get_metrics(ticker[9])

# FORMATTING THE DATA

raw_data = [msft_fundamentals, amzn_fundamentals, googl_fundamentals, fb_fundamentals, baba_fundamentals,
nvda_fundamentals, pypl_fundamentals, intc_fundamentals, nflx_fundamentals, aapl_fundamentals]

fundamentals = pd.DataFrame(columns = ['price', 'marketcap', 'pe', 'ebitda', 'ebit', 'revenue', 'ev'])
fundamentals.iloc[:,0] = range(0, 10)

for i in range(len(fundamentals)):
fundamentals.iloc[i] = raw_data[i]

fundamentals['symbol'] = ticker
fundamentals = fundamentals.set_index('symbol')
fundamentals

# VALUATION MULTIPLES CALCULATION

valuation_multiples = fundamentals.copy().iloc[:, 2:].drop('ev', axis = 1)
valuation_multiples = valuation_multiples.rename(columns = {'ebitda':'ev/ebitda', 'ebit':'ev/ebit', 'revenue':'ev/revenue'})

valuation_multiples.iloc[:, 1] = fundamentals['ev'] / fundamentals['ebitda']
valuation_multiples.iloc[:, 2] = fundamentals['ev'] / fundamentals['ebit']
valuation_multiples.iloc[:, 3] = fundamentals['ev'] / fundamentals['revenue']

valuation_multiples

# AVERAGE AND DIFFERENCE OF MULTIPLES

index = ['avg', 'diff']
avg_diff = pd.DataFrame(columns = ['pe', 'ev/ebitda', 'ev/ebit', 'ev/revenue'])
avg_diff.iloc[:, 0] = np.arange(0,2)

avg_diff.iloc[0] = valuation_multiples[:9].sum() / 10
avg_diff.iloc[1] = valuation_multiples.iloc[9] / avg_diff.iloc[0]
avg_diff['avg/diff'] = index
avg_diff = avg_diff.set_index('avg/diff')
avg_diff

# CALCULATING THE INTRINSIC VALUE

price_diff = raw_data[9][0] / avg_diff.iloc[1]
intrinsic_price = round((sum(price_diff) / 4), 2)
percentage_difference = round(((raw_data[9][0] / intrinsic_price) * 100), 2)

print(cl(f'The listed price of Apple : {raw_data[9][0]}', attrs = ['bold']))
print(cl(f'The intrinsic value of Apple : {intrinsic_price}', attrs = ['bold']))
if intrinsic_price > raw_data[9][0]:
print(cl(f'The Underlying Value of Apple stock is {percentage_difference}% Higher than the Listed price', attrs = ['bold']))
else:
print(cl(f'The Underlying Value of Apple stock is {percentage_difference}% Lower than the Listed price', attrs = ['bold']))

Источник