R: нахождение среднегодовой доходности в R

#r

#r

Вопрос:

* Привет. У меня есть задание, в котором задается следующий вопрос: найдите среднюю годовую доходность для данных. Имеющиеся у меня данные состоят из ежемесячных доходов с 1981-01 по 2019-12 годы. Я несколько часов пытался найти формулу / код, который может помочь мне найти среднюю годовую доходность, но я нахожу только информацию о других типах годовой доходности. У вас, ребята, есть какие-нибудь предложения?«

Комментарии:

1. Не могли бы вы dput() данные и скопировать вставить в свой пост?

2. Никогда не делал этого раньше, но я могу попытаться дать лучшее объяснение проблемы. Я импортировал данные, состоящие из ежемесячных арифметических доходностей для акций Apple. Первая задача требует, чтобы я преобразовал доходность в логарифмическую доходность, что было легко сделать. Следующая задача требует, чтобы я вычислял (за каждый год) среднюю доходность и стандартное отклонение. Я не понимаю, как я должен заставить R понять, что он должен создавать новый столбец со средней годовой доходностью за каждый год.

Ответ №1:

Не уверен, что вы уже пробовали или какую библиотеку вы использовали, пожалуйста, посмотрите, подходит ли вам приведенное ниже:

 > library(quantmod)
> getSymbols("AAPL", from = '2019-01-01', to = '2019-12-31')
[1] "AAPL"
> apple <- data.frame(AAPL)
> head(apple)
           AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
2019-01-02   38.7225   39.7125  38.5575    39.4800   148158800      38.62910
2019-01-03   35.9950   36.4300  35.5000    35.5475   365248800      34.78135
2019-01-04   36.1325   37.1375  35.9500    37.0650   234428400      36.26614
2019-01-07   37.1750   37.2075  36.4750    36.9825   219111200      36.18543
2019-01-08   37.3900   37.9550  37.1300    37.6875   164101200      36.87523
2019-01-09   37.8225   38.6325  37.4075    38.3275   180396400      37.50143
> apple_adj <- apple['AAPL.Adjusted']
> head(apple_adj)
           AAPL.Adjusted
2019-01-02      38.62910
2019-01-03      34.78135
2019-01-04      36.26614
2019-01-07      36.18543
2019-01-08      36.87523
2019-01-09      37.50143
> apple_adj$apple_daily_return <- ROC(apple_adj$AAPL.Adjusted, type = 'discrete')
> head(apple_adj)
           AAPL.Adjusted apple_daily_return
2019-01-02      38.62910                 NA
2019-01-03      34.78135        -0.09960740
2019-01-04      36.26614         0.04268928
2019-01-07      36.18543        -0.00222563
2019-01-08      36.87523         0.01906292
2019-01-09      37.50143         0.01698173
  

Вы можете рассчитать доходность отсюда.

Ответ №2:

что насчет этого? (не проверено)

 library(quantmod)
library(PerformanceAnalytics)
library(data.table)
getSymbols("AAPL", from = '2010-01-01', to = '2019-12-31')
monthly <- to.monthly(AAPL, indexAt = "last", OHLC = FALSE)
monthly_returns <- Return.calculate(monthly, method = "log")
yearly_mean <- apply.yearly(monthly_returns, mean)
yearly_mean$Annu <- (yearly_mean$AAPL.Adjusted   1)^12 - 1
  

Комментарии:

1. Поскольку у меня уже был месячный доход, и мне приходилось иметь дело с данными, которые у меня уже есть, я попытался использовать ваши 2 последние строки кода, чтобы найти среднее значение за год. Я получаю сообщение об ошибке «Должно быть либо xts-принудительным, либо основанным на времени». Похоже, мне нужно преобразовать свои данные в xts. Вы в конечном итоге знаете, как это сделать?

2. было бы проще, если бы вы поделились некоторыми образцами данных с dput (). поскольку у меня нет данных, я не могу решить напрямую ваш pb, но я думаю, что as.xts (mydf) может работать?

Ответ №3:

Среднегодовой доход — это всего лишь среднее значение ежедневных доходов, т.Е. С помощью простого group_by year и summarise означает, что вы можете легко получить результаты

 library(quantmod)
library(tidyverse)
getSymbols("AAPL", from = '1981-01-01', to = '2019-12-31',  periodicity = 'monthly')
apple <- data.frame( AAPL )

apple %>% rownames_to_column %>% mutate(Year = format(as.Date(rowname),'%Y'), monthly_returns=  lag( AAPL.Adjusted)/AAPL.Adjusted - 1 ) %>% group_by(Year) %>% summarise(annual = mean(monthly_returns, na.rm=T))
# A tibble: 39 x 2
   Year    annual
   <chr>    <dbl>
 1 1981   0.0383 
 2 1982  -0.0131 
 3 1983   0.0430 
 4 1984  -0.0104 
 5 1985   0.0295 
 6 1986  -0.0448 
 7 1987  -0.0403 
 8 1988   0.00526
 9 1989   0.0164 
10 1990  -0.0101 
# … with 29 more rows
  

Комментарии:

1. Я понимаю ваш пример. Но в этом случае мне уже были предоставлены ежемесячные доходы от импортированного набора данных. Я не совсем понимаю, как заставить R понять, что он должен вычислять среднегодовую доходность за каждый год и составлять столбец.

2. @123321 просто измените ежедневный на ежемесячный