Расчет средней дневной доходности с помощью For-Loop - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь поместить свой сценарий в цикл For-Loop, чтобы рассчитать среднесуточный доход для нескольких акций.

Но при настройке цикла For-I я получаю следующую ошибку:

Ошибка в getSymbols (Symbols = stock, src = "yahoo", from = "2005-01-01",: необходимо использовать auto.assign = TRUE для нескольких запросов символов

Так что я удалил env = NULL и заменил его на auto.assign=TRUE, но когда я запускаю скрипт, в результате я получаю NaN.

Любой совет будет очень признателен. Спасибо.

install.packages('quantmod')
library(quantmod)

stock <- c("AAPL") 
{
stock.xts <- getSymbols(Symbols = stock, src = "yahoo", 
                       from = "2005-01-01",
                       to = "2019-09-10", 
                       env = NULL)

stock.xts <- as.data.frame(stock.xts)

N <- nrow(stock.xts)
todays.price <- stock.xts[2 : N,4]
yesterdays.price <- stock.xts[1 : N-1,4]
stock_dailyreturn <- (todays.price - yesterdays.price)/yesterdays.price
stock.xts$daily.return <- c(NA,(todays.price - yesterdays.price)/yesterdays.price)
print(mean(stock_dailyreturn)) 
}

с циклом For:

stock <- c("AAPL", "MSFT", "CRM", "ORCL", "NFLX", "GOOG")

for(i in 1:length(stock)){
  stock.xts <- getSymbols(Symbols = stock, src = "yahoo", 
                          from = "2005-01-01",
                          to = "2019-09-10",
                          auto.assign = TRUE)
  stock.xts <- as.data.frame(stock.xts)

  N <- nrow(stock.xts)
  todays.price <- as.numeric(stock.xts[2 : N,4])
  yesterdays.price <- as.numeric(stock.xts[1 : N-1,4])
  stock_dailyreturn <- (todays.price - yesterdays.price)/yesterdays.price
  stock.xts$daily.return <- c(NA,(todays.price - yesterdays.price)/yesterdays.price)
  print(mean(stock.xts$daily.return))
}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

ты был очень близко!Попробуйте вместо этого:

  • измените цикл for, чтобы он содержал индивидуальное значение в каждой итерации (см. Цикл for ниже)

  • обновите использование функции getSymbols, чтобы она автоматически присваивалась правильно (в противном случае по умолчанию используется значение NULL - обратитесь к документации для получения дополнительной информации)

  • используйте вектор-заполнитель для функции getSymbols для создания объектовв (я только что сказал это привет

Удачи!

stock <- c("AAPL","MSFT","CRM")

hello <- c()

for(value in stock){

stock.xts <- getSymbols(Symbols = value, src = "yahoo",
                    from = "2005-01-01",
                    to = "2019-09-10",
                    env = hello,
                    auto.assign=TRUE)
stock.xts <- as.data.frame(stock.xts)

N <- nrow(stock.xts)
todays.price <- stock.xts[2 : N,4]
yesterdays.price <- stock.xts[1 : N-1,4]
stock_dailyreturn <- (todays.price - yesterdays.price)/yesterdays.price
stock.xts$daily.return <- c(NA,(todays.price - yesterdays.price)/yesterdays.price)
print(mean(stock_dailyreturn))

}
0 голосов
/ 21 сентября 2019

Вся ваша проблема в последней строке кода, mean(stock.xts$daily.return), и в строке непосредственно перед ней.mean по умолчанию возвращает NA или NaN, если усредненный вектор содержит значение NA, stock.xts$daily.return <- c(NA, ....Это можно изменить, установив na.rm = TRUE в пределах среднего.

Однако ваш цикл может быть дополнительно уменьшен по сложности.Прежде всего, вы импортируете свои символы на каждой итерации.Это не нужно.Также вы можете использовать функции diff и lag, чтобы рассчитать доход с помощью diff(...)/lag(...).

Например, вы можете использовать что-то похожее на пример ниже:

library("quantmod")
stock <- c("AAPL", "MSFT", "CRM", "ORCL", "NFLX", "GOOG")
#Create a place to store the symbols
stockenv <- new.env()
stuff <- getSymbols(Symbols = stock, src = "yahoo", 
                   from = "2005-01-01",
                   to = "2019-09-10",
                   env = stockenv) #<=== note here, i import into the environment
ls(stockenv) #<== check that all the symbols were imported into the environemnt.
#[1] "AAPL" "CRM"  "GOOG" "MSFT" "NFLX" "ORCL"
priceChange <- vector("list", length(ls(stockenv)))
meanPrice <- vector("list", length(ls(stockenv)))
#overwrite names
names(priceChange) <- names(meanPrice) <- ls(stockenv)
for(i in ls(stockenv)){
    priceChange[[i]] <- diff(stockenv[[i]][,4]) / lag(stockenv[[i]][,4])
    meanPrice[[i]] <- mean(priceChange[[i]], na.rm = TRUE)
}
simplify2array(meanPrice)
#        AAPL          CRM         GOOG         MSFT         NFLX         ORCL 
#0.0012548717 0.0013114559 0.0008412977 0.0005783129 0.0019348552 0.0005236143
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...