[PYTHON] Erstellen Sie ein Währungsdiagramm, das mit Plotly (2) verschoben werden kann.

Dies ist eine Fortsetzung von Qiita --u1and0 / Erstellen eines Währungsdiagramms, das mit Plotly (1) verschoben werden kann. Sie können jetzt Indikatoren hinzufügen / löschen / initialisieren.

gif8.gif

Vorbereitung

Modulimport

Importieren Sie die erforderlichen Module.

# ----------General Module----------
import numpy as np
import pandas as pd
# ----------User Module----------
from randomwalk import randomwalk
import stockplot as sp
# ----------Hide General Module----------
import stockstats
import plotly
conda install plotly
pip install stockstats

Beispieldaten erstellen

# Make sample data
np.random.seed(10)
df = randomwalk(60 * 60 * 24 * 90, freq='S', tick=0.01, start=pd.datetime(2017, 3, 20))\
    .resample('T').ohlc() + 115  #1 Minute für 90 Tage,Der Anfangswert ist 115

Erstellen Sie ein zufälliges Austauschdiagramm. Verwenden Sie die Randomwalk-Funktion, um ab dem 20. März 2017 für 90 Tage einen 1-Minuten-Balken zu erstellen **.

Instanziierung

# Convert DataFrame as StockPlot
fx = sp.StockPlot(df)

Instanziieren Sie mit der StockPlot-Klasse.

Zeichnung von Kerzenbeinen

Konvertieren Sie den einmal instanziierten Zeitrahmen mit "fig = sp.StockPlot (sdf)". Verwenden Sie beim Konvertieren die Methode "Resample".

fx.resample('4H').head()
close open high low
2017-03-20 00:00:00 115.34 115.00 115.98 114.79
2017-03-20 04:00:00 116.03 115.34 116.48 115.16
2017-03-20 08:00:00 116.31 116.03 116.75 115.76
2017-03-20 12:00:00 115.92 116.32 116.87 115.62
2017-03-20 16:00:00 114.36 115.92 116.12 113.85

Versuchen Sie nach dem Festlegen des Zeitrahmens zu zeichnen.

fx.plot(start_view='first', end_view='last')
fx.show('png', filebasename='png1')

png1.png

Dies ist die Überprüfung des vorherigen Artikels.


Manipulation von Indikatoren

Hinzufügung von Indikatoren

Zeichnen wir den Index. Zeichnen Sie den beliebtesten einfachen gleitenden Durchschnitt. Verwenden Sie die Methode "Anhängen", um sie hinzuzufügen.

fx.append('close_25_sma')
fx.stock_dataframe.head()
close open high low close_25_sma
2017-03-20 00:00:00 115.34 115.00 115.98 114.79 115.340000
2017-03-20 04:00:00 116.03 115.34 116.48 115.16 115.685000
2017-03-20 08:00:00 116.31 116.03 116.75 115.76 115.893333
2017-03-20 12:00:00 115.92 116.32 116.87 115.62 115.900000
2017-03-20 16:00:00 114.36 115.92 116.12 113.85 115.592000
fx.plot(start_view='first', end_view='last')
fx.show('png', filebasename='png2')

png2.png

close_25_sma (25-beinige einfache gleitende Durchschnittslinie) wurde hinzugefügt. Wenn Sie die Methode "Anhängen" allein auf Jupyter Notebook oder Ipython ausführen, wird der Wert von close_25_sma als Rückgabewert angezeigt.

Selbst wenn der hinzugefügte Index den Zeitrahmen ändert, ändert sich der Wert entsprechend dem Zeitrahmen.

fx.resample('15T')
fx.plot(start_view='first', end_view='last')
fx.show('png', filebasename='png3')

png3.png

Nach dem Wechsel auf 15 Minuten mit der Methode "resample" wird "close_25_sma" immer noch hinzugefügt, ohne die Methode "append" zu verwenden.

Dies liegt daran, dass der Index dem Diagramm hinzugefügt wird, wenn die Methode "plot" ausgeführt wird, und nicht, wenn die Methode "append" ausgeführt wird.

