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

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

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

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

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

  • Объединение похожих компаний. Это первая и основная задача, которую мы должны решить, следуя подходу 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, который представляет собой не что иное, как ключ API песочницы, предоставленный нам IEX Cloud. Для большей ясности, пока мы создаем учетную запись разработчика IEX Cloud, команда предоставит нам два типа ключей API: один - это ключ Cloud API, который помогает нам взаимодействовать с облачной средой, а другой - ключ API песочницы. это помогает нам извлекать данные из среды песочницы.

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

После сохранения ключа API мы создаем еще одну переменную с именем «основы», в которой хранится пустой список, куда будут добавлены значения каждой финансовой метрики. Затем идет процесс получения каждой финансовой метрики с использованием соответствующей конечной точки API, предоставляемой IEX Cloud. Я не буду здесь объяснять код для извлечения каждого из них, а только первый, который извлекает метрику курса акций, поскольку структура кода аналогична. В коде для извлечения метрики курса акций мы сначала сохраняем URL-адрес API в переменной «price_url». Используя функцию get_function, предоставленную в запросах, мы вызываем API, а затем сохраняем данные в переменной price в формате 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 / выручку с помощью фрейма данных, который мы очистили и отформатировали ранее. Эти оценочные коэффициенты затем будут использоваться в качестве основных компонентов на дальнейших этапах.

Реализация 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 и выручку соответственно на значение Enterprise и сохраняем их в соответствующем столбце во фрейме данных. Окончательный результат можно увидеть из вышеприведенных выходных данных, где у нас есть все четыре желаемых мультипликатора стоимости десяти технологических акций.

Шаг 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 и сохраняем ее в поле «процент_различия».

Из выходных данных видно, что текущая или последняя торгуемая цена акций 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']))