From b1ff8db5b0235c7149849d4eabd82903229b7465 Mon Sep 17 00:00:00 2001 From: lch262 Date: Fri, 21 Aug 2026 21:20:53 +0800 Subject: [PATCH 1/3] feat: add ARK and H&H investor profiles --- README.md | 7 +- web/app/data/ark-portfolio.json | 2187 ++++++++++++++++++++++++++++++ web/app/data/hh-portfolio.json | 240 ++++ web/app/globals.css | 13 + web/app/lib/managers.ts | 13 + web/app/lib/portfolio-data.ts | 15 + web/app/manager/[slug]/page.tsx | 1 + web/app/managers/page.tsx | 2 +- web/tests/rendered-html.test.mjs | 4 + 9 files changed, 2478 insertions(+), 4 deletions(-) create mode 100644 web/app/data/ark-portfolio.json create mode 100644 web/app/data/hh-portfolio.json diff --git a/README.md b/README.md index d4f9e11..4a38107 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ > [在线试用 FolioPulse](https://folio-pulse-dashboard.lch262.chatgpt.site/) · [提交问题或建议](https://github.com/lch262/folio-pulse/issues/new/choose) · [参与产品讨论](https://github.com/lch262/folio-pulse/discussions) FolioPulse 是一个 SEC 13F 数据引擎与可视化仪表盘。它从 SEC EDGAR 读取机构最近两份 -**原始** `13F-HR`,生成标准化持仓、季度变化和可浏览的投资人档案。目前已接入伯克希尔 -与 Scion 的真实公开快照。 +**原始** `13F-HR`,生成标准化持仓、季度变化和可浏览的投资人档案。目前已接入伯克希尔、 +Scion、ARK Invest(木头姐)与 H&H International(段永平相关)的真实公开快照。 `13F-HR/A` 修订申报会被忽略,避免把修订文件误当成新的季度。 @@ -12,7 +12,7 @@ FolioPulse 是一个 SEC 13F 数据引擎与可视化仪表盘。它从 SEC EDGA 无需安装即可打开[在线仪表盘](https://folio-pulse-dashboard.lch262.chatgpt.site/)。建议重点体验: -- 从投资人中心切换伯克希尔与 Scion,核对报告期和提交日期; +- 从投资人中心切换伯克希尔、Scion、ARK 与 H&H,核对报告期和提交日期; - 搜索持仓,并按新建、增持、减持和清仓筛选季度动作; - 打开单项持仓详情,检查跳转、移动端显示和数据解释是否清楚; - 对不准确的数据、难理解的文案或希望增加的机构提出建议。 @@ -184,3 +184,4 @@ npm run dev - [x] 管理员 JSON 导入界面与动态调仓信号 - [x] 多机构档案、按 CIK 隔离读取与 Scion 真实 13F 快照(V0.08) - [x] 机构持仓搜索、动作筛选与机构专属单项详情 +- [x] ARK 与 H&H 最新公开 13F 快照、独立档案与数据边界说明(V0.09) diff --git a/web/app/data/ark-portfolio.json b/web/app/data/ark-portfolio.json new file mode 100644 index 0000000..201f7a8 --- /dev/null +++ b/web/app/data/ark-portfolio.json @@ -0,0 +1,2187 @@ +{ + "manager": "ARK Investment Management LLC", + "managerShort": "ARK Investment Management LLC", + "cik": "0001697748", + "previousReportDate": "2026-03-31", + "reportDate": "2026-06-30", + "filedAt": "2026-08-14", + "source": "SEC 13F-HR", + "totalValue": 15.40278784, + "positionCount": 190, + "changes": { + "NEW": 16, + "ADDED": 79, + "REDUCED": 94, + "EXIT": 7, + "UNCHANGED": 1 + }, + "positions": [ + { + "issuer": "Tesla Inc", + "ticker": "TSLA", + "sector": "未分类", + "value": 1.160772073, + "weight": 7.536117, + "shares": 2759800, + "shareChange": -71529, + "changePercent": -2.5263, + "changeType": "REDUCED" + }, + { + "issuer": "Advanced Micro Devices Inc", + "ticker": "AMD", + "sector": "未分类", + "value": 0.822826048, + "weight": 5.342059, + "shares": 1416443, + "shareChange": -1296411, + "changePercent": -47.7877, + "changeType": "REDUCED" + }, + { + "issuer": "Space Exploration Technologies Corp", + "ticker": "SPACEX", + "sector": "未分类", + "value": 0.765113281, + "weight": 4.967369, + "shares": 4478013, + "shareChange": 4478013, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "Tempus AI Inc", + "ticker": "TEM", + "sector": "未分类", + "value": 0.5806112, + "weight": 3.76952, + "shares": 10022634, + "shareChange": 414889, + "changePercent": 4.3183, + "changeType": "ADDED" + }, + { + "issuer": "Robinhood Markets Inc", + "ticker": "HOOD", + "sector": "未分类", + "value": 0.525069168, + "weight": 3.408923, + "shares": 5236031, + "shareChange": -767030, + "changePercent": -12.7773, + "changeType": "REDUCED" + }, + { + "issuer": "CRISPR Therapeutics AG", + "ticker": "CRSP", + "sector": "未分类", + "value": 0.515999631, + "weight": 3.350041, + "shares": 9460939, + "shareChange": -1852684, + "changePercent": -16.3757, + "changeType": "REDUCED" + }, + { + "issuer": "Shopify Inc", + "ticker": "SHOP", + "sector": "未分类", + "value": 0.474523465, + "weight": 3.080763, + "shares": 4155925, + "shareChange": -21727, + "changePercent": -0.5201, + "changeType": "REDUCED" + }, + { + "issuer": "Twist Bioscience Corp", + "ticker": "TWST", + "sector": "未分类", + "value": 0.468083756, + "weight": 3.038955, + "shares": 4549803, + "shareChange": -1792930, + "changePercent": -28.2675, + "changeType": "REDUCED" + }, + { + "issuer": "10X Genomics Inc", + "ticker": "TXG", + "sector": "未分类", + "value": 0.383517223, + "weight": 2.489921, + "shares": 10003057, + "shareChange": -1714260, + "changePercent": -14.6301, + "changeType": "REDUCED" + }, + { + "issuer": "Amazon.com Inc", + "ticker": "AMZN", + "sector": "未分类", + "value": 0.379241133, + "weight": 2.462159, + "shares": 1591177, + "shareChange": 235894, + "changePercent": 17.4055, + "changeType": "ADDED" + }, + { + "issuer": "Palantir Technologies Inc", + "ticker": "PLTR", + "sector": "未分类", + "value": 0.374777381, + "weight": 2.433179, + "shares": 3212286, + "shareChange": 102405, + "changePercent": 3.2929, + "changeType": "ADDED" + }, + { + "issuer": "Alphabet Inc", + "ticker": "GOOG", + "sector": "未分类", + "value": 0.368641312, + "weight": 2.393341, + "shares": 1043334, + "shareChange": 322920, + "changePercent": 44.8242, + "changeType": "ADDED" + }, + { + "issuer": "Coinbase Global Inc", + "ticker": "COIN", + "sector": "未分类", + "value": 0.367129713, + "weight": 2.383528, + "shares": 2511319, + "shareChange": 138435, + "changePercent": 5.834, + "changeType": "ADDED" + }, + { + "issuer": "ROBLOX Corp", + "ticker": "RBLX", + "sector": "未分类", + "value": 0.351615103, + "weight": 2.282802, + "shares": 6465890, + "shareChange": 569784, + "changePercent": 9.6637, + "changeType": "ADDED" + }, + { + "issuer": "Beam Therapeutics Inc", + "ticker": "BEAM", + "sector": "未分类", + "value": 0.351260447, + "weight": 2.280499, + "shares": 10234862, + "shareChange": -1898571, + "changePercent": -15.6474, + "changeType": "REDUCED" + }, + { + "issuer": "Teradyne Inc", + "ticker": "TER", + "sector": "未分类", + "value": 0.31197142, + "weight": 2.025422, + "shares": 644782, + "shareChange": -600340, + "changePercent": -48.2154, + "changeType": "REDUCED" + }, + { + "issuer": "Intellia Therapeutics Inc", + "ticker": "NTLA", + "sector": "未分类", + "value": 0.285536575, + "weight": 1.853798, + "shares": 16875684, + "shareChange": 2366437, + "changePercent": 16.3099, + "changeType": "ADDED" + }, + { + "issuer": "Circle Internet Group Inc", + "ticker": "CRCL", + "sector": "未分类", + "value": 0.285477674, + "weight": 1.853416, + "shares": 4558162, + "shareChange": 48680, + "changePercent": 1.0795, + "changeType": "ADDED" + }, + { + "issuer": "NVIDIA Corp", + "ticker": "NVDA", + "sector": "未分类", + "value": 0.276373746, + "weight": 1.79431, + "shares": 1381247, + "shareChange": 345821, + "changePercent": 33.3989, + "changeType": "ADDED" + }, + { + "issuer": "CoreWeave Inc", + "ticker": "CRWV", + "sector": "未分类", + "value": 0.264496911, + "weight": 1.717202, + "shares": 2657192, + "shareChange": 119067, + "changePercent": 4.6911, + "changeType": "ADDED" + }, + { + "issuer": "Deere & Co", + "ticker": "DE", + "sector": "未分类", + "value": 0.249307586, + "weight": 1.618587, + "shares": 393025, + "shareChange": -6049, + "changePercent": -1.5158, + "changeType": "REDUCED" + }, + { + "issuer": "Block Inc", + "ticker": "XYZ", + "sector": "未分类", + "value": 0.23544595, + "weight": 1.528593, + "shares": 3097973, + "shareChange": 4037, + "changePercent": 0.1305, + "changeType": "ADDED" + }, + { + "issuer": "Kratos Defense & Security Solutions Inc.", + "ticker": "KTOS", + "sector": "未分类", + "value": 0.232974116, + "weight": 1.512545, + "shares": 4672566, + "shareChange": 1181372, + "changePercent": 33.8386, + "changeType": "ADDED" + }, + { + "issuer": "Taiwan Semiconductor Manufacturing Company Ltd", + "ticker": "TSM", + "sector": "未分类", + "value": 0.230325325, + "weight": 1.495348, + "shares": 482286, + "shareChange": -145418, + "changePercent": -23.1667, + "changeType": "REDUCED" + }, + { + "issuer": "Natera Inc", + "ticker": "NTRA", + "sector": "未分类", + "value": 0.186989592, + "weight": 1.213998, + "shares": 688855, + "shareChange": 4600, + "changePercent": 0.6723, + "changeType": "ADDED" + }, + { + "issuer": "Illumina Inc", + "ticker": "ILMN", + "sector": "未分类", + "value": 0.183744158, + "weight": 1.192928, + "shares": 1045010, + "shareChange": -84449, + "changePercent": -7.4769, + "changeType": "REDUCED" + }, + { + "issuer": "Cerebras Systems Inc", + "ticker": "15675D103", + "sector": "未分类", + "value": 0.168979473, + "weight": 1.097071, + "shares": 764613, + "shareChange": 764613, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "Rocket Lab Corp", + "ticker": "RKLB", + "sector": "未分类", + "value": 0.165812192, + "weight": 1.076508, + "shares": 1631207, + "shareChange": -612449, + "changePercent": -27.2969, + "changeType": "REDUCED" + }, + { + "issuer": "Bullish", + "ticker": "BLSH", + "sector": "未分类", + "value": 0.158063147, + "weight": 1.026198, + "shares": 6746186, + "shareChange": 184147, + "changePercent": 2.8062, + "changeType": "ADDED" + }, + { + "issuer": "Broadcom Inc", + "ticker": "AVGO", + "sector": "未分类", + "value": 0.153820556, + "weight": 0.998654, + "shares": 407202, + "shareChange": -601, + "changePercent": -0.1474, + "changeType": "REDUCED" + }, + { + "issuer": "Recursion Pharmaceuticals Inc", + "ticker": "75629V104", + "sector": "未分类", + "value": 0.151709111, + "weight": 0.984946, + "shares": 41337632, + "shareChange": 1124863, + "changePercent": 2.7973, + "changeType": "ADDED" + }, + { + "issuer": "Archer Aviation Inc", + "ticker": "03945R102", + "sector": "未分类", + "value": 0.151189352, + "weight": 0.981571, + "shares": 31963922, + "shareChange": -5473140, + "changePercent": -14.6196, + "changeType": "REDUCED" + }, + { + "issuer": "Absci Corp", + "ticker": "00091E109", + "sector": "未分类", + "value": 0.149803896, + "weight": 0.972577, + "shares": 12925271, + "shareChange": -800898, + "changePercent": -5.8348, + "changeType": "REDUCED" + }, + { + "issuer": "Veracyte Inc", + "ticker": "92337F107", + "sector": "未分类", + "value": 0.134841222, + "weight": 0.875434, + "shares": 2295951, + "shareChange": -757867, + "changePercent": -24.817, + "changeType": "REDUCED" + }, + { + "issuer": "Meta Platforms Inc", + "ticker": "30303M102", + "sector": "未分类", + "value": 0.13461091, + "weight": 0.873939, + "shares": 238973, + "shareChange": 84977, + "changePercent": 55.1813, + "changeType": "ADDED" + }, + { + "issuer": "ARK 21Shares Bitcoin ETF", + "ticker": "040919102", + "sector": "未分类", + "value": 0.125605835, + "weight": 0.815475, + "shares": 6454565, + "shareChange": -243641, + "changePercent": -3.6374, + "changeType": "REDUCED" + }, + { + "issuer": "L3Harris Technologies Inc", + "ticker": "502431109", + "sector": "未分类", + "value": 0.125296306, + "weight": 0.813465, + "shares": 431179, + "shareChange": 41485, + "changePercent": 10.6455, + "changeType": "ADDED" + }, + { + "issuer": "BitMine Immersion Technologies", + "ticker": "09175A206", + "sector": "未分类", + "value": 0.117282236, + "weight": 0.761435, + "shares": 8811588, + "shareChange": -887577, + "changePercent": -9.1511, + "changeType": "REDUCED" + }, + { + "issuer": "Personalis Inc", + "ticker": "71535D106", + "sector": "未分类", + "value": 0.110835941, + "weight": 0.719584, + "shares": 8271339, + "shareChange": 327227, + "changePercent": 4.1191, + "changeType": "ADDED" + }, + { + "issuer": "GeneDx Holdings Corp", + "ticker": "81663L200", + "sector": "未分类", + "value": 0.110539494, + "weight": 0.717659, + "shares": 1610189, + "shareChange": 285606, + "changePercent": 21.562, + "changeType": "ADDED" + }, + { + "issuer": "BWX Technologies Inc", + "ticker": "05605H100", + "sector": "未分类", + "value": 0.107034337, + "weight": 0.694902, + "shares": 549881, + "shareChange": -72665, + "changePercent": -11.6722, + "changeType": "REDUCED" + }, + { + "issuer": "AeroVironment Inc", + "ticker": "008073108", + "sector": "未分类", + "value": 0.100280355, + "weight": 0.651053, + "shares": 607502, + "shareChange": 48248, + "changePercent": 8.6272, + "changeType": "ADDED" + }, + { + "issuer": "X-Energy Inc", + "ticker": "98386P102", + "sector": "未分类", + "value": 0.099361493, + "weight": 0.645088, + "shares": 5411846, + "shareChange": 5411846, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "Eli Lilly & Co", + "ticker": "532457108", + "sector": "未分类", + "value": 0.092660897, + "weight": 0.601585, + "shares": 77254, + "shareChange": 64578, + "changePercent": 509.4509, + "changeType": "ADDED" + }, + { + "issuer": "Roku Inc", + "ticker": "77543R102", + "sector": "未分类", + "value": 0.082314834, + "weight": 0.534415, + "shares": 595880, + "shareChange": -3224525, + "changePercent": -84.4027, + "changeType": "REDUCED" + }, + { + "issuer": "Guardant Health Inc", + "ticker": "40131M109", + "sector": "未分类", + "value": 0.075977634, + "weight": 0.493272, + "shares": 506416, + "shareChange": 19741, + "changePercent": 4.0563, + "changeType": "ADDED" + }, + { + "issuer": "DoorDash Inc", + "ticker": "25809K105", + "sector": "未分类", + "value": 0.07014705, + "weight": 0.455418, + "shares": 380139, + "shareChange": 33992, + "changePercent": 9.8201, + "changeType": "ADDED" + }, + { + "issuer": "Snowflake Inc", + "ticker": "833445109", + "sector": "未分类", + "value": 0.068597731, + "weight": 0.445359, + "shares": 269539, + "shareChange": 269539, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "Trimble Inc", + "ticker": "896239100", + "sector": "未分类", + "value": 0.068155382, + "weight": 0.442487, + "shares": 1331680, + "shareChange": 83755, + "changePercent": 6.7115, + "changeType": "ADDED" + }, + { + "issuer": "SoFi Technologies Inc", + "ticker": "83406F102", + "sector": "未分类", + "value": 0.067102642, + "weight": 0.435653, + "shares": 3742479, + "shareChange": -93524, + "changePercent": -2.4381, + "changeType": "REDUCED" + }, + { + "issuer": "Iridium Communications Inc", + "ticker": "46269C102", + "sector": "未分类", + "value": 0.066648948, + "weight": 0.432707, + "shares": 1215113, + "shareChange": -511689, + "changePercent": -29.6322, + "changeType": "REDUCED" + }, + { + "issuer": "Joby Aviation Inc", + "ticker": "G65163100", + "sector": "未分类", + "value": 0.059713254, + "weight": 0.387678, + "shares": 6694311, + "shareChange": 520367, + "changePercent": 8.4284, + "changeType": "ADDED" + }, + { + "issuer": "Caterpillar Inc", + "ticker": "149123101", + "sector": "未分类", + "value": 0.059642919, + "weight": 0.387222, + "shares": 56008, + "shareChange": -2570, + "changePercent": -4.3873, + "changeType": "REDUCED" + }, + { + "issuer": "Intuitive Machines Inc", + "ticker": "46125A100", + "sector": "未分类", + "value": 0.057740187, + "weight": 0.374868, + "shares": 2699401, + "shareChange": 42870, + "changePercent": 1.6138, + "changeType": "ADDED" + }, + { + "issuer": "CareDx Inc", + "ticker": "14167L103", + "sector": "未分类", + "value": 0.055675622, + "weight": 0.361465, + "shares": 1953531, + "shareChange": -274025, + "changePercent": -12.3016, + "changeType": "REDUCED" + }, + { + "issuer": "Figma Inc", + "ticker": "316841105", + "sector": "未分类", + "value": 0.055030051, + "weight": 0.357273, + "shares": 3042015, + "shareChange": -350854, + "changePercent": -10.3409, + "changeType": "REDUCED" + }, + { + "issuer": "Datadog Inc", + "ticker": "23804L103", + "sector": "未分类", + "value": 0.054714133, + "weight": 0.355222, + "shares": 210148, + "shareChange": -16474, + "changePercent": -7.2694, + "changeType": "REDUCED" + }, + { + "issuer": "Cerus Corp", + "ticker": "157085101", + "sector": "未分类", + "value": 0.052361728, + "weight": 0.33995, + "shares": 17932099, + "shareChange": -1229049, + "changePercent": -6.4143, + "changeType": "REDUCED" + }, + { + "issuer": "Toast Inc", + "ticker": "888787108", + "sector": "未分类", + "value": 0.051742056, + "weight": 0.335927, + "shares": 1859887, + "shareChange": 49133, + "changePercent": 2.7134, + "changeType": "ADDED" + }, + { + "issuer": "Alphabet Inc", + "ticker": "02079K305", + "sector": "未分类", + "value": 0.050075399, + "weight": 0.325106, + "shares": 140122, + "shareChange": 140122, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "Pacific Biosciences of California, Inc.", + "ticker": "69404D108", + "sector": "未分类", + "value": 0.050032778, + "weight": 0.324829, + "shares": 29781416, + "shareChange": -6491872, + "changePercent": -17.8971, + "changeType": "REDUCED" + }, + { + "issuer": "Compass Pathways Plc", + "ticker": "20451W101", + "sector": "未分类", + "value": 0.04884531, + "weight": 0.31712, + "shares": 3451965, + "shareChange": 150915, + "changePercent": 4.5717, + "changeType": "ADDED" + }, + { + "issuer": "Elbit Systems Ltd", + "ticker": "M3760D101", + "sector": "未分类", + "value": 0.047578572, + "weight": 0.308896, + "shares": 62709, + "shareChange": 2428, + "changePercent": 4.0278, + "changeType": "ADDED" + }, + { + "issuer": "Adaptive Biotechnologies Corp", + "ticker": "00650F109", + "sector": "未分类", + "value": 0.044837058, + "weight": 0.291097, + "shares": 2090306, + "shareChange": -2663, + "changePercent": -0.1272, + "changeType": "REDUCED" + }, + { + "issuer": "Nurix Therapeutics Inc", + "ticker": "67080M103", + "sector": "未分类", + "value": 0.04350293, + "weight": 0.282435, + "shares": 1793196, + "shareChange": 72061, + "changePercent": 4.1868, + "changeType": "ADDED" + }, + { + "issuer": "Cloudflare Inc", + "ticker": "18915M107", + "sector": "未分类", + "value": 0.043101337, + "weight": 0.279828, + "shares": 175723, + "shareChange": -7921, + "changePercent": -4.3132, + "changeType": "REDUCED" + }, + { + "issuer": "Butterfly Network Inc", + "ticker": "124155102", + "sector": "未分类", + "value": 0.042819541, + "weight": 0.277999, + "shares": 5085456, + "shareChange": -142047, + "changePercent": -2.7173, + "changeType": "REDUCED" + }, + { + "issuer": "Aurora Innovation Inc", + "ticker": "051774107", + "sector": "未分类", + "value": 0.041819087, + "weight": 0.271503, + "shares": 6131831, + "shareChange": -318932, + "changePercent": -4.9441, + "changeType": "REDUCED" + }, + { + "issuer": "MercadoLibre Inc", + "ticker": "58733R102", + "sector": "未分类", + "value": 0.037417265, + "weight": 0.242925, + "shares": 22044, + "shareChange": -1944, + "changePercent": -8.1041, + "changeType": "REDUCED" + }, + { + "issuer": "Alamar Biosciences Inc", + "ticker": "010911105", + "sector": "未分类", + "value": 0.037220549, + "weight": 0.241648, + "shares": 1373959, + "shareChange": 1373959, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "Cameco Corp", + "ticker": "13321L108", + "sector": "未分类", + "value": 0.03682952, + "weight": 0.239109, + "shares": 361570, + "shareChange": -5607, + "changePercent": -1.5271, + "changeType": "REDUCED" + }, + { + "issuer": "Teledyne Technologies Inc", + "ticker": "879360105", + "sector": "未分类", + "value": 0.036594804, + "weight": 0.237586, + "shares": 54873, + "shareChange": 3438, + "changePercent": 6.6842, + "changeType": "ADDED" + }, + { + "issuer": "Synopsys Inc", + "ticker": "871607107", + "sector": "未分类", + "value": 0.036257908, + "weight": 0.235398, + "shares": 81283, + "shareChange": 5213, + "changePercent": 6.8529, + "changeType": "ADDED" + }, + { + "issuer": "Symbotic Inc", + "ticker": "87151X101", + "sector": "未分类", + "value": 0.035813868, + "weight": 0.232515, + "shares": 796749, + "shareChange": 14526, + "changePercent": 1.857, + "changeType": "ADDED" + }, + { + "issuer": "Schrodinger Inc", + "ticker": "80810D103", + "sector": "未分类", + "value": 0.035002797, + "weight": 0.22725, + "shares": 2154018, + "shareChange": 86883, + "changePercent": 4.2031, + "changeType": "ADDED" + }, + { + "issuer": "Baidu Inc", + "ticker": "056752108", + "sector": "未分类", + "value": 0.034508037, + "weight": 0.224038, + "shares": 301934, + "shareChange": -818397, + "changePercent": -73.0496, + "changeType": "REDUCED" + }, + { + "issuer": "Spotify Technology SA", + "ticker": "L8681T102", + "sector": "未分类", + "value": 0.034484423, + "weight": 0.223884, + "shares": 75108, + "shareChange": 7330, + "changePercent": 10.8147, + "changeType": "ADDED" + }, + { + "issuer": "Everpure Inc", + "ticker": "74624M102", + "sector": "未分类", + "value": 0.031354638, + "weight": 0.203565, + "shares": 397952, + "shareChange": -30664, + "changePercent": -7.1542, + "changeType": "REDUCED" + }, + { + "issuer": "DraftKings Inc", + "ticker": "26142V105", + "sector": "未分类", + "value": 0.031040642, + "weight": 0.201526, + "shares": 1228846, + "shareChange": -124263, + "changePercent": -9.1835, + "changeType": "REDUCED" + }, + { + "issuer": "Prime Medicine Inc", + "ticker": "74168J101", + "sector": "未分类", + "value": 0.030806875, + "weight": 0.200008, + "shares": 8348746, + "shareChange": 2101919, + "changePercent": 33.6478, + "changeType": "ADDED" + }, + { + "issuer": "Rubrik Inc", + "ticker": "781154109", + "sector": "未分类", + "value": 0.029336399, + "weight": 0.190462, + "shares": 365426, + "shareChange": -29623, + "changePercent": -7.4986, + "changeType": "REDUCED" + }, + { + "issuer": "Intuitive Surgical Inc", + "ticker": "46120E602", + "sector": "未分类", + "value": 0.02798673, + "weight": 0.181699, + "shares": 70375, + "shareChange": 1384, + "changePercent": 2.0061, + "changeType": "ADDED" + }, + { + "issuer": "Kodiak AI Inc", + "ticker": "500081104", + "sector": "未分类", + "value": 0.026163153, + "weight": 0.16986, + "shares": 5150227, + "shareChange": 1344999, + "changePercent": 35.3461, + "changeType": "ADDED" + }, + { + "issuer": "Ionis Pharmaceuticals Inc", + "ticker": "462222100", + "sector": "未分类", + "value": 0.023848064, + "weight": 0.15483, + "shares": 300770, + "shareChange": 12054, + "changePercent": 4.175, + "changeType": "ADDED" + }, + { + "issuer": "Gitlab Inc", + "ticker": "37637K108", + "sector": "未分类", + "value": 0.023446979, + "weight": 0.152226, + "shares": 767998, + "shareChange": -58887, + "changePercent": -7.1215, + "changeType": "REDUCED" + }, + { + "issuer": "WeRide Inc", + "ticker": "950915108", + "sector": "未分类", + "value": 0.021783963, + "weight": 0.141429, + "shares": 3742949, + "shareChange": 93618, + "changePercent": 2.5653, + "changeType": "ADDED" + }, + { + "issuer": "Generate Biomedicines Inc", + "ticker": "370920100", + "sector": "未分类", + "value": 0.021671492, + "weight": 0.140699, + "shares": 1284617, + "shareChange": 786209, + "changePercent": 157.7441, + "changeType": "ADDED" + }, + { + "issuer": "Airbnb Inc", + "ticker": "009066101", + "sector": "未分类", + "value": 0.021224619, + "weight": 0.137797, + "shares": 148320, + "shareChange": -13342, + "changePercent": -8.253, + "changeType": "REDUCED" + }, + { + "issuer": "Arcturus Therapeutics Holdings", + "ticker": "03969T109", + "sector": "未分类", + "value": 0.019498987, + "weight": 0.126594, + "shares": 2901635, + "shareChange": 132117, + "changePercent": 4.7704, + "changeType": "ADDED" + }, + { + "issuer": "Oklo Inc", + "ticker": "02156V109", + "sector": "未分类", + "value": 0.019480209, + "weight": 0.126472, + "shares": 372257, + "shareChange": 21088, + "changePercent": 6.0051, + "changeType": "ADDED" + }, + { + "issuer": "Genius Sports Ltd", + "ticker": "G3934V109", + "sector": "未分类", + "value": 0.018578566, + "weight": 0.120618, + "shares": 3065770, + "shareChange": -265420, + "changePercent": -7.9677, + "changeType": "REDUCED" + }, + { + "issuer": "Crowdstrike Holdings Inc", + "ticker": "22788C105", + "sector": "未分类", + "value": 0.018029183, + "weight": 0.117051, + "shares": 94500, + "shareChange": -11366, + "changePercent": -10.7362, + "changeType": "REDUCED" + }, + { + "issuer": "HEICO Corp", + "ticker": "422806109", + "sector": "未分类", + "value": 0.017828022, + "weight": 0.115745, + "shares": 50052, + "shareChange": 6311, + "changePercent": 14.4281, + "changeType": "ADDED" + }, + { + "issuer": "908 Devices Inc", + "ticker": "65443P102", + "sector": "未分类", + "value": 0.017642905, + "weight": 0.114544, + "shares": 2027920, + "shareChange": 81235, + "changePercent": 4.173, + "changeType": "ADDED" + }, + { + "issuer": "Netflix Inc", + "ticker": "64110L106", + "sector": "未分类", + "value": 0.016055789, + "weight": 0.104239, + "shares": 224871, + "shareChange": 7450, + "changePercent": 3.4265, + "changeType": "ADDED" + }, + { + "issuer": "Pony AI Inc", + "ticker": "732908108", + "sector": "未分类", + "value": 0.015376555, + "weight": 0.09983, + "shares": 2212454, + "shareChange": 286303, + "changePercent": 14.864, + "changeType": "ADDED" + }, + { + "issuer": "Sea Ltd", + "ticker": "81141R100", + "sector": "未分类", + "value": 0.015180586, + "weight": 0.098557, + "shares": 158412, + "shareChange": -14654, + "changePercent": -8.4673, + "changeType": "REDUCED" + }, + { + "issuer": "Garmin Ltd", + "ticker": "H2906T109", + "sector": "未分类", + "value": 0.014651942, + "weight": 0.095125, + "shares": 61682, + "shareChange": 7982, + "changePercent": 14.8641, + "changeType": "ADDED" + }, + { + "issuer": "Klarna Group PLC", + "ticker": "G5279N105", + "sector": "未分类", + "value": 0.014414948, + "weight": 0.093587, + "shares": 712201, + "shareChange": -65960, + "changePercent": -8.4764, + "changeType": "REDUCED" + }, + { + "issuer": "Strata Critical Medical Inc", + "ticker": "092667104", + "sector": "未分类", + "value": 0.014391606, + "weight": 0.093435, + "shares": 2730855, + "shareChange": -4724429, + "changePercent": -63.3702, + "changeType": "REDUCED" + }, + { + "issuer": "NU Holdings Ltd", + "ticker": "G6683N103", + "sector": "未分类", + "value": 0.014315494, + "weight": 0.092941, + "shares": 1071519, + "shareChange": -99246, + "changePercent": -8.477, + "changeType": "REDUCED" + }, + { + "issuer": "Etoro Group Ltd", + "ticker": "G32089107", + "sector": "未分类", + "value": 0.012458508, + "weight": 0.080885, + "shares": 315645, + "shareChange": -36607, + "changePercent": -10.3923, + "changeType": "REDUCED" + }, + { + "issuer": "BioNTech SE", + "ticker": "09075V102", + "sector": "未分类", + "value": 0.012406622, + "weight": 0.080548, + "shares": 133333, + "shareChange": 5455, + "changePercent": 4.2658, + "changeType": "ADDED" + }, + { + "issuer": "Alibaba Group Holding Ltd", + "ticker": "01609W102", + "sector": "未分类", + "value": 0.011474896, + "weight": 0.074499, + "shares": 119555, + "shareChange": -663616, + "changePercent": -84.7345, + "changeType": "REDUCED" + }, + { + "issuer": "Canton Strategic Holdings Inc", + "ticker": "432705309", + "sector": "未分类", + "value": 0.010314285, + "weight": 0.066964, + "shares": 3657548, + "shareChange": -37536, + "changePercent": -1.0158, + "changeType": "REDUCED" + }, + { + "issuer": "Lockheed Martin Corp", + "ticker": "539830109", + "sector": "未分类", + "value": 0.007543065, + "weight": 0.048972, + "shares": 14806, + "shareChange": 1539, + "changePercent": 11.6002, + "changeType": "ADDED" + }, + { + "issuer": "ARK Innovation ETF", + "ticker": "00214Q104", + "sector": "未分类", + "value": 0.007363075, + "weight": 0.047804, + "shares": 91105, + "shareChange": -4532, + "changePercent": -4.7388, + "changeType": "REDUCED" + }, + { + "issuer": "Quantum-Si Inc", + "ticker": "74765K105", + "sector": "未分类", + "value": 0.006343448, + "weight": 0.041184, + "shares": 7167738, + "shareChange": 288839, + "changePercent": 4.1989, + "changeType": "ADDED" + }, + { + "issuer": "Honeywell International Inc", + "ticker": "438516205", + "sector": "未分类", + "value": 0.005208362, + "weight": 0.033814, + "shares": 23262, + "shareChange": 23262, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "Honeywell Aerospace Inc", + "ticker": "43849R105", + "sector": "未分类", + "value": 0.005142763, + "weight": 0.033389, + "shares": 23262, + "shareChange": 23262, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "SimilarWeb Ltd", + "ticker": "M84137104", + "sector": "未分类", + "value": 0.005116484, + "weight": 0.033218, + "shares": 834663, + "shareChange": 482593, + "changePercent": 137.073, + "changeType": "ADDED" + }, + { + "issuer": "Zillow Group Inc", + "ticker": "98954M200", + "sector": "未分类", + "value": 0.004809164, + "weight": 0.031223, + "shares": 152575, + "shareChange": -14110, + "changePercent": -8.4651, + "changeType": "REDUCED" + }, + { + "issuer": "JFrog Ltd", + "ticker": "M6191J100", + "sector": "未分类", + "value": 0.004600436, + "weight": 0.029868, + "shares": 50621, + "shareChange": 11080, + "changePercent": 28.0215, + "changeType": "ADDED" + }, + { + "issuer": "Xometry Inc", + "ticker": "98423F109", + "sector": "未分类", + "value": 0.004444553, + "weight": 0.028856, + "shares": 46048, + "shareChange": 5752, + "changePercent": 14.2744, + "changeType": "ADDED" + }, + { + "issuer": "Stratasys Ltd", + "ticker": "M85548101", + "sector": "未分类", + "value": 0.004384261, + "weight": 0.028464, + "shares": 512180, + "shareChange": 95752, + "changePercent": 22.9937, + "changeType": "ADDED" + }, + { + "issuer": "UroGen Pharma Ltd", + "ticker": "M96088105", + "sector": "未分类", + "value": 0.003735494, + "weight": 0.024252, + "shares": 101508, + "shareChange": -14037, + "changePercent": -12.1485, + "changeType": "REDUCED" + }, + { + "issuer": "Kaspi.KZ JSC", + "ticker": "48581R205", + "sector": "未分类", + "value": 0.003597726, + "weight": 0.023358, + "shares": 41525, + "shareChange": -21107, + "changePercent": -33.7, + "changeType": "REDUCED" + }, + { + "issuer": "PayPay Corp", + "ticker": "70450C101", + "sector": "未分类", + "value": 0.003510635, + "weight": 0.022792, + "shares": 244985, + "shareChange": -22678, + "changePercent": -8.4726, + "changeType": "REDUCED" + }, + { + "issuer": "Alpha Tau Medical Ltd", + "ticker": "M0740A108", + "sector": "未分类", + "value": 0.003485742, + "weight": 0.022631, + "shares": 277086, + "shareChange": -15048, + "changePercent": -5.1511, + "changeType": "REDUCED" + }, + { + "issuer": "Velo3D Inc", + "ticker": "92259N302", + "sector": "未分类", + "value": 0.003417915, + "weight": 0.02219, + "shares": 194753, + "shareChange": 76855, + "changePercent": 65.1877, + "changeType": "ADDED" + }, + { + "issuer": "Valens Semiconductor Ltd", + "ticker": "M9607U115", + "sector": "未分类", + "value": 0.003192408, + "weight": 0.020726, + "shares": 1412570, + "shareChange": 364082, + "changePercent": 34.7245, + "changeType": "ADDED" + }, + { + "issuer": "3D Systems Corp", + "ticker": "88554D205", + "sector": "未分类", + "value": 0.003119014, + "weight": 0.02025, + "shares": 1032786, + "shareChange": 117586, + "changePercent": 12.8481, + "changeType": "ADDED" + }, + { + "issuer": "Materialise NV", + "ticker": "57667T100", + "sector": "未分类", + "value": 0.003118995, + "weight": 0.02025, + "shares": 419784, + "shareChange": -24540, + "changePercent": -5.523, + "changeType": "REDUCED" + }, + { + "issuer": "Taboola.com Ltd", + "ticker": "M8744T106", + "sector": "未分类", + "value": 0.00301406, + "weight": 0.019568, + "shares": 602812, + "shareChange": 78383, + "changePercent": 14.9464, + "changeType": "ADDED" + }, + { + "issuer": "Proto Labs Inc", + "ticker": "743713109", + "sector": "未分类", + "value": 0.002886921, + "weight": 0.018743, + "shares": 35418, + "shareChange": -10286, + "changePercent": -22.5057, + "changeType": "REDUCED" + }, + { + "issuer": "Mobileye Global Inc", + "ticker": "60741F104", + "sector": "未分类", + "value": 0.002721087, + "weight": 0.017666, + "shares": 281104, + "shareChange": 78681, + "changePercent": 38.8696, + "changeType": "ADDED" + }, + { + "issuer": "Pagaya Technologies Ltd", + "ticker": "M7S64L123", + "sector": "未分类", + "value": 0.002693755, + "weight": 0.017489, + "shares": 147603, + "shareChange": 48542, + "changePercent": 49.0021, + "changeType": "ADDED" + }, + { + "issuer": "Radware Ltd", + "ticker": "M81873107", + "sector": "未分类", + "value": 0.002662601, + "weight": 0.017286, + "shares": 86280, + "shareChange": -5300, + "changePercent": -5.7873, + "changeType": "REDUCED" + }, + { + "issuer": "Tower Semiconductor Ltd", + "ticker": "M87915274", + "sector": "未分类", + "value": 0.002639241, + "weight": 0.017135, + "shares": 10126, + "shareChange": -7964, + "changePercent": -44.0243, + "changeType": "REDUCED" + }, + { + "issuer": "Allot Ltd", + "ticker": "M0854Q105", + "sector": "未分类", + "value": 0.00258762, + "weight": 0.0168, + "shares": 297726, + "shareChange": 95018, + "changePercent": 46.8743, + "changeType": "ADDED" + }, + { + "issuer": "TAT Technologies Ltd", + "ticker": "M8740S227", + "sector": "未分类", + "value": 0.00250893, + "weight": 0.016289, + "shares": 52284, + "shareChange": 9594, + "changePercent": 22.4736, + "changeType": "ADDED" + }, + { + "issuer": "Dentsply Sirona Inc", + "ticker": "24906P109", + "sector": "未分类", + "value": 0.002499058, + "weight": 0.016225, + "shares": 235538, + "shareChange": -31210, + "changePercent": -11.7002, + "changeType": "REDUCED" + }, + { + "issuer": "HP Inc", + "ticker": "40434L105", + "sector": "未分类", + "value": 0.002498286, + "weight": 0.01622, + "shares": 113869, + "shareChange": -8884, + "changePercent": -7.2373, + "changeType": "REDUCED" + }, + { + "issuer": "Cellebrite DI Ltd", + "ticker": "M2197Q107", + "sector": "未分类", + "value": 0.002495476, + "weight": 0.016201, + "shares": 170923, + "shareChange": 44740, + "changePercent": 35.4564, + "changeType": "ADDED" + }, + { + "issuer": "Riskified Ltd", + "ticker": "M8216R109", + "sector": "未分类", + "value": 0.002463537, + "weight": 0.015994, + "shares": 488797, + "shareChange": 14740, + "changePercent": 3.1093, + "changeType": "ADDED" + }, + { + "issuer": "RADCOM Ltd", + "ticker": "M81865111", + "sector": "未分类", + "value": 0.002456417, + "weight": 0.015948, + "shares": 174214, + "shareChange": 1479, + "changePercent": 0.8562, + "changeType": "ADDED" + }, + { + "issuer": "Ituran Location and Control Ltd", + "ticker": "M6158M104", + "sector": "未分类", + "value": 0.002448758, + "weight": 0.015898, + "shares": 40137, + "shareChange": -10388, + "changePercent": -20.5601, + "changeType": "REDUCED" + }, + { + "issuer": "Monday.com Ltd", + "ticker": "M7S64H106", + "sector": "未分类", + "value": 0.002400959, + "weight": 0.015588, + "shares": 33167, + "shareChange": 16175, + "changePercent": 95.1919, + "changeType": "ADDED" + }, + { + "issuer": "PTC Inc", + "ticker": "69370C100", + "sector": "未分类", + "value": 0.002391377, + "weight": 0.015526, + "shares": 21049, + "shareChange": 1486, + "changePercent": 7.596, + "changeType": "ADDED" + }, + { + "issuer": "AudioCodes Ltd", + "ticker": "M15342104", + "sector": "未分类", + "value": 0.00238552, + "weight": 0.015488, + "shares": 246438, + "shareChange": -8396, + "changePercent": -3.2947, + "changeType": "REDUCED" + }, + { + "issuer": "Autodesk Inc", + "ticker": "052769106", + "sector": "未分类", + "value": 0.002376979, + "weight": 0.015432, + "shares": 12226, + "shareChange": -223, + "changePercent": -1.7913, + "changeType": "REDUCED" + }, + { + "issuer": "Teva Pharmaceutical Industries", + "ticker": "881624209", + "sector": "未分类", + "value": 0.002325964, + "weight": 0.015101, + "shares": 68653, + "shareChange": 374, + "changePercent": 0.5478, + "changeType": "ADDED" + }, + { + "issuer": "Microsoft Corp", + "ticker": "594918104", + "sector": "未分类", + "value": 0.002304145, + "weight": 0.014959, + "shares": 6177, + "shareChange": -222, + "changePercent": -3.4693, + "changeType": "REDUCED" + }, + { + "issuer": "Nova Ltd", + "ticker": "M7516K103", + "sector": "未分类", + "value": 0.002291207, + "weight": 0.014875, + "shares": 4220, + "shareChange": -862, + "changePercent": -16.9618, + "changeType": "REDUCED" + }, + { + "issuer": "Playtika Holding Corp", + "ticker": "72815L107", + "sector": "未分类", + "value": 0.002284095, + "weight": 0.014829, + "shares": 614004, + "shareChange": 0, + "changePercent": 0.0, + "changeType": "UNCHANGED" + }, + { + "issuer": "Inmode Ltd", + "ticker": "M5425M103", + "sector": "未分类", + "value": 0.002240135, + "weight": 0.014544, + "shares": 153224, + "shareChange": -4502, + "changePercent": -2.8543, + "changeType": "REDUCED" + }, + { + "issuer": "Oddity Tech Ltd", + "ticker": "M7518J104", + "sector": "未分类", + "value": 0.002220388, + "weight": 0.014415, + "shares": 146754, + "shareChange": 81239, + "changePercent": 124.0006, + "changeType": "ADDED" + }, + { + "issuer": "Brainsway Ltd", + "ticker": "10501L106", + "sector": "未分类", + "value": 0.002210175, + "weight": 0.014349, + "shares": 142500, + "shareChange": -51186, + "changePercent": -26.4273, + "changeType": "REDUCED" + }, + { + "issuer": "Nayax Ltd", + "ticker": "M7S750159", + "sector": "未分类", + "value": 0.002163772, + "weight": 0.014048, + "shares": 33306, + "shareChange": -4292, + "changePercent": -11.4155, + "changeType": "REDUCED" + }, + { + "issuer": "Check Point Software Technologies Ltd", + "ticker": "M22465104", + "sector": "未分类", + "value": 0.0021176, + "weight": 0.013748, + "shares": 16112, + "shareChange": 4344, + "changePercent": 36.9137, + "changeType": "ADDED" + }, + { + "issuer": "Fiverr International Ltd", + "ticker": "M4R82T106", + "sector": "未分类", + "value": 0.002085042, + "weight": 0.013537, + "shares": 202039, + "shareChange": 73883, + "changePercent": 57.6508, + "changeType": "ADDED" + }, + { + "issuer": "Perion Network Ltd", + "ticker": "M78673114", + "sector": "未分类", + "value": 0.002058365, + "weight": 0.013364, + "shares": 211984, + "shareChange": -21876, + "changePercent": -9.3543, + "changeType": "REDUCED" + }, + { + "issuer": "Camtek Ltd", + "ticker": "M20791105", + "sector": "未分类", + "value": 0.001983702, + "weight": 0.012879, + "shares": 12161, + "shareChange": -3193, + "changePercent": -20.7959, + "changeType": "REDUCED" + }, + { + "issuer": "Cognyte Software Ltd", + "ticker": "M25133105", + "sector": "未分类", + "value": 0.00198248, + "weight": 0.012871, + "shares": 225795, + "shareChange": -15158, + "changePercent": -6.2909, + "changeType": "REDUCED" + }, + { + "issuer": "Kamada Ltd", + "ticker": "M6240T109", + "sector": "未分类", + "value": 0.001931485, + "weight": 0.01254, + "shares": 263304, + "shareChange": -6253, + "changePercent": -2.3197, + "changeType": "REDUCED" + }, + { + "issuer": "Nice Ltd", + "ticker": "653656108", + "sector": "未分类", + "value": 0.00191103, + "weight": 0.012407, + "shares": 21035, + "shareChange": 1790, + "changePercent": 9.3011, + "changeType": "ADDED" + }, + { + "issuer": "MediWound Ltd", + "ticker": "M68830112", + "sector": "未分类", + "value": 0.001860667, + "weight": 0.01208, + "shares": 126576, + "shareChange": -3385, + "changePercent": -2.6046, + "changeType": "REDUCED" + }, + { + "issuer": "Nano Dimension Ltd", + "ticker": "63008G203", + "sector": "未分类", + "value": 0.001808872, + "weight": 0.011744, + "shares": 1247498, + "shareChange": -168620, + "changePercent": -11.9072, + "changeType": "REDUCED" + }, + { + "issuer": "Compugen Ltd", + "ticker": "M25722105", + "sector": "未分类", + "value": 0.001683187, + "weight": 0.010928, + "shares": 786536, + "shareChange": -263337, + "changePercent": -25.0827, + "changeType": "REDUCED" + }, + { + "issuer": "Gilat Satellite Networks Ltd", + "ticker": "M51474118", + "sector": "未分类", + "value": 0.001578579, + "weight": 0.010249, + "shares": 118601, + "shareChange": -8310, + "changePercent": -6.5479, + "changeType": "REDUCED" + }, + { + "issuer": "Kaiser Aluminum Corp", + "ticker": "483007704", + "sector": "未分类", + "value": 0.001473094, + "weight": 0.009564, + "shares": 7530, + "shareChange": -1882, + "changePercent": -19.9958, + "changeType": "REDUCED" + }, + { + "issuer": "Wix.com Ltd", + "ticker": "M98068105", + "sector": "未分类", + "value": 0.001465995, + "weight": 0.009518, + "shares": 32312, + "shareChange": 5691, + "changePercent": 21.3779, + "changeType": "ADDED" + }, + { + "issuer": "Moog Inc", + "ticker": "615394202", + "sector": "未分类", + "value": 0.001464367, + "weight": 0.009507, + "shares": 3455, + "shareChange": -694, + "changePercent": -16.7269, + "changeType": "REDUCED" + }, + { + "issuer": "GE Aerospace", + "ticker": "369604301", + "sector": "未分类", + "value": 0.001349165, + "weight": 0.008759, + "shares": 3610, + "shareChange": -113, + "changePercent": -3.0352, + "changeType": "REDUCED" + }, + { + "issuer": "Enlivex Ltd", + "ticker": "M4130Y106", + "sector": "未分类", + "value": 0.001310264, + "weight": 0.008507, + "shares": 2382731, + "shareChange": 1754421, + "changePercent": 279.2286, + "changeType": "ADDED" + }, + { + "issuer": "Lincoln Electric Holdings Inc", + "ticker": "533900106", + "sector": "未分类", + "value": 0.001113283, + "weight": 0.007228, + "shares": 4193, + "shareChange": -417, + "changePercent": -9.0456, + "changeType": "REDUCED" + }, + { + "issuer": "AMETEK Inc", + "ticker": "031100100", + "sector": "未分类", + "value": 0.001012761, + "weight": 0.006575, + "shares": 4186, + "shareChange": -890, + "changePercent": -17.5335, + "changeType": "REDUCED" + }, + { + "issuer": "Nano-X Imaging Ltd", + "ticker": "M70700105", + "sector": "未分类", + "value": 0.000935672, + "weight": 0.006075, + "shares": 806614, + "shareChange": 73324, + "changePercent": 9.9993, + "changeType": "ADDED" + }, + { + "issuer": "Align Technology Inc", + "ticker": "016255101", + "sector": "未分类", + "value": 0.000887826, + "weight": 0.005764, + "shares": 5264, + "shareChange": -1097, + "changePercent": -17.2457, + "changeType": "REDUCED" + }, + { + "issuer": "ARK Innovation ETF", + "ticker": "00214Q104 CALL", + "sector": "未分类", + "value": 0.000719298, + "weight": 0.00467, + "shares": 8900, + "shareChange": -100, + "changePercent": -1.1111, + "changeType": "REDUCED" + }, + { + "issuer": "Octave Intelligence PLC", + "ticker": "G22845104", + "sector": "未分类", + "value": 0.000145021, + "weight": 0.000942, + "shares": 8897, + "shareChange": 8897, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "Materion Corp", + "ticker": "576690101", + "sector": "未分类", + "value": 0.000135312, + "weight": 0.000878, + "shares": 455, + "shareChange": -116, + "changePercent": -20.3152, + "changeType": "REDUCED" + }, + { + "issuer": "Carpenter Technology Corp", + "ticker": "144285103", + "sector": "未分类", + "value": 0.000109798, + "weight": 0.000713, + "shares": 178, + "shareChange": -75, + "changePercent": -29.6443, + "changeType": "REDUCED" + }, + { + "issuer": "ATI Inc", + "ticker": "01741R102", + "sector": "未分类", + "value": 9.5988e-05, + "weight": 0.000623, + "shares": 487, + "shareChange": -192, + "changePercent": -28.2769, + "changeType": "REDUCED" + }, + { + "issuer": "Jabil Inc", + "ticker": "466313103", + "sector": "未分类", + "value": 9.4443e-05, + "weight": 0.000613, + "shares": 245, + "shareChange": -92, + "changePercent": -27.2997, + "changeType": "REDUCED" + }, + { + "issuer": "3M Co", + "ticker": "88579Y101", + "sector": "未分类", + "value": 7.6098e-05, + "weight": 0.000494, + "shares": 470, + "shareChange": -27, + "changePercent": -5.4326, + "changeType": "REDUCED" + }, + { + "issuer": "Avient Corp", + "ticker": "05368V106", + "sector": "未分类", + "value": 7.4474e-05, + "weight": 0.000484, + "shares": 2015, + "shareChange": -344, + "changePercent": -14.5825, + "changeType": "REDUCED" + }, + { + "issuer": "iShares Russell 1000 Growth ETF", + "ticker": "464287614", + "sector": "未分类", + "value": 7.0792e-05, + "weight": 0.00046, + "shares": 570, + "shareChange": 354, + "changePercent": 163.8889, + "changeType": "ADDED" + }, + { + "issuer": "ARK Genomic Revolution ETF", + "ticker": "00214Q302", + "sector": "未分类", + "value": 6.9794e-05, + "weight": 0.000453, + "shares": 1659, + "shareChange": -5114, + "changePercent": -75.5057, + "changeType": "REDUCED" + }, + { + "issuer": "Kennametal Inc", + "ticker": "489170100", + "sector": "未分类", + "value": 6.9364e-05, + "weight": 0.00045, + "shares": 1979, + "shareChange": -479, + "changePercent": -19.4874, + "changeType": "REDUCED" + }, + { + "issuer": "Vanguard Growth ETF", + "ticker": "922908736", + "sector": "未分类", + "value": 6.6182e-05, + "weight": 0.00043, + "shares": 768, + "shareChange": 675, + "changePercent": 725.8065, + "changeType": "ADDED" + }, + { + "issuer": "Grayscale Ethereum Staking Min", + "ticker": "38964R203", + "sector": "未分类", + "value": 6.4328e-05, + "weight": 0.000418, + "shares": 4280, + "shareChange": -178, + "changePercent": -3.9928, + "changeType": "REDUCED" + }, + { + "issuer": "Dauch Corporation", + "ticker": "024061103", + "sector": "未分类", + "value": 3.4612e-05, + "weight": 0.000225, + "shares": 6386, + "shareChange": 405, + "changePercent": 6.7714, + "changeType": "ADDED" + }, + { + "issuer": "State Street SPDR S&P Biotech ETF", + "ticker": "78464A870", + "sector": "未分类", + "value": 1.4822e-05, + "weight": 9.6e-05, + "shares": 94, + "shareChange": 94, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "iShares Expanded Tech-Software Sector ETF", + "ticker": "464287515", + "sector": "未分类", + "value": 5.109e-06, + "weight": 3.3e-05, + "shares": 56, + "shareChange": 56, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "State Street SPDR S&P Capital Markets ETF", + "ticker": "78464A771", + "sector": "未分类", + "value": 2.775e-06, + "weight": 1.8e-05, + "shares": 19, + "shareChange": 19, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "State Street SPDR S&P Health Care Equipment ETF", + "ticker": "78464A581", + "sector": "未分类", + "value": 1.805e-06, + "weight": 1.2e-05, + "shares": 21, + "shareChange": 21, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "State Street SPDR S&P Aerospace & Defense ETF", + "ticker": "78464A631", + "sector": "未分类", + "value": 7.29e-07, + "weight": 5e-06, + "shares": 3, + "shareChange": 3, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "Fidelity MSCI Communication Services Index ETF", + "ticker": "316092873", + "sector": "未分类", + "value": 4.82e-07, + "weight": 3e-06, + "shares": 7, + "shareChange": 7, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "iShares U.S. Broker-Dealers & Securities Exchanges ETF", + "ticker": "464288794", + "sector": "未分类", + "value": 4.24e-07, + "weight": 3e-06, + "shares": 2, + "shareChange": 2, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "Brera Holdings PLC", + "ticker": "G13311116", + "sector": "未分类", + "value": 0.0, + "weight": 0.0, + "shares": 0, + "shareChange": -9687877, + "changePercent": null, + "changeType": "EXIT" + }, + { + "issuer": "Honeywell International Inc", + "ticker": "438516106", + "sector": "未分类", + "value": 0.0, + "weight": 0.0, + "shares": 0, + "shareChange": -38709, + "changePercent": null, + "changeType": "EXIT" + }, + { + "issuer": "Intercontinental Exchange Inc", + "ticker": "45866F104", + "sector": "未分类", + "value": 0.0, + "weight": 0.0, + "shares": 0, + "shareChange": -29181, + "changePercent": null, + "changeType": "EXIT" + }, + { + "issuer": "Palo Alto Networks Inc", + "ticker": "697435105", + "sector": "未分类", + "value": 0.0, + "weight": 0.0, + "shares": 0, + "shareChange": -10866, + "changePercent": null, + "changeType": "EXIT" + }, + { + "issuer": "Pinterest Inc", + "ticker": "72352L106", + "sector": "未分类", + "value": 0.0, + "weight": 0.0, + "shares": 0, + "shareChange": -36028, + "changePercent": null, + "changeType": "EXIT" + }, + { + "issuer": "Salesforce Inc", + "ticker": "79466L302", + "sector": "未分类", + "value": 0.0, + "weight": 0.0, + "shares": 0, + "shareChange": -6062, + "changePercent": null, + "changeType": "EXIT" + }, + { + "issuer": "State Street SPDR S&P 500 ETF Trust", + "ticker": "78462F103", + "sector": "未分类", + "value": 0.0, + "weight": 0.0, + "shares": 0, + "shareChange": -28, + "changePercent": null, + "changeType": "EXIT" + } + ] +} diff --git a/web/app/data/hh-portfolio.json b/web/app/data/hh-portfolio.json new file mode 100644 index 0000000..078cb1a --- /dev/null +++ b/web/app/data/hh-portfolio.json @@ -0,0 +1,240 @@ +{ + "manager": "H&H International Investment, LLC", + "managerShort": "H&H International Investment, LLC", + "cik": "0001759760", + "previousReportDate": "2026-03-31", + "reportDate": "2026-06-30", + "filedAt": "2026-08-14", + "source": "SEC 13F-HR", + "totalValue": 19.100584155, + "positionCount": 18, + "changes": { + "NEW": 1, + "ADDED": 3, + "REDUCED": 7, + "EXIT": 2, + "UNCHANGED": 7 + }, + "positions": [ + { + "issuer": "APPLE INC", + "ticker": "AAPL", + "sector": "未分类", + "value": 7.841281858, + "weight": 41.052576, + "shares": 27098707, + "shareChange": -1846900, + "changePercent": -6.3806, + "changeType": "REDUCED" + }, + { + "issuer": "BERKSHIRE HATHAWAY INC DEL", + "ticker": "BRK.B", + "sector": "未分类", + "value": 4.618447581, + "weight": 24.179614, + "shares": 9229696, + "shareChange": 81900, + "changePercent": 0.8953, + "changeType": "ADDED" + }, + { + "issuer": "PDD HOLDINGS INC", + "ticker": "PDD", + "sector": "未分类", + "value": 1.90868533, + "weight": 9.992811, + "shares": 25022094, + "shareChange": 5273800, + "changePercent": 26.7051, + "changeType": "ADDED" + }, + { + "issuer": "TESLA INC", + "ticker": "TSLA", + "sector": "未分类", + "value": 1.42179624, + "weight": 7.443732, + "shares": 3380400, + "shareChange": -28500, + "changePercent": -0.836, + "changeType": "REDUCED" + }, + { + "issuer": "NVIDIA CORPORATION", + "ticker": "NVDA", + "sector": "未分类", + "value": 1.256700261, + "weight": 6.579381, + "shares": 6280675, + "shareChange": -7563100, + "changePercent": -54.6318, + "changeType": "REDUCED" + }, + { + "issuer": "ALPHABET INC", + "ticker": "GOOG", + "sector": "未分类", + "value": 0.695565438, + "weight": 3.641592, + "shares": 1968600, + "shareChange": -1737400, + "changePercent": -46.8807, + "changeType": "REDUCED" + }, + { + "issuer": "OCCIDENTAL PETE CORP", + "ticker": "OXY", + "sector": "未分类", + "value": 0.498401055, + "weight": 2.60935, + "shares": 10261500, + "shareChange": 0, + "changePercent": 0.0, + "changeType": "UNCHANGED" + }, + { + "issuer": "MICROSOFT CORP", + "ticker": "MSFT", + "sector": "未分类", + "value": 0.281294382, + "weight": 1.4727, + "shares": 754100, + "shareChange": -261900, + "changePercent": -25.7776, + "changeType": "REDUCED" + }, + { + "issuer": "CREDO TECHNOLOGY GROUP HOLDI", + "ticker": "CRDO", + "sector": "未分类", + "value": 0.19069134, + "weight": 0.998353, + "shares": 701200, + "shareChange": -50000, + "changePercent": -6.656, + "changeType": "REDUCED" + }, + { + "issuer": "UNITEDHEALTH GROUP INC", + "ticker": "UNH", + "sector": "未分类", + "value": 0.166085748, + "weight": 0.869532, + "shares": 399600, + "shareChange": -201800, + "changePercent": -33.555, + "changeType": "REDUCED" + }, + { + "issuer": "DISNEY WALT CO", + "ticker": "DIS", + "sector": "未分类", + "value": 0.16426025, + "weight": 0.859975, + "shares": 1706600, + "shareChange": 194800, + "changePercent": 12.8853, + "changeType": "ADDED" + }, + { + "issuer": "ALIBABA GROUP HLDG LTD", + "ticker": "BABA", + "sector": "未分类", + "value": 0.028928372, + "weight": 0.151453, + "shares": 301400, + "shareChange": 301400, + "changePercent": null, + "changeType": "NEW" + }, + { + "issuer": "CIRCLE INTERNET GROUP INC", + "ticker": "CRCL", + "sector": "未分类", + "value": 0.012526, + "weight": 0.065579, + "shares": 200000, + "shareChange": 0, + "changePercent": 0.0, + "changeType": "UNCHANGED" + }, + { + "issuer": "PALANTIR TECHNOLOGIES INC", + "ticker": "PLTR", + "sector": "未分类", + "value": 0.0070002, + "weight": 0.036649, + "shares": 60000, + "shareChange": 0, + "changePercent": 0.0, + "changeType": "UNCHANGED" + }, + { + "issuer": "SYNOPSYS INC", + "ticker": "SNPS", + "sector": "未分类", + "value": 0.0044607, + "weight": 0.023354, + "shares": 10000, + "shareChange": 0, + "changePercent": 0.0, + "changeType": "UNCHANGED" + }, + { + "issuer": "SNOWFLAKE INC", + "ticker": "SNOW", + "sector": "未分类", + "value": 0.002545, + "weight": 0.013324, + "shares": 10000, + "shareChange": 0, + "changePercent": 0.0, + "changeType": "UNCHANGED" + }, + { + "issuer": "TEMPUS AI INC", + "ticker": "TEM", + "sector": "未分类", + "value": 0.0011586, + "weight": 0.006066, + "shares": 20000, + "shareChange": 0, + "changePercent": 0.0, + "changeType": "UNCHANGED" + }, + { + "issuer": "INNODATA INC", + "ticker": "INOD", + "sector": "未分类", + "value": 0.0007558, + "weight": 0.003957, + "shares": 10000, + "shareChange": 0, + "changePercent": 0.0, + "changeType": "UNCHANGED" + }, + { + "issuer": "CROWDSTRIKE HLDGS INC", + "ticker": "CRWD", + "sector": "未分类", + "value": 0.0, + "weight": 0.0, + "shares": 0, + "shareChange": -10000, + "changePercent": null, + "changeType": "EXIT" + }, + { + "issuer": "TAIWAN SEMICONDUCTOR MANUFAC", + "ticker": "TSM", + "sector": "未分类", + "value": 0.0, + "weight": 0.0, + "shares": 0, + "shareChange": -151200, + "changePercent": null, + "changeType": "EXIT" + } + ] +} diff --git a/web/app/globals.css b/web/app/globals.css index eee95ba..1ead619 100644 --- a/web/app/globals.css +++ b/web/app/globals.css @@ -316,6 +316,19 @@ footer { max-width:1360px; margin:auto; padding:25px clamp(24px,5vw,80px) 38px; .manager-live-metrics { grid-template-columns:repeat(2,1fr); }.manager-live-grid,.manager-queued-content { grid-template-columns:1fr; }.manager-portfolio-toolbar { align-items:stretch; flex-direction:column; }.manager-portfolio-list>a { grid-template-columns:60px minmax(150px,1fr) 75px 40px; }.manager-portfolio-list>a>span:nth-of-type(2) { display:none; } .manager-more>div:last-child { grid-template-columns:1fr 1fr; } } + +.manager-disclosure { + max-width:780px; + margin:18px 0 0 117px; + padding:14px 16px; + border-left:3px solid var(--gold); + background:rgba(181,139,65,.08); + color:#5d655f; + font-size:12px; + line-height:1.7; +} +.manager-disclosure strong { margin-right:10px; color:var(--forest); font-size:10px; letter-spacing:.12em; text-transform:uppercase; } +@media (max-width: 700px) { .manager-disclosure { margin-left:0; } } @media (max-width:580px) { .site-header { height:66px; } .watch-button { padding:8px 12px; font-size:12px; } diff --git a/web/app/lib/managers.ts b/web/app/lib/managers.ts index 71c52aa..5717713 100644 --- a/web/app/lib/managers.ts +++ b/web/app/lib/managers.ts @@ -10,6 +10,7 @@ export type ManagerProfile = { tags: string[]; status: ManagerStatus; coverage: string; + disclosure?: string; }; export const managerProfiles: ManagerProfile[] = [ @@ -18,6 +19,18 @@ export const managerProfiles: ManagerProfile[] = [ vehicle: "长期价值投资", description: "以长期持有、高质量企业和集中组合著称。当前已接入最新 SEC 13F 持仓快照。", tags: ["价值", "集中持仓", "长期"], status: "live", coverage: "持仓与季度变化已接入", }, + { + slug: "ark", initials: "ARK", name: "ARK Investment Management", nameZh: "ARK Invest(木头姐)", + vehicle: "颠覆式创新与成长", description: "由 Cathie Wood(木头姐)创立,以颠覆式创新主题和高频主动调仓著称。当前已接入 ARK 最新公开 SEC 13F。", + tags: ["创新成长", "科技", "主动交易"], status: "live", coverage: "ARK 公开申报持仓与季度变化已接入", + disclosure: "本页展示季度 SEC 13F 机构申报,不是实时交易记录;SPACEX 是私有证券的页面显示标识,并非交易所股票代码。", + }, + { + slug: "hh-international", initials: "H&H", name: "H&H International Investment", nameZh: "H&H International(段永平相关)", + vehicle: "长期价值与集中持仓", description: "公开数据来自 H&H International Investment 的 SEC 13F;该主体常被用于观察段永平相关的美股配置。", + tags: ["价值", "集中持仓", "中概股"], status: "live", coverage: "H&H 公开申报主体持仓与季度变化已接入", + disclosure: "本页展示 H&H International Investment 的机构申报,不代表段永平个人全部资产、其他账户或实时持仓。", + }, { slug: "bridgewater", initials: "BW", name: "Bridgewater Associates", nameZh: "桥水基金", vehicle: "全球宏观", description: "从跨资产和宏观周期视角观察机构配置,适合与价值型组合进行对照。", diff --git a/web/app/lib/portfolio-data.ts b/web/app/lib/portfolio-data.ts index b410d7c..af04a04 100644 --- a/web/app/lib/portfolio-data.ts +++ b/web/app/lib/portfolio-data.ts @@ -1,3 +1,6 @@ +import arkSnapshotData from "../data/ark-portfolio.json"; +import hhSnapshotData from "../data/hh-portfolio.json"; + export type ChangeType = "NEW" | "ADDED" | "REDUCED" | "EXIT" | "UNCHANGED"; export type Position = { @@ -108,9 +111,21 @@ export const scionPortfolioSnapshot: PortfolioSnapshot = { ], }; +export const arkPortfolioSnapshot: PortfolioSnapshot = { + ...(arkSnapshotData as unknown as PortfolioSnapshot), + managerShort: "ARK Invest(木头姐)", +}; + +export const hhPortfolioSnapshot: PortfolioSnapshot = { + ...(hhSnapshotData as unknown as PortfolioSnapshot), + managerShort: "H&H International(段永平相关)", +}; + export const portfolioSnapshotsByManager: Record = { berkshire: portfolioSnapshot, scion: scionPortfolioSnapshot, + ark: arkPortfolioSnapshot, + "hh-international": hhPortfolioSnapshot, }; export function getPortfolioSnapshotForManager(slug: string) { diff --git a/web/app/manager/[slug]/page.tsx b/web/app/manager/[slug]/page.tsx index d582f1f..8093220 100644 --- a/web/app/manager/[slug]/page.tsx +++ b/web/app/manager/[slug]/page.tsx @@ -39,6 +39,7 @@ export default async function ManagerPage({ params }: PageProps) {
投资人中心/{manager.nameZh}
{manager.initials}
{isLive ? "真实数据已接入" : "数据接入中"}

{manager.vehicle}

{manager.nameZh}

{manager.name}

{manager.description}

+ {manager.disclosure ?

数据边界{manager.disclosure}

: null}
{manager.tags.map((tag) => {tag})}
diff --git a/web/app/managers/page.tsx b/web/app/managers/page.tsx index 05084d0..de7c72e 100644 --- a/web/app/managers/page.tsx +++ b/web/app/managers/page.tsx @@ -11,7 +11,7 @@ export const metadata: Metadata = { title, description, openGraph: { title, desc export default function ManagersPage() { return
返回概览} /> -
Investor network

机构档案库

投资人中心

从单一组合走向机构网络。搜索策略、关注投资人,并查看每个数据源的接入状态。

+
Investor network

机构档案库

投资人中心

从单一组合走向机构网络。搜索策略、关注投资人,并查看每个数据源的接入状态。

FolioPulse · 投资人档案网络关注状态仅保存在当前设备
; diff --git a/web/tests/rendered-html.test.mjs b/web/tests/rendered-html.test.mjs index bb4cb74..0efe25f 100644 --- a/web/tests/rendered-html.test.mjs +++ b/web/tests/rendered-html.test.mjs @@ -49,6 +49,8 @@ for (const [path, heading, description] of [ for (const [path, title, description, visibleCopy] of [ ["/manager/berkshire", "伯克希尔·哈撒韦|FolioPulse", "Berkshire Hathaway:以长期持有、高质量企业和集中组合著称。当前已接入最新 SEC 13F 持仓快照。", "前五大持仓"], ["/manager/scion", "Scion 资产管理|FolioPulse", "Scion Asset Management:关注逆向机会、估值错配和高确信度仓位。当前已接入其最新公开 SEC 13F,并明确标注期权方向。", "PLTR PUT"], + ["/manager/ark", "ARK Invest(木头姐)|FolioPulse", "ARK Investment Management:由 Cathie Wood(木头姐)创立,以颠覆式创新主题和高频主动调仓著称。当前已接入 ARK 最新公开 SEC 13F。", "TSLA"], + ["/manager/hh-international", "H&H International(段永平相关)|FolioPulse", "H&H International Investment:公开数据来自 H&H International Investment 的 SEC 13F;该主体常被用于观察段永平相关的美股配置。", "不代表段永平个人全部资产"], ["/manager/bridgewater", "桥水基金|FolioPulse", "Bridgewater Associates:从跨资产和宏观周期视角观察机构配置,适合与价值型组合进行对照。", "原始文件正在排队接入"], ]) { test(`renders ${path} with manager-specific metadata`, async () => { @@ -66,6 +68,8 @@ for (const [path, title, description] of [ ["/holding/AAPL", "AAPL 持仓未变|FolioPulse", "APPLE INC:2026-03-31 至 2026-06-30 的持仓量、变化量与披露市值。"], ["/holding/GOOGL", "GOOGL 增持|FolioPulse", "ALPHABET INC:2026-03-31 至 2026-06-30 的持仓量、变化量与披露市值。"], ["/holding/PLTR%20PUT?manager=scion", "PLTR PUT 新建仓|FolioPulse", "PALANTIR TECHNOLOGIES INC:2025-06-30 至 2025-09-30 的持仓量、变化量与披露市值。"], + ["/holding/TSLA?manager=ark", "TSLA 减持|FolioPulse", "Tesla Inc:2026-03-31 至 2026-06-30 的持仓量、变化量与披露市值。"], + ["/holding/AAPL?manager=hh-international", "AAPL 减持|FolioPulse", "APPLE INC:2026-03-31 至 2026-06-30 的持仓量、变化量与披露市值。"], ]) { test(`renders ${path} with record-specific metadata`, async () => { const response = await render(path); From 2ad31c01df0d850c378fee2c23cab490a9488aef Mon Sep 17 00:00:00 2001 From: lch262 Date: Fri, 21 Aug 2026 23:04:28 +0800 Subject: [PATCH 2/3] feat: add four live managers and flat visual system --- README.md | 370 +- web/app/Dashboard.tsx | 459 +- web/app/components/FollowManagerButton.tsx | 53 +- web/app/components/ManagerIcon.tsx | 27 + web/app/components/SiteHeader.tsx | 57 +- web/app/data/appaloosa-portfolio.json | 449 + web/app/data/bridgewater-portfolio.json | 13297 ++++++++++++ web/app/data/duquesne-portfolio.json | 1318 ++ web/app/data/pershing-portfolio.json | 152 + web/app/globals.css | 867 +- web/app/lib/managers.ts | 72 +- web/app/lib/portfolio-data.ts | 260 +- web/app/manager/[slug]/page.tsx | 112 +- web/app/managers/ManagerDirectory.tsx | 120 +- web/app/managers/page.tsx | 35 +- web/package-lock.json | 20766 ++++++++++--------- web/package.json | 1 + web/tests/rendered-html.test.mjs | 161 +- 18 files changed, 26995 insertions(+), 11581 deletions(-) create mode 100644 web/app/components/ManagerIcon.tsx create mode 100644 web/app/data/appaloosa-portfolio.json create mode 100644 web/app/data/bridgewater-portfolio.json create mode 100644 web/app/data/duquesne-portfolio.json create mode 100644 web/app/data/pershing-portfolio.json diff --git a/README.md b/README.md index 4a38107..ddf8173 100644 --- a/README.md +++ b/README.md @@ -1,187 +1,189 @@ -# FolioPulse - -> [在线试用 FolioPulse](https://folio-pulse-dashboard.lch262.chatgpt.site/) · [提交问题或建议](https://github.com/lch262/folio-pulse/issues/new/choose) · [参与产品讨论](https://github.com/lch262/folio-pulse/discussions) - -FolioPulse 是一个 SEC 13F 数据引擎与可视化仪表盘。它从 SEC EDGAR 读取机构最近两份 +# FolioPulse + +> [在线试用 FolioPulse](https://folio-pulse-dashboard.lch262.chatgpt.site/) · [提交问题或建议](https://github.com/lch262/folio-pulse/issues/new/choose) · [参与产品讨论](https://github.com/lch262/folio-pulse/discussions) + +FolioPulse 是一个 SEC 13F 数据引擎与可视化仪表盘。它从 SEC EDGAR 读取机构最近两份 **原始** `13F-HR`,生成标准化持仓、季度变化和可浏览的投资人档案。目前已接入伯克希尔、 -Scion、ARK Invest(木头姐)与 H&H International(段永平相关)的真实公开快照。 - -`13F-HR/A` 修订申报会被忽略,避免把修订文件误当成新的季度。 - -## 公开试用 - -无需安装即可打开[在线仪表盘](https://folio-pulse-dashboard.lch262.chatgpt.site/)。建议重点体验: - -- 从投资人中心切换伯克希尔、Scion、ARK 与 H&H,核对报告期和提交日期; -- 搜索持仓,并按新建、增持、减持和清仓筛选季度动作; -- 打开单项持仓详情,检查跳转、移动端显示和数据解释是否清楚; -- 对不准确的数据、难理解的文案或希望增加的机构提出建议。 - -发现问题请使用[反馈模板](https://github.com/lch262/folio-pulse/issues/new/choose);想讨论产品方向、机构优先级或界面方案,请前往 [Discussions](https://github.com/lch262/folio-pulse/discussions)。提交反馈时不要粘贴 Token、密码、邮箱验证码或其他敏感信息。 - -## 要求 - -- Python 3.10 或更高版本 -- 不需要 SEC API Key -- 不需要第三方运行时依赖 - -SEC 要求自动请求声明带有联系信息的 `User-Agent`。PowerShell 示例: - -```powershell -$env:FOLIOPULSE_SEC_USER_AGENT = "FolioPulse your-email@example.com" -python -m backend.main 0001067983 -``` - -不填写 CIK 时,默认使用 Berkshire Hathaway: - -```powershell -python -m backend.main -``` - -也可以直接传入 User-Agent,并输出 JSON: - -```powershell -python -m backend.main 0001067983 ` - --user-agent "FolioPulse your-email@example.com" ` - --json -``` - -下载并解析最新一期完整持仓: - -```powershell -python -m backend.main 0001067983 ` - --holdings-output data/berkshire_latest.json -``` - -程序会自动读取 filing 目录,识别根元素为 `informationTable` 的 XML,并把每行 -转换成包含 issuer、CUSIP、可选 FIGI、shares、value 和 voting authority 的 JSON。 - -SEC 从 2023 年 1 月 3 日起把 13F `value` 改为按美元报告;程序会把旧 filing -的千美元数值乘以 1,000,统一输出 `value_usd`。13F Information Table 通常不含 -ticker,因此当前版本不会猜测股票代码,ticker 映射留到后续版本。 - -比较最近两个季度并导出变化: - -```powershell -python -m backend.main 0001067983 ` - --changes-output data/berkshire_changes.json -``` - -变化引擎先按 `CUSIP + Put/Call + SH/PRN` 合并同一证券的拆分行,再根据报告 -数量分类: - -- `NEW`:上一季度没有,本季度出现 -- `ADDED`:本季度数量增加 -- `REDUCED`:本季度数量减少 -- `UNCHANGED`:数量未变 -- `EXIT`:上一季度存在,本季度消失 - -比较使用 shares/principal amount,而不是随股价变化的市值。每条变化同时输出 -previous/current amount、差额、百分比和两期报告市值。 - -生成可直接导入网站的快照: - -```powershell -python -m backend.main 0001067983 ` - --web-snapshot-output data/berkshire_web_snapshot.json ` - --ticker-map data/tickers.json -``` - -`--ticker-map` 是可选的 CUSIP 到 ticker JSON 对象;未提供映射的证券会以 CUSIP -作为显示代码,不会猜测 ticker。快照会计算组合权重、带入五类季度变化,并保留 -已清仓证券,同时写入相邻两个报告期日期。登录 FolioPulse 后点击右上角“导入快照” -即可写入持久化数据库;页面可查看上季持仓、本季持仓、股份变化量并展开单股详情。 - -## 监控新的 13F - -先执行一次检查并建立基线: - -```powershell -python -m backend.filing_watcher 0001067983 --once -``` - -首次运行会显示 `INITIALIZED`,并把最新 accession 写入 -`data/watcher_state.json`,不会把已有 filing 误报成新事件。再次检查时,相同 -accession 显示 `UNCHANGED`;检测到更晚的 filing 时显示 `NEW_FILING`。 - -持续监控,默认每 60 秒检查一次: - -```powershell -python -m backend.filing_watcher 0001067983 -``` - -可用 `Ctrl+C` 安全停止。也可以通过 `--interval 120` 调整轮询秒数,或使用 -`--json` 输出单行 JSON 事件。Watcher 使用同一个 `FOLIOPULSE_SEC_USER_AGENT` -环境变量,并且状态文件已被 `.gitignore` 排除。 - -## 预期输出 - -```text -FolioPulse SEC Tracker - -Fund: BERKSHIRE HATHAWAY INC -CIK: 0001067983 - -Latest 13F-HR -Form: 13F-HR -Report period: ... -Filed: ... -Accession: ... -Primary document: ... -URL: ... - -Previous 13F-HR -... -``` - -## 测试 - -测试全部使用固定的本地样本,不会请求 SEC: - -```powershell -python -m unittest discover -s tests -v -``` - -测试覆盖 CIK 规范化、排除修订申报、历史 submissions 文件、无 13F 结果, -SEC 限流、Information Table 发现、XML 命名空间、可选 FIGI、数值单位转换和 -持仓 JSON 导出,以及重复行聚合、期权分离和五类季度变化。 -Watcher 测试还覆盖首次基线、无变化、新 filing、旧结果保护和损坏状态保护。 - -## 可视化仪表盘 - -`web/` 是面向用户的 FolioPulse 仪表盘,包含组合概览、前五大持仓、季度信号、 -变化筛选、公司搜索与 `/api/portfolio` JSON 接口。页面现在从 D1 持久化数据库 -读取快照;数据库首次使用时写入明确标记的演示数据。登录且获授权的管理员可以 -通过 `POST /api/portfolio` 导入标准化快照,前端会自动读取最新报告期。 - -```powershell -cd web -npm install -npm run dev -``` - -打开 `http://localhost:3000`。生产构建使用 `npm run build`。 - -## 当前范围 - -- [x] 规范化为十位 CIK -- [x] 请求 filer submissions JSON -- [x] 找到最近两份原始 `13F-HR` -- [x] 输出人类可读文本或 JSON -- [x] 离线单元测试 -- [x] 定位并解析 13F Information Table(V0.02) -- [x] 输出标准化持仓 JSON -- [x] 比较季度持仓并分类变化(V0.03) -- [x] 输出季度 changes JSON -- [x] 监控新的原始 13F-HR(V0.04) -- [x] 原子保存 watcher accession 状态 -- [x] 面向用户的响应式持仓仪表盘(V0.05) -- [x] 持仓变化筛选与公司搜索 -- [x] Portfolio JSON 接口 -- [x] D1 持久化基金、申报与持仓数据(V0.06) -- [x] 受账号权限保护的持仓快照导入接口 -- [x] Python SEC 数据到网站快照的转换器(V0.07) -- [x] 管理员 JSON 导入界面与动态调仓信号 -- [x] 多机构档案、按 CIK 隔离读取与 Scion 真实 13F 快照(V0.08) +Scion、ARK Invest(木头姐)、H&H International(段永平相关)、桥水、潘兴广场、 +Appaloosa 与 Duquesne 的真实公开快照。 + +`13F-HR/A` 修订申报会被忽略,避免把修订文件误当成新的季度。 + +## 公开试用 + +无需安装即可打开[在线仪表盘](https://folio-pulse-dashboard.lch262.chatgpt.site/)。建议重点体验: + +- 从投资人中心切换八家机构,核对各自报告期和提交日期; +- 搜索持仓,并按新建、增持、减持和清仓筛选季度动作; +- 打开单项持仓详情,检查跳转、移动端显示和数据解释是否清楚; +- 对不准确的数据、难理解的文案或希望增加的机构提出建议。 + +发现问题请使用[反馈模板](https://github.com/lch262/folio-pulse/issues/new/choose);想讨论产品方向、机构优先级或界面方案,请前往 [Discussions](https://github.com/lch262/folio-pulse/discussions)。提交反馈时不要粘贴 Token、密码、邮箱验证码或其他敏感信息。 + +## 要求 + +- Python 3.10 或更高版本 +- 不需要 SEC API Key +- 不需要第三方运行时依赖 + +SEC 要求自动请求声明带有联系信息的 `User-Agent`。PowerShell 示例: + +```powershell +$env:FOLIOPULSE_SEC_USER_AGENT = "FolioPulse your-email@example.com" +python -m backend.main 0001067983 +``` + +不填写 CIK 时,默认使用 Berkshire Hathaway: + +```powershell +python -m backend.main +``` + +也可以直接传入 User-Agent,并输出 JSON: + +```powershell +python -m backend.main 0001067983 ` + --user-agent "FolioPulse your-email@example.com" ` + --json +``` + +下载并解析最新一期完整持仓: + +```powershell +python -m backend.main 0001067983 ` + --holdings-output data/berkshire_latest.json +``` + +程序会自动读取 filing 目录,识别根元素为 `informationTable` 的 XML,并把每行 +转换成包含 issuer、CUSIP、可选 FIGI、shares、value 和 voting authority 的 JSON。 + +SEC 从 2023 年 1 月 3 日起把 13F `value` 改为按美元报告;程序会把旧 filing +的千美元数值乘以 1,000,统一输出 `value_usd`。13F Information Table 通常不含 +ticker,因此当前版本不会猜测股票代码,ticker 映射留到后续版本。 + +比较最近两个季度并导出变化: + +```powershell +python -m backend.main 0001067983 ` + --changes-output data/berkshire_changes.json +``` + +变化引擎先按 `CUSIP + Put/Call + SH/PRN` 合并同一证券的拆分行,再根据报告 +数量分类: + +- `NEW`:上一季度没有,本季度出现 +- `ADDED`:本季度数量增加 +- `REDUCED`:本季度数量减少 +- `UNCHANGED`:数量未变 +- `EXIT`:上一季度存在,本季度消失 + +比较使用 shares/principal amount,而不是随股价变化的市值。每条变化同时输出 +previous/current amount、差额、百分比和两期报告市值。 + +生成可直接导入网站的快照: + +```powershell +python -m backend.main 0001067983 ` + --web-snapshot-output data/berkshire_web_snapshot.json ` + --ticker-map data/tickers.json +``` + +`--ticker-map` 是可选的 CUSIP 到 ticker JSON 对象;未提供映射的证券会以 CUSIP +作为显示代码,不会猜测 ticker。快照会计算组合权重、带入五类季度变化,并保留 +已清仓证券,同时写入相邻两个报告期日期。登录 FolioPulse 后点击右上角“导入快照” +即可写入持久化数据库;页面可查看上季持仓、本季持仓、股份变化量并展开单股详情。 + +## 监控新的 13F + +先执行一次检查并建立基线: + +```powershell +python -m backend.filing_watcher 0001067983 --once +``` + +首次运行会显示 `INITIALIZED`,并把最新 accession 写入 +`data/watcher_state.json`,不会把已有 filing 误报成新事件。再次检查时,相同 +accession 显示 `UNCHANGED`;检测到更晚的 filing 时显示 `NEW_FILING`。 + +持续监控,默认每 60 秒检查一次: + +```powershell +python -m backend.filing_watcher 0001067983 +``` + +可用 `Ctrl+C` 安全停止。也可以通过 `--interval 120` 调整轮询秒数,或使用 +`--json` 输出单行 JSON 事件。Watcher 使用同一个 `FOLIOPULSE_SEC_USER_AGENT` +环境变量,并且状态文件已被 `.gitignore` 排除。 + +## 预期输出 + +```text +FolioPulse SEC Tracker + +Fund: BERKSHIRE HATHAWAY INC +CIK: 0001067983 + +Latest 13F-HR +Form: 13F-HR +Report period: ... +Filed: ... +Accession: ... +Primary document: ... +URL: ... + +Previous 13F-HR +... +``` + +## 测试 + +测试全部使用固定的本地样本,不会请求 SEC: + +```powershell +python -m unittest discover -s tests -v +``` + +测试覆盖 CIK 规范化、排除修订申报、历史 submissions 文件、无 13F 结果, +SEC 限流、Information Table 发现、XML 命名空间、可选 FIGI、数值单位转换和 +持仓 JSON 导出,以及重复行聚合、期权分离和五类季度变化。 +Watcher 测试还覆盖首次基线、无变化、新 filing、旧结果保护和损坏状态保护。 + +## 可视化仪表盘 + +`web/` 是面向用户的 FolioPulse 仪表盘,包含组合概览、前五大持仓、季度信号、 +变化筛选、公司搜索与 `/api/portfolio` JSON 接口。页面现在从 D1 持久化数据库 +读取快照;数据库首次使用时写入明确标记的演示数据。登录且获授权的管理员可以 +通过 `POST /api/portfolio` 导入标准化快照,前端会自动读取最新报告期。 + +```powershell +cd web +npm install +npm run dev +``` + +打开 `http://localhost:3000`。生产构建使用 `npm run build`。 + +## 当前范围 + +- [x] 规范化为十位 CIK +- [x] 请求 filer submissions JSON +- [x] 找到最近两份原始 `13F-HR` +- [x] 输出人类可读文本或 JSON +- [x] 离线单元测试 +- [x] 定位并解析 13F Information Table(V0.02) +- [x] 输出标准化持仓 JSON +- [x] 比较季度持仓并分类变化(V0.03) +- [x] 输出季度 changes JSON +- [x] 监控新的原始 13F-HR(V0.04) +- [x] 原子保存 watcher accession 状态 +- [x] 面向用户的响应式持仓仪表盘(V0.05) +- [x] 持仓变化筛选与公司搜索 +- [x] Portfolio JSON 接口 +- [x] D1 持久化基金、申报与持仓数据(V0.06) +- [x] 受账号权限保护的持仓快照导入接口 +- [x] Python SEC 数据到网站快照的转换器(V0.07) +- [x] 管理员 JSON 导入界面与动态调仓信号 +- [x] 多机构档案、按 CIK 隔离读取与 Scion 真实 13F 快照(V0.08) - [x] 机构持仓搜索、动作筛选与机构专属单项详情 - [x] ARK 与 H&H 最新公开 13F 快照、独立档案与数据边界说明(V0.09) +- [x] 八家机构全量接入与 Apple 风格扁平化界面(V0.10) diff --git a/web/app/Dashboard.tsx b/web/app/Dashboard.tsx index 7382f76..57127eb 100644 --- a/web/app/Dashboard.tsx +++ b/web/app/Dashboard.tsx @@ -1,235 +1,228 @@ -"use client"; - +"use client"; + import { Fragment, useEffect, useMemo, useRef, useState, type ChangeEvent } from "react"; +import { ArrowRight, CalendarDays, Search } from "lucide-react"; +import ManagerIcon from "./components/ManagerIcon"; import SiteHeader from "./components/SiteHeader"; -import { managerProfiles } from "./lib/managers"; -import { portfolioSnapshot, type ChangeType, type PortfolioSnapshot } from "./lib/portfolio-data"; - -const filters: Array<{ key: "ALL" | ChangeType; label: string }> = [ - { key: "ALL", label: "全部" }, { key: "NEW", label: "新建仓" }, - { key: "ADDED", label: "增持" }, { key: "REDUCED", label: "减持" }, - { key: "EXIT", label: "清仓" }, -]; - -const changeLabels: Record = { - NEW: "新建仓", ADDED: "增持", REDUCED: "减持", EXIT: "清仓", UNCHANGED: "未变", -}; - -type SortKey = "value" | "weight" | "shares" | "shareChange"; -type SortDirection = "asc" | "desc"; - -function money(value: number) { return value === 0 ? "—" : `$${value.toFixed(2)}B`; } -function compactShares(value: number) { - const abs = Math.abs(value); - if (abs >= 100000000) return `${(value / 100000000).toFixed(2)}亿`; - if (abs >= 10000) return `${(value / 10000).toFixed(1)}万`; - return value.toLocaleString("zh-CN"); -} - -function dateLabel(value: string) { - const [year, month, day] = value.split("-"); - return year && month && day ? `${year}.${month}.${day}` : value; -} - -function previousShares(shares: number, shareChange: number) { - return Math.max(0, shares - shareChange); -} - -function Icon({ name }: { name: "search" | "arrow" | "calendar" }) { - const paths = { - search: <>, - arrow: <>, - calendar: <>, - }; - return ; -} - -export default function Dashboard() { - const [filter, setFilter] = useState<"ALL" | ChangeType>("ALL"); - const [query, setQuery] = useState(""); - const [onlyChanged, setOnlyChanged] = useState(false); - const [sortKey, setSortKey] = useState("value"); - const [sortDirection, setSortDirection] = useState("desc"); - const [density, setDensity] = useState<"comfortable" | "compact">("comfortable"); - const [expandedKey, setExpandedKey] = useState(null); - const [snapshot, setSnapshot] = useState(portfolioSnapshot); - const [storageStatus, setStorageStatus] = useState("正在连接数据层"); - const [importState, setImportState] = useState<"idle" | "uploading" | "success" | "error">("idle"); - const [importMessage, setImportMessage] = useState(""); - const importInput = useRef(null); - - useEffect(() => { - let active = true; - fetch("/api/portfolio") - .then((response) => response.json()) - .then((payload) => { - if (!active || !payload?.data) return; - setSnapshot(payload.data); - setStorageStatus(payload.meta?.status === "persistent" ? "持久化快照" : "演示快照"); - const requestedTicker = new URLSearchParams(window.location.search).get("ticker"); - if (requestedTicker) { - setQuery(requestedTicker); - setExpandedKey(requestedTicker); - } - }) - .catch(() => active && setStorageStatus("演示快照")); - return () => { active = false; }; - }, []); - - const positions = useMemo(() => { - const normalized = query.trim().toLowerCase(); - const direction = sortDirection === "asc" ? 1 : -1; - return snapshot.positions - .filter((item) => - (filter === "ALL" || item.changeType === filter) && - (!onlyChanged || item.changeType !== "UNCHANGED") && - (!normalized || item.ticker.toLowerCase().includes(normalized) || item.issuer.toLowerCase().includes(normalized))) - .sort((left, right) => { - const leftValue = sortKey === "shareChange" ? Math.abs(left.shareChange) : left[sortKey]; - const rightValue = sortKey === "shareChange" ? Math.abs(right.shareChange) : right[sortKey]; - return (leftValue - rightValue) * direction || left.ticker.localeCompare(right.ticker); - }); - }, [filter, onlyChanged, query, snapshot, sortDirection, sortKey]); - - const signals = useMemo( - () => snapshot.positions.filter((item) => item.changeType !== "UNCHANGED").slice(0, 3), - [snapshot], - ); - - function toggleSort(nextKey: SortKey) { - if (sortKey === nextKey) setSortDirection((value) => value === "desc" ? "asc" : "desc"); - else { - setSortKey(nextKey); - setSortDirection("desc"); - } - } - - function clearFilters() { - setFilter("ALL"); - setOnlyChanged(false); - setQuery(""); - } - - async function importSnapshot(event: ChangeEvent) { - const file = event.target.files?.[0]; - event.target.value = ""; - if (!file) return; - if (file.size > 5 * 1024 * 1024) { - setImportState("error"); - setImportMessage("文件超过 5 MB,请确认选择的是网站快照 JSON。 "); - return; - } - setImportState("uploading"); - setImportMessage("正在验证并导入快照…"); - try { - const payload = JSON.parse(await file.text()); - const response = await fetch("/api/portfolio", { - method: "POST", - headers: { "content-type": "application/json" }, - body: JSON.stringify(payload), - }); - const result = await response.json(); - if (!response.ok) throw new Error(result.error || "导入失败。"); - setSnapshot(result.data); - setFilter("ALL"); - setOnlyChanged(false); - setQuery(""); - setExpandedKey(null); - setStorageStatus("已导入快照"); - setImportState("success"); - setImportMessage(`已导入 ${result.data.reportDate} 报告期,共 ${result.data.positionCount} 个持仓。`); - } catch (error) { - setImportState("error"); - setImportMessage(error instanceof Error ? error.message : "无法读取该 JSON 文件。"); - } - } - - return ( -
- - - - } /> - -
-
SEC 13F 追踪 · {storageStatus}
-
-

机构持仓档案

{snapshot.managerShort}

把难读的监管文件,变成一眼看懂的持仓变化。

-
-
最新报告期{snapshot.reportDate}
-
提交日期{snapshot.filedAt}
-
{snapshot.source}CIK {snapshot.cik}
-
-
-
- -
-
Investor network

追踪更多投资人

从伯克希尔开始,把不同投资策略放进同一个机构网络。

打开投资人中心 →
- -
- -
-
-
披露持仓市值${snapshot.totalValue.toFixed(2)}B约 {(snapshot.totalValue * 10).toLocaleString("zh-CN")} 亿美元
-
持仓数量{snapshot.positionCount}本季度披露标的
-
新建 / 增持{snapshot.changes.NEW + snapshot.changes.ADDED}{snapshot.changes.NEW} 笔新建仓 · {snapshot.changes.ADDED} 笔增持
-
减持 / 清仓{snapshot.changes.REDUCED + snapshot.changes.EXIT}{snapshot.changes.REDUCED} 笔减持 · {snapshot.changes.EXIT} 笔清仓
-
- -
- - -
- 本季信号

资金动作速览

-
{signals.map((item, index) => { - const signalClass = item.changeType === "NEW" ? "new" : item.changeType === "ADDED" ? "up" : "down"; - const signalMark = item.changeType === "NEW" ? "N" : item.changeType === "ADDED" ? "↗" : "↘"; - const detail = item.changePercent === null ? money(item.value) : `${item.changePercent > 0 ? "+" : ""}${item.changePercent.toFixed(2)}%`; - return {signalMark}{changeLabels[item.changeType]} {item.ticker}{item.issuer} · {detail}; - })}
- 查看完整调仓记录 -
-
- -
-
完整明细

持仓与变化

比较 {dateLabel(snapshot.previousReportDate)} → {dateLabel(snapshot.reportDate)} · 于 {dateLabel(snapshot.filedAt)} 披露

-
-
{filters.map((item) => )}
-
- -
- {(filter !== "ALL" || onlyChanged || query) && } -
-
-
{positions.length} 个结果 · 点击列名排序,点击公司展开完整变化
-
- {positions.map((item, index) => { - const rowKey = `${item.ticker}-${item.changeType}-${index}`; - const oldShares = previousShares(item.shares, item.shareChange); - const expanded = expandedKey === item.ticker; - return - - - - - - {expanded && }; - })} -
公司 / 代码变化与周期
{changeLabels[item.changeType]}{dateLabel(snapshot.previousReportDate)} → {dateLabel(snapshot.reportDate)}{compactShares(item.shares)}上季 {compactShares(oldShares)} 0 ? "gain" : item.shareChange < 0 ? "loss" : ""}`}>{item.shareChange === 0 ? "—" : `${item.shareChange > 0 ? "+" : ""}${compactShares(item.shareChange)}`}{item.changePercent !== null && item.changePercent !== 0 && {item.changePercent > 0 ? "+" : ""}{item.changePercent.toFixed(2)}%}{money(item.value)}{item.weight ? `${item.weight.toFixed(2)}%` : "—"}
-
上季持仓{compactShares(oldShares)}{dateLabel(snapshot.previousReportDate)}
0 ? "gain" : item.shareChange < 0 ? "loss" : ""}`}>{item.shareChange === 0 ? "持仓未变" : `${item.shareChange > 0 ? "+" : ""}${compactShares(item.shareChange)}`}
本季持仓{compactShares(item.shares)}{dateLabel(snapshot.reportDate)}
-
SEC 披露日期{dateLabel(snapshot.filedAt)}
股份变动比例 0 ? "gain" : item.shareChange < 0 ? "loss" : ""}>{item.changePercent === null ? (item.changeType === "NEW" ? "新建仓" : item.changeType === "EXIT" ? "已清仓" : "—") : `${item.changePercent > 0 ? "+" : ""}${item.changePercent.toFixed(2)}%`}
本季组合权重{item.weight ? `${item.weight.toFixed(2)}%` : "—"}
当前披露市值{money(item.value)}
打开 {item.ticker} 独立详情页 →
-
{positions.length === 0 &&
没有符合条件的持仓
}
-
-
- -
数据口径

来自原始文件,不靠二手摘要

FolioPulse 读取 SEC EDGAR 的原始 13F-HR 与信息表,按 CUSIP 聚合后比较相邻季度。13F 最长可滞后 45 天,页面只用于研究,不构成投资建议。

查看完整数据说明 →
- {importMessage &&
{importState === "success" ? "导入完成" : importState === "error" ? "导入未完成" : "正在处理"}{importMessage}
} -
FolioPulse · 让机构持仓更易读v0.7 · 投资人网络已启用
-
- ); -} +import { managerProfiles } from "./lib/managers"; +import { portfolioSnapshot, type ChangeType, type PortfolioSnapshot } from "./lib/portfolio-data"; + +const filters: Array<{ key: "ALL" | ChangeType; label: string }> = [ + { key: "ALL", label: "全部" }, { key: "NEW", label: "新建仓" }, + { key: "ADDED", label: "增持" }, { key: "REDUCED", label: "减持" }, + { key: "EXIT", label: "清仓" }, +]; + +const changeLabels: Record = { + NEW: "新建仓", ADDED: "增持", REDUCED: "减持", EXIT: "清仓", UNCHANGED: "未变", +}; + +type SortKey = "value" | "weight" | "shares" | "shareChange"; +type SortDirection = "asc" | "desc"; + +function money(value: number) { return value === 0 ? "—" : `$${value.toFixed(2)}B`; } +function compactShares(value: number) { + const abs = Math.abs(value); + if (abs >= 100000000) return `${(value / 100000000).toFixed(2)}亿`; + if (abs >= 10000) return `${(value / 10000).toFixed(1)}万`; + return value.toLocaleString("zh-CN"); +} + +function dateLabel(value: string) { + const [year, month, day] = value.split("-"); + return year && month && day ? `${year}.${month}.${day}` : value; +} + +function previousShares(shares: number, shareChange: number) { + return Math.max(0, shares - shareChange); +} + +export default function Dashboard() { + const [filter, setFilter] = useState<"ALL" | ChangeType>("ALL"); + const [query, setQuery] = useState(""); + const [onlyChanged, setOnlyChanged] = useState(false); + const [sortKey, setSortKey] = useState("value"); + const [sortDirection, setSortDirection] = useState("desc"); + const [density, setDensity] = useState<"comfortable" | "compact">("comfortable"); + const [expandedKey, setExpandedKey] = useState(null); + const [snapshot, setSnapshot] = useState(portfolioSnapshot); + const [storageStatus, setStorageStatus] = useState("正在连接数据层"); + const [importState, setImportState] = useState<"idle" | "uploading" | "success" | "error">("idle"); + const [importMessage, setImportMessage] = useState(""); + const importInput = useRef(null); + + useEffect(() => { + let active = true; + fetch("/api/portfolio") + .then((response) => response.json()) + .then((payload) => { + if (!active || !payload?.data) return; + setSnapshot(payload.data); + setStorageStatus(payload.meta?.status === "persistent" ? "持久化快照" : "演示快照"); + const requestedTicker = new URLSearchParams(window.location.search).get("ticker"); + if (requestedTicker) { + setQuery(requestedTicker); + setExpandedKey(requestedTicker); + } + }) + .catch(() => active && setStorageStatus("演示快照")); + return () => { active = false; }; + }, []); + + const positions = useMemo(() => { + const normalized = query.trim().toLowerCase(); + const direction = sortDirection === "asc" ? 1 : -1; + return snapshot.positions + .filter((item) => + (filter === "ALL" || item.changeType === filter) && + (!onlyChanged || item.changeType !== "UNCHANGED") && + (!normalized || item.ticker.toLowerCase().includes(normalized) || item.issuer.toLowerCase().includes(normalized))) + .sort((left, right) => { + const leftValue = sortKey === "shareChange" ? Math.abs(left.shareChange) : left[sortKey]; + const rightValue = sortKey === "shareChange" ? Math.abs(right.shareChange) : right[sortKey]; + return (leftValue - rightValue) * direction || left.ticker.localeCompare(right.ticker); + }); + }, [filter, onlyChanged, query, snapshot, sortDirection, sortKey]); + + const signals = useMemo( + () => snapshot.positions.filter((item) => item.changeType !== "UNCHANGED").slice(0, 3), + [snapshot], + ); + + function toggleSort(nextKey: SortKey) { + if (sortKey === nextKey) setSortDirection((value) => value === "desc" ? "asc" : "desc"); + else { + setSortKey(nextKey); + setSortDirection("desc"); + } + } + + function clearFilters() { + setFilter("ALL"); + setOnlyChanged(false); + setQuery(""); + } + + async function importSnapshot(event: ChangeEvent) { + const file = event.target.files?.[0]; + event.target.value = ""; + if (!file) return; + if (file.size > 5 * 1024 * 1024) { + setImportState("error"); + setImportMessage("文件超过 5 MB,请确认选择的是网站快照 JSON。 "); + return; + } + setImportState("uploading"); + setImportMessage("正在验证并导入快照…"); + try { + const payload = JSON.parse(await file.text()); + const response = await fetch("/api/portfolio", { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify(payload), + }); + const result = await response.json(); + if (!response.ok) throw new Error(result.error || "导入失败。"); + setSnapshot(result.data); + setFilter("ALL"); + setOnlyChanged(false); + setQuery(""); + setExpandedKey(null); + setStorageStatus("已导入快照"); + setImportState("success"); + setImportMessage(`已导入 ${result.data.reportDate} 报告期,共 ${result.data.positionCount} 个持仓。`); + } catch (error) { + setImportState("error"); + setImportMessage(error instanceof Error ? error.message : "无法读取该 JSON 文件。"); + } + } + + return ( +
+ + + + } /> + +
+
SEC 13F 追踪 · {storageStatus}
+
+

机构持仓档案

{snapshot.managerShort}

把难读的监管文件,变成一眼看懂的持仓变化。

+
+
最新报告期{snapshot.reportDate}
+
提交日期{snapshot.filedAt}
+
+
+
+
+ +
+
Investor network

追踪更多投资人

从伯克希尔开始,把不同投资策略放进同一个机构网络。

打开投资人中心 →
+ +
+ +
+
+
披露持仓市值${snapshot.totalValue.toFixed(2)}B约 {(snapshot.totalValue * 10).toLocaleString("zh-CN")} 亿美元
+
持仓数量{snapshot.positionCount}本季度披露标的
+
新建 / 增持{snapshot.changes.NEW + snapshot.changes.ADDED}{snapshot.changes.NEW} 笔新建仓 · {snapshot.changes.ADDED} 笔增持
+
减持 / 清仓{snapshot.changes.REDUCED + snapshot.changes.EXIT}{snapshot.changes.REDUCED} 笔减持 · {snapshot.changes.EXIT} 笔清仓
+
+ +
+ + +
+ 本季信号

资金动作速览

+
{signals.map((item, index) => { + const signalClass = item.changeType === "NEW" ? "new" : item.changeType === "ADDED" ? "up" : "down"; + const signalMark = item.changeType === "NEW" ? "N" : item.changeType === "ADDED" ? "↗" : "↘"; + const detail = item.changePercent === null ? money(item.value) : `${item.changePercent > 0 ? "+" : ""}${item.changePercent.toFixed(2)}%`; + return {signalMark}{changeLabels[item.changeType]} {item.ticker}{item.issuer} · {detail}; + })}
+ 查看完整调仓记录 +
+
+ +
+
完整明细

持仓与变化

比较 {dateLabel(snapshot.previousReportDate)} → {dateLabel(snapshot.reportDate)} · 于 {dateLabel(snapshot.filedAt)} 披露

+
+
{filters.map((item) => )}
+
+ +
+ {(filter !== "ALL" || onlyChanged || query) && } +
+
+
{positions.length} 个结果 · 点击列名排序,点击公司展开完整变化
+
+ {positions.map((item, index) => { + const rowKey = `${item.ticker}-${item.changeType}-${index}`; + const oldShares = previousShares(item.shares, item.shareChange); + const expanded = expandedKey === item.ticker; + return + + + + + + {expanded && }; + })} +
公司 / 代码变化与周期
{changeLabels[item.changeType]}{dateLabel(snapshot.previousReportDate)} → {dateLabel(snapshot.reportDate)}{compactShares(item.shares)}上季 {compactShares(oldShares)} 0 ? "gain" : item.shareChange < 0 ? "loss" : ""}`}>{item.shareChange === 0 ? "—" : `${item.shareChange > 0 ? "+" : ""}${compactShares(item.shareChange)}`}{item.changePercent !== null && item.changePercent !== 0 && {item.changePercent > 0 ? "+" : ""}{item.changePercent.toFixed(2)}%}{money(item.value)}{item.weight ? `${item.weight.toFixed(2)}%` : "—"}
+
上季持仓{compactShares(oldShares)}{dateLabel(snapshot.previousReportDate)}
0 ? "gain" : item.shareChange < 0 ? "loss" : ""}`}>{item.shareChange === 0 ? "持仓未变" : `${item.shareChange > 0 ? "+" : ""}${compactShares(item.shareChange)}`}
本季持仓{compactShares(item.shares)}{dateLabel(snapshot.reportDate)}
+
SEC 披露日期{dateLabel(snapshot.filedAt)}
股份变动比例 0 ? "gain" : item.shareChange < 0 ? "loss" : ""}>{item.changePercent === null ? (item.changeType === "NEW" ? "新建仓" : item.changeType === "EXIT" ? "已清仓" : "—") : `${item.changePercent > 0 ? "+" : ""}${item.changePercent.toFixed(2)}%`}
本季组合权重{item.weight ? `${item.weight.toFixed(2)}%` : "—"}
当前披露市值{money(item.value)}
打开 {item.ticker} 独立详情页 →
+
{positions.length === 0 &&
没有符合条件的持仓
}
+
+
+ +
数据口径

来自原始文件,不靠二手摘要

FolioPulse 读取 SEC EDGAR 的原始 13F-HR 与信息表,按 CUSIP 聚合后比较相邻季度。13F 最长可滞后 45 天,页面只用于研究,不构成投资建议。

查看完整数据说明 →
+ {importMessage &&
{importState === "success" ? "导入完成" : importState === "error" ? "导入未完成" : "正在处理"}{importMessage}
} +
FolioPulse · 让机构持仓更易读v0.7 · 投资人网络已启用
+
+ ); +} diff --git a/web/app/components/FollowManagerButton.tsx b/web/app/components/FollowManagerButton.tsx index 736e0ad..124e8e4 100644 --- a/web/app/components/FollowManagerButton.tsx +++ b/web/app/components/FollowManagerButton.tsx @@ -1,28 +1,29 @@ -"use client"; - +"use client"; + import { useEffect, useState } from "react"; - -const storageKey = "folio-pulse-followed-managers"; - -function readFollowed() { - try { return new Set(JSON.parse(localStorage.getItem(storageKey) || "[]")); } - catch { return new Set(); } -} - -export default function FollowManagerButton({ slug }: { slug: string }) { - const [followed, setFollowed] = useState(false); - - useEffect(() => { - const timer = window.setTimeout(() => setFollowed(readFollowed().has(slug)), 0); - return () => window.clearTimeout(timer); - }, [slug]); - - function toggle() { - const values = readFollowed(); - if (values.has(slug)) values.delete(slug); else values.add(slug); - localStorage.setItem(storageKey, JSON.stringify([...values])); - setFollowed(values.has(slug)); - } - - return ; +import { Check, Heart } from "lucide-react"; + +const storageKey = "folio-pulse-followed-managers"; + +function readFollowed() { + try { return new Set(JSON.parse(localStorage.getItem(storageKey) || "[]")); } + catch { return new Set(); } +} + +export default function FollowManagerButton({ slug }: { slug: string }) { + const [followed, setFollowed] = useState(false); + + useEffect(() => { + const timer = window.setTimeout(() => setFollowed(readFollowed().has(slug)), 0); + return () => window.clearTimeout(timer); + }, [slug]); + + function toggle() { + const values = readFollowed(); + if (values.has(slug)) values.delete(slug); else values.add(slug); + localStorage.setItem(storageKey, JSON.stringify([...values])); + setFollowed(values.has(slug)); + } + + return ; } diff --git a/web/app/components/ManagerIcon.tsx b/web/app/components/ManagerIcon.tsx new file mode 100644 index 0000000..a0fa248 --- /dev/null +++ b/web/app/components/ManagerIcon.tsx @@ -0,0 +1,27 @@ +import { + Aperture, + Building2, + ChartNoAxesCombined, + Gem, + Landmark, + Orbit, + Sparkles, + Telescope, + type LucideIcon, +} from "lucide-react"; + +const managerIcons: Record = { + berkshire: Landmark, + ark: Sparkles, + "hh-international": Gem, + bridgewater: Orbit, + scion: Aperture, + "pershing-square": Building2, + appaloosa: ChartNoAxesCombined, + duquesne: Telescope, +}; + +export default function ManagerIcon({ slug, size = 22 }: { slug: string; size?: number }) { + const Icon = managerIcons[slug] ?? Building2; + return