問一個 AI Agent「某大股東實際持有目標公司多少權益」,它很可能把披露文件裡出現過的幾個百分比加一加給你答案:直接持股若干、透過甲公司持有若干、透過乙公司持有若干——加總輸出,語氣篤定,數字全錯。集團架構下的持股計算有自己的代數:經濟權益沿路徑相乘、表決權沿控制鏈歸屬、交叉持股要聯立求解。任何一步用成加法,結果不是高估就是雙計。
這篇文章的目標是把持股結構從「一段文字描述」變成「一個可查詢、可驗證的圖」:節點是實體,邊是持股關係與比例,每條邊帶參考日與來源。你會得到:三種權益口徑的區分、逐層稀釋的計算方法(含逐步演算的虛構教學結構)、交叉與循環持股的正確處理、一致行動人線索的辨識框架、可執行的 Python 圖計算程式碼,以及一份防雙計檢查點清單。文中所有實體、比例與文件編號均為虛構,僅供教學,不對應任何真實公司;實際個案的權益披露口徑涉及各司法管轄區的法律界定,必須諮詢合格法律與合規顧問(見 投研 AI 的合規邊界)。
一、為什麼集團架構會造成重複計算
重複計算的根源是同一份權益在多條路徑上被數了兩次,或不同性質的百分比被當同質加總。常見觸發情境:
| 情境 | 結構 | 錯誤算法 | 正確處理 |
|---|---|---|---|
| 多層持有 | 甲→乙→目標 | 把各層比例相加 | 沿路徑相乘(逐層稀釋) |
| 直接+間接並存 | 大股東直接持目標,又經子公司持目標 | 只算直接、或把間接當直接加 | 兩條路徑分別計算後加總(路徑間不重疊時才可加) |
| 交叉持股 | 甲持乙、乙持甲 | 各自單獨計算再相加 | 聯立求解或按合併抵銷邏輯處理 |
| 循環持股 | 甲→乙→丙→甲 | 圖遍歷無限循環或漏算 | 檢測環,環內權益聯立求解 |
| 多種證券 | 普通股+可轉債+認股權證 | 折算口徑混用 | 分口徑登記:現持股數 vs 全面攤薄 |
| 代持/信託 | 名義持有人與實益擁有人分離 | 只按登記名義計算 | 分別登記名義邊與實益邊,口徑註明 |
在計算之前,先固定三個口徑的區分——所有錯誤加總,本質上都是把這三者混為一談:
經濟權益(economic interest):沿所有路徑逐層相乘後加總,
回答「最終歸屬到這個主體的現金流份額是多少」
表決權歸屬(voting attribution):沿控制鏈歸屬,
回答「這個主體能實際支配目標公司多少投票權」
披露口徑權益(disclosure interest):法規定義的「權益」,
回答「披露文件上應該/已經報多少」——口徑由法規界定,
可能包含衍伸工具、可能與前兩者都不同
三者對同一結構會給出不同數字,且都「對」——錯的是不聲明口徑就比較或加總。
二、經濟權益:逐層相乘,不是相加
看一個三層虛構教學結構(實體與比例均為假設,僅供演示計算邏輯):
陳先生 ──60%──▶ 控股A ──55%──▶ 中間B ──30%──▶ 目標T
│ ▲
└────────────────── 5%(直接持股)──────────────┘
陳先生對目標 T 的經濟權益,等於所有獨立路徑的乘積之和:
路徑一(間接):陳先生 → 控股A → 中間B → 目標T
0.60 × 0.55 × 0.30 = 0.099 → 9.9%
路徑二(直接):陳先生 → 目標T
0.05 → 5.0%
經濟權益 = 9.9% + 5.0% = 14.9%
對照三種典型錯法:
| 錯法 | 結果 | 錯在哪 |
|---|---|---|
| 全部相加:60%+55%+30%+5% | 150% | 不同標的的比例根本不可加,荒謬但 AI 真會輸出 |
| 間接當直接:30%+5% | 35% | 忽略了陳先生對控股A、中間B 的逐層稀釋 |
| 只乘不加:0.60×0.55×0.30 | 9.9% | 漏掉直接持股路徑 |
兩條計算紀律:路徑內相乘、路徑間相加;相加的前提是路徑不重疊(同一份權益沒有被兩條路徑各數一次——交叉持股下這個前提會被打破,見第四節)。另一個容易漏的點:若中間層發行了可轉債或期權,全面攤薄口徑下每一層的比例都會變,逐層稀釋必須在同一攤薄口徑下計算。
三、表決權與控制鏈:為什麼不能一路乘到底
經濟權益回答「分多少錢」,表決權回答「管多少事」,兩套算法完全不同。表決權的歸屬邏輯是控制鏈:若主體 X 控制實體 Y(能支配 Y 的表決行為),則 Y 持有的目標公司股份所附表決權,歸屬計算到 X 名下。
沿用上面的虛構結構(教學假設:持股過半即構成控制,真實控制判斷遠比這複雜):
陳先生持控股A 60% → 控制控股A
控股A 持中間B 55% → 控制中間B
中間B 持目標T 30% → 30% 通常不構成對 T 的控制,
但這 30% 的投票權由中間B 行使,而中間B 受陳先生控制
表決權歸屬:陳先生可支配的目標T 表決權 = 30%(經中間B)+ 5%(直接)= 35%
經濟權益:仍為 14.9%
35% 與 14.9% 之間的差距,正是集團槓桿的本質:用較少的經濟權益支配較多的表決權。分析一家公司的治理風險時,這個差距本身就是核心指標——差距越大,控股股東與小股東的利益偏離空間越大。
三個進階注意點:
- 控制判斷不只是比例。董事會構成、一致行動協議、股權分散度(30% 在分散股權下可能已是控制性持股)、否決權安排,都可能改變結論。比例只是起點,證據在章程與協議裡。
- 控制鏈斷裂要逐層檢查。任何一層不構成控制,表決權歸屬就在該層截斷,不能繼續向上歸屬。
- 披露口徑可能更複雜。各司法管轄區的權益披露制度對「視為擁有權益」(deemed interest)的定義涵蓋信託、代持、衍伸工具等情形,與本文的教學簡化不同;觸發披露義務的門檻與計算方式,必須以現行法規與法律意見為準——本站不引用具體條文,原因見 投研 AI 的合規邊界。
四、交叉持股與循環持股:抵銷與聯立的代數
交叉持股下「路徑不重疊」的前提失效:甲持乙 40%、乙持甲 25%,甲的權益裡含乙的權益,乙的權益裡又含甲的權益——同一份價值被互相包含,任何「一遍過」的手工計算都會錯。
用虛構數字演示(教學假設值):設甲公司自身業務淨值 a₀ = 100、乙公司自身業務淨值 b₀ = 80,互持比例如上。含互持權益的帳面價值滿足聯立方程:
a = a₀ + 0.40 × b
b = b₀ + 0.25 × a
代入求解:a = 100 + 0.40 × (80 + 0.25a) = 132 + 0.10a
→ 0.9a = 132 → a ≈ 146.7,b ≈ 116.7
對照「一遍過」算法:a ≈ 100 + 0.40 × 80 = 132
—— 忽略了乙持有的甲權益又回流進甲自身,少算了循環部分
等價的工程做法是迭代收斂(上式迭代數十次即收斂到同一組解),但必須顯式處理環:先做環檢測,環內權益聯立或迭代求解,環外照常逐層相乘。合併報表層面,互持股份按抵銷邏輯處理(子公司持有母公司的股份視同庫藏股性質,不重複計入集團對外權益)——本文只給方向,具體會計處理以適用準則為準。
循環持股(甲→乙→丙→甲)同理,且更依賴代碼:三元以上環的聯立方程手算極易出錯,圖算法+線性求解是標準做法。實務上遇到循環結構,還要多問一層:這個環是歷史遺留、家族安排,還是有意的治理設計?環本身往往就是值得寫進研究筆記的發現。
五、一致行動人與關聯方:AI 只輸出線索,不下結論
披露制度通常要求把一致行動人的權益合併計算。「誰是一致行動人」是法律界定,但其辨識線索是研究功夫,可以讓 AI 系統性地收集:
| 線索類型 | 具體訊號 | 資料來源 |
|---|---|---|
| 親屬關係 | 持股自然人之間的家族關聯 | 披露文件、年報董事簡歷、公司註冊資料 |
| 人事交叉 | 共同董事、高管互任、同一公司秘書 | 董事名冊、年報管治章節 |
| 資金安排 | 股份質押的質權人是另一持股方、互為擔保、共同借款人 | 披露文件、年報附註 |
| 行為一致 | 股東會上歷史投票紀錄一致、同步增持減持 | 會議投票結果公告、權益變動時間序列 |
| 地址與註冊 | 註冊地址相同、同一註冊代理 | 公司註冊資料 |
輸出紀律必須寫死在系統裡:每條線索帶來源指針,結論欄永遠是「待法律判斷」。AI 輸出「甲乙構成一致行動人,合計權益 X%」這種定性結論,是越權且危險的——它可能錯,而且錯了之後會以確定的語氣錯(這類行為模式見 LLM Agent 自主繞過流程約束的實證分析)。線索彙總表的正確形態是:「存在以下 N 條關聯線索(逐條附來源),是否構成一致行動關係需法律意見」。
六、把持股結構建成可查詢的圖
一次性計算用紙筆,持續研究要用圖。資料模型只有兩種物件:
# 節點:實體
NODES = {
"chen": {"name": "陳先生(虛構)", "type": "person"},
"holdco_a": {"name": "控股A(虛構)", "type": "private"},
"midco_b": {"name": "中間B(虛構)", "type": "private"},
"target_t": {"name": "目標T(虛構)", "type": "listed"},
}
# 邊:持股關係。每條邊強制攜帶 pct、證券類型、參考日、來源——缺一不收
EDGES = [
{"src": "chen", "dst": "holdco_a", "pct": 0.60,
"security": "ordinary", "as_of": "2026-06-30", "source": "DI-0001(虛構)"},
{"src": "holdco_a", "dst": "midco_b", "pct": 0.55,
"security": "ordinary", "as_of": "2026-06-30", "source": "AR-2025(虛構)"},
{"src": "midco_b", "dst": "target_t", "pct": 0.30,
"security": "ordinary", "as_of": "2026-06-30", "source": "DI-0002(虛構)"},
{"src": "chen", "dst": "target_t", "pct": 0.05,
"security": "ordinary", "as_of": "2026-06-30", "source": "DI-0003(虛構)"},
]
def economic_interest(edges, root, target):
"""路徑內相乘、路徑間相加;先驗環,有環必須另行聯立求解"""
adj = {}
for e in edges:
adj.setdefault(e["src"], []).append((e["dst"], e["pct"]))
assert not has_cycle(adj), "檢測到循環持股:禁止直接遍歷,改用聯立/迭代求解"
paths = []
def dfs(node, acc, trail):
for nxt, pct in adj.get(node, []):
if nxt in trail: # 路徑內防重訪
continue
new_trail = trail + [nxt]
if nxt == target:
paths.append((acc * pct, new_trail))
dfs(nxt, acc * pct, new_trail)
dfs(root, 1.0, [root])
total = sum(p for p, _ in paths)
return total, paths # 回傳總權益+每條路徑的明細,供人工覆核
def has_cycle(adj):
WHITE, GRAY, BLACK = 0, 1, 2
color = {n: WHITE for n in adj}
def visit(u):
color[u] = GRAY
for v, _ in adj.get(u, []):
c = color.get(v, WHITE)
if c == GRAY or (c == WHITE and visit(v)):
return True
color[u] = BLACK
return False
return any(color[n] == WHITE and visit(n) for n in list(adj))
三個工程要點。第一,每條邊帶 as_of 與 source:持股是時變的,沒有參考日的比例是無法定義的數字;邊更新時保留歷史版本而不是覆蓋,時間序列本身就是研究素材。第二,環檢測是硬前置:有環即拒算,逼著流程走聯立求解分支——用斷言把「最容易錯的地方」變成「不可能悄悄錯的地方」。第三,輸出帶路徑明細:只給總數 14.9% 不可覆核,給出「9.9%(陳→A→B→T)+5.0%(陳→T)」才能被挑戰。
資料來源方面,港股的權益披露、年報股東章節與董事持股可以從披露易與年報 PDF 系統性取得,批量獲取的實作見 Webb-Site 港股研究工具 與 港股調研資訊源地圖。
七、防雙計檢查點:機械驗證清單
把前面的紀律收斂成一份每次計算後強制執行的檢查清單,其中大部分可以寫成代碼斷言:
□ 口徑聲明:本次計算的輸出口徑(經濟權益/表決權歸屬/披露口徑)已顯式標註
□ 乘法紀律:路徑內相乘、路徑間相加;不存在任何跨層比例的直接相加
□ 路徑不重疊:相加的各路徑無共享邊;有共享即觸發雙計排查
□ 環檢測:圖中無環,或有環部分已走聯立/迭代求解分支並留計算記錄
□ as_of 一致:參與同一計算的所有邊參考日一致;不一致的邊已剔除或標註
□ 證券口徑:普通股與可轉債/認股權證/期權分列;攤薄口徑全程一致
□ 入邊總和檢查:每個節點的入邊比例合計 ≤ 100%(代持與庫藏股口徑需單獨解釋)
□ 交叉驗證:計算結果與披露文件數字比對;差異能定位到口徑差或時點差,
而不是「未知差異」
□ 輸出帶路徑明細與每條邊的來源指針
最後一條交叉驗證值得展開:你的圖算出來某主體經濟權益 14.9%,披露文件報的權益比例是另一個數字——這不是誰錯了,而是口徑不同(披露口徑可能含衍伸工具、可能按視為權益歸屬)。差異必須能被解釋到具體口徑項;解釋不了的差異,就是圖裡有漏邊或錯邊的信號,回到資料來源重查。防雙計的最高形態不是算得小心,而是永遠有一個獨立來源跟你對帳。
八、AI 會在這裡出錯:八種模式與防禦
| AI 的典型錯誤 | 表現 | 防禦 |
|---|---|---|
| 跨層比例直接相加 | 「合計持有 150%」或把間接持股當直接加 | 加法只發生在路徑間,由代碼強制;模型輸出中出現比例相加即判失敗 |
| 經濟權益與表決權混淆 | 用 35% 的表決權歸屬數字回答「實際擁有多少權益」 | 輸出 schema 強制口徑欄位,三口徑分開回傳 |
| 無視參考日 | 混用三年前年報與上週披露的比例 | 每條邊 as_of 必填,計算前一致性斷言 |
| 只用年報、漏披露文件 | 持股已變動但圖仍是舊的 | 資訊源清單固定包含權益披露;邊更新觸發重算 |
| 編造最終控制人 | 憑「合理推斷」補全圖中缺失的中間層 | 缺邊就是缺邊:輸出「結構不完整」而非猜測;補邊必須有新來源 |
| 交叉持股當單向 | 只算甲持乙,漏乙持甲 | 環檢測硬前置 |
| 名義與實益混同 | 把代持/託管邊當實益邊計入 | 邊帶 nature 欄位(實益/名義),口徑分開統計 |
| 越權下法律結論 | 輸出「構成一致行動人」「觸發強制要約」 | 系統層面禁止:定性欄位只能由人工複核填寫 |
這份清單的共同底層邏輯,與本站對金融 AI 的一貫立場相同:假設模型會編,所以每個數字都要有來源、每步計算都要可重放、每個結論都要能被獨立方法交叉檢查。持股拓撲恰好是這條立場的最佳示範場景——它的正確算法是完全機械的,於是任何偏差都無所遁形。把這套「機械可驗證」的紀律推廣到整個投研系統,見 自建投研系統;單家公司快速摸底時怎麼用持股結構排雷,見 30 分鐘快速盡調流程。
下一步
- Webb-Site 港股研究工具:批量取得年報與持股資料的實務工具
- 港股調研資訊源地圖:披露易、年報與第三方資料源的完整地圖
- LLM Agent 自主繞過流程約束的實證分析:為什麼「文字約定」約束不了模型,驗證必須是外部代碼
- 投研 AI 的合規邊界:披露口徑、一致行動人認定等法律問題的正確請教方式
- 自建投研系統:把持股圖納入系統級資料層與驗證門控