Раскрытие лидерства на рынке: точное определение выигрышных акций

Введение

В мире финансов определение наиболее эффективных акций имеет решающее значение для успешного инвестирования. Среди различных показателей рейтинг относительной силы (RS) выделяется как мощный инструмент, позволяющий отличить лидеров рынка от отстающих. В этой статье мы рассмотрим, как использовать Python для расчета рейтинга RS, аналогичного собственной метрике Investor’s Business Daily. Следуя этому руководству, вы получите знания и навыки для анализа динамики акций и принятия обоснованных инвестиционных решений. Итак, давайте погрузимся в увлекательный мир Python для финансов и раскроем секреты рейтинга RS!

Раздел 1: Понимание рейтинга RS

Прежде чем мы углубимся в код Python, давайте сначала поймем суть рейтинга RS и почему это жизненно важный показатель для инвесторов. Рейтинг RS оценивает динамику цены акции за последние 52 недели и сравнивает ее с динамикой других акций. Он дает четкое указание на то, является ли акция лидером рынка или отстающим с точки зрения относительной динамики цены. Рейтинг RS варьируется от 1 (худший) до 99 (лучший). Рейтинг 99 указывает на то, что акции опережают 99% всех других акций на основе их относительной динамики цен акций за последние 52 недели. Как инвесторы, мы ищем акции с рейтингом RS 80 или выше, поскольку они часто демонстрируют большой потенциал для запуска значительных ценовых скачков.

Раздел 2: Настройка среды

Чтобы начать наше путешествие, нам нужно настроить нашу среду Python, установив необходимые пакеты и импортировав необходимые модули. Мы будем использовать популярные библиотеки, такие как yfinance, pandas, pandas-datareader и yahoo-fin, для сбора и анализа финансовых данных. Эти библиотеки предоставляют мощные функции для извлечения исторических данных о запасах, расчета процентных изменений и выполнения различных финансовых расчетов. Давайте установим необходимые пакеты и импортируем модули, чтобы начать.

# Imports
import yfinance as yf
import pandas as pd
from pandas_datareader import data as pdr
from yahoo_fin import stock_info as si
import datetime
import time

# Override yfinance API
yf.pdr_override()

Раздел 3: Получение данных о запасах

Чтобы рассчитать рейтинг RS, нам нужен доступ к историческим данным о ценах как для отдельных акций, так и для индекса S&P 500. Мы будем работать с акциями S&P 500, поскольку они представляют широкий спектр компаний и обычно используются в качестве эталона для всего рынка. Давайте получим тикеры для всех акций S&P 500 и отформатируем их для совместимости с Yahoo Finance.

# Get tickers for all S&P 500 stocks and replace "." with "-" for compatibility with Yahoo Finance
sp500_tickers = si.tickers_sp500()
sp500_tickers = [ticker.replace(".", "-") for ticker in sp500_tickers]

Затем мы определяем индекс S&P 500 как ^GSPC и указываем диапазон дат, для которого мы хотим собрать данные об акциях. В этом примере мы рассматриваем прошлый год в качестве временных рамок.

# Define S&P 500 index
sp500_index = '^GSPC'

# Define date range for stock data
start_date = datetime.datetime.now() - datetime.timedelta(days=365)
end_date = datetime.date.today()

Раздел 4: Расчет относительной доходности

Теперь начинается захватывающая часть: расчет относительной доходности каждой акции по сравнению с индексом S&P 500. Начнем с создания пустого списка relative_returns для хранения относительной доходности каждой акции.

# Create empty list to store relative returns for each stock
relative_returns = []

Мы получаем исторические данные о ценах для индекса S&P 500, используя функцию pdr.get_data_yahoo() из библиотеки pandas-datareader. Затем мы рассчитываем дневное процентное изменение индекса S&P 500 и кумулятивно умножаем эти изменения, чтобы получить общее процентное изменение.

# Retrieve historical price data for the S&P 500 index
sp500_df = pdr.get_data_yahoo(sp500_index, start_date, end_date)
sp500_df['Percent Change'] = sp500_df['Adj Close'].pct_change()
sp500_returns = sp500_df['Percent Change'].cumprod()
sp500_return = sp500_returns.iloc[-1]

Раздел 5: Итерация по акциям

Чтобы рассчитать рейтинг RS для каждой акции, мы перебираем акции S&P 500 и выполняем следующие шаги:

  • Загрузите исторические данные для каждой акции с помощью pdr.get_data_yahoo() и сохраните их в виде файла CSV для более быстрой обработки.
  • Рассчитайте столбец процентного изменения для исторических данных каждой акции.
  • Вычислите относительную доходность, которая представляет собой средневзвешенное значение последнего квартала и предыдущих 63 торговых дней.
  • Сохраните относительную доходность в списке relative_returns.
