我使用了以下代码:
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
可能是什么问题?先谢谢了!
此行为是预期的,因为对 xts 对象的算术和逻辑运算是在具有相同日期的观察上完成的。
您应该使用
lag()
函数来更改日期时间索引对齐方式。 log(stkdata / lag(stkdata))
.
请注意,在加载 dplyr 的情况下使用lag()
时必须
非常小心。它打破了 base R 的
lag()
函数应该如何工作,这打破了 lag(my_xts)
。它还会在所有其他类型的对象上破坏 lag()
具有自己的 lag()
方法(例如动物园)。
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))
使用
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()