recipes.fundamental.disclosure.sec8kMaterialEvents Recipes Recipe curated

SEC 8-K material event burst (30 day 윈도우 카운트)

미국 8-K material event filing 의 30 일 윈도우 카운트 + Item 분류 분포. ≥ 5 건 또는 Item 5.02 (임원 변동) ≥ 2 건 = *전환점 burst* 후보. EDGAR raw. 트리거 — 'SEC 8-K material event burst (30 day 윈도우 카운트)', 'sec 8 k material events', 'sec8kMaterialEvents'.

이 스킬

SEC 8-K material event burst (30 day 윈도우 카운트)

미국 8-K material event filing 의 30 일 윈도우 카운트 + Item 분류 분포. ≥ 5 건 또는 Item 5.02 (임원 변동) ≥ 2 건 = *전환점 burst* 후보. EDGAR raw. 트리거 — 'SEC 8-K material event burst (30 day 윈도우 카운트)', 'sec 8 k material events', 'sec8kMaterialEvents'.

Recipes curated recipes.fundamental.disclosure.sec8kMaterialEvents

연계 절차

이 절차의 단계

  1. 1
    recipes.fundamental.disclosure.event recipes.fundamental.disclosure.event

    사건 inbox 와 결합.

  2. 2
    임원 보수·스톡옵션·성과급 진단 recipes.fundamental.quality.forensics.executiveCompensationAudit

    임원 변동 + 보상 변화.

절차

실행 순서

  1. 1

    EDGAR provider fetch8kFilings(ticker, days=60) — 직전 60일 8-K filing

  2. 2

    각 filing 의 filingDate + item (SEC Item code) + title

  3. 3

    30일 sliding window cluster 검출

  4. 4

    Item 5.02 (임원/이사 변동) 카운트 (별도 임계)

  5. 5

    8-K filing < 3 → burst 결론 X.

  6. 6

    Item 8.01 만 burst 처리 시 false positive (routine disclosure 다수).

  7. 7

    60일 window 너무 길면 다른 catalyst 와 overlap.

  8. 8

    미국 한정 — KR 공시 (분기보고서 + 임원 변동) 별도 recipe 필요.

  9. 9

    filingCount ≥ 5 + 가격 변동 → `recipes.fundamental.disclosure.eventRadar.priceFlowReaction` 으로 시장 반응 정량화.

  10. 10

    execEvents ≥ 2 → `recipes.fundamental.quality.forensics.executiveCompensationAudit` 으로 임원 보상 변화 cross-check.

  11. 11

    1.01 신규계약 burst → `recipes.news.eventTimelineFusion` 으로 deal cluster 분류.

  12. 12

    8-K < 3 이면 burst 결론 X.

예시

이런 질문이 들어오면 이 skill 을 쓴다

  • AAPL 8-K 30일 안 burst 카운트
  • SEC material event 폭증 종목
  • Item 5.02 임원 변동 cluster

출력

기대 결과

  • 30d 안 8-K 총 건수 + Item 분류 분포
  • Item 5.02 (임원 변동) 카운트
  • burst 라벨 (≥ 5 건 OR Item 5.02 ≥ 2 = 전환점 후보)

공개 호출 방식

import dartlab
import polars as pl
from collections import Counter
from datetime import datetime, timedelta

ticker = "AAPL"

try:
    filings = dartlab.Company(ticker).filings()
except Exception:
    filings = []

def parseDate(v):
    if isinstance(v, datetime): return v.date()
    s = str(v)[:10].replace(".","-")
    try: return datetime.strptime(s, "%Y-%m-%d").date()
    except: return None

events = []
for f in filings:
    d = parseDate(f.get("filingDate"))
    item = (f.get("item") or "").strip()
    if d:
        events.append({"date": d, "item": item, "title": (f.get("title") or "")[:60]})
events.sort(key=lambda e: e["date"])

# 30 day window count
WINDOW = timedelta(days=30)
clusters = []
for e in events:
    start = e["date"] - WINDOW
    same_window = [x for x in events if start <= x["date"] <= e["date"]]
    if len(same_window) >= 5:
        item_counts = Counter(x["item"] for x in same_window)
        clusters.append({
            "windowEnd": str(e["date"]),
            "filingCount": len(same_window),
            "items": dict(item_counts),
            "execEvents": item_counts.get("5.02", 0),
        })
        break  # first cluster

