【问题标题】:Identify and extract OHLC pattern on candlestick chart using plotly or pandas?使用 plotly 或 pandas 在烛台图上识别和提取 OHLC 模式?
【发布时间】:2020-04-29 22:57:31
【问题描述】:

我正在使用 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,因为我没有上市前/延长时间的数据。

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

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

【问题讨论】:

    标签: python-3.x pandas plotly finance candlestick-chart


    【解决方案1】:

    不确定Candlestick,但在熊猫中,你可以尝试这样的事情。 注意:我假设每个工作日的数据已经有 1 行并且已排序。第一件事是创建一个名为 red 的列 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 天,不确定在这种情况下您是否想要两个日期

    【讨论】:

    • 感谢您,并且根据您的假设,数据框在交易日的每一分钟都有一行,因为我需要分析每个 1 分钟的烛台 - 所以在您的示例中,我可以转换天数到分钟,除了(我认为)我想在前四个连续红色蜡烛出现的一天中隔离时间(数据框中的行)。我正在使用情节图来直观地检查结果是否正确并且由于某种原因它没有排队
    • @orion si 是的,如果您的数据每分钟有一行,并且您想要连续 4 分钟为红色,那应该是相同的想法!并且您只希望每天第一次(如果有的话)连续减少 4 分钟?你是什​​么意思它不对齐?
    • @orion 经过一番测试,似乎只有满足close<open 条件时,一根烛台是红色的,而另一个close < prev.close 不是强制性的?
    • @Ben-t - 在 cmets 部分很难显示让我试试!这是特定日期的可视化表示 (imgur.com/xPE51Pj),这是当天的前四根红色蜡烛,它们出现在 11:41-44,我已经导出了数据框 (dropbox.com/s/3m0vrc3kh3638cy/data.csv?dl=0),可以看到df.loc[df['next_4days_red'], 'datetime'].tolist()) 的结果显示了 11:41 的第一个位置,但不是之后的 3 个位置。这个结果与我在不同日子使用的数据集不同,其中数据框中的所有四个位置都出现了。
    • 仅供参考,这里是从框架导出的另一个数据集的链接,dropbox.com/s/888rn0u6l89o5xr/data2.csv?dl=0,这是视觉效果,imgur.com/AJOhh0d,前四个红色蜡烛出现在 9:42-45
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多