carbon-evolution/horus

GitHub: carbon-evolution/horus

HORUS 将 20 多个免费公开数据源融合为一个多行业供应链风险情报仪表板,帮助用户评估半导体、AI 和电池产业的公司与原材料供应链风险。

Stars: 0 | Forks: 0

# ⬡ HORUS — 供应链风险情报 一个**供应链风险情报平台**,它将 20 多个免费和开放的数据源(SEC 文件、联合国贸易数据、威胁情报、专利数据、地缘政治风险和金融市场)融合到一个针对半导体、AI 和电池产业的风险评分仪表板中。 ![TypeScript](https://img.shields.io/badge/TypeScript-5-3178C6.svg) ![Next.js](https://img.shields.io/badge/Next.js-16-000000.svg) ![React](https://img.shields.io/badge/React-19-61DAFB.svg) ![Postgres](https://img.shields.io/badge/Postgres-17-336791.svg) ![Redis](https://img.shields.io/badge/Redis-7-DC382D.svg) ![License](https://img.shields.io/badge/license-MIT-green.svg) ## 📖 概述 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 轴综合风险雷达、Top-10 市场快照、新闻订阅和全球设施地图](https://static.pigsec.cn/wp-content/uploads/repos/cas/70/706fa63105e79444ee1254a46633a34afc420b3ef0a2e0ff0ca1373665d66546.png) | ![半导体原材料流向 Sankey 图,从原产国流向台湾和中国,包含光刻胶依赖面板](https://static.pigsec.cn/wp-content/uploads/repos/cas/a0/a090ee2c9fedd0fd5d338d87595c4ad460b9a348fabce87d6749507cdcbea1dd.png) | *左图 — 半导体仪表板:七个 KPI 磁贴(公司、供应商、设施、材料、国家、政策更新、影响市场的新闻),一个 8 轴**综合风险雷达**(中等 · 61/100),一个 **Top-10 市场快照**(市值、价格、24小时/年初至今 %),一个**市场影响新闻流**,以及底部的**全球制造足迹**地图。右图 — 仪表板的**“原材料流动” Sankey 图**:原产国 → 材料(光刻胶、镓、稀土、氖气等) → 目的地,并带有特定材料的依赖性说明(例如,日本控制了 89% 的被追踪光刻胶)。* ### 多行业建模 | AI 行业 — 供应流 | 电池行业 — 材料贸易 | |---|---| | ![AI 行业仪表板 Sankey 图,包含 HBM 内存、CoWoS 封装、GPU、ABF 基板和电网电力,以及交易和研发表格](https://static.pigsec.cn/wp-content/uploads/repos/cas/80/805bc338af4165640e3b86cb0193527dfc645bcacfb8ad1de98bea1ea0983810.png) | ![电池行业材料 Sankey 图,展示锂、钴、镍、石墨和锰流向消费国](https://static.pigsec.cn/wp-content/uploads/repos/cas/d6/d6118b053fda283cf6cb5b741cabe0dab593df85bd531d494cb6e7495b81fd50.png) | *相同的模型针对每个行业重新实例化。**AI**(左图):HBM 内存、CoWoS 封装、GPU、ABF 基板、电网电力 — 包含最近的交易、按支出排名的顶级供应商以及研发/专利表。**电池**(右图):锂、钴、镍、石墨、锰流,带有来源集中度警告(例如,印度尼西亚控制了 88% 的被追踪镍)。* ### 供应链分析 | 原材料供应风险矩阵 | 3D 依赖图 | |---|---| | ![原材料页面:供应风险散点图(采购集中度与战略重要性对比)和材料比较表](https://static.pigsec.cn/wp-content/uploads/repos/cas/4c/4c6a3cb40b60fa16e3d0f26cc80be0748184e07d374fc1666f13ad3d8d00b060.png) | ![交互式 3D 力导向图,展示供应商与买方的依赖关系,聚焦 TSMC,并根据风险对边进行着色](https://static.pigsec.cn/wp-content/uploads/repos/cas/7c/7c72126ca1ecbe47e26b2a378bf929c557923b8766a03714a8e9007d6113b273.png) | | 供应商 → 输入 → 买家采购流 | |---| | ![贸易与发货页面:供应商到输入再到买方的 Sankey 图,带有货运通道关税和风险表](https://static.pigsec.cn/wp-content/uploads/repos/cas/6e/6e25810fb86159bb27f24f0de0c9b59f4906e3b33688ce85a58068c1d6109a72.png) | ***原材料**页面(左上)在可排序的比较表旁边绘制了每种材料的供应风险矩阵(采购集中度 × 战略重要性 × 供应风险)。**供应链地图**(右上)是一个交互式的 **3D 依赖力导向图** — 点击节点(图中所示为 TSMC)即可聚焦它,并追踪按风险着色的供应商→买方边。**贸易与发货**(底部)渲染了供应商→输入→买方的采购流,并配有货运通道关税/风险表。* ### 风险与合规 | 比较风险雷达 | 地缘政治 — 政治动荡 | |---|---| | ![风险雷达页面:TSMC 与行业基准的 8 轴比较风险概况,以及每家公司的风险登记册](https://static.pigsec.cn/wp-content/uploads/repos/cas/05/05e61ec4e085bf7bdf0b91ae37c5490cb9b846bf894399a1008da817e81809a1.png) | ![地缘政治风险地图:根据受其影响的材料的政治动荡紧张局势对生产国进行评分,并带有级联弧线](https://static.pigsec.cn/wp-content/uploads/repos/cas/cf/cf00263b665671cc82665601cd0e9c2292eafb14a19f03c7269cef635acb24c3.png) | | 海上咽喉要道 | 财务风险排名 | |---|---| | ![海上咽喉要道地图,展示穿过霍尔木兹、马六甲和台湾海峡的动画海上航线以及风险敞口条](https://static.pigsec.cn/wp-content/uploads/repos/cas/d4/d472a9887c23033b25afd4df8c37994886a647fb8c9dc2b9bb7f8fc72c94a3f9.png) | ![财务页面:根据财务风险评分对公司进行排名,并附带关键比率表](https://static.pigsec.cn/wp-content/uploads/repos/cas/ab/abd84075b2c4ad94c06735a13389df6454c7e6a32f8c75ddadd58c9e928b12ef.png) | ***风险雷达**(左上)将任何公司的 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, 供应链风险, 安全插件, 情报分析, 搜索引擎查询, 无后门, 网络诊断, 自动化攻击, 逆向工具