Ejercicio 1

Usted tiene un algoritmo que estima, dado un instante de tiempo, la variación de precio que tendrá una acción en la bolsa en los intantes 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 monetaria, un valor de -5 significa que el precio decrece 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?

Solución

v <- read.delim("input.txt", header = FALSE)
precio_final <- sum(v);precio_final
## [1] 439

El resultado es 439.

Ejercicio 2

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:

Precio actual: 0; variación de +1; precio resultante: 1

Precio actual: 1; variación de -2; precio resultante: -1

Precio actual: -1; variación de +3; precio resultante: 2

Precio actual: 2; variación de +1; precio resultante: 3 aquí se vuelve a iniciar con la lista de variaciones (la historia siempre se repite) Precio actual: 3; variación de +1; precio resultante: 4

Precio actual: 4; variación de -2; precio resultante: 2 aquí se detiene el algoritmo pues el precio resultante igual a 2 ya fue observado

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

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

v <- read.delim("input.txt", header = FALSE)
x<-c();x[1]<-0
i<-1
b<-TRUE

while(b==TRUE){
  for(j in 1:nrow(v)){
    z<-x[i]+v$V1[j]
    i<-i+1
    if(z%in%x){
      b<<-FALSE
      print(z)
      break
    }else{x[i]<-z}
    
  }
  
}

El resultado es 124645.

Ejercicio 3

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

n<-1:1000
total <-sum(n[n%%3==0|n%%5==0]);total
## [1] 234168

El resultado es 234168

Ejercicio 4 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=\frac{x}{y}\)

Solución

fibo<-function(n){
  f<-c(); f[c(1,2)]<-1
  b<-TRUE
  i<-3
  while(b==TRUE){
    if(f[i-1]<=n){
      f[i]<-f[i-1]+f[i-2]
      i<-i+1
    }else{
      b<-FALSE
      return(f[1:(length(f)-1)])
    }
  }
}
t<-fibo(1000000000)
y <- t[t%%2==0]; x <- t[t%%2!=0]
z <- sum(x)/sum(y);z
## [1] 4.236068

El resultado es 4.236068

Ejercicio 5

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

Solución

fibo2 <- function(n){
  f<-c();f[c(1,2)]<-1
  for(i in 3:n){
    f[i]<-f[i-1]+f[i-2]
  }
  return(f)
}
z <- c();pasos <- c(10*c(1:200))
for(i in 1:200){
  z[i] <- sum(fibo2(pasos[i])%%2!=0)/sum(fibo2(pasos[i])%%2==0)
}
Gráfica de proporción impares/pares

Gráfica de proporción impares/pares

Durante el ejercicio, hubo dificultades para los números grandes de la sucesión de Fibonacci pues fue imposible para el sistema determinar si eran pares o impares, por lo que se perdió mucha de la información que se buscaba recabar. Por otra parte, se observó que la proporción de impares sobre los pares, va disminuyendo conforme se aumentan los elementos de la sucesión de Fibonacci. Para los primeros números de la sucesión de Fibonacci, se observa que hay más números impares que pares, conforme se analizan más elementos, la proporción es impares es menor. Esto se puede observar facilmente pues tenemos como resultado una sucesión decreciente de número, es decir, la proporción de impares se irá reduciendo conforme se analicen más números de la sucesión.

Ejercicio 6

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:100)\)

Solución

#Funcion que cuenta cuantos primos hay entre 1 y k
#k: total de numeros a verificar si son primos
cuenta_primos<- function(k){
z<-0
for(n in 1:k){
a<-0
for(i in 1:n){
  if(n%%i==0){a<-a+1}
}
if(a==2){z<-z+1}
}
  return(z)
}

#Usamos la funcion para calcular la proporcion de primos en la secuencia 
#de numeros t
t <- 10*c(1:100)
prop_primos<-c()
for(i in 1:length(t)){
  prop_primos[i] <- cuenta_primos(t[i])/t[i]
}

Al igual que la gráfica anterior, observamos que la cantidad de números de primos va disminuyendo conforme se analizan cantidades de números más grandes.

Proporción de números primos.

Proporción de números primos.

Ejercicio 7

Es bien sabido que \(\rho_{X,Y}=0 \rightarrow X \bot Y\) es falso. Simule un contraejemplo.

Solución