if not clusters:
    item_counts = Counter(e["item"] for e in events)
    clusters = [{
        "windowEnd": str(events[-1]["date"]) if events else None,
        "filingCount": len(events),
        "items": dict(item_counts),
        "execEvents": item_counts.get("5.02", 0),
    }] if events else []

table = pl.DataFrame(clusters) if clusters else pl.DataFrame(
    schema={"windowEnd": pl.Utf8, "filingCount": pl.Int64, "items": pl.Object, "execEvents": pl.Int64}
)

emit_result(
    table=table,
    values={"latestCount": clusters[-1]["filingCount"] if clusters else 0,
            "execEvents": clusters[-1]["execEvents"] if clusters else 0},
    date=clusters[-1]["windowEnd"] if clusters else None,
    sources=["dartlab://edgar/8k"],
)

호출 동작

1. 결론 도출

filingCount + execEvents burst 단정. 예: “AAPL 직전 60일 8-K 12건 → 30일 윈도우 안 7건 cluster (≥ 5 임계 통과) — Item 분포: 1.01 신규계약 2 + 2.02 실적 1 + 5.02 임원변동 3 (≥ 2 임계 통과) + 8.01 기타 1 → 양 임계 동시 통과 — 전환점 burst phase (임원 cluster + 계약 동행).”

2. 핵심 근거 수집

  • EDGAR provider fetch8kFilings(ticker, days=60) — 직전 60일 8-K filing
  • 각 filing 의 filingDate + item (SEC Item code) + title
  • 30일 sliding window cluster 검출
  • Item 5.02 (임원/이사 변동) 카운트 (별도 임계)

3. 메커니즘 분석

60일 8-K 시계열 → 30일 window cluster
   각 시점 → 직전 30일 안 filing 수 카운트
   ≥ 5 건 → burst 후보

Item 분류 분포 (SEC Item code):
   1.01 신규/만료계약   → 사업 변경
   2.01 자산 취득/매각  → 구조조정
   2.02 실적 release    → 정기 (burst 제외)
   5.02 임원/이사 변동  → 거버넌스 변경 (≥ 2 = 별도 임계)
   5.07 의결 결과       → 주주 의결
   8.01 기타            → 의무 공시 (큰 의미 약)

burst 판정 (OR):
   filingCount ≥ 5         → 양적 burst
   execEvents ≥ 2          → 임원 cluster (질적 burst)
   둘 다                    → 강한 전환점 후보

정기성 분리:
   8.01 정기 disclosure 만으로 burst → false positive (제외 필요)
   비정기 Item (5.02 / 2.01 / 1.01) 중심 burst → 진성 신호

8-K burst 자체 = recession 단정 X — 정량 사실 표기. 회사 단위 전환점 후보 표지. 정기 (Item 8.01 routine disclosure) 가중치 낮춰야 false positive 방지.

4. 반례·한계

  • 8-K filing < 3 → burst 결론 X.
  • Item 8.01 만 burst 처리 시 false positive (routine disclosure 다수).
  • 60일 window 너무 길면 다른 catalyst 와 overlap.
  • 미국 한정 — KR 공시 (분기보고서 + 임원 변동) 별도 recipe 필요.

5. 후속 모니터링

  • filingCount ≥ 5 + 가격 변동 → recipes.fundamental.disclosure.eventRadar.priceFlowReaction 으로 시장 반응 정량화.
  • execEvents ≥ 2 → recipes.fundamental.quality.forensics.executiveCompensationAudit 으로 임원 보상 변화 cross-check.
  • 1.01 신규계약 burst → recipes.news.eventTimelineFusion 으로 deal cluster 분류.

대표 반환 형태

column의미
windowEndwindow 끝 일자
filingCount30 일 안 8-K 수
itemsItem 분류 dict
execEventsItem 5.02 (임원변동) 카운트

연계 절차

  1. recipes.fundamental.disclosure.event - 사건 inbox 와 결합.
  2. recipes.fundamental.quality.forensics.executiveCompensationAudit - 임원 변동 + 보상 변화.

기본 검증

  • 8-K < 3 이면 burst 결론 X.
  • Item 8.01 정기성만 burst 처리하지 않도록 Item 별 가중치.
  • burst = recession 단정 X — 정량 사실 표기.

런타임

실행 환경별 호환성

환경상태비고 / 제한
Local Python supported·
Server supported·
MCP supported·
Web AI limited·
Pyodide limited·