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?

Solución:

# Problema 1
a <- c(scan(file = "C:/Users/Ximena/Documents/Facultad/6to semestre/Modelos de supervivencia y series de tiempo/R Coding Challenge/input.txt"))
                                # Nombramos una variable que contenga todos los elementos de la lista "input"
precios <- sum(a)               # Sumamos todos los elementos de nuestra lista para obtener el precio final
cat("El precio final al termino de las variaciones es ", precios, ".\n", sep = "")   
## El precio final al termino de las variaciones es 439.
                                # Imprimimos el resultado anterior para obtener el precio final

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:

¿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:

variaciones <- rep(a, 2)          # Creamos una variable donde se repita el vector del ejercicio anterior 10 veces

precios <- function(n) {                # Diseñamos una función para los precios 
  precioactual <- numeric(n)           # Damos un vector para el precio actual
  precioactual[1] <- n            # Le damos un valor a la primera entrada del vector
  
  for (i in 1:989) {          # Diseñamos un ciclo para las 989 entradas del vector de variaciones
    precioactual[i + 1] = precioactual[i] + a[i]
  }
  return(c(precioactual))
}

precio <- precios(500)  
precio
##   [1]    500    516    501    499    493    487    470    473    484    479
##  [11]    498    514    524    520    530    537    542    534    541    551
##  [21]    536    552    544    563    576    559    543    561    565    546
##  [31]    557    547    556    575    580    598    597    611    625    629
##  [41]    643    650    639    635    634    641    652    668    684    669
##  [51]    681    693    686    688    678    691    689    705    723    710
##  [61]    702    700    718    711    694    715    716    697    713    722
##  [71]    724    717    698    714    730    729    741    759    756    748
##  [81]    731    739    732    725    727    709    696    699    706    719
##  [91]    720    735    744    726    728    742    736    747    746    762
## [101]    754    773    776    781    769    751    749    767    750    740
## [111]    761    782    771    753    757    743    737    721    704    712
## [121]    692    677    672    662    680    663    644    640    627    624
## [131]    623    615    609    604    622    637    632    628    614    596
## [141]    610    613    606    589    601    585    603    584    594    612
## [151]    621    636    616    619    630    648    667    653    656    670
## [161]    673    679    690    675    657    638    626    646    651    654
## [171]    642    631    658    660    659    664    649    671    666    676
## [181]    701    682    665    703    683    708    733    760    772    765
## [191]    784    792    809    808    799    816    834    847    841    855
## [201]    857    853    869    876    894    905    886    899    883    885
## [211]    893    874    891    871    877    890    878    881    862    844
## [221]    859    854    873    892    896    887    902    910    906    903
## [231]    884    904    901    922    913    928    943    927    934    942
## [241]    957    965    948    951    972    964    947    945    946    925
## [251]    920    941    952    936    917    929    924    908    895    898
## [261]    880    866    870    889    888    882    867    875    858    850
## [271]    860    861    856    865    840    852    833    824    820    806
## [281]    803    807    823    815    825    810    805    818    812    795
## [291]    791    794    811    830    843    845    864    872    863    851
## [301]    831    829    817    832    819    814    835    813    797    787
## [311]    778    763    745    764    783    766    775    785    801    789
## [321]    798    800    802    822    839    821    804    790    788    779
## [331]    777    770    786    768    793    828    848    836    846    827
## [341]    842    838    849    868    837    826    796    738    734    752
## [351]    695    674    685    661    647    620    617    599    592    590
## [361]    578    574    588    587    582    595    591    602    581    555
## [371]    558    571    564    573    579    562    548    567    583    600
## [381]    593    572    568    554    538    529    519    527    540    535
## [391]    531    539    515    522    517    528    553    560    549    521
## [401]    532    545    566    577    586    569    550    570    608    607
## [411]    618    633    605    645    655    707    758    755    780    774
## [421]    907    916    931    915    900    914    919    933    921    930
## [431]    962    949    911    944    879    935    950    687    897  63227
## [441]  63239  63236  63246  63247  63256  63267  63258  63251  63269  63272
## [451]  63271  63275  63284  63276  63291  63298  63302  63308  63304  63293
## [461]  63309  63310  63320  63306  63287  63279  63264  63274  63261  63280
## [471]  63294  63277  63288  63297  63282  63295  63311  63322  63334  63324
## [481]  63319  63336  63338  63341  63350  63361  63377  63380  63364  63379
## [491]  63387  63394  63404  63408  63416  63435  63418  63426  63413  63425
## [501]  63442  63427  63446  63463  63482  63490  63502  63500  63518  63529
## [511]  63533  63550  63558  63559  63541  63548  63537  63526  63507  63522
## [521]  63525  63510  63517  63505  63523  63521  63520  63519  63538  63555
## [531]  63567  63561  63560  63554  63565  63549  63556  63540  63527  63509
## [541]  63501  63493  63508  63499  63489  63479  63484  63504  63495  63478
## [551]  63474  63456  63468  63469  63455  63457  63465  63464  63454  63449
## [561]  63466  63460  63461  63475  63470  63476  63486  63488  63481  63480
## [571]  63491  63492  63485  63496  63506  63511  63531  63543  63551  63532
## [581]  63524  63536  63528  63515  63498  63483  63494  63472  63477  63487
## [591]  63459  63445  63467  63441  63424  63410  63411  63392  63374  63368
## [601]  63359  63347  63343  63349  63354  63345  63346  63327  63333  63323
## [611]  63321  63331  63348  63340  63358  63376  63388  63396  63398  63381
## [621]  63389  63391  63372  63375  63393  63401  63390  63407  63395  63415
## [631]  63434  63440  63437  63439  63453  63458  63436  63438  63428  63429
## [641]  63412  63409  63397  63386  63382  63367  63351  63371  63373  63355
## [651]  63365  63360  63342  63325  63335  63328  63305  63290  63283  63266
## [661]  63260  63263  63245  63262  63257  63259  63250  63244  63241  63254
## [671]  63253  63270  63286  63301  63285  63281  63303  63312  63299  63289
## [681]  63278  63255  63273  63300  63314  63316  63329  63330  63313  63332
## [691]  63339  63356  63370  63362  63344  63352  63363  63353  63366  63385
## [701]  63400  63423  63402  63399  63414  63432  63422  63406  63421  63430
## [711]  63417  63403  63384  63405  63383  63419  63420  63433  63452  63451
## [721]  63444  63431  63443  63447  63448  63471  63516  63514  63512  63535
## [731]  63530  63545  63552  63570  63589  63584  63601  63600  63615  63609
## [741]  63596  63578  63577  63582  63586  63599  63606  63597  63593  63608
## [751]  63595  63590  63594  63602  63611  63630  63635  63652  63644  63627
## [761]  63620  63633  63616  63626  63629  63613  63623  63641  63638  63656
## [771]  63636  63634  63622  63621  63607  63618  63614  63598  63583  63588
## [781]  63580  63569  63562  63546  63534  63553  63568  63573  63579  63563
## [791]  63557  63574  63587  63592  63585  63605  63625  63624  63640  63650
## [801]  63654  63661  63667  63657  63648  63653  63658  63651  63647  63659
## [811]  63677  63670  63676  63664  63679  63674  63668  63671  63682  63662
## [821]  63643  63637  63632  63649  63669  63687  63681  63665  63655  63631
## [831]  63645  63660  63672  63673  63704  63707  63691  63688  63663  63639
## [841]  63628  63646  63617  63604  63603  63612  63610  63576  63564  63575
## [851]  63591  63571  63566  63547  63544  63542  63497  63473  63462  63539
## [861]  63581  63572  63513  63357  63369  63337  63296  63307  63318  63292
## [871]  63315  63317  63326  63378  63503  63642  63619  63450 125194 125185
## [881] 125183 125187 125190 125181 125173 125154 125156 125155 125165 125153
## [891] 125143 125146 125149 125144 125161 125158 125150 125157 125145 125172
## [901] 125169 125163 125174 125176 125171 125159 125175 125182 125188 125196
## [911] 125204 125201 125193 125198 125217 125227 125229 125230 125212 125222
## [921] 125240 125248 125262 125251 125250 125269 125278 125293 125301 125299
## [931] 125288 125304 125286 125275 125291 125294 125279 125281 125276 125268
## [941] 125252 125271 125283 125287 125295 125292 125297 125289 125307 125326
## [951] 125344 125358 125370 125389 125387 125401 125383 125384 125386 125367
## [961] 125353 125345 125352 125360 125359 125368 125378 125376 125377 125373
## [971] 125391 125392 125410 125425 125423 125437 125447 125465 125450 125448
## [981] 125441 125434 125431 125419 125415 125433 125426 125420 125417    939
precio2 <- duplicated(precio)
preciofinal <- c(which(precio2[] == TRUE))

