library(ggplot2)
library(plotly)

Problema 1

Usted tiene un algoritmo que estima, dado un instante de tiempo Δt1, la variación de precio que tendrá una acción en la bolsa en los instantes Δ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 dadas por el algoritmo se encuentra aquí

SOLUCIÓN

Creamos un vector que contenga la lista de variaciones y posteriormente sumamos los elementos de dicho vector para encontrar el precio resultante.

variaciones <- scan(file = "C:/Users/dana1/Documents/R Coding Challenge/Lista.txt")
precioresultante <- sum(variaciones)
precioresultante
## [1] 439

Problema 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

Primero creamos una variable que repita el vector del problema anterior y una función para los precios actuales y los precios anteriores.

Vemos que la longitud del vector de variaciones es de 989 elementos por lo que hacemos un for que vaya sumando de manera recursiva los precios.

variaciones2 <- rep(variaciones, 2)          

precios <- function(n) {                
  precioactual <- numeric(n)           
  precioactual[1] <- n           
  
  for (i in 1:989) {         
    precioactual[i + 1] = precioactual[i] + variaciones[i]
  }
  return(c(precioactual))
}

p <- precios(100)  
p
##   [1]    100    116    101     99     93     87     70     73     84     79
##  [11]     98    114    124    120    130    137    142    134    141    151
##  [21]    136    152    144    163    176    159    143    161    165    146
##  [31]    157    147    156    175    180    198    197    211    225    229
##  [41]    243    250    239    235    234    241    252    268    284    269
##  [51]    281    293    286    288    278    291    289    305    323    310
##  [61]    302    300    318    311    294    315    316    297    313    322
##  [71]    324    317    298    314    330    329    341    359    356    348
##  [81]    331    339    332    325    327    309    296    299    306    319
##  [91]    320    335    344    326    328    342    336    347    346    362
## [101]    354    373    376    381    369    351    349    367    350    340
## [111]    361    382    371    353    357    343    337    321    304    312
## [121]    292    277    272    262    280    263    244    240    227    224
## [131]    223    215    209    204    222    237    232    228    214    196
## [141]    210    213    206    189    201    185    203    184    194    212
## [151]    221    236    216    219    230    248    267    253    256    270
## [161]    273    279    290    275    257    238    226    246    251    254
## [171]    242    231    258    260    259    264    249    271    266    276
## [181]    301    282    265    303    283    308    333    360    372    365
## [191]    384    392    409    408    399    416    434    447    441    455
## [201]    457    453    469    476    494    505    486    499    483    485
## [211]    493    474    491    471    477    490    478    481    462    444
## [221]    459    454    473    492    496    487    502    510    506    503
## [231]    484    504    501    522    513    528    543    527    534    542
## [241]    557    565    548    551    572    564    547    545    546    525
## [251]    520    541    552    536    517    529    524    508    495    498
## [261]    480    466    470    489    488    482    467    475    458    450
## [271]    460    461    456    465    440    452    433    424    420    406
## [281]    403    407    423    415    425    410    405    418    412    395
## [291]    391    394    411    430    443    445    464    472    463    451
## [301]    431    429    417    432    419    414    435    413    397    387
## [311]    378    363    345    364    383    366    375    385    401    389
## [321]    398    400    402    422    439    421    404    390    388    379
## [331]    377    370    386    368    393    428    448    436    446    427
## [341]    442    438    449    468    437    426    396    338    334    352
## [351]    295    274    285    261    247    220    217    199    192    190
## [361]    178    174    188    187    182    195    191    202    181    155
## [371]    158    171    164    173    179    162    148    167    183    200
## [381]    193    172    168    154    138    129    119    127    140    135
## [391]    131    139    115    122    117    128    153    160    149    121
## [401]    132    145    166    177    186    169    150    170    208    207
## [411]    218    233    205    245    255    307    358    355    380    374
## [421]    507    516    531    515    500    514    519    533    521    530
## [431]    562    549    511    544    479    535    550    287    497  62827
## [441]  62839  62836  62846  62847  62856  62867  62858  62851  62869  62872
## [451]  62871  62875  62884  62876  62891  62898  62902  62908  62904  62893
## [461]  62909  62910  62920  62906  62887  62879  62864  62874  62861  62880
## [471]  62894  62877  62888  62897  62882  62895  62911  62922  62934  62924
## [481]  62919  62936  62938  62941  62950  62961  62977  62980  62964  62979
## [491]  62987  62994  63004  63008  63016  63035  63018  63026  63013  63025
## [501]  63042  63027  63046  63063  63082  63090  63102  63100  63118  63129
## [511]  63133  63150  63158  63159  63141  63148  63137  63126  63107  63122
## [521]  63125  63110  63117  63105  63123  63121  63120  63119  63138  63155
## [531]  63167  63161  63160  63154  63165  63149  63156  63140  63127  63109
## [541]  63101  63093  63108  63099  63089  63079  63084  63104  63095  63078
## [551]  63074  63056  63068  63069  63055  63057  63065  63064  63054  63049
## [561]  63066  63060  63061  63075  63070  63076  63086  63088  63081  63080
## [571]  63091  63092  63085  63096  63106  63111  63131  63143  63151  63132
## [581]  63124  63136  63128  63115  63098  63083  63094  63072  63077  63087
## [591]  63059  63045  63067  63041  63024  63010  63011  62992  62974  62968
## [601]  62959  62947  62943  62949  62954  62945  62946  62927  62933  62923
## [611]  62921  62931  62948  62940  62958  62976  62988  62996  62998  62981
## [621]  62989  62991  62972  62975  62993  63001  62990  63007  62995  63015
## [631]  63034  63040  63037  63039  63053  63058  63036  63038  63028  63029
## [641]  63012  63009  62997  62986  62982  62967  62951  62971  62973  62955
## [651]  62965  62960  62942  62925  62935  62928  62905  62890  62883  62866
## [661]  62860  62863  62845  62862  62857  62859  62850  62844  62841  62854
## [671]  62853  62870  62886  62901  62885  62881  62903  62912  62899  62889
## [681]  62878  62855  62873  62900  62914  62916  62929  62930  62913  62932
## [691]  62939  62956  62970  62962  62944  62952  62963  62953  62966  62985
## [701]  63000  63023  63002  62999  63014  63032  63022  63006  63021  63030
## [711]  63017  63003  62984  63005  62983  63019  63020  63033  63052  63051
## [721]  63044  63031  63043  63047  63048  63071  63116  63114  63112  63135
## [731]  63130  63145  63152  63170  63189  63184  63201  63200  63215  63209
## [741]  63196  63178  63177  63182  63186  63199  63206  63197  63193  63208
## [751]  63195  63190  63194  63202  63211  63230  63235  63252  63244  63227
## [761]  63220  63233  63216  63226  63229  63213  63223  63241  63238  63256
## [771]  63236  63234  63222  63221  63207  63218  63214  63198  63183  63188
## [781]  63180  63169  63162  63146  63134  63153  63168  63173  63179  63163
## [791]  63157  63174  63187  63192  63185  63205  63225  63224  63240  63250
## [801]  63254  63261  63267  63257  63248  63253  63258  63251  63247  63259
## [811]  63277  63270  63276  63264  63279  63274  63268  63271  63282  63262
## [821]  63243  63237  63232  63249  63269  63287  63281  63265  63255  63231
## [831]  63245  63260  63272  63273  63304  63307  63291  63288  63263  63239
## [841]  63228  63246  63217  63204  63203  63212  63210  63176  63164  63175
## [851]  63191  63171  63166  63147  63144  63142  63097  63073  63062  63139
## [861]  63181  63172  63113  62957  62969  62937  62896  62907  62918  62892
## [871]  62915  62917  62926  62978  63103  63242  63219  63050 124794 124785
## [881] 124783 124787 124790 124781 124773 124754 124756 124755 124765 124753
## [891] 124743 124746 124749 124744 124761 124758 124750 124757 124745 124772
## [901] 124769 124763 124774 124776 124771 124759 124775 124782 124788 124796
## [911] 124804 124801 124793 124798 124817 124827 124829 124830 124812 124822
## [921] 124840 124848 124862 124851 124850 124869 124878 124893 124901 124899
## [931] 124888 124904 124886 124875 124891 124894 124879 124881 124876 124868
## [941] 124852 124871 124883 124887 124895 124892 124897 124889 124907 124926
## [951] 124944 124958 124970 124989 124987 125001 124983 124984 124986 124967
## [961] 124953 124945 124952 124960 124959 124968 124978 124976 124977 124973
## [971] 124991 124992 125010 125025 125023 125037 125047 125065 125050 125048
## [981] 125041 125034 125031 125019 125015 125033 125026 125020 125017    539
precio <- duplicated(p)
preciofinal <- c(which(precio[] == TRUE))

