3. 数据源与采集:交易所公告、社交媒体、公司财报、关联方数据获取
做内幕交易图谱,说白了就是跟数据打交道。我干了这么多年反欺诈,最深的体会就是:数据源的质量,直接决定了你图谱的生死。你想想看,如果源头数据都是脏的、不全的,后面再牛的算法也白搭。
这一章,我就把我在项目中踩过的坑、积累的经验,掰开了跟你聊聊。咱们重点看四类数据源:交易所公告、社交媒体、公司财报、关联方数据。嗯,一个一个来。
3.1 交易所公告:最硬的“硬数据”
交易所公告,是所有数据里最靠谱的。因为它有法律效力,造假成本极高。我个人习惯,把它作为图谱构建的“锚点”。
核心采集内容:
- 重大资产重组公告:停牌、复牌、交易方案、标的公司估值。这是内幕交易的高发区。
- 股权变动公告:大股东增减持、股权质押、协议转让。注意看时间点和交易对手方。
- 业绩预告/快报:净利润大幅变动、扭亏为盈。这些信息一旦提前泄露,就是内幕。
- 关联交易公告:与子公司、兄弟公司、关键个人的交易。金额大、频率高的要特别关注。
避坑指南: 我曾经在采集上交所公告时,发现同一个公告编号,PDF内容和网页摘要居然不一致。后来排查发现,是交易所系统在公告发布后半小时内允许“补正”。所以,建议采集时间窗口设在公告发布后1小时,避免拿到半成品。
采集技术要点:
- 使用交易所官方API(如深交所的“信息披露直通车”接口)。
- 备选方案:爬取巨潮资讯网、东方财富网等聚合平台。
- 解析PDF时,注意表格和图片中的关键数据。我习惯用
pdfplumber+camelot组合。
# 伪代码示例:采集并解析交易所公告
import requests
from pdfplumber import open as pdf_open
def fetch_announcement(stock_code, date):
url = f"http://api.szse.cn/api/announcement?code={stock_code}&date={date}"
resp = requests.get(url)
pdf_url = resp.json()['data'][0]['attachUrl']
# 下载并解析PDF
with pdf_open(pdf_url) as pdf:
text = ""
for page in pdf.pages:
text += page.extract_text()
return text
3.2 社交媒体:捕捉“噪音”中的信号
社交媒体数据,又爱又恨。爱的是它时效性极强,恨的是噪音太大。我见过太多团队,花大价钱买了舆情数据,结果图谱里全是垃圾边。
重点采集平台:
- 雪球、东方财富股吧:散户聚集地,但也是内幕消息的“试水池”。注意看那些“吹票”的帖子。
- 微博、微信公众号:财经大V、分析师、甚至上市公司高管的自媒体。他们不经意的一句话,可能就是信号。
- Telegram、微信群:这是内幕交易的重灾区。虽然采集难度大,但价值极高。我建议通过“爬虫+人工标注”的方式,先建立种子库。
我的经验: 别试图分析所有帖子。先聚焦“高影响力用户”和“异常活跃时段”。比如,某只股票在停牌前,股吧突然涌入一批新注册账号,发帖内容高度一致——这大概率是“水军”在预热。
采集技术要点:
- 使用社交媒体开放API(如微博开放平台)。
- 对于封闭群组,可以考虑“模拟登录+消息监听”方案。但注意合规风险。
- 文本清洗时,保留表情符号、@提及、话题标签。这些往往是情绪和关系的载体。
3.3 公司财报:结构化与非结构化的博弈
财报数据,看起来规整,其实坑最多。为什么?因为关键信息往往藏在“附注”里,而不是表格里。
核心采集内容:
- 资产负债表:关注“其他应收款”、“长期股权投资”等科目。这些科目容易藏关联方资金往来。
- 利润表:非经常性损益、投资收益。这些是调节利润的常用手段。
- 现金流量表:经营活动现金流与净利润的匹配度。背离越大,猫腻越多。
- 附注:关联方交易明细、担保情况、股权结构图。这是图谱构建的“金矿”。
注意: 我曾经在分析一家公司的财报时,发现其“其他应收款”科目突然暴增。顺着附注里的明细,发现资金流向了几个自然人账户。再一查,这些自然人是公司高管的亲属。这就是典型的“资金占用型内幕交易”。
采集技术要点:
- 结构化数据:通过Wind、Choice等金融终端API获取。
- 非结构化数据:解析PDF/HTML财报,重点提取附注中的表格。
- 我推荐使用
BeautifulSoup+pandas处理HTML格式财报,用tabula-py处理PDF表格。
# 伪代码示例:提取财报附注中的关联交易
import pandas as pd
from tabula import read_pdf
def extract_related_party_transactions(pdf_path):
# 读取PDF中所有表格
tables = read_pdf(pdf_path, pages='all', multiple_tables=True)
# 筛选包含“关联方”或“关联交易”的表格
related_tables = []
for table in tables:
if '关联方' in table.columns or '关联交易' in table.columns:
related_tables.append(table)
# 合并并清洗
df = pd.concat(related_tables, ignore_index=True)
df = df.dropna(how='all')
return df
3.4 关联方数据:图谱的“骨架”
关联方数据,是内幕交易图谱的核心。没有它,你看到的只是孤立的点,而不是一张网。
核心采集内容:
- 工商注册信息:股东、董事、监事、高管。注意交叉持股和代持关系。
- 亲属关系:配偶、父母、子女、兄弟姐妹。这是内幕交易最常用的“马甲”。
- 社会关系:同学、校友、前同事、同乡。这些关系在公开数据中很难获取,但价值极高。
- 资金往来:银行流水、证券账户交易记录。这是最直接的证据,但采集难度最大。
关键思路: 关联方数据,不要只盯着“直接关系”。要构建“二度关系”甚至“三度关系”。比如,A是B的姐夫,B是C的大学同学,C是D的生意伙伴。A和D看似无关,但通过B和C,他们可能共享内幕信息。
采集技术要点:
- 工商数据:通过企查查、天眼查等平台的API获取。
- 亲属关系:结合户籍数据、婚姻登记数据(需合规授权)。
- 社会关系:利用LinkedIn、校友录等社交平台,通过“关系图谱”算法推断。
3.5 数据采集架构:一张图说清楚
下面这张图,是我在项目中常用的数据采集架构。它把上面说的四类数据源,统一到一个管道里。
这张图的核心逻辑是:先采集,再清洗,最后入图。我个人习惯,在采集层和存储层之间,加一个“质量校验”环节。比如,检查公告的PDF是否完整、财报的表格是否对齐、社交媒体的时间戳是否合理。这一步,能省掉后面80%的麻烦。
一个小技巧: 对于社交媒体数据,我建议做“情感分析”和“话题聚类”。把正面、负面、中性的帖子分开存储。这样,在构建图谱时,可以快速定位“异常情绪”节点。
好了,数据源和采集这块,就聊这么多。记住一句话:数据是图谱的血液,采集是图谱的血管。血管不通,血液再好也没用。