Простой урок по инвестированию

Анализируйте акции с помощью ключевых индикаторов рынка (KMI) за 10 минут

Простые коды Python для анализа рыночных цен

Постановка задачи

На что мы смотрим, когда смотрим на акции?

Какие основные инструменты позволяют быстро начать работу с акциями?

Как мы узнаем, когда нам следует входить и выходить с фондового рынка?

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

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

  1. Какие акции покупать? (Стоимость)
  2. Когда покупать или продавать акции? (Импульс)

Я ответил на первый вопрос в разделе Ценностное инвестирование. Поэтому в этой публикации я сосредоточусь на определении импульса в ключевых индикаторах рынка (KMI).

Цель этой публикации - помочь вам понять один из способов анализа динамики акций с помощью KMI с использованием быстрого и грязного кода Python. Просто потратьте 10 минут, чтобы прочитать эту статью или, что еще лучше, внести свой вклад. Тогда вы сможете быстро запрограммировать свой первый финансовый анализ с помощью KMI.

За 3 года инвестирования я получил 62% доходности портфеля акций. Этот метод прост и предполагает душевное спокойствие, которое часто ускользает от рискованных инвесторов.

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





С этим, давайте начнем!

инструкции

Блокнот Colab

В этом руководстве я предоставляю блокнот Google Colab (Colaboratory), чтобы предоставить репозиторий для анализа данных, чтобы вы могли поиграть с ним самостоятельно. Он объединяет код, вывод и описательный текст в один документ - Дальнейшее руководство.



Вы можете просто щелкнуть «Runtime› Run All »в Google Colab, чтобы запустить все коды и сгенерировать графики. Вы также можете изменить репозиторий файлов, указав новую ссылку Github в link variable.

Наконец, вы можете сохранить все созданные вами диаграммы, раскомментировав следующую строку. Определите переменную «title», чтобы назвать заголовок изображения.

plt.savefig(f’{title}.png’)

Импортировать данные

Я позаимствовал данные CSV цен на акции Google Раджа Шаха, которые публично размещены на Github. Код и графики представлены ниже.

