#python #pandas #numpy #finance #technical-indicator
#python #панды #numpy #финансы #технический-индикатор
Вопрос:
Как определено здесь, индикатор Hindenburg omen является:
Ежедневное количество новых 52-недельных максимумов и 52-недельных минимумов в индексе фондового рынка превышает пороговое значение (обычно 2,2%).
Для меня это означает, что мы ежедневно выполняем прокрутку и оглядываемся назад на 52 недели или 252 рабочих / торговых дня, затем подсчитываем количество максимумов (или минимумов) и, наконец, вычисляем возврат этого или pct_change, который представляет собой соотношение новых максимумов (или минимумов), которые они хотят отслеживать, например, выше 2,2%
import pandas as pd
import numpy as np
import yfinance as yf
# download the Samp;P500
df = yf.download('^GSPC')
# compute the "highs" and "lows"
df['Highs'] = df['Close'].rolling(252).apply(lambda x: x.cummax().diff().
apply(lambda x: np.where(x > 0, 1, 0)).sum()).pct_change()
df['Lows'] = df['Close'].rolling(252).apply(lambda x: x.cummin().diff().
apply(lambda x: np.where(x < 0, 1, 0)).sum()).pct_change()
Мы понимали это одинаково? есть ли лучший способ сделать это?
Комментарии:
1. Я полагаю, это означает, что вам придется загружать 2 года ежедневных закрытий. Затем для каждого ежедневного закрытия в прошлом году проверьте, закрылся ли показатель выше, чем любой другой за год до дня, в который они были включены. И которые были ниже. Затем посчитайте, сколько максимумов и сколько минимумов.
2. Извините, я понял в своем первоначальном ответе, что я не объяснил, почему мой результат отличался от вашего — я добавил несколько комментариев внизу своего ответа.
Ответ №1:
Интересный вопрос! Могу ли я предложить следующий код — он выполняется намного быстрее, чем apply
решение, потому что он векторизован, а также более четко описывает шаги, чтобы вы могли просмотреть промежуточные результаты.
Я получил результат, отличный от вашего кода — вы можете сравнить, также отобразив свой результат на временных рядах внизу.
import pandas as pd
import numpy as np
import yfinance as yf
# download the Samp;P500
df = yf.download('^GSPC')
# Constants
n_trading_day_window = 252
# Simplify the input dataframe to only the relevant column
df_hin_omen = df[['Close']]
# Calculate rolling highs and lows
df_hin_omen.insert(1, 'rolling_high', df_hin_omen['Close'].rolling(n_trading_day_window).max())
df_hin_omen.insert(2, 'rolling_low', df_hin_omen['Close'].rolling(n_trading_day_window).min())
# High and low are simply when the given row matches the 252 day high or low
df_hin_omen.insert(3, 'is_high', df_hin_omen.Close == df_hin_omen.rolling_high)
df_hin_omen.insert(4, 'is_low', df_hin_omen.Close == df_hin_omen.rolling_low)
# Calculate rolling percentages
df_hin_omen.insert(5, 'percent_highs', df_hin_omen.is_high.rolling(n_trading_day_window).sum() / n_trading_day_window)
df_hin_omen.insert(6, 'percent_lows', df_hin_omen.is_low.rolling(n_trading_day_window).sum() / n_trading_day_window)
После того, как вы запустите это, вы можете проверить результаты следующим образом:
import matplotlib, matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(16, 6))
df_hin_omen.resample('w').mean().percent_highs.plot(ax=ax)
df_hin_omen.resample('w').mean().percent_lows.plot(ax=ax)
Из определения Hindenburg Omen: «Знак Гинденбурга ищет статистическое отклонение от предпосылки, что при нормальных условиях некоторые акции либо достигают новых 52-недельных максимумов, либо новых 52-недельных минимумов. Было бы ненормально, если бы оба происходили одновременно. »
Итак, глядя на наш график, я понимаю, что фондовый рынок в настоящее время закрывается на 52-недельных максимумах, но не показывает 52-недельных минимумов. Пожалуйста, также обратите внимание, что в цитируемой статье говорится, что «Сообщалось, что он правильно предсказал значительное снижение фондового рынка только в 25% случаев». так что я не уверен, что мы можем слишком много в этом разбираться…
Редактировать
Я просмотрел ваш код и не думаю, что использование pct_change
функции является правильным — это вычислит изменение скользящего дифференциала, поэтому изменение, например, с 0,10% до 0,11% фактически приравнивается к изменению на 10%. Вместо этого вам нужна скользящая сумма за прошедший год и разделите ее на количество дней в году, согласно моему приведенному выше коду.
Комментарии:
1. большое спасибо! теперь все выглядит очень ясно. Я использовал
pct_change
из-за ключевого слова new ,The daily number of new 52-week highs and 52-week lows
. Если мы вычисляем возвраты, это дает нам новое.