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