Este es un ejemplo de cómo crear un índice a partir de un conjunto de acciones. La idea es generar un índice tipo ETF con un portafolio definido.

Inicio bajando de Yahoo precios de 4 acciones

library(quantmod)
misticker = c("AAPL","LMT","RTX","MRO")
getSymbols(Symbols = misticker,from="2019-01-01",to="2023-06-08",periodicity="monthly")
## [1] "AAPL" "LMT"  "RTX"  "MRO"

Juntando los precios en 1 dataset:

precios=merge(AAPL,LMT,MRO,RTX)

precios = Ad(precios)

Genero retornos mensuales simples. Recuerda que:

R = variable / lag(variable) - 1

Entonces genero un daset nuevo (retornos)

retornos = precios / lag(precios) - 1

Construyo mis pesos del portafolio simulado. Asignaré pesos iguales a cada uno:

w = c(0.25,0.25,0.25,0.25)

Genero la columna de Retornos del portafolio con estos pesos:

# Cambio el nombre de columnas con los nombres de tickers:
colnames(retornos) = misticker
# Calculo el retorno histórico del portafolio del ETF con los pesos respectivos de cada stock:
retornos$PORTR = retornos$AAPL * w[1] + retornos$LMT * w[2] + retornos$RTX*w[3] + retornos$MRO*w[4]

Finalmente, genero la columna de mi ETF index:

# Guardo el # de renglones (meses) de mis datos:
N=nrow(retornos) 
# Genero una columna del índice con valor = 100 para todos los meses:
retornos$miETF = 100
# Inicialmente había hecho el siguiente código para calcular el valor del ETF a partir del mes 2:

# Genero una columna para el factor de crecimiento considerando el retorno mensual:
retornos$fgrowth = (1+retornos$PORTR)

#retornos$miETF = lag(retornos$miETF) * retornos$PORTR 

# Sin embargo, este código no hace lo que quiero. Por alguna razón, el valor de lag siempre utiliza el valor del mes 1!! 

# Para resolver este problema, hice un ciclo (loop) a partir del mes 2: 

# A partir del mes 2 recalculo el índice en base al retorno del mes y su valor anterior:
for (mes in 2:N) {
  retornos$miETF[mes] <- as.numeric(retornos$miETF[mes-1]) * as.numeric(retornos$fgrowth[mes]) 
}

plot(retornos$miETF)

El índice de mi ETF parece como el movimiento de 1 acción. Por intuición, este índice debería ser parecido a los 4 stocks que utilicé para construirlo.

Hago el plot de las 4 acciones para checar si hace sentido el índice de mi ETF:

plot(precios$AAPL)

plot(precios$LMT.Adjusted)

plot(precios$MRO.Adjusted)

plot(precios$RTX.Adjusted)

Mi índice ETF hace sentido. Es una variable no estacionaria parecida a varios stocks.

Con este código sería posible modificar tanto las acciones del portafolio como los pesos asignados a cada stock. Al correrlo de nuevo, generará otro índice de acuerdo a estos cambios.