Need Help for a project on indexing

I need to calculate daily DAX index returns with 10 constituants.
Need it for 3 indizes: price weighted, value weighted and equally weighted.
Does any one has any advice?

Hi,

You need to provide us a more detailed example with some real data in order to understand what exactly it is you like.

Grtz

This post was flagged by the community and is temporarily hidden.

What have you tried so far? what is your specific problem?, we are more inclined towards helping you with specific coding problems rather than doing your work for you.

Could you please turn this into a self-contained REPRoducible EXample (reprex)? A reprex makes it much easier for others to understand your issue and figure out how to help.

If you've never heard of a reprex before, you might want to start by reading this FAQ:

What I have so far is how to compute the discrete returns for 1 security and how to do a simple plot on it however what I do not understand is the part with "daily index returns based on the weighting schemes".

How is it even possible to compute those 3 indices in a R code. I know that once I have the value index I can use it to generate the equal weighted index but I am a confused on how to implement the formulas into the code.

  • For price weighted, it is the stock/sum of all stocks but this not possible of I want to have an development, then I thought that if it is for a longer period, then it is the sum of all prices for that time frame / by the numbers of stocks, but I am a bit lost on how to put it in R

  • For value weighted, I only have it for 1 day, the weights of my securities based on their market value.

.For equal weighted, I have nothing yet.

Hi,

Again, please provide data and code in a format shown by @andresrcs post above. We might be able to help you with the coding part, as that is the goal of this forum, but you can't expect us to know how stock market calculations work (which is besides the point anyway).

So, create a (fake) data set and provide the script where all the functions for the calculations you need are present, and then let us know where in the code it goes wrong or you're stuck.

This is an example how you can create fake data, by using the variable names you'd use in your real code and values of the correct class:

myData = data.frame(id = 1:100, index = runif(100, 0,1), group = sample(LETTERS, 100, replace = T))

Success,
PJ

2 Likes

Ok.
I did the following code:


if(!require("quantmod")) {install.packages("quantmod"); require("quantmod")}

# Define Start and end dates #########
DStart <-  "2007-12-31"  #define start data for getting the data
today <- "2019-03-31" # write current date (from system) in variable today
today
DEnd <-  today # end data should be today
DAX <-  getSymbols("^GDAXI", src="yahoo", from=DStart, to=DEnd, quote="Close", compression="m",auto.assign=FALSE) 
TickersDAX=c('BEI.DE','ADS.DE','DBK.DE','DAI.DE','DB1.DE','BMW.DE','ALV.DE','BAYN.DE','CON.DE','BAS.DE', "^GDAXI")

#Name list of current constituencies of DAX index (as of 01.04.2019)  
NamesDAX = c('Beiersdorf','Adidas','Deutsche Bank','Daimler','Deutsche Boerse','BMW',
             'Allianz','Bayer','Continental','BASF', "DAX Index")
#Define time period for which DAX data should be downloaded
#Start date
DStart="2007-12-31"
#End date should be current date
#Get current date 'today'
today <- "2019-03-31"
today
DEnd=today  
#Create a list that contains data for all stocks
getSymbols(TickersDAX, from=DStart, to=DEnd, warnings=F) 
# Open, High, Low,  Close, Volume and Adjusted for every stock 
# are saved in a variable

#List that contains data for all stocks
Ticker_list <- list(BEI.DE,ADS.DE,DBK.DE,DAI.DE,DB1.DE,BMW.DE,ALV.DE,BAYN.DE,CON.DE,BAS.DE,GDAXI)

head(Ticker_list)

DAXClosing = merge((ADS.DE[,6]),(ALV.DE[,6]),(BAS.DE[,6]),(BAYN.DE[,6]),(BEI.DE[,6]),(BMW.DE[,6]),(CON.DE[,6]),(DAI.DE[,6]),(DB1.DE[,6]),(DBK.DE[,6]))

head(DAXClosing)
tail(DAXClosing)

sum(is.na(DAXClosing))


names(DAXClosing) = c("Adidas","Allianz","BASF", "Bayer","Beiersdorf","BMW","Continental", "Daimler", "Deutsche Boerse","Deutsche Bank") #rename columns of the data
head(DAXClosing)


# "lag" function returns previous observation for each point
lag(DAXClosing[,1])
lag(DAXClosing[,2])
lag(DAXClosing[,3])
lag(DAXClosing[,4])
lag(DAXClosing[,5])
lag(DAXClosing[,6])
lag(DAXClosing[,7])
lag(DAXClosing[,8])
lag(DAXClosing[,9])
lag(DAXClosing[,10])


