Próbuję importować dane (podział) i mam problem. Nie ma problemu, jeśli wszystkie symbole zawierają podział. Gdy jeden z nich nie podzielił, jednak macierz ma kształt w inny sposób i źle.

Oto kody, których używam:

library(quantmod)

Tick <- c("AA","ARGO")

split_test <- Reduce(merge, lapply(Tick, function(x) {
  tryCatch({
    getSplits(x, from= "2016-01-04", to="2017-03-09", src="yahoo")
  }, error = function(e) {}
  )
}))

A wynik jest w porządku:

               AA.spl         ARGO.spl
2016-05-27     N/A            0.9091
2016-10-06     3.000            N/A
2016-11-01     0.801            N/A 

Problem polega na tym, że jeśli zaznacz obejmuje "A", który nie ma podziału, wynik jest zupełnie inny i źle:

Tick <- c("A","AA","ARGO")

     x     AA.spl         ARGO.spl
1    N/A    3.000         0.9091
2    N/A    0.801         0.9091

Daty nie są już wyświetlane, a wartość jest również błędna (powtórzenia tego samego numeru). Jak uzyskać wynik jak pierwszy, mimo że akcje nie ma podziału? Jeśli jest to możliwe, chcę "a" jest właśnie pokazany jako n / jak:

             A.spl       AA.spl         ARGO.spl
2016-05-27   N/A          N/A            0.9091
2016-10-06   N/A         3.000            N/A
2016-11-01   N/A         0.801            N/A 

Getdivendy

Tick <- c("A","AA","AADR","AAN","AAP","AAT")

Test <-
  lapply(Tick,
         function(x) {
           try(getDividends(x, from= "2016-01-04", to="2016-03-15", src="yahoo"),
               silent = TRUE)
         })
names(Test) <- Tick

# convert NA to xts object with date < 1900
Test <-
  lapply(Test,
         function(x) {
           if (identical(x, NA)) xts(NA, .Date(-4e4)) else x
         })

# merge and remove pre-1900 date
Test <- Reduce(merge, Test)["1900/"]
0
Dongchul Park 22 październik 2020, 12:06

1 odpowiedź

Najlepsza odpowiedź

getSplits() Właśnie wraca NA dla obiektu "A", a nie obiekt XTS. A "A" jest najpierw w twoim Tick, więc metodę merge() dla obiektów XTS nie jest nazywany (z powodu sposobów pracy Methets S3).

Możesz użyć cbind() zamiast merge(), ponieważ metoda wysyłki dla cbind() działa różni się. Ale nie sugerowałem tego rozwiązania, ponieważ prawdopodobnie nie pamiętasz, że subtelna różnica między dwoma funkcjami.

Zamiast tego przygotowałbym listę podziałów przed połączeniem.

split_test <-
  lapply(Tick,
         function(x) {
           try(getSplits(x, from= "2016-01-04", to="2017-03-09", src="yahoo"),
               silent = TRUE)
         })
names(split_test) <- Tick

# convert NA to xts object with date < 1900
split_test <-
  lapply(split_test,
         function(x) {
           if (identical(x, NA)) xts(NA, .Date(-4e4)) else x
         })

# merge and remove pre-1900 date
split_test <- Reduce(merge, split_test)["1900/"]
# set names
names(split_test) <- Tick

split_test
##               AA  A      ARGO
## 2016-05-27    NA NA 0.9090909
## 2016-10-06 3.000 NA        NA
## 2016-11-01 0.801 NA        NA

Kod sprawdza elementy listy, które są tylko NA, i zastępują NA za pomocą obiektu XTS, który ma indeks daty przed 1900 r. Data ta będzie łatwa do zidentyfikowania w wyjściu.

Następnie łączymy wszystkie elementy listy razem za pomocą Reduce(), jak ty. I ustawić nazwy do wektora Tick, więc kolumna, która nie miała żadnych danych, ma prawidłową nazwę Tickera.


Aktualizacja dla getDividends(), ponieważ zwraca obiekt zero-szerokości XTS, gdy nie ma dywidend, nie jak jak getSplits(). Możemy dodać kolejny czek do funkcji, który dostosowuje obiekty XTS za pomocą Na.

Przenieśmy to do funkcji, ponieważ potrzebujesz go w więcej niż jednym miejscu. Możemy dodać inny stan do oświadczenia {x0}}.

fill_missing <-
function(x)
{
    y <- x
    if (identical(x, NA) || length(x) < 1) {
        y <- xts(NA, .Date(-4e4))
    }
    y
}

Teraz użyj tej funkcji w wywołaniu lapply() i wykonaj to samo wywołanie Reduce(). Następnie możesz ponownie ustawić nazwy, jeśli chcesz.

Test <- lapply(Test, fill_missing)
out <- Reduce(merge, Test)["1900/"]
out <- out[,Tick]
1
Joshua Ulrich 31 październik 2020, 17:21