preciofinal
## integer(0)

Problema 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

Creamos una secuencia de números del uno al mil y posteriormente definimos dos variables a partir de esa secuencia con modulos 3 y 5 respectivamente:

n <- seq(1,1000) 

a <- n%%3
b <- n%%5

Después separamos en dos variables distintas los múltiplos de 3 y 5, los unimos en una nueva variable y sumamos todos sus elementos.

multiplos3 <- which(a == 0)
multiplos5 <- which(b == 0)
total <- union(multiplos3,multiplos5)

suma <- sum(total)
suma
## [1] 234168

Problema 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=x/y

SOLUCIÓN

Primero construímos la serie de fibonacci:

seriefibonacci<- function(n){
f <- 0
f[1] <- 0
f[2] <- 1
if (n == 1){
  f = c(0)
}
else if (n == 2){
  f = c(0,1)
}
else {
  for (i in 3:n) { 
  f[i] <- f[i-1]+f[i-2]
} 
}
return(f)
}

Ahora haremos una lista de los números pares e impares utilizando la función modulo:

num1 = seriefibonacci(45)

pares <- num1[num1%%2 == 0]
pares
##  [1]         0         2         8        34       144       610      2584
##  [8]     10946     46368    196418    832040   3524578  14930352  63245986
## [15] 267914296
impares <- num1[num1%%2 != 0]
impares
##  [1]         1         1         3         5        13        21        55
##  [8]        89       233       377       987      1597      4181      6765
## [15]     17711     28657     75025    121393    317811    514229   1346269
## [22]   2178309   5702887   9227465  24157817  39088169 102334155 165580141
## [29] 433494437 701408733

