为什么使用 Quantmod 每天返回全零?

问题描述 投票:0回答:3

我使用了以下代码:

getSymbols(c("TSLA", "AAPL", "CSCO", "IBM"))
tsla<-TSLA['2022-01-03::2023-01-03']
aapl=AAPL['2022-01-03::2023-01-03']
csco=CSCO['2022-01-03::2023-01-03']
ibm=IBM['2022-01-03::2023-01-03']

tsla<-tsla$TSLA.Adjusted
aapl<-aapl$AAPL.Adjusted
csco<-csco$CSCO.Adjusted
ibm<-ibm$IBM.Adjusted
stkdata=cbind(tsla, aapl, csco, ibm)

n<-length(stkdata[,1])
rets<-log(stkdata[2:n,]/stkdata[1:(n-1),])

它产生全零。

我将stkdata[2:n]赋给x,stkdata[1:n-1]赋给y后,R显示

x[1,]

           TSLA.Adjusted AAPL.Adjusted CSCO.Adjusted IBM.Adjusted
2022-01-04      383.1967      178.3907      59.26239     129.9028

y[1,]

           TSLA.Adjusted AAPL.Adjusted CSCO.Adjusted IBM.Adjusted
2022-01-03      399.9267      180.6839      60.75242     128.0392

这很好。但是

x[1,]/y[1,]

Data:
numeric(0)

Index:
Date of length 0

可能是什么问题?先谢谢了!

r xts quantmod
3个回答
0
投票

此行为是预期的,因为对 xts 对象的算术和逻辑运算是在具有相同日期的观察上完成的。

您应该使用

lag()
函数来更改日期时间索引对齐方式。
log(stkdata / lag(stkdata))
.

请注意,在加载 dplyr 的情况下使用lag() 时必须

非常
小心。它打破了 base R 的
lag()
函数应该如何工作,这打破了
lag(my_xts)
。它还会在所有其他类型的对象上破坏
lag()
具有自己的
lag()
方法(例如动物园)。


0
投票

getSymbols
可以将结果放入本地环境中,然后我们可以使用
eapply
迭代其元素。然后使用
diff
arithmetic=FALSE
导致
diff
执行除法而不是减法。

xts 对象不是按位置组合而是按时间组合。删除 xts 对象的第一个或最后一个元素不会改变时间,因此问题中的代码将

stkdata
除以自身,除了末尾的位置已被删除。

试试下面的代码。

library(quantmod)

tickers <- c("TSLA", "AAPL", "CSCO", "IBM")
getSymbols(tickers, env = e <- new.env())
stks <- do.call("merge", eapply(e, Ad))['2022-01-03::2023-01-03']
rets <- log(diff(stks, arithmetic = FALSE))

-2
投票

使用

tidyquant
,您可以这样计算每日对数收益:

library(tidyquant)
library(tidyverse)

df = tq_get(c("TSLA", "AAPL", "CSCO", "IBM"),
         from = "2022-01-03",
         to = "2023-01-04")

log_return = df %>% 
  group_by(symbol) %>% 
  tq_mutate(select = adjusted, 
            mutate_fun = periodReturn, 
            period = "daily", 
            type = "log", 
            col_rename = "log_returns") 

# A tibble: 1,008 × 9
# Groups:   symbol [4]
   symbol date        open  high   low close    volume adjusted log_returns
   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>     <dbl>    <dbl>       <dbl>
 1 TSLA   2022-01-03  383.  400.  379.  400. 103931400     400.     0      
 2 TSLA   2022-01-04  397.  403.  374.  383. 100248300     383.    -0.0427 
 3 TSLA   2022-01-05  382.  390.  360.  363.  80119800     363.    -0.0550 
 4 TSLA   2022-01-06  359   363.  340.  355.  90336600     355.    -0.0218 
 5 TSLA   2022-01-07  360.  360.  337.  342.  84164700     342.    -0.0361 
 6 TSLA   2022-01-10  333.  353.  327.  353.  91815000     353.     0.0299 
 7 TSLA   2022-01-11  351.  359.  346.  355.  66063300     355.     0.00592
 8 TSLA   2022-01-12  360.  372.  358.  369.  83739000     369.     0.0385 
 9 TSLA   2022-01-13  370.  372.  342.  344.  97209900     344.    -0.0699 
10 TSLA   2022-01-14  340.  351.  338.  350.  72924300     350.     0.0173 
# … with 998 more rows
# ℹ Use `print(n = ...)` to see more rows

绘图

log_return %>% 
  ggplot() + 
  aes(x = date, y = log_returns, col = symbol) + 
  geom_line() + 
  facet_wrap(~ symbol) + 
  theme_tq()

© www.soinside.com 2019 - 2024. All rights reserved.