Taiwan Equity Research Coverage

作者 reason-machines2384a003145a无许可证83 个星标收录于 2026年10月8日更新于 2026年10月8日仓库3个月前更新

Structured equity research database for 1,735 Taiwan-listed companies with wikilink knowledge graph, supply chain mapping, and financial data tools.

AI 生成的概览

维护覆盖 1,735 家台湾上市公司的结构化股票研究数据库,含 wikilink 知识图谱与供应链映射。

功能
提供台湾上市公司股票研究数据库的说明与 Python 脚本命令,覆盖 99 个行业、1,735 家公司。支持新增个股报告、通过 yfinance 刷新财务与估值数据、按主题或热词标记公司、审计报告质量,以及重建 wikilink 索引、主题投资筛选和 D3.js 网络图。产出包括 markdown 个股报告、wikilink 索引、主题页面和交互式网络可视化。
适用场景
适用于研究台湾上市公司、梳理供应链或技术生态、按主题筛选公司,或维护与审计个股报告数据库。适合批量数据刷新和台湾股票知识图谱探索。
运行要求
需要克隆 My-TW-Coverage 仓库并安装 yfinance、pandas 和 tabulate;获取财务数据需要网络访问。该技能本身仅为说明文档,不附带脚本,但文档中介绍了仓库内的脚本。

Taiwan Equity Research Coverage (My-TW-Coverage)

Skill by ara.so — Daily 2026 Skills collection.

A structured equity research database covering 1,735 Taiwan-listed companies (TWSE + OTC) across 99 industry sectors. Each report contains a business overview, supply chain mapping, customer/supplier relationships, and financial data — all cross-referenced through 4,900+ wikilinks forming a searchable knowledge graph.

Installation

bash
git clone https://github.com/Timeverse/My-TW-Coveragecd My-TW-Coveragepip install yfinance pandas tabulate

Project Structure

My-TW-Coverage/├── Pilot_Reports/             # 1,735 ticker reports across 99 sectors│   ├── Semiconductors/        # 155 tickers│   ├── Electronic Components/ # 267 tickers│   ├── Computer Hardware/     # 114 tickers│   └── ... (99 sector folders)├── scripts/│   ├── utils.py               # Shared utilities│   ├── add_ticker.py          # Generate new ticker reports│   ├── update_financials.py   # Refresh financial tables + valuation│   ├── update_valuation.py    # Refresh valuation multiples only (fast)│   ├── update_enrichment.py   # Update business descriptions from JSON│   ├── audit_batch.py         # Quality auditing│   ├── discover.py            # Buzzword → related companies search│   ├── build_wikilink_index.py# Rebuild WIKILINKS.md index│   ├── build_themes.py        # Generate thematic investment screens│   └── build_network.py       # Generate D3.js network graph├── WIKILINKS.md               # Auto-generated browsable wikilink index├── network/index.html         # Interactive D3.js wikilink network├── themes/                    # Thematic investment screens (auto-generated)└── task.md                    # Batch definitions and progress tracking

Report Format

Each ticker report is a markdown file at Pilot_Reports/<Sector>/<TICKER>_<Name>.md:

markdown
# 2330 - [[台積電]]
## 業務簡介**板塊:** Technology**產業:** Semiconductors**市值:** 47,326,857 百萬台幣**企業價值:** 44,978,990 百萬台幣
台積電為全球最大晶圓代工廠,專注於 [[CoWoS]]、[[3奈米]] 先進製程...
## 供應鏈位置**上游:** [[ASML]], [[Applied Materials]], [[SUMCO]]**中游:** **台積電** (晶圓代工)**下游:** [[Apple]], [[NVIDIA]], [[AMD]], [[Broadcom]]
## 主要客戶及供應商### 主要客戶- [[Apple]], [[NVIDIA]], [[AMD]], [[Qualcomm]]
### 主要供應商- [[ASML]], [[Tokyo Electron]], [[Shin-Etsu]]
## 財務概況### 估值指標| P/E (TTM) | Forward P/E | P/S (TTM) | P/B | EV/EBITDA ||-----------|-------------|-----------|-----|-----------|| 28.5      | 22.1        | 9.3       | 7.2 | 16.4      |
### 年度財務數據[Annual 3-year financial table with 14 metrics]
### 季度財務數據[Quarterly 4-quarter financial table]