Finalmente definimos dos variables que sumen los elementos de la lista “pares” e “impares” respectivamente. Y otra variable que sea la razón entre la suma de los elementos pares e impares.

x <- sum(impares)
x
## [1] 1485607536
y <- sum(pares)
y 
## [1] 350704366
z <- x/y
z
## [1] 4.236068

Problema 5

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

SOLUCIÓN

Hacemos una nueva función que nos arroje el número de elementos de la lista de pares e impares y condicionamos a que z sea igual al cociente de los elementos impares entre los elementos pares siempre y cuando la longitud delvector no sea cero.

funcion = function(n){
  num2 = seriefibonacci(n)
  elementosimpares = length(num2[num2%%2 != 0])
  elementospares = length(num2[num2%%2 == 0])
  z = 0 
  
  if(elementospares == 0){
    z = NULL
  } else {
    z = elementosimpares/elementospares
  }
  return(z)
}

Ahora creamos un data frame que arroje los n elementos con n∈(1,20) ya que el ordenador no compila con tantos datos, y la función que realizamos en el paso anterior que arroja la razón entre los elementos impares y los elementos pares de la serie de fibonacci.

r <- NULL
for (i in 1:20){
  r <- c(r,funcion(10*i))
}
s <- 1:length(r)
t <- data.frame(s,r)
t
##     s         r
## 1   1 1.5000000
## 2   2 1.8571429
## 3   3 2.0000000
## 4   4 1.8571429
## 5   5 1.9411765
## 6   6 2.0000000
## 7   7 1.9166667
## 8   8 1.8571429
## 9   9 1.3684211
## 10 10 1.0833333
## 11 11 0.8965517
## 12 12 0.7647059
## 13 13 0.6666667
## 14 14 0.5909091
## 15 15 0.5306122
## 16 16 0.4814815
## 17 17 0.4406780
## 18 18 0.4062500
## 19 19 0.3768116
## 20 20 0.3513514

Por último graficamos el vector de las z’s.

plot_ly(t, x = ~s, y = ~r, type = "scatter", linetype = 1, color = I("purple"))
## No scatter mode specifed:
##   Setting the mode to markers
##   Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
## Adding lines to mode; otherwise linetype would have no effect.

Vemos que para algún par de n’s el valor de z es el mismo como en el caso de 3 y 6 que z toma el valor de 2. Posteriormente la gráfica es decreciente.

Problema 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∈(1:100)

SOLUCIÓN

Similar al problema anterior creamos una función para encontrar los números primos entre 1 y n.

encontrarprimos = function(n){
  g<-NULL
  if(n >= 1 &&  n <= 3){
      return(n)
  } 
  else{
    j = 2
    repeat{
      if(n %% j == 0 || j == n){
        if(j < n) g<-NULL
        break
      }  
      j = j + 1
    }
    if(j == n){
      
      g<-n
    }
    return(g)
  }
}

Posteriormente creamos un data frame para condicionar que los numeros primos estén entre 1 y 1000

o<-NULL
for( i in 1:1000){
  o<-c(o, encontrarprimos(i))
}
l<-1:length(o)

d <- data.frame(l , o)

Finalmente graficamos el data frame

plot_ly(d, x = ~l, y = ~o, type = "scatter", linetype = 0.5, color = I("pink"))
## No scatter mode specifed:
##   Setting the mode to markers
##   Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
## Adding lines to mode; otherwise linetype would have no effect.

Problema 7

Es bien sabido que ρX,Y = 0 → X⊥Y es falso. Simule un contraejemplo.

SOLUCIÓN

Investigando, el ejemplo claro de que esta relación no siempre se cumple es a través de una variable aleatoria X~(0,1) y otra variable Y = X^2. Podemos observar que dichas variables no son independientes, sólo falta comprobar que la correlación es igual a cero calculando la media de las variables.

X <- rnorm(1, mean = 0, sd = 1)
Y <- X^2

covarianza <- mean(X - mean(X)) * mean(Y - mean(Y))
covarianza
## [1] 0

Como la varianza es igual a 0 el coeficiente de correlación es igual a cero.

Problema 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