Quando você está indo para trabalhar com essa série de tempo em Python, pandas é indispensável. E heres a boa notícia: ele vem com um downloader histórico de dados para o Yahoo: pandas. io. data. DataReader. Atualização para pandas 0.19: O módulo pandas. io. data foi removido de pandasgt0.19 em diante. Em vez disso, você deve usar o pacote pandas-datareader separado. Quando eu tento, as importações funcionam bem, mas quando eu chamo a linha 39goog39 recebo um erro: quotIOError: após 3 tentativas, o Yahoo não Retornar um 200 para url 39ichart. finance. yahoohellip Como isso poderia ser corrigido ndash Cleb Aug 25 15 em 15:01 Mesmo como Cleb. Não retornou código de status 200 ndash bluerubez Oct 28 15 at 1:55 Cleb Parece ser porque GOOG não é aceito pela API (don39t entender por que, após o movimento para Alphabet GOOG ticker foi mantido). Funciona bem para GOOGL e vários outros símbolos. Exemplo ajustado apenas no caso. Ndash DefOs Oct 28 15 at 2:10 Estendendo DefOss responder com uma demo real. Como DefOs já disse - usando Pandas Datareader torna esta tarefa um divertido real puxando todos os dados históricos disponíveis para AAPL a partir de 1980-01-01 salvar todos os dados como arquivo CSV d: tempaapldata. csv - 5 primeiras rowsI estou interessado em fazer análise econométrica Sobre derivados financeiros. O principal hangup que tenho enfrentado é que não existem bons recursos livres (pelo menos que eu sei de) para dados históricos de opções. Por essa razão eu quero criar meu próprio banco de dados pessoal de preços de opções históricas. Eu quebrei este projeto para baixo em três obstáculos principais: Descobrir como obter dados de opções a partir de python Escolha um formato de armazenamento de dados Automatizar a coleta de dados diários Obtendo dados de opções em python Durante o verão eu tinha algum tempo livre e teamed up com meu Papai para criar um modelo de investimento. Embora seja um modelo muito simples, este post é sobre a construção de um banco de dados para que eu não vou entrar em detalhes aqui. Basta dizer que eu precisava encontrar uma maneira de obter dados de opções de yahoo Finanças. Este foi um desafio único, porque ao contrário de dados de equidade ou dados de outras fontes como FRED, dados de opções não tem um conveniente download para csv botão em qualquer lugar do site. Na época eu estava lendo o excelente livro Python para análise de dados por Wes McKinney e tenho uma idéia de como implementar um rastreador da web básica para analisar o html no yahoo e retornar os dados em um formato amigável python. Longa história curta, eu escrevi algum código para fazer exatamente isso e ele fez o seu caminho para a versão 0.9 da biblioteca pandas (se você arent familiarizado com pandas e você trabalha com dados em python você deve definitivamente check it out). Agora, apenas estes poucos comandos são necessários para obter dados de opções do yahoo Finanças: Os chamados e coloca objetos são pandas DataFrames que contêm as mesmas informações que você iria encontrar na página de Finanças yahoo para opções da Apple Inc.. Escolhendo o formato de arquivo Na escolha de um formato de arquivo eu tinha duas considerações principais: tamanho do arquivo e velocidade em que ele pode ser escrito. Para testar isso, eu escrevi um script simples que gerou uma matriz aleatória de 4000 por 4000 numpy e funções definidas para escrever e ler esses dados em diferentes formatos de arquivo. Os formatos que eu escolhi para trabalhar com csv, hdf5 (.h5), e MatLab (.mat). Abaixo está o script que eu usei para executar o teste: Depois que eu tinha esse código eu simplesmente disparou iPython e executou o arquivo (filetest. py) e usou a magia timeit para ver quanto tempo levou cada um dos três métodos para ler e escrever os dados. Os resultados de temporização, juntamente com os tamanhos de arquivo final são resumidos na tabela abaixo: É fácil ver que o tipo de arquivo hdf5 é o melhor para escolher para meus propósitos. Gostaria de observar aqui que a razão pelo qual o formato de arquivo hdf5 é 12 do tamanho do arquivo. mat é porque o dtype no arquivo. h5 é um flutuador de 32 bits, enquanto o dtype. mat é um flutuador de 64 bits. No entanto, para as opções de ações que geralmente têm havecare sobre dados fora duas casas decimais para que a precisão de 32 bits é muito. Automatizando a recuperação de dados O último passo para obter esse banco de dados foi automatizar o processo de recuperação de dados. Para fazer isso, usei o popular cron de programação do UNIX. Eu corro OSX 10.8 Mountain Lion, e por padrão em 10.8 a ferramenta cron está desativada. Para corrigir isso, eu simplesmente executei o seguinte comando no terminal: Este comando cria o arquivo etccrontab (se ele já não existir) e fica pronto para ser usado pelo cron. Eu não vou dar uma explicação detalhada sobre como usar cron aqui (como eu ainda sou bastante novo em mim), mas googling para ele lhe dará muitos exemplos e tutoriais. Eu vou, no entanto dar a linha no meu arquivo crontab que executa o script: O próximo passo foi escrever o script que eu teria chamada cron. Isso aparece abaixo. Eu tenho cron executar este script em uma hora especificada cada dia de semana e preencher o arquivo hdf5. O arquivo resultante terá uma estrutura aninhada como esta: A notação CTICKmm-yy representa uma opção de chamada (C), um determinado ticker (TICK) ea expiração da opção (mm-yy). Dentro de cada conjunto de dados existem três colunas: preço de exercício, último preço no contrato de opção e volume no último dia de negociação. Depois de executar este script por uma noite, o arquivo de dados hdf5 resultante foi 7.648648 MB. Se eu fosse permitir que este arquivo para executar cada dia útil por um ano, o tamanho do arquivo final seria menos de 2 GB. Não é ruim Se você quiser mais informações sobre como eu coletar nomes de ticker ou o que a funcionalidade Opções está em pandas 0.10 ou anterior deixar um comentário e eu vou fazer o meu melhor para responder. Incrível Eu tenho querido fazer algo como isto, desde que eu também quero backtest algumas das minhas estratégias. Você provavelmente deve alterar 39 de opções de importação de opções39 para 39 de pandas. io. data importação Options39, mas que não seja o seu script funciona muito bem. Você estaria disposto a compartilhar os dados de opção que você coletou até agora, eu poderia retribuir o favor, atuando como um backup para executar o script no caso de você perder a conectividade por alguns dias. Eu estava considerando testar aproximadamente usando os preços gerados usando Black8211Scholes, mas dados reais é obviamente melhor. Que bom que você gosta do roteiro. Na verdade, eu parei de executar o arquivo todas as noites, então não tenho muitos dados. Caso contrário, ficaria feliz em compartilhá-lo com você. Com relação às declarações de importação. Eu sou o autor da classe Options em pandas. No momento de escrever este blog post algumas das funcionalidades que eu uso no script hadn39t foi mesclado em uma versão lançada de pandas, então eu liguei para a minha versão local (em um arquivo chamado opções) em que baseei a versão pandas FYI: São realmente algumas mudanças API acontecendo com a classe Opções dentro de pandas agora. Se as mudanças acontecerem como um dos outros contribuintes sugeriu, grande parte do código neste script pode ser obsoleto. No mínimo, ainda deve começar as pessoas começaram Estou no processo de criação de um grande banco de dados de derivados. A análise de weblinks está pronta. Onde eu sou um pouco perdido é como criar o banco de dados de todas as opções individuais de tal forma que permite cálculos como SKEW, etc sem manualmente escolher as opções individuais cada vez para fazer o cálculo. Como fazer tais referências genéricas. Estou um pouco perdido aqui e quer classificar que primeiro antes de ir em frente com a criação de dados. Eu acredito que a ordem correta na tupla de retorno é puts, chama aapl. getoptionsdata (). Hey Martin, você está certo. Quando eu inicialmente adicionado as opções de recolha de código para pandas, eu tinha getoptionsdata retornar chamadas primeiro. Não tenho certeza quandowhy alguém mudou. Eu atualizei o código na postagem para usar o correto coloca, chamadas ordenando agora. Eu acho que seria muito útil ser capaz de baixar os preços das opções. Para começar com eu estava usando o script que você forneceu acima (praticamente). Eu tenho pandas 0.13.1, mas parece completamente quebrado. Os erros ocorrem com a seguinte linha: rawcalls option. getforwarddata (months100, callTrue, putFalse, nearFalse, abovebelow6). Desde que eu quero obter todos os dados de opção eu acho que tenho que usar o método getforwarddata. Os outros métodos parecem apenas suportar obter um determinado mês. O erro é bastante longo, mas as últimas linhas são: File quotusrlocallibpython2.7dist-packagespandasioparsers. pyquot, linha 1653, em nextline raise StopIteration StopIteration Alguém sabe como corrigir isso Também estou executando o Ubuntu Linux. Eu acho que a versão 0.11 do Pandas estava funcionando um pouco, embora não conseguiria todos os preços das opções. Eu não tenho certeza de como usar pip para downgrade neste momento, então eu provavelmente estou preso tentando obter a versão 0.13.1 funcionando. Hey Anônimo (desculpe don39t sabe o seu nome, ou se é Anónimo - que é impressionante) Lamentamos que estas funções aren39t funcionando corretamente. Eu escrevi este código cerca de um ano atrás e no momento em que isso funcionou sem problemas. Pandas está sob forte desenvolvimento e parece que desde o tempo que eu escrevi este código, o api passou por algumas mudanças de quebra. Infelizmente, eu não tenho tempo agora para passar e alterar o código deste post para que ele funciona com 0,13. Posso dizer que toda a funcionalidade descrita neste post ainda existe com v0.13, mas algumas assinaturas do método podem ter sido alteradas. Eu acredito que o docstrings para cada método da classe Options deve ser detalhado o suficiente para dar-lhe uma boa idéia sobre o que precisa mudar. Você pode encontrá-los aqui: githubpydatapandasblobmasterpandasiodata. pyL545-L905 Se você está se sentindo para cima para ele e acabam fazendo as alterações necessárias, por favor me avise e vou atualizar o código aqui para refleti-los. P. S. Se você der uma tentativa e está tendo uma estadia dura, borne aqui outra vez e I39ll tentativa para dar alguma orientação. Eu estive ocupado com outro projeto, mas basicamente eu só fiz algumas mudanças para fazer as coisas correrem. Por simplicidade, fiz as alterações no arquivo data. py. Eu acho que os índices inmonth e inyear foram calculados errado. Além disso, em alguns casos o frame retorna None. Nenhum retorno causou a queda. Se alguém tem o tempo o código deve ser atualizado para apenas consulta para opções de dados que realmente existem no intervalo de meses de tempo passado. Não tenho certeza como analisar essas informações a partir do HTML. Agora ele irá consultar o Yahoo para cada mês de dados, mesmo quando não há opções disponíveis para esse monthyear para o método getforwarddata. Aqui está a saída diff do linux para as alterações que eu fiz: diff pandasiodata. py pandas.01iodata. py 25d24 lt DEBUG Verdadeiro 538,541d536 lt lt if (len (data) 0): lt return Nenhum lt 590,595c585 lt try: lt self. Símbolo symbol. upper () lt except: lt msg quotsymbol deve ser um stringquot válido lt raise ValueError (msg) lt --- gt self. symbol symbol. upper () 860,866c850,861 lt lans lt for i, m in enumerate (Em meses): lt anos (m-1) 12 lt mon m - anos12 lt inyears. append (anosCURYEAR) lt inmonthsimon --- gt inyears CURYEAR (meses 1) gt gt Descobrir quantos itens em inmonths passam de 12 gt para mudar 0 gt para i no intervalo (meses): gt se inmonthsi gt 12: gt inmonthsi - 12 gt para trocar 1 gt gt Alterar os itens correspondentes na lista inyears. Gt para i no intervalo (1, tochange 1): gt inyears-i 1 875,878c870,873 lt para i no intervalo (meses): lt m2 inmonthsi lt y2 inyearsi lt se DEBUG: print quotGetting s: ssquot (self. symbol, M2, y2) --- gt para mon na gama (meses): gt m2 inmonthsmon gt y2 inés meses gt 892,895d886 lt se quadro é Nenhum: lt se DEBUG: impressão 39. não dados39 lt continue lt Oi, Obrigado por seu grande trabalho . Parece que ele está quebrado - talvez uma mudança layoutschema no yahoo (it39s que tableloc 13 na chamada para getoptiondata ()) I39ll depurá-lo quando eu tenho tempo, here39s os detalhes até agora: Conectado ao depurador pydev (compilação 135.1057) Traceback (Última chamada mais recente): Arquivo quotusrsharepycharmhelperspydevpydevd. pyquot, linha 1733, em debugger. run (setup39file39, None, None) Arquivo quotusrsharepycharmhelperspydevpydevd. pyquot, linha 1226, em executar pydevimports. execfile (arquivo, globais, locais) executar o script Arquivo Quothomechrisdevelopsrctradingoptions. pyquot, linha 5, em puts, chama aapl. getoptionsdata (expirydate (2017, 1, 16)) Arquivo quotusrlibpython2.7dist-packagespandasiodata. pyquot, linha 630, em getoptionsdata self. getcalldata) Arquivo quotusrlibpython2.7dist-packagespandasiodata. pyquot , Linha 748, em getputdata return self. getoptiondata (mês, ano, expiração, 13, 39puts39) Arquivo quotusrlibpython2.7dist-packagespandasiodata. pyquot, linha 673, em getoptiondata quot foundquot. format (tableloc, nt Ables)) IndexError: Localização da tabela 13 inválido, 3 tabelas encontradas da importação de pandas. io. data Opções da data de importação de data / hora aapl Opções (39AAPL39, quotyahooquot) puts, chamadas aapl. getoptionsdata (expirydate (2017, 1, 16)) In3: Import pandas In4: pandas. version Out4: 390.13.139 Oi, obrigado pelo comentário. Este código está agora quebrado devido a alterações na API do Yahoo Finance. Acho que os desenvolvedores de pandas têm o código original que eu lhes dei. Veja a discussão relevante aqui: githubpydatapandaspull8631 Oi Spencer desculpas para a pergunta anônima, mas, quando você executou este programa para cada ticker em sua lista de NASDAQ e NYSE símbolos, quanto tempo foi o tempo de execução de uma iteração inteira Anonymous - não há problema. Essa rotina leva muito tempo para ser executada. Provavelmente na ordem de 6-8 horas. Poderia ser acelerado um pouco, fazendo várias solicitações de cada vez usando os módulos de enfileiramento e fila na biblioteca padrão. Eu tenho um exemplo de fazer isso com dados de equidade regular aqui: gist. githubspencerlyon28a90d9fdffd15e3ecddb Spencer - Eu sou muito novo para python e programação em geral, mas acho poderoso e fascinante com o pouco researchwork que eu fiz. Até agora eu coloquei um programa muito simples para fazer algo semelhante. Isso é o que eu tenho até agora: import datetime como dt importação pandas como pd importação numpy como np de pandas. io. data importação Opções de pandas importar DataFrame importação h5py como h5 num 0 newdatapd. DataFrame () while num lt tickers. size: Tente: itickers39Symbol39num opções Opções (i, quotyahooquot) dados options. getoptionsdata () newdatanewdata. append (dados) except: passe imprimir num numnum1 Na minha lista de ticker tenho 6280 símbolos ou assim, e eu achei que o getoptionsdata executa muito mais rápido do que o Método getalldata. Agora isso funciona em cerca de 3 horas. Meu objetivo é cortar isso em 16o. Ele ainda está em estágios muito básicos, mas ele funciona e reúne os dados para tickers que contêm. Se você tem algumas dicas ou sugestões para melhorar o desempenho I39m todas as orelhas. Eu sei que uma estrutura de looping pode não ser o mais eficiente, mas tudo para mim é tentativa e erro. Se isso for trivial e / ou uma pergunta idiota, peço desculpas, Novamente, estou aprendendo. Eu imagino que o gargalo (parte mais lenta) deste programa é recuperar os dados da web. Usando a fila e threading ferramentas na biblioteca padrão como eu fiz no exemplo que eu postei um link para é provavelmente a melhor maneira de acelerar esta parte. Outra opção relativamente simples para fazer recuperação de dados paralela é escrever uma função que obtém os dados para uma única lista. Então você pode usar algo como IPython paralelo para mapear a função sobre a lista de tickers em paralelo. Um exemplo de usar mapa em paralelo pode ser encontrado aqui: ipython. orgipython-doc2parallelparalleldemos. html By the way, o único loop aqui não é certamente o que leva este código muito tempo para ser executado - então don39t se preocupar com isso. I39m desculpe, mas eu haven39t visitou este código em particular em mais de 2 anos. Pandas move-se rapidamente, então não surpreende que o código neste post não funcione. Eu don39t atualmente tem tempo para depurar o script, mas eu sugeriria olhar para a documentação de pandas para a opção atual recursos de raspagem de preço. Você pode encontrá-lo aqui pandas. pydata. orgpandas-docsstableremotedata. htmlyahoo-finance-options. Para listas de ticker. Eu estava obtendo-os a partir destas duas urls: Eu don39t saber muito sobre a programação, mas eu tenho um monte de arquivos de símbolo anual de intradata. co, mas eu preciso ter por exemplo ano 2017-2017 em um e mesmo arquivo. Porque eu quero mapeá-lo em meu software como um gráfico estendido É possível fazer com este scriptTransferir a versão mais recente para Mac OS X Baixe a versão mais recente do download Baixe a versão mais recente para o Windows Faça o download das versões mais recentes do Python OpenPGP Public Keys Fonte E executáveis binários são assinados pelo gerenciador de lançamento usando sua chave OpenPGP. Os gerentes de liberação e construtores binários desde o Python 2.3 foram: Nota: O ID da chave Barrys A74B06BF é usado para assinar as versões Python 2.6.8 e 2.6.9. Sua ID de chave EA5BBD71 foi usada para assinar todas as outras versões do Python 2.6 e 3.0. Sua ID chave ED9D77D5 é uma chave v3 e foi usada para assinar lançamentos antigos. Você pode importar as chaves públicas do gerenciador de releases, baixando o arquivo de chave pública daqui e executando ou pegar as chaves individuais diretamente da rede do servidor de chaves executando este comando: Nas páginas de download específicas da versão, você deverá ver um link para Tanto o arquivo para download como um arquivo de assinatura destacado. Para verificar a autenticidade do download, pegue os dois arquivos e, em seguida, execute este comando: Observe que você deve usar o nome do arquivo de assinatura, e você deve usar o que for apropriado para o download que você está verificando. (Estas instruções são voltadas para usuários de linha de comando GnuPG e Unix. Contribuições de instruções para outras plataformas e aplicativos OpenPGP são bem-vindas.) Outros Itens Úteis Procurando por módulos Python de terceiros. O Índice de Pacotes tem muitos deles. Você pode visualizar a documentação padrão on-line, ou pode baixá-la em HTML, PostScript, PDF e outros formatos. Consulte a página de Documentação principal. Estão disponíveis informações sobre as ferramentas para desembalar os arquivos de arquivo fornecidos em python. org. Gorjeta . Mesmo se você baixar um binário pronto para a sua plataforma, faz sentido também baixar a fonte. Isso permite navegar na biblioteca padrão (o subdiretório Lib) e nas coleções padrão de demos (Demo) e ferramentas (Ferramentas) que acompanham. Há muito que você pode aprender com a fonte Há também uma coleção de pacotes Emacs que o Emacsing Pythoneer pode achar útil. Isso inclui os principais modos de edição Python, C, C, Java, etc Python interfaces depurador e muito mais. A maioria dos pacotes são compatíveis com Emacs e XEmacs. Queremos contribuir Queremos contribuir Veja o Python Developers Guide para aprender sobre como o desenvolvimento do Python é gerenciado. Agora, temos uma função muito simples para baixar dados históricos de estoque do Yahoo, vamos ver se podemos usar a mesma técnica para baixar dados do Google Finança. Se nos dirigimos para a página principal do Google Finance e levantamos uma cotação para a AAPL, veremos um link para preços históricos no canto superior esquerdo. Clicar nesse link exibirá a página de preços históricos. Por padrão, a página mostra uma tabela bem formatada de preços com o preço mais recente no topo da página. Observe que há uma opção para escolher dois intervalos de datas para os preços e, assim como o Yahoo, existe um link para baixar os dados para uma planilha. Agora escolhemos um intervalo de datas (neste caso, 1 de novembro de 8211 30 de novembro) e clique no botão de atualização. Então nós podemos baixar os dados usando o link no lado direito da página. Por padrão, ele é transferido como 8220data. csv8221. Terminamos com os seguintes dados: Estes dados parecem muito semelhantes aos dados do Yahoo, mas sem o fechamento ajustado. Parece que o Google ajusta os preços para nós, então não teremos que. Além disso, observe as datas são formatadas de forma diferente. Deve ser muito fácil de converter para o nosso formato padrão que definimos na nossa classe de Cotações na postagem anterior. Agora precisamos decifrar o link usado para obter os dados. Copiamos o link clicando com o botão direito e selecionando 8220Copy link address8221 e terminando com o seguinte: Temos as opções de consulta: cid, startdate, enddate, num e output. Dê uma olhada nos valores de data. What8217s com os sinais de porcentagem Sempre que você vê 82208221 sinais em um url, isso significa que ele foi url codificado. Pesquisando o google, podemos facilmente encontrar muitos sites que irá codificar e decodificar cadeias url. Ao descodificar a seqüência de url bruto, nós acabamos com: Isso parece muito mais fácil de descobrir. Há apenas um problema. Qual é o cid Provavelmente algum tipo de id de banco de dados. Mas observando a seqüência de consulta para a página principal, podemos ver que ele usa uma 8220q8221 opção que leva a troca e nome do símbolo. Jogando ao redor com combinações diferentes destes parâmetros, eu encontrei que nós podemos usar a opção de q sem a troca, ea opção do num não parece ser necessária. Podemos simplificar a string de URL para: A única coisa que resta a fazer agora é subclasse nossa classe de Citação original e personalizá-la para construir nossa string de URL e converter as datas em nosso formato comum. Aqui está o que eu acabei com: Este é ainda mais simples do que a versão do Yahoo. Não há necessidade de calcular os preços ajustados. A principal diferença é o formato de url e formatação de tempo diferentes. Você pode baixar um arquivo com a classe Quote e alguns testes de prompt de comando aqui: google. py Em uma postagem no futuro, vamos consolidar todas essas classes e criar um utilitário de linha modulecommand Python para baixar dados históricos dessas várias fontes salvá-los para Disco em um formato consistente. Fique ligado
No comments:
Post a Comment