import pandas as pd
import requests
import numpy as np
import matplotlib.pyplot as plt
import datetime as dt
# Feel free to change the link to any you want or maybe web scrape the value.https://towardsdatascience.com/value-investing-dashboard-with-python-beautiful-soup-and-dash-python-43002
link = ‘https://raw.githubusercontent.com/raj-shah14/Predicting-Google-Stock-Prices/master/Google_Stock_Price_Train.csv'
r = requests.get(link, headers = {‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'})
pandas_data = pd.read_csv(link)
print(pandas_data)

Очистка данных

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

# Forward/backward fill the missing dates
def ffill_bfill(prices):
   prices_temp = prices.copy()
   prices_temp = prices_temp.fillna(method='ffill')
   prices_temp = prices_temp.fillna(method='bfill')
   return prices_temp

Простая скользящая средняя (SMA)

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

Почему это работает?

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

Программно мы назначаем формулу вычисления следующим образом:

Prices (normalized).rolling(window).mean()
With signals:
* Overbought signals: Price/SMA Ratio >1.05
* Oversold signals: Price/SMA Ratio< 0.95(stockscharts.com):

Мы можем извлечь SMA, используя следующие коды

def get_sma (prices,window):
   prices_temp = prices.copy()
   sma = prices_temp.rolling(window=window).mean()
   sma.columns = [‘sma’]
   return sma
def get_psma(prices,sma):
   prices_temp = prices.copy()
   psma = prices_temp/sma
   return psma
price_df['sma'] = get_sma(price_df['Price'],10)
price_df['psma'] = get_psma(price_df['Price'],price_df['sma'])

Процент полос Боллинджера (BB / BBP)

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

Цены (нормализованные) .rolling (window = 20) .std ()

В этом случае мы используем процент полос Боллинджера (BBP), потому что сигнал для покупки и действий более четкий. Это количественно определяет цену ценной бумаги пропорционально тому, насколько она близка к верхнему и нижнему BB. Согласно stockscharts.com, это основные уровни отношений:

With signals:
* BBP = (Price — Lower bands) / (Upper Bands — Lower Bands)
* Overbought scans → BBP >1
* Oversold scans → BBP <0

Почему это работает?

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

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

def get_bollinger_bands(prices, window, sma):
   prices_temp = prices.copy()
   std = prices_temp.rolling(window=window, min_periods=window).std()
   std.columns=[‘sma’]
   bb = pd.DataFrame(index=prices.index,columns = [‘Lower’,’Upper’])
   bb[‘Upper’] = sma + std * 2
   bb[‘Lower’] = sma — std * 2
   bb[‘Price’] = prices_temp
   return bb
def get_bbp(bb):
   bbp = (bb[‘Price’] — bb[‘Lower’])/(bb[‘Upper’] — bb[‘Lower’])
   bbp_df = bbp.to_frame()
   bbp_df.columns=[‘bbp’]
   return bbp_df

Индекс относительной силы (индикатор RSI Momentum)

RSI - это индикатор импульса, который определяет величину изменения цены, чтобы сигнализировать о перекупленности и перепроданности. RSI может отображаться как осциллятор с показаниями от 0 до 100 и может быть установлен со стандартными 14 периодами дней / недель.

Формула включает вычисление импульса через разницу в цене акций за период окна с ранней ценой в качестве знаменателя.

RSI = 100–100/(1+Average gain/average loss)
Signals:
* Overbought signals = RSI > 70
* Oversold Signals = RSI <=0

Почему это работает?

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

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

def get_rsi(prices, sd, periods= 14):
   prices_temp = prices.copy()
   prices_temp[‘up’] = 0
   prices_temp[‘down’] = 0
   prices_temp[‘rsi’] = 0
   for index,row in prices_temp.iterrows():
      current_datetime = index
      prev_day = current_datetime-dt.timedelta(days=1)
      try:
         if prev_day >= sd:
            prev_price = prices_temp.loc[prev_day,’Price’]
         if prev_price < row[‘Price’]:
            prices_temp.loc[index,’up’] = row[‘Price’] — prev_price
         elif prev_price > row[‘Price’]:
            prices_temp.loc[index,’down’] = prev_price — row[‘Price’]
      except:
         continue
      up_ewm = prices_temp[‘up’].ewm(span=periods).mean()
      down_ewm = prices_temp[‘down’].ewm(span=periods).mean()
      prices_temp[‘rsi’] = round(up_ewm/(up_ewm+down_ewm) * 100,0)
      added_date = sd + dt.timedelta(days=(periods-1))
      prices_temp.loc[:added_date,’rsi’] = np.nan
   return prices_temp[[‘rsi’]]
price_df['rsi'] = get_rsi(price_df,dt.datetime(2008,1,28))

MACD

Подобно RSI, MACD также использует индикаторы импульса, которые отображают отношения между двумя скользящими средними. Формула вычитает 26 периодов из 12 периодов экспоненциальных скользящих средних (EMA). Помимо формулы MACD, мы также определяем сигнальную линию, которая рассчитывается в пределах 9-дневной EMA. Мы будем использовать действия ПОКУПКИ, если MACD пересекает сигнальную линию, и ПРОДАВАТЬ, когда MACD пересекает ниже своей сигнальной линии.

# From Investopedia
MACD = 12 Period EMA — 26 Period EMA 

Почему это работает?

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

def get_macd(prices):
   exp_1 = prices.ewm(span=12,adjust=False).mean()
   exp_2 = prices.ewm(span=26,adjust=False).mean()
   macd_list = exp_1 — exp_2
   signal_macd_list = macd_list.ewm(span=9, adjust=False).mean()
   macd_df = pd.concat([macd_list,signal_macd_list],axis=1)
   macd_df.columns = [‘macd’,’signal’]
   return macd_df

Балансовый объем (OBV)

OBV - это сигнал на основе объема, который использует объемный поток для прогнозирования изменений цен акций с использованием данных объема. Чем выше OBV, тем выше движутся цены. наоборот. Это сигнализирует об огромном спросе на определенные акции.

Signal:
* When the closing price today is higher, then current OBV = previous OBV + today’s volume.
* When closing price today is lower, then current OBV = previous OBV — today’s volume.
* When today’s closing price = yesterday’s closing price, current OBV = previous OBV

Почему это работает?

OBV влияет на настроения толпы, что помогает прогнозировать бычий или медвежий исход. Он сравнивает сигналы, которые определяют гистограммы объемов внизу ценовых графиков. Это помогает аналитикам отслеживать инвесторов и взаимосвязь между объемом и ценой на последовательной временной шкале. В идеале его можно сочетать с другими индикаторами, такими как (SMA, BBP и RSI), чтобы отслеживать изменения цен и определять тенденции движения цен на акции.

def get_obv(prices,sd,volume):
   price_temp = prices.copy()
   volume_temp = volume.copy()
   price_temp.columns = [‘Price’]
   volume_temp.columns = [‘Volume’]
   price_temp[‘Volume’] = volume_temp[‘Volume’]
   price_temp[‘obv’] = 0
   for index, row in price_temp.iterrows():
      try:
         current_datetime = index
         prev_day = current_datetime-dt.timedelta(days=1)
         if prev_day >= sd:
            prev_price = price_temp.loc[prev_day,’Price’]
            prev_obv = price_temp.loc[prev_day,’obv’]
         if prev_price < row[‘Price’]:
            price_temp.loc[index,’obv’] = prev_obv + row[‘Volume’]
         elif prev_price > row[‘Price’]:
            price_temp.loc[index,’obv’] = prev_obv — row[‘Volume’]else:
            price_temp.loc[index,’obv’] = prev_obv
       except:
         continue
   return price_temp[[‘obv’]]
price_df['obv'] = get_obv(price_df[['Price']],dt.datetime(2008,1,28),volume_df)

После этого я надеюсь, что вы сможете начать искать эти сигналы и покупать свои акции.

Удачного кодирования и тестирования :)

об авторе

Винсент борется со злоупотреблениями в Интернете с помощью ML @ Google. Винсент использует передовую аналитику данных, машинное обучение и разработку программного обеспечения для защиты пользователей Chrome и Gmail.

Помимо работы в Google, Винсент также является выпускником магистратуры Технологического университета Джорджии, триатлонистом и ведущим автором журнала Towards Data Science Medium, который направляет начинающих практиков машинного обучения и данных с более чем 1 млн зрителей по всему миру.

Наконец, свяжитесь с Винсентом через LinkedIn, Medium или Youtube Channel.

Соли део глория

использованная литература