Files
Freqtrade/tools/polynomiale.py
2025-05-04 17:19:44 +02:00

110 lines
3.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def polynomial_features(series, degree=3, verbose=True):
x = np.arange(len(series))
y = series.values
# Fit du polynôme
coeffs = np.polyfit(x, y, degree)
poly = np.poly1d(coeffs)
if verbose:
print("⚙️ Coefficients (du plus haut degré au plus bas) :")
for i, coef in enumerate(coeffs):
deg = degree - i
print(f" a{deg} = {coef:.6f}")
print(f"\n📈 Fonction polynomiale :\n f(x) = {poly}")
# ✅ Première dérivée(variation ou pente)
# Positive: la courbe est croissante → tendance haussière.
# Négative: la courbe est décroissante → tendance baissière.
# Proche de 0: la courbe est plate → marché stable ou en transition.
#
# Applications:
# Détecter les points dinflexion(changement de tendance) quand elle sannule.\
# Analyser la vitesse dun mouvement(plus elle est forte, plus le mouvement est impulsif).
#
# ✅ Seconde dérivée(accélération ou concavité)
# Positive: la pente augmente → accélération de la hausse ou ralentissement de la baisse.
# Négative: la pente diminue → accélération de la baisse ou ralentissement de la hausse.
# Changement de signe: indique souvent un changement de courbure, utile pour prévoir des retournements.
#
# Exemples:
# 🟢 Dérivée 1 > 0 et dérivée 2 > 0: tendance haussière qui saccélère.
# 🟡 Dérivée 1 > 0 et dérivée 2 < 0: tendance haussière qui ralentit → essoufflement potentiel.
# 🔴 Dérivée 1 < 0 et dérivée 2 < 0: tendance baissière qui saccélère.
# 🟠 Dérivée 1 < 0 et dérivée 2 > 0: tendance baissière qui ralentit → possible bottom.
#
# Filtrer les signaux: ne prendre un signal haussier que si dérivée1 > 0 et dérivée2 > 0.
# Détecter les zones de retournement: quand dérivée1 ≈ 0 et que dérivée2 change de signe.
# Dérivées
deriv1 = 10 * poly.deriv()
deriv2 = 100 * deriv1.deriv()
trend = poly(x)
slope = deriv1(x)
accel = deriv2(x)
return trend, slope, accel, poly
def polynomial_tail(series, degree=3, window=50, verbose=True):
if len(series) < window:
raise ValueError("Not enough data points for the specified window")
# On garde les N dernières valeurs
tail = series[-window:]
x = np.arange(window)
y = tail.values
# Fit du polynôme
coeffs = np.polyfit(x, y, degree)
poly = np.poly1d(coeffs)
if verbose:
print(f"Régression sur les {window} derniers points :")
print(poly)
# Évaluation sur la même fenêtre
trend = poly(x)
slope = poly.deriv()(x)
accel = poly.deriv().deriv()(x)
return trend, slope, accel, poly
# Exemple avec une série synthétique
np.random.seed(0)
x = np.linspace(0, 20, 250)
y = 0.05 * x**3 - x**2 + 2 * x + 5 + np.random.normal(0, 15, size=len(x))
series = pd.Series(y)
trend, slope, accel, poly = polynomial_features(series, degree=3)
# 🔍 Visualisation
plt.figure(figsize=(10, 6))
plt.plot(series, label="Original", alpha=0.5)
plt.plot(trend, label="Trend (Poly)", linewidth=2)
plt.plot(slope, label="1st Derivative", linestyle='--')
plt.plot(accel, label="2nd Derivative", linestyle=':')
plt.legend()
plt.title("Régression polynomiale + dérivées")
plt.grid(True)
plt.show()
# trend, slope, accel, poly = polynomial_tail(series, degree=3, window=50)
#
# # Visualisation de la portion utile
# plt.figure(figsize=(10, 5))
# plt.plot(series[-50:].values, label="Original (Last 50)")
# plt.plot(trend, label="Trend (Poly)", linewidth=2)
# plt.plot(slope, label="1st Derivative", linestyle='--')
# plt.plot(accel, label="2nd Derivative", linestyle=':')
# plt.title("Régression polynomiale sur les 50 dernières valeurs")
# plt.legend()
# plt.grid(True)
# plt.show()