Desenvolvimento de um serviço online para investidores em pythonanywhere.com usando dados do Yahoo Finance

O objetivo deste artigo é compartilhar a experiência de desenvolvimento de um serviço analítico online para investidores em python. O foco está mais em questões conceituais do que em uma descrição detalhada de qualquer tecnologia específica. Espero que o leitor possa encontrar facilmente todos os detalhes pesquisando um pouco no Google. Para maior clareza, forneço um link para o serviço logo no início da apresentação www.emarkoff.com .



imagem



Um pouco sobre investimentos



Comecei a me interessar pelo tema investimentos já no verão de 2019 e imediatamente mergulhei no mar de várias publicações e videobloggers que, em desacordo, davam conselhos sobre como e onde investir. Ficou claro que, no mundo dos investimentos, existem duas formas principais de tomar decisões, que são baseadas na análise fundamentalista e técnica. O primeiro método é mais adequado para investimentos de longo prazo e o segundo para especulação.



Depois de algum tempo, veio a compreensão dos benefícios indiscutíveis de jogar vários cenários históricos como “o que aconteceria se eu investisse em tal e tal ano e para tal e tal período”. Esse tipo de análise permite que você sinta a diferença entre títulos adequados para investimento e especulação e forma um entendimento do investidor iniciante em quais instrumentos financeiros e por quanto tempo vale a pena investir.



Maturação de ideias, escolha de hospedagem e arquitetura de serviço da web



Com o tempo, surgiu a ideia de criar um serviço em forma de website, que permitisse reproduzir cenários históricos de investimento em diversos instrumentos financeiros.



E a próxima etapa foi identificar três pontos principais:



  • seleção de hospedeiros;
  • seleção de uma pilha de tecnologia e arquitetura de serviço;
  • busca por uma fonte aberta de dados a partir da qual seja possível extrair informações sobre cotações de mercado.


Imediatamente ficou claro que é desejável reproduzir scripts (ou seja, realizar todos os cálculos) no lado do servidor. E há três razões. O primeiro é a relutância em abrir todo o código para o usuário. O segundo motivo é a busca por uma solução em que não haja necessidade fundamental de transferência de todos os dados pela rede, e o terceiro é a independência dos recursos computacionais por parte do usuário. A escolha foi feita com vistas ao futuro, se de repente o volume de dados ficar tão grande que será necessário implantar o back end em plataformas especializadas como Amazon Web Services ou Microsoft Azure. Como de costume, dada a ambição suficiente, as soluções são inicialmente escolhidas para serem escaláveis.



Quanto às linguagens de programação, inicialmente não havia dúvidas sobre o frontend. Tudo é bastante normal: html + css + javascript. Decidiu-se escrever o back-end em python, já que é uma das linguagens mais populares e suportadas para desenvolvimento rápido e prototipagem hoje. Todas as decisões subsequentes foram, em certa medida, uma consequência da escolha feita acima.



O Pythonanywhere.com foi escolhido como host, cuja característica distintiva é que ele é voltado para programação em python e oferece uma taxa relativamente barata de US $ 5 por mês. O desenvolvimento subsequente do site foi realizado usando o framework Django. Embora esta estrutura não seja considerada a mais simples, ela fornece ao desenvolvedor ferramentas extensivas na forma de visualizações, modelos e aplicativos prontos para plug-ins, que no total permitem que você crie um site completo.

Em termos de escolha de uma fonte de dados, quase imediatamente minha atenção foi atraída por um serviço como o Yahoo Finance e, consequentemente, a biblioteca yfinance que fornece uma API conveniente para python.



Alguns recursos de pythonanywhere.com



A hospedagem Pythonanywhere permite que você trabalhe de vários modos:



  • iniciar o interpretador python no console;
  • trabalhar em um laptop jupyter;
  • lançando aplicativos da web completos.


Se desejar, a hospedagem permite que você instale e use qualquer estrutura da web python. Pode não ser necessariamente Django, mas, por exemplo, o mesmo Flask, que é considerado mais fácil de aprender. Configurar e publicar um aplicativo da web está literalmente a alguns cliques de distância para que você possa se concentrar no essencial.



O painel conveniente oferece acesso rápido a arquivos e pastas, ao console e a quaisquer configurações. Suporte integrado para https, nomes de domínio conectados, bem como proteção por senha do conteúdo do site. O monitoramento de tráfego está disponível, bem como os logs do servidor por meio do link no painel.



Também gostaria de observar outra conveniência indiscutível para o desenvolvedor. Além dos logs do servidor, quando ocorrem erros no lado do back-end, o rastreamento e os valores locais das variáveis ​​são frequentemente exibidos na janela atual do navegador no momento da chamada das funções e métodos correspondentes. Além disso, o rastreamento pode ser visto até mesmo em uma janela de navegador em um smartphone.

Esse tipo de modo de depuração pessoalmente me ajudou muito, permitindo-me corrigir erros no código literalmente na hora.



Outro ponto importante que sem dúvida merece sua atenção é trabalhar com sistemas de controle de versão. Git, svn e hg / mercurial estão disponíveis no console incorporado do Bash.



Trabalhando com dados



Escolhi o provedor de informações financeiras Yahoo Finance e a biblioteca yfinance devido à falta de taxas de assinatura e acesso a atualizações diárias de informações sobre ações. Por meio da API yfinance, o serviço online obtém informações em tempo real de três bolsas de valores americanas NASDAQ, NYSE e AMEX. No entanto, você deve prestar atenção imediatamente ao fato de que no site do desenvolvedor yfinance há um aviso sobre a proibição de uso comercial.



