Python:使用自动 Y 缩放绘制烛台

问题描述 投票:0回答:4

我正在寻找一个Python绘图库,它允许我通过鼠标滚轮滚动(或类似)进行X缩放并在缩放时自动缩放Y轴来绘制烛台(最好是OHLC柱变体)。

作为我正在寻找的示例,tradingview.com 完美地做到了这一点。请参阅https://uk.tradingview.com/chart/?symbol=NASDAQ:NDX。单击左上角附近的烛台图标并选择“条形图”即可查看 OHLC 条形图。

Plotly 几乎能够做到这一点。 plotly.graph_objs 中的 Ohlc 类提供 OHLC 条,默认范围滑块是 X 缩放的一个很好的功能(也可以轻松启用鼠标滚轮滚动)。然而,据我所知,Python 中不支持自动 Y 缩放(plotly 中使用 x 范围滑块进行 Y 轴自动缩放),因此放大一段数据会使其显得平坦。示例代码 - https://plot.ly/python/ohlc-charts/

我熟悉的另一个选项是 PyQtGraph,它具有很好的缩放功能,但不支持烛台图。使用它需要编写我自己的烛台对象。

有很多我不知道的 Python 绘图库。有没有什么东西可以提供开箱即用的支持?谁能提供示例代码来干净地完成此操作?

python plot finance candlestick-chart
4个回答
7
投票

这是如何在 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。请参阅示例此处


6
投票

我发现的最好的解决方案是使用 Bokeh。这里有一个相关的问题 - Bokeh,仅在单个轴上缩放,相应地调整另一个轴。一个答案链接了一个gist,它给出了设置具有自动 Y 缩放功能的烛台的示例。

不幸的是,这远非“开箱即用”的解决方案,因为它涉及编写自定义 JavaScript 回调。然而,解决方案仍然相当简单。我无法运行要点上的代码,主要是由于 Pandas DataReader 的问题。这是代码的更新版本,它使用 Bokeh 提供的示例数据(根据 Bokeh Candlesicks 示例),增加了与 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)

5
投票

我很难让蜡烛图按照我想要的方式工作,所以我开发了一个代码示例来分享。

除了 Dash、Plotly 和一个名为 pytz 的日期库之外,这不依赖于任何额外的 javascript 或其他库。示例代码在更新 x 范围滑块时自动更新 y 轴范围。 Y 轴设置为仅显示图表中带有两个刻度填充的柱的价格范围。

这对我来说效果很好,我可以在图表顶部添加任意数量的跟踪叠加。另外,我可以在本地运行它,而无需使用plotly 服务。请参阅此处的 gitub 存储库:

https://github.com/gersteing/DashCandlestickCharting/blob/master/README.md

对于那些想尝试的人。使用 Flask 在本地运行。享受吧!


0
投票

您可以使用轻量级图表库实现所需的功能,该库是 TradingView 轻量级图表库的 Python 包装器。

pip install lightweight-charts

来自文档

import pandas as pd
from lightweight_charts import Chart

chart = Chart(toolbox=True)

df = pd.read_csv('ohlcv.csv')
chart.set(df)

chart.show(block=True)
© www.soinside.com 2019 - 2024. All rights reserved.