Skill: goatdeesign/congress-stock-tracker (version 1.0.1)

--- name: congress-stock-tracker description: 国会山股神线索追踪工具。追踪美国国会议员最新股票交易动态，识别被多位议员集中买入的重仓标的，结合议员所在委员会和近期立法/监管动态，分析交易背后可能的政策事件催化剂，并检测大额交易、密集交易、跨党派共识等异常信号。当用户询问以下问题时使用本技能：(1) 国会议员最近买了什么股票 (2) 哪些股票被议员重仓买入 (3) 议员交易背后有什么政策线索 (4) 国会山股神/佩洛西等议员的持仓动态 (5) 分析国会交易异常信号 --- # 🏛️ 国会山股神线索追踪 追踪美国国会议员股票交易，挖掘重仓标的，分析政策线索。 ## 工作流程 ``` 用户提问 → 判断查询类型 → 获取交易数据 → 分析处理 → 生成报告 ``` 1. **判断查询类型**： - **全景扫描**（"最近议员们买了什么"）→ 获取全量数据 + 重仓分析 - **定向追踪**（"佩洛西最近的交易"）→ 按议员/标的筛选 - **异常猎手**（"有什么异常交易"）→ 异常检测模式 - **深度分析**（"为什么这么多人买 NVDA"）→ 事件关联分析 2. **获取数据**：运行 `scripts/fetch_trades.py` 3. **分析数据**：结合 `references/` 中的知识进行深度解读 4. **生成报告**：按模板输出结构化表格 + 分析解读 ## 数据获取 运行数据抓取脚本获取最新交易记录： ```bash # 基础用法：获取最近30天数据并执行分析 python scripts/fetch_trades.py --days 30 --analyze # 筛选特定议员 python scripts/fetch_trades.py --politician "Pelosi" --analyze # 筛选特定股票 python scripts/fetch_trades.py --ticker NVDA --analyze # 筛选大额交易（>$100K） python scripts/fetch_trades.py --min-amount 100000 --analyze # 仅看参议院 python scripts/fetch_trades.py --chamber senate --analyze # 保存结果到文件 python scripts/fetch_trades.py --analyze --output trades.json python scripts/fetch_trades.py --output trades.csv ``` 脚本输出 JSON 格式，包含： - `trades`：筛选后的交易记录列表 - `concentration`：重仓标的排行（`--analyze` 模式） - `anomalies`：异常交易信号（`--analyze` 模式） - `meta`：查询元数据 **数据源优先级**：Capitol Trades → Quiver Quantitative API → 参议院官方披露 ## 分析流程 ### 重仓标的分析 拿到数据后，对被多位议员买入的标的进行深度分析： 1. 读取 `references/committee_industry_map.md`，查找买入议员所在委员会 2. 判断标的行业是否在委员会管辖范围内（高关联 = 更强信号） 3. 搜索近期相关立法、听证会、监管动态（使用联网搜索） 4. 按 `references/analysis_framework.md` 中的信号强度评估体系打分 5. 生成事件假设和展望 ### 异常交易检测 脚本自动检测三类异常： - 🔴 **大额交易**：单笔 ≥ $500K - 🟡 **密集交易**：同一议员短期内对同一标的交易 ≥ 3 次 - 🔴 **跨党派共识**：两党 ≥ 3 位议员同时买入同一标的 ### 事件关联分析 读取 `references/committee_industry_map.md` 获取委员会-行业映射，结合以下信息源进行关联： - 议员委员会任职信息 - 近期国会立法日程 - 监管机构（FDA/FCC/EPA/SEC）近期动态 - 地缘政治事件 详细分析模板和评估框架见 `references/analysis_framework.md`。 ## 输出要求 每次输出必须包含： 1. **交易总览表格**：议员、标的、买/卖、金额、日期、党派 2. **重仓排行**：被最多议员买入的标的排名 3. **深度分析**：Top 3-5 标的的事件关联解读 4. **异常警报**：检测到的异常交易信号 5. **⚖️ 免责声明**：必须提醒用户数据存在披露延迟（最长45天），分析仅供参考不构成投资建议 完整报告模板见 `references/analysis_framework.md` 的"输出报告结构"章节。 ## 注意事项 - 国会议员交易披露存在 **最长 45 天延迟**，数据并非实时 - Capitol Trades 网站结构可能变化，如抓取失败会自动切换备用数据源 - 交易金额以范围形式披露（如 $1,001-$15,000），非精确数字 - 分析结论是基于公开数据的推测，不代表确定性事件