# Computing discrete returns ############# 
# R[t]=P[t]/P[t-1]-1   
DAX_ClosingReturns1 <- (DAXClosing[,1]/lag(DAXClosing[,1]))-1 
DAX_ClosingReturns2 <- (DAXClosing[,2]/lag(DAXClosing[,2]))-1 
DAX_ClosingReturns3 <- (DAXClosing[,3]/lag(DAXClosing[,3]))-1 
DAX_ClosingReturns4 <- (DAXClosing[,4]/lag(DAXClosing[,4]))-1 
DAX_ClosingReturns5 <- (DAXClosing[,5]/lag(DAXClosing[,5]))-1 
DAX_ClosingReturns6 <- (DAXClosing[,6]/lag(DAXClosing[,6]))-1 
DAX_ClosingReturns7 <- (DAXClosing[,7]/lag(DAXClosing[,7]))-1 
DAX_ClosingReturns8 <- (DAXClosing[,8]/lag(DAXClosing[,8]))-1 
DAX_ClosingReturns9 <- (DAXClosing[,9]/lag(DAXClosing[,9]))-1 
DAX_ClosingReturns10 <- (DAXClosing[,10]/lag(DAXClosing[,10]))-1 

DAX_ClosingReturns1
DAX_ClosingReturns2
DAX_ClosingReturns3
DAX_ClosingReturns4
DAX_ClosingReturns5
DAX_ClosingReturns6
DAX_ClosingReturns7
DAX_ClosingReturns8
DAX_ClosingReturns9
DAX_ClosingReturns10

DAX_ClosingReturn <- merge(DAX_ClosingReturns1,DAX_ClosingReturns2,DAX_ClosingReturns3,DAX_ClosingReturns4,DAX_ClosingReturns5,DAX_ClosingReturns6,DAX_ClosingReturns7,DAX_ClosingReturns8,DAX_ClosingReturns9,DAX_ClosingReturns10)

DAX_ClosingReturn

#first return observation is NA, sine no return could be computed

DAX_ClosingReturn <- DAX_ClosingReturn[-1] 

DAX_ClosingReturn

plot(DAX_ClosingReturn)

DAX_ClosingReturns

So now my friend added something even I am clueless about in the code:

#PRICE WEIGHRED AVERAGE METHOD
MCADS   <-  weighted.mean(DAXClosing$ADS.DE.Close)
MCALV   <-  weighted.mean(DAXClosing$ALV.DE.Close)
MCBAS   <-  weighted.mean(DAXClosing$BAS.DE.Close)
MCBAYN  <-  weighted.mean(DAXClosing$BAYN.DE.Close)
MCBEI   <-  weighted.mean(DAXClosing$BEI.DE.Close)
MCBMW   <-  weighted.mean(DAXClosing$BMW.DE.Close)
MCCON   <-  weighted.mean(DAXClosing$CON.DE.Close)
MCDAI   <-  weighted.mean(DAXClosing$DAI.DE.Close)
MCDB1   <-  weighted.mean(DAXClosing$DB1.DE.Close)
MCDBK   <-  weighted.mean(DAXClosing$DBK.DE.Close)


#SUMMED UP PRICES
PRICE <- sum(MCADS, MCALV, MCBAS,MCBAYN, MCBEI, MCBMW, MCCON, MCDAI, MCDB1, MCDBK)

#PRICE WEIGHTING
PRICEWEIGHTEDAVERAGE <-  PRICE/10

PRICEWEIGHTEDAVERAGE

plot(PRICEWEIGHTEDAVERAGE)


However when I do it I get "NaN". 

Thanks if you could help

Hi,

I cleaned up the code and reduced it to much fewer lines and fixed the NaN. I don't know if that was all you needed though...

if(!require("quantmod")) {install.packages("quantmod"); require("quantmod")}

######## GET DATA ###########
#****************************

# Define Start and end dates #########
DStart <-  "2007-12-31"  #define start data for getting the data
DEnd <-  Sys.Date() # end data should be today
DAX <-  getSymbols("^GDAXI", src="yahoo", from=DStart, to=DEnd, quote="Close", compression="m",auto.assign=FALSE) 
TickersDAX=c('BEI.DE','ADS.DE','DBK.DE','DAI.DE','DB1.DE','BMW.DE','ALV.DE','BAYN.DE','CON.DE','BAS.DE', "^GDAXI")

#Name list of current constituencies of DAX index (as of 01.04.2019)  
NamesDAX = c('Beiersdorf','Adidas','Deutsche Bank','Daimler','Deutsche Boerse','BMW',
             'Allianz','Bayer','Continental','BASF', "DAX Index")
