Indice de Force Relative en python pandas
Je suis nouveau sur les pandas. Quelle est la meilleure façon de calculer la force relative de la partie dans l'indicateur RSI dans les pandas? Jusqu'à présent j'ai eu la suivante:
from pylab import *
import pandas as pd
import numpy as np
def Datapull(Stock):
try:
df = (pd.io.data.DataReader(Stock,'yahoo',start='01/01/2010'))
return df
print 'Retrieved', Stock
time.sleep(5)
except Exception, e:
print 'Main Loop', str(e)
def RSIfun(price, n=14):
delta = price['Close'].diff()
#-----------
dUp=
dDown=
RolUp=pd.rolling_mean(dUp, n)
RolDown=pd.rolling_mean(dDown, n).abs()
RS = RolUp / RolDown
rsi= 100.0 - (100.0 / (1.0 + RS))
return rsi
Stock='AAPL'
df=Datapull(Stock)
RSIfun(df)
Suis-je la faire correctement jusqu'à présent? Je vais avoir des ennuis avec la différence de la partie de l'équation où vous séparer à la hausse et à la baisse des calculs
Ne pas yahoo finance le faire automatiquement? Juste curieux, je pense à propos de la construction d'une, mais de ne pas voir un avantage de yahoo
OriginalL'auteur user3084006 | 2013-12-11
Vous devez vous connecter pour publier un commentaire.
aussi, vous besoin de quelque chose comme:
sinon
RS = RolUp /RolDown
ne fera pas ce que vous désirezEdit: semble que ce soit une façon plus précise de RS calcul:
utilisation ajusté de près, parce que cela va prendre soin de splits et de dividendes
elle parcelles mais quelque chose de mal avec les calculs, je suis en utilisant les prix de clôture, mais il ne correspond pas à celle sur le RSI sur stockcharts ou google finance. Le problème est qu'il ne dépasse pas les 70 ou au-dessous de 30 ans quand il est supposé.
voir mes modifications, mais encore vous ne pouvez pas correspondre goolge des finances, parce que goolgle finances choisit les périodes de manière dynamique en fonction du niveau de zoom. c'est
n=14
dans votre script est de 14 jours, mais dans goolge des finances, il peut être de 14 jours, semaines ou que ce soit en fonction du niveau de zoomAi une erreur Étrange reindex_like ne prend pas d'argument fill_value
OriginalL'auteur
Il est important de noter qu'il existe différentes façons de définir le RSI. Il est communément défini dans au moins deux façons: à l'aide d'une moyenne mobile simple SMA) comme ci-dessus, ou en utilisant une moyenne mobile exponentielle (EMA). Voici un extrait de code qui calcule les deux définitions de la RSI et des parcelles pour la comparaison. Je suis en supprimant la première ligne après la prise de la différence, car il est toujours NaN, par définition.
Noter que lors de l'utilisation de l'EMA attention: étant donné qu'il comprend une mémoire depuis le début des données, le résultat dépend de l'endroit où vous commencez à! Pour cette raison, généralement, les gens vont ajouter des données au début, de 100 pas de temps, et puis couper les 100 premières valeurs RSI.
Dans le graphique ci-dessous, on peut voir la différence entre le RSI est calculée à l'aide de SMA et de l'EMA: le SMA on a tendance à être plus sensibles. Note que le RSI est basé sur l'EMA a sa première valeur finie au premier pas de temps (qui est la deuxième étape de la période, en raison de l'abandon du premier rang), alors que le RSI basé sur des SMA a sa première valeur finie à la 14ème étape. C'est parce que par défaut rolling_mean() ne renvoie une valeur finie une fois il y a assez de valeurs pour remplir la fenêtre.
close = data['Adj. Close']
au lieu declose = data.Close
sinon vous obtiendrez sauvage résultats si votre date de gamme comprend un split.Merci, bon j'ai fait le changement. Par la façon dont, dans ce cas, c'est "Adj Fermer' et pas 'Adj Fermer".
'oups, vous avez raison! darn périodes.
Merci pour le partage. J'ai remarqué que l'utilisation de l'EMA, les résultats sont plus proches de ceux que je reçois à partir de yahoo finance, mais il y a quand même une certaine différence. Pourquoi est-ce qui se passe, à votre avis?
merci - je n'ai pas le temps de vérifier dans le détail, mais il est possible que la différence est due à ce que j'ai mentionné dans le post, à savoir qu'il y a de l'arbitraire causée par la quantité de données avant de comprendre à partir de la fenêtre que vous regardez, le cas échéant (j'ai donné 100 jours par exemple).
OriginalL'auteur
Ma réponse est testé sur StockCharts des données de l'échantillon.
[StockChart RSI info][1]http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:relative_strength_index_rsi
OriginalL'auteur
Moi aussi j'avais cette question et qui travaille en bas de la rolling_apply chemin qui Jev a pris. Cependant, quand j'ai testé mes résultats, ils n'ont pas le match contre le stock commercial de cartographie des programmes que j'utilise, comme StockCharts.com ou thinkorswim. J'ai donc fait quelques recherches et découvert que lorsque Welles Wilder créé le RSI, il a utilisé une technique de lissage désormais dénommée Wilder Lissage. Les services commerciaux au-dessus de l'utilisation Wilder Lissage plutôt que d'une moyenne mobile simple de calculer la moyenne des gains et des pertes.
Je suis nouveau sur Python (et les Pandas), alors je me demandais si il ya une façon brillante de refactoriser le pour boucle ci-dessous pour le rendre plus rapide. Peut-être que quelqu'un d'autre commentaire sur cette possibilité.
J'espère que vous trouverez ce utile.
Plus d'info ici.
les deltas = (prix-prix.maj(1)).fillna(0) AttributeError: 'liste' de l'objet n'a pas d'attribut 'shift'
OriginalL'auteur
Vous pouvez utiliser rolling_apply en combinaison avec un sous-fonction pour faire un nettoyage de la fonction comme ceci:
Le calcul fait beaucoup plus de sens que si vous l'exprimer en tant que ratio du gain total déplacer:
100 * (average_gain /(average_gain + average_loss))
. Au moins, c'est mon opinion.Oui, je vous remercie. Ce sera le retour de la même chose que cette réponse: stackoverflow.com/a/29400434/109941
OriginalL'auteur
OriginalL'auteur
Momentum_1D = Pt - P(t-1) où P est le prix de clôture et t est la date
OriginalL'auteur