我想绘制一个ohlc图,在不同的时间间隔内删除没有数据的间隙(范围中断)。程序工作良好时,使用每日间隔,但我无法删除的差距时,使用其他间隔(1小时,30分钟),过程是或多或少相同,但只显示第一天。
首先,我认为这是一个日期时间格式的问题,但删除“rangebreaks”允许绘制所有系列。
有什么建议吗?
先谢了
import warnings
import pandas as pd
from datetime import datetime
from dateutil.relativedelta import relativedelta
import numpy as np
import plotly.io as pio
from plotly.subplots import make_subplots
import plotly
import plotly.graph_objects as go
import yfinance as yf
#pio.renderers.default = "browser"
warnings.filterwarnings('ignore')
t_var = ['META']
end = datetime.now()
start = end - relativedelta(days=59)
df_y = yf.download(t_var, start=start.strftime('%Y-%m-%d'), end=end.strftime('%Y-%m-%d'), interval= "30m")
d = df_y.index[0]
b = df_y.index[-1]
dt_all = pd.date_range(start=d,end=b,freq='30min')
dt_breaks = [d for d in dt_all if not d in df_y.index]
fig = make_subplots(rows=1, cols=1)
fig.add_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', row=1, col=1)
fig.update_xaxes(showgrid=False, zeroline=False, showticklabels=True, showspikes=True, spikemode='across', spikesnap='cursor', showline=False,rangebreaks=[dict(values=dt_breaks)], rangeslider_visible=False)
#fig.update_xaxes(showgrid=False, zeroline=False, showticklabels=True, showspikes=True, spikemode='across', spikesnap='cursor', showline=False,rangeslider_visible=False)
fig.show()
字符串
2条答案
按热度按时间bqjvbblv1#
无法由rangebreak功能单独处理的市场假期可以通过将目标期间添加到rangebreak来处理,但规范不起作用。
rangebreak=[dict(bounds=['sat','mon']),dict(bounds=[16,9], pattern='hour'),dict(value=['2023-06-17','2023-06-19'])]
另一种方法是将当前索引添加到从开始日期到结束日期的30分钟间隔的索引中,并仅提取不重叠的索引。然后将该提取提供给rangebreak。此时,rangebreak的dvalue的基础值为86400000msec(1000msec60sec60min 24h),因此我们将其设置为1800000(1000msec60sec*30min)。字符串
的数据
2izufjch2#
问题在于如何计算dt_breaks。当您使用每日时间间隔时,它工作得很好,因为在每日时间框架中没有丢失的数据点。但是,当使用较小的间隔(如30分钟)时,数据中可能存在间隙(丢失数据),并且计算dt_breaks的方式会导致问题。
要解决这个问题,您需要修改dt_breaks的计算,以找到缺失的数据点并创建适当的范围间隔。下面是代码的更新版本
字符串
修改后的代码根据连续数据点之间的时间差计算range_breaks。如果时间差大于30分钟,则表示缺少数据点,并且在先前数据点和当前数据点之间创建范围中断。这样,OHLC图将不会显示由缺失数据引起的差距。
请尝试此更新的代码,它应该以30分钟间隔或您选择的任何其他间隔显示无间隙的OHLC图。