library(ggplot2)
x <- rnorm(1000)
y<- x^2
round(cor(x,y)) #debe ser cero 
## [1] 0
df<-data.frame(x,y) #Hacerlo con ggplot.
g <- ggplot(df,aes(x,y))+geom_point(colour="mediumpurple")+labs(title = "Diagrama de dispersion Simulacion", x="X", y="Y=X^2")
g

Ejercicio 8

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:

Un data frame que tenga como columnas: la ganancia del i-ésimo juego y la ganancia acumulada hasta el juego i

Un grafico de la ganancia acumulada

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

Primera parte

juego <- function(n){
  juego<- c()#n: n昼㹡mero de simulaciones
  for(i in 1:n){
  set.seed(i)
  d <- sample(6,3,replace = TRUE, prob = rep(1/6,6))
  s <- sum(d==6) #cuantos 6 salieron en los tiros
  g <- 20*s - 10 #ganancia
  juego[i]<-g #guarda la simulaci昼㸳n
  }
  return(juego) #regresa vector de ganancias.
}
#Hacemos las pruebas para 100, 1000 y 10000 simulaciones.
j1<- juego(100); mean(j1);var(j1)
## [1] -0.6
## [1] 149.1313
j2<- juego(1000); mean(j2);var(j2)
## [1] 0.06
## [1] 175.3718
j3<- juego(10000); mean(j3);var(j3)
## [1] -0.052
## [1] 168.4141

La información que nos proporciona la media y la mediana es la siguiente: el jugador tendrá una ganancia promedio que podrá ir de -0.6 a 0.06, es decir, ganará o perderá menos de un peso por el número de veces que juegue, esto nos inidica que el casino no tendrá que darle tanto dinero al jugador por ganar en el juego. Esto nos permite identificar que el casino tendrá ganancias si el jugador decide apostar en este juego. Un dato relevante es la varianza de la simulación del juego, pues el ser muy grande indica que la fluctuación de la ganancia del jugador es amplia. Así que, como puede perder mucho dinero, también puede ganar mucho dinero, es decir, habrá poca estabilidad en la ganancia del jugador al apostar en este juego.

Segunda parte

#Funcion de simula juego de casino y recibe los siguientes parametros
#n: numero de juegos
#c: costo
#a: cuanto se gana por dado
#d_inicial: dinero inicial 
juego2 <- function(n, c, a, d_inicial){
  g_a <-c(); g_a[1]<- d_inicial
  for(i in 1:n){
    set.seed(i)
    d <- sample(6,3,replace = TRUE, prob = rep(1/6,6))
    s <- sum(d==6) #cuantos 6 salieron en los tiros
    g <- a*s - c #ganancia
    g_a[i+1]<- g_a[i]+g #Guarda la ganancia acumulada en el i-esimo juego
    
  }
  
  results <- list(ganancia= data.frame(tiempo=0:n, ganancia=g_a), plot(0:n, g_a, main = "Ganancia Acumulada en n juegos", 
                                                                           xlab="Numero de juegos", ylab = "Ganancia acumulada", col="mediumpurple", type = "s",lwd = 3))
  return(results)
}
#Dinero inicial, costo de juego, apuesta y numero de juegos = 10
prueba1 <- juego2(10,10,10,10); prueba1

## $ganancia
##    tiempo ganancia
## 1       0       10
## 2       1        0
## 3       2        0
## 4       3        0
## 5       4      -10
## 6       5      -10
## 7       6      -20
## 8       7      -30
## 9       8      -30
## 10      9      -40
## 11     10      -50
## 
## [[2]]
## NULL
#Numero de juegos 50
prueba2 <- juego2(50,2,5,10); prueba2

## $ganancia
##    tiempo ganancia
## 1       0       10
## 2       1        8
## 3       2       11
## 4       3       14
## 5       4       12
## 6       5       15
## 7       6       13
## 8       7       11
## 9       8       14
## 10      9       12
## 11     10       10
## 12     11        8
## 13     12       11
## 14     13       14
## 15     14       12
## 16     15       10
## 17     16       13
## 18     17       11
## 19     18       19
## 20     19       17
## 21     20       20
## 22     21       28
## 23     22       26
## 24     23       24
## 25     24       27
## 26     25       30
## 27     26       28
## 28     27       26
## 29     28       24
## 30     29       22
## 31     30       20
## 32     31       18
## 33     32       21
## 34     33       19
## 35     34       17
## 36     35       15
## 37     36       23
## 38     37       21
## 39     38       19
## 40     39       17
## 41     40       25
## 42     41       23
## 43     42       21
## 44     43       19
## 45     44       22
## 46     45       20
## 47     46       18
## 48     47       21
## 49     48       19
## 50     49       17
## 51     50       20
## 
## [[2]]
## NULL
#Numero de juegos 70
prueba3 <- juego2(70,10,20,100); prueba3