#Create a list that contains data for all stocks
getSymbols(TickersDAX, from=DStart, to=DEnd, warnings=F) 

DAXClosing = merge((ADS.DE[,6]),(ALV.DE[,6]),(BAS.DE[,6]),(BAYN.DE[,6]),(BEI.DE[,6]),(BMW.DE[,6]),(CON.DE[,6]),(DAI.DE[,6]),(DB1.DE[,6]),(DBK.DE[,6]))


######## Perform Functions #############
#***************************************

# Computing discrete returns ############# 
# R[t]=P[t]/P[t-1]-1 
DAX_ClosingReturn = do.call(cbind, lapply(1:ncol(DAXClosing),function(x){
  DAXClosing[,x]/lag(DAXClosing[,x])-1
}))

#first return observation is NA, sine no return could be computed
DAX_ClosingReturn <- DAX_ClosingReturn[-1,] 

plot(DAX_ClosingReturn)

#PRICE WEIGHRED AVERAGE METHOD
PRICEWEIGHTEDAVERAGE = sum(apply(DAXClosing, 2, weighted.mean)) / ncol(DAXClosing)

Grtz

Great!!! Thank you very much.

Could you briefly explain what "do.call" is for? Is it the same as "merge"?

:slight_smile:

Hi,

Yes it is.

The apply function is an efficient implementation of a for-loop in cases where the code inside the apply function is independent for each of the iterations, meaning one iteration does not depend on the output of another iteration.

The function outputs a list, with the result of each individual iteration. The do.call function then merges all those result together by using the cbind (binds all data as columns in a data frame, can also be rbind if you want to combine the result as rows).

Grtz,
PJ

This would be a tidyverse based approach, I personally find it more readable

library(tidyverse)
library(quantmod)

DStart <-  "2007-12-31"  #define start data for getting the data
DEnd <-  Sys.Date()
TickersDAX=c('BEI.DE','ADS.DE','DBK.DE','DAI.DE','DB1.DE','BMW.DE','ALV.DE','BAYN.DE','CON.DE','BAS.DE', "^GDAXI")
NamesDAX = c('Beiersdorf','Adidas','Deutsche Bank','Daimler','Deutsche Boerse','BMW',
             'Allianz','Bayer','Continental','BASF', "DAX Index")

DAXClosing <- map_dfc(TickersDAX,
                      ~ as_tibble(getSymbols(Symbols = .,
                                             from=DStart,
                                             to=DEnd,
                                             warnings = FALSE,
                                             env = NULL))) %>%
    select(ends_with("Adjusted")) %>% 
    rename_all(~NamesDAX)

DAX_ClosingReturn <- DAXClosing  %>% 
    mutate_all(~./lag(.)-1) %>% 
    slice(-1)

DAX_ClosingReturn
#> # A tibble: 2,926 x 11
#>    Beiersdorf   Adidas `Deutsche Bank`  Daimler `Deutsche Boers…      BMW
#>         <dbl>    <dbl>           <dbl>    <dbl>            <dbl>    <dbl>
#>  1   -0.0231   0.00180        -0.00702 -2.74e-2         -0.0372  -1.50e-2
#>  2   -0.00313 -0.00559        -0.00491 -5.95e-2         -0.0434  -2.83e-2
#>  3    0.00255 -0.00602        -0.00573 -9.13e-3         -0.0328   2.64e-2
#>  4   -0.00391 -0.0244         -0.00761 -1.28e-2          0.0758   4.76e-4
#>  5   -0.0236  -0.0340         -0.0146  -2.04e-2         -0.0195  -5.95e-3
#>  6   -0.00864 -0.0264         -0.0118   1.20e-2         -0.00654  8.14e-3
#>  7   -0.0505  -0.0139          0.00477  9.41e-3          0.0265  -4.99e-3
#>  8    0.0414  -0.00246         0.00713  1.10e-2          0.0277  -9.07e-3
#>  9   -0.00533 -0.0389         -0.0254  -3.33e-2         -0.0302  -3.86e-2
#> 10    0.00371 -0.0498         -0.0127  -1.77e-4         -0.0884   2.76e-3
#> # … with 2,916 more rows, and 5 more variables: Allianz <dbl>,
#> #   Bayer <dbl>, Continental <dbl>, BASF <dbl>, `DAX Index` <dbl>

PRICEWEIGHTEDAVERAGE <- DAXClosing %>% 
    summarise_all(~weighted.mean(., na.rm = TRUE)) %>% 
    sum() / ncol(DAXClosing)
PRICEWEIGHTEDAVERAGE
#> [1] 852.7211

Created on 2019-07-14 by the reprex package (v0.3.0)

2 Likes