preciofinal
## integer(0)

NOTA: Sólo realicé 500 repeticiones porque mi computadora no almacena tanta información con rapidez.

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

secuencia <- seq(1, 1000)               # definimos una variable que tome valores del 1 al 1000

m3 <- secuencia[secuencia%%3 == 0]              # definimos una variable que tome los valores del 1 al 1000 que sean múltiplos de 3
m5 <- secuencia[secuencia%%5 == 0]              # definimos una variable que tome los valores del 1 al 1000 que sean múltiplos de 5

u <- union(m3, m5)              # creamos una variable, que sea la unión de los múltiplos de 3 y 5    

res <- sum(u)                   # sumamos los valores que toma la variable anterior

cat("La suma de todos los múltiplos de 3 o 5 menores a 1000 es ", res, ".\n", sep = "")
## La suma de todos los múltiplos de 3 o 5 menores a 1000 es 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:

# Serie de Fibonacci 
fibonacci = function(n) {          # Creamos una función para imprimir los términos de la serie
  f <- 0                           # Creamos un vector vacio y agregamos valores para las primeras dos posiciones
  f[1] <- 0
  f[2] <- 1
  
  if(n == 1) {                     # Por método recursivo, diseñamos el algoritmo para cada caso
    f <- c(0)
  } 
  if(n == 2) {
    f <- c(0, 1)
  } else {
    for (i in 3:n) {
      f[i] = f[i - 1] + f [i - 2]
    }
  }
  return(f)
}

