15 Jun

Fighters!

El problema original fue publicado por la revista InfORMS en Octubre de 2014. A continuación su versión en español.

Cuatro combatientes debaten entre quién de ellos es el más fuerte. La figura 1 muestra a los cuatro combatientes: Allan, Barry, Charles y Dan.
Cada luchador tiene diferentes habilidades de ataque y resistencia. Al inicio de la batalla tienen diferentes puntos de resistencia: Allan tiene 10, Barry tiene 12, Charles tiene 16 y Dan tiene 18. Además, cada luchador tiene diferentes puntos de ataque: Allan tiene 4, Barry tiene 3, Charles tiene 2 y Dan tiene 1.
La batalla tiene lugar en varias rondas, cada una consistente en un solo ataque. En cada ronda, una atacante aleatorio y un defensor aleatorio son elegidos.
Cuando el atacante ataca a un defensor, el defensor pierde puntos de resistencia en la cantidad equivalente a los puntos de ataque del contrincante. Por ejemplo, si Allan es el atacante y Barry es el defensor, Barry perdería cuatro puntos de resistencia.
Los combatientes continúan atacando y defendiendo aleatoriamente en las rondas siguientes hasta que sólo queda un luchador, quien entonces es declarado ganador. Se elimina un luchador de la batalla cuando sus puntos de vida se convierten en cero (o menos).
Pregunta: ¿Qué peleador es más probable que gane la batalla?

 

Un simple ejercicio de simulación, la respuesta se publicará en una semana.

 

Respuesta

En el link de final de página se encuentra una macro sencilla que permite simular múltiples repeticiones de un combate entre los cuatro jugadores. El código que realiza la simulación se explica a continuación: En síntesis, una vez borrado el resultado de la ronda anterior, se elige un atacante y un defensor de manera aleatoria y se hace un ataque por un valor entre 1 y el mínimo entre el número de puntos de defensa y el número de puntos de ataque. Este valor se resta al jugador de defensa y se repite el proceso hasta que solo quede un jugador con puntos. Esto se contabiliza dentro del tablero de mando al inicio del archivo. Al final, luego de al menos 1000 repeticiones, se establece el jugador que más partidas ha ganado, que bajo las configuraciones descritas arriba es Charles con una probabilidad del 32.5%.

Descarga del archivo de Excel.

18 May

Macro para transferir archivos a un sitio FTP

Recientemente tuve un caso donde luego de realizar unos cálulos automatizados en Excel, el resultado debía transferirse a un sitio FTP.  El desafío entonces es si es posible crear una manera automatizada de transferir estos archivos al sitio remoto.

Encontré varios recursos en línea y gracias a ellos desarrollé la siguiente solución

En síntesis es una macro que crea un archivo de texto con las instrucciones en sintaxis FTP, luego crea un archivo Batch que transfiere instrucciones MS-DOS siguiendo cada una de las  líneas del archivo de texto. Al finalizar, crea un archivo con extensión .out donde se confirma la transferencia.

Nótese que es necesario cambiar el código para agregar el usuario y password correcto. En ocasiones el sitio FTP no requiere password pues la conexión es anónima. Si este es el caso, simplemente remueva esas dos líneas del código.

El siguiente video muestra el programa en ejecución.

13 Aug

Macro para obtener historico de precios de una accion en Excel

