2 votes

Obtenir RSI en python

J'ai essayé de calculer le RSI de 14 jours des actions et j'ai réussi à le faire fonctionner, en quelque sorte, cela me donne des chiffres inexactes

import pandas as pd 
import datetime as dt
import pandas_datareader as web

ticker = 'TSLA'

start = dt.datetime(2018, 1, 1)
end = dt.datetime.now()

data = web.DataReader(ticker, 'yahoo', start, end)

delta = data['Adj Close'].diff(1)
delta.dropna(inplace=True)

positive = delta.copy()
negative = delta.copy()

positive[positive < 0] = 0
negative[negative > 0] = 0

days = 14

average_gain = positive.rolling(window=days).mean()
average_loss = abs(negative.rolling(window=days).mean())

relative_strenght = average_gain / average_loss
rsi = 100.0 - (100.0 / (1.0 + relative_strenght))
print(ticker + str(rsi))

Cela me donne 77.991564 (RSI de 14 jours) alors que je devrais obtenir 70.13 (RSI de 14 jours), est-ce que quelqu'un sait ce que je fais de mal?

aussi oui j'ai lu Calcul RSI en Python mais cela ne m'aide pas avec ce dont j'ai besoin

0voto

Lumber Jack Points 496

Voici une façon de calculer vous-même le RSI. Le code pourrait être optimisé, mais je préfère le rendre facile à comprendre, et vous laisser l'optimiser.

Pour l'exemple, nous supposons que vous avez un DataFrame appelé df, avec une colonne appelée 'Close', pour les prix de clôture. Au fait, notez que si vous comparez les résultats du RSI avec une station, par exemple, vous devez vous assurer de comparer les mêmes valeurs. Par exemple, si dans la station, vous avez le bid close, et que vous calculez par vous-même le mid ou l'ask, le résultat ne sera pas le même.

Voyons le code :

def rsi(df,_window=14,_plot=0,_start=None,_end=None):
    """[Fonction RSI]

    Args:
        df ([DataFrame]): [DataFrame avec une colonne 'Close' pour le prix de clôture]
        _window ([int]): [La fenêtre de recherche.](default : {14})
        _plot ([int]): [1 si vous voulez voir le graphique](default : {0})
        _start ([Date]):[si _plot=1, début du graphique](default : {None})
        _end ([Date]):[si _plot=1, fin du graphique](default : {None})
    """    

    ##### Diff pour les différences entre la clôture précédente et maintenant
    df['Diff'] = df['Close'].transform(lambda x: x.diff())
    ##### Dans 'Up', gardez simplement les valeurs positives
    df['Up'] = df['Diff']
    df.loc[(df['Up']<0), 'Up'] = 0
    ##### Diff pour les différences entre la clôture précédente et maintenant
    df['Down'] = df['Diff']
    ##### Dans 'Down', gardez simplement les valeurs négatives
    df.loc[(df['Down']>0), 'Down'] = 0 
    df['Down'] = abs(df['Down'])

    ##### Moyenne mobile sur Up & Down
    df['avg_up'+str(_window)] = df['Up'].transform(lambda x: x.rolling(window=_window).mean())
    df['avg_down'+str(_window)] = df['Down'].transform(lambda x: x.rolling(window=_window).mean())

    ##### RS est le rapport des moyennes de Up & Down
    df['RS_'+str(_window)] = df['avg_up'+str(_window)] / df['avg_down'+str(_window)]

    ##### Calcul du RSI
    ##### 100 - (100/(1 + RS))
    df['RSI_'+str(_window)] = 100 - (100/(1+df['RS_'+str(_fast)]))

    ##### Supprimer les colonnes inutiles
    df = df.drop(['Diff','Up','Down','avg_up'+str(_window),'avg_down'+str(_window),'RS_'+str(_window)],axis=1)

    ##### Si demandé, affichez-le !
    if _plot == 1:
        sns.set()
        fig = plt.figure(facecolor = 'white', figsize = (30,5))
        ax0 = plt.subplot2grid((6,4), (1,0), rowspan=4, colspan=4)
        ax0.plot(df[(df.index<=end)&(df.index>=start)&(df.Symbol==_ticker.replace('/',''))]['Close'])
        ax0.set_facecolor('ghostwhite')
        ax0.legend(['Close'],ncol=3, loc = 'upper left', fontsize = 15)
        plt.title(_ticker+" Clôture de "+str(start)+' à '+str(end), fontsize = 20)

        ax1 = plt.subplot2grid((6,4), (5,0), rowspan=1, colspan=4, sharex = ax0)
        ax1.plot(df[(df.index<=end)&(df.index>=start)&(df.Symbol==_ticker.replace('/',''))]['RSI_'+str(_window)], color = 'blue')
        ax1.legend(['RSI_'+str(_window)],ncol=3, loc = 'upper left', fontsize = 12)
        ax1.set_facecolor('silver')
        plt.subplots_adjust(left=.09, bottom=.09, right=1, top=.95, wspace=.20, hspace=0)
        plt.show()
    return(df)

Pour appeler la fonction, vous avez juste à taper

df = rsi(df)

si vous gardez les valeurs par défaut, ou modifier _window et/ou _plot pour l'argument. Notez que si vous saisissez _plot=1, vous devrez spécifier le début et la fin du graphique, avec une chaîne de caractères ou un objet date.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X