Key Commands

Add a New Ticker

bash
# Basic (auto-detect sector)python scripts/add_ticker.py 2330 台積電
# With explicit sectorpython scripts/add_ticker.py 2330 台積電 --sector Semiconductors

Update Financial Data

bash
# Single tickerpython scripts/update_financials.py 2330
# Multiple tickerspython scripts/update_financials.py 2330 2454 3034
# By batch number (see task.md for batch definitions)python scripts/update_financials.py --batch 101
# By sectorpython scripts/update_financials.py --sector Semiconductors
# All 1,735 tickers (slow)python scripts/update_financials.py

Update Valuation Only (~3x Faster)

Refreshes only P/E, Forward P/E, P/S, P/B, EV/EBITDA, and stock price — skips full financial statement re-fetch.

bash
python scripts/update_valuation.py 2330python scripts/update_valuation.py --batch 101python scripts/update_valuation.py --sector Semiconductorspython scripts/update_valuation.py                          # All tickers

Discover Companies by Buzzword

Find every Taiwan-listed company related to a theme or technology:

bash
# Basic searchpython scripts/discover.py "液冷散熱"
# Auto-detect relevant sectors (skips banks/insurance/real estate for tech terms)python scripts/discover.py "液冷散熱" --smart
# Tag matching companies with [[wikilinks]] in their reportspython scripts/discover.py "液冷散熱" --apply
# Apply + rebuild themes + rebuild network graphpython scripts/discover.py "液冷散熱" --apply --rebuild
# Limit to a specific sectorpython scripts/discover.py "液冷散熱" --sector Semiconductors

Common buzzword examples:

  • "CoWoS" — TSMC advanced packaging supply chain
  • "HBM" — High Bandwidth Memory ecosystem
  • "電動車" — EV component suppliers
  • "AI 伺服器" — AI server supply chain (148 companies)
  • "光阻液" — Photoresist suppliers and consumers
  • "碳化矽" — Silicon carbide (SiC) companies

Update Enrichment Content (Bulk AI Research)

Prepare a JSON file, then apply to specific tickers, batches, or sectors:

bash
python scripts/update_enrichment.py --data enrichment.json 2330python scripts/update_enrichment.py --data enrichment.json --batch 101python scripts/update_enrichment.py --data enrichment.json --sector Semiconductors

Enrichment JSON format:

json
{  "2330": {    "desc": "台積電為全球最大晶圓代工廠,專注於 [[CoWoS]]、[[3奈米]] 先進製程,為 [[Apple]]、[[NVIDIA]] 等科技巨頭提供晶片製造服務。",    "supply_chain": "**上游:**\n- [[ASML]] (EUV 微影設備)\n- [[Applied Materials]] (薄膜沉積)\n**中游:**\n- **台積電** (晶圓代工)\n**下游:**\n- [[Apple]]\n- [[NVIDIA]]",    "cust": "### 主要客戶\n- [[Apple]] (約25%營收)\n- [[NVIDIA]]\n- [[AMD]]\n\n### 主要供應商\n- [[ASML]]\n- [[Tokyo Electron]]"  },  "2454": {    "desc": "...",    "supply_chain": "...",    "cust": "..."  }}

Audit Report Quality

bash
# Single batchpython scripts/audit_batch.py 101 -v
# All batchespython scripts/audit_batch.py --all -v

Audit checks:

  • Minimum 8 wikilinks per report
  • No generic terms in brackets (e.g. [[公司]], [[產品]])
  • No placeholder text remaining
  • No English text in Chinese-language sections
  • Metadata completeness (板塊, 產業, 市值, 企業價值)
  • Section depth (業務簡介, 供應鏈位置, 主要客戶及供應商, 財務概況 all present)

Rebuild Wikilink Index

bash
python scripts/build_wikilink_index.py

Regenerates WIKILINKS.md — a browsable index of all 4,900+ wikilinks categorized as Technologies, Materials, Applications, and Companies. Run after any enrichment update.

Generate Thematic Investment Screens

bash
# Build all 20 themespython scripts/build_themes.py
# Single themepython scripts/build_themes.py "CoWoS"
# List available themespython scripts/build_themes.py --list