# Iterate over all S&P 500 stocks to calculate their relative returns
for ticker in sp500_tickers:
    # Download historical data as CSV for each stock to speed up the process
    stock_df = pdr.get_data_yahoo(ticker, start_date, end_date)
    stock_df.to_csv(f'{ticker}.csv')
    
    # Calculate percent change column
    stock_df['Percent Change'] = stock_df['Adj Close'].pct_change()
    
    # Calculate the relative return with double weight for the most recent quarter
    stock_returns = stock_df['Percent Change'].cumprod()
    stock_return = (stock_returns.iloc[-1] * 2 + stock_returns.iloc[-63]) / 3 # Double weight for the most recent quarter
    relative_return = round(stock_return / sp500_return, 2)
    relative_returns.append(relative_return)
    
    # Print relative return for each stock
    print(f'Ticker: {ticker}; Relative Return against S&P 500: {relative_return}\n')
    
    # Pause for 1 second to avoid overloading the server with requests
    time.sleep(1)

Раздел 6: Расчет рейтинга RS

Теперь, когда мы собрали относительную доходность для всех акций S&P 500, мы можем создать фрейм данных для хранения результатов и расчета соответствующих рейтингов RS. Мы используем функцию pd.DataFrame() из библиотеки pandas и объединяем тикеры и относительную доходность в столбцы.

# Create dataframe with relative returns and corresponding RS ratings
rs_df = pd.DataFrame(list(zip(sp500_tickers, relative_returns)), columns=['Ticker', 'Relative Return'])

Для расчета рейтинга RS мы используем функции rank() и pct_change(), предоставляемые pandas. Эти функции ранжируют относительную доходность в процентах, предоставляя стандартизированный рейтинг RS по шкале от 1 до 100.

rs_df['RS_Rating'] = rs_df
['Relative Return'].rank(pct=True) * 100

Раздел 7: Раскрытие возможностей рейтингов RS

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

# Print RS Ratings for all stocks
print(rs_df)

Заключение

В этой статье мы погрузились в увлекательный мир Python для финансов и узнали, как рассчитать рейтинг относительной силы (RS) с помощью Python. Используя мощные библиотеки, такие как pandas, pandas-datareader и yahoo-fin, мы смогли получить исторические данные о ценах, рассчитать относительную доходность и создать рейтинги RS для всестороннего анализа динамики акций. Вооружившись этими знаниями, теперь вы можете определять наиболее прибыльные акции и принимать обоснованные инвестиционные решения. Так что вперед, раскрывайте секреты рынка и отправляйтесь в успешное путешествие в сфере финансов!

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

Вот полный код программы IBD RS Calculation Python. Не стесняйтесь проверить это в своей собственной среде кодирования!

# Imports
import yfinance as yf
import pandas as pd
from pandas_datareader import data as pdr
from yahoo_fin import stock_info as si
import datetime
import time

# Override yfinance API
yf.pdr_override()

# Get tickers for all S&P 500 stocks and replace "." with "-" for compatibility with Yahoo Finance
sp500_tickers = si.tickers_sp500()
sp500_tickers = [ticker.replace(".", "-") for ticker in sp500_tickers]

# Define S&P 500 index
sp500_index = '^GSPC'

# Define date range for stock data
start_date = datetime.datetime.now() - datetime.timedelta(days=365)
end_date = datetime.date.today()

# Create empty list to store relative returns for each stock
relative_returns = []

# Retrieve historical price data for the S&P 500 index
sp500_df = pdr.get_data_yahoo(sp500_index, start_date, end_date)
sp500_df['Percent Change'] = sp500_df['Adj Close'].pct_change()
sp500_returns = sp500_df['Percent Change'].cumprod()
sp500_return = sp500_returns.iloc[-1]

# Iterate over all S&P 500 stocks to calculate their relative returns relative to the S&P 500
for ticker in sp500_tickers:
    # Download historical data as CSV for each stock to speed up the process
    stock_df = pdr.get_data_yahoo(ticker, start_date, end_date)
    stock_df.to_csv(f'{ticker}.csv')

    # Calculate percent change column
    stock_df['Percent Change'] = stock_df['Adj Close'].pct_change()

    # Calculate the relative return with double weight for the most recent quarter
    stock_returns = stock_df['Percent Change'].cumprod()
    stock_return = (stock_returns.iloc[-1] * 2 + stock_returns.iloc[-63]) / 3  # Double weight for the most recent quarter

    relative_return = round(stock_return / sp500_return, 2)
    relative_returns.append(relative_return)

    # Print relative return for each stock
    print(f'Ticker: {ticker}; Relative Return against S&P 500: {relative_return}\n')

    # Pause for 1 second to avoid overloading the server with requests
    time.sleep(1)

# Create dataframe with relative returns and corresponding Relative Strength (RS) rating
rs_df = pd.DataFrame(list(zip(sp500_tickers, relative_returns)), columns=['Ticker', 'Relative Return'])
rs_df['RS_Rating'] = rs_df.relative_return.rank(pct=True) * 100

# Print RS ratings for all stocks
print(rs_df)

Удачных инвестиций!

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

Если вам понравилась эта статья, ознакомьтесь с другими моими статьями о Python для финансов ниже!







Подпишитесь на DDIntel Здесь.

Посетите наш сайт здесь: https://www.datadriveninvestor.com

Присоединяйтесь к нашей сети здесь: https://datadriveninvestor.com/collaborate