[PYTHON] Créez un graphique des devises qui peut être déplacé avec Plotly (2)

Ceci est une suite de Qiita --u1and0 / Création d'un graphique de devises qui peut être déplacé avec Plotly (1). Vous pouvez maintenant ajouter / supprimer / initialiser des indicateurs.

gif8.gif

Préparation

Importation de module

Importez les modules requis.

# ----------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

Créer des exemples de données

# 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 pendant 90 jours,La valeur initiale est 115

Créez un graphique d'échange aléatoire. Utilisez la fonction Randonnée aléatoire pour créer une barre d'une minute à partir du 20 mars 2017 pendant 90 jours **.

Instanciation

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

Instanciez avec la classe StockPlot.

Dessin de jambes de bougie

Convertissez la période une fois instanciée avec fig = sp.StockPlot (sdf). Utilisez la méthode resample lors de la conversion.

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

Après avoir défini la période, essayez de tracer.

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

png1.png

Ceci est la revue de article précédent.


Manipulation d'indicateurs

Ajout d'indicateurs

Tracons l'indice. Tracez la moyenne mobile simple la plus populaire. Utilisez la méthode ʻappend` pour ajouter.

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 (ligne moyenne mobile simple à 25 pattes) a été ajoutée. Si vous exécutez la méthode ʻappend` seule sur Jupyter Notebook ou Ipython, la valeur de close_25_sma sera affichée comme valeur de retour.

Même si vous modifiez la période, l'index ajouté changera la valeur en fonction de la période.

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

png3.png

Après être passé à 15 minutes avec la méthode resample, close_25_sma est toujours ajouté sans utiliser la méthode ʻappend`.

Ceci est dû au fait que l'index est ajouté au graphe lorsque la méthode plot est exécutée, pas lorsque la méthode ʻappend` est exécutée.

La méthode ʻappend stocke uniquement les valeurs dans self._indicators`.

self.append()


# ========self._Stocker les indicateurs dans l'indicateur==========
    def append(self, indicator):
        indicator_value = self.stock_dataframe[indicator]
        self._indicators[indicator] = indicator_value  # self._Au format indicateurs au format dictionnaire
        return indicator_value

self.plot()


# =======self lors de l'exécution de la méthode de tracé._L'indicateur stocké dans l'indicateur_append_Passer au graphique==========
    def plot(self, (Abréviation)):
        # (Omission)
        # ---------Append indicators----------
        for indicator in self._indicators.keys():
            self._append_graph(indicator, start_plot, end_plot)  # Re-append indicator in graph
        # (Omission)
        return self._fig

self._append_graph()


# =======self._L'indicateur stocké dans l'indicateur est auto._Ajouter à la partie données de la fig==========
    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('_', ' '))  #Conversion de format à ajouter au graphique
        self._fig['data'].append(plotter)

Supprimer l'indicateur

Utilisez la méthode pop pour supprimer la métrique.

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 a été supprimé.

Je dessinerai également des indicateurs autres que la simple moyenne mobile.

fx.append('close_20_ema')  #Moyenne mobile exponentielle du cours de clôture
fx.append('boll')  #Bande de Bollinger au milieu(close_20_Identique à sma)
fx.append('boll_ub')  #Sur le groupe de Bollinger
fx.append('boll_lb')  #Sous le groupe Bollinger
fx.append('high_0~20_max')  #La valeur de mouvement la plus élevée avant 20 pieds
fx.append('low_0~20_min')  #Le prix le plus bas pour se déplacer il y a 20 pieds
fx.plot(start_view='first', end_view='last')
fx.show('png', filebasename='png4')

png4.png

A été tracé.

Si vous ne connaissez pas le nom de l'index que vous avez ajouté, vous pouvez y accéder à partir de la variable d'instance.

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

ʻLorsque la méthode appendest utilisée, l'argument est key et la valeur de retour est value, et il est enregistré dans_indicatorsau format dictionnaire. Par conséquent, vous pouvez appeler le nom d'index ajouté par la méthodekeys`.

