Рассчитать ежемесячные доходы от данных - PullRequest
0 голосов
/ 20 марта 2019

Меня попросили вычислить коэффициент Джини (дисперсию весов распределения) в 18 отраслевых ETF с историческими данными, доступными с 2000 года. Вот выдержка:

> head(df)
        Date  .SXQR  .SXTR  .SXNR  .SXMR  .SXAR  .SX3R  .SX6R  .SXFR  .SXOR  .SXDR
1 2000-01-03 364.94 223.93 489.04 586.38 306.56 246.81 385.36 403.82 283.78 455.39
2 2000-01-04 345.04 218.90 474.05 566.15 301.13 239.24 374.64 390.41 275.93 434.92
3 2000-01-05 338.22 215.88 464.20 542.29 298.22 239.55 373.26 383.48 272.54 430.05
4 2000-01-06 343.13 218.18 470.82 529.33 300.69 249.75 377.26 383.48 272.47 434.15
5 2000-01-07 349.46 220.10 478.87 531.65 306.50 255.17 381.19 390.23 273.76 447.02
6 2000-01-10 356.20 223.01 484.07 581.82 310.84 252.75 387.74 393.75 278.76 453.80

Если вы знаете более простой способсделай это, чем моя попытка, я был бы рад услышать это!

Моя попытка

Я знаю, что индекс G равен Enter the description of the image here

, где E - среднее значение всех отклонений по абсолютной величине для всех пар исследуемой статистической переменной:

enter the description of the image here

И М - это средний доход:

introducir la descripción de la imagen aquí

Еще при вычислении среднего значения portfolio_monthly_returns, M У меня есть эта ошибка: argument is not numeric or logical: returning NA.

По идее друга я создаю portfolio_monthly_returns с:

library(quantmod)
portfolio_monthly_returns=lapply(xts(df[,-1],order.by = df$Date),monthlyReturn) # What is monthlyReturn here ?

Я не понимаю этогокод, и это действительно выглядит странно:

enter image description here

> mean(portfolio_monthly_returns)
[1] NA
Warning message:
In mean.default(portfolio_monthly_returns) :
  argument is not numeric or logical: returning NA

Данные

Файл данных здесь .

Чтобы получить df:

library (dplyr)
library (lubridate)
   
df <- read.xlsx ("Data.xlsx", sheet = "Sector-STOXX600", startRow = 2, colNames = TRUE, detectDates = TRUE, skipEmptyRows = FALSE)
df [2:19] <- data.matrix (df [2:19])

Замечание

Я не знаю, почему это не связано с весами:

cov = cor(NewData)
# ERC algorithm
Sigma = cov
w = optimalPortfolio(Sigma = Sigma,control = list(type = 'erc', constraint = 'lo'))

w = matrix(w, 1, 18)
(Sigma %*% t(w)) * c(w)

1 Ответ

0 голосов
/ 20 марта 2019

Я предполагаю, что вы рассчитываете G для каждого столбца df. В этом случае эта функция, примененная к каждому столбцу df, даст вам G при условии, что ваши уравнения для E и M - это именно то, что вы хотите, и что x k являются элементами столбца:

gini_calc <- function (x) {
    #Strip out NA elements
    x_no_na <- x[!is.na(x)]

    #This matrix calculation gives a matrix of all differences of the elements, after which E and M can be calculated
    mat <- matrix(rep(x_no_na, length(x_no_na)), ncol=length(x_no_na))
    E <- sum(abs(mat-t(mat)))/length(x_no_na)^2
    M <- mean(x_no_na)

    #Return G
    return(E/(2*M))
}

Отсюда вы можете просто использовать lapply на df. Это предполагает, что вы не хотите включать NA в любой из расчетов.

Я бы удостоверился, что эта функция делает именно то, что вы хотите. Мне непонятно, почему вы используете monthlyReturn и такие.

...