Использование библиотеки диаграмм для наложения профиля объема на диаграмму свечей в Python - PullRequest
0 голосов
/ 23 октября 2019

Я бы хотел построить профиль объема на графике свечей в python, что привело бы к чему-то вроде этого.

CandleStickwithVolumeProfile

Мои основные данные ohlc будут в кадре данных pandas.

Date,       Open,  High,  Low,   Close
2019-10-18, 54.09, 54.62, 53.35, 53.78
2019-10-17, 52.99, 54.16, 52.62, 53.93
2019-10-16, 52.92, 53.74, 52.51, 53.36

Тогда моя информация о томе будет в другом кадре данныхвот так.

Price, Volume
54.75, 150
54.50, 135
54.25, 140
54.00, 140
53.75, 125
53.50, 145
53.25, 130
53.00, 135
52.75, 155
52.50, 150

Я попробовал примерно каждую библиотеку, которую я знаю, Matplotlib, Plotly, Bokeh. Iv'e пытался просто построить гистограмму рядом со свечой, но масштабирование обычно отключено. Мне было бы интересно использовать любую из стандартных библиотек диаграмм в Python, которые бы давали этот результат довольно простым способом. Надеюсь, кто-то здесь знает, как это сделать.

1 Ответ

0 голосов
/ 24 октября 2019

Ну, я решил углубиться в сюжетную документацию и посмотреть, смогу ли я найти способ сделать это. Оказывается, это не так уж важно. Я начинаю любить Plotly все больше и больше.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Oct 23 22:17:44 2019

@author: TysonU
"""
from plotly.offline import plot
import plotly.graph_objects as go
import random
import pandas as pd

#Create random OHLC and Volume
high = 40
low = 20
dev = 1
days = 100

fake_market = []
for each in range(days):
    ohlc = []
    ohlc.append(each)
    if each == 0:
        o = random.randrange(low, high)
        ohlc.append(o)
    else:
        ohlc.append(c) #I know
    h = random.randrange(o, high)
    ohlc.append(h)
    l = random.randrange(low, o)
    ohlc.append(l)
    c = random.randrange(l, h)
    ohlc.append(c)
    fake_market.append(ohlc)

fake_volume = [[x, random.randrange(10, 30)] for x in range(low, (high+1))]
df = pd.DataFrame(fake_market, columns=["Date", "Open", "High", "Low", "Close"])
df2 = pd.DataFrame(fake_volume, columns=["Volume", "Price"])

#Do all the plotly stuff
fig = go.Figure(
    data=[
        go.Bar(
            x=[str(x) for x in df2.Price.to_list()],
            y=[str(x) for x in df2.Volume.to_list()],
            orientation="h",
            xaxis="x",
            yaxis="y",
            visible=True,
            showlegend=False
        ),
        go.Candlestick(
            x=[str(x) for x in df.Date.to_list()],
            open=[str(x) for x in df.Open.to_list()],
            high=[str(x) for x in df.High.to_list()],
            low=[str(x) for x in df.Low.to_list()],
            close=[str(x) for x in df.Close.to_list()],
            xaxis="x2",
            yaxis="y2",
            visible=True,
            showlegend=False
        )
    ],
    layout=go.Layout(
        title=go.layout.Title(text="Candlestick With Volume Profile"),
        xaxis=go.layout.XAxis(
            side="top",
            range=[0, 300],
            rangeslider=go.layout.xaxis.Rangeslider(visible=False),
            showticklabels=False
        ),
        yaxis=go.layout.YAxis(
            side="left",
            range=[low, high],
            showticklabels=False
        ),
        xaxis2=go.layout.XAxis(
            side="bottom",
            title="Date",
            rangeslider=go.layout.xaxis.Rangeslider(visible=False),
            overlaying="x"
        ),
        yaxis2=go.layout.YAxis(
            side="right",
            title="Price",
            range=[low, high],
            overlaying="y"
        )
    )
)
template = ["plotly", "plotly_white", "plotly_dark", "ggplot2", "seaborn", "none"]
fig.update_layout(template=template[2])

plot(fig)

Не уверен, каков закон для публичной публикации данных о запасах, поэтому я создал простой генератор для генерации данных OHLC и Volume. Реальные биржевые данные сделали бы график менее беспорядочным.

VolumeProfileOnCandlestick

Что-то, что я еще не понял, - это сторона, на которой находятся бары. В настоящее время они находятся на левой стороне, но было бы хорошо, чтобы они были на правой стороне. Должно быть что-то легкое, хотя.

Ну, надеюсь, это поможет кому-нибудь когда-нибудь. Хорошего дня!

...