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.
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
# 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 **.
# Convert DataFrame as StockPlot
fx = sp.StockPlot(df)
Instanziieren Sie mit der StockPlot-Klasse.
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')
Dies ist die Überprüfung des vorherigen Artikels.
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')
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')
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)
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')
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')
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')
Nur high_20_max und low_20_min wurden aus dem Diagramm entfernt.
Die "pop" -Methode läuft wie folgt ab.
self._indicator
.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.
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')
self.stock_dataframe
).self._fig
).self._indicators
).fx.clear (hard = True)
ausführen) (Hard Reset).self.stock_dataframe
kehrt zu None
zurück.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__
.
Die Reihenfolge der Verwendung jeder Methode ist im folgenden Flussdiagramm dargestellt.
Die linke Seite zeigt Hinzufügen und Anzeigen und die rechte Seite zeigt Löschen und Zurücksetzen.
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')
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.
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.
Das erste GIF-Bild zeigt das Diagramm, das interaktiv als HTML von ipython ausgegeben wird.
. / Bin / stockplot_quickset.py
aus, das vom Importieren von Modulen bis zum Wechsel zu täglich ausgeführt 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