Détecter le graphique boursier Golden Cross avec Python

introduction

Il y a un phénomène sur le graphique appelé Golden Cross comme signal lors de l'achat d'actions. C'est une méthode que l'on trouve principalement dans les livres d'analyse de graphiques, mais est-ce réellement une méthode valide? Dans cet article, nous définissons la Croix d'Or et examinons s'il s'agit d'un signal d'achat valide. (Attention: il s'agit de savoir s'il est valide dans la plage définie, et il ne vise pas à critiquer la méthode. Par conséquent, le lien du site financier de référence n'est pas fourni. De plus, l'utilisation du programme et les résultats de l'analyse Veuillez à vos risques et périls.) 【Contenu de la mise en œuvre】

--Définir la Croix d'Or et créer un détecteur

Définition de la croix d'or

La croix d'or se produit lorsque la moyenne mobile à court terme dépasse la moyenne mobile à long terme (pour la moyenne mobile, Développer un algorithme d'investissement en Python 2. Veuillez vous référer aux articles / 6337543ba3eb700d0aaa "Explication de la moyenne mobile")). Tout d'abord, j'ai défini le cours quotidien de l'action comme cours de clôture (honnêtement, je ne sais pas lequel des «cours d'ouverture», «cours de clôture», «prix élevé» et «prix bas» est le meilleur). Ensuite, vous devez définir la durée de cette période de calcul de la moyenne. Cette fois, la moyenne à court terme a été fixée à 5 jours et la moyenne à long terme à 25 jours. Enfin, la veille du «jour de dépassement» a été fixée comme le jour où la moyenne à long terme était plus élevée, et le jour où la moyenne à court terme était plus élevée.

Détection de la croix dorée

Je vais vous expliquer le programme qui détecte la croix d'or. Le résultat de sortie est le suivant. La ligne bleue est le cours quotidien de l'action, et le carré rouge est la croix d'or (la valeur y du carré rouge est le cours de l'action pour une meilleure visibilité). goldencross_detection.png

