Cette stratégie permet d’avoir des possibles point d’entrée et de sortie.
Ici les point noire symbolise les ordres LONG et les points rouges les ordres SHORT.
Formule pour le changement de prix chaque jour :
$$ changement \sim N(0.001, 0.02) \\ P_{n} = P_{n-1} \times e^{changement} $$
import matplotlib.pyplot as plt # librarie graphique
import numpy as np # librarie mathématiques complexe (mieux que la lib de base math comme on vois en cours)
from ta.trend import EMAIndicator # librarie indicateur financiers (ici on importe uniquement EMAIndicator pour l'EMA)
import pandas as pd # librarie de gestion de données
# Stratégie basé sur l'EMA9 et l'EMA21 fonctionnant sur des cours aléatoire (via Loi Normal)
# by Téooo
# N représente le nombre de jours du cours
# prix est une liste contenant tout les prix. (elle devrait contenir N+1 prix).
# Fonctions utiles a comprendre :
# - len() : Renvoie la longeur d'un élement, ici je l'utilise pour regarder la longueur d'une liste.
# - .append() : Ajoute un élement a une liste. (la fonction dépend d'une liste)
# - range(len()) : Comme dans les for i in range() mais dans range je met la longeur d'un élement.
# - break : Fonctionne que dans les boucle, sert a arreter une boucle
# - plt.plot(data) : Trace une courbe
# - plt.scatter(y, x) : Dessine un point
N = 170
prix = [100] # Ici je met directement 100 dans la liste pour définir le premier prix du cours.
# Cette boucle permet d'appliquer des fluctuations aléatoire au cours d'un actif.
# A chaque tours on multiplie le dernier prix par l'exponentielle avec en exposant le résultat obtenue aléatoirement de la Loi Normal.
# Cela permet d'avoir des variations toujours positive (éviter les cours négatif qui viendrais casser mathématiquement la logique car ca viendrais changer le signe).
for i in range(N):
changement = np.random.normal(0.001, 0.02) # Loi normal (avec µ=0.001 et sigma=0.02)
prix.append(prix[i]*np.exp(changement)) # On ajoute le prix obtenue a notre liste.
prix_pd = pd.Series(prix) # On convertis notre liste python en liste Pandas (utile pour la librarie TA)
ema9 = EMAIndicator(prix_pd, window=9) # On créer une variable qui contient les données de l'EMA, on rentre le prix (Pandas) et la durée de l'EMA (ici 9)
ema21 = EMAIndicator(prix_pd, window=21) # Meme chose pour l'EMA 21
# points et bpoints servent a faire les points quand il y a un changement de tendance (point rouge et noire sur le graphique)
points = [] # noire -> Monte
bpoints = [] # rouge -> Descend
plt.figure(figsize=(14,7)) # Utile pour dire a Matplotlib de créer un graphique long
# Boucle qui verifie que la positions des EMA a chaque instant.
# - Si l'EMA9 a la position i > l'EMA21 a la position i et que l'EMA9 a la position i-1 < L'EMA21 a la position i-1 alors on a un point noir (monte)
# - Si l'EMA9 a la position i < l'EMA21 a la position i et que l'EMA9 a la position i-1 > L'EMA21 a la position i-1 alors on a un point rouge (descend)
for i in range(len(prix_pd)):
if ema9.ema_indicator().iloc[i] > ema21.ema_indicator().iloc[i] and ema9.ema_indicator().iloc[i-1] < ema21.ema_indicator().iloc[i-1]:
# Golden Cross (Monte)
points.append((ema9.ema_indicator().iloc[i], i)) # on ajoute le point a points , (ici les points sont en format Python Tuple, c'est un format de données sous cette forme : (x, y) c'est mieux pour représenter des points.)
elif ema9.ema_indicator().iloc[i] < ema21.ema_indicator().iloc[i] and ema9.ema_indicator().iloc[i-1] > ema21.ema_indicator().iloc[i-1]:
# Bad Cross (Descend)
bpoints.append((ema9.ema_indicator().iloc[i], i)) # on ajoute le point a bpoints
plt.plot(prix, label="Cours") # On trace le prix (a partir de la liste python cette fois)
# La boucle suivante permet de tracer les points
for j in range(len(points)):
# On verifie si la tailles de points == 0. (En gros si il y a pas eu de changement de tendance positif)
if len(points) == 0:
break # On annule la boucle
else:
plt.scatter(points[j][1], points[j][0], color="black") # sinon on trace le point avec Scatter
# Meme logique aussi mais pour les tendances négatives
for j in range(len(bpoints)):
# Idem pour bpoints
if len(bpoints) == 0:
break
else:
plt.scatter(bpoints[j][1], bpoints[j][0], color="red") # on trace le point avec Scatter
# On trace EMA9 et EMA21 sur le graphique grace a la fonction .ema_indicator() qui renvoie un tableau de données utilisable.
plt.plot(ema9.ema_indicator(), label="EMA9")
plt.plot(ema21.ema_indicator(), label="EMA21")
# xlabel et ylabel pour nommé les axes
plt.xlabel("Jours")
plt.ylabel("Prix")
plt.legend() # Afficher la legende
plt.title("Prix simulé") # titre du graphique
après exécution on a :