Vous pouvez également l'afficher avec fx.stock_dataframe.columns, mais ce n'est pas recommandé. stockstats.StockDataFrame soulève également des colonnes auxiliaires lors de la génération de métriques. Par conséquent, les indicateurs auxiliaires (données non représentées dans le graphique) sont également mélangés et il est difficile de distinguer lequel est représenté.

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')

Lors de l'affichage des indicateurs par fx.stock_dataframe.columns, les noms des indicateurs qui n'ont pas été ajoutés sont également affichés.

Puisqu'il a été foiré, supprimez high_20_max et low_20_min.

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

Seuls high_20_max et low_20_min ont été supprimés du graphique.

La méthode «pop» se déroule comme suit.

  1. Supprimez la valeur spécifiée par l'indicateur de «self._indicator».
  2. Extrayez uniquement «open, high, low, close» de «self.stock_dataframe».
  3. Tracez à nouveau les indicateurs restants dans 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

Les indicateurs contenus dans self.stock_dataframe sont un mélange de colonnes auxiliaires en fonction des indicateurs ajoutés. Par conséquent, il est difficile d'identifier "uniquement les colonnes créées par un certain index" et de les supprimer de self.stock_dataframe. Par conséquent, une fois que self.stock_dataframe est retourné à l'état où resample est appliqué (2), l'index est ajouté à nouveau (3).