numfibonacci = fibonacci(45)            # Convertimos la función a valores numéricos para poder operar

pares <- numfibonacci[numfibonacci%%2 == 0]
pares                       # Diseñamos un conjunto de los términos pares de la serie y los imprimimos
##  [1]         0         2         8        34       144       610      2584
##  [8]     10946     46368    196418    832040   3524578  14930352  63245986
## [15] 267914296
impares <- numfibonacci[numfibonacci%%2 != 0]
impares                     # Diseñamos un conjunto de los términos impares de la serie y los imprimimos
##  [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
x <- sum(impares)
x                     # Creamos una variable que contenga la suma de los términos pares
## [1] 1485607536
y <- sum(pares)
y                     # Creamos una variable que contenga la suma de los términos pares
## [1] 350704366
z <- x/y              # Diseñamos una variable que dé la proporción de pares e impares

cat("Al dividir el número de elementos impares entre pares de la serie de fibonacci obtenemos que la razón es ", z, ".\n", sep ="")
## Al dividir el número de elementos impares entre pares de la serie de fibonacci obtenemos que la razón es 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:

library(ggplot2)
library(plotly)

divisionfibonacci = function(n) {       # Diseñamos una nueva función para poder obtener la proporción de cada entrada 
  num = fibonacci(n)            # Convertimos la función en valores numéricos
  
  impar = length(num[num%%2 != 0])      # Diseñamos variables para la dimensión del vector de números pares e impares 
  par = length(num[num%%2 == 0])
  z = 0          # Agregamos una variable vacía
  
  if(par == 0) {         # Añadimos indicaciones para cada caso
    z = NULL
    
  } else {
    z = impar/par       # Definimos z como la división de impares entre pares
  }
  
  return(z)
}

proporcion = NULL        
for (i in 1:30) {
  proporcion <- c(proporcion, divisionfibonacci(10 * i))         # Definimos uno de nuestros ejes
}

n <- 1:length(proporcion)        # Le ponemos un rango a nuestro eje de términos de la serie

tablafibonacci <- data.frame(n, proporcion)        # Convertimos los valores anteriores en un data frame
tablafibonacci
##     n proporcion
## 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
## 21 21  0.3291139
## 22 22  0.3095238
## 23 23  0.2921348
## 24 24  0.2765957
## 25 25  0.2626263
## 26 26  0.2500000
## 27 27  0.2385321
## 28 28  0.2280702
## 29 29  0.2184874
## 30 30  0.2096774
plot_ly(tablafibonacci, x = ~n, y = ~proporcion, type = "scatter", linetype = 1, color = I("mediumturquoise")) # Graficamos los valores

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:

numerosprimos = function(n) {    # Creamos una función para encontrar números primos
  np <- NULL
  if(n >= 1 && n <= 3) {        # Para los primeros 3 números, devolvemos estos valores
    return(n)
    
  } else {
    i = 2                  # Para números mayores, creamos un nuevo ciclo
    repeat {
      if(n%%i == 0 || i == n) {         # Revisamos que los números sólo sean divisibles entre sí mismo y 1
        if (i < n) np <- NULL
        break                    # Si no ocurre lo anterior, rompemos la cadena
      }
      i = i + 1
    }
    if(i == n) {
      np <- n
    }
    return(np)
  }
}

primos <- NULL             # Definimos uno de nuestros ejes donde se vea la cantidad de números primos
for (i in 1:1000) {
  primos <- c(primos, numerosprimos(i))
}

