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: