1. Usted tiene un algoritmo que estima, dado un instante de tiempo \(\Delta t_1\), la variación de precio que tendrá una acción en la bolsa en los instantes \(\Delta t\) siguientes. Una vez que corre el algoritmo recibe una sucesión de variaciones de precio. Un valor de +3 significa que el precio tendrá un incremento de 3 unidades monetarias, un valor de -5 significa que el precio decrece en 5 unidades monetarias. Empezando con un precio de $0, ¿cuál será el precio resultante de la acción después de que ocurran todas las variaciones?

La sucesión de variaciones es

variacion<-read.table("~/Documentos/8voSemestre/AMultivariado/input.txt", quote="\"", comment.char="")
variacion<-variacion$V1
head(variacion)
## [1]  16 -15  -2  -6  -6 -17

Por tanto el precio es

0+sum(variacion)
## [1] 439
  1. Usted recuerda que un supuesto fuerte del análisis técnico de acciones es, palabras más palabras menos, que la historia siempre se repite. Por lo cual como parte de su estrategia, y esperando tener cierta ventaja sobre el resto del mercado, se ve interesado en encontrar el primer precio que ocurre dos veces si las variaciones que obtuvo se repiten todo el tiempo.

Por ejemplo si las variaciones fueran c(+1,-2,+3,+1), se tendría:

¿Cuál es primer precio que ocurre dos veces dada esta lista de variaciones?

variacion<-read.table("~/Documentos/8voSemestre/AMultivariado/input2.txt", quote="\"", comment.char="")
head(variacion$V1)
## [1]  16 -15  -2  -6  -6 -17

Note que la lista de variaciones puede repetirse a si misma muchas veces antes de encontrar el precio duplicado; además, el precio duplicado debe ser encontrado en medio del proceso de búsqueda y detenerlo.

Solución

Vea que

Precios<-0+cumsum(variacion$V1)
alcanzado<-0
for(i in 2:length(Precios)){
  precio<-Precios[i]
  paro<-sum(Precios[1:(i-1)]==precio)
  if(paro){
    print(paste("El precio es",precio))
    print(paste("Se alcanza en la iteración",i))
    alcanzado<-1
    break()
  }
}
if(! alcanzado)
  print(paste("No hay repeticiones"))
## [1] "No hay repeticiones"

Si hacemos una lista de los números naturales menores a 10 que son multiplos de 3 o 5 obtendremos c(3, 5, 6, 9), la suma de esos multiplos es 23.

Encuentre la suma de todos los multiplos de 3 o 5 menores a 1000.

Solución

Lista<-1:1000
indices<-(Lista%%3 ==0)|(Lista%%5 ==0)
Lista<-Lista[indices]
print(paste("La suma es",sum(Lista)))
## [1] "La suma es 234168"

Como bien sabe, cada término de la sucesión de Fibonacci se obtiene sumando los dos elementos anteriores.

Considere los elementos de la sucesión de Fibonacci menores a 1,000,000,000. Sea \(x\) la suma de los elementos impares, \(y\) la suma de los elementos pares. Encuentre \(z=\dfrac{x}{y}\)

Solución

Fibonacci<-c(1,1) # primeros términos
i<-2 # índice en la sucesión
fib<-0 
# Lo siguiente genera los elementos de la sucesión
# menores o iguales a 10^9
while(fib<=10^9){
  fib<-sum(Fibonacci[c(i-1,i)])
  Fibonacci<-append(Fibonacci,fib)
  i<-i+1
}
x<-sum(Fibonacci[Fibonacci%%2==1])
y<-sum(Fibonacci)-x
x/y
## [1] 1

Ahora considere los primeros \(10n\) elementos de la sucesión de Fibonacci con \(n \in [1,200]\) sea \(x\) el número de elementos impares, \(y\) el número de elementos pares y \(z=\dfrac{x}{y}\). Haga un gráfico interactivo del vector de \(z\)′s. Explique un par de insights interesantes sobre el ejercicio.

Solución

require(dygraphs)

Fibo_par<-function(n){
  if(n == 1|n==2){
    res<-rep(0,n)
  }else{
    res<-c(0,0)
    for(i in 3:n){
      res<-c(res,(1+(-1)^(res[i-2]+res[i-1]))/2)
    }
  }
  return(res)
}

Proporcion<-function(n){
  sucesion.n<-Fibo_par(n)
  y<-sum(sucesion.n)
  x<-n-y
  return(x/y)
}

z<-10*1:200
w<-sapply(z,Proporcion)