Die Methode "Anhängen" speichert nur die Werte in "self._indicators".

self.append()


# ========self._Speichern Sie die Indikatoren im Indikator==========
    def append(self, indicator):
        indicator_value = self.stock_dataframe[indicator]
        self._indicators[indicator] = indicator_value  # self._Im Indikatorformat im Wörterbuchformat
        return indicator_value

self.plot()


# =======Selbst beim Ausführen der Plotmethode._Der im Indikator gespeicherte Indikator_append_Zum Diagramm übergeben==========
    def plot(self, (Abkürzung)):
        # (Unterlassung)
        # ---------Append indicators----------
        for indicator in self._indicators.keys():
            self._append_graph(indicator, start_plot, end_plot)  # Re-append indicator in graph
        # (Unterlassung)
        return self._fig

self._append_graph()


# =======self._Der im Indikator gespeicherte Indikator ist selbst._Zum Datenteil von Abb==========
    def _append_graph(self, indicator, start, end):
        graph_value = self._indicators[indicator].loc[start:end]
        plotter = go.Scatter(x=graph_value.index, y=graph_value,
                             name=indicator.upper().replace('_', ' '))  #Formatkonvertierung zum Hinzufügen zum Diagramm
        self._fig['data'].append(plotter)

Anzeige löschen

Verwenden Sie die Pop-Methode, um die Metrik zu löschen.

fx.pop('close_25_sma')
fx.stock_dataframe.head()
open high low close
2017-03-20 00:00:00 115.00 115.26 114.87 115.11
2017-03-20 00:15:00 115.11 115.21 114.85 115.01
2017-03-20 00:30:00 115.01 115.49 114.90 115.47
2017-03-20 00:45:00 115.47 115.50 115.24 115.26
2017-03-20 01:00:00 115.25 115.49 115.10 115.27
fx.plot(start_view='first', end_view='last')
fx.show('png', filebasename='png3_1')

png6.png

close_25_sma wurde entfernt.

Ich werde auch andere Indikatoren als den einfachen gleitenden Durchschnitt zeichnen.

fx.append('close_20_ema')  #Exponentieller gleitender Durchschnitt des Schlusskurses
fx.append('boll')  #Bollinger Band in der Mitte(close_20_Gleich wie sma)
fx.append('boll_ub')  #Auf der Bollinger Band
fx.append('boll_lb')  #Unter der Bollinger Band
fx.append('high_0~20_max')  #Der höchste Wert der Bewegung vor 20 Fuß
fx.append('low_0~20_min')  #Der niedrigste Preis vor 20 Fuß zu bewegen
fx.plot(start_view='first', end_view='last')
fx.show('png', filebasename='png4')

png4.png

Wurde geplant.

Wenn Sie den Namen des hinzugefügten Index nicht kennen, können Sie über die Instanzvariable darauf zugreifen.

fx._indicators.keys()
dict_keys(['low_0~20_min', 'boll', 'high_0~20_max', 'boll_ub', 'close_20_ema', 'boll_lb'])

Bei Verwendung der Methode "Anhängen" ist das Argument der Schlüssel und der Rückgabewert der Wert. Es wird in "_indicators" im Wörterbuchformat gespeichert. Daher können Sie den Indexnamen aufrufen, der mit der Methode "keys" hinzugefügt wurde.

Sie können es auch mit fx.stock_dataframe.columns anzeigen, es wird jedoch nicht empfohlen. stockstats.StockDataFrame löst beim Generieren von Metriken auch zusätzliche Spalten aus. Daher werden auch Hilfsindikatoren (Daten, die nicht in der Grafik dargestellt sind) gemischt, und es ist schwierig zu unterscheiden, welche dargestellt sind.

