La méthode que j’utilise est ma propre approche, que j’ai développée et améliorée au fil du temps pour mieux identifier les zones de prix importantes.

PYTHON
import numpy as np
import pandas as pd
import yfinance as yf
from lightweight_charts import JupyterChart

TICKER = 'MNQ=F'
PERIOD = '730d'
TIME_FRAME = '1d'
DIVIDER = 100
DELTA = 0.33

def load_data(ticker=TICKER, period=PERIOD, interval=TIME_FRAME):
    df = yf.download(ticker, period=period, interval=interval, auto_adjust=True)
    df = df[['Open','High','Low','Close','Volume']]
    df.columns = ['open','high','low','close','volume']
    df['time'] = df.index.strftime('%Y-%m-%d %H:%M:%S')
    df.reset_index(drop=True, inplace=True)
    return df[['time','open','high','low','close','volume']]

df_analysis = load_data()

max_price, min_price = df_analysis['high'].max(), df_analysis['low'].min()
extra_bins = (max_price - min_price)/DIVIDER
prices_div = np.linspace(max_price + extra_bins, min_price - extra_bins, DIVIDER)

bins = pd.DataFrame(columns=['low_range','high_range','count'])
for i in range(1, len(prices_div)):
    low, high = prices_div[i], prices_div[i-1]
    count = df_analysis[((df_analysis['close']>=low)&(df_analysis['close']<high))].shape[0]
    bins.loc[len(bins)] = [low, high, count]

median_count = bins['count'].mean()
bins['support'] = (bins['count']>median_count)&(bins['count'].shift(-1)<bins['count']*DELTA)&(bins['count'].shift(1)>=bins['count']*DELTA)
bins['resistance'] = (bins['count']>median_count)&(bins['count'].shift(1)<bins['count']-DELTA)&(bins['count'].shift(-1)>=bins['count'])

def renderGraphSR(chart):
    for _, row in bins.iterrows():
        if row['support']:
            chart.horizontal_line((row['low_range']+row['high_range'])/2, color="#0aff643b", width=30, style='solid', axis_label_visible=False)
        if row['resistance']:
            chart.horizontal_line((row['low_range']+row['high_range'])/2, color="#ff0d0d38", width=30, style='solid', axis_label_visible=False)

chart = JupyterChart(width=1200, height=600)
chart.precision(4)
chart.grid(False, False)
chart.volume_config(1)
chart.set(df_analysis)
renderGraphSR(chart)
chart.load()
⚠️

Ce code est conçu pour les notebooks (Jupyter, Colab…). L’affichage interactif avec JupyterChart fonctionne directement dans la cellule, mais ne sera pas identique dans un IDE classique. Consulte l’article sur lightweight-charts pour en savoir plus.

Support et résistance automatique

Support et résistance automatique