Python:绘制带有自动 Y 缩放的烛台
Python: Plot candlesticks with automatic Y zoom
我正在寻找一个 Python 绘图库,它允许我通过鼠标滚轮滚动(或类似方式)使用 X 缩放和缩放时自动缩放的 Y 轴绘制烛台(最好是 OHLC 柱变体)。
作为我正在寻找的示例,tradingview.com 完美地做到了这一点。参见 https://uk.tradingview.com/chart/?symbol=NASDAQ:NDX。单击左上角附近的烛台图标并选择 'Bars'。
可以看到 OHLC 柱
Plotly 几乎可以做到这一点。 plotly.graph_objs 中的 Ohlc class 提供 OHLC 条,默认范围滑块是 X 缩放的一个很好的功能(也可以轻松启用鼠标滚轮滚动)。但是,据我所知,Python 中不提供自动 Y 缩放(Y-axis autoscaling with x-range sliders in plotly), thus zooming in on a section of data makes it appear flat. Example code - https://plot.ly/python/ohlc-charts/
我熟悉的另一个选项是 PyQtGraph,它具有很好的缩放功能,但不支持烛台图。使用它需要编写我自己的烛台对象。
有很多我不知道的 Python 绘图库。有什么开箱即用的支持吗?任何人都可以提供示例代码来干净地执行此操作吗?
我找到的最佳解决方案是使用 Bokeh。这里有一个相关的问题 - Bokeh, zoom only on single axis, adjust another axis accordingly. One answer links a gist 给出了一个使用自动 Y 缩放设置烛台的示例。
不幸的是,这远非 'out of the box' 解决方案,因为它涉及编写自定义 JavaScript 回调。但是,解决方案仍然相当简单。我无法将要点上的代码获取到 运行,主要是由于 Pandas DataReader 的问题。这是代码的更新版本,它使用 Bokeh 提供的示例数据(根据 Bokeh Candlesicks example),增加了与 TradingView 的更多相似之处并解决了我发现的其他一些问题:
import pandas as pd
from bokeh.io import output_file, show
from bokeh.plotting import figure
from bokeh.models import CustomJS, ColumnDataSource
from bokeh.sampledata.stocks import MSFT
def candlestick_plot(df):
fig = figure(sizing_mode='stretch_both',
tools="xpan,xwheel_zoom,undo,redo,reset,crosshair,save",
active_drag='xpan',
active_scroll='xwheel_zoom',
x_axis_type='datetime')
inc = df.close > df.open
dec = ~inc
fig.segment(df.date[inc], df.high[inc], df.date[inc], df.low[inc], color="green")
fig.segment(df.date[dec], df.high[dec], df.date[dec], df.low[dec], color="red")
width_ms = 12*60*60*1000 # half day in ms
fig.vbar(df.date[inc], width_ms, df.open[inc], df.close[inc], color="green")
fig.vbar(df.date[dec], width_ms, df.open[dec], df.close[dec], color="red")
source = ColumnDataSource({'date': df.date, 'high': df.high, 'low': df.low})
callback = CustomJS(args={'y_range': fig.y_range, 'source': source}, code='''
clearTimeout(window._autoscale_timeout);
var date = source.data.date,
low = source.data.low,
high = source.data.high,
start = cb_obj.start,
end = cb_obj.end,
min = Infinity,
max = -Infinity;
for (var i=0; i < date.length; ++i) {
if (start <= date[i] && date[i] <= end) {
max = Math.max(high[i], max);
min = Math.min(low[i], min);
}
}
var pad = (max - min) * .05;
window._autoscale_timeout = setTimeout(function() {
y_range.start = min - pad;
y_range.end = max + pad;
});
''')
fig.x_range.callback = callback
show(fig)
df = pd.DataFrame(MSFT)
df["date"] = pd.to_datetime(df["date"])
output_file("candlestick.html")
candlestick_plot(df)
我努力让阴谋烛台图表按照我想要的方式工作,所以我开发了一个代码示例来分享。
这不依赖于任何额外的 javascript 或除 Dash、Plotly 和名为 pytz 的日期库之外的其他库。示例代码在更新 x 范围滑块时自动更新 yaxis 范围。 Y 轴设置为仅显示图表中带有两个刻度填充的柱的价格范围。
这对我来说效果很好,我可以根据需要在图表顶部添加任意数量的跟踪叠加层。另外,我可以在本地 运行 它而无需使用 plotly 服务。在此处查看 gitub 存储库:
https://github.com/gersteing/DashCandlestickCharting/blob/master/README.md
谁想尝试一下。使用 Flask 在本地运行。享受吧!
这是在 finplot 中的做法:
import yfinance as yf
import finplot as fplt
df = yf.download('^NDX', start='2018-01-01', end='2020-04-29')
print(df)
fplt.candlestick_ochl(df[['Open','Close','High','Low']])
fplt.show()
免责声明:我是作者。 Finplot 具有自动 Y 缩放,速度快且自以为是,干净 api。请参阅示例 here。
我正在寻找一个 Python 绘图库,它允许我通过鼠标滚轮滚动(或类似方式)使用 X 缩放和缩放时自动缩放的 Y 轴绘制烛台(最好是 OHLC 柱变体)。
作为我正在寻找的示例,tradingview.com 完美地做到了这一点。参见 https://uk.tradingview.com/chart/?symbol=NASDAQ:NDX。单击左上角附近的烛台图标并选择 'Bars'。
可以看到 OHLC 柱Plotly 几乎可以做到这一点。 plotly.graph_objs 中的 Ohlc class 提供 OHLC 条,默认范围滑块是 X 缩放的一个很好的功能(也可以轻松启用鼠标滚轮滚动)。但是,据我所知,Python 中不提供自动 Y 缩放(Y-axis autoscaling with x-range sliders in plotly), thus zooming in on a section of data makes it appear flat. Example code - https://plot.ly/python/ohlc-charts/
我熟悉的另一个选项是 PyQtGraph,它具有很好的缩放功能,但不支持烛台图。使用它需要编写我自己的烛台对象。
有很多我不知道的 Python 绘图库。有什么开箱即用的支持吗?任何人都可以提供示例代码来干净地执行此操作吗?
我找到的最佳解决方案是使用 Bokeh。这里有一个相关的问题 - Bokeh, zoom only on single axis, adjust another axis accordingly. One answer links a gist 给出了一个使用自动 Y 缩放设置烛台的示例。
不幸的是,这远非 'out of the box' 解决方案,因为它涉及编写自定义 JavaScript 回调。但是,解决方案仍然相当简单。我无法将要点上的代码获取到 运行,主要是由于 Pandas DataReader 的问题。这是代码的更新版本,它使用 Bokeh 提供的示例数据(根据 Bokeh Candlesicks example),增加了与 TradingView 的更多相似之处并解决了我发现的其他一些问题:
import pandas as pd
from bokeh.io import output_file, show
from bokeh.plotting import figure
from bokeh.models import CustomJS, ColumnDataSource
from bokeh.sampledata.stocks import MSFT
def candlestick_plot(df):
fig = figure(sizing_mode='stretch_both',
tools="xpan,xwheel_zoom,undo,redo,reset,crosshair,save",
active_drag='xpan',
active_scroll='xwheel_zoom',
x_axis_type='datetime')
inc = df.close > df.open
dec = ~inc
fig.segment(df.date[inc], df.high[inc], df.date[inc], df.low[inc], color="green")
fig.segment(df.date[dec], df.high[dec], df.date[dec], df.low[dec], color="red")
width_ms = 12*60*60*1000 # half day in ms
fig.vbar(df.date[inc], width_ms, df.open[inc], df.close[inc], color="green")
fig.vbar(df.date[dec], width_ms, df.open[dec], df.close[dec], color="red")
source = ColumnDataSource({'date': df.date, 'high': df.high, 'low': df.low})
callback = CustomJS(args={'y_range': fig.y_range, 'source': source}, code='''
clearTimeout(window._autoscale_timeout);
var date = source.data.date,
low = source.data.low,
high = source.data.high,
start = cb_obj.start,
end = cb_obj.end,
min = Infinity,
max = -Infinity;
for (var i=0; i < date.length; ++i) {
if (start <= date[i] && date[i] <= end) {
max = Math.max(high[i], max);
min = Math.min(low[i], min);
}
}
var pad = (max - min) * .05;
window._autoscale_timeout = setTimeout(function() {
y_range.start = min - pad;
y_range.end = max + pad;
});
''')
fig.x_range.callback = callback
show(fig)
df = pd.DataFrame(MSFT)
df["date"] = pd.to_datetime(df["date"])
output_file("candlestick.html")
candlestick_plot(df)
我努力让阴谋烛台图表按照我想要的方式工作,所以我开发了一个代码示例来分享。
这不依赖于任何额外的 javascript 或除 Dash、Plotly 和名为 pytz 的日期库之外的其他库。示例代码在更新 x 范围滑块时自动更新 yaxis 范围。 Y 轴设置为仅显示图表中带有两个刻度填充的柱的价格范围。
这对我来说效果很好,我可以根据需要在图表顶部添加任意数量的跟踪叠加层。另外,我可以在本地 运行 它而无需使用 plotly 服务。在此处查看 gitub 存储库:
https://github.com/gersteing/DashCandlestickCharting/blob/master/README.md
谁想尝试一下。使用 Flask 在本地运行。享受吧!
这是在 finplot 中的做法:
import yfinance as yf
import finplot as fplt
df = yf.download('^NDX', start='2018-01-01', end='2020-04-29')
print(df)
fplt.candlestick_ochl(df[['Open','Close','High','Low']])
fplt.show()
免责声明:我是作者。 Finplot 具有自动 Y 缩放,速度快且自以为是,干净 api。请参阅示例 here。