2017-04-17 1 views
0

Étude de R (incluant les paquetages xts et quantmod). Il est mon jeu de données:R xts accès quantitatif aux données à un instant donné

str(h2) 
‘zoo’ series from 2016-06-15 11:00:00 to 2016-09-15 14:00:00 
    Data: num [1:928, 1:5] 67842 67486 67603 67465 67457 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:5] "X.OPEN." "X.HIGH." "X.LOW." "X.CLOSE." ... 
    Index: POSIXct[1:928], format: "2016-06-15 11:00:00" "2016-06-15 12:00:00" "2016-06-15 13:00:00" ... 

first(h2, '1 day') 
        X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
2016-06-15 11:00:00 67842 67842 67122 67488 262740 
2016-06-15 12:00:00 67486 67610 67420 67603 288875 
2016-06-15 13:00:00 67603 67608 67381 67466 323498 
2016-06-15 14:00:00 67465 67484 67356 67455 168991 
2016-06-15 15:00:00 67457 67460 67289 67361 174965 
2016-06-15 16:00:00 67363 67381 67202 67317 195579 
2016-06-15 17:00:00 67320 67465 67288 67397 230255 
2016-06-15 18:00:00 67397 67436 67084 67099 469379 
2016-06-15 19:00:00 67096 67198 66900 67058 264430 
2016-06-15 20:00:00 67040 67094 66944 67092 110503 
2016-06-15 21:00:00 67092 67158 66877 66992 83041 
2016-06-15 22:00:00 66993 67110 66680 66909 386905 
2016-06-15 23:00:00 66909 67269 66884 67126 143373 

dput(first(h2, '1 day')) 
structure(c(67842, 67486, 67603, 67465, 67457, 67363, 67320, 
67397, 67096, 67040, 67092, 66993, 66909, 67842, 67610, 67608, 
67484, 67460, 67381, 67465, 67436, 67198, 67094, 67158, 67110, 
67269, 67122, 67420, 67381, 67356, 67289, 67202, 67288, 67084, 
66900, 66944, 66877, 66680, 66884, 67488, 67603, 67466, 67455, 
67361, 67317, 67397, 67099, 67058, 67092, 66992, 66909, 67126, 
262740, 288875, 323498, 168991, 174965, 195579, 230255, 469379, 
264430, 110503, 83041, 386905, 143373), .Dim = c(13L, 5L), .Dimnames = list(
    NULL, c("X.OPEN.", "X.HIGH.", "X.LOW.", "X.CLOSE.", "X.VOL." 
    )), index = structure(c(1465977600, 1465981200, 1465984800, 
1465988400, 1465992000, 1465995600, 1465999200, 1466002800, 1466006400, 
1466010000, 1466013600, 1466017200, 1466020800), class = c("POSIXct", 
"POSIXt"), tzone = ""), class = "zoo") 

ne peux pas comprendre comment résoudre, par exemple, cette tâche - pour comparer le signe de la différence (X.CLOSE-X.OPEN) à 11h00 et la différence (X.CLOSE (13:00) -X.OPEN (12:00)) tous les jours inclus dans l'échantillon.
Pendant la résolution de ce problème, je vois 2 articles:
1). comment accéder aux données à un moment précis? C'est à dire. comment par exemple obtenir X.OPEN à 12:00 jour je choisis. J'essaie différentes combinaisons (voir le code ci-dessous) mais aucun résultat (seul le titre de l'ensemble de données)

h2["T11:00:00/12:00:00"] 
    X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
h2["2016-06-15 11:00:00 MSK"] 
    X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
x <- h2["2016-06-15 11:00:00 MSK"]  #'zoo' series (without observations) 
x 
    X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
h2["T12:00:00.000/T12:00:00.001"] 
    X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 

2). Auparavant, j'ai fait un algorithme similaire dans Excel et résoudre ce problème par bruteforce (vérification étape par étape). Mais R a des types de données vectorielles et il devrait être plus rapide et plus pratique de résoudre cette tâche.

+0