Output in themes/ — each page shows companies grouped by upstream/midstream/downstream role.

Generate Interactive Network Graph

bash
# Default: min 5 co-occurrencespython scripts/build_network.py
# Fewer edges for cleaner viewpython scripts/build_network.py --min-weight 10
# Only top 200 nodespython scripts/build_network.py --top 200

Opens network/index.html in browser — D3.js force-directed graph. Node colors:

  • 🔴 Red = Taiwan company
  • 🔵 Blue = International company
  • 🟢 Green = Technology
  • 🟠 Orange = Material
  • 🟣 Purple = Application

Wikilink Graph — Core Feature

The wikilink graph is what makes this database powerful. Every [[entity]] in every report creates edges in a knowledge graph.

Search by entity to find related companies:

SearchResultsInsight
[[Apple]]207 companiesApple's full Taiwan supplier network
[[NVIDIA]]277 companiesNVIDIA's Taiwan supply chain
[[台積電]]469 companiesTaiwan semiconductor ecosystem
[[CoWoS]]39 companiesTSMC advanced packaging players
[[AI 伺服器]]148 companiesAI server supply chain
[[PCB]]263 companiesPrinted circuit board ecosystem
[[電動車]]223 companiesEV component suppliers

Browse: Open WIKILINKS.md for the full categorized index.

Code Examples

Read and Parse a Report

python
import refrom pathlib import Path
def get_report(ticker: str, reports_dir: str = "Pilot_Reports") -> dict:    """Find and parse a ticker report."""    base = Path(reports_dir)    # Find the file across all sector subdirectories    matches = list(base.rglob(f"{ticker}_*.md"))    if not matches:        return {}        content = matches[0].read_text(encoding="utf-8")        # Extract all wikilinks    wikilinks = re.findall(r'\[\[([^\]]+)\]\]', content)        # Extract sector metadata    sector_match = re.search(r'\*\*產業:\*\*\s*(.+)', content)    board_match = re.search(r'\*\*板塊:\*\*\s*(.+)', content)        return {        "ticker": ticker,        "file": str(matches[0]),        "sector": sector_match.group(1).strip() if sector_match else None,        "board": board_match.group(1).strip() if board_match else None,        "wikilinks": list(set(wikilinks)),        "wikilink_count": len(set(wikilinks)),        "content": content    }
# Usagereport = get_report("2330")print(f"Sector: {report['sector']}")print(f"Wikilinks ({report['wikilink_count']}): {report['wikilinks'][:10]}")

Build a Custom Wikilink Index

python
import refrom pathlib import Pathfrom collections import defaultdict
def build_wikilink_index(reports_dir: str = "Pilot_Reports") -> dict:    """    Returns: {entity: [list of tickers that mention it]}    """    index = defaultdict(list)        for md_file in Path(reports_dir).rglob("*.md"):        # Extract ticker from filename (e.g. "2330_台積電.md" -> "2330")        ticker = md_file.stem.split("_")[0]        content = md_file.read_text(encoding="utf-8")        wikilinks = set(re.findall(r'\[\[([^\]]+)\]\]', content))                for link in wikilinks:            index[link].append(ticker)        # Sort by mention count    return dict(sorted(index.items(), key=lambda x: len(x[1]), reverse=True))
# Find all companies in Apple's supply chainindex = build_wikilink_index()apple_suppliers = index.get("Apple", [])print(f"Apple supply chain: {len(apple_suppliers)} companies")print(apple_suppliers[:20])
# Find companies involved in CoWoScowos_companies = index.get("CoWoS", [])print(f"\nCoWoS ecosystem: {len(cowos_companies)} companies: {cowos_companies}")

Find Supply Chain Overlaps Between Two Entities

python
def supply_chain_overlap(entity_a: str, entity_b: str, reports_dir: str = "Pilot_Reports"):    """Find tickers that appear in both entities' supply chains."""    index = build_wikilink_index(reports_dir)        set_a = set(index.get(entity_a, []))    set_b = set(index.get(entity_b, []))    overlap = set_a & set_b        print(f"{entity_a}: {len(set_a)} companies")    print(f"{entity_b}: {len(set_b)} companies")    print(f"Overlap: {len(overlap)} companies — {sorted(overlap)}")    return overlap
# Companies in both NVIDIA and Apple supply chainssupply_chain_overlap("NVIDIA", "Apple")
# Companies in both AI server and EV supply chainssupply_chain_overlap("AI 伺服器", "電動車")

