Exponencial Móvel Média Python
Este é um wrapper Python para TA-LIB baseado em Cython em vez de SWIG. A partir da homepage: TA-Lib é amplamente utilizado pelos desenvolvedores de software de negociação que exigem a realização de análise técnica de dados do mercado financeiro. Inclui 150 indicadores como ADX, MACD, RSI, estocástico, Bollinger Bands, etc. Reconhecimento de padrão de candlestick API de código aberto para CC, Java, Perl, Python e 100 gerenciados As ligações Python originais usam SWIG que infelizmente são difíceis de instalar e não Tão eficientes quanto poderiam ser. Portanto, este projeto usa Cython e Numpy para se ligar de forma eficiente e limpa a TA-Lib - produzindo resultados 2-4 vezes mais rápido do que a interface SWIG. Instalar o TA-Lib ou Ler os Docs Similar à TA-Lib, a interface de função fornece um invólucro leve dos indicadores TA-Lib expostos. Cada função retorna uma matriz de saída e tem valores padrão para seus parâmetros, a menos que especificado como argumentos de palavra-chave. Normalmente, essas funções terão um período inicial de retorno (um número necessário de observações antes que uma saída seja gerada) definida para NaN. Todos os exemplos a seguir usam a função API: Calcula uma média móvel simples dos preços de fechamento: Cálculo de bandas de bollinger, com média móvel exponencial tripla: Momento de cálculo dos preços de fechamento, com um período de tempo de 5: Já familiarizado com o uso da função API, você deve se sentir em casa usando a API abstrata. Cada função tem a mesma entrada, passada como um dicionário de arrays Numpy: As funções podem ser importadas diretamente ou instanciadas por nome: A partir daí, chamar funções é basicamente o mesmo que a função API: Saiba mais sobre o uso mais avançado de TA-Lib aqui . Indicadores Suportados Podemos mostrar todas as funções TA suportadas pelo TA-Lib, quer como uma lista ou como um dict classificado por grupo (por exemplo, Estudos de Sobreposição, Indicadores Momentum, etc.): Grupos de FunçõesCapítulo 2: Tipos de Dados e Referenciamento dados. Definimos aplicativos para trabalhar com dados, e precisamos ter recipientes que podem ser usados para mantê-lo. Este capítulo trata de definir contêineres e usá-los para trabalhar com dados de aplicativo. Se os dados que estamos usando são provenientes de uma entrada de teclado ou se estamos trabalhando com um banco de dados, é necessário haver uma maneira de armazená-lo temporariamente em nossos programas para que ele possa ser manipulado e usado. Uma vez que estamos trabalhando com os dados, então esses contêineres temporários podem ser destruídos para dar espaço para novas construções. Bem, comece por dar uma olhada nos diferentes tipos de dados oferecidos pela linguagem Python e, em seguida, seguiremos discutindo como usar esses dados uma vez que ele foi coletado e armazenado. Vamos comparar e contrastar os diferentes tipos de estruturas que temos em nosso arsenal, e bem dar alguns exemplos de que estruturas para usar para trabalhar com diferentes tipos de dados. Há uma infinidade de tarefas que podem ser realizadas através do uso de listas, dicionários e tuplas e vamos tentar cobrir muitos deles. Depois de aprender a definir e usar essas estruturas, então fale um pouco sobre o que acontece com elas, uma vez que elas não são mais necessárias pela nossa aplicação. Vamos começar nossa jornada para explorar tipos de dados e estruturas dentro da linguagem de programação Python. Estas são as habilidades que você usará em cada programa Jython prático. Tipos de dados Python Como discutimos, há uma necessidade de armazenar e manipular dados dentro de programas. Para fazer isso, então também devemos ter a capacidade de criar recipientes usados para armazenar esses dados para que o programa possa usá-lo. A linguagem precisa saber como lidar com os dados depois que ele é armazenado, e podemos fazer isso, atribuindo o tipo de dados para nossos contêineres em Java. No entanto, em Python não é um requisito para fazê-lo porque o intérprete é capaz de determinar qual o tipo de dados que estamos armazenando de forma dinâmica. A Tabela 2-1 lista cada tipo de dado e fornece uma breve descrição das características que definem cada um deles. Tabela 2-1. Tipos de dados Python Listas, dicionários, conjuntos e tuplas As listas, dicionários, conjuntos e tuplas oferecem funcionalidade e usabilidade semelhantes, mas cada um tem seu próprio nicho na linguagem. Bem, passar por vários exemplos de cada um, uma vez que todos desempenham um papel importante em determinadas circunstâncias. Ao contrário das strings, todos os contêineres discutidos nesta seção (exceto tuplas) são objetos mutáveis, assim eles podem ser manipulados depois que eles foram criados. Porque estes recipientes são tão importantes, bem passar por um exercício no final deste capítulo, que lhe dará a chance de experimentá-los por si mesmo. Talvez uma das construções mais usadas dentro da linguagem de programação Python seja a lista. A maioria das outras linguagens de programação fornece recipientes semelhantes para armazenar e manipular dados dentro de uma aplicação. A lista Python fornece uma vantagem sobre as construções semelhantes que estão disponíveis em linguagens tipadas estaticamente. As tendências dinâmicas da linguagem Python ajudam a construir a lista para aproveitar a grande característica de ter a capacidade de conter valores de diferentes tipos. Isso significa que uma lista pode ser usada para armazenar qualquer tipo de dados Python, e esses tipos podem ser misturados em uma única lista. Em outras linguagens, esse tipo de construção é muitas vezes definido como um objeto digitado, que bloqueia a construção para usar apenas um tipo de dados. A criação e o uso de listas Python é o mesmo que o resto do idioma. Muito simples e fácil de usar. Simplesmente atribuir um conjunto de colchetes vazios a uma variável cria uma lista vazia. Também podemos usar a função built-in list () para criar uma lista. A lista pode ser construída e modificada como o aplicativo é executado, eles não são declarados com um comprimento estático. Eles são fáceis de percorrer através do uso de loops, e os índices também podem ser usados para colocação posicionais ou remoção de itens específicos na lista. Bem, comece mostrando alguns exemplos de definição de listas e, em seguida, passe por cada uma das diferentes avenidas que a linguagem Python nos fornece para trabalhar com listas. Listagem 2-7. Definindo Listas Como afirmado anteriormente, a fim de obter os valores de uma lista, podemos fazer uso de índices. Muito parecido com o Array na linguagem Java, usando a notação listindex nos permitirá acessar um item. Se desejamos obter um intervalo ou um conjunto de valores de uma lista, podemos fornecer um índice inicial e um índice final. Esta técnica também é conhecida como fatiar. O que é mais, também podemos retornar um conjunto de valores da lista junto com um padrão de passo fornecendo um índice de passo também. Uma chave a ser lembrada é que, ao acessar uma lista via indexação, o primeiro elemento da lista está contido no índice 0. Observe que ao cortar uma lista, uma nova lista é sempre retornada. Uma maneira de criar uma cópia superficial de uma lista é usar a notação de fatia sem especificar um limite superior ou inferior. O limite inferior é padrão para zero eo limite superior é padrão para o comprimento da lista. Observe que uma cópia superficial constrói um novo objeto composto (lista ou outro objeto que contém objetos) e, em seguida, insere referências nele aos objetos originais. Uma cópia profunda constrói um novo objeto composto e, em seguida, insere cópias nele com base nos objetos encontrados no original. Listagem 2-8. Acessando uma lista A modificação de uma lista é muito parecida, você pode usar o índice para inserir ou remover itens de uma posição específica. Há também muitas outras maneiras que você pode inserir ou remover elementos da lista. O Python fornece cada uma dessas opções diferentes, pois elas oferecem diferentes funcionalidades para suas operações. Você pode fazer uso do método append () para adicionar um item ao final de uma lista. O método extend () permite adicionar uma cópia de uma lista ou seqüência inteira ao final de uma lista. Por fim, o método insert () permite que você coloque um item ou outra lista em uma posição específica de uma lista existente, utilizando índices posicionais. Se outra lista é inserida em uma lista existente, então ela não é combinada com a lista original, mas sim atua como um item separado contido na lista original. Você encontrará exemplos de cada método abaixo. Da mesma forma, temos muitas opções para remover itens de uma lista. A instrução del, como explicado no Capítulo 1, pode ser usada para remover ou excluir uma lista inteira ou valores de uma lista usando a notação de índice. Você também pode usar o método pop () ou remove () para remover valores individuais de uma lista. O método pop () removerá um único valor do final da lista e também retornará esse valor ao mesmo tempo. Se um índice é fornecido para a função pop (), então ele irá remover e retornar o valor nesse índice. O método remove () pode ser usado para localizar e remover um valor específico na lista. Em outras palavras, remove () excluirá o primeiro elemento correspondente da lista. Se mais de um valor na lista corresponder ao valor passado para a função remove (), o primeiro será removido. Outra observação sobre a função remove () é que o valor removido não é retornado. Vamos dar uma olhada nesses exemplos de modificar uma lista. Listagem 2-10. Modificando uma Lista Agora que sabemos como adicionar e remover itens de uma lista, é hora de aprender a manipular os dados dentro deles. O Python fornece vários métodos diferentes que podem ser usados para nos ajudar a gerenciar nossas listas. Consulte a Tabela 2-4 para obter uma lista dessas funções eo que elas podem fazer. Tabela 2-4. Métodos da lista Python Vamos dar uma olhada em alguns exemplos de como essas funções podem ser usadas em listas. Listagem 2-11. Utilizar funções de lista Procurar e procurar listas Movimentar-se dentro de uma lista é bastante simples. Uma vez que uma lista é preenchida, muitas vezes desejamos atravessá-lo e executar alguma ação contra cada elemento contido dentro dele. Você pode usar qualquer um dos Python looping construções para atravessar cada elemento dentro de uma lista. Embora existam muitas opções disponíveis, o loop for funciona especialmente bem. Isso ocorre por causa da sintaxe simples que o Python for loop usa. Esta seção mostrará como percorrer uma lista usando cada uma das diferentes estruturas de looping do Python. Você verá que cada um deles tem vantagens e desvantagens. Vamos primeiro dar uma olhada na sintaxe que é usada para percorrer uma lista usando um loop for. Este é, de longe, um dos modos mais fáceis de passar por cada um dos valores contidos em uma lista. O loop for atravessa a lista um elemento de cada vez, permitindo que o desenvolvedor execute alguma ação em cada elemento, se assim desejar. Listagem 2-12. Deslocando uma lista usando um loop for Como você pode ver a partir deste exemplo simples, é muito fácil passar por uma lista e trabalhar com cada item individualmente. A sintaxe do loop for requer uma variável à qual cada elemento da lista será atribuído para cada passagem do loop. Também é possível combinar o corte com o uso do loop for. Neste caso, bem, simplesmente use uma fatia de lista para recuperar os elementos exatos que queremos ver. Por exemplo, dê uma olhada no seguinte código que atravessa os primeiros 5 elementos em nossa lista. Como você pode ver, fazê-lo é bastante fácil, simplesmente usando os recursos internos que o Python oferece. Lista Compreensões Como vimos na seção anterior, podemos criar uma cópia de uma lista usando o corte. Outra maneira mais poderosa de fazer isso é através da compreensão da lista. Existem alguns recursos avançados para listas que podem ajudar a tornar a vida dos desenvolvedores mais fácil. Uma dessas características é conhecida como compreensão da lista. Embora este conceito pode ser assustador no início, oferece uma boa alternativa para criar muitas listas separadas manualmente. As compreensões de lista tomam uma determinada lista e, em seguida, iteram através dela e aplicam uma determinada expressão contra cada um dos objetos na lista. Listagem 2-14. Compreensão simples da lista Como você pode ver, isto permite que uma rapidamente faça exame de uma lista e altere-a com o uso da expressão fornecida. Naturalmente, como com muitos outros métodos de Python a compreensão da lista retorna uma cópia alterada da lista. A compreensão da lista produz uma nova lista ea lista original é deixada intocada. Vamos dar uma olhada na sintaxe para uma lista de compreensão. Eles são basicamente composto de uma expressão de algum tipo seguido por uma instrução for e, em seguida, opcionalmente mais para ou se instruções. A funcionalidade básica de uma compreensão lista é iterar sobre os itens de uma lista e, em seguida, aplicar alguma expressão contra cada um dos membros listas. Sintaticamente, uma compreensão de lista lê-se da seguinte forma: Iterar através de uma lista e opcionalmente executar uma expressão em cada elemento, em seguida, retornar uma nova lista contendo os elementos resultantes ou avaliar cada elemento dado uma cláusula opcional. Listagem 2-15. Usando uma cláusula if em uma lista Compreensão Vamos dar uma olhada em alguns exemplos mais. Uma vez que você tenha visto listas de compreensões em ação, você tem certeza de entendê-las e ver como elas podem ser úteis. Listagem 2-16. Python List Compreensões As compreensões de listas podem tornar o código muito mais conciso e permite que se apliquem expressões ou funções para listar elementos com bastante facilidade. Vamos dar uma rápida olhada em um exemplo escrito em Java para executar o mesmo tipo de trabalho como uma lista de compreensão. É claro que as compreensões de listas são muito mais concisas. Listagem 2-17. Código Java para ter uma lista de idades e adicionar um ano para cada idade Tuplas são muito semelhantes listas, no entanto, eles são imutáveis. Uma vez definida uma tupla, ela não pode ser alterada. Eles contêm índices como listas, mas novamente, eles não podem ser alterados uma vez definido. Portanto, o índice em uma tupla pode ser usado para recuperar um determinado valor e não para atribuir ou modificar. Enquanto as tuplas podem parecer semelhantes a listas, elas são bastante diferentes porque as tuplas normalmente contêm elementos heterogêneos, enquanto as listas geralmente contêm elementos que estão relacionados de alguma forma. Por exemplo, um caso de uso comum para tuplas é passar parâmetros para uma função, método e assim por diante. Uma vez que tuplas são um membro do tipo de seqüência, eles podem usar o mesmo conjunto de métodos de operações disponíveis para todos os tipos de seqüência. Listagem 2-18. Exemplos de Tuplas Como mencionado anteriormente, as tuplas podem ser bastante úteis para passar para funções, métodos, classes e assim por diante. Muitas vezes, é bom ter um objeto imutável para passar vários valores. Um desses casos seria usar uma tupla para passar coordenadas em um sistema de informação geográfica ou outra aplicação do tipo. Eles também são agradáveis de usar em situações onde um objeto imutável é garantido. Porque eles são imutáveis, seu tamanho não cresce uma vez que eles foram definidos, assim tuplas também podem desempenhar um papel importante quando a alocação de memória é uma preocupação. Dicionários Um dicionário Python é um contêiner de armazenamento de valor-chave. Um dicionário é bastante diferente de uma lista típica em Python, pois não há nenhum índice preenchido automaticamente para qualquer elemento dentro do dicionário. Quando você usa uma lista, não precisa se preocupar em atribuir um índice a qualquer valor que é colocado dentro dele. Um dicionário permite que o desenvolvedor atribua um índice ou chave para cada elemento que é colocado na construção. Portanto, cada entrada em um dicionário requer dois valores, a chave eo elemento. A beleza do dicionário é que ele permite que o desenvolvedor escolha o tipo de dados do valor da chave. Portanto, se um deseja usar uma seqüência de caracteres ou qualquer outro objeto hashable como um valor int ou float como uma chave, então é inteiramente possível. Dicionários também têm uma infinidade de métodos e operações que podem ser aplicadas a eles para torná-los mais fáceis de trabalhar. A Tabela 2-5 lista os métodos e funções do dicionário. Listagem 2-19. Exemplos de dicionário básico Tabela 2-5. Dicionário Métodos e Funções O intervalo é uma função especial que permite iterar entre um intervalo de números ou listar um intervalo específico de números. É especialmente útil para executar iterações matemáticas, mas também pode ser usado para iterações simples. O formato para usar a função de intervalo inclui um número de partida opcional, um número final e um número de passo opcional. Se especificado, o número inicial indica ao intervalo onde começar, enquanto o número final especifica onde o intervalo deve terminar. O índice inicial é inclusivo, enquanto o índice final não é. O número de passo opcional indica ao intervalo quantos números devem ser colocados entre cada número contido dentro da saída de intervalo. O número do passo é adicionado ao número anterior e se esse número exceder o ponto final, o intervalo pára. Listagem de formatos de intervalo 2-24. Usando a função Range Um dos usos mais comuns para esta função está em um loop for. O exemplo a seguir exibe um par de maneiras de usar a função de intervalo dentro de um contexto de loop for. Listagem 2-25. Usando a função de intervalo dentro de um loop for Como você pode ver, um intervalo pode ser usado para iterar através de praticamente qualquer conjunto de números. Seja indo para cima ou para baixo, positivo ou negativo na etapa. Os intervalos também são uma boa maneira de criar uma lista de números. Para fazer isso, basta passar um intervalo para list () como mostrado no exemplo a seguir. Listagem 2-26. Criar uma lista de um intervalo Como você pode ver, não só são intervalos úteis para fins iterativos, mas eles também são uma boa maneira de criar listas numéricas. Coleções específicas do Jython Existem vários objetos de coleção específicos do Jython disponíveis para uso. A maioria desses objetos de coleção é usada para passar dados para classes Java e assim por diante, mas eles adicionam funcionalidade adicional à implementação Jython que auxilia os novatos do Python que vêm do mundo Java. No entanto, muitos desses objetos de coleta adicionais podem ser bastante úteis em determinadas situações. Na versão Jython 2.2, a integração da coleção Java foi introduzida. Isso permite uma interação bidirecional entre os tipos de coleção Jython e Java. Por exemplo, um Java ArrayList pode ser importado em Jython e, em seguida, usado como se fosse parte do idioma. Antes da 2.2, os objetos de coleção Java podiam atuar como um objeto Jython, mas os objetos Jython não podiam atuar como objetos Java. Por exemplo, é possível usar um Java ArrayList em Jython e usar métodos como add (), remove (), e get (). Você verá no exemplo abaixo que usar o método add () de um ArrayList irá adicionar um elemento à lista e retornar um booleano para significar o sucesso ou falha da adição. O método remove () age da mesma forma, exceto que ele remove um elemento ao invés de adicioná-lo. Listagem 2-27. Jython também tinha implementado o objeto jarray que basicamente permite a construção de uma matriz Java em Jython. Para trabalhar com um jarray, basta definir um tipo de seqüência em Jython e passá-lo para o objeto jarray junto com o tipo de objeto contido dentro da seqüência. O jarray é definitivamente útil para criar arrays Java e passá-los em objetos java, mas não é muito útil para trabalhar em objetos Jython. Além disso, todos os valores dentro de um jarray devem ser do mesmo tipo. Se você tentar passar uma seqüência contendo vários tipos para um jarray, então você será dado um TypeError de um tipo ou outro. Consulte a Tabela 2-8 para obter uma lista de tipos de caracteres usados com jarray. Tabela 2-8. Character Typecodes para uso com Jarray Outra característica útil do jarray é que podemos criar matrizes vazias se quisermos usando o método zeros (). O método zeros () funciona de forma semelhante ao método array () que já demonstramos. Para criar uma matriz vazia, basta passar o comprimento da matriz juntamente com o tipo para o método zeros (). Vamos dar uma olhada rápida em um exemplo. Listagem 2-29. Criar uma Lista de Matriz Booleana Vazia 2-30. Criar uma matriz de números inteiros vazios Em algumas circunstâncias ao trabalhar com objetos Java, você precisará chamar um método Java que requer uma matriz Java como um argumento. Usar o objeto jarray permite uma maneira simples de criar arrays Java quando necessário. Os objetos de arquivo são usados para ler e gravar dados em um arquivo no disco. O objeto de arquivo é usado para obter uma referência ao arquivo no disco e abri-lo para leitura, gravação, anexar ou uma série de tarefas diferentes. Se usarmos simplesmente a função open (filename, mode), podemos retornar um objeto de arquivo e atribuí-lo a uma variável para processamento. Se o arquivo ainda não existir no disco, ele será automaticamente criado. O argumento mode é usado para dizer que tipo de processamento desejamos executar no arquivo. Esse argumento é opcional e, se omitido, o arquivo é aberto no modo somente leitura. Consulte a Tabela 2-9. Tabela 2-9. Modos de Operação para Tipos de Arquivos Existem muitos métodos que podem ser usados em objetos de arquivo para manipulação do conteúdo do arquivo. Podemos chamar read (tamanho) em um arquivo para ler seu conteúdo. O tamanho é um argumento opcional aqui e é usado para dizer quanto conteúdo ler do arquivo. Se for omitido, todo o conteúdo do arquivo será lido. O método readline () pode ser usado para ler uma única linha de um arquivo. Readlines (size) é usado para retornar uma lista contendo todas as linhas de dados contidas em um arquivo. Novamente, há um parâmetro de tamanho opcional que pode ser usado para dizer quantos bytes do arquivo para ler. Se quisermos colocar o conteúdo no arquivo, o método write (string) faz exatamente isso. O método write () escreve uma string para o arquivo. Ao escrever para um arquivo é muitas vezes importante saber exatamente qual a posição no arquivo que você está indo para escrever. Há um grupo de métodos para nos ajudar a posicionar dentro de um arquivo usando inteiros para representar bytes no arquivo. O método tell () pode ser chamado em um arquivo para dar aos objetos do arquivo a posição atual. O inteiro retornado está em um número de bytes e é um deslocamento do início do arquivo. O método seek (offset, from) pode ser usado para mudar de posição em um arquivo. O deslocamento é o número em bytes da posição que você gostaria de ir, e de representa o lugar no arquivo onde você gostaria de calcular o deslocamento de. Se for igual a 0, o deslocamento será calculado a partir do início do arquivo. Da mesma forma, se for igual a 1, então ele será calculado a partir da posição atual do arquivo e 2 será do final do arquivo. O padrão é 0 se de é omitido. Por fim, é importante alocar e desalocar os recursos de forma eficiente em nossos programas ou teremos uma sobrecarga de memória e vazamentos. Os recursos normalmente são tratados um pouco diferente entre CPython e Jython porque a coleção de lixo age de forma diferente. No CPython, não é tão importante se preocupar com a desatribuição de recursos, pois eles são automaticamente desalocados quando saem do escopo. A JVM observa imediatamente a coleta de lixo, portanto a desatribuição adequada dos recursos é mais importante. O método close () deve ser chamado em um arquivo quando estivermos trabalhando com ele. A metodologia adequada para usar ao trabalhar com um arquivo é abrir, processo e, em seguida, fechar cada vez. No entanto, existem formas mais eficientes de executar tais tarefas. No Capítulo 7, discutiremos o uso de gerentes de contexto para executar a mesma funcionalidade de forma mais eficiente. Listagem 2-32. Manipulação de arquivos em Iteradores Python O iterador foi introduzido em Python na versão 2.2. Ele permite iteração sobre os contêineres Python. Todos os contêineres iteráveis têm suporte embutido para o tipo iterador. Por exemplo, os objetos de seqüência são iteráveis, pois permitem iteração sobre cada elemento dentro da seqüência. Se você tentar retornar um iterador em um objeto que não suporte iteração, provavelmente receberá um AttributeError que informa que iter não foi definido como um atributo para esse objeto. É importante notar que nomes de métodos Python usando sublinhados duplos são métodos especiais. Por exemplo, em Python uma classe pode ser inicializada usando o método init (). Muito parecido com um construtor Java. Para obter mais detalhes sobre classes e métodos de classe especiais, consulte o Capítulo 7. Os Iterators permitem o acesso fácil a sequências e outros recipientes iteráveis. Alguns contêineres, como dicionários, têm métodos de iteração especializados construídos neles como você viu nas seções anteriores. Os objetos Iterator são necessários para suportar dois métodos principais que formam o protocolo iterador. Esses métodos são definidos abaixo na Tabela 2-10. Para retornar um iterador em um container, basta atribuir container. iter () a alguma variável. Essa variável se tornará o iterador para o objeto. Isto proporciona uma a capacidade de passar iteradores ao redor, em funções e semelhantes. O iterador é então ele próprio como uma variável variável que mantém seu estado. Podemos usar o trabalho com o iterador sem afetar o objeto original. Se estiver usando a próxima () chamada, continuará retornando o próximo item dentro da lista até que todos os itens tenham sido recuperados. Quando isso ocorre, uma exceção StopIteration é emitida. A coisa importante a observar aqui é que estamos realmente criando uma cópia da lista quando retornamos o iterador e atribuí-lo a uma variável. Essa variável retorna e remove um item dessa cópia cada vez que o método next () é chamado nela. Se continuarmos a chamar next () na variável iterator até que seja emitido o erro StopIteration, a variável não conterá mais itens e estará vazia. Por exemplo, se criamos um iterador a partir de uma lista, então chamamos o método next () sobre ele até que ele tenha recuperado todos os valores, então o iterador ficaria vazio ea lista original ficaria intocada. Listagem 2-33. Criar um iterador de uma lista e usá-lo Listagem 2-34. Iteração sobre seqüência e referência de lista e cópias Criar cópias e referenciar itens na linguagem Python é bastante direto. A única coisa que você precisa manter em mente é que as técnicas usadas para copiar mutable e objetos imutáveis diferem um pouco. Para criar uma cópia de um objeto imutável, basta atribuí-la a uma variável diferente. A nova variável é uma cópia exata do objeto. Se você tentar fazer o mesmo com um objeto mutable, você vai realmente apenas criar uma referência para o objeto original. Portanto, se você executar operações na cópia do original, a mesma operação será realizada no original. Isso ocorre porque a nova atribuição faz referência ao mesmo objeto mutável na memória que o original. É como se alguém te chamasse por um nome diferente. Uma pessoa pode chamá-lo pelo seu nome de nascimento e outra pode chamá-lo pelo seu apelido, mas ambos os nomes irão fazer referência a você, é claro. Listagem 2-35. Trabalhando com Cópias Para criar efetivamente uma cópia de um objeto mutable, você tem duas opções. Você pode criar o que é conhecido como uma cópia superficial ou uma cópia profunda do objeto original. A diferença é que uma cópia superficial de um objeto criará um novo objeto e, em seguida, preenchê-lo com referências aos itens que estão contidos no objeto original. Portanto, se você modificar qualquer um desses itens, então cada objeto será afetado, uma vez que ambos fazem referência aos mesmos itens. Uma cópia profunda cria um novo objeto e, em seguida, copia recursivamente o conteúdo do objeto original para a nova cópia. Depois de executar uma cópia profunda de um objeto, então você pode executar operações em qualquer objeto contido na cópia sem afetar o original. Você pode usar a função deepcopy no módulo de cópia da biblioteca padrão do Python para criar essa cópia. Vejamos alguns exemplos mais de criação de cópias, a fim de lhe dar uma idéia melhor de como isso funciona. Coleta de Lixo Esta é uma daquelas diferenças principais entre CPython e Jython. Em CPython, um objeto é lixo coletado quando ele sai do escopo ou não é mais necessário. Isso ocorre automaticamente e raramente precisa ser rastreado pelo desenvolvedor. Nos bastidores, CPython usa uma técnica de contagem de referência para manter uma contagem em cada objeto que efetivamente determina se o objeto ainda está em uso. Diferentemente do CPython, o Jython não implementa uma técnica de contagem de referência para o envelhecimento ou objetos não utilizados de coleta de lixo. Em vez disso, o Jython faz uso dos mecanismos de coleta de lixo que a plataforma Java fornece. Quando um objeto Jython se torna obsoleto ou inacessível, a JVM pode ou não recuperá-lo. Um dos principais aspectos da JVM que fez desenvolvedores tão feliz nos primeiros dias é que não havia mais uma necessidade de se preocupar com a limpeza após o seu código. Na linguagem de programação C, é preciso manter uma consciência dos objetos que estão sendo usados atualmente, de modo que quando eles não são mais necessários, o programa executaria alguma limpeza. Não no mundo Java, o thread gc na JVM cuida de toda a coleta de lixo e limpeza para você. Mesmo que não havent falado sobre classes em detalhes ainda, você viu um pequeno exemplo de como eles no Capítulo 1. É um bom momento para mencionar que Python fornece um mecanismo para limpeza de objetos. Um método finalizador pode ser definido em qualquer classe para garantir que o coletor de lixo executa tarefas específicas. Qualquer código de limpeza que precisa ser executado quando um objeto sai do escopo pode ser colocado dentro deste método de finalizador. É importante notar que o método finalizador não pode ser contado como um método que sempre será chamado quando um objeto é obsoleto. Este é o caso porque o método finalizador é invocado pelo thread de coleta de lixo do Java e não há nenhuma maneira de ter certeza quando e se o coletor de lixo será chamado em um objeto. Outra questão de nota com o finalizador é que eles incorrem em uma penalidade de desempenho. Se você está codificando um aplicativo que já executa mal, então pode não ser uma boa idéia para jogar muitos finalizadores nele. O seguinte é um exemplo de um finalizador Python. É um método de instância que deve ser chamado del. Listagem 2-37. Python Finalizer Exemplo A desvantagem de usar os mecanismos de coleta de lixo JVM é que realmente não há garantia de quando e se um objeto será recuperado. Portanto, ao trabalhar com objetos com alto desempenho, é melhor não confiar em um finalizador para ser chamado. É sempre importante garantir que as técnicas de codificação apropriadas sejam usadas em tais casos quando se trabalha com objetos como arquivos e bancos de dados. Nunca codifique o método close () para um arquivo em um finalizador porque ele pode causar um problema se o finalizador não for invocado. A melhor prática é garantir que todas as atividades obrigatórias de limpeza sejam executadas antes que um finalizador seja invocado. Muito material foi abordado neste capítulo. Você deve estar se sentindo melhor familiarizado com Python depois de ler este material. Começamos o capítulo cobrindo os conceitos básicos de atribuição e atribuindo dados a objetos ou tipos de dados específicos. Você aprendeu que trabalhar com cada tipo de objeto de dados abre portas diferentes, pois a maneira como trabalhamos com cada tipo de objeto de dados difere. Nossa jornada em objetos de dados começou com números e strings, e discutimos os vários métodos disponíveis para o objeto string. Aprendemos que as strings são parte da família de seqüência de objetos de coleção Python juntamente com listas e tuplas. Nós cobrimos como criar e trabalhar com listas, ea variedade de opções disponíveis para nós ao usar listas. Você descobriu que compreensões de listas podem ajudar a criar cópias de uma determinada lista e manipular seus elementos de acordo com uma expressão ou função. Depois de discutir as listas, passamos a discutir dicionários, conjuntos e tuplas. Depois de discutir os tipos de coleção, aprendemos que o Jython tem seu próprio conjunto de objetos de coleção que diferem daqueles em Python. Podemos aproveitar a vantagem de ter a plataforma Java na ponta dos dedos e usar tipos de coleção Java dentro do Jython. Terminamos discutindo referências, cópias e coleta de lixo. Criar cópias diferentes de objetos nem sempre dá-lhe o que você esperaria, e que a coleta de lixo do Jython difere um pouco daquela do Python. O próximo capítulo irá ajudá-lo a combinar alguns dos tópicos que você aprendeu neste capítulo, como você vai aprender a definir expressões e trabalhar com fluxo de controle. Análise Técnica no Excel: Parte I 8211 SMA, EMA, Bandas Bollinger Neste artigo, Parte série ou artigos 8220 Análise Técnica em Excel8221 vamos explorar como os comerciantes podem usar Excel para aplicar a análise técnica (TA) para dados históricos do mercado. Isso incluirá a computação de alguns dos mais populares indicadores de análise técnica e implementação de uma estratégia de negociação backtesting planilha (na Parte III). O backtesting envolverá geração de sinais de compra e venda com base em indicadores TA e cálculo da estratégia P038L. We8217d gostaria de salientar antecipadamente que todos os cálculos nesses artigos serão realizados usando funções padrão do Excel disponíveis no Excel 2011 e posterior. Não usaremos macros do VBAcustom Excel. Isso é feito de propósito para manter planilhas simples e funcionalidade compreensível por não-programadores. In the first part of this article series we will create an Excel spreadsheet where we will use formulas some common technical analysis indicators such as: Simple Moving Average, Bollinger Bands, and Exponential Moving Average. Well explain the formulas and include step-by-step instructions below. In addition, we are providing a spreadsheet we8217ve created by following steps listed in this article so that you can use it for your own market data analysis or as basis for building your own spreadsheets. Sample Excel File Excel file (download ) containing formulas for calculation of simple moving average, Bollinger Bands, and exponential moving average as described in this post. For this example weve got a CSV file with 6 months of hourly SPY data, covering Sep 3, 2013 8211 Feb 28, 2014. SPY is an ETF tracking SampP500 index. We have nearly 2000 data points in this file. The file contains OHCL price columns, volume, and timestamp column. Disclaimer: this file has been generated using IB Data Downloader . Data file: historicaldataSPY1hour20140301 (text file 8211 to download 8211 right-click and select 8220Save Linked File As8221) Simple Moving Average Basic Calculation Simple Moving Average (SMA) is simply the average price over last N number of bars. Lets calculate SMA for the close prices from our sample data file. Well be calculating a 20-day moving average based on the SPY close price (column D). Let8217s add column header SMA-20 in column G and we type in the following formula value in cell G21 (since row 21 is the first one that has enough data to calculate 20-day SMA): After hitting return to save the formula you should see value 164.57 or close to that in cell G21. In order to calculate SMA-20 for all of the remaining cells below 8211 just select cell G21, move cursor over cell and double-click the small square in the lower-right corner of that cell. You should now see values in column G calculated for the remainder of SPY prices. Generalizing SMA Calculation Now we have calculated 20-day simple moving average values in column G. Its great, but what if we want to calculate 50-day, or 200-day SMA now Updating formula values every time you want to change SMA range is pretty tedious and error-prone. Lets make our calculation more generic by adding a 8220length8221 parameter. We can start off by storing SMA range parameter in a separate cell so that we can reference it in or formula. Here are the steps we followed to implement a generic SMA calculation in our spreadsheet: Let8217s start off by creating a little table on the side where we can store some input parameter values for our indicators. In cell O1 lets type Variable Name, in cell P1 lets type Value. In cell O2 lets type name of our variable: PERIOD. In cell P2 we specify value of the PERIOD variable which well be using to specify period length for our generalized SMA calculation. Changing this variable will trigger recalculation of SMA with the current period value. Lets use value 14 for now. Lets type column header value SMA in cell H1 column H will contain values for our generic SMA indicator. In cell H2 enter this formula: Lets dissect this formula. We are now using value of our PERIOD variable from cell P2. We had to add in front of column and row numbers to freeze reference to cell P2 as we copy SMA formula to other cells in column H. Weve also replaced absolute reference to the Close column price range with the OFFSET Excel function. OFFSET returns a range of cells based on the offset in terms of number rows and columns from a given 8220reference8221 cell. First parameter is the reference cell (in our case H2 itself), second is an expression calculating the first row of the range based on the value of length parameter (P2), 3rd parameter is the column offset to the Close column (-4), negative value represents offset to the left while positive is offset to the right of the reference cell, and the last function parameter with value 1 represents the width of the range returned by OFFSET function, which in our case is just one column: D (CLOSE). Save the formula in cell in H2 and expand it to the rest of cells in column H by double-clicking the little square in lower-right corner of the cell, or dragging the formula down. Removing Formula Errors Now, you will notice that first several rows in the column have error value REF. This happens because there are not enough rows in our data set to calculate the SMA value, and the range returned by OFFSET function goes over the edge of the worksheet for some rows. There exists a number of various techniques to hide error values in excel. Some of them involve formulas which return blank or zero values if a cell value contains an error. While this is perfectly valid technique - it complicates cell formulas and makes them hard to read. Instead, well use conditional formatting to simply hide error values be changing foreground color to white. To change cells font color to white and use no error highlighting follow these instructions: Select columns H-N In Excel: Home - gt Conditional Formatting - gt Highlight Cell Rules - gt More Rules. In the New Formatting Rule dialog select Errors and in Format with select Custom format, then set Fill color to white and font color to white as well. Bollinger Bands Introduction Bollinger Bands is a simple but useful indicator providing valuable information on historical price volatility of a financial instrument, as well as current price deviation from a moving average. When price moves become more volatile 8211 the bands widen, in the periods of relative calm 8211 they come closer together. The relative position of the current price to the bands can also be used to estimate whether market is overbought or oversold. If the current price is close to or crossed upper band 8211 the price is considered in overbought territory, while price close tocrossed lower band 8211 underlying market is considered oversold. Basic Calculation Bollinger Bands indicator could be calculated using either simple moving average or exponential moving average as the basis. Bollinger Bands consists of three data series: moving average (simple or exponential) and two standard deviation (boundary) lines, one above, and one below the moving average, usually at 2 standard deviations from the moving average. Exponential moving average (covered below) gives more weight to the more recent price action, while Simple moving average provides a more stable and less jittery indicator. There are a total of 2 input parameters: 1) moving average period (number of bars), 2) number of standard deviations for the upper band lower bands. In this example well use simple moving average we already calculated in column H (see instructions in the section above). All thats remaining is to add columns for upper and lower bands. We are still using 14-day moving average period value. The first row that has enough data for 14-day SMA is row 15 (since row 1 is used for column header). The upper band will be in column I, so in cell I15 we type the following formula: In this formula we are simply adding two standard deviations of the Close prices from cells D2:D15 to the SMA value. Here the only difference from the previous formula is that we are subtracting two standard deviations from SMA. Excel formula STDEV() calculates standard deviation for a series of values. In this case we are multiplying value by 2 to get 2 standard deviations, and addingsubtracting the result from the moving average to generate the upperlower band values. To expand the formulas 8211 just roll over and double-click on a small square in the lower-right corner of the cell to replicate formula for the rest of the data range. Generalized Bollinger Band Computation Now. how about generalizing the Bollinger Band formula so that we dont have to update our formulas every time we want to calculate Bollinger bands for different number of standard deviations from MA or when we change moving average length. Lets add another parameter to our generic variables table on the right of the spreadsheet. Lets type Std devs: in cell O3, and 2.0 in P3. Next, let8217s add the following formula in I15: In this formula weve replaced 2 with P3 8211 which points to our variable in cell P3 containing number of standard deviations for the bands, and calculate offset based on the PERIOD variable in cell P2. The only difference from the formula in the previous step is that weve replaced after H15 with 8211 (minus), to subtract number of standard deviations from SMA, and we had to change offset to the price columnd. notice -6, instead of -5 in the cols parameter to the OFFSET function to refer to column D (CLOSE). Dont forget to copy new formulas in cells I15 and J15 to the rest of the respective column cells. You can now change values of PERIOD and Std devs variables in cells P2 amp P3, and have SMA and Bollinger Band values automatically recalculated. Bollinger Bands Chart in Excel Watch this video with instructions for adding a Bollinger Band chart to the spreadsheet we created above. Exponential Moving Average Exponential Moving Average (EMA) is type of moving average that is similar to a simple moving average, except that more weight is given to the latest data. The exponential moving average is also known as 8220exponentially weighted moving average8221. Computation Instructions Well use column K to calculate EMA. Lets set our PERIOD value to 1 (cell P2), so that we could enter formula at the top of our sheet and have some values we can see entering the formulas. We can set PERIOD to any value after we are done and have EMA (and SMA) automatically recalculated. In cell K2 we set the first value of the EMA series to be simply equal to the Close value (D2) in the same row, just because we need to seed EMA computation with some sensible value. Next, in cell K3 we enter a standard EMA formula which uses the industry-standard exponent function 2(1number of periods in MA). To better understand the math behind this refer to this page. In this formula we multiply rows Close price (D3) by the exponent function, using P2 to reference our number of periods variable, and add to the result the previous EMA value (K2), multiplied 1- the exponent. This is the standard EMA formula. Now expand the formula to the rest of the column by clicking a square in the lower right of cell K3. We can now change PERIOD value to any other number, make sure your conditional formatting rule is updated to hide error values displayed in cells that dont have enough data going back to calculate their values. Part I Conclusion In this first part of our 3-part series we calculated Simple Moving Average, Bollinger Bands, and Exponential Moving Average technical analysis indicators for our sample historical data set. In the next part well cover two of the most famous technical analysis indicators: MACD and RSI. Before you continue reading this article series we8217d like to bring your attention to a couple of books we hand-picked from a large number of volumes available on the subjects of technical analysis and trading with Microsoft Excel. We found that the selections we listed below provide invaluable fundamental information on using technical analysis and Excel-based trading idea generation, testing, and execution. Combining material described in these books will enable you to develop and test your own trading systems and take them to markets sooner and with more confidence. IB Data Downloader IB Data Downloader version 3.3 is now available Download historical data from Interactive Brokers. Stocks, Futures, ETFs, Indexes, Forex, Options, FOPs. Now supports options historical data download Runs on Windows, MacOS, Linux. Automatically handles IB API pacing violations, no restrictions on duration due to pacing limitations Supports historical data for expired futures contracts. IB Excel Trader IB Excel Trader version 1.6 is now available Trade Stocks, ETFs, Futures, and Forex directly from Excel. Implement custom trading rules using spreadsheet formulas or VBA. Program entry rules for single or bracket exit orders. Market, Stop, Limit, Stop-Limit, as well as complex algo orders are supported. Order Log sheet (new). Contains a detailed list of each order status change in a filterable Excel table. Use our Customization Service to extend IB Excel Trader and contract our programmers to develop your custom trading strategies. Interactive Brokers (IB) is a low cost provider of trade execution and clearing services for individuals, advisors, prop trading groups, brokers and hedge funds. IBs premier technology provides direct access to stocks, options, futures, forex, bonds and funds on over 100 markets worldwide from a single IB Universal account. Member NYSE, FINRA, SIPC. Visit interactivebrokers for more information. Postagens recentes
Comments
Post a Comment