library(ggplot2)
library(plotly)
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
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)
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
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
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.
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.
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.
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