path: scripts/fetch_trades.py
content: #!/usr/bin/env python3
"""
国会山股神线索追踪 - 数据抓取脚本
从 Capitol Trades 获取美国国会议员的最新股票交易数据。

Capitol Trades 使用 Next.js App Router (RSC) 架构，交易数据嵌入在 HTML 的
React Server Components payload 中，本脚本通过解析 RSC payload 提取结构化数据。

用法：
    python fetch_trades.py [--days N] [--min-amount AMOUNT] [--politician NAME] [--output FILE]

参数：
    --days N           获取最近 N 天的交易记录（默认 90）
    --min-amount       最低交易金额筛选，如 50000（默认不筛选）
    --politician NAME  按议员姓名筛选（模糊匹配）
    --ticker SYMBOL    按股票代码筛选
    --chamber          筛选议院：senate / house（默认全部）
    --tx-type          筛选交易类型：buy / sell（默认全部）
    --output FILE      输出文件路径（默认输出到 stdout，支持 .json / .csv）
    --analyze          执行重仓分析和异常检测
    --pages N          抓取页数（默认 3 页，每页约 12 条）
"""

import argparse
import json
import sys
import re
import csv
import urllib.request
import urllib.parse
from datetime import datetime, timedelta
from io import StringIO


def fetch_page(page=1, page_size=96, sort="-pubDate"):
    """
    从 Capitol Trades 抓取单页交易数据。
    数据嵌入在 Next.js RSC payload 中，解析后返回交易记录列表。
    """
    params = {
        "page": str(page),
        "pageSize": str(page_size),
        "sortBy": sort,
    }
    url = f"https://www.capitoltrades.com/trades?{urllib.parse.urlencode(params)}"

    headers = {
        "User-Agent": (
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
            "AppleWebKit/537.36 (KHTML, like Gecko) "
            "Chrome/120.0.0.0 Safari/537.36"
        ),
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.5",
    }

    req = urllib.request.Request(url, headers=headers)
    try:
        with urllib.request.urlopen(req, timeout=30) as resp:
            html = resp.read().decode("utf-8")
            return parse_rsc_trades(html)
    except Exception as e:
        print(f"⚠️ 抓取第 {page} 页失败: {e}", file=sys.stderr)
        return []


def parse_rsc_trades(html):
    """
    从 Next.js RSC payload 中解析交易数据。

    Capitol Trades 使用 React Server Components，数据以如下格式嵌入 HTML：
    self.__next_f.push([1,"...escaped JSON..."])

    交易记录是 JSON 数组，每条记录包含：
    _txId, _politicianId, chamber, txDate, txType, value,
    issuer{issuerName, issuerTicker, sector},
    politician{firstName, lastName, party}, pubDate, reportingGap 等字段
    """
    # 提取所有 RSC chunks
    chunks = re.findall(r'self\.__next_f\.push\(\[1,"(.*?)"\]\)', html, re.DOTALL)
    if not chunks:
        return []

    # 解码并合并所有 chunks
    full_rsc = ""
    for chunk in chunks:
        try:
            decoded = chunk.encode("utf-8").decode("unicode_escape")
        except (UnicodeDecodeError, ValueError):
            decoded = chunk
        full_rsc += decoded

    # 查找交易数据 - 匹配包含 _txId 的 JSON 数组
    trades = []

    # 方法1：提取完整的交易数组
    # 交易数据通常在 RSC 中以 JSON 数组形式出现
    # 找到所有 _txId 出现的位置，然后向前回溯找到数组起始
    tx_positions = [m.start() for m in re.finditer(r'"_txId"', full_rsc)]

    if not tx_positions:
        return []

    # 从第一个 _txId 向前找到包含它的数组起始
    first_pos = tx_positions[0]
    # 向前搜索 [ 或 { 开始
    array_start = full_rsc.rfind("[", max(0, first_pos - 500), first_pos)

    if array_start == -1:
        # 尝试找单个对象
        array_start = full_rsc.rfind("{", max(0, first_pos - 200), first_pos)

    if array_start == -1:
        return []

    # 从 array_start 开始，找到匹配的闭合括号
    bracket_char = full_rsc[array_start]
    close_char = "]" if bracket_char == "[" else "}"
    depth = 0
    array_end = array_start

    for i in range(array_start, min(len(full_rsc), array_start + 200000)):
        ch = full_rsc[i]
        if ch == bracket_char:
            depth += 1
        elif ch == close_char:
            depth -= 1
            if depth == 0:
                array_end = i + 1
                break

    json_str = full_rsc[array_start:array_end]

    try:
        data = json.loads(json_str)
        if isinstance(data, list):
            trades = data
        elif isinstance(data, dict) and "_txId" in data:
            trades = [data]
    except json.JSONDecodeError:
        # 如果整个数组解析失败，逐条提取
        trades = extract_individual_trades(full_rsc, tx_positions)

    return normalize_trades(trades)