Valores<-cbind(z,w);colnames(Valores)<-c("Término","Razón")
Valores<-data.frame(Valores)
dygraph(Valores,main = "Razón impar/par",xlab = "Término",ylab = "Razón")

Escriba una función que encuentre los números primos entre 1 y \(n\). Haga un gráfico animado de la proporción de números primos en los primeros \(10k\) naturales con \(k\in (1:n)\).

Solución

primes<-function(n){
  if(n==1)
  lista<-c()
  if(n==2)
  lista<-c(2)
  if(n==3)
  lista<-c(2,3)
  else{
    lista<-c(2,3)
    for(k in 4:n){
      maximo<-floor(sqrt(k))
      indices<-lista<=maximo
      primos<-lista[indices]
      if(prod(k%%primos!=0)){
        lista<-c(lista,k)
      }
    }
  }
  return(lista)
}
dprimes<-function(n) length(primes(n))/n

z<-10*1:100
w<-sapply(z,dprimes)
Valores<-cbind(z,w);colnames(Valores)<-c("Término","Proporción")
Valores<-data.frame(Valores)
dygraph(Valores,main = "Densidad de los primos",xlab = "Término",ylab = "Proporción")

Usted trabaja en un casino donde existe el siguiente juego: un jugador lanza tres dados y gana 20 pesos por cada 6 que aparece, el costo de jugar es de 10 pesos.

Escriba una función que simule el juego y regrese la cantidad que se gana en cada juego i.e. ganancia - costo. Calcule la media y varianza al simular 100, 1000 y 10000 juegos. Explique sus hallazgos al dueño del casino.

Adapte su función para que tome los argumentos: numero de juegos, dinero inicial, costo del juego, apuesta del juego y que devuelva una lista con:

Explore y explique las siguientes combinaciones para dinero inicial, costo del juego, apuesta del juego: (10,10,10), (10,2,5), (100, 10, 20), (1000, 5, 10). Explique.

Solución

Es claro que para el apostador, los eventos de interés son \[y_j=\begin{cases} 1&\text{el dado $j$ cae en 6}\\ 0& \text{e.o.c} \end{cases}\] para \(j\in 1:3\). Cada uno de estos es un ensayo Bernoulli, independiente de los demás, con probabilidad \(\dfrac{1}{6}\) de ocurrir, la suma los mismos determina la ganancia bruta del jugador que es \(20\sum_{j=1}^3y_j\). Note que \(x=\sum_{j=1}^3y_j\sim \text{Binom}(3,1/6)\). Luego, una forma de simular el resultado de \(n\) juegos es:

ganancia.neta<-function(n){
  res<-20*rbinom(n,3,1/6)-10
  return(res)
}

med.var<-function(n){
  muestra<-ganancia.neta(n)
  c(mean(muestra),var(muestra))
} 
juegos<-c(100,1000,10000);juegos<-cbind(juegos)
resultados<-apply(juegos,1,med.var)
rownames(resultados)<-c("Media","Var")
colnames(resultados)<-c("100 juegos","1000 juegos", "10000 juegos")
knitr::kable(resultados,format = "markdown",align = "c",digits = 3)
100 juegos 1000 juegos 10000 juegos
Media 1.800 0.020 0.034
Var 218.949 173.773 165.615

Los resultados de la tabla anterior es consecuencia de la ley de los grandes números; al aumentar el número de ensayos, los estimadores de la media y la varianza tienden a sus valores teóricos que son: \[\mathbb{E}[20x-10]=20(1/2)-10=0\] \[Var(20x-10)=400Var(x)=400(\dfrac{1}{2}\dfrac{5}{6})=2000/12=166.666\]

Ganancia.neta<-function(n,d.ini,costo,apuesta){
  muestra<-apuesta*rbinom(n,3,1/6)-costo
  acumulado<-d.ini+cumsum(muestra)
  matriz<-cbind(muestra,acumulado)
  colnames(matriz)<-c("ganancia.juego","acumulado")
  res<-list(
    d.f=data.frame(matriz),
    grafico=plot(acumulado,xlab = "Juego",ylab = "Acumulado",type = "l",col="darkcyan")
  )
  return(res)
}

Las combinaciones para dinero inicial, costo del juego, apuesta del juego, (10,10,10), (10,2,5), (100, 10, 20), (1000, 5, 10), producen:

n<-1000
# 1
Grafica<-Ganancia.neta(n,10,10,10)

# 2
Grafica<-Ganancia.neta(n,10,2,5)

# 3
Grafica<-Ganancia.neta(n,100,10,20)

# 4
Grafica<-Ganancia.neta(n,1000,5,10)