n <- 1:length(primos)     # Le ponemos un rango a nuestro eje de términos de la serie

tablaprimos <- data.frame(n, primos)   # Convertimos los valores anteriores en un data frame
tablaprimos
##       n primos
## 1     1      1
## 2     2      2
## 3     3      3
## 4     4      5
## 5     5      7
## 6     6     11
## 7     7     13
## 8     8     17
## 9     9     19
## 10   10     23
## 11   11     29
## 12   12     31
## 13   13     37
## 14   14     41
## 15   15     43
## 16   16     47
## 17   17     53
## 18   18     59
## 19   19     61
## 20   20     67
## 21   21     71
## 22   22     73
## 23   23     79
## 24   24     83
## 25   25     89
## 26   26     97
## 27   27    101
## 28   28    103
## 29   29    107
## 30   30    109
## 31   31    113
## 32   32    127
## 33   33    131
## 34   34    137
## 35   35    139
## 36   36    149
## 37   37    151
## 38   38    157
## 39   39    163
## 40   40    167
## 41   41    173
## 42   42    179
## 43   43    181
## 44   44    191
## 45   45    193
## 46   46    197
## 47   47    199
## 48   48    211
## 49   49    223
## 50   50    227
## 51   51    229
## 52   52    233
## 53   53    239
## 54   54    241
## 55   55    251
## 56   56    257
## 57   57    263
## 58   58    269
## 59   59    271
## 60   60    277
## 61   61    281
## 62   62    283
## 63   63    293
## 64   64    307
## 65   65    311
## 66   66    313
## 67   67    317
## 68   68    331
## 69   69    337
## 70   70    347
## 71   71    349
## 72   72    353
## 73   73    359
## 74   74    367
## 75   75    373
## 76   76    379
## 77   77    383
## 78   78    389
## 79   79    397
## 80   80    401
## 81   81    409
## 82   82    419
## 83   83    421
## 84   84    431
## 85   85    433
## 86   86    439
## 87   87    443
## 88   88    449
## 89   89    457
## 90   90    461
## 91   91    463
## 92   92    467
## 93   93    479
## 94   94    487
## 95   95    491
## 96   96    499
## 97   97    503
## 98   98    509
## 99   99    521
## 100 100    523
## 101 101    541
## 102 102    547
## 103 103    557
## 104 104    563
## 105 105    569
## 106 106    571
## 107 107    577
## 108 108    587
## 109 109    593
## 110 110    599
## 111 111    601
## 112 112    607
## 113 113    613
## 114 114    617
## 115 115    619
## 116 116    631
## 117 117    641
## 118 118    643
## 119 119    647
## 120 120    653
## 121 121    659
## 122 122    661
## 123 123    673
## 124 124    677
## 125 125    683
## 126 126    691
## 127 127    701
## 128 128    709
## 129 129    719
## 130 130    727
## 131 131    733
## 132 132    739
## 133 133    743
## 134 134    751
## 135 135    757
## 136 136    761
## 137 137    769
## 138 138    773
## 139 139    787
## 140 140    797
## 141 141    809
## 142 142    811
## 143 143    821
## 144 144    823
## 145 145    827
## 146 146    829
## 147 147    839
## 148 148    853
## 149 149    857
## 150 150    859
## 151 151    863
## 152 152    877
## 153 153    881
## 154 154    883
## 155 155    887
## 156 156    907
## 157 157    911
## 158 158    919
## 159 159    929
## 160 160    937
## 161 161    941
## 162 162    947
## 163 163    953
## 164 164    967
## 165 165    971
## 166 166    977
## 167 167    983
## 168 168    991
## 169 169    997
plot_ly(tablaprimos, x = ~n, y = ~primos, type = "scatter", linetype = 1, color = I("pink")) # Graficamos estos valores

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

Solución: Como contraejemplo, tomaremos dos variables no independientes. Sea X~N(0, 1) y Y = X^2 variables aleatorias no independientes. Calcularemos la covarianza.

X <- rnorm(1, mean = 0, sd = 1)     # Definimos a X como una variable aleatoria con distribución Normal, media 0 y varianza 1
Y <- X^2      # Definimos una variable aleatoria Y, dependiente de X.

covarianza <- mean(X - mean(X)) * mean(Y - mean(Y))    # Creamos una variable para la covarianza, dada por su definción clásica

cat("Cov(X, Y) = ", covarianza, ".\n", "Además, las variables no son independientes", ".\n", sep ="")     # Imprimimos la covarianza
## Cov(X, Y) = 0.
## Además, las variables no son independientes.

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:

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: