Un Modelo de Selección: Universo Flexible

El equipo de Quantconnect a creado unas herramientas muy útiles para su motor Lean; su modelo de universo QC500 permite seleccionar acciones de compañías intentando replicar lo más fielmente posible los constituyentes del índice S&P 500. Su implementación está aquí. Usamos ese modelo de universo constantemente para nuestros propios análisis y generalmente tenemos que incluir pequeños cambios en los parámetros; a veces queremos las compañías con más volumen negociado el periodo anterior, a veces las que menos, o queremos limitar la "edad" de la compañía utilizando su fecha de Oferta Pública Inicial (su fecha de "IPO").


Para no tener que modificar los parámetros dentro del modelo hemos añadido la posibilidad de fijar estas variables como parámetros del modelo de selección de universo. Llamamos a este universo el modelo de Selección de Universo Flexible. También nos hemos tomado la libertad de poner en acción lo que pensamos son la mejores prácticas en términos de documentación de código en Python: añadimos los "docstrings" y pistas de tipo ("typehinting"). No queremos presentar esta documentación como la mejor práctica posible, sino como un ejercicio de ilustración de estas mejores prácticas. Hemos utilizado el modelo de documentación de Google, tampoco inventamos nada.


Esta entrada contiene imágenes de código que resultan generalmente ignoradas por los motores de búsqueda e indexación; utilizamos este forma por razones estéticas; los estilizadores de código como este o este generarán múltiples líneas para cada texto que son difíciles de leer en formato HTML. Una base de código altamente anotada, bien documentada se lee casi más como una novela que como un programa de ordenador, puede que no sea muy cómoda de leer en ciertos ambientes de desarrollo (IDEs) o navegadores.


Esto es básicamente la forma, en oposición a la substancia, como dijo Federico Fellini, y traduzco libremente del inglés, posiblemente traducido del italiano, con disculpas ante todo:


"Descubrí que lo que es realmente importante para un creador no es lo que vagamente definimos como inspiración ni siquiera lo que queremos decir, recordar, arrepentirnos de o rebelarnos contra. No, lo que es importante es la forma en lo que lo decimos. El arte es sobre todo artesanía. Los demás pueden interpretar la artesanía como un estilo si así lo desean. El estilo es lo que une la memoria o el recuerdo, la ideología, el sentimiento, la nostalgia, presentimiento de la forma en lo que lo queremos expresar. No es lo que decimos lo que importa, sino cómo lo decimos".


El estilo es lo que une la memoria a la expresión.


Primero mostraremos la clase de universo anotada, heredando del modelo de selección de universo por características fundamentales (FundamentalUniverseSelecionModel):

Python class typehints for a stock selection model.

Este universo nos permite fijar el número de compañías para filtrar inicialmente en un universo basto y el número de compañías (fine) a devolver a nuestro algoritmo. También permitiremos que nuestro universo filtre por edad pública de la compañía mirando a su fecha de IPO. Podemos controlar el volumen de negocio, limitar por ultimos precios y por capitalización de mercado. El modelo también permite el cálculo diario o mensual, con trabajo adicional, se puede implementar un recálculo cada cierto dia de la semana, aunque esto puede ser pasarse de detalle. Se pueden filtrar los mercados en los que la compañía cotiza junto con el país de "residencia" de la compañía. Finalmente podemos devolver las compañías con más volumen negociado... o con el que menos.


Todos estos parámetros se fijan en sus valores por defecto en la inicialización de la clase, dentro de la clase, no hay que definirlos dos veces, podemos cortar el texto de definición de arriba, en la entrada de la clase y ponerlo aquí, en la inicialización:


Escribir el tipo "list", una palabra reservada por el sistema, requiere importar "List" en con mayúscula desde el módulo typing. Para el que esté a la ultima, ultima, en el lanzamiento 3.9.4 ya podemos utilizar "list" como tipo genérico. Aquí están las notas del lanzamiento.


Los argumentos ahora muestran la notación para las pistas de tipo siguiendo este documento. Nótese que para los argumentos de palabra clave la sintaxis es "variable: tipo = valor por defecto". El valor para el tipo de retorno de las funciones de inicialización es por convención None, escrito "-> None". Dibujo de flechita None. Los métodos dentro de la clase se pueden anotar de manera análoga:

Python documented function with typehints.

Básicamente esto mejora nuestro lenguaje dinámico hacia un lenguaje de pistas estáticas. Lo mejor y lo peor de dos mundos. Las pistas de tipo no están forzando ninguna funcionalidad dentro de las funciones o definiciones de clase; cualquier llamada de ayuda o inspección de código producirá la información que buscamos respecto al tipo de variables o cuando hagamos este trabajo automáticamente sin ejecutar el código. Podemos mirar mypy como ejemplo de comprobación automática de código usando estas pista de tipo.


Otra mejora de legibilidad que podemos añadir a nuestro código de Python es ajustarnos a la guía de estilo PEP8. La guia es compleja de seguir a rajatabla, cumplirlo todo es prácticamente imposible. Si solo estamos buscando mejorar levemente la legibilidad podemos usar el módulo pep8 o hacerlo online si la privacidad del codigo no es una preocupación. Generalmente mantener las lineas de codigo por debajo de los 79 caracteres es tarea imposible, sobre todo intentando simultáneamente tener variables con nombres largos y no solo una letra, como les gusta a los matemáticos (X, y, h, g... no X_train, y_test, h_noseque, g_). Recordemos que mantener la línea por debajo de 80 caracteres es para poder tener dos ventanas abiertas simultáneamente para lecturas cruzadas.


En nuestra próxima entrega en español utilizaremos este modelo de universo flexible para generar informes de prueba para diferentes aproximaciones a filtros "taxonómicos" de compañías . El código para este modelo de selección de universo esta en nuestro repositorio.


Las publicaciones en Ostirion.net no son consejos financieros ni forman parte de un servicio de asesoramiento financiero. Ostirion.net no mantiene posiciones en ninguno de los instrumentos financieros que se mencionan en esta publicación en el momento de la publicación. Si necesita más información, apoyo con la gestión de activos financieros, desarrollo de estrategias de trading automatizados o despliegue táctico de estrategias existentes no dude en contactar con nosotros aquí.


6 vistas0 comentarios

Entradas Recientes

Ver todo