使用 plotly 或 pandas 在烛台图表上识别和提取 OHLC 模式?

Identify and extract OHLC pattern on candlestick chart using plotly or pandas?

我正在使用 Ameritrade API 和 pandas/plotly 以分钟为单位绘制简单的股票价格图表,我想使用生成的图表的一些属性来识别和提取特定的烛条形态。

在这里我构建了我的数据框并将其绘制为烛台:

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()

The plot:

我正在寻找的形态就是每天连续四根红色蜡烛的交易中的第一组。

红色蜡烛可以定义为:

close < open & close < prev.close

所以在这种情况下,我无法在交易的第一分钟访问 prev.close,因为我没有 pre-market/extended 小时的数据。

我想知道是否有可能访问绘图数据,因为如果是这样,我可以只提取第一组四个连续 red 蜡烛及其数据 - 但如果不能,我只会定义我的模式并使用 pandas 提取它,但还没有那么远。

使用 plotly 或 pandas 会更容易吗?简单的实现会是什么样子?

不确定 Candlestick,但在 pandas 中,您可以尝试这样的操作。 注意:我假设每个工作日的数据已经有 1 行并且已排序。 首先是创建一个名为 red 的列,其中包含 True 中描述的红色蜡烛的条件你的问题是真的:

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

然后您想看看它是否连续 4 天发生并假设数据按升序排序(通常),想法是使用 [::-1] 反转数据帧,使用 rolling window 为 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 天的减少,不确定在这种情况下您是否想要这两个日期