carbon-evolution/horus
GitHub: carbon-evolution/horus
HORUS 将 20 多个免费公开数据源融合为一个多行业供应链风险情报仪表板,帮助用户评估半导体、AI 和电池产业的公司与原材料供应链风险。
Stars: 0 | Forks: 0
# ⬡ HORUS — 供应链风险情报
一个**供应链风险情报平台**,它将 20 多个免费和开放的数据源(SEC 文件、联合国贸易数据、威胁情报、专利数据、地缘政治风险和金融市场)融合到一个针对半导体、AI 和电池产业的风险评分仪表板中。






## 📖 概述
HORUS 将供应链风险分析从静态电子表格转化为一个**交互式情报指挥中心**。它从 20 多个免费/公共 API(SEC EDGAR、UN Comtrade、Yahoo Finance、GDELT、NIST NVD、Wikidata 等)摄取数据,存入统一的 Postgres 存储中,通过 Redis 缓存层提供服务,并在多行业的 Next.js 仪表板上进行渲染。
HORUS 基于 **Next.js 16 (App Router)**、**React 19**、**Postgres 17** 和 **Redis** 构建,涵盖三个行业(半导体、AI、电池),每个行业包含 20 家被追踪的公司、1,000 多个设施、实时新闻丰富化以及派生的风险评分。
### 是什么让 HORUS 与众不同?
- **🔓 零 API 密钥依赖** — 每个数据源要么无需密钥即可工作,要么在缺失时优雅降级
- **🏭 多行业聚焦** — 涵盖半导体、AI 和电池行业,具备针对各行业的数据模型、KPI 和风险概况
- **🧩 ETL 优先架构** — 20 个独立的 Python 源模块,每个均可独立执行,为一个单一读取模型表提供数据
- **⚡ Redis 读取穿透** — 所有前端数据都经过具有 24 小时 TTL 的 Redis 缓存层 — 实现亚毫秒级读取,零数据库压力
- **🛡️ 故障软化流水线** — 每个 ETL 源都有独立的错误处理;失败的抓取器会保留最后已知的有效数据
- **🔍 跨面板联动** — 点击任意公司即可同时过滤所有仪表板面板
- **🏗️ 种子数据优先设计** — 在真实抓取器运行前加载精选的夹具数据;UI 永不空白
## 📸 截图
### 指挥仪表板
| 风险与市场概览 | 原材料流向 (Sankey) |
|---|---|
|  |  |
*左图 — 半导体仪表板:七个 KPI 磁贴(公司、供应商、设施、材料、国家、政策更新、影响市场的新闻),一个 8 轴**综合风险雷达**(中等 · 61/100),一个 **Top-10 市场快照**(市值、价格、24小时/年初至今 %),一个**市场影响新闻流**,以及底部的**全球制造足迹**地图。右图 — 仪表板的**“原材料流动” Sankey 图**:原产国 → 材料(光刻胶、镓、稀土、氖气等) → 目的地,并带有特定材料的依赖性说明(例如,日本控制了 89% 的被追踪光刻胶)。*
### 多行业建模
| AI 行业 — 供应流 | 电池行业 — 材料贸易 |
|---|---|
|  |  |
*相同的模型针对每个行业重新实例化。**AI**(左图):HBM 内存、CoWoS 封装、GPU、ABF 基板、电网电力 — 包含最近的交易、按支出排名的顶级供应商以及研发/专利表。**电池**(右图):锂、钴、镍、石墨、锰流,带有来源集中度警告(例如,印度尼西亚控制了 88% 的被追踪镍)。*
### 供应链分析
| 原材料供应风险矩阵 | 3D 依赖图 |
|---|---|
|  |  |
| 供应商 → 输入 → 买家采购流 |
|---|
|  |
***原材料**页面(左上)在可排序的比较表旁边绘制了每种材料的供应风险矩阵(采购集中度 × 战略重要性 × 供应风险)。**供应链地图**(右上)是一个交互式的 **3D 依赖力导向图** — 点击节点(图中所示为 TSMC)即可聚焦它,并追踪按风险着色的供应商→买方边。**贸易与发货**(底部)渲染了供应商→输入→买方的采购流,并配有货运通道关税/风险表。*
### 风险与合规
| 比较风险雷达 | 地缘政治 — 政治动荡 |
|---|---|
|  |  |
| 海上咽喉要道 | 财务风险排名 |
|---|---|
|  |  |
***风险雷达**(左上)将任何公司的 8 轴概况叠加在行业基准上,下方是针对每家公司的**风险登记册**。**地缘政治风险**提供了两个视角:**政治动荡**(右上)— 根据紧张局势对生产国进行评分,并带有指向受影响的材料和公司的级联弧线;以及**海上咽喉要道**(左下)— 动画化的海上航线穿过霍尔木兹、马六甲、台湾海峡等,并配有每个咽喉要道的贸易风险敞口条。**财务**页面(右下)根据财务风险评分对所有被追踪的公司进行排名,并附带收入/利润率/研发/资本支出等关键比率表。*
## ✨ 功能
### 🏢 多行业仪表板
位于 `/semiconductor`、`/ai` 和 `/battery` 下的三个独立建模的行业:
- **每个行业 20 家被追踪的公司** — 带有 CIK/QID 标识符的精选实体列表
- **8 轴风险雷达** — 地缘政治、供应商集中度、财务、运营、监管、ESG、原材料、物流
- **行业专属 KPI** 和基于 GDELT 的警报
- **财务快照** — 所有被追踪公司的收入、利润、研发和资本支出
### 🗺️ 交互式风险地图
自定义**内联 SVG 世界地图**(等距圆柱投影上简化的 Natural Earth 陆地 — 无需依赖地图瓦片),具备:
- **1,000+ 设施** — 晶圆厂/研发/总部/供应商位置,带有状态和类型标记
- **供应链可视化** — 交互式 3D 依赖图(`react-force-graph-3d` / three.js)和自定义 SVG **Sankey** 流程图
- **地理空间风险** — 国家层面的紧张局势评分和动态海上咽喉要道
### 📡 ETL 数据流水线(20+ 数据源)
| 来源 | 提供的数据 | 认证 |
|--------|--------------|------|
| **Yahoo Finance** | 报价、市值、TTM 财务数据、研发 | ❌ |
| **SEC EDGAR** | 8-K/10-K/10-Q 文件 → 警报 | ❌ |
| **UN Comtrade (WITS)** | 双边贸易流 → 采购份额 | ❌ |
| **GDELT 2.0** | 全球新闻事件、基调、冲突信号 | ❌ |
| **NIST NVD** | 行业供应商的 CVE (CVSS ≥7) | ❌ |
| **US Federal Register** | 出口管制 / 实体清单 / CHIPS 规则 | ❌ |
| **Wikidata** | 公司元数据(CEO、总部、成立时间) | ❌ |
| **PatentsView** | 美国专利申请 + 转让 | 可选免费密钥 |
| **Korea DART** | 韩国监管文件(Samsung、SK hynix) | 可选免费密钥 |
此外还有在获取的数据之上运行的派生/丰富化模块(风险登记册、综合评分、KPI 派生、供应商/材料/设施情报)。一些材料和贸易数据是**精选的行业估计值**(参考 USGS / Statista),而非实时馈送。
### 🧠 派生情报层
- **公司风险登记册** — 严重程度、概率、财务影响、建议行动
- **综合评分** — 六个实际子分数(地缘政治、供应商依赖、网络安全、财务、ESG、客户依赖)的加权 0–100 混合 → A–F 等级 + 趋势。供应商*和*客户依赖度是根据供应商图计算的;每个子分数都记录了它使用的输入
- **实时市场快照** — 行业市值、24小时广度、年初至今平均值、市值集中度和涨跌幅最大者,源自真实的公司报价(显示在 Market Intelligence 上)
- **高管摘要** — 根据结构化分数/风险确定性生成的各公司简报(单一 `generate()` 接缝,随时可替换为 LLM 调用)
- **派生 KPI** — 将真实计数修补到预设的 KPI 卡片中
- **比较雷达** — 每个被追踪公司的各轴风险概况
### 🔍 供应链分析
- **供应商网络** — 具有支出和风险的 tier-1/2 级边缘
- **原材料** — 18 种被追踪的材料,包含国家集中度、价格、供应风险
- **贸易通道** — 带有关税和风险评估的原产地/目的地追踪
- **设施情报** — 具有物流和灾害风险的各站点运营风险
- **Sankey 图** — 材料流可视化
### 🎛️ 交互式控制
- **多行业选择器** — 切换行业时保留子路径
- **全局搜索** — 涵盖公司、材料、贸易通道、咽喉要道
- **跨面板联动** — 点击任意公司即可同时过滤所有面板
- **关注列表** — 置顶公司(持久化到 localStorage)
- **数据源健康状态** — 侧边栏中显示各数据源的实时状态
## 🗄️ 架构
### 数据流
```
External APIs → etl/sources/*.py → real_loader.upsert_datasets()
│
industry_dataset (Postgres, JSONB)
│
warm.py → Redis cache
│
provider.ts → db.ts (readDataset)
│
Next.js Server Components
│
React Client Components
```
### 后端 (ETL)
```
etl/
├── config.py # DB connections, env vars
├── migrate.py # Idempotent SQL migrations
├── entities.py # Seed YAML → company table sync
├── seed_loader.py # Fixture JSON loader
├── real_loader.py # upsert_datasets() — single write gate
├── warm.py # Postgres → Redis cache copy
├── flows.py # Prefect orchestration
├── run_source.py # Single-source CLI runner
├── ai/summary.py # deterministic exec summaries (LLM-swappable seam)
├── migrations/001_init.sql
├── seeds/ # semiconductor.yaml, ai.yaml, battery.yaml
├── sources/ # 20+ data source modules
│ ├── yahoo.py · yahoo_facts.py # Market data + financials
│ ├── sec.py · sec_facts.py # EDGAR filings
│ ├── comtrade.py # UN trade flows
│ ├── gdelt.py # Global news
│ ├── nvd.py · cyber.py # CVE + threat intel
│ ├── wikidata.py # Company metadata
│ ├── opendart.py # Korean disclosures
│ ├── fedreg.py # Federal Register
│ ├── risks.py · scores.py · summary.py # Derived layers
│ ├── derive.py # derived datasets: KPIs, compare radar, market snapshot, material flows
│ ├── supplier_intel.py · materials_intel.py · facility_intel.py
│ └── ... # holdings, news_enrich, etc.
└── cache/ # API response cache (gitignored)
```
### 前端 (Next.js 16)
```
src/
├── app/
│ ├── layout.tsx # Root layout
│ ├── [industry]/ # Dynamic industry routes
│ │ ├── layout.tsx # Industry validation + AppShell
│ │ ├── page.tsx # Dashboard
│ │ ├── companies/{id,financials,news,deals,patents,explorer}
│ │ ├── supply-chain/{suppliers,materials,facilities,map,trade}
│ │ ├── risk/{radar,policies,esg,geopolitical}
│ │ ├── analytics/{market,reports,sources}
│ │ └── monitoring/{alerts,watchlist}
│ └── api/search/route.ts # Global search
├── components/
│ ├── layout/ (AppShell, Sidebar, TopBar)
│ ├── dashboard/(KpiRow, MarketSnapshot, RiskRadar, NewsFeed, …)
│ ├── companies/(CompanyProfile,CompanyExplorer,Financials, …)
│ ├── supply/ (SupplyChainMap, FacilitiesView, TradeView, …)
│ ├── risk/ (GeoRiskView, EsgView, RiskRadarCompare, …)
│ ├── analytics/(MarketIntelView, SourcesView, ReportsView)
│ ├── monitoring/(AlertsView, WatchlistView)
│ └── ui/ (Panel, DataTable, RiskBadge, StatTile)
└── lib/
├── db.ts # Redis read-through (readDataset)
├── provider.ts # 39 typed data accessors
├── data*.ts # data.ts, data-supply.ts, data-risk.ts, data-analytics.ts (domain accessors)
├── types.ts # All TypeScript types
├── store.ts # Zustand (focusCompany, watchlist)
├── focus.ts # Cross-panel focus helper
├── nav.ts # Sidebar navigation tree
└── industry-context.tsx # React Context
```
### 数据库 Schema
```
-- Entity resolution
create table company (
id text primary key, industry text not null,
name text not null, ticker text,
cik text, wikidata_qid text
);
-- Single read-model table
create table industry_dataset (
industry text not null, dataset text not null,
payload jsonb not null,
updated_at timestamptz not null default now(),
primary key (industry, dataset)
);
```
## 🚀 快速开始
### 前置条件
**Node.js ≥ 20 · Docker · Python ≥ 3.12**
```
# 克隆
git clone https://github.com/carbon-evolution/horus.git
cd horus
# 安装 frontend deps
npm install
# 配置
cp .env.example .env.local # edit with your keys (all optional)
# 启动 Postgres + Redis
docker compose up -d
# 设置 ETL
cd etl && python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# 导入 seed data
make ingest
# 启动 dashboard
cd .. && npm run dev
# → http://localhost:4444 → /semiconductor
```
### 各数据源刷新
```
make ingest.yahoo # Yahoo Finance
make ingest.comtrade # UN trade flows
make ingest.gdelt # GDELT news
make ingest.nvd # CVE feed
make ingest.derive # Recompute KPIs/radar
```
## 💻 配置
| 变量 | 默认值 | 解锁 |
|----------|---------|---------|
| `DATABASE_URL` | `postgresql://scr:scr@localhost:5433/scr_radar` | Postgres 连接 |
| `REDIS_URL` | `redis://localhost:6380` | Redis 缓存 |
| `CACHE_TTL` | `86400` | 缓存 TTL(秒) |
| `PATENTSVIEW_API_KEY` | — | 美国专利申请(免费) |
| `DART_API_KEY` | — | Korea DART 文件(免费) |
🔬 ETL 流水线
```
fixtures → migrate → seed_loader → entity sync → sources → derive → warm
```
每个源通过 `run(industry) → dict` 独立运行。流水线在设计上是顺序执行的 — 依赖顺序是明确的(wikidata 从 yahoo 读取公司,risks 读取网络安全/政策信息)。种子数据首先加载;真实数据在发生冲突时覆盖。失败的源永远不会阻塞其余的源。
## 🎨 视觉设计
- **深色分析主题** — 低亮度背景,搭配强调色的 KPI 卡片
- **CSS 变量系统** — 通过自定义属性实现一致的主题化
- **图标驱动的 UI** — 40+ Lucide 图标,用于导航和数据可视化
- **交互式图表** — Recharts、react-force-graph-3d、Sankey 图
- **面板网格** — 按优先级排序的布局:风险优先,地图居中,财务最后
## 🛡️ 数据源
| 来源 | 类型 | 免费 | 频率 |
|--------|------|------|---------|
| Yahoo Finance | 市场数据 | ✅ | 每天 |
| SEC EDGAR | 美国文件 | ✅ | 每天 |
| UN Comtrade | 贸易流 | ✅ | 每月 |
| GDELT 2.0 | 全球新闻 | ✅ | 每天 |
| NIST NVD | CVE | ✅ | 每天 |
| Federal Register | 法规 | ✅ | 每天 |
| Wikidata | 实体元数据 | ✅ | 每周 |
| PatentsView | 美国专利 | ✅* | 每周 |
| Korea DART | 韩国文件 | ✅* | 每天 |
| USGS / Statista | 矿产与材料估计值(精选,非实时馈送) | ✅ | 参考 |
*\* 需要免费的 API 密钥*
## 📄 许可证
MIT — 查看 [LICENSE](LICENSE)。
基于免费和开放数据构建。无需专有 API。
标签:PostgreSQL, Python, Redis, TypeScript, 供应链风险, 安全插件, 情报分析, 搜索引擎查询, 无后门, 网络诊断, 自动化攻击, 逆向工具