首页 > 解决方案 > 使用 plotly 或 pandas 在烛台图上识别和提取 OHLC 模式?

问题描述

我正在使用 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()

情节

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

红色蜡烛可以定义为:

close < open & close < prev.close

所以在这种情况下,我无法在prev.close交易的第一分钟访问,因为我没有上市前/延长时间的数据。

我想知道是否甚至可以访问 plotly 图形数据,因为如果是这样,我可以提取第一组四个连续red蜡烛及其数据 - 但如果没有,我将定义我的模式并使用 pandas 提取它但还没有到那一步。

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

标签: python-3.xpandasplotlyfinancecandlestick-chart

解决方案


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

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

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


推荐阅读