Соскоб для стен SEC Edgar 10-K и 10-Q

Есть ли у кого-нибудь опыт работы со скребками SEC 10-K и 10-Q? Я застрял при попытке очистить ежемесячные выкупленные акции от этих заявок. В частности, я хотел бы получить следующую информацию: 1. Период; 2. Общее количество приобретенных акций; 3. Средняя цена за акцию; 4. Общее количество акций, приобретенных в рамках публично объявленных планов или программ; 5. Максимальное количество (или приблизительная стоимость в долларах) акций, которые еще могут быть приобретены в соответствии с планами или программами для каждого месяца с 2004 по 2014 год. У меня есть в общей сложности более 90 000 форм для анализа, поэтому сделать это будет невозможно вручную.

Эта информация обычно указывается в разделах "Часть 2, пункт 5" Рынок обыкновенных акций регистранта, связанные с ними вопросы акционеров и приобретения эмитентом долевых ценных бумаг "в 10-Ks, и" Часть 2, пункт 2, незарегистрированные продажи долевых ценных бумаг и использование доходов ".

Вот один пример 10-Q заявок, которые мне нужно проанализировать: https://www.sec.gov/Archives/edgar/data/12978/000104746909007169/a2193892z10-q.htm

Если у компании нет выкупа акций, эта таблица может отсутствовать в квартальном отчете.

Я попытался проанализировать HTML-файлы с помощью Python BeautifulSoup, но результаты не являются удовлетворительными, в основном из-за того, что эти файлы не записаны в согласованном формате.

Например, я могу думать только о том, чтобы разобрать эти формы,

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]

Приведенный выше код возвращает только тот беспорядок, который может содержать информацию о выкупе. Однако 1) это не надежно; 2) это очень медленно; 3) следующие шаги по сбору даты / месяца, цены акций, количества акций и т. Д. Сделать гораздо сложнее. Мне интересно, есть ли более подходящие языки / подходы / приложения / базы данных для получения такой информации? Бесконечно благодарен!

1 ответ

Я не уверен насчет python, но в R есть красивое решение, использующее пакет 'finstr' ( https://github.com/bergant/finstr). 'finstr' автоматически извлекает финансовые отчеты (отчет о прибылях и убытках, бухгалтерский баланс, денежные потоки и т. д.) из EDGAR в формате XBRL.

Вот блокнот Jupyter, который просматривает 10Ks и 10Qs в поисках текстовых различий в теле заявок. Возможно, вы сможете адаптировать его к своей цели (полное раскрытие, я работаю в Quantopian).

Другие вопросы по тегам