Quanto à tecnologia de interação web-servidor, um template com marcação html é inicialmente carregado no navegador. A próxima etapa é executar o javascript, que usa o método get-requests para recuperar todos os dados necessários do servidor. A atualização do conteúdo da página é realizada usando a tecnologia Ajax por meio das interfaces da biblioteca jQuery.



Todos os dados do serviço online são armazenados em dois formatos: csv e SQLite. Essa escolha me permitiu começar a implementar rapidamente a lógica principal sem precisar instalar e configurar um servidor de banco de dados.



Um pouco sobre Django



Eu também gostaria de me deter separadamente em três componentes de software que foram integrados à arquitetura do site com blocos prontos, o que acelerou significativamente o desenvolvimento. Quero dizer, o painel de administração do Django, o módulo de gerenciamento de sessão django.contrib.sessions e o framework excontrib / django_comments.



Django permite que você construa projetos a partir de componentes de software separados chamados aplicativos. Uma vez escritos, os aplicativos podem ser reutilizados em diferentes projetos. Para incorporar os componentes acima ao projeto, você deve especificá-los explicitamente no arquivo settings.py



INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.sessions',
    'django_comments',
]


Além disso, os padrões de URL devem ser configurados adequadamente para fazer solicitações do lado do navegador:



urlpatterns = [
    url(r'^admin/', admin.site.urls)
    url(r'^comments/', include('django_comments.urls')),
]


Como você pode ver nos trechos de código acima, não é tão difícil incorporar componentes prontos e, como resultado, eles adicionam uma parte significativa da funcionalidade ao projeto.



Depois de implantar a estrutura django, iniciar o painel de administração requer alguns passos simples: verifique as configurações do arquivo settings.py, migre os modelos de dados integrados e crie um superusuário. O administrador recebe seu login pessoal, senha e caixa de correio. Por padrão, o painel de administração é acessado adicionando o caminho padrão / admin / ao URL do domínio.

Dentro do painel, há uma interface conveniente para gerenciar o banco de dados integrado. Por padrão, este banco de dados armazena informações sobre usuários e grupos de usuários. Isso é muito conveniente porque é fácil implementar a autorização do usuário no site. E se a velocidade de lançamento do site é fundamentalmente importante, você pode economizar tempo e não criar uma página separada para obter novos usuários e conceder-lhes direitos. Basta ir ao painel de administração e adicionar uma nova entrada ao banco de dados por meio da IU. No entanto, esta solução é adequada apenas para um pequeno número de usuários, pois não oferece aos usuários a capacidade de se registrar e redefinir suas próprias senhas.



Outra característica do painel de administração é que dá acesso não apenas aos dados do usuário, mas, a princípio, a quaisquer dados armazenados no banco de dados sob o controle do Django. Por exemplo, além dos dados sobre usuários autorizados, o banco de dados armazena parcialmente o conteúdo do site e os comentários deixados pelos visitantes.



Vou lhe contar sobre um hack de vida que usei para adicionar um formulário de feedback à página Sobre mim. Para não escrever código separado para o navegador ou para processar dados no servidor, em vez de um formulário de feedback, um bloco de comentário padrão foi construído no modelo html correspondente, mas a capacidade de visualizar o histórico foi removida. Com essa abordagem, os dados do formulário de feedback são processados ​​e armazenados na mesma tabela que os comentários dos visitantes do site.



O gerenciamento de sessão foi implementado usando o módulo embutido django.contrib.sessions. Os objetos de sessão armazenam informações sobre as configurações selecionadas pelos usuários quando visitam o site. Em particular, as sessões armazenam o período de investimento selecionado, o período histórico para a realização da análise, o idioma do site.



Vou me alongar um pouco sobre como tornei o site multilíngue. Foi importante para mim encontrar uma solução simples e rápida, na qual pudesse ir ao painel de hospedagem e editar o texto de qualquer artigo em apenas dois cliques. Portanto, para armazenar os textos dos artigos, optei pelo formato de arquivos de texto independentes, e não os carreguei no banco de dados. Dado um pequeno número de artigos (grosso modo, até 10) e apenas duas opções de seleção de idioma (russo e inglês), considero esta solução bastante aceitável. Novamente, tudo depende da escala.

E a última coisa que gostaria de focar é o uso de modelos Django. Entre outras coisas, os modelos permitem importar valores de variáveis ​​para uma página html diretamente do código Python, bem como coletar páginas html de vários blocos independentes. Como ilustração, darei um exemplo diretamente do meu código.



Incorporando vários blocos com conteúdo dinâmico no esqueleto geral de uma 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)


Aqui, article_file_name, online_service_file_name e comments_file_name são na verdade os nomes das variáveis ​​por meio das quais os caminhos para os arquivos html com o conteúdo adicionado são passados.



Conclusão. Experiência útil de autodesenvolvimento de um serviço web



Você pode ver o resultado do meu trabalho no projeto clicando no link www.emarkoff.com .



A plataforma pythonanywhere é geralmente uma boa solução para desenvolver aplicativos da web baseados em Django. E se você tem suas próprias ideias, dois ou três meses serão suficientes para você entender o básico e implementar algum aplicativo web simples, mesmo se você não for um desenvolvedor web profissional.



Esta experiência pode ser muito útil para gerentes, analistas e qualquer pessoa que tenha que lidar com desenvolvimento web e serviços web em regime de plantão, especialmente durante o estágio de teste beta. Você será capaz de entender melhor o significado das mensagens de erro do servidor e se comunicar de forma mais produtiva com o suporte técnico e representantes de desenvolvimento.



All Articles