当前位置:首页>python>用 Python 揪出股市"隐形王者":便宜股票为啥总踩坑?

用 Python 揪出股市"隐形王者":便宜股票为啥总踩坑?

  • 2026-10-11 07:44:43
用 Python 揪出股市"隐形王者":便宜股票为啥总踩坑?

用 Python 揭秘均值回归策略:你的收益从何而来?

2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含 500 篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!

引言

最近读到一篇很有意思的量化实验文章,作者从一则"限制夜间配送"的新闻出发,最终用 SEC 10-K 财报文本挖掘 + 图论分析,构建了一套能跑赢"便宜股策略"超过 25 个百分点的投资模型。

作为 Python 学习者,这个项目几乎涵盖了我们想练手的所有技能:网络爬虫、文本挖掘、图论算法(NetworkX)、数据可视化(Matplotlib)、金融数据分析(Pandas + yfinance)。

今天就带大家拆解这个项目的核心思路,并附上可运行的 Python 代码案例。

一、核心思想:什么是"瓶颈分数"?

作者提出了一个关键问题:一家公司真正的"技术潜力"该如何量化?

答案是:看它在多少其他公司的官方财报(10-K)里被提到为"供应商""合作伙伴""核心基础设施"。被提及越多,说明它越是整个生态系统离不开的"卡脖子"环节。

作者把这个指标定义为 Bottleneck Score(瓶颈分数),公式如下:

Bottleneck_Score = (归一化入度 + 0.1) × (相关性 + 1) / (P/E 比率 / 10)

简单理解:结构性垄断地位 ÷ 估值贵贱,本质是 GARP(合理价格成长)策略的升级版。

二、项目流程拆解

整个数据管道分为 3 步:

  1. 1. 爬取数据:通过 SEC EDGAR API 抓取 48 家 S&P 500 科技公司的 10-K 年报原文
  2. 2. 构建关系网:在"customer""supply""partner"等关键词后 150 字符窗口内,匹配目标公司名称作为有向边
  3. 3. 计算分数:叠加股价、P/E 等财务数据,算出 Bottleneck Score 排序

三、Python 代码案例

案例 1:从 SEC EDGAR 抓取 10-K 文本

import requests
import
 time

# SEC EDGAR 强制要求带 User-Agent,否则会被防火墙拦截

headers = {
    "User-Agent"
: "Your Name your_email@example.com"
}

def
 fetch_10k_text(cik: str) -> str:
    """
    根据公司 CIK 编号获取最新 10-K 财报文本
    cik: 公司在 SEC 的唯一标识,需补齐 10 位
    """

    cik_padded = cik.zfill(10)
    # 第一步:获取公司提交记录

    url = f"https://data.sec.gov/submissions/CIK{cik_padded}.json"
    resp = requests.get(url, headers=headers)
    data = resp.json()

    # 第二步:筛选 10-K 类型的文件

    recent = data["filings"]["recent"]
    for
 form, accession in zip(recent["form"], recent["accessionNumber"]):
        if
 form == "10-K":
            # 拼接出原始文本的 URL

            acc_clean = accession.replace("-", "")
            doc_url = f"https://www.sec.gov/Archives/edgar/data/{int(cik)}/{acc_clean}/"
            return
 doc_url
    return
 None

# 示例:获取微软(CIK = 789019)的 10-K 链接

msft_url = fetch_10k_text("789019")
print
(f"微软 10-K 文档地址:{msft_url}")
time.sleep(0.5)  # SEC 限制每秒最多 10 次请求,务必加延迟

案例 2:在 150 字符窗口内匹配供应链关系

import re

def
 extract_supply_relations(text: str, target_companies: list, keywords: list) -> list:
    """
    从 10-K 文本中提取供应链关系
    text: 财报全文
    target_companies: 目标公司名称列表,比如 ["Microsoft", "NVIDIA"]
    keywords: 供应链关键词,比如 ["customer", "supplier", "partner"]
    """

    edges = []  # 存储 (源公司, 目标公司) 关系对

    # 把文本统一转小写,方便匹配

    text_lower = text.lower()

    for
 keyword in keywords:
        # 找出所有关键词出现的位置

        for
 match in re.finditer(rf"\b{keyword}\b", text_lower):
            start = match.end()
            # 取关键词后面 150 字符作为搜索窗口

            window = text_lower[start:start + 150]

            # 在窗口内查找目标公司

            for
 company in target_companies:
                if
 company.lower() in window:
                    edges.append(company)

    return
 edges

# 示例文本(实际中是几万字的 10-K 全文)

sample_text = """
Our key customers include Microsoft and Apple. We also partner 
with NVIDIA for GPU infrastructure to support our cloud platform.
"""

keywords = ["customer", "partner", "supplier"]
targets = ["Microsoft", "Apple", "NVIDIA", "Google"]

relations = extract_supply_relations(sample_text, targets, keywords)
print
(f"提取到的关系:{relations}")
# 输出:['Microsoft', 'Apple', 'NVIDIA']

案例 3:用 NetworkX 计算入度中心性

import networkx as nx
import
 pandas as pd

# 假设我们已经收集到的边数据(源公司 → 目标公司)

edges = [
    ("AAPL", "MSFT"), ("GOOGL", "MSFT"), ("META", "MSFT"),
    ("AAPL", "NVDA"), ("MSFT", "NVDA"), ("META", "NVDA"),
    ("MSFT", "PTC"), ("ORCL", "PTC"),
]

