2015-07-20 108 views
8

有没有人有过刮擦SEC 10-K和10-Q申请的经验?我试图从这些文件中刮取每月实现的股票回购,我陷入了困境。具体而言,我想获得以下信息:1.期间; 2.购买股份总数; 3.每股平均价格支付; 4.作为公开宣布计划或计划的一部分购买的股份总数; 5.根据计划或计划在2004年至2014年每个月可能购买的股票数量(或近似美元价值)。我总共有90,000多份表格可供解析,因此不可行手动。网站刮取SEC Edgar 10-K和10-Q申请

此信息通常以10-Ks的“第2部分第5项注册人普通股权,相关股东事宜和发行人购买股票证券市场”和“第2部分第2项未登记销售股权证券和所得款项用途”。

这里是我需要解析10-Q申请的一个例子: https://www.sec.gov/Archives/edgar/data/12978/000104746909007169/a2193892z10-q.htm

如果一个公司没有股份回购,该表可从本季度报告中丢失。

我试图用Python BeautifulSoup解析html文件,但结果并不令人满意,主要是因为这些文件没有以一致的格式编写。

例如,我能想到的唯一方法来解析这些形式是

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)以下步骤刮去日期/月份,股票价格和股数等等,要做得更加痛苦。我想知道是否有更多可行的语言/方法/应用程序/数据库来获取此类信息?太感谢了!

+0

附上我需要解析的网站的完整列表。如果你能给我一些提示,我将非常感激!谢谢! https://www.dropbox.com/s/369aviq5vkno9o3/ListURL.xlsx?dl=0 –

回答

1

我不确定python,但是在R中有一个使用'finstr'包(https://github.com/bergant/finstr)的漂亮解决方案。 'finstr'使用XBRL格式自动提取EDGAR的财务报表(损益表,资产负债表,现金流量等)。