(3) est presque le même que la méthode ʻappend, mais il n'ajoute pas à self._indicators. Puisque les indicateurs supplémentaires n'ont pas été supprimés de self._indicators à l'étape (1), il n'est pas nécessaire de les ajouter à nouveau à self._indicators`.

Initialisation de l'indicateur

Utilisez la méthode «clear» pour effacer tous les indicateurs ajoutés.

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  #Largeur du temps du pied
        else:
            self.stock_dataframe = reset_dataframe(self.stock_dataframe)

La méthode clear est presque la même que la méthode __init __,

Autrement dit, il n'est pas nécessaire d'utiliser la méthode resample lors du repérage

Est différent de «init».

Résumé et supplément

organigramme

L'ordre d'utilisation de chaque méthode est indiqué dans l'organigramme ci-dessous.

png8.png

Le côté gauche montre Ajouter et Afficher, et le côté droit montre Supprimer et Réinitialiser.

À propos de Bollinger Band

Dans stockstats, l'intervalle de mouvement utilisé dans la bande de Bollinger et $ \ sigma $ sont définis comme des variables de classe.

BOLL_PERIOD = 20
BOLL_STD_TIMES = 2

Maintenant, essayez de changer la section de voyage en 5, $ \ sigma $ en 1.

sp.ss.StockDataFrame.BOLL_PERIOD = 5  #Réglage de la section de mouvement de la bande de Bollinger
sp.ss.StockDataFrame.BOLL_STD_TIMES = 1  #Réglage de la bande de Bollinger σ
boll = sp.StockPlot(df)
boll.resample('4H')
boll.append('boll')  #Bande de Bollinger au milieu(close_5_Identique à sma)
boll.append('boll_ub')  #Sur le groupe de Bollinger
boll.append('boll_lb')  #Sous le groupe Bollinger
boll.plot(start_view='first', end_view='last')
boll.show('png', filebasename='png7')

png7.png

C'est dommage que $ \ sigma_1 $ et $ \ sigma_2 $ ne puissent pas être tirés en même temps.

Puisque BOLL_PERIOD et BOLL_STD_TIMES sont des variables de classe de stockstats, Il doit être redéfini comme stockplot.stockstats.BOLL_STD_TIMES = 2.

Cependant, lorsque stockstats ajoute une métrique, il utilise la méthode _get, donc la métrique une fois ajoutée sera écrasée.

Si vous le dessinez simplement sur un graphique, il semble que vous puissiez le faire d'une manière ou d'une autre, mais ce sera une tâche future.

À propos des sous-graphiques

stockstats prend en charge la sortie de nombreux indicateurs, mais de nombreux indicateurs nécessitent des sous-graphiques. (MACD, RSI, ADX ...) Les sous-graphiques n'ont pas été touchés dans cette version. Quand j'essaye d'utiliser Cufflinks, je pense que les sous-graphiques peuvent être facilement réalisés.

À propos du fichier gif supérieur

La première image gif montre le graphique généré de manière interactive au format HTML depuis ipython.

/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)
#Changer 1 seconde tick pendant 90 jours en 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')

Le code source a été téléchargé sur github. github - u1and0/stockplot

Recommended Posts

Créez un graphique des devises qui peut être déplacé avec Plotly (2)
Créez un graphique des devises qui peut être déplacé avec Plotly (1)
[Python] Créez un graphique qui peut être déplacé avec Plotly
Faisons un diagramme sur lequel on peut cliquer avec IPython
Créez une Spinbox qui peut être affichée en binaire avec Tkinter
Créez une Spinbox pouvant être affichée dans HEX avec Tkinter
Comment créer un bot Janken qui peut être facilement déplacé (commentaire)
Faire un joli graphique avec plotly
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
[Python] Dessinez des données d'altitude sur une surface sphérique avec Plotly et dessinez un globe qui peut être tourné en rond et en rond
Obtenez une liste des paramètres de caméra qui peuvent être définis avec cv2.VideoCapture et faites-en un type de dictionnaire
Types de fichiers pouvant être utilisés avec Go
Répertorier les packages pouvant être mis à jour avec pip
Notes pour créer des figures pouvant être publiées dans des revues avec matplotlib
Déplacement de Raspberry Pi à distance afin qu'il puisse être connecté à une LED avec Python
Formatez les données DataFrame avec Pytorch sous une forme pouvant être entraînée avec NN
Convertir des images du SDK FlyCapture en un formulaire pouvant être utilisé avec openCV
Liste des couleurs pouvant être définies avec tkinter (mémorial)
Notes sur les connaissances Python utilisables avec AtCoder
Limites qui peuvent être analysées à la fois avec MeCab
Récapitulatif du format des formats qui peuvent être sérialisés avec gensim
Il semble que le suivi des squelettes puisse être effectué avec RealSense
Les zéros NumPy peuvent être définis même avec une taille de 0
Créez une API Web capable de fournir des images avec Django
Implémentez un thread qui peut être suspendu en exploitant le rendement
J'ai étudié le prétraitement qui peut être fait avec PyCaret
J'ai créé un plug-in qui peut faire "Daruma-san tombé" avec Minecraft
Diagramme de bougie avec tracé
Faites une loterie avec Python
Faire un feu avec kdeplot
Comprendre les probabilités et les statistiques qui peuvent être utilisées pour la gestion des progrès avec un programme python
À propos du fait que le résumé de la torche peut être vraiment utilisé lors de la construction d'un modèle avec Pytorch
[Python] Un programme qui trouve le nombre maximum de jouets pouvant être achetés avec votre argent
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
Un minuteur (ticker) qui peut être utilisé sur le terrain (peut être utilisé n'importe où)
Comparaison de 4 styles pouvant être passés à seaborn avec set_context
Un mémo lors de la création d'un environnement qui peut être débogué avec Lambda @ Edge pour le moment
[Python] Code qui peut être écrit avec la mort cérébrale au début lors du scraping en tant que débutant
Puis-je être un data scientist?
Faisons une interface graphique avec python.
Faites un son avec le notebook Jupyter
Faisons une rupture de bloc avec wxPython
Créer un système de recommandation avec python
requirements.txt peut être commenté avec #
Créer un filtre avec un modèle django
Confirmation que rkhunter peut être installé
Faisons un graphe avec python! !!
Faisons un spacon avec xCAT
Créer un itérateur de modèle avec PySide
Créez un BOT qui peut appeler des images enregistrées avec Discord comme des pictogrammes
Technologie qui prend en charge un service de jet d'argent qui peut monétiser un blog avec une seule balise
J'ai créé un modèle de projet Python générique
[Python] Un programme qui trouve une paire qui peut être divisée par une valeur spécifiée
Module de traitement du signal acoustique qui peut être utilisé avec Python-Sounddevice ASIO [Application]
Le panneau Web LXC qui peut faire fonctionner LXC avec un navigateur était merveilleux
Créez un Discord Bot qui peut rechercher et coller des images
[Peut être fait en 10 minutes] Créez rapidement un site Web local avec Django
Optimisation mathématique pour un travail gratuit avec Python + PuLP