18.8. sinal - Definir manipuladores para eventos assíncronos
Este módulo fornece mecanismos para usar manipuladores de sinal em Python.
18.8.1. Regras gerais
A função sign. signal () permite a definição de manipuladores personalizados a serem executados quando um sinal é recebido. Um pequeno número de manipuladores padrão são instalados: SIGPIPE é ignorado (portanto, erros de gravação em pipes e sockets podem ser relatados como exceções Python comuns) e SIGINT é traduzido para uma exceção KeyboardInterrupt.
Um manipulador para um sinal específico, uma vez definido, permanece instalado até que ele seja redefinido explicitamente (o Python emula a interface de estilo BSD, independentemente da implementação subjacente), com exceção do manipulador do SIGCHLD, que segue a implementação subjacente.
18.8.1.1. Execução de manipuladores de sinal Python
Um manipulador de sinal Python não é executado dentro do manipulador de sinal de baixo nível (C). Em vez disso, o manipulador de sinal de nível baixo define um sinalizador que informa a máquina virtual para executar o manipulador de sinal Python correspondente em um ponto posterior (por exemplo, na próxima instrução bytecode). Isso tem conseqüências:
Não faz sentido capturar erros síncronos como SIGFPE ou SIGSEGV causados por uma operação inválida no código C. O Python retornará do manipulador de sinal para o código C, o que provavelmente aumentará o mesmo sinal novamente, fazendo com que o Python aparentemente fique pendurado. A partir do Python 3.3, você pode usar o módulo faulthandler para informar sobre erros síncronos. Um cálculo de longo prazo implementado puramente em C (como a correspondência de expressões regulares em um grande corpo de texto) pode ser executado ininterruptamente por uma quantidade arbitrária de tempo, independentemente de qualquer sinal recebido. Os manipuladores de sinal Python serão chamados quando o cálculo terminar.
18.8.1.2. Sinais e threads
Os manipuladores de sinal Python são sempre executados no segmento principal do Python, mesmo que o sinal tenha sido recebido em outro segmento. Isso significa que os sinais não podem ser usados como uma comunicação inter-thread. Você pode usar as primitivas de sincronização do módulo de encadeamento em vez disso.
Além disso, apenas o segmento principal é permitido configurar um novo manipulador de sinal.
18.8.2. Conteúdo do módulo
Alterado na versão 3.5: sinal (SIG *), manipulador (SIG_DFL, SIG_IGN) e sigmask (SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK) constantes relacionadas listadas abaixo foram transformadas em enums. As funções getignal (), pthread_sigmask (), sigpending () e sigwait () retornam enums legíveis por humanos.
As variáveis definidas no módulo de sinal são:
Esta é uma das duas opções de tratamento de sinal padrão; Simplesmente executará a função padrão para o sinal. Por exemplo, na maioria dos sistemas, a ação padrão para o SIGQUIT é despejar o núcleo e sair, enquanto a ação padrão para o SIGCHLD é simplesmente ignorá-lo.
Este é outro manipulador de sinal padrão, que simplesmente ignorará o sinal fornecido.
Todos os números de sinal são definidos simbolicamente. Por exemplo, o sinal de interrupção é definido como signal. SIGHUP; os nomes das variáveis são idênticos aos nomes usados nos programas C, conforme encontrado em & lt; signal. h & gt; . A página de manual do Unix para "sinal" (")" lista os sinais existentes (em alguns sistemas, isso é sinal (2), em outros a lista está no sinal (7)). Observe que nem todos os sistemas definem o mesmo conjunto de nomes de sinais; Somente os nomes definidos pelo sistema são definidos por este módulo.
O sinal correspondente ao evento de tecla Ctrl + C. Este sinal só pode ser usado com os. kill ().
Novo na versão 3.2.
O sinal correspondente ao evento de tecla Ctrl + Break. Este sinal só pode ser usado com os. kill ().
Novo na versão 3.2.
Mais do que o número do número de sinal mais alto.
Decrementa o temporizador de intervalo em tempo real e entrega SIGALRM após a expiração.
Decrementa o temporizador de intervalo apenas quando o processo está sendo executado e entrega SIGVTALRM após a expiração.
Decrementa o temporizador de intervalo tanto quando o processo é executado quanto quando o sistema está executando em nome do processo. Juntamente com ITIMER_VIRTUAL, este temporizador geralmente é usado para perfilar o tempo gasto pelo aplicativo no usuário e no espaço do kernel. SIGPROF é entregue no vencimento.
Um possível valor para o parâmetro como pthread_sigmask () indicando que os sinais devem ser bloqueados.
Novo na versão 3.3.
Um possível valor para o parâmetro como pthread_sigmask () indicando que os sinais devem ser desbloqueados.
Novo na versão 3.3.
Um valor possível para o parâmetro como pthread_sigmask () indicando que a máscara de sinal deve ser substituída.
Novo na versão 3.3.
O módulo de sinal define uma exceção:
sinal de exceção. ItimerError В¶
Criado para sinalizar um erro da implementação subjacente do setitimer () ou getitimer (). Espere esse erro se um temporizador de intervalo inválido ou um tempo negativo for passado para setitimer (). Este erro é um subtipo de OSError.
Novo na versão 3.3: Este erro costumava ser um subtipo de IOError, que agora é um alias do OSError.
O módulo de sinal define as seguintes funções:
Se o tempo for diferente de zero, esta função solicita que um sinal SIGALRM seja enviado ao processo em segundos de tempo. Qualquer alarme programado anteriormente é cancelado (apenas um alarme pode ser agendado a qualquer momento). O valor retornado é então o número de segundos antes de qualquer alarme previamente configurado ter sido entregue. Se o tempo for zero, nenhum alarme será programado e qualquer alarme agendado será cancelado. Se o valor de retorno for zero, nenhum alarme está agendado no momento. (Consulte o ícone da página do Unix man (2).) Disponibilidade: Unix.
sinal. getignal (signalnum) В¶
Retornar o controlador de sinal atual para o sinal de sinal. O valor retornado pode ser um objeto Python ou um sinal de valores especiais. SIG_IGN, sinal. SIG_DFL ou Nenhum. Aqui, o sinal. SIG_IGN significa que o sinal foi anteriormente ignorado, o sinal. SIG_DFL significa que a maneira padrão de manipular o sinal estava anteriormente em uso, e Nenhum significa que o manipulador de sinal anterior não estava instalado no Python.
Faça com que o processo durma até que um sinal seja recebido; O processador apropriado será então chamado. Não retorna nada. Não está no Windows. (Veja o sinal da página Man do Unix (2).)
sinal. pthread_kill (thread_id, signalnum) В¶
Envie o sinal de sinal para o thread thread_id, outro segmento no mesmo processo que o chamador. O thread de destino pode estar executando qualquer código (Python ou não). No entanto, se o thread de destino estiver executando o interpretador Python, os manipuladores de sinal Python serão executados pelo segmento principal. Portanto, o único ponto de enviar um sinal para um segmento particular de Python seria forçar uma chamada do sistema em execução para falhar com InterruptedError.
Use threading. get_ident () ou o atributo ident do threading. Thread objetos para obter um valor adequado para thread_id.
Se signalnum for 0, então nenhum sinal é enviado, mas a verificação de erros ainda é realizada; Isso pode ser usado para verificar se o segmento de destino ainda está em execução.
Disponibilidade: Unix (veja a página man pthread_kill (3) para obter mais informações).
Novo na versão 3.3.
Procure e / ou altere a máscara de sinal da linha de chamada. A máscara de sinal é o conjunto de sinais cuja entrega está atualmente bloqueada para o chamador. Retorne a máscara de sinal antiga como um conjunto de sinais.
O comportamento da chamada depende do valor de como, da seguinte forma.
SIG_BLOCK: O conjunto de sinais bloqueados é a união do conjunto atual e o argumento da máscara. SIG_UNBLOCK: Os sinais na máscara são removidos do conjunto atual de sinais bloqueados. É permitido tentar desbloquear um sinal que não está bloqueado. SIG_SETMASK: O conjunto de sinais bloqueados é definido como o argumento da máscara.
máscara é um conjunto de números de sinal (por exemplo). Use o intervalo (1, sinal. NSIG) para uma máscara completa incluindo todos os sinais.
Por exemplo, signal. pthread_sigmask (signal. SIG_BLOCK, []) lê a máscara de sinal do fio de chamada.
Disponibilidade: Unix. Veja a página manual sigprocmask (3) e pthread_sigmask (3) para obter mais informações.
Novo na versão 3.3.
Define o temporizador de intervalo (um de sinal. ITIMER_REAL, sinal. ITIMER_VIRTUAL ou signal. ITIMER_PROF) especificado pelo qual disparar após segundos (flutuante é aceito, diferente do alarme ()) e depois disso todos os segundos do intervalo. O temporizador de intervalo especificado pelo qual pode ser apagado ajustando segundos a zero.
Quando um temporizador de intervalo dispara, um sinal é enviado para o processo. O sinal enviado depende do temporizador que está sendo usado; sinal. ITIMER_REAL entregará SIGALRM, signal. ITIMER_VIRTUAL envia SIGVTALRM e signal. ITIMER_PROF entregará SIGPROF.
Os valores antigos são retornados como uma tupla: (atraso, intervalo).
A tentativa de passar por um temporizador de intervalo inválido causará um ItimerError. Disponibilidade: Unix.
Retorna o valor atual de um determinado temporizador de intervalo especificado pelo qual. Disponibilidade: Unix.
sinal. set_wakeup_fd (fd) В¶
Defina o descritor do arquivo de ativação para fd. Quando um sinal é recebido, o número do sinal é escrito como um único byte no fd. Isso pode ser usado por uma biblioteca para ativar uma pesquisa ou selecionar chamada, permitindo que o sinal seja totalmente processado.
O despertador antigo fd é retornado (ou -1 se o despertador do descritor de arquivo não estiver ativado). Se fd for -1, o despertador do descritor de arquivo está desabilitado. Se não -1, fd não deve ser bloqueado. Depende da biblioteca remover todos os bytes da fd antes de fazer uma pesquisa ou selecionar novamente.
Use, por exemplo, struct. unpack ('% uB'% len (dados), dados) para decodificar a lista de números de sinal.
Quando os tópicos são habilitados, esta função só pode ser chamada a partir do segmento principal; tentar chamá-lo de outros tópicos fará com que uma exceção ValueError seja gerada.
Alterado na versão 3.5: no Windows, a função agora também suporta alças de soquete.
Alterar o comportamento do reinício da chamada do sistema: se o sinalizador for Falso, as chamadas do sistema serão reiniciadas quando interrompidas pelo sinal de sinal, caso contrário, as chamadas do sistema serão interrompidas. Não retorna nada. Disponibilidade: Unix (veja a página man siginterrupt (3) para mais informações).
Observe que a instalação de um manipulador de sinal com o sinal () irá redefinir o comportamento de reinicialização para interrupível ao chamar implicitamente siginterrupt () com um valor de sinalizador verdadeiro para o sinal fornecido.
Defina o manipulador para sinal de sinalização para o manipulador de função. o manipulador pode ser um objeto Python chamado que leva dois argumentos (veja abaixo), ou um dos valores especiais de sinal. SIG_IGN ou sinal. SIG_DFL. O manipulador de sinal anterior será retornado (veja a descrição de getignal () acima). (Veja o sinal da página Man do Unix (2).)
Quando os tópicos são habilitados, esta função só pode ser chamada a partir do segmento principal; tentar chamá-lo de outros tópicos fará com que uma exceção ValueError seja gerada.
O manipulador é chamado com dois argumentos: o número do sinal e o quadro da pilha atual (Nenhum ou um objeto do quadro, para uma descrição dos objetos do quadro, veja a descrição na hierarquia de tipos ou veja as descrições dos atributos no módulo de inspeção).
No Windows, o sinal () só pode ser chamado com SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM ou SIGBREAK. Um ValueError será gerado em qualquer outro caso. Observe que nem todos os sistemas definem o mesmo conjunto de nomes de sinais; um AttributeError será aumentado se um nome de sinal não for definido como o nível do módulo SIG * constante.
Examine o conjunto de sinais que estão pendentes para entrega ao segmento de chamada (ou seja, os sinais que foram levantados enquanto bloqueados). Retornar o conjunto dos sinais pendentes.
Disponibilidade: Unix (veja a página man sigpending (2) para mais informações).
Novo na versão 3.3.
Suspenda a execução do fio de chamada até a entrega de um dos sinais especificados no sigset do sinal. A função aceita o sinal (remove-o da lista pendente de sinais) e retorna o número do sinal.
Disponibilidade: Unix (veja a página man sigwait (3) para mais informações).
Novo na versão 3.3.
Suspenda a execução do fio de chamada até a entrega de um dos sinais especificados no sigset do sinal. A função aceita o sinal e o remove da lista pendente de sinais. Se um dos sinais em sigset já estiver pendente para o segmento de chamada, a função retornará imediatamente com informações sobre esse sinal. O manipulador de sinal não é chamado para o sinal entregue. A função eleva um InterruptedError se for interrompido por um sinal que não esteja em sigset.
O valor de retorno é um objeto que representa os dados contidos na estrutura siginfo_t, a saber: si_signo, si_code, si_errno, si_pid, si_uid, si_status, si_band.
Disponibilidade: Unix (veja a página man sigwaitinfo (2) para mais informações).
Novo na versão 3.3.
Alterado na versão 3.5: a função agora é tentada novamente se interrompida por um sinal que não está em sigset e o manipulador de sinal não levanta uma exceção (ver PEP 475 para o raciocínio).
Como sigwaitinfo (), mas demora um timeout adicional que especifica um tempo limite. Se o tempo limite for especificado como 0, uma pesquisa será realizada. Retorna Nenhum se ocorrer um tempo limite.
Disponibilidade: Unix (veja a página man sigtimedwait (2) para mais informações).
Novo na versão 3.3.
Alterado na versão 3.5: a função agora é reiniciada com o tempo limite recalculado, se interrompido por um sinal que não está em sigset e o manipulador de sinal não levanta uma exceção (ver PEP 475 para o raciocínio).
18.8.3. Exemplo ¶
Aqui está um programa de exemplo mínimo. Ele usa a função de alarme () para limitar o tempo gasto para abrir um arquivo; Isso é útil se o arquivo for para um dispositivo serial que pode não ser ativado, o que normalmente causaria o os. open () para travar indefinidamente. A solução é configurar um alarme de 5 segundos antes de abrir o arquivo; Se a operação demorar muito, o sinal de alarme será enviado e o manipulador levará uma exceção.
Índice.
Tópico anterior.
Próximo tópico.
Navegação.
O Python Software Foundation é uma corporação sem fins lucrativos. Por favor doe.
QuantStart.
Junte-se ao portal de membros privados da Quantcademy que atende à comunidade de comerciantes de varejo de varejo em rápido crescimento. Você encontrará um grupo bem informado de mentalistas quant pronto para responder suas perguntas comerciais mais importantes.
Confira meu ebook sobre o comércio de quant, onde eu ensino você como criar estratégias de negociação sistemáticas lucrativas com ferramentas Python, desde o início.
Dê uma olhada no meu novo ebook sobre estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas bayesianas, com Python e R.
Por Michael Halls-Moore em 21 de janeiro de 2014.
No artigo anterior sobre Ambientes de Análise de Análise de Pesquisa Em Python Com Pandas, criamos um ambiente de backtesting baseado em pesquisa orientado a objetos e testávamos isso em uma estratégia de previsão aleatória. Neste artigo, faremos uso da maquinaria que introduzimos para realizar pesquisas sobre uma estratégia real, ou seja, o Crossover de média móvel na AAPL.
Estratégia de Crossover Média em Movimento.
A técnica de Crossover de média móvel é uma estratégia de impulso simplista extremamente conhecida. Muitas vezes, é considerado o exemplo do "Olá Mundo" para negociação quantitativa.
A estratégia descrita aqui é longa apenas. São criados dois filtros de média móvel simples separados, com diferentes períodos de lookback, de uma série temporal específica. Os sinais para comprar o recurso ocorrem quando a média móvel de lookback mais curta excede a média móvel de lookback mais longa. Se a média mais longa exceder a média mais curta, o ativo é vendido de volta. A estratégia funciona bem quando uma série temporal entra em um período de forte tendência e, em seguida, inverte lentamente a tendência.
Para este exemplo, escolhi a Apple, Inc. (AAPL) como a série temporal, com um curto lookback de 100 dias e um longo lookback de 400 dias. Este é o exemplo fornecido pela biblioteca de negociação algorítmica de tirolesa. Assim, se quisermos implementar o nosso próprio backtester, precisamos garantir que ele coincida com os resultados na linha aérea, como um meio básico de validação.
Implementação.
Certifique-se de seguir o tutorial anterior aqui, que descreve como a hierarquia de objeto inicial para o backtester é construída, caso contrário, o código abaixo não funcionará. Para esta implementação particular usei as seguintes bibliotecas:
A implementação do ma_cross. py requer backtest. py do tutorial anterior. O primeiro passo é importar os módulos e objetos necessários:
Como no tutorial anterior, vamos sub-classificar a classe base abstrata da Estratégia para produzir MovingAverageCrossStrategy, que contém todos os detalhes sobre como gerar os sinais quando as médias móveis da AAPL se cruzam.
O objeto requer um short_window e um long_window sobre o qual operar. Os valores foram configurados para padrões de 100 dias e 400 dias, respectivamente, que são os mesmos parâmetros utilizados no exemplo principal de tirolesa.
As médias móveis são criadas usando a função pandas rolling_mean nas barras ['Fechar'] preço de fechamento do estoque da AAPL. Uma vez que as médias móveis individuais foram construídas, a série do sinal é gerada definindo a coluna igual a 1,0 quando a média móvel curta é maior do que a média móvel longa, ou 0,0 caso contrário. A partir disso, as ordens de posições podem ser geradas para representar sinais comerciais.
O MarketOnClosePortfolio é subclassado do Portfolio, que é encontrado em backtest. py. É quase idêntico à implementação descrita no tutorial anterior, com a exceção de que os negócios são agora realizados em uma base Close-to-Close, em vez de Open-to-Open. Para obter detalhes sobre como o objeto Portfolio está definido, consulte o tutorial anterior. Eu deixei o código em completo e mantenho esse tutorial autônomo:
Agora que as classes MovingAverageCrossStrategy e MarketOnClosePortfolio foram definidas, uma função __main__ será chamada para amarrar toda a funcionalidade em conjunto. Além disso, o desempenho da estratégia será examinado através de um gráfico da curva de equidade.
O objeto DataReader de pandas transfere os preços de ações da AAPL da OHLCV para o período de 1º de janeiro de 1990 a 1º de janeiro de 2002, momento em que os sinais DataFrame são criados para gerar os sinais de longo tempo. Posteriormente, o portfólio é gerado com uma base de capital inicial de 100.000 USD e os retornos são calculados na curva de patrimônio.
O passo final é usar matplotlib para plotar um gráfico de dois dígitos de ambos os preços da AAPL, superado com as médias móveis e os sinais de compra / venda, bem como a curva de equidade com os mesmos sinais de compra / venda. O código de plotagem é tomado (e modificado) do exemplo de implementação de tirolesa.
A saída gráfica do código é a seguinte. Utilizei o comando IPython% paste para colocar isso diretamente no console IPython, enquanto no Ubuntu, de modo que a saída gráfica permaneça em exibição. Os roseticks cor-de-rosa representam a compra do estoque, enquanto os bastões negros representam a venda de volta:
AAPL Moving Average Crossover Performance de 1990-01-01 a 2002-01-01.
Como pode ser visto, a estratégia perde dinheiro ao longo do período, com cinco comércios de ida e volta. Isso não é surpreendente, dado o comportamento da AAPL durante o período, que estava em uma ligeira tendência descendente, seguido de um aumento significativo em 1998. O período de lookback dos sinais da média móvel é bastante grande e isso impactou o lucro do comércio final , o que de outra forma pode ter tornado a estratégia rentável.
Em artigos subsequentes, criaremos um meio mais sofisticado de análise de desempenho, além de descrever como otimizar os períodos de lookback dos sinais de média móvel individual.
Apenas iniciando o comércio quantitativo?
3 razões para se inscrever na QuantStart List:
1. Quant Trading Lessons.
Você terá acesso instantâneo a um curso gratuito de 10 partes, com sugestões e dicas para ajudá-lo a começar a negociação quantitativa!
2. Todo o conteúdo mais recente.
Todas as semanas, vou enviar-lhe um envoltório de todas as atividades no QuantStart para que você nunca mais perca uma postagem novamente.
Real, dicas de negociação viáveis, sem tonturas.
No comments:
Post a Comment