You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Plotly绘制OHLC图时移除rangebreaks异常问题

解决高频OHLC图rangebreaks失效问题

问题核心原因

你手动生成的dt_breaks存在时区不匹配问题:yfinance返回的高频数据(如30分钟级)索引是带时区信息的datetime对象,而pd.date_range生成的是无时区的naive datetime,两者无法正确匹配,导致Plotly无法识别需要隐藏的间隔,反而错误截断了数据显示。另外手动生成所有缺失时间的方式效率极低,容易触发渲染异常。

解决建议

直接使用Plotly内置的rangebreaks规则处理非交易时段,无需手动生成缺失时间列表:

  • 移除手动生成dt_breaks的代码,改用Plotly自带规则过滤非交易时间和周末
  • 根据标的所属市场设置对应的交易时间范围

修改后的完整代码

import warnings
import pandas as pd
from datetime import datetime
from dateutil.relativedelta import relativedelta
import plotly.graph_objects as go
import yfinance as yf

warnings.filterwarnings('ignore')

t_var = ['META']
end = datetime.now()
start = end - relativedelta(days=59)
# 下载高频数据,保留yfinance默认的时区信息
df_y = yf.download(t_var, start=start.strftime('%Y-%m-%d'), end=end.strftime('%Y-%m-%d'), interval="30m")

fig = go.Figure(data=[go.Ohlc(
    x=df_y.index,
    open=df_y['Open'],
    high=df_y['High'],
    low=df_y['Low'],
    close=df_y['Close'],
    name='stock',
    decreasing_line_color='#21201f',
    increasing_line_color='#21201f'
)])

# 用Plotly内置规则自动过滤非交易时段
fig.update_xaxes(
    showgrid=False,
    zeroline=False,
    showticklabels=True,
    showspikes=True,
    spikemode='across',
    spikesnap='cursor',
    showline=False,
    rangebreaks=[
        dict(bounds=["sat", "mon"]),  # 隐藏周末休市间隔
        dict(bounds=[16, 9.5], pattern="hour"),  # 隐藏美股非交易时间(9:30开盘,16:00收盘)
        # 若有临时休市日,可手动添加:dict(values=['2024-01-01'])
    ],
    rangeslider_visible=False
)

fig.show()

额外说明

  • 如果标的是A股,交易时间为9:30-15:00,需将时间范围改为dict(bounds=[15, 9.5], pattern="hour")
  • 临时休市日可通过rangebreaks的values参数手动添加,日期格式需与df_y.index的时区保持一致

内容的提问来源于stack exchange,提问作者Almodius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 07:52:19