[ File # csp9666250, License # 2222627 ] Licensed through http://www.canstockphoto.com in accordance with the End User License Agreement (http://www.canstockphoto.com/legal.php) (c) Can Stock Photo Inc. / bbbar

[ File # csp9666250, License # 2222627 ]
Licensed through http://www.canstockphoto.com in accordance with the End User License Agreement (http://www.canstockphoto.com/legal.php)
(c) Can Stock Photo Inc. / bbbar

Este programa permite descargar cualquier serie de precios disponible Yahoo Finanzas directamente a Excel con solo conocer el símbolo de la acción. Antes de comenzar es importante adicionar la referencia Microsoft XML en el módulo VBA accediendo con el método abreviado Alt+F11, luego haciendo click en Tools + Reference y buscar la referencia (ver imagen) la cuál permite importar y manipular archivos en formato XML.

ReferencesYahooFinances

La macro central de este programa se compone de varios elementos. El primero es la subrutina que genera la consulta llamada GetYahooFinanceTable (ver código a continuación).

La macro obtiene la información utilizando APIs de Yahoo Finanzas (lea aquí el wiki de los APIs de Yahoo finanzas). Un API que traducido al español significa Interfaz de programación de aplicaciones, es un conjunto de subrutinas predefinidas que puede ser utilizado por otro software de manera abreviada (Wikipedia API) en este caso para descargar datos de Yahoo (lea aquí un blog sobre como utilizar el API de Yahoo finanzas para archivos CSV).

Para utilizar el API simplemente construimos el query con los parámetros deseados, en este caso solamente necesitamos el código de la acción almacenado en la celda J2 (2, 10). Utilizemos como ejemplo la acción de 3M (MMM). El comando requerido por el API será http://ichart.finance.yahoo.com/table.txt?s=mmm. Si usted introduce este código en su explorador podrá descargar un archivo de texto con el histórico de precios.

GetYahooFinanceTable ejecuta a su vez la función GetHTTPResult y la subrutina UpdatePriceData. La función permite crear la consulta (query) en formato XMLHTTP y lanzarla a la web.

La subrutina UpdatePriceData prepara y llena los vectores con el resultado de la consulta. Para ello llama a la función GetQuoteXmlFromWeb y la subrutina GetQuoteFromXml.

La función GetQuoteXmlFromWeb es la que descarga la información en archivo XML y lo traduce. Un archivo XML es una estructura anidada de datos (padre e hijo) lo que permite manipular múltiples dimensiones y gran cantidad de información. Desafortunadamente no es tan simple descifrar la estructura por lo que utilizamos una función para descifrar la relación jerárquica de datos (ver función FindChildNodeName al final).

 

Finalmente, la función GetQuoteFromXml es una adición que bien puede ser opcional. Su utilidad es lanzar una nueva consulta que permite conocer los datos básicos de la acción, como el nombre, el último volumen transado, el mayor y menor valor de transacción del día, el último valor de transacción y la última hora de actualización. Si bien una buena parte de la información se encuentra en la serie de precios, esta función es útil cuando se tiene el símbolo y no se conoce el nombre exacto, o cuando se lanza la consulta y los mercados están aún abiertos por tanto no se conoce el precio de cierre de la acción. La siguiente es la función:

Lo demás es estético y a gusto del usuario, una vez la serie se carga en la hoja de cálculo se pueden crear gráficos, estadísticas y demás. Usted puede descargar una versión comprimida de esta macro con algunas adiciones en el siguiente link. Una vez funcional la macro usted tendrá un reporte como el presentado a continuación.

quote

 

Comentarios finales:

21 Oct

Macro Excel para reproducir un video

De esas cosas curiosas que uno se encuentra en la web. Un analista en una empresa se sentía muy monitoreado y restringido en su trabajo pues no tenía acceso a las aplicaciones comunes de su computador como el Windows media player y las aplicaciones de internet. Incluso su rendimiento era monitoreado según la utilización de recursos de su computador, principalmente Excel. Así que decidió hacer algo bastante inusual, creó una macro que permite insertar videos en Excel y reproducir de forma continua una lista determinada.

VMqYo5b

 

El link para descargar el archivo y las instrucciones se encuentra aquí

Como dato extra, la aplicación es además util para casos de monitoreo pues toda la utilización de recursos del computador queda concentrada en Excel.

13 Dec

Macro Excel para desproteger una hoja de cálculo

Les ha pasado alguna vez que reciben una hoja de excel protegida y no saben como modificarla? Existe una manera de desbloquearla con una macro sencilla que se basea en el método de fuerza bruta. Solo necesita ingresar al editor de visual basic (Alt + F11) e insertar el siguiente código:

Finalmente debe llamar (ejecutar) la macro Unprotect desde la hoja que quiere desproteger y listo.

Atención: Este método es efectivo, sin embargo tiene un inconveniente y es que si bien permite desbloquear la hoja, no permite conocer el código para luego bloquearla en su estado original. Vale la pena saber esto antes de ejecutarlo.

%d bloggers like this: