Определите и извлеките образец OHL C на графике свечей, используя график или pandas? - PullRequest
1 голос
/ 30 апреля 2020

Я использую API Ameritrade и pandas / plotly для построения графика простой цены акций по минутной шкале. Я хотел бы использовать некоторые свойства созданного графика, чтобы идентифицировать и извлечь конкретный c образец свечи .

Здесь я строю свой фрейм данных и строю его как подсвечник:

frame = pd.DataFrame({'open': pd.json_normalize(df, 'candles').open,
                     'high': pd.json_normalize(df, 'candles').high,
                     'low': pd.json_normalize(df, 'candles').low,
                     'close': pd.json_normalize(df, 'candles').close,
                     'datetime': pd.DatetimeIndex(pd.to_datetime(pd.json_normalize(df, 'candles').datetime, unit='ms')).tz_localize('UTC').tz_convert('US/Eastern')})


fig = go.Figure(data=[go.Candlestick(x=frame['datetime'],
                                    open=frame['open'],
                                    high=frame['high'],
                                    low=frame['low'],
                                    close=frame['close'])])
fig.update_layout(xaxis_rangeslider_visible=False)
fig.show()

График :

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

Красная свеча может быть определена как:

close < open & close < prev.close

Так что в этом случае, У меня нет доступа к prev.close для самой первой минуты торговли, потому что у меня нет данных о предварительных / расширенных часах.

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

Будет ли это легче сделать используя plotly или pandas, и как будет выглядеть простая реализация?

1 Ответ

0 голосов
/ 30 апреля 2020

Не уверен насчет Candlestick, но в pandas вы можете попробовать что-то вроде этого. Примечание: я предполагаю, что данные имеют по 1 строке для каждого рабочего дня уже и отсортированы. Первое, что нужно сделать, это создать столбец с красным с True, где условие для красной свечи, как описано в вашем вопросе, - True :

df['red'] = df['close'].lt(df['open'])&df['close'].lt(df['close'].shift())

Затем вы хотите увидеть, происходит ли это 4 дня подряд, и, предполагая, что данные сортируются по возрастанию (обычно), идея состоит в том, чтобы перевернуть кадр данных с помощью [:: - 1], используйте rolling с окном 4, sum столбец красного цвета, созданный чуть выше, и проверьте, где он равен 4.

df['next_4days_red'] = df[::-1].rolling(4)['red'].sum().eq(4)

, а затем, если вы хотите, чтобы дни были в начале 4 последовательных красные торговые дни, которые вы делаете loc:

df.loc[df['next_4days_red'], 'datetime'].tolist()

Вот небольшой пример с фиктивными переменными:

df = pd.DataFrame({'close': [10,12,11,10,9,8,7,10,9,10], 
                   'datetime':pd.bdate_range('2020-04-01', periods=10 )})\
       .assign(open=lambda x: x['close']+0.5)
df['red'] = df['close'].lt(df['open'])&df['close'].lt(df['close'].shift())
df['next_4days_red'] = df[::-1].rolling(4)['red'].sum().eq(4)

print (df.loc[df['next_4days_red'], 'datetime'].tolist())
[Timestamp('2020-04-03 00:00:00'), Timestamp('2020-04-06 00:00:00')]

Примечание: он фиксирует две последовательные даты, потому что это 5 дней подряд уменьшить, не уверен, что в этом случае вы хотели две даты

...