def extract_individual_trades(rsc_text, positions):
    """逐条提取交易记录（当数组解析失败时的备用方案）"""
    trades = []
    for pos in positions:
        # 向前找到 { 开始
        obj_start = rsc_text.rfind("{", max(0, pos - 200), pos)
        if obj_start == -1:
            continue

        # 找到匹配的 } 结束
        depth = 0
        obj_end = obj_start
        for i in range(obj_start, min(len(rsc_text), obj_start + 5000)):
            if rsc_text[i] == "{":
                depth += 1
            elif rsc_text[i] == "}":
                depth -= 1
                if depth == 0:
                    obj_end = i + 1
                    break

        try:
            obj = json.loads(rsc_text[obj_start:obj_end])
            if "_txId" in obj:
                trades.append(obj)
        except json.JSONDecodeError:
            continue

    return trades


def normalize_trades(raw_trades):
    """将原始交易数据标准化为统一格式"""
    normalized = []
    for t in raw_trades:
        if not isinstance(t, dict) or "_txId" not in t:
            continue

        issuer = t.get("issuer", {}) or {}
        politician = t.get("politician", {}) or {}

        # 解析 ticker（格式通常为 "AAPL:US"）
        raw_ticker = issuer.get("issuerTicker", "")
        ticker = raw_ticker.split(":")[0] if raw_ticker else ""

        record = {
            "tx_id": t.get("_txId"),
            "politician": f"{politician.get('firstName', '')} {politician.get('lastName', '')}".strip(),
            "politician_id": t.get("_politicianId", ""),
            "party": politician.get("party", ""),
            "chamber": t.get("chamber", politician.get("chamber", "")),
            "ticker": ticker,
            "issuer_name": issuer.get("issuerName", ""),
            "sector": issuer.get("sector", ""),
            "country": issuer.get("country", ""),
            "tx_type": t.get("txType", ""),
            "tx_date": t.get("txDate", ""),
            "pub_date": t.get("pubDate", ""),
            "reporting_gap_days": t.get("reportingGap", 0),
            "amount": t.get("value", 0),
            "price": t.get("price"),
            "owner": t.get("owner", ""),
            "comment": t.get("comment", ""),
        }
        normalized.append(record)

    return normalized


def filter_trades(trades, days=90, min_amount=0, politician=None,
                  ticker=None, chamber=None, tx_type=None):
    """根据条件筛选交易记录"""
    cutoff_date = (datetime.now() - timedelta(days=days)).strftime("%Y-%m-%d")
    filtered = []

    for trade in trades:
        # 日期筛选
        tx_date = trade.get("tx_date", "")
        if tx_date and tx_date < cutoff_date:
            continue

        # 金额筛选
        if min_amount > 0:
            amount = trade.get("amount", 0) or 0
            if amount < min_amount:
                continue

        # 议员姓名筛选（模糊匹配）
        if politician:
            name = trade.get("politician", "").lower()
            if politician.lower() not in name:
                continue

        # 股票代码筛选
        if ticker:
            if ticker.upper() != trade.get("ticker", "").upper():
                continue

        # 议院筛选
        if chamber:
            if chamber.lower() != trade.get("chamber", "").lower():
                continue

        # 交易类型筛选
        if tx_type:
            if tx_type.lower() != trade.get("tx_type", "").lower():
                continue

        filtered.append(trade)

    return filtered


