2015-07-20 11 views
8

Czy jest ktoś, kto doświadczył skrobania dokumentów SEC 10-K i 10-Q? Utknąłem podczas próby złomowania miesięcznie zrealizowanych odkupień akcji od tych dokumentów. W szczególności chciałbym uzyskać następujące informacje: 1. Okres; 2. Łączna liczba nabytych akcji; 3. Średnia cena zapłacona za jedną akcję; 4. Łączna liczba nabywanych udziałów w ramach publicznie ogłaszanych planów lub programów; 5. Maksymalna liczba (lub przybliżona wartość dolara) tytułów uczestnictwa, które mogą jeszcze zostać zakupione w ramach planów lub programów dla każdego miesiąca od 2004 do 2014. Mam łącznie 90 000 formularzy do przeanalizowania, więc nie będzie to możliwe ręcznie.Web scraping SEC Edgar 10-K i 10-Q opiłki

Informacje te są zazwyczaj przekazywane w części 2 "Rynek części wspólnych dla akcjonariuszy giełdowych, powiązane sprawy akcjonariuszy i nabyte przez emitenta papiery wartościowe" w 10 K i "Część 2 Pozycja 2 Niezarejestrowana sprzedaż kapitałowych papierów wartościowych i wykorzystanie wpływów ".

Oto jeden przykład z opiłkami 10-Q, które muszę analizować: https://www.sec.gov/Archives/edgar/data/12978/000104746909007169/a2193892z10-q.htm

Jeśli firma nie ma wykupu akcji, tabela ta może zabraknąć w raporcie kwartalnym.

Próbowałem parsować pliki HTML za pomocą Python BeautifulSoup, ale wyniki nie są zadowalające, głównie dlatego, że pliki te nie są napisane w spójnym formacie.

Dla przykładu, tylko w ten sposób mogę myśleć do analizowania tych form jest

from bs4 import BeautifulSoup 
import requests 
import unicodedata 
import re 

url='https://www.sec.gov/Archives/edgar/data/12978/000104746909007169/a2193892z10-q.htm' 

def parse_html(url): 
    r = requests.get(url) 
    soup = BeautifulSoup(r.content, 'html5lib') 
    tables = soup.find_all('table') 

    identifier = re.compile(r'Total.*Number.*of.*Shares.*\w*Purchased.*', re.UNICODE|re.IGNORECASE|re.DOTALL) 

    n = len(tables) -1 
    rep_tables = [] 

    while n >= 0: 
     table = tables[n] 
     remove_invalid_tags(table) 
     table_text = unicodedata.normalize('NFKD', table.text).encode('ascii','ignore') 
     if re.search(identifier, table_text): 
      rep_tables += [table] 
      n -= 1 
     else: 
      n -= 1 

    return rep_tables 

def remove_invalid_tags(soup, invalid_tags=['sup', 'br']): 
    for tag in invalid_tags: 
     tags = soup.find_all(tag) 
     if tags: 
      [x.replaceWith(' ') for x in tags] 

Powyższy kod zwróci tylko bałagan, który może zawierać wykupu informacji. Jednak 1) nie jest wiarygodny; 2) jest bardzo powolny; 3) następujące kroki w celu skrobania daty/miesiąca, ceny akcji i liczby akcji itp. Są o wiele bardziej bolesne. Zastanawiam się, czy istnieje więcej możliwych języków/podejść/aplikacji/baz danych, aby uzyskać takie informacje? Stukrotne dzięki!

+0

Załączono pełne listy stron internetowych, które muszę przeanalizować. Będę bardzo wdzięczny, jeśli możesz dać mi jakąś wskazówkę! Dzięki! https://www.dropbox.com/s/369aviq5vkno9o3/ListURL.xlsx?dl=0 –

Odpowiedz

1

Nie jestem pewien co do pythona, ale w R istnieje piękne rozwiązanie z pakietem "finstr" (https://github.com/bergant/finstr). "finstr" automatycznie wyodrębnia sprawozdania finansowe (rachunek zysków i strat, bilans, przepływy pieniężne itp.) Z EDGAR, używając formatu XBRL.

Powiązane problemy