Intégration fonctions polynomiales
This commit is contained in:
109
tools/polynomiale.py
Normal file
109
tools/polynomiale.py
Normal file
@@ -0,0 +1,109 @@
|
||||
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 d’inflexion(changement de tendance) quand elle s’annule.\
|
||||
# Analyser la vitesse d’un 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 s’accé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 s’accé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()
|
||||
Reference in New Issue
Block a user