## $ganancia
##    tiempo ganancia
## 1       0      100
## 2       1       90
## 3       2      100
## 4       3      110
## 5       4      100
## 6       5      110
## 7       6      100
## 8       7       90
## 9       8      100
## 10      9       90
## 11     10       80
## 12     11       70
## 13     12       80
## 14     13       90
## 15     14       80
## 16     15       70
## 17     16       80
## 18     17       70
## 19     18      100
## 20     19       90
## 21     20      100
## 22     21      130
## 23     22      120
## 24     23      110
## 25     24      120
## 26     25      130
## 27     26      120
## 28     27      110
## 29     28      100
## 30     29       90
## 31     30       80
## 32     31       70
## 33     32       80
## 34     33       70
## 35     34       60
## 36     35       50
## 37     36       80
## 38     37       70
## 39     38       60
## 40     39       50
## 41     40       80
## 42     41       70
## 43     42       60
## 44     43       50
## 45     44       60
## 46     45       50
## 47     46       40
## 48     47       50
## 49     48       40
## 50     49       30
## 51     50       40
## 52     51       50
## 53     52       40
## 54     53       30
## 55     54       60
## 56     55       50
## 57     56       60
## 58     57       50
## 59     58       40
## 60     59       30
## 61     60       60
## 62     61       50
## 63     62       60
## 64     63       50
## 65     64       60
## 66     65       70
## 67     66       80
## 68     67       70
## 69     68       60
## 70     69       70
## 71     70       60
## 
## [[2]]
## NULL
#Numero de juegos 100
prueba4 <- juego2(100,5,10,1000); prueba4

## $ganancia
##     tiempo ganancia
## 1        0     1000
## 2        1      995
## 3        2     1000
## 4        3     1005
## 5        4     1000
## 6        5     1005
## 7        6     1000
## 8        7      995
## 9        8     1000
## 10       9      995
## 11      10      990
## 12      11      985
## 13      12      990
## 14      13      995
## 15      14      990
## 16      15      985
## 17      16      990
## 18      17      985
## 19      18     1000
## 20      19      995
## 21      20     1000
## 22      21     1015
## 23      22     1010
## 24      23     1005
## 25      24     1010
## 26      25     1015
## 27      26     1010
## 28      27     1005
## 29      28     1000
## 30      29      995
## 31      30      990
## 32      31      985
## 33      32      990
## 34      33      985
## 35      34      980
## 36      35      975
## 37      36      990
## 38      37      985
## 39      38      980
## 40      39      975
## 41      40      990
## 42      41      985
## 43      42      980
## 44      43      975
## 45      44      980
## 46      45      975
## 47      46      970
## 48      47      975
## 49      48      970
## 50      49      965
## 51      50      970
## 52      51      975
## 53      52      970
## 54      53      965
## 55      54      980
## 56      55      975
## 57      56      980
## 58      57      975
## 59      58      970
## 60      59      965
## 61      60      980
## 62      61      975
## 63      62      980
## 64      63      975
## 65      64      980
## 66      65      985
## 67      66      990
## 68      67      985
## 69      68      980
## 70      69      985
## 71      70      980
## 72      71      975
## 73      72      980
## 74      73      975
## 75      74      980
## 76      75      985
## 77      76      990
## 78      77      995
## 79      78     1000
## 80      79     1005
## 81      80     1010
## 82      81     1015
## 83      82     1010
## 84      83     1005
## 85      84     1010
## 86      85     1005
## 87      86     1010
## 88      87     1005
## 89      88     1010
## 90      89     1015
## 91      90     1010
## 92      91     1005
## 93      92     1000
## 94      93      995
## 95      94      990
## 96      95      985
## 97      96      980
## 98      97      975
## 99      98      970
## 100     99      975
## 101    100      970
## 
## [[2]]
## NULL

En las gráficas se va observando la ganancia o périda que enfrenta el jugador según el número de juegos en los que participe. En general, podemos observar que en 3 de 4 juegos, tuvo una ganancia acumulada menor a su dinero inicial, por lo que, no es un juego que vaya a significar una ganancia real para el jugador.