Un poco de inversiones
Empecé a interesarme por el tema de las inversiones allá por el verano de 2019 e inmediatamente me sumergí en el mar de diversas publicaciones y video blogueros que, en desacuerdo, dieron consejos sobre cómo y dónde invertir. Quedó claro que en el mundo de las inversiones, hay dos formas principales de tomar decisiones, que se basan en el análisis fundamental y técnico. El primer método es más adecuado para inversiones a largo plazo y el segundo para especulaciones.
Después de algún tiempo, se entendieron los indudables beneficios de jugar varios escenarios históricos como "qué pasaría si invirtiera en tal año y durante tal período". Este tipo de análisis le permite sentir la diferencia entre los valores adecuados para la inversión y la especulación y forma una comprensión del inversionista novato sobre qué instrumentos financieros y durante qué período de tiempo vale la pena invertir.
Maduración de ideas, elección de host y arquitectura de servicios web
Con el tiempo, surgió la idea de crear un servicio en forma de sitio web, que permitiera reproducir escenarios históricos de inversión en diversos instrumentos financieros.
Y el siguiente paso fue identificar tres puntos clave:
- selección de anfitrión;
- selección de una pila de tecnología y una arquitectura de servicios;
- buscar una fuente abierta de datos de la que sea posible extraer información sobre cotizaciones de mercado.
Inmediatamente quedó claro que es deseable reproducir scripts (es decir, realizar todos los cálculos) en el lado del servidor. Y hay tres razones. La primera es la renuencia a abrir todo el código al usuario. La segunda razón es la búsqueda de una solución en la que no haya una necesidad fundamental de transferir todos los datos a través de la red, y la tercera es la independencia de las capacidades informáticas del lado del usuario. La elección se hizo con miras al futuro, si de repente el volumen de datos llega a ser tan grande que será necesario implementar el back-end en plataformas especializadas como Amazon Web Services o Microsoft Azure. Como es habitual, dada la ambición suficiente, las soluciones se eligen inicialmente para que sean escalables.
En cuanto a los lenguajes de programación, inicialmente no había dudas sobre la interfaz. Todo es bastante estándar: html + css + javascript. Se decidió escribir el backend en Python, ya que es uno de los lenguajes más populares y compatibles para el desarrollo rápido y la creación de prototipos en la actualidad. Todas las decisiones posteriores fueron, en cierta medida, consecuencia de la elección realizada anteriormente.
Se eligió Pythonanywhere.com como anfitrión, cuya característica distintiva es que está orientado a la programación en Python y ofrece una tarifa relativamente barata de $ 5 por mes. El desarrollo posterior del sitio web se llevó a cabo utilizando el marco Django. Aunque este marco no se considera el más simple, proporciona al desarrollador amplias herramientas en forma de vistas, plantillas y aplicaciones de complementos listas para usar, que en total le permiten construir un sitio web completo.
En cuanto a la elección de una fuente de datos, casi de inmediato me llamó la atención un servicio como Yahoo Finance y, en consecuencia, la biblioteca yfinance que proporciona una API conveniente para Python.
Algunas características de pythonanywhere.com
El alojamiento de Pythonanywhere le permite trabajar en varios modos:
- lanzar el intérprete de Python en la consola;
- trabajar en una computadora portátil jupyter;
- Lanzamiento de aplicaciones web completas.
Si lo desea, el alojamiento le permite instalar y usar cualquier marco web de Python. Puede que no sea necesariamente Django, pero, por ejemplo, el mismo Flask, que se considera más fácil de aprender. Configurar y publicar una aplicación web está literalmente a unos pocos clics de distancia para que pueda concentrarse en lo esencial.
El conveniente tablero brinda acceso rápido a archivos y carpetas, a la consola y a cualquier configuración. Soporte integrado para https, nombres de dominio conectados, así como protección con contraseña del contenido del sitio. La supervisión del tráfico está disponible, así como los registros del servidor a través del enlace en el panel.
También me gustaría señalar una conveniencia más indudable para el desarrollador. Además de los registros del servidor, cuando se producen errores en el backend, el seguimiento y los valores locales de las variables a menudo se muestran directamente en la ventana del navegador actual en el momento de llamar a las funciones y métodos correspondientes. Además, el rastro se puede ver incluso en la ventana del navegador de un teléfono inteligente.
Este tipo de modo de depuración personalmente me ayudó mucho, permitiéndome corregir errores en el código literalmente sobre la marcha.
Otro punto importante que sin duda merece su atención es trabajar con sistemas de control de versiones. Git, svn y hg / mercurial están disponibles en la consola integrada de Bash.
Trabajando con datos
Elegí el proveedor de información financiera Yahoo Finance y la biblioteca yfinance debido a la falta de tarifas de suscripción y acceso a actualizaciones diarias de información bursátil. A través de la API yfinance, el servicio en línea extrae información sobre la marcha de tres bolsas de valores estadounidenses NASDAQ, NYSE y AMEX. Sin embargo, debe prestar atención de inmediato al hecho de que en el sitio del desarrollador yfinance hay una advertencia sobre la prohibición del uso comercial.
En cuanto a la tecnología de interacción con el servidor web, inicialmente se carga en el navegador una plantilla con marcado html. El siguiente paso es ejecutar javascript, que utiliza el método de obtención de solicitudes para recuperar todos los datos necesarios del servidor. La actualización del contenido de la página se realiza utilizando tecnología Ajax a través de las interfaces de la biblioteca jQuery.
Todos los datos del servicio en línea se almacenan en dos formatos: csv y SQLite. Esta elección me permitió comenzar a implementar rápidamente la lógica central sin tener que instalar y configurar un servidor de base de datos.
Un poco sobre Django
También me gustaría detenerme por separado en tres componentes de software que se integraron en la arquitectura del sitio con bloques listos para usar, lo que aceleró significativamente el desarrollo. Me refiero al panel de administración de Django, el módulo de gestión de sesiones django.contrib.sessions y el marco excontrib / django_comments.
Django le permite crear proyectos a partir de componentes de software separados llamados aplicaciones. Una vez escritas, las aplicaciones se pueden reutilizar en diferentes proyectos. Para incrustar los componentes anteriores en el proyecto, debe especificarlos explícitamente en el archivo settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.sessions',
'django_comments',
…
]
Además, los patrones de URL deben configurarse adecuadamente para realizar solicitudes desde el lado del navegador:
urlpatterns = [
url(r'^admin/', admin.site.urls)
url(r'^comments/', include('django_comments.urls')),
…
]
Como puede ver en los fragmentos de código anteriores, no es tan difícil incrustar componentes listos para usar y, como resultado, agregan una parte significativa de la funcionalidad al proyecto.
Después de implementar el marco de django, iniciar el panel de administración requiere algunos pasos simples: verifique la configuración de su archivo settings.py, migre los modelos de datos integrados y cree un superusuario. El administrador tiene asignado su nombre de usuario, contraseña y buzón de correo. De forma predeterminada, se accede al panel de administración agregando la ruta estándar / admin / a la URL del dominio.
Dentro del panel hay una interfaz conveniente para administrar la base de datos incorporada. De forma predeterminada, esta base de datos almacena información sobre usuarios y grupos de usuarios. Esto es muy conveniente porque es fácil implementar la autorización del usuario en el sitio. Y si la velocidad del lanzamiento del sitio web es fundamentalmente importante, puede ahorrar tiempo y no crear una página separada para obtener nuevos usuarios y otorgarles derechos. Basta con ir al panel de administración y agregar una nueva entrada a la base de datos a través de la interfaz de usuario. Sin embargo, esta solución solo es adecuada para una pequeña cantidad de usuarios, ya que no les brinda a los usuarios la posibilidad de registrarse y restablecer su contraseña ellos mismos.
Otra característica del panel de administración es que da acceso no solo a los datos del usuario, sino, en principio, a cualquier dato que esté almacenado en la base de datos bajo el control de Django. Por ejemplo, además de los datos sobre los usuarios autorizados, la base de datos almacena parcialmente el contenido del sitio y los comentarios dejados por los visitantes.
Les contaré sobre un truco de vida que utilicé para agregar un formulario de comentarios a la página Acerca de mí. Para no escribir código separado ni para el navegador ni para procesar datos en el servidor, en lugar de un formulario de comentarios, se creó un bloque de comentarios estándar en la plantilla html correspondiente, pero se eliminó la capacidad de ver el historial. Con este enfoque, los datos del formulario de comentarios se procesan y almacenan en la misma tabla que los comentarios de los visitantes del sitio.
La gestión de sesiones se ha implementado utilizando el módulo integrado django.contrib.sessions. Los objetos de sesión almacenan información sobre la configuración seleccionada por los usuarios cuando visitan el sitio. En particular, las sesiones almacenan el período de inversión seleccionado, el período histórico para el análisis, el idioma del sitio.
Me extenderé un poco sobre cómo hice que el sitio fuera multilingüe. Para mí era importante encontrar una solución simple y rápida en la que pudiera ir al panel de alojamiento y editar el texto de cualquier artículo con solo dos clics. Por lo tanto, para almacenar los textos de los artículos elegí el formato de archivos de texto independientes y no cargarlos en la base de datos. Dada una pequeña cantidad de artículos (aproximadamente, hasta 10) y solo dos opciones para la selección del idioma (ruso e inglés), considero que esta solución es bastante aceptable. Nuevamente, todo depende de la escala.
Y lo último en lo que me gustaría centrarme es en el uso de plantillas de Django. Entre otras cosas, las plantillas le permiten importar valores de variables a una página html directamente desde el código Python, así como recopilar páginas html de varios bloques independientes. Como ilustración, daré un ejemplo directamente de mi código.
Incrustar varios bloques con contenido dinámico en el esqueleto general de una página html:
html:
{% include article_file_name %}
{% include online_service_file_name %}
{% include comments_file_name %}
Pyhton/backend:
def view_article(request, selected_url_path = 'expected_return'):
…
context = {
…
'article_file_name':article_file_name,
'online_service_file_name':online_service_file_name,
'comments_file_name':comments_file_name,
…
}
return render(request, 'articles/base_blog_page.html', context=context)
Aquí article_file_name, online_service_file_name y comments_file_name son en realidad los nombres de las variables a través de las cuales se pasan las rutas a los archivos html con el contenido agregado.
Conclusión. Experiencia útil de autodesarrollo de un servicio web
Puede ver el resultado de mi trabajo en el proyecto haciendo clic en el enlace www.emarkoff.com .
La plataforma pythonanywhere es generalmente una buena solución para desarrollar aplicaciones web basadas en Django. Y si tiene sus propias ideas, entonces dos o tres meses serán suficientes para que comprenda los conceptos básicos e implemente alguna aplicación web simple, incluso si no es un desarrollador web profesional.
Esta experiencia puede ser muy útil para gerentes, analistas y cualquier persona que tenga que lidiar con el desarrollo web y los servicios web en un deber, especialmente durante la etapa de prueba beta. Podrá comprender mejor el significado de los mensajes de error del servidor, comunicarse de manera más productiva con el soporte técnico y los representantes de desarrollo.