Bienvenue sur Stack Overflow! Assurez-vous que votre question contient un [exemple minimalement reproductible] (http://stackoverflow.com/a/5963610/2477097), ce qui facilitera la tâche des membres de la communauté. Dans ce cas, il serait utile d'afficher la sortie de 'dput (first (h2, '1 day'))'. De même, en général, évitez d'inclure des invites (par exemple '>') dans vos extraits de code, car cela empêche la possibilité de coller ce code dans une console à exécuter. Au lieu de cela, vous devez coller le code directement (pas d'invite) et commenter la sortie. –

+0

Merci pour vos notes Alexey! J'améliore ma question comme vous l'avez souligné. – Dmitry

Répondre

0

Pour obtenir des données à une heure spécifique à partir d'une série chronologique, utilisez window.

window(h2, start = as.POSIXct('2016-06-15 04:00'), end = as.POSIXct('2016-06-15 04:59')) 
#      X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
# 2016-06-15 04:00:00 67842 67842 67122 67488 262740 

window(h2, start = as.POSIXct('2016-06-15 06:00'), end = as.POSIXct('2016-06-15 08:00')) 
#      X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
# 2016-06-15 06:00:00 67603 67608 67381 67466 323498 
# 2016-06-15 07:00:00 67465 67484 67356 67455 168991 
# 2016-06-15 08:00:00 67457 67460 67289 67361 174965 

Vous pouvez également accéder par numéro de ligne.

h2[1,] 
#      X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
# 2016-06-15 04:00:00 67842 67842 67122 67488 262740 

h2[4:6,] 
#      X.OPEN. X.HIGH. X.LOW. X.CLOSE. X.VOL. 
# 2016-06-15 07:00:00 67465 67484 67356 67455 168991 
# 2016-06-15 08:00:00 67457 67460 67289 67361 174965 
# 2016-06-15 09:00:00 67363 67381 67202 67317 195579 

Pour prendre la différence entre X.CLOSE. et X.OPEN. à tout moment, vous pouvez faire ...

h2_diff <- h2[,'X.CLOSE.'] - h2[,'X.OPEN.'] 
# 2016-06-15 04:00:00 2016-06-15 05:00:00 2016-06-15 06:00:00 2016-06-15 07:00:00 
#    -354     117    -137     -10 
# 2016-06-15 08:00:00 2016-06-15 09:00:00 2016-06-15 10:00:00 2016-06-15 11:00:00 
#     -96     -46     77    -298 
# 2016-06-15 12:00:00 2016-06-15 13:00:00 2016-06-15 14:00:00 2016-06-15 15:00:00 
#     -38     52    -100     -84 
# 2016-06-15 16:00:00 
#     217 

Pour faire une différence décalée, vous pouvez utiliser la fonction lag.

h2[1:3,'X.CLOSE.'] 
# 2016-06-15 04:00:00 2016-06-15 05:00:00 2016-06-15 06:00:00 
#    67488    67603    67466 

lag(h2[1:3,'X.CLOSE.']) 
# 2016-06-15 04:00:00 2016-06-15 05:00:00 
#    67603    67466 

lag(h2[1:3,'X.CLOSE.'], -1) 
# 2016-06-15 05:00:00 2016-06-15 06:00:00 
#    67488    67603 

Donc, pour faire X.CLOSE(n) - X.OPEN(n - 1) ...

h2[,'X.CLOSE.'] - lag(h2[,'X.OPEN.'], -1) 
# 2016-06-15 05:00:00 2016-06-15 06:00:00 2016-06-15 07:00:00 2016-06-15 08:00:00 
#    -239     -20    -148    -104 
# 2016-06-15 09:00:00 2016-06-15 10:00:00 2016-06-15 11:00:00 2016-06-15 12:00:00 
#    -140     34    -221    -339 
# 2016-06-15 13:00:00 2016-06-15 14:00:00 2016-06-15 15:00:00 2016-06-15 16:00:00 
#     -4     -48    -183     133 
+0

Merci beaucoup Alexey! Si cela ne vous dérange pas, j'aimerais vous poser une autre question: comment puis-je obtenir des données à un moment déterminé par moi-même? Par exemple: comment puis-je obtenir X.OPEN à 12:00:00 de chaque jour? Merci beaucoup! – Dmitry

+0

Pour extraire des heures spécifiques, voir [cette question Stack Overflow] (http://stackoverflow.com/questions/16059965/plot-value-over-hour-of-day-with-xts-zoo-r). De plus, si j'ai répondu à votre question, veuillez accepter la réponse en cliquant sur la coche grise sous les flèches. Si vous avez trouvé la réponse utile, vous pouvez également l'augmenter en cliquant sur la flèche vers le haut. –

+0

Merci encore Alexey! Votre réponse m'a vraiment aidé – Dmitry