fx.stock_dataframe.columns
Index(['open', 'high', 'low', 'close', 'close_20_ema', 'close_20_sma',
       'close_20_mstd', 'boll', 'boll_ub', 'boll_lb', 'high_0_s', 'high_1_s',
       'high_2_s', 'high_3_s', 'high_4_s', 'high_5_s', 'high_6_s', 'high_7_s',
       'high_8_s', 'high_9_s', 'high_10_s', 'high_11_s', 'high_12_s',
       'high_13_s', 'high_14_s', 'high_15_s', 'high_16_s', 'high_17_s',
       'high_18_s', 'high_19_s', 'high_20_s', 'high_0~20_max', 'low_0_s',
       'low_1_s', 'low_2_s', 'low_3_s', 'low_4_s', 'low_5_s', 'low_6_s',
       'low_7_s', 'low_8_s', 'low_9_s', 'low_10_s', 'low_11_s', 'low_12_s',
       'low_13_s', 'low_14_s', 'low_15_s', 'low_16_s', 'low_17_s', 'low_18_s',
       'low_19_s', 'low_20_s', 'low_0~20_min'],
      dtype='object')

Bei der Anzeige von Indikatoren nach "fx.stock_dataframe.columns" werden auch die Namen der Indikatoren angezeigt, die nicht hinzugefügt wurden.

Löschen Sie high_20_max und low_20_min, da es durcheinander gebracht wurde.

fx.pop('high_0~20_max')
fx.pop('low_0~20_min')
fx.plot(start_view='first', end_view='last')
fx.show('png', filebasename='png5')

png5.png

Nur high_20_max und low_20_min wurden aus dem Diagramm entfernt.

Die "pop" -Methode läuft wie folgt ab.

  1. Löschen Sie den durch den Indikator angegebenen Wert aus self._indicator.
  2. Extrahieren Sie nur "open, high, low, close" aus "self.stock_dataframe".
  3. Zeichnen Sie die verbleibenden Metriken erneut in "self._indicators".

self.pop()


    def pop(self, indicator):
        popper = self._indicators.pop(indicator)  # (1)
        self.stock_dataframe = reset_dataframe(self.stock_dataframe)  # (2)
        for reindicator in self._indicators.keys():
            self.stock_dataframe.get(reindicator)  # (3)
        return popper

Die in "self.stock_dataframe" enthaltenen Indikatoren sind eine Mischung aus Hilfsspalten, abhängig von den hinzugefügten Indikatoren. Daher ist es schwierig, "nur Spalten zu identifizieren, die von einem bestimmten Index erstellt wurden" und sie aus "self.stock_dataframe" zu entfernen. Sobald "self.stock_dataframe" in den Zustand zurückgebracht wird, in dem "resample" angewendet wird (2), wird der Index erneut hinzugefügt (3).

(3) ist fast die gleiche wie die Methode "Anhängen", fügt jedoch nicht "self._indicators" hinzu. Da die zusätzlichen Indikatoren in Schritt (1) nicht aus "self._indicators" entfernt wurden, müssen sie nicht erneut zu "self._indicators" hinzugefügt werden.

Indikatorinitialisierung

Verwenden Sie die Methode "Löschen", um alle hinzugefügten Indikatoren zu löschen.

fx.clear()
fx.stock_dataframe.head()
open high low close
2017-03-20 00:00:00 115.00 115.26 114.87 115.11
2017-03-20 00:15:00 115.11 115.21 114.85 115.01
2017-03-20 00:30:00 115.01 115.49 114.90 115.47
2017-03-20 00:45:00 115.47 115.50 115.24 115.26
2017-03-20 01:00:00 115.25 115.49 115.10 115.27
fx.plot(start_view='first', end_view='last')
fx.show('png', filebasename='png6')

png6.png

self.clear()


    def clear(self, hard=False):
        self._fig = None  # <-- plotly.graph_objs
        self._indicators = {}
        if hard:
            self.stock_dataframe = None
            self.freq = None  #Fußzeitbreite
        else:
            self.stock_dataframe = reset_dataframe(self.stock_dataframe)

Die clear Methode ist fast die gleiche wie die __init __ Methode,

Das heißt, Sie müssen beim erneuten Plotten nicht die Methode "Resample" verwenden

Unterscheidet sich von __init__.

Zusammenfassung und Ergänzung

