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.