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!
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 –