def analyze_concentration(trades):
    """
    分析重仓标的：找出被多位议员集中买入的股票
    返回按买入议员数降序排列的标的列表
    """
    ticker_stats = {}

    for trade in trades:
        ticker = trade.get("ticker", "").strip()
        tx_type = trade.get("tx_type", "").lower()
        if not ticker or tx_type != "buy":
            continue

        if ticker not in ticker_stats:
            ticker_stats[ticker] = {
                "ticker": ticker,
                "issuer_name": trade.get("issuer_name", ""),
                "sector": trade.get("sector", ""),
                "buy_count": 0,
                "politicians": set(),
                "total_amount": 0,
                "latest_date": "",
                "parties": set(),
                "chambers": set(),
            }

        stats = ticker_stats[ticker]
        stats["buy_count"] += 1
        stats["politicians"].add(trade.get("politician", ""))
        stats["parties"].add(trade.get("party", ""))
        stats["chambers"].add(trade.get("chamber", ""))
        stats["total_amount"] += trade.get("amount", 0) or 0

        tx_date = trade.get("tx_date", "")
        if tx_date > stats["latest_date"]:
            stats["latest_date"] = tx_date

    # 转换 set 为 list
    result = []
    for ticker, stats in ticker_stats.items():
        stats["politicians"] = sorted(list(stats["politicians"]))
        stats["politician_count"] = len(stats["politicians"])
        stats["parties"] = sorted(list(stats["parties"]))
        stats["chambers"] = sorted(list(stats["chambers"]))
        result.append(stats)

    result.sort(key=lambda x: (x["politician_count"], x["buy_count"]), reverse=True)
    return result


def detect_anomalies(trades):
    """
    检测异常交易模式：
    1. 大额交易（>= $500,000）
    2. 密集交易（同一议员短期内多次交易同一标的）
    3. 跨党派共识（两党议员同时买入同一标的）
    4. 超短披露延迟（可能暗示紧迫性）
    """
    anomalies = []

    # 1. 大额交易
    for trade in trades:
        amount = trade.get("amount", 0) or 0
        if amount >= 500000:
            asset = trade["ticker"] or trade.get("issuer_name", "未知标的")
            anomalies.append({
                "type": "大额交易",
                "severity": "high",
                "description": (
                    f"{trade['politician']} ({trade['party']}) "
                    f"{'买入' if trade['tx_type'] == 'buy' else '卖出'} "
                    f"{asset} 金额 ${amount:,.0f}"
                ),
                "trade": trade,
            })

    # 2. 密集交易
    pol_ticker = {}
    for trade in trades:
        key = (trade.get("politician", ""), trade.get("ticker", ""))
        if key[0] and key[1]:
            pol_ticker.setdefault(key, []).append(trade)

    for (politician, ticker), trade_list in pol_ticker.items():
        if len(trade_list) >= 3:
            anomalies.append({
                "type": "密集交易",
                "severity": "medium",
                "description": (
                    f"{politician} 近期对 {ticker} "
                    f"进行了 {len(trade_list)} 次交易"
                ),
                "trade_count": len(trade_list),
            })

    # 3. 跨党派共识
    ticker_parties = {}
    for trade in trades:
        ticker = trade.get("ticker", "")
        if trade.get("tx_type", "").lower() == "buy" and ticker:
            if ticker not in ticker_parties:
                ticker_parties[ticker] = {"parties": set(), "politicians": set()}
            ticker_parties[ticker]["parties"].add(trade.get("party", ""))
            ticker_parties[ticker]["politicians"].add(trade.get("politician", ""))

    for ticker, info in ticker_parties.items():
        if len(info["parties"]) >= 2 and len(info["politicians"]) >= 3:
            anomalies.append({
                "type": "跨党派共识",
                "severity": "high",
                "description": (
                    f"{ticker} 被来自 {', '.join(info['parties'])} "
                    f"的 {len(info['politicians'])} 位议员买入"
                ),
                "politicians": sorted(list(info["politicians"])),
            })

    # 4. 极短披露延迟（<= 3天，可能暗示紧迫性或大额交易）
    for trade in trades:
        gap = trade.get("reporting_gap_days", 99)
        if gap is not None and gap <= 3 and trade.get("amount", 0) and trade["amount"] >= 50000:
            anomalies.append({
                "type": "极短披露延迟",
                "severity": "low",
                "description": (
                    f"{trade['politician']} 交易 {trade['ticker']} 后 "
                    f"仅 {gap} 天即披露（金额 ${trade['amount']:,.0f}）"
                ),
                "trade": trade,
            })

    return anomalies