Batch Financial Update with Error Handling

python
import subprocessimport sys
def update_sector_financials(sector: str, valuation_only: bool = False):    """Update financials for all tickers in a sector."""    script = "update_valuation.py" if valuation_only else "update_financials.py"    cmd = [sys.executable, f"scripts/{script}", "--sector", sector]        result = subprocess.run(cmd, capture_output=True, text=True)        if result.returncode != 0:        print(f"Error: {result.stderr}")    else:        print(result.stdout)        return result.returncode
# Update valuation multiples for semiconductors (fast)update_sector_financials("Semiconductors", valuation_only=True)
# Full financial update for a sectorupdate_sector_financials("Electronic Components", valuation_only=False)

Prepare Enrichment JSON

python
import json
def build_enrichment_entry(ticker: str, company_name: str,                           description: str, upstream: list[str],                           midstream: str, downstream: list[str],                           customers: list[str], suppliers: list[str]) -> dict:    """    Build a properly formatted enrichment entry.    All entity names in lists will be wrapped in [[wikilinks]].    """    def wikify(items):        return "\n".join(f"- [[{item}]]" for item in items)        supply_chain = (        f"**上游:**\n{wikify(upstream)}\n"        f"**中游:**\n- **{company_name}** ({midstream})\n"        f"**下游:**\n{wikify(downstream)}"    )        cust_section = (        f"### 主要客戶\n{wikify(customers)}\n\n"        f"### 主要供應商\n{wikify(suppliers)}"    )        return {        "desc": description,        "supply_chain": supply_chain,        "cust": cust_section    }
# Build enrichment for multiple tickersenrichment = {    "2330": build_enrichment_entry(        ticker="2330",        company_name="台積電",        description="台積電為全球最大晶圓代工廠,專注於 [[CoWoS]]、[[3奈米]] 先進製程,為全球領先科技公司提供晶片製造服務。",        upstream=["ASML", "Applied Materials", "SUMCO", "Tokyo Electron"],        midstream="晶圓代工",        downstream=["Apple", "NVIDIA", "AMD", "Broadcom", "Qualcomm"],        customers=["Apple", "NVIDIA", "AMD", "Qualcomm", "MediaTek"],        suppliers=["ASML", "Tokyo Electron", "Shin-Etsu", "Applied Materials"]    )}
# Save to filewith open("enrichment.json", "w", encoding="utf-8") as f:    json.dump(enrichment, f, ensure_ascii=False, indent=2)
print("enrichment.json ready. Apply with:")print("python scripts/update_enrichment.py --data enrichment.json 2330")

Audit a Batch Programmatically

python
import subprocessimport json
def audit_and_report(batch_id: int) -> dict:    """Run audit and parse results."""    result = subprocess.run(        ["python", "scripts/audit_batch.py", str(batch_id), "-v"],        capture_output=True, text=True    )        output = result.stdout        # Parse pass/fail counts from output    passed = output.count("✓")     failed = output.count("✗")        return {        "batch": batch_id,        "passed": passed,        "failed": failed,        "pass_rate": passed / (passed + failed) if (passed + failed) > 0 else 0,        "output": output    }
results = audit_and_report(101)print(f"Batch 101: {results['passed']} passed, {results['failed']} failed")print(f"Pass rate: {results['pass_rate']:.1%}")

Common Workflows

Workflow 1: Research a New Investment Theme

bash
# 1. Search for related companiespython scripts/discover.py "液冷散熱" --smart
# 2. Apply wikilinks to matching reportspython scripts/discover.py "液冷散熱" --apply
# 3. Rebuild themes to include new themepython scripts/build_themes.py "液冷散熱"
# 4. Rebuild wikilink index and networkpython scripts/build_wikilink_index.pypython scripts/build_network.py
# 5. Browse resultsopen themes/液冷散熱.mdopen network/index.html

Workflow 2: Onboard a New Ticker

