R: Странное поведение с объектами XTS - PullRequest
0 голосов
/ 13 мая 2018

РЕДАКТИРОВАТЬ (1): это sessionInfo ():

> sessionInfo()
R version 3.4.2 (2017-09-28)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 17134)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils    
[5] datasets  methods   base     

other attached packages:
 [1] FSVBackTest_0.0.0.9000       
 [2] blotter_0.14.2               
 [3] FSVTradingRules_0.0.0.9000   
 [4] FinancialInstrument_1.2.0    
 [5] quantmod_0.4-13.1            
 [6] FSVIndicators_0.0.0.9000     
 [7] roxygen2_6.0.1               
 [8] dlm_1.1-4                    
 [9] PerformanceAnalytics_1.4.3541
[10] xts_0.10-2.1                 
[11] zoo_1.8-2                    
[12] TTR_0.23-2                   
[13] FSVPositionSizing_0.0.0.9000 
[14] FSVDataCheck_0.0.0.9000      
[15] RevoUtils_10.0.6             
[16] RevoUtilsMath_10.0.1         

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.13     xml2_1.1.1      
 [3] magrittr_1.5     rtvs_1.0.0.0    
 [5] lattice_0.20-35  R6_2.2.0        
 [7] foreach_1.4.4    stringr_1.2.0   
 [9] tools_3.4.2      grid_3.4.2      
[11] iterators_1.0.8  commonmark_1.4  
[13] codetools_0.2-15 curl_3.0        
[15] stringi_1.1.5    compiler_3.4.2  
[17] boot_1.3-20    

EDIT (2): Чтобы сделать это полностью воспроизводимым (надеюсь), я создал новую библиотеку (называемую DUMMY), добавил xts (0.10-2.1) в качестве единственной зависимости, добавил файл IBM.RData из github blotter repo как ТОЛЬКО файл (.R, .Rdata, .Rda или другой), перезапустил R, загрузил ТОЛЬКО эту библиотеку в глобальную среду, я получаю следующую sessionInfo ():

> sessionInfo()
R version 3.4.2 (2017-09-28)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 17134)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

other attached packages:
[1] DUMMY_0.0.0.9000     xts_0.10-2.1         zoo_1.8-2           
[4] RevoUtils_10.0.6     RevoUtilsMath_10.0.1

loaded via a namespace (and not attached):
[1] compiler_3.4.2  grid_3.4.2      rtvs_1.0.0.0   
[4] lattice_0.20-35

Мой файл DESCRIPTION выглядит так:

Package: DUMMY
Title: What the Package Does (one line, title case)
Version: 0.0.0.9000
Authors@R: person("First", "Last", email = "first.last@example.com", role = c("aut", "cre"))
Description: What the package does (one paragraph).
Depends: R (>= 3.4.2),
         xts (>= 0.10-2.1)
License: What license is it under?
Encoding: UTF-8
LazyData: true
RoxygenNote: 6.0.1

Теперь, когда я вызываю определенные строки объекта IBM xts, я получаю

> class(IBM)
[1] "xts" "zoo"
> IBM[1,]
     IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
> IBM[21,]
     IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
> IBM[20,]
     IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
> IBM[2,]
     IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted

ОРИГИНАЛЬНЫЙ ВОПРОС:

Внезапно мне кажется, что я наблюдаю странное поведение с объектами xts, и это приводит к тому, что функции блоттера (и quantstrat) перестают работать правильно. Даже демонстрации терпят неудачу. Для справки я использую xts_0.10-2.1, blotter_0.14.2 & zoo_1.8-2. Если я использую внутренние данные из блоттера для IBM, ссылка на первую строку IBM дает имена столбцов, а не первую строку данных о ценах IBM.

> IBM[1,]
 IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume
 IBM.Adjusted

для справки,

> dim(IBM)
[1] 21  6

Чтобы получить первую строку данных о ценах IBM, мне нужно сослаться на первые две строки объекта xts.

> IBM[1:2,]
                IBM.Open IBM.High IBM.Low IBM.Close
2007-01-03 22:00:00    97.25    98.79   96.88     98.31
                IBM.Volume IBM.Adjusted
2007-01-03 22:00:00   10524500        94.76

Когда я пытаюсь сослаться на последнюю строку данных IBM, я получаю

> IBM[nrow(IBM), ]
 IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume
 IBM.Adjusted

Если я попытаюсь сослаться на последние две строки данных IBM

> IBM[20:21,]
                IBM.Open IBM.High IBM.Low IBM.Close
2007-01-31 22:00:00    98.97    99.18   97.96        99
                IBM.Volume IBM.Adjusted
2007-01-31 22:00:00    6610700        95.43

Если я попытаюсь использовать хвост,

> tail(IBM, 2)
                IBM.Open IBM.High IBM.Low IBM.Close
2007-01-31 22:00:00    98.97    99.18   97.96        99
                IBM.Volume IBM.Adjusted
2007-01-31 22:00:00    6610700        95.43

Когда я пытаюсь запустить демо amzn_test из blotter,

> demo(package = "blotter")
> demo("amzn_test")

Type  <Return>   to start : 

    demo(amzn_test)
    ---- ~~~~~~~~~



> require(blotter)

> # Remove portfolio and account data if run previously
> try(rm("portfolio.amzn_port","account.amzn_acct",pos=.blotter), silent = TRUE)

> # load the example data
> data("amzn")

> currency("USD")
[1] "USD"

> stock("amzn",currency="USD",multiplier=1)
[1] "amzn"

> # Initialize the Portfolio
> initPortf("amzn_port",symbols="amzn",initDate="2010-01-14")
[1] "amzn_port"

> initAcct("amzn_acct",portfolios="amzn_port",initDate="2010-01-14", initEq=10000)
[1] "amzn_acct"

> # look at the transactions data
> amzn.trades
                    TxnPrice TxnQty
2010-01-14 07:18:50   127.49   -400
2010-01-14 07:18:53   127.49    400
2010-01-14 07:21:50   127.26   -300
2010-01-14 07:21:53   127.26    300
2010-01-14 07:23:07   127.17    100
2010-01-14 07:23:10   127.19   -100
2010-01-14 07:37:56   127.12   -400
2010-01-14 07:37:59   127.12    400
2010-01-14 07:38:32   127.23   -500
2010-01-14 07:38:35   127.23    500
2010-01-14 07:38:37   127.27    300
2010-01-14 07:38:40   127.30   -300
2010-01-14 07:46:08   126.95  -1300
2010-01-14 07:46:11   126.95   1300

> # Add the transactions to the portfolio
> blotter:::addTxns("amzn_port","amzn",TxnData=amzn.trades,verbose=TRUE)
Error in if (TxnDate < lastTxnDate) { : argument is of length zero
In addition: Warning messages:
1: In rm("portfolio.amzn_port", "account.amzn_acct", pos = .blotter) :
  object 'portfolio.amzn_port' not found
2: In rm("portfolio.amzn_port", "account.amzn_acct", pos = .blotter) :
  object 'account.amzn_acct' not found
> 

Я предполагаю, что эта ошибка происходит, потому что ссылка на последнюю строку данных (откуда берется lastTxnDate) дает имена столбцов, а не последнюю строку данных, из которой index () даст нам дату. Кто-нибудь еще видел это? Это только начало происходить в последние несколько дней, поэтому очень недавний выпуск. Спасибо за вашу помощь!

...