Flussdiagramm

Die Reihenfolge der Verwendung jeder Methode ist im folgenden Flussdiagramm dargestellt.

png8.png

Die linke Seite zeigt Hinzufügen und Anzeigen und die rechte Seite zeigt Löschen und Zurücksetzen.

Über Bollinger Band

In "stockstats" werden das im Bollinger-Band und in $ \ sigma $ verwendete Bewegungsintervall als Klassenvariablen definiert.

BOLL_PERIOD = 20
BOLL_STD_TIMES = 2

Versuchen Sie nun, den Reiseabschnitt auf 5, $ \ sigma $ auf 1 zu ändern.

sp.ss.StockDataFrame.BOLL_PERIOD = 5  #Einstellung des Bollinger-Bandbewegungsabschnitts
sp.ss.StockDataFrame.BOLL_STD_TIMES = 1  #Bollinger Band σ Einstellung
boll = sp.StockPlot(df)
boll.resample('4H')
boll.append('boll')  #Bollinger Band in der Mitte(close_5_Gleich wie sma)
boll.append('boll_ub')  #Auf der Bollinger Band
boll.append('boll_lb')  #Unter der Bollinger Band
boll.plot(start_view='first', end_view='last')
boll.show('png', filebasename='png7')

png7.png

Schade, dass $ \ sigma_1 $ und $ \ sigma_2 $ nicht gleichzeitig gezeichnet werden können.

Da BOLL_PERIOD und BOLL_STD_TIMES Klassenvariablen von stockstats sind, Es sollte neu definiert werden als "stockplot.stockstats.BOLL_STD_TIMES = 2".

Wenn jedoch "stockstats" einen Index hinzufügt, wird die Methode "_get" verwendet, sodass der einmal hinzugefügte Index überschrieben wird.

Wenn Sie es nur in ein Diagramm zeichnen, scheint es, dass Sie es irgendwie tun können, aber es wird eine zukünftige Aufgabe sein.

Über Unterdiagramme

stockstats unterstützt die Ausgabe vieler Indikatoren, für viele Indikatoren sind jedoch Unterdiagramme erforderlich. (MACD, RSI, ADX ...) Die Unterdiagramme wurden in dieser Version nicht berührt. Wenn ich versuche, Manschettenknöpfe zu verwenden, habe ich das Gefühl, dass Nebenhandlungen einfach durchgeführt werden können.

Über die Top-GIF-Datei

Das erste GIF-Bild zeigt das Diagramm, das interaktiv als HTML von ipython ausgegeben wird.

/bin/stockplot_quickset.py


# ----------General Module----------
import numpy as np
import pandas as pd
# ----------User Module----------
from randomwalk import randomwalk
import stockplot as sp
# ----------Plotly Module----------
import plotly.offline as pyo
pyo.init_notebook_mode(connected=True)

# Make sample data
np.random.seed(1)
#Ändern Sie 1 Sekunde Tick für 90 Tage auf 1 Minute
df = randomwalk(60 * 60 * 24 * 90, freq='S', tick=0.01, start=pd.datetime(2017, 3, 20)).resample('T').ohlc() + 115

# Convert StockDataFrame as StockPlot
fx = sp.StockPlot(df)

# Resample as Day OHLC
fx.resample('H')

Der Quellcode wurde auf github hochgeladen. github - u1and0/stockplot

Recommended Posts