J'expliquerai dans l'ordre des programmes (la source résumée est goldencross_detection.py, qui est placée en bas). Pour la première acquisition d'actions, [Acquisition d'actions et création de bougies graphiques en Python]( Voir http://qiita.com/kjybinp1105/items/be462b481b47b6f94b14 "Obtenir les cours des actions et créer des graphiques en bougie en Python").

Acquisition de stock


import datetime
import pandas_datareader.data as web
import matplotlib.pyplot as plt
import pandas as pd

#Définition de la période
start = datetime.datetime(2011, 1, 1)
end = datetime.datetime(2017, 5, 30)

#Acquisition de stock
df = web.DataReader('TM', 'google', start, end)
df = df.loc[:, ['Close']]

Utilisez pandas.rolling pour calculer la moyenne mobile. Selon le programme, ajustez la durée de la période moyenne dans les fenêtres. Naturellement, la moyenne est la moyenne de la période avec le jour en cours comme dernier jour. Il n'est pas utilisé pour les moyennes mobiles, mais vous pouvez définir center = True pour centrer la moyenne sur la journée en cours.

Calcul de la moyenne mobile


#Définition de la période moyenne
short_term = 5
long_term = 25

#Calcul de la moyenne de la période
df['av_short'] = df['Close'].rolling(window=short_term).mean()#Moyenne à court terme
df['av_long'] = df['Close'].rolling(window=long_term).mean()#Moyenne à long terme

Détecte la croix dorée. Dans le programme, la colonne'golden_flag 'est remplie avec le cours de l'action du jour de la Croix d'Or et Aucun autre que ce jour-là.

Détection et illustration de la croix dorée


#Détection de la croix dorée
df['golden_flag'] = 0
current_flag=0
previous_flag=1
for i,price in df.iterrows():
    if(price['av_short']>price['av_long']):
        current_flag = 1
    else:
        current_flag = 0
    if(current_flag*(1-previous_flag)):
        df.loc[i,'golden_flag']=price['av_long']
    else:
        df.loc[i,'golden_flag']= None
    previous_flag = current_flag

#Illustré
df.plot(style=['-'])
plt.scatter(x= df.index,y = df['golden_flag'],marker='s',color='red')
plt.show()

Transition du cours des actions après la croix d'or

Ensuite, après la Croix d'Or, voyons si le cours de l'action augmente. En supposant que le cours de l'action le jour de la Croix d'Or est de 1,0, nous tracerons le cours de l'action 1 à 20 jours plus tard. Si la Croix d'Or est un signal au moment de l'achat, le cours de l'action devrait globalement augmenter. Concernant le programme (transition_after_goldencross.py), il y a beaucoup de doublons, donc je n'expliquerai que trois points.

  1. Jour suivant sur la base de DataFrame.index Pour convertir une date un jour plus tard avec le module datetime, vous devez définir "day + datetime.timedelta (days = 1)" car "day + 1" entraînera une erreur. De plus, comme le cours de l'action n'existe pas toujours le lendemain, j'ai créé une fonction qui renvoie le lendemain contenant l'index du DataFrame comme indiqué ci-dessous.

Une fonction qui renvoie le jour suivant lorsque le cours de l'action existe


def GetIndexNextDay(df,day):
    for p in range(1,10)://10 convient
        if((day+datetime.timedelta(days=p)) in df.index):
            next_day = day+datetime.timedelta(days=p)
            return next_day
  1. De la liste au DataFrame J'ai enregistré la transition du cours de l'action sous forme de liste, je l'ai convertie en DataFrame et je l'ai tracée. Dès le début, j'ai pensé que je pouvais le faire avec DataFrame, mais j'ai réussi à faire comme ça.
  2. Ingéniosité de l'illustration Il est difficile de voir juste la transition de toutes les croix d'or de 2011 à 2017, j'ai donc calculé la moyenne et l'ai tracée bien en évidence (en rouge). Les résultats basés sur les trois éléments ci-dessus sont les suivants. La ligne noire est la transition du cours de l'action à partir de la date de chaque détection de croix d'or. Étant donné que le cours de l'action à la date de détection est de 1,0, tout est de 1,0 le jour = 0. La ligne rouge est la moyenne de toutes les lignes noires. Pour être honnête, il ne semble pas que cela augmente en moyenne. transition_after_goldencross.png

À la fin

La Croix d'Or personnellement ne ressemblait pas à un signal lors de l'achat. Cependant, si vous regardez de près, de nombreux sites et livres ont de fausses croix dorées, alors soyez prudent. J'ai aussi écrit comment le distinguer, mais il est écrit avec sensualité et il semble que ce n'est pas facile à mettre en œuvre, donc je vais terminer ici cette fois.

Site de référence

Référence d'élément et affectation dans l'index Pandas DataFrame https://hydrocul.github.io/wiki/numpy/pandas-dataframe-ref-index.html

matplotlib.markers http://matplotlib.org/api/markers_api.html#module-matplotlib.markers

Méthode d'attribution des trames de données http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

Développons un algorithme d'investissement avec Python 2 http://qiita.com/hiroshimoda/items/6337543ba3eb700d0aaa

Code source

goldencross_detection.py


import datetime
import pandas_datareader.data as web
import matplotlib.pyplot as plt
import pandas as pd

#Définition de la période
start = datetime.datetime(2011, 1, 1)
end = datetime.datetime(2017, 5, 30)

#Acquisition de stock
df = web.DataReader('TM', 'google', start, end)
df = df.loc[:, ['Close']]

#Définition de la période moyenne
short_term = 5
long_term = 25

#Calcul de la moyenne de la période
df['av_short'] = df['Close'].rolling(window=short_term).mean()#Moyenne à court terme
df['av_long'] = df['Close'].rolling(window=long_term).mean()#Moyenne à long terme

#Détection de la croix dorée
df['golden_flag'] = 0
current_flag=0
previous_flag=1
for i,price in df.iterrows():
    if(price['av_short']>price['av_long']):
        current_flag = 1
    else:
        current_flag = 0
    if(current_flag*(1-previous_flag)):
        df.loc[i,'golden_flag']=price['av_long']
    else:
        df.loc[i,'golden_flag']= None
    previous_flag = current_flag


#Illustré
df.plot(style=['-'])
plt.scatter(x= df.index,y = df['golden_flag'],marker='s',color='red')

plt.show()

transition_after_goldencross.py


import datetime
import pandas_datareader.data as web
import matplotlib.pyplot as plt
import pandas as pd

def GetIndexNextDay(df,day):
    for p in range(1,10):
        if((day+datetime.timedelta(days=p)) in df.index):
            next_day = day+datetime.timedelta(days=p)
            return next_day

#Acquisition de stock
start = datetime.datetime(2011, 1, 1)#Date de début d'acquisition de stock
end = datetime.datetime(2017, 5, 30)#Date de fin d'acquisition des stocks
df = web.DataReader('TM', 'google', start, end)
df = df.loc[:, ['Close']]

#Calcul de la moyenne de la période
short_term = 5#Durée moyenne à court terme
long_term = 25#Durée moyenne à long terme
df['av_short'] = df['Close'].rolling(window=short_term).mean()#Calcul de la moyenne à court terme
df['av_long'] = df['Close'].rolling(window=long_term).mean()#Calcul de la moyenne à long terme

#Détection de la croix dorée
golden_day = []
df['golden_flag'] = 0
current_flag=0
previous_flag=1
for i,price in df.iterrows():
    if(price['av_short']>price['av_long']):
        current_flag = 1
    else:
        current_flag = 0
    if(current_flag*(1-previous_flag)):
        df.loc[i,'golden_flag']=price['Close']
        golden_day.append(i)
    else:
        df.loc[i,'golden_flag']= None
    previous_flag = current_flag
    
#Enregistrer la transition
transitions = []
for day in golden_day:
    day_transition = [df['Close'][day]/df['Close'][day]]
    next_day = day
    for term in range(1,20):
        next_day = GetIndexNextDay(df,next_day)
        day_transition.append(df['Close'][next_day]/df['Close'][day])
    transitions.append(day_transition)
    
#Illustré
df2 = (pd.DataFrame(ss)).T
df_mean = ((df2.T).mean()).T
df2.plot(legend=False,color = 'black')
df_mean.plot(color = 'red',lw=5)
plt.show()

Recommended Posts

Détecter le graphique boursier Golden Cross avec Python
Obtenez les cours des actions et créez des graphiques en bougies avec Python
Dessin de bougie avec python
Détecter les frappes en python (tty)
Détecter les frappes en Python (sans Entrée)
Affichage du graphique en chandeliers en Python (édition matplotlib)
Trouver des fichiers comme Linux Find en Python
Note de nfc.ContactlessFrontend () de nfcpy de python
Exécutez AzureKinect en Python la veille de Noël.
Détectez la température à l'aide de python sur Raspberry Pi 3!
Affichage du graphique en chandeliers en Python (édition Plotly)
Exécutez Python en C ++ sur Visual Studio 2017
Détectez les interrupteurs à glissière à l'aide de python sur Raspberry Pi 3!
Exécutez Python YOLOv3 en C ++ sur Visual Studio 2017
Détectez les commutateurs magnétiques à l'aide de python sur Raspberry Pi 3!
Remarques sur l'utilisation de dict avec python [Competition Pro]
Remarque sur l'encodage lorsque LANG = C en Python
Essayez de travailler avec Mongo en Python sur Mac
Pour écrire dans Error Repoting en Python sur GAE
ABC125_C --GCD sur tableau noir [Notes résolues en Python]
TensorFlow: exécuter des données apprises en Python sur Android
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
Méta-analyse en Python
Python sur Windows
Unittest en Python
twitter avec python3
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
python sur mac
FizzBuzz en Python
Étape AIC en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Python sur Windbg
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python