Agentic Research

This article is not yet available in English. You are reading the Traditional Chinese original. The English edition will appear here once it is translated.

Browse articles that do have an English edition

持股拓撲與防雙計:集團架構下的持股計算

2026/09/3018 min readBryan Chan閱讀中文原文
Topics持股結構投資研究圖分析AI Agent港股

問一個 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.309.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% 之間的差距,正是集團槓桿的本質:用較少的經濟權益支配較多的表決權。分析一家公司的治理風險時,這個差距本身就是核心指標——差距越大,控股股東與小股東的利益偏離空間越大。

三個進階注意點:

  1. 控制判斷不只是比例。董事會構成、一致行動協議、股權分散度(30% 在分散股權下可能已是控制性持股)、否決權安排,都可能改變結論。比例只是起點,證據在章程與協議裡。
  2. 控制鏈斷裂要逐層檢查。任何一層不構成控制,表決權歸屬就在該層截斷,不能繼續向上歸屬。
  3. 披露口徑可能更複雜。各司法管轄區的權益披露制度對「視為擁有權益」(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 分鐘快速盡調流程。

下一步