import pandas as pd


def detect_btc_crashes_and_rebounds(df, drop_threshold=-10, rebound_threshold=5):
    """
    Identifie les plus grosses chutes du BTC et le rebond suivant.

    Paramètres :
    - df : DataFrame contenant une colonne 'close' avec les prix du BTC.
    - drop_threshold : Seuil de chute en % (ex: -10 pour une chute > 10%).
    - rebound_threshold : Seuil de rebond en % après la chute.

    Retourne :
    - Une liste des chutes avec le pourcentage de rebond correspondant.
    """
    df['return'] = df['close'].pct_change() * 100  # Variation en %
    crashes = []

    in_crash = False
    crash_start, crash_end, bottom, rebound_end = None, None, None, None

    for i in range(1, len(df)):
        change = df.loc[i, 'return']

        # Début d'une chute
        if change < drop_threshold and not in_crash:
            crash_start = i - 1
            in_crash = True

        # En pleine chute, trouver le creux
        if in_crash:
            if bottom is None or df.loc[i, 'close'] < df.loc[bottom, 'close']:
                bottom = i

        # Fin de la chute et début du rebond
        if in_crash and change > 0:
            crash_end = i

        # Identifier un rebond
        if in_crash and crash_end:
            rebound_percent = (df.loc[i, 'close'] - df.loc[bottom, 'close']) / df.loc[bottom, 'close'] * 100
            if rebound_percent > rebound_threshold:
                rebound_end = i
                crashes.append({
                    'crash_start': df.index[crash_start],
                    'crash_end': df.index[crash_end],
                    'bottom': df.index[bottom],
                    'rebound_end': df.index[rebound_end],
                    'drop_percent': (df.loc[bottom, 'close'] - df.loc[crash_start, 'close']) / df.loc[
                        crash_start, 'close'] * 100,
                    'rebound_percent': rebound_percent
                })
                in_crash = False  # Reset pour détecter une nouvelle chute

    return crashes

import yfinance as yf

df = yf.download("BTC-USD", start="2020-01-01", end="2025-01-01", interval="1d")
df.to_csv("btc_prices.csv")
print("Données enregistrées !")


# Exemple d'utilisation avec un DataFrame BTC (OHLCV)
df = pd.read_csv("btc_prices.csv", parse_dates=["date"], index_col="date")
crashes = detect_btc_crashes_and_rebounds(df)

for crash in crashes:
    print(crash)