bash
# 1. Add the report (Python script, free)python scripts/add_ticker.py 6669 緯穎 --sector Computer Hardware
# 2. Update financial datapython scripts/update_financials.py 6669
# 3. Prepare enrichment JSON (use AI research or manual)# Edit enrichment.json with business description, supply chain, customers
# 4. Apply enrichmentpython scripts/update_enrichment.py --data enrichment.json 6669
# 5. Audit qualitypython scripts/audit_batch.py --all -v
# 6. Rebuild indexpython scripts/build_wikilink_index.py

Workflow 3: Refresh Valuation for Earnings Season

bash
# Fast valuation refresh only (no full financial re-fetch)python scripts/update_valuation.py --sector Semiconductorspython scripts/update_valuation.py --sector Electronic Componentspython scripts/update_valuation.py --sector Computer Hardware
# Or refresh everything (slow, run overnight)python scripts/update_valuation.py

Workflow 4: Map a Supply Chain

python
# Find all Taiwan companies connected to a specific technologyfrom collections import defaultdictimport refrom pathlib import Path
def map_supply_chain(technology: str, reports_dir: str = "Pilot_Reports"):    results = {"upstream": [], "midstream": [], "downstream": []}        for md_file in Path(reports_dir).rglob("*.md"):        content = md_file.read_text(encoding="utf-8")                if f"[[{technology}]]" not in content:            continue                ticker = md_file.stem.split("_")[0]        company = md_file.stem.split("_", 1)[1] if "_" in md_file.stem else ""                # Detect position in supply chain        if f"**上游:**" in content and f"[[{technology}]]" in content.split("**上游:**")[1].split("**中游:**")[0]:            results["upstream"].append(f"{ticker} {company}")        elif f"[[{technology}]]" in content and "**中游:**" in content:            mid_section = content.split("**中游:**")[1].split("**下游:**")[0] if "**下游:**" in content else ""            if f"[[{technology}]]" in mid_section:                results["midstream"].append(f"{ticker} {company}")        else:            results["downstream"].append(f"{ticker} {company}")        return results
chain = map_supply_chain("CoWoS")print(f"Upstream: {chain['upstream']}")print(f"Midstream: {chain['midstream']}")print(f"Downstream: {chain['downstream']}")

Token Cost Reference

OperationTokens UsedCommand
Update financialsFree (yfinance)python scripts/update_financials.py
Update valuationFree (yfinance)python scripts/update_valuation.py
Discover (with results)Freepython scripts/discover.py "term"
AuditFreepython scripts/audit_batch.py
Build themes/network/indexFreepython scripts/build_*.py
/add-ticker (Claude Code)MediumAI research per ticker
/update-enrichment (Claude Code)Medium3–5 web searches per ticker
/discover (no results found)Low–HighAI researches online

Rule of thumb: Use Python scripts for bulk data operations. Use Claude Code slash commands only when AI research is needed for a specific ticker.

Troubleshooting

yfinance returns no data for a Taiwan ticker:

python
import yfinance as yf# Taiwan tickers need .TW suffix for TWSE, .TWO for OTCtsmc = yf.Ticker("2330.TW")print(tsmc.info.get("marketCap"))

Report not found by scripts:

  • Filename must match pattern: {TICKER}_{CompanyName}.md
  • Must be inside a subfolder of Pilot_Reports/
  • Use python scripts/utils.py to test file discovery

Audit fails "too few wikilinks":

  • Minimum 8 unique [[wikilinks]] required per report
  • Use update_enrichment.py to add richer content
  • Run discover.py --apply to auto-tag relevant wikilinks

build_network.py produces empty graph:

bash
# Ensure reports exist and have wikilinks firstpython scripts/build_wikilink_index.py  # Check WIKILINKS.md has entriespython scripts/build_network.py --min-weight 2  # Lower threshold

Enrichment JSON rejected:

  • Ensure file is valid UTF-8 with ensure_ascii=False
  • Keys must be ticker strings ("2330", not 2330)
  • Required keys per entry: desc, supply_chain, cust
  • Content must be in Traditional Chinese; English only for proper nouns

Finding batch numbers:

  • See task.md for batch definitions and which tickers are in each batch
  • Batches are used for incremental processing of the 1,735 tickers

来源与署名

来源:reason-machines/trending-skills位于skills/taiwan-equity-research-coverage提交2384a00

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架