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
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.
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é).
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()
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.
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
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.
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
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