Erstellen Sie ein Währungsdiagramm, das mit Plotly (2) verschoben werden kann.
Erstellen Sie ein Währungsdiagramm, das mit Plotly (1) verschoben werden kann.
[Python] Erstellen Sie ein Diagramm, das mit Plotly verschoben werden kann
Lassen Sie uns ein Diagramm erstellen, auf das mit IPython geklickt werden kann
Erstellen Sie eine Spinbox, die mit Tkinter in Binär angezeigt werden kann
Erstellen Sie eine Spinbox, die mit Tkinter in HEX angezeigt werden kann
Wie man einen Janken-Bot macht, der leicht bewegt werden kann (Kommentar)
Machen Sie eine schöne Grafik mit Plotly
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
[Python] Zeichnen Sie mit Plotly Höhendaten auf eine sphärische Oberfläche und zeichnen Sie einen Globus, der rund und rund gedreht werden kann
Rufen Sie eine Liste der Kameraparameter ab, die mit cv2.VideoCapture festgelegt werden können, und machen Sie daraus einen Wörterbuchtyp
Dateitypen, die mit Go verwendet werden können
Listen Sie Pakete auf, die mit pip aktualisiert werden können
Hinweise zum Erstellen von Zahlen, die mit matplotlib in Zeitschriften veröffentlicht werden können
Raspberry Pi aus der Ferne verschoben, damit es mit Python LED-verbunden werden kann
Formatieren Sie DataFrame-Daten mit Pytorch in ein Formular, das mit NN trainiert werden kann
Konvertieren Sie Bilder aus dem FlyCapture SDK in ein Formular, das mit openCV verwendet werden kann
Liste der Farben, die mit tkinter (Denkmal) eingestellt werden können
Hinweise zu Python-Kenntnissen, die mit AtCoder verwendet werden können
Grenzwerte, die mit MeCab sofort analysiert werden können
Formatübersicht der Formate, die mit gensim serialisiert werden können
Es scheint, dass Skeleton Tracking mit RealSense durchgeführt werden kann
NumPy-Nullen können auch bei einer Größe von 0 definiert werden
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
Implementieren Sie einen Thread, der durch Ausnutzen von Yield angehalten werden kann
Ich habe die Vorbehandlung untersucht, die mit PyCaret durchgeführt werden kann
Ich habe ein Plug-In erstellt, das "Daruma-san Fell" mit Minecraft ausführen kann
Kerzendiagrammplot mit Plotly
Machen Sie eine Lotterie mit Python
Machen Sie ein Feuer mit kdeplot
Verstehen Sie die Wahrscheinlichkeiten und Statistiken, die für das Fortschrittsmanagement mit einem Python-Programm verwendet werden können
Über die Sache, dass Fackelzusammenfassung wirklich verwendet werden kann, wenn ein Modell mit Pytorch erstellt wird
[Python] Ein Programm, das die maximale Anzahl von Spielzeugen findet, die mit Ihrem Geld gekauft werden können
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
Ein Timer (Ticker), der im Feld verwendet werden kann (kann überall verwendet werden)
Vergleich von 4 Stilen, die mit set_context an seaborn übergeben werden können
Ein Memo beim Erstellen einer Umgebung, die vorerst mit Lambda @ Edge debuggt werden kann
[Python] Code, der zu Beginn beim Scraping als Anfänger mit Hirntod geschrieben werden kann
Kann ich Datenwissenschaftler werden?
Lassen Sie uns eine GUI mit Python erstellen.
Machen Sie einen Sound mit Jupyter Notebook
Machen wir einen Blockbruch mit wxPython
Erstellen Sie ein Empfehlungssystem mit Python
require.txt kann mit # auskommentiert werden
Machen Sie einen Filter mit einer Django-Vorlage
Bestätigung, dass rkhunter installiert werden kann
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Machen wir mit xCAT einen Spacon
Erstellen Sie mit PySide einen Modelliterator
Erstellen Sie einen BOT, der mit Discord registrierte Bilder wie Piktogramme aufrufen kann
Technologie, die einen Geldwerfdienst unterstützt, der ein Blog mit einem Tag monetarisieren kann
Ich habe eine generische Python-Projektvorlage erstellt
[Python] Ein Programm, das ein Paar findet, das durch einen bestimmten Wert geteilt werden kann
Akustisches Signalverarbeitungsmodul, das mit Python-Sounddevice ASIO [Anwendung] verwendet werden kann
Das LXC Web Panel, das LXC mit einem Browser bedienen kann, war wunderbar
Erstellen Sie einen Discord Bot, der Bilder suchen und einfügen kann
[Kann in 10 Minuten erledigt werden] Erstellen Sie schnell eine lokale Website mit Django