# 构建有向图

G = nx.DiGraph()
G.add_edges_from(edges)

# 计算入度(被多少家公司提及)

in_degree = dict(G.in_degree())
print
("入度统计(被提及次数):")
for
 ticker, degree in sorted(in_degree.items(), key=lambda x: -x[1]):
    print
(f"  {ticker}: {degree}")

# 计算瓶颈分数(简化版)

def
 bottleneck_score(in_deg: int, correlation: float, pe_ratio: float) -> float:
    """
    in_deg: 入度
    correlation: 与大盘 CapEx 的相关性
    pe_ratio: 市盈率
    """

    # 归一化入度(这里简单除以最大值)

    max_deg = max(in_degree.values())
    norm_in = in_deg / max_deg if max_deg > 0 else 0
    return
 (norm_in + 0.1) * (correlation + 1) / (pe_ratio / 10)

# 模拟计算 MSFT 的瓶颈分数

score = bottleneck_score(in_deg=11, correlation=0.965, pe_ratio=21.80)
print
(f"\nMSFT 瓶颈分数:{score:.4f}")

四、实验结果:Alpha 从哪里来?

作者用 2025 年 5 月的数据选出 Top 6 股票(HPE、MSFT、PTC、AMAT、QCOM、AAPL),与"最便宜的 6 只 IT 股"基准对比一年回测:

组合
累计收益
瓶颈模型组合
+51.78%
简单低 P/E 基准
+26.31%
超额 Alpha+25.47%

最关键的洞察是 3 个阶段:

  1. 1. 齐涨阶段(2025.5 — 2025.11):低估值因子轮动,两组并驾齐驱
  2. 2. 大分化阶段(2025.11 — 2026.4):市场回调,没有生态护城河的"价值陷阱"(如 TRMB、SWKS)崩盘,瓶颈组合稳守 +20%
  3. 3. 王者归来(2026.4 — 2026.5):PTC 和 MSFT 估值压缩到位后暴力反弹

五、给 Python 学习者的启示

  1. 1. 数据来源决定上限:SEC EDGAR 这种官方数据库远比爬虫八卦新闻靠谱,写量化项目优先选权威源
  2. 2. 图论是被低估的金融武器:networkx 库不到 100 行代码就能跑出投资逻辑
  3. 3. 遵守 robots 协议:SEC 强制要求 User-Agent,每秒不超过 10 次请求,写爬虫务必加 time.sleep()
  4. 4. 简单模型也能打败复杂模型:作者用的只是关键词窗口匹配,未来可升级为 LLM 语义分析

总结

这个项目最妙的地方在于:它把"技术潜力"这种玄学概念,变成了一个可计算的网络指标。

对我们 Python 学习者来说,它示范了一套完整的数据科学流水线:

  • • 爬取:requests + SEC EDGAR API
  • • 清洗:正则 + 文本窗口匹配
  • • 建模:NetworkX 入度中心性
  • • 回测:Pandas + yfinance
  • • 可视化:Matplotlib 网络图

如果你正在学 Python,强烈建议把这个项目当作综合练手题,跑一遍下来收获绝对超过 10 个 leetcode。

记住作者的核心结论:忽略账面噪音,挖掘 SEC 披露中的隐藏网络,远离便宜的垂死企业,把资金部署到真实需求集中的地方。

参考文章

加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。

财经数据与量化投研知识社区

2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:

  1. 1. 双典系统赋能:获赠《财经数据宝典》与《量化投研宝典》完整文档,凝练多年实战经验,构建系统化知识框架;
  2. 2. 量化因子日更教程(2026重磅新增):每日更新「量化因子专题教程」,配套完整可运行代码与实战案例,深度拆解因子构建、回测与优化全流程;
  3. 3. 量化文章专题教程库:500+篇星球独有高质量教程式文章,系统覆盖策略开发、因子研究、风险管理等核心领域,内容基本每日更新,并配套精选学习资料与实战参考;
  4. 4. 量化投研实战课程:赠送《AKQuant-入门及实战》《PyBroker-入门及实战》视频课程,手把手教学,快速掌握量化策略开发技能;
  5. 5. 财经数据支持:定期更新国内外财经数据,为策略研发提供精准、可靠的数据基础;
  6. 6. 顶尖学者与行业专家分享:年度邀请学术界博士与业界资深专家开展前沿论文精讲与实战案例分享,不少于4场,直击研究前沿与产业实践;
    专家直连答疑:与核心开发者及领域专家实时互动,高效解决投研实战难题;
  7. 7. 专业社群与专属福利:加入高质量交流社群,获取课程折扣及更多独家资源。

星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!

好文推荐

1. 用 Python 打造股票预测系统:Transformer 模型教程(一)

2. 用 Python 打造股票预测系统:Transformer 模型教程(二)

3. 用 Python 打造股票预测系统:Transformer 模型教程(三)

4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)

5. 揭秘隐马尔可夫模型:因子投资的制胜武器

6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用

7. 金融 AI 助手:FinGPT 让你轻松掌握市场分析

8. 量化交易秘籍:为什么专业交易员都在用对数收益率?

9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解

10. 掌握金融波动率模型:完整 Python 实现指南

好书推荐

最新文章

随机文章