def output_csv(trades, filepath):
    """将交易数据输出为 CSV"""
    fields = [
        "politician", "party", "chamber", "ticker", "issuer_name",
        "sector", "tx_type", "tx_date", "pub_date",
        "reporting_gap_days", "amount", "price", "owner", "comment",
    ]
    with open(filepath, "w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=fields, extrasaction="ignore")
        writer.writeheader()
        for trade in trades:
            writer.writerow(trade)
    print(f"✅ CSV 已保存至 {filepath}", file=sys.stderr)


def output_json(data, filepath=None):
    """将数据输出为 JSON"""
    output = json.dumps(data, ensure_ascii=False, indent=2, default=str)
    if filepath:
        with open(filepath, "w", encoding="utf-8") as f:
            f.write(output)
        print(f"✅ JSON 已保存至 {filepath}", file=sys.stderr)
    else:
        print(output)


def main():
    parser = argparse.ArgumentParser(
        description="国会山股神线索追踪 - 获取美国国会议员股票交易数据"
    )
    parser.add_argument("--days", type=int, default=90,
                        help="获取最近 N 天的交易记录（默认 90）")
    parser.add_argument("--min-amount", type=int, default=0,
                        help="最低交易金额筛选")
    parser.add_argument("--politician", type=str, default=None,
                        help="按议员姓名筛选（模糊匹配）")
    parser.add_argument("--ticker", type=str, default=None,
                        help="按股票代码筛选")
    parser.add_argument("--chamber", type=str, default=None,
                        choices=["senate", "house"],
                        help="筛选议院")
    parser.add_argument("--tx-type", type=str, default=None,
                        choices=["buy", "sell"],
                        help="筛选交易类型")
    parser.add_argument("--output", type=str, default=None,
                        help="输出文件路径（支持 .json / .csv）")
    parser.add_argument("--analyze", action="store_true",
                        help="执行重仓分析和异常检测")
    parser.add_argument("--pages", type=int, default=3,
                        help="抓取页数（默认 3）")

    args = parser.parse_args()

    print("🏛️ 正在获取国会议员交易数据...", file=sys.stderr)

    all_trades = []
    for page in range(1, args.pages + 1):
        print(f"   📄 正在抓取第 {page}/{args.pages} 页...", file=sys.stderr)
        trades = fetch_page(page=page)
        if trades:
            all_trades.extend(trades)
            print(f"      获取 {len(trades)} 条记录", file=sys.stderr)
        else:
            print(f"      第 {page} 页无数据或抓取失败", file=sys.stderr)
            if page == 1:
                print("   ⚠️ 首页即失败，请检查网络连接", file=sys.stderr)
                break

    if not all_trades:
        print("❌ 未能获取到任何交易数据。", file=sys.stderr)
        sys.exit(1)

    print(f"   ✅ 共获取 {len(all_trades)} 条原始记录", file=sys.stderr)

    # 去重（按 tx_id）
    seen_ids = set()
    unique_trades = []
    for t in all_trades:
        tid = t.get("tx_id")
        if tid and tid not in seen_ids:
            seen_ids.add(tid)
            unique_trades.append(t)
    all_trades = unique_trades
    print(f"   🔄 去重后 {len(all_trades)} 条记录", file=sys.stderr)

    # 筛选
    filtered = filter_trades(
        all_trades,
        days=args.days,
        min_amount=args.min_amount,
        politician=args.politician,
        ticker=args.ticker,
        chamber=args.chamber,
        tx_type=args.tx_type,
    )
    print(f"   🔍 筛选后 {len(filtered)} 条记录", file=sys.stderr)

    # 构建输出
    result = {
        "trades": filtered,
        "meta": {
            "fetched_at": datetime.now().isoformat(),
            "total_raw": len(all_trades),
            "total_filtered": len(filtered),
            "filters": {
                "days": args.days,
                "min_amount": args.min_amount,
                "politician": args.politician,
                "ticker": args.ticker,
                "chamber": args.chamber,
                "tx_type": args.tx_type,
            },
        },
    }

    # 分析模式
    if args.analyze:
        print("   📊 正在执行重仓分析...", file=sys.stderr)
        result["concentration"] = analyze_concentration(filtered)
        print("   🔎 正在检测异常交易...", file=sys.stderr)
        result["anomalies"] = detect_anomalies(filtered)
        print(
            f"   ✅ 发现 {len(result['concentration'])} 个被买入标的，"
            f"{len(result['anomalies'])} 条异常信号",
            file=sys.stderr,
        )

    # 输出
    if args.output:
        if args.output.endswith(".csv"):
            output_csv(filtered, args.output)
        else:
            output_json(result, args.output)
    else:
        output_json(result)


if __name__ == "__main__":
    main()


path: references/analysis_framework.md
content: # 国会交易分析框架

## 分析维度

### 1. 交易信号强度评估

按以下维度评估每笔交易的信号强度（1-5分）：

| 维度 | 1分（弱） | 3分（中） | 5分（强） |
|------|---------|---------|---------|
| 金额规模 | < $15K | $50K-$250K | > $500K |
| 议员数量 | 单人交易 | 2-3人同标的 | 4人以上同标的 |
| 委员会相关性 | 无直接关联 | 间接关联 | 直接管辖行业 |
| 时间集中度 | 分散 | 2周内 | 1周内密集 |
| 跨党派程度 | 单一党派 | - | 两党共同买入 |

**综合信号强度** = 各维度平均分
- ⚡ 强信号（≥4）：高度关注，可能有重大政策/事件催化
- 🔔 中信号（2.5-4）：值得跟踪，需结合其他信息判断
- 💤 弱信号（<2.5）：常规交易，参考价值有限

### 2. 事件关联分析流程

```
交易数据 → 识别标的 → 查找议员委员会 → 匹配行业关联
    ↓
近期立法/监管动态 → 时间线比对 → 判断是否存在信息优势
    ↓
生成事件假设 → 评估概率 → 输出分析报告
```

**关键问题清单：**
1. 该议员属于哪个委员会？该委员会近期有何动态？
2. 交易标的所属行业是否在该委员会管辖范围内？
3. 近期是否有相关法案/听证会/监管决定？
4. 是否有其他议员做出类似交易？
5. 交易时机是否与特定事件存在可疑的时间关联？

### 3. 重仓标的分析模板

对每个被多位议员买入的标的，按以下结构分析：

```
## [标的代码] - [公司名称]

### 交易概况
- 买入议员数：X 位
- 总金额范围：$XX - $XX
- 时间跨度：YYYY-MM-DD 至 YYYY-MM-DD
- 党派分布：共和党 X 位 / 民主党 X 位

### 议员-委员会关联
| 议员 | 党派 | 委员会 | 与标的行业关联度 |
|------|------|--------|----------------|
| ... | ... | ... | 高/中/低 |

### 可能的事件催化剂
1. [事件假设1]：概率 高/中/低，理由：...
2. [事件假设2]：概率 高/中/低，理由：...

### 风险提示
- ...
```

### 4. 异常交易分析模板

```
## ⚠️ 异常交易警报

### 异常类型：[大额交易/密集交易/跨党派共识]
### 严重程度：🔴高 / 🟡中 / 🟢低

**交易详情：**
- 议员：...
- 标的：...
- 金额：...
- 日期：...

**异常原因：**
[解释为何该交易被标记为异常]

**可能解读：**
1. [解读1]
2. [解读2]

**建议关注：**
- [后续需关注的事件/时间节点]
```

## 输出报告结构

### 完整报告模板

```markdown
# 🏛️ 国会山股神线索追踪报告

> 📅 报告日期：YYYY-MM-DD
> 📊 数据范围：最近 N 天
> 🔢 分析交易数：X 笔

---

## 📋 一、交易总览

| 议员 | 标的 | 买/卖 | 金额范围 | 交易日期 | 披露日期 | 党派 |
|------|------|-------|---------|---------|---------|------|
| ... | ... | ... | ... | ... | ... | ... |

---

## 🎯 二、重仓标的排行

| 排名 | 标的 | 买入议员数 | 总金额范围 | 信号强度 |
|------|------|----------|-----------|---------|
| 1 | ... | ... | ... | ⚡/🔔/💤 |

---

## 🔍 三、重点标的深度分析

[对 Top 3-5 重仓标的逐一分析，使用"重仓标的分析模板"]

---

## ⚠️ 四、异常交易警报

[列出检测到的异常交易，使用"异常交易分析模板"]

---

## 📰 五、事件关联与展望

### 近期关键政策/事件时间线
| 日期 | 事件 | 关联标的 | 潜在影响 |
|------|------|---------|---------|
| ... | ... | ... | ... |

### 未来关注点
1. [待关注事件1]
2. [待关注事件2]

---

## ⚖️ 免责声明

本报告基于公开披露数据分析，仅供参考和研究用途。
- 国会议员的交易披露存在时间延迟（最长45天）
- 交易行为不一定反映内幕信息，可能基于公开信息或个人判断
- 本分析不构成任何投资建议
- 过往交易模式不代表未来表现
```

## 免责声明要求

**每次输出必须包含免责声明**，提醒用户：
1. 数据存在披露延迟
2. 分析仅供参考，不构成投资建议
3. 议员交易可能基于公开信息


path: references/committee_industry_map.md
content: # 国会委员会与行业关联映射

本文件记录美国国会主要委员会及其对应的行业影响范围，用于分析议员交易背后的政策线索。

## 参议院委员会

| 委员会 | 关联行业/板块 | 典型标的示例 |
|--------|-------------|------------|
| Armed Services（军事） | 国防、军工、航空航天 | LMT, RTX, NOC, GD, BA |
| Banking（银行） | 银行、金融、加密货币、房地产 | JPM, BAC, GS, COIN |
| Commerce, Science（商务科技） | 科技、电信、交通、消费 | AAPL, GOOGL, AMZN, TSLA |
| Energy & Natural Resources（能源） | 石油、天然气、可再生能源、矿业 | XOM, CVX, NEE, FSLR |
| Environment & Public Works（环境） | 环保、基建、建筑 | WM, CAT, VMC |
| Finance（财政） | 税收政策影响所有行业、医疗保险 | 广泛影响 |
| Foreign Relations（外交） | 国际贸易、国防、新兴市场 | 受制裁/关税影响的公司 |
| Health（健康） | 医药、生物科技、医疗器械、保险 | PFE, JNJ, UNH, MRNA |
| Judiciary（司法） | 科技（反垄断）、枪支、移民相关 | META, GOOGL, AAPL |
| Intelligence（情报） | 网络安全、国防科技、监控 | PANW, CRWD, PLTR |

## 众议院委员会

| 委员会 | 关联行业/板块 | 典型标的示例 |
|--------|-------------|------------|
| Ways and Means（筹款） | 税收政策、贸易、社保 | 广泛影响 |
| Financial Services（金融服务） | 银行、保险、证券、加密 | JPM, BRK, COIN |
| Energy and Commerce（能源商务） | 能源、医疗、科技、电信 | XOM, PFE, AAPL |
| Armed Services（军事） | 国防、军工 | LMT, RTX, NOC |
| Judiciary（司法） | 科技反垄断、知识产权 | META, GOOGL, MSFT |
| Science, Space（科学太空） | 航天、AI、量子计算 | RKLB, IONQ |
| Agriculture（农业） | 农业、食品、商品期货 | ADM, DE, MOS |
| Transportation（交通） | 航空、铁路、航运、基建 | UAL, DAL, UNP |

## 关键政策事件类型

### 立法相关
- **法案提出/投票**：直接影响相关行业
- **听证会**：可能预示监管方向变化
- **委员会报告**：揭示政策倾向

### 监管相关
- **FDA 审批**：影响医药/生物科技
- **FCC 政策**：影响电信/科技
- **EPA 法规**：影响能源/环保
- **SEC 规则**：影响金融/加密

### 地缘政治
- **贸易协定/制裁**：影响国际业务公司
- **军事行动/预算**：影响国防板块
- **外交政策变化**：影响特定国家相关业务

### 财政/货币政策
- **预算案**：广泛市场影响
- **债务上限**：系统性风险
- **税改**：行业差异化影响


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)