2011-10-14 3 views
4

J'ai un tableau OHLC de cotations boursières que je veux traiter.Tâche R simple: diviser les colonnes spécifiées par 1000 aux lignes spécifiées

   Open  High  Low  Close   Volume 
2003-01-05 6111.01 6145.00 6102.70 6145.00   956 
2003-01-08 6145.00 6190.00 5960.00 6135.05  8771 
2003-01-09 6120.01 6250.00 6120.00 6225.00  10579 
2003-01-10 6240.00 6285.00 6225.10 6261.00  8882 
2003-01-13 6231.00 6325.00 6231.00 6270.00  8015 
2003-01-14 6279.00 6295.00 6180.01 6190.00  8461 

La société a fait une scission @ date donnée, donc je dois diviser tous ouverts, haut, bas, colonnes proches avant cette date par 1000. Comme j'apprends les bases de R maintenant je veux trouver belle R solution pour cette tâche. Le meilleur morceau de code que j'ai réussi à code (cant savoir comment appliquer à Col. données, Stock $ Ouvert ne fonctionne pas):

apply(stock, 2, function(stock) stock/((index(stock)<"2007-07-20")*1000)) 

Cependant, les résultats sont étranges, beaucoup d'entre eux sont inf:

2006-10-26  Inf  Inf  Inf  Inf   Inf 
2006-10-27  Inf  Inf  Inf  Inf   Inf 
2006-10-30  Inf  Inf  Inf  Inf   Inf 
2006-10-31  Inf  Inf  Inf  Inf   Inf 
2006-11-01  Inf  Inf  Inf  Inf   Inf 
2006-11-02  Inf  Inf  Inf  Inf   Inf 
2006-11-03  Inf  Inf  Inf  Inf   Inf 
2006-11-07  Inf  Inf  Inf  Inf   Inf 

Merci beaucoup d'avance!

+0

Merci à tous pour votre aide! Mon problème a été résolu 20 minutes après l'affichage! –

Répondre

2

Je ne suis pas familier avec OHLC array s, mais en supposant que la méthode d'index fonctionne:

relevantRows<-index(stock) < "2007-07-20" 

Une fois que vous avez un vecteur tenant toutes les lignes pertinentes (en fait un vecteur logique qui est vrai pour la les lignes qui doivent être changées), vous pouvez probablement utiliser simplement comme ceci:

stock$Open[relevantRows]<-stock$Open[relevantRows]/1000 

Il est possible (en fonction des éléments internes de OHLC array s), que même cela fonctionne:

+1

Merci @Nick, votre solution correspond parfaitement à mes besoins! Vous m'avez sauvé des heures, peut-être des jours de lutte! Je te dois une bière, mec. MERCI!!! R est une belle langue, mais il est parfois difficile d'avancer sans conseil. –

+0

Attention là, mec: vous venez de dire à un belge que vous lui devez de la bière. Mais sérieusement: passer du temps dans la sous-estimation souvent [Introduction à R] (http://cran.r-project.org/doc/manuals/R-intro.pdf). Tous les principes que j'ai utilisés dans ma réponse sont présents dans ce document. Je sais que cela m'a beaucoup amené sur la bonne voie et préparé pour des choses plus avancées! –

+0

Merci encore, @ Nick, je vais certainement passer par ce guide. Et j'ai trouvé une autre façon de spécifier un filtre de date. Peut-être que ce n'est pas applicable partout, mais fonctionne dans mon cas (objet xts) 'stock [" :: 2007-07-19 ", c (" Open "," High "," Low "," Close ")] <- stock [":: 2007-07-19", c ("Ouvert", "Haut", "Bas", "Fermer")]/splitRatio' –

2

Si la date n'est pas antérieure au 20/7/2007, alors (index(stock)<"2007-07-20") est FALSE et donc (index(stock)<"2007-07-20")*1000 est égal à zéro. Vos valeurs Inf sont le résultat d'une division par zéro.

Vous pouvez essayer ceci:

stock[index(stock) < "2007-07-20", -5] <- stock[index(stock) < "2007-07-20", -5]/1000 
+0

Merci @Pete pour m'avoir indiqué cette erreur idiote, j'ai vraiment oublié je peux 't diviser par zéro: -0 –

1

Vous pouvez utiliser la fonction adjRatios dans le package TTR pour le faire. Il semble que vous avez déjà un objet XTS, de sorte que ce que je l'utilise:

library(quantmod) 
x <- structure(c(6111.01, 6145, 6120.01, 6240, 6231, 6279, 6145, 6190, 
6250, 6285, 6325, 6295, 6102.7, 5960, 6120, 6225.1, 6231, 6180.01, 
6145, 6135.05, 6225, 6261, 6270, 6190, 956, 8771, 10579, 8882, 
8015, 8461), .Dim = c(6L, 5L), .Dimnames = list(NULL, c("Open", 
"High", "Low", "Close", "Volume")), index = structure(c(1041746400, 
1042005600, 1042092000, 1042178400, 1042437600, 1042524000), tzone = "", 
tclass = "Date"), class = c("xts", "zoo"), .indexCLASS = "Date", .indexTZ = "") 
s <- xts(1/1000,as.Date("2003-01-10")) 
r <- adjRatios(s,,Cl(x)) 
OHLC(x) * drop(r[,"Split"]) * drop(r[,"Div"]) 

Si vous utilisez des données de Yahoo Finance, vous pouvez utiliser la fonction adjustOHLC dans quantmod pour tirer séparer automatiquement et les données des dividendes de Yahoo et ajuster la série. Voir ?adjustOHLC pour plus d'options.

+0

Joshua, ses données du fournisseur de titres russes finam.ru, j'utilise rusquant, c'est un lib basé sur quantmod pour aller chercher des données sur les stocks russes. Je joue également avec les données de Yahoo, donc va vérifier la fonction adjustOHLC, semble intéressant pour moi. Merci. –

Questions connexes