Imported from Mochi12345/Notes (
ai-trading-claude/.claude/skills/trade-report-zhtw/SKILL.md). Install upstream withnpx skills add Mochi12345/Notes --skill trade-report-zhtw. Copyright stays with the author.
完整股票分析 + 報告生成器(繁體中文版,JSON-First)
你是一個結合分析與報告生成的引擎。當透過 /trade-report-zhtw <TICKER> 呼叫時,你將執行完整的 5 代理人股票分析,以 JSON 為核心數據模型,同時生成三個輸出檔案:
- 繁體中文 Markdown 分析報告 —
<TICKER>-TRADE-ANALYSIS-zhTW-<DATETIME>.md - 繁體中文 PDF 報告 —
<TICKER>-TRADE-REPORT-zhTW-<DATETIME>.pdf - 英文 PDF 報告 —
<TICKER>-TRADE-REPORT-enUS-<DATETIME>.pdf
這三個檔案缺一不可。每次呼叫都必須產出全部三個檔案。
免責聲明:僅供教育/研究用途。非財務建議。
架構設計:JSON-First
本技能採用 JSON 為核心數據模型 的架構:
Phase 2: 5 子代理人 → 回傳分析文字
↓
Phase 3: 建立 Canonical JSON(核心數據模型)→ 快取至 .runtime_data/trade_json/
↓
├─ Phase 4: JSON → 渲染 .md 報告(繁體中文)
├─ Phase 5: JSON + seasonality → zhTW PDF(繁體中文)
└─ Phase 6: JSON(翻譯) + seasonality → enUS PDF(英文)
關鍵設計原則:
- JSON 是唯一的數據來源(single source of truth)
- .md 和 .pdf 都從同一個 JSON 渲染,確保一致性
- JSON 快取至
.runtime_data/trade_json/<TICKER>.json,可供後續重用 - 不再從 .md 反向解析數據(消除重複處理與不一致風險)
輸出目錄定義
所有輸出報告統一寫入以下目錄(非 CWD):
REPORT_DIR="./.reports_generated"
CACHE_DIR="./.runtime_data"
Python 路徑備註: 若系統
python3找不到模組(reportlab, yfinance 等),改為/home/vagrant/anaconda3/bin/python3。全文適用,後續不再重複說明。
階段一:發現簡報
執行以下步驟收集當前數據。所有查詢平行執行。
1a:MCP 金融數據(結構化數據優先)
使用 mcp-financex MCP 工具取得精確的結構化數據。三者平行呼叫:
mcp__mcp-financex__get_quote(symbol="<TICKER>")
mcp__mcp-financex__get_earnings_calendar(symbol="<TICKER>", daysAhead=120)
mcp__mcp-financex__calculate_historical_volatility(symbol="<TICKER>")
從這些工具提取:
- get_quote: 當前股價、市值、追蹤/前向本益比、52週高低點、50/200日均線、bid/ask、股息率
- get_earnings_calendar: 下次財報日期、EPS 預估值、過去 4 季 EPS 驚喜幅度(reported vs estimated)
- calculate_historical_volatility: 10日/20日/30日/60日/90日年化歷史波動率
1b:WebSearch 補充數據(非結構化數據)
平行執行以下 WebSearch 查詢:
"<TICKER> stock price today market cap""<TICKER> company overview business segments products""<TICKER> latest news developments""<TICKER> financial metrics revenue earnings PE ratio profit margin growth"
1c:整理 DISCOVERY_BRIEF
將 MCP 結構化數據 + WebSearch 結果整理成 DISCOVERY_BRIEF,包含:
- 當前股價、市值、52週區間、MA 數值
- 追蹤/前向本益比、股息率
- 下次財報日期與 EPS 預估值
- EPS 驚喜歷史(過去 4 季)
- 歷史波動率(10d/20d/30d/60d/90d)
- 公司業務描述、產品線、營收構成
- 近期新聞與發展(最近 30 天)
- 競爭對手與合作夥伴
- 估值與成長相關的關鍵財務指標
同時構建 DATA_BLOCK(一段結構化摘要文本,見階段二),在後續傳遞給子代理人時使用。
公司概況快取
使用 .claude/scripts/cache_company_profile.py 管理 ${CACHE_DIR}/company_profile/ 快取。每個股票代號只查詢一次,後續報告重複使用。
python3 .claude/scripts/cache_company_profile.py check <TICKER>
Exit 0 = 快取命中(< 180 天)。Exit 1 = 未命中或過期 → 平行執行以下 WebSearch 收集公司概況,再透過 stdin 寫入 JSON 快取(內容必須使用英文):
"<TICKER> company overview business model what does it do""<TICKER> revenue segments products breakdown revenue share""<TICKER> key partners suppliers strategic partnerships""<TICKER> competitors rival companies industry competition"
python3 .claude/scripts/cache_company_profile.py write <TICKER> << 'JSONEOF'
{"business_summary": "...", "major_products_revenue": [...], "partners": [...], "competitors": [...]}
JSONEOF
讀取快取(無論是否剛建立):
python3 .claude/scripts/cache_company_profile.py read <TICKER>
重要:快取內容必須使用英文。 階段三建立 JSON 時將值翻譯為繁體中文(zhTW);階段六英文 JSON 直接使用快取的英文值。
階段一.五:計算月度波動率與季節性
短線交易者(持有 1-4 週)需要了解股票的季節性模式:哪些月份回報最好、波動率最低、進場風險最小。
這個階段使用 yfinance 拉取過去 5 年的歷史每日價格,自動計算每個月的平均回報、上漲機率、波動率,並產出結構化 JSON 供後續階段使用。
步驟 A:確保快取目錄存在
mkdir -p "${CACHE_DIR}/seasonality/"
步驟 B:檢查快取,若未命中或過期則計算
快取效期為 30 天(季節性數據會隨時間推移而變化)。
TICKER="<TICKER>"
CACHE_FILE="${CACHE_DIR}/seasonality/${TICKER}.json"
if [ -f "$CACHE_FILE" ] && ! find "$CACHE_FILE" -mtime +1 | grep -q .; then
echo "季節性快取命中 (Seasonality Cache HIT)"
cat "$CACHE_FILE"
else
echo "計算季節性數據中 (Computing seasonality for ${TICKER})..."
pip3 install yfinance 2>/dev/null || pip install yfinance 2>/dev/null
python3 .claude/scripts/compute_seasonality.py "$TICKER"
fi
如果 yfinance 安裝失敗或腳本執行錯誤,跳過此步驟並繼續階段二。季節性數據為 optional 增強,不影響核心分析。
步驟 C:快取內容結構
快取檔案 ${CACHE_DIR}/seasonality/<TICKER>.json(英文值,階段四/五/六使用)包含以下頂層欄位:
monthly_stats[12]— 每月month_name_zh/en、avg_return_pct、win_rate_pct、avg_volatility_pct、character_zh/enhighlights—best_month、worst_month、sweet_spot、highest/lowest_vol_monthcurrent_month_assessment— 當前月份assessment_zh/en與歷史統計- 其他衍生欄位(
day_of_week、intraday_hourly、seasonality_strategy、earnings_seasonality等)由compute_seasonality.py產生
步驟 D:讀取已快取的季節性數據
cat "${CACHE_DIR}/seasonality/<TICKER>.json"
載入後於階段四渲染 .md、階段五/六注入 PDF JSON。
階段二:啟動 5 個平行子代理人
在單一訊息中,使用 Agent 工具同時啟動全部 5 個代理人。每個代理人的任務開頭必須包含 DATA_BLOCK(結構化數據摘要),讓代理人直接獲取關鍵數字而不需從冗長文本中擷取。
通用 DATA_BLOCK 模板
以下為所有代理人共用的結構化數據。在每個子代理人的任務開頭貼上此區塊:
DATA_BLOCK for <TICKER>:
Price: $X | MCap: $XB | 52w: $X-$X | MA50: $X | MA200: $X
P/E (TTM/Fwd): Xx / Xx | DivYield: X%
HV (10d/20d/30d/60d/90d): X% / X% / X% / X% / X%
Rev Growth (YoY): +X% | Op Margin: X%
Next Earnings: YYYY-MM-DD | EPS Est: $X
EPS Beat History: +X% / +X% / +X% / +X% (last 4 quarters)
Key News: [1-2 sentences of most important recent development]
Key Risk/Concern: [1 sentence on the market's primary concern]
注意: DATA_BLOCK 中的數值必須來自階段一的 MCP 工具輸出和 WebSearch 結果,確保數據準確。不可憑空填寫。
代理人 1 — 技術分析(權重:25%)
子代理人類型:delegate(fresh context,最輕量無思考開銷)。指示其分析:趨勢方向(20%)、動量指標/RSI/MACD(20%)、成交量分析/OBV(20%)、圖表形態(20%)、相對強弱 vs SPY/板塊(20%)。回傳:技術評分(0-100)、子評分、關鍵價位(支撐/阻力)、指標、已識別形態,以及簡短的繁體中文技術展望。
代理人 2 — 基本面分析(權重:25%)
子代理人類型:delegate(fresh context,最輕量無思考開銷)。指示其分析:估值(本益比、股價營收比、EV/EBITDA vs 板塊)(20%)、營收/盈餘成長軌跡(20%)、獲利能力利潤率與 ROIC(20%)、資產負債表健康度(20%)、競爭護城河評估(20%)。回傳:基本面評分(0-100)、子評分、關鍵指標、護城河評級,以及繁體中文基本面結論。
代理人 3 — 情緒與動量分析(權重:20%)
子代理人類型:delegate(fresh context,最輕量無思考開銷)。指示其分析:新聞情緒基調(20%)、社群媒體熱度/Reddit/WSB(20%)、分析師共識與目標價(20%)、法人機構活動與資金流向(20%)、內部人交易與放空利息(20%)。
🔧 代理人 3 需補充的 MCP 數據(在階段一呼叫): 為提升情緒分析的數據品質,應在階段一額外呼叫以下 MCP 工具,並將其結果傳遞給代理人 3:
mcp__mcp-financex__get_analyst_ratings(symbol="<TICKER>")— 分析師評級分布、目標價中位數mcp__mcp-financex__get_insider_trades(symbol="<TICKER>")— 近期內部人交易記錄mcp__mcp-financex__get_short_interest(symbol="<TICKER>")— 做空比例與變化趨勢
回傳:情緒評分(0-100)、子評分,以及繁體中文情緒結論。
代理人 4 — 風險評估(權重:15%)
子代理人類型:delegate(fresh context,最輕量無思考開銷)。指示其分析:波動率特徵與貝他值(20%)、下行/回撤情境(20%)、宏觀/地緣政治敏感度(20%)、流動性與市場深度(20%)、當前價格的風險/回報比(20%)。回傳:風險評分(0-100)、子評分、關鍵風險因素、持倉規模建議,以及繁體中文風險結論。
⚠️ 風險評分定義: 風險評分為 0-100 分制,分數越高代表風險越大(0 = 幾乎無風險,100 = 極度危險)。風險代理人回傳的風險評分將在階段三的綜合評分中進行倒置轉換(綜合風險得分 = 100 - 原始風險評分),因為綜合評分中的「風險概況」維度使用正向計分(越高越好)。代理人回傳時應同時提供原始風險評分(越高越危險)供 .md 報告的風險評估章節直接使用。
代理人 5 — 投資論點(權重:15%)
子代理人類型:delegate(fresh context,最輕量無思考開銷)。指示其:從自身研究中綜合出結構化投資論點,包含看漲理由(關鍵驅動因素)、看跌理由(關鍵風險)、催化劑時間表,以及信心評估。評分:催化劑清晰度(20%)、時機評估(20%)、不對稱性/有利的風險回報(20%)、優勢識別(20%)、整體信心(20%)。回傳:論點評分(0-100)、子評分、看漲/看跌案例、催化劑日曆,以及繁體中文論點結論。
重要: 每個代理人必須以繁體中文回傳其分析內容。
階段三:建立 Canonical JSON(核心數據模型)
全部 5 個代理人回傳後,建立 JSON 作為核心數據模型。這是本 JSON-First 架構的關鍵階段 — JSON 成為所有後續輸出的唯一數據來源。
步驟 1 — 計算綜合交易評分
綜合交易評分 = (技術面 * 0.25) + (基本面 * 0.25) + (情緒面 * 0.20) + (風險面倒置 * 0.15) + (論點 * 0.15)
⚠️ 風險評分倒置規則: 風險代理人回傳的原始分數為 0-100(越高越危險)。在綜合評分計算中,必須先將風險分數倒置:風險面倒置 = 100 - 原始風險評分。 舉例:若風險代理人回傳 76/100(高風險),則計算中用 (100-76)=24。 這樣綜合評分中的「風險概況」維度才能與其他維度同向(越高越好)。 JSON 中
risk_raw欄位保留原始風險分數(越高越危險),categories["Risk Profile"].score使用倒置後分數。
四捨五入至整數。
步驟 2 — 決定等級與信號
| 評分範圍 | 等級 | 信號 |
|---|---|---|
| 85-100 | A+ | 強力買進 |
| 70-84 | A | 買進 |
| 55-69 | B | 持有/累積 |
| 40-54 | C | 中立 |
| 25-39 | D | 謹慎 |
| 0-24 | F | 避開 |
步驟 3 — 建立 Canonical JSON 並快取
從子代理人回傳內容 + 公司概況快取提取數據,建立以下 JSON 結構。這是兩個 PDF + .md 報告的統一數據來源。
先確保快取目錄存在:
mkdir -p "$CACHE_DIR/trade_json"
將 JSON 寫入快取(使用檔案系統安全的 datetime):
cat > "$CACHE_DIR/trade_json/<TICKER>.json" << 'JSONEOF'
JSON 結構如下(⚠️ 不含 seasonality 鍵值 — 該鍵值由 build_trade_report_json.py 在階段五/六自動注入):
{
"ticker": "<TICKER>",
"company_name": "<公司名稱(繁體中文)>",
"date": "<YYYY-MM-DD>",
"datetime": "<YYYY-MM-DD-HHMM>",
"tldr": "<一句話摘要 — 等級、信號、核心買/賣理由、目標價區間>",
"overall_score": <綜合評分>,
"grade": "<A+ ~ F>",
"signal": "<強力買進 / 買進 / 持有/累積 / 中立 / 謹慎 / 避開>",
"price": <當前股價>,
"risk_raw": <原始風險評分 0-100,越高越危險>,
"categories": {
"Technical Strength": {"score": <N>, "weight": "25%"},
"Fundamental Quality": {"score": <N>, "weight": "25%"},
"Sentiment & Momentum": {"score": <N>, "weight": "20%"},
"Risk Profile": {"score": <N>, "weight": "15%"},
"Thesis Conviction": {"score": <N>, "weight": "15%"}
},
"sub_scores": {
"technical": {
"trend": <N>, "momentum": <N>, "volume": <N>,
"pattern": <N>, "rel_strength": <N>
},
"fundamental": {
"valuation": <N>, "growth": <N>, "profitability": <N>,
"health": <N>, "moat": <N>
},
"sentiment": {
"news": <N>, "social": <N>, "analysts": <N>,
"institutional": <N>, "insider_short": <N>
},
"risk": {
"volatility": <N>, "downside": <N>, "macro": <N>,
"liquidity": <N>, "risk_reward": <N>
},
"thesis": {
"catalyst": <N>, "timing": <N>, "asymmetry": <N>,
"edge": <N>, "conviction": <N>
}
},
"company_profile": {
"business_summary": "<從快取載入後翻譯為繁體中文的業務摘要,>100 字元>",
"major_products_revenue": [
{"product": "<產品名稱>", "revenue_share": "<X%>", "description": "<描述>"}
],
"partners": [
"<合作夥伴 1 — 合作性質描述>",
"<合作夥伴 2 — 合作性質描述>",
"<合作夥伴 3 — 合作性質描述>",
"<合作夥伴 4 — 合作性質描述>",
"<合作夥伴 5 — 合作性質描述>"
],
"competitors": [
"<競爭對手 1 — 競爭關係描述>",
"<競爭對手 2 — 競爭關係描述>",
"<競爭對手 3 — 競爭關係描述>",
"<競爭對手 4 — 競爭關係描述>",
"<競爭對手 5 — 競爭關係描述>",
"<競爭對手 6 — 競爭關係描述>"
]
},
"technical": {
"key_levels": [
{"level": "阻力 2", "price": "$X", "notes": "..."},
{"level": "阻力 1", "price": "$X", "notes": "..."},
{"level": "當前價格", "price": "$X", "notes": "報告日期"},
{"level": "支撐 1", "price": "$X", "notes": "..."},
{"level": "支撐 2", "price": "$X", "notes": "..."}
],
"indicators": [
{"indicator": "趨勢方向", "value": "...", "interpretation": "完整解讀句(>30 字元)"},
{"indicator": "RSI (14)", "value": "...", "interpretation": "完整解讀句(>30 字元)"},
{"indicator": "MACD", "value": "...", "interpretation": "完整解讀句(>30 字元)"},
{"indicator": "成交量", "value": "...", "interpretation": "完整解讀句(>30 字元)"},
{"indicator": "形態", "value": "...", "interpretation": "完整解讀句(>30 字元)"},
{"indicator": "50/200 MA", "value": "...", "interpretation": "完整解讀句(>30 字元)"}
],
"outlook_zh": "<繁體中文技術展望段落,來自代理人 1>"
},
"fundamental": {
"metrics": [
{"metric": "本益比", "value": "...", "sector_avg": "...", "assessment": "評估結論(>20 字元)"},
{"metric": "股價營收比", "value": "...", "sector_avg": "...", "assessment": "評估結論(>20 字元)"},
{"metric": "營收成長(年增)", "value": "...", "sector_avg": "...", "assessment": "評估結論(>20 字元)"},
{"metric": "EPS 成長(年增)", "value": "...", "sector_avg": "...", "assessment": "評估結論(>20 字元)"},
{"metric": "毛利率", "value": "...", "sector_avg": "...", "assessment": "評估結論(>20 字元)"},
{"metric": "負債/權益", "value": "...", "sector_avg": "...", "assessment": "評估結論(>20 字元)"}
],
"valuation_assessment": "<估值摘要段落(>80 字元)>",
"moat": {
"rating": "<寬廣/中等/狹窄/無>",
"sources": [
"<護城河來源 1 — 完整描述句(>30 字元)>",
"<護城河來源 2 — 完整描述句(>30 字元)>",
"<護城河來源 3 — 完整描述句(>30 字元)>"
]
},
"outlook_zh": "<繁體中文基本面結論段落,來自代理人 2>"
},
"sentiment": {
"news_sentiment_zh": "<新聞情緒描述>",
"social_buzz_zh": "<社群媒體熱度描述>",
"analyst_consensus_zh": "<分析師共識描述>",
"institutional_activity_zh": "<法人活動描述>",
"insider_short_zh": "<內部人/放空描述>",
"outlook_zh": "<繁體中文情緒結論段落,來自代理人 3>"
},
"risk": {
"risk_raw_score": <原始風險評分>,
"risk_level_zh": "<低/中等/高/極高>",
"risk_reward_ratio": "X:1",
"recommended_position_size": "投資組合的 X%",
"max_drawdown_scenario": "<描述>",
"volatility": "<描述>",
"correlation": "<描述>",
"sizing_methodology": "<詳細方法論段落(>50 字元)>",
"scenarios": [
{"scenario": "樂觀 (Bull)", "probability": "X%", "return": "+X% 至 +Y%", "trigger": "<觸發條件>"},
{"scenario": "中立 (Neutral)", "probability": "X%", "return": "+X% 至 +Y%", "trigger": "<觸發條件>"},
{"scenario": "悲觀 (Bear)", "probability": "X%", "return": "-X% 至 -Y%", "trigger": "<觸發條件>"}
],
"key_risks_zh": ["<風險 1>", "<風險 2>", "<風險 3>", "<風險 4>", "<風險 5>"],
"outlook_zh": "<繁體中文風險結論段落,來自代理人 4>"
},
"thesis": {
"core_thesis_zh": "<2-3 句核心論點>",
"bull_case": [
"<看漲理由 1 — 完整句子(>25 字元)>",
"<看漲理由 2 — 完整句子(>25 字元)>",
"<看漲理由 3 — 完整句子(>25 字元)>",
"<看漲理由 4 — 完整句子(>25 字元)>",
"<看漲理由 5 — 完整句子(>25 字元)>"
],
"bear_case": [
"<看跌理由 1 — 完整句子(>25 字元)>",
"<看跌理由 2 — 完整句子(>25 字元)>",
"<看跌理由 3 — 完整句子(>25 字元)>",
"<看跌理由 4 — 完整句子(>25 字元)>",
"<看跌理由 5 — 完整句子(>25 字元)>"
],
"catalysts": [
{"event": "<事件>", "date": "<日期>", "impact": "<影響描述(>15 字元)>"}
],
"entry_exit": {
"entry_price": "$X - $X",
"target_price": "$X(目標1)/ $X(目標2)",
"stop_loss": "$X",
"timeframe": "<時間框架>",
"entry_reason_zh": "<進場理由>"
},
"bull_target": "$X",
"bear_target": "$X",
"outlook_zh": "<繁體中文論點結論段落,來自代理人 5>"
},
"trend_analysis": {
"multi_timeframe": [
{
"timeframe": "極短期(0 DTE-2週)",
"timeframe_en": "Very Short Term (0 DTE-2 Weeks)",
"direction_zh": "上漲/下跌/震盪",
"direction_en": "Uptrend/Downtrend/Sideways",
"strength_zh": "強/中/弱 — 原因",
"strength_en": "Strong/Moderate/Weak — reason",
"price_range": "$X - $X",
"moving_toward_zh": "朝向 [目標] 方向移動",
"moving_toward_en": "Moving toward [target]"
},
{
"timeframe": "中期(30-60天)",
"timeframe_en": "Medium Term (30-60 Days)",
"direction_zh": "上漲/下跌/震盪",
"direction_en": "Uptrend/Downtrend/Sideways",
"strength_zh": "強/中/弱 — 原因",
"strength_en": "Strong/Moderate/Weak — reason",
"price_range": "$X - $X",
"moving_toward_zh": "朝向 [目標] 方向移動",
"moving_toward_en": "Moving toward [target]"
},
{
"timeframe": "長期(6個月-1年)",
"timeframe_en": "Long Term (6 Months-1 Year)",
"direction_zh": "上漲/下跌/震盪",
"direction_en": "Uptrend/Downtrend/Sideways",
"strength_zh": "強/中/弱 — 原因",
"strength_en": "Strong/Moderate/Weak — reason",
"price_range": "$X - $X",
"moving_toward_zh": "朝向 [目標] 方向移動",
"moving_toward_en": "Moving toward [target]"
}
],
"historical_reference": {
"uptrend": {
"date_range": "YYYY-MM-DD → YYYY-MM-DD",
"avg_duration_days": <N>, "duration_range": "<min>-<max> days",
"actual_duration_days": <N>, "duration_vs_avg": "<N>×",
"avg_magnitude": "+X% / +$X",
"actual_magnitude": "+X% / +$X",
"magnitude_vs_avg": "<N>× / <N>×",
"is_current": true
},
"range_bound": {
"date_range": "YYYY-MM-DD → YYYY-MM-DD",
"avg_duration_days": <N>, "duration_range": "<min>-<max> days",
"actual_duration_days": <N>, "duration_vs_avg": "<N>×",
"avg_magnitude": "±X% / ±$X",
"actual_magnitude": "±X% / ±$X",
"magnitude_vs_avg": "<N>× / <N>×",
"is_current": false
},
"downtrend": {
"date_range": "YYYY-MM-DD → YYYY-MM-DD",
"avg_duration_days": <N>, "duration_range": "<min>-<max> days",
"actual_duration_days": <N>, "duration_vs_avg": "<N>×",
"avg_magnitude": "-X% / -$X",
"actual_magnitude": "-X% / -$X",
"magnitude_vs_avg": "<N>× / <N>×",
"is_current": false
},
"observation_zh": "<一句話總結目前趨勢相對於歷史常態的位置>",
"observation_en": "<One sentence summarizing current trend position vs historical norms>"
},
"current_position": {
"days_into_trend": <N>,
"pct_from_trend_start": <N>,
"dollar_from_trend_start": <N>,
"estimated_remaining_move_pct": "±X%",
"estimated_remaining_move_dollar": "±$X",
"estimated_remaining_days": "<N> days",
"estimated_target_range": "$X - $X",
"phase_zh": "早期/中期/後期",
"phase_en": "Early/Mid/Late",
"assessment_zh": "<簡短趨勢階段判斷,包括關鍵觀察>",
"assessment_en": "<Brief trend phase assessment with key observations>"
}
},
"agent_raw": {
"technical_summary_zh": "<代理人 1 完整繁體中文分析摘要>",
"fundamental_summary_zh": "<代理人 2 完整繁體中文分析摘要>",
"sentiment_summary_zh": "<代理人 3 完整繁體中文分析摘要>",
"risk_summary_zh": "<代理人 4 完整繁體中文分析摘要>",
"thesis_summary_zh": "<代理人 5 完整繁體中文分析摘要>"
}
}
⚠️ JSON 值格式要求(與原技能相同,不可截斷):
company_profile.business_summary:>100 字元完整段落partners/competitors:每項必須「公司名稱 — 描述」格式(含—分隔符)moat.sources:每項 >30 字元完整句子thesis.bull_case/bear_case:每項 >25 字元完整句子thesis.catalysts[].impact:>15 字元描述technical.indicators[].interpretation:>30 字元完整解讀句fundamental.metrics[].assessment:>20 字元評估結論- 以上各項絕不可僅列出公司名稱或關鍵詞而無描述文字。
重要欄位說明:
trend_analysis所有文字欄位使用_zh/_en雙語後綴,與 seasonality 快取格式一致sub_scores記錄各代理人 5 個子維度的評分(每個 0-20)agent_raw保留代理人原始分析文字,供 .md 報告引用- 不要包含
seasonality頂層鍵值 — 將由build_trade_report_json.py自動注入
JSONEOF
步驟 4 — 寫入交易評分歷史記錄
mkdir -p "${CACHE_DIR}/history/"
cat >> "${CACHE_DIR}/history/trade_history.jsonl" << 'HISTEOF'
{"ticker": "<TICKER>", "date": "<YYYY-MM-DD>", "datetime": "<DATETIME>", "price": <PRICE>, "technical": <TECH_SCORE>, "fundamental": <FUND_SCORE>, "sentiment": <SENT_SCORE>, "risk_raw": <RISK_RAW>, "risk_inverted": <RISK_INV>, "thesis": <THESIS_SCORE>, "composite": <COMPOSITE>, "grade": "<GRADE>", "signal": "<SIGNAL>"}
HISTEOF
階段四:從 JSON 渲染繁體中文 .md 報告
這是 JSON-First 架構的核心優勢:.md 報告直接從 Canonical JSON 渲染,不需反向解析。
步驟 A:讀取數據來源
讀取兩個數據來源:
cat "$CACHE_DIR/trade_json/<TICKER>.json"
cat "${CACHE_DIR}/seasonality/<TICKER>.json"
步驟 B:從 JSON 渲染 .md 報告
從 JSON 提取所有欄位,按照以下範本結構撰寫 .md。每一個佔位符號都必須從 JSON 填入實際數據。 不可遺留 [X]、[日期] 等原始範本文字。
確保 REPORT_DIR 存在:
mkdir -p "$REPORT_DIR"
寫入檔案(使用檔案系統安全的日期時間格式):
cat > "$REPORT_DIR/<TICKER>-TRADE-ANALYSIS-zhTW-<DATETIME>.md" << 'MDEOF'
# 📊 交易分析:<TICKER> — <公司名稱>
> 💡 **TLDR:** [從 `tldr` 欄位]
> 🤖 由 AI 交易分析師生成 | 📅 <日期> <時間>
---
## 📋 執行摘要
[2-3 段落綜合 — 從 `agent_raw.*_zh` 和 `company_profile.business_summary` 綜合撰寫,每段開頭使用 🎯💡🔑 等 emoji 引導]
---
## 🏆 交易評分儀表板
| 📊 維度 | ⭐ 評分 | ⚖️ 權重 | 📐 加權 |
|-----------|:-------:|:--------:|:--------:|
| 🔵 技術強度 | <categories["Technical Strength"].score>/100 | 25% | X.X |
| 🟢 基本面品質 | <categories["Fundamental Quality"].score>/100 | 25% | X.X |
| 🟡 情緒與動量 | <categories["Sentiment & Momentum"].score>/100 | 20% | X.X |
| 🔴 風險概況 | <categories["Risk Profile"].score>/100 | 15% | X.X |
| 🟣 論點信心 | <categories["Thesis Conviction"].score>/100 | 15% | X.X |
| **🏅 綜合交易評分** | | | **<overall_score>/100** |
**📊 等級:<grade>** | **📌 信號:<signal>** (例如 📈 強力買進 / ✅ 買進 / ⏸️ 持有 / ⚪ 中立 / ⚠️ 謹慎 / 🚫 避開)
### 🔍 子評分明細
**🔵 技術面** [<technical_score>/100]:📈 趨勢 <sub_scores.technical.trend>/20 | ⚡ 動量 <sub_scores.technical.momentum>/20 | 📊 成交量 <sub_scores.technical.volume>/20 | 📐 形態 <sub_scores.technical.pattern>/20 | 💪 相對強弱 <sub_scores.technical.rel_strength>/20
**🟢 基本面** [<fundamental_score>/100]:💰 估值 <sub_scores.fundamental.valuation>/20 | 📈 成長 <sub_scores.fundamental.growth>/20 | 📊 獲利能力 <sub_scores.fundamental.profitability>/20 | ❤️ 健康度 <sub_scores.fundamental.health>/20 | 🏰 護城河 <sub_scores.fundamental.moat>/20
**🟡 情緒面** [<sentiment_score>/100]:📰 新聞 <sub_scores.sentiment.news>/20 | 💬 社群 <sub_scores.sentiment.social>/20 | 🎯 分析師 <sub_scores.sentiment.analysts>/20 | 🏦 法人 <sub_scores.sentiment.institutional>/20 | 🔍 內部人/放空 <sub_scores.sentiment.insider_short>/20
**🔴 風險面** [<risk_inverted>/100]:🌊 波動率 <sub_scores.risk.volatility>/20 | 📉 下行 <sub_scores.risk.downside>/20 | 🌍 宏觀 <sub_scores.risk.macro>/20 | 💧 流動性 <sub_scores.risk.liquidity>/20 | ⚖️ 風險回報比 <sub_scores.risk.risk_reward>/20
**🟣 論點** [<thesis_score>/100]:🚀 催化劑 <sub_scores.thesis.catalyst>/20 | ⏰ 時機 <sub_scores.thesis.timing>/20 | ⚖️ 不對稱性 <sub_scores.thesis.asymmetry>/20 | 🎯 優勢 <sub_scores.thesis.edge>/20 | 💪 信心 <sub_scores.thesis.conviction>/20
---
## 📈 技術面概述
[從 `technical.outlook_zh` + `agent_raw.technical_summary_zh` 綜合 — 圖表設置、重要價位、指標,使用 📈📉📊 ⚠️ ✅ 🚨 等 emoji]
---
## 📊 趨勢定位分析
> 🔍 多時間框架趨勢評估 — 識別目前處於趨勢的哪個階段、預期剩餘移動幅度
### 🧭 多時間框架趨勢
| ⏱️ 時間框架 | 📈 方向 | 💪 強度 | 💲 價格區間 | 🎯 目標方向 |
|:----------:|:------:|:------:|:----------:|:----------:|
| ⚡ 極短期(0 DTE-2週) | <trend_analysis.multi_timeframe[0].direction_zh> | <trend_analysis.multi_timeframe[0].strength_zh> | <trend_analysis.multi_timeframe[0].price_range> | <trend_analysis.multi_timeframe[0].moving_toward_zh> |
| 🔄 中期(30-60天) | <trend_analysis.multi_timeframe[1].direction_zh> | <trend_analysis.multi_timeframe[1].strength_zh> | <trend_analysis.multi_timeframe[1].price_range> | <trend_analysis.multi_timeframe[1].moving_toward_zh> |
| 📅 長期(6個月-1年) | <trend_analysis.multi_timeframe[2].direction_zh> | <trend_analysis.multi_timeframe[2].strength_zh> | <trend_analysis.multi_timeframe[2].price_range> | <trend_analysis.multi_timeframe[2].moving_toward_zh> |
### 📐 歷史趨勢參考(按方向分類)
| 🏷️ 趨勢類型 | 📅 最近發生日期 | ⏱️ 平均持續 | 📍 實際持續 | vs 平均 | 📏 平均幅度 | 📍 實際幅度 | vs 平均 |
|:----------:|:--------------:|:----------:|:----------:|:------:|:----------:|:----------:|:------:|
| 📈 上漲趨勢 ★ 目前 | <uptrend.date_range> | <uptrend.avg_duration_days>天 | <uptrend.actual_duration_days>天 | <uptrend.duration_vs_avg>× | <uptrend.avg_magnitude> | <uptrend.actual_magnitude> | <uptrend.magnitude_vs_avg> |
| ↔️ 區間震盪 | <range_bound.date_range> | <range_bound.avg_duration_days>天 | <range_bound.actual_duration_days>天 | <range_bound.duration_vs_avg>× | <range_bound.avg_magnitude> | <range_bound.actual_magnitude> | <range_bound.magnitude_vs_avg> |
| 📉 下跌趨勢 | <downtrend.date_range> | <downtrend.avg_duration_days>天 | <downtrend.actual_duration_days>天 | <downtrend.duration_vs_avg>× | <downtrend.avg_magnitude> | <downtrend.actual_magnitude> | <downtrend.magnitude_vs_avg> |
> 📝 **綜合觀察:** <trend_analysis.historical_reference.observation_zh>
### 🎯 目前趨勢位置評估
| 📍 指標 | 🔢 數值 | 💡 說明 |
|:------:|:------:|--------|
| 📅 已進入趨勢天數 | <current_position.days_into_trend> 天 | 自 [趨勢開始事件/日期] 以來 |
| 📉 自趨勢起點移動 | <current_position.pct_from_trend_start>% / $<current_position.dollar_from_trend_start> | 從 [起點價格/日期] 至今累計移動 |
| 📊 預期剩餘移動(%) | <current_position.estimated_remaining_move_pct> | 基於歷史趨勢幅度與目前已實現移動的差值估算 |
| 💲 預期剩餘移動(金額) | <current_position.estimated_remaining_move_dollar> | 基於歷史趨勢幅度與目前已實現移動的差值估算 |
| ⏰ 預期剩餘時間 | <current_position.estimated_remaining_days> | 基於歷史趨勢持續時間與目前已歷經天數的差值估算 |
| 🎯 預期目標價位 | <current_position.estimated_target_range> | 基於當前位置 + 預期剩餘移動的合理區間 |
> 📝 **趨勢階段判斷:** <current_position.assessment_zh>
---
## 💰 基本面概述
[從 `fundamental.outlook_zh` + `agent_raw.fundamental_summary_zh` 綜合 — 估值結論、成長概況、護城河評估,使用 💰📊 🏆 ⚠️ ✅ 等 emoji]
## 📰 情緒分析
[從 `sentiment.outlook_zh` + `agent_raw.sentiment_summary_zh` 綜合 — 新聞基調、分析師共識、聰明資金信號,使用 📰💬 🏦 🔍 🎯 等 emoji]
## ⚠️ 風險評估
[從 `risk.outlook_zh` + `agent_raw.risk_summary_zh` 綜合 — 關鍵風險、波動率概況、持倉規模。使用原始風險評分 `risk_raw_score`(越高越危險),使用 ⚠️🚨 🟢 🟡 🔴 等 emoji]
## 🎯 投資論點
[從 `thesis.outlook_zh` + `agent_raw.thesis_summary_zh` 綜合 — 看漲理由、看跌理由、催化劑、進出策略,使用 🐂🐻 🚀 🎯 ⏰ 等 emoji]
---
## 💼 進出策略
| 📌 參數 | 💲 價位 | 📝 備註 |
|-----------|:---------:|---------|
| 📥 進場區間 | <thesis.entry_exit.entry_price> | <thesis.entry_exit.entry_reason_zh> |
| 🛑 停損 | <thesis.entry_exit.stop_loss> | ⚠️ 進場風險 X% |
| 🎯 目標 1 | <thesis.entry_exit.target_price> | ✅ X% 回報,保守 |
| 🚀 目標 2 | <從 thesis.catalysts 推導> | 💪 X% 回報,積極 |
| ⚖️ 風險/回報 | <risk.risk_reward_ratio> | 📐 以進場區間中點至目標1計算 |
| 📦 持倉規模 | <risk.recommended_position_size> | 🎯 基於風險承受度 |
| ⏰ 時間框架 | <thesis.entry_exit.timeframe> | 📝 <理由> |
---
## 📅 月度波動率與季節性分析
> 📊 基於過去 5 年歷史數據 | ⏱️ 適用於短線交易者(持有 1-4 週)
### 📋 月度統計
| 📅 月份 | 📈 平均回報 | 🏆 上漲機率 | 🌊 波動率(年化) | 🏷️ 特徵 |
|:-------:|:-----------:|:-----------:|:-----------------:|:--------:|
[從 seasonality.monthly_stats 生成 12 行表格,使用 month_name_zh / character_zh,根據特徵加上 ☀️🌧️❄️🌸 等天氣 emoji]
### 🔍 關鍵洞察
- 🏆 **最佳月份:** [highlights.best_month,使用 _zh 欄位] 📈
- ⚠️ **最差月份:** [highlights.worst_month,使用 _zh 欄位] 📉
- 💎 **甜蜜點:** [highlights.sweet_spot 串接] — 高於平均回報 + 低於平均波動 ✅
- 🔥 **高波動月份:** [highlights.highest_vol_month] — 選擇權溢價最高 🌊
- 🛡️ **低波動月份:** [highlights.lowest_vol_month] — 適合持有現股 🌿
### 📌 當前月份評估
**📅 目前月份([current_month]):** [current_month_assessment.assessment_zh]
> ⚠️ 過往表現不代表未來結果。季節性模式為統計規律,並非預測工具。
### 📅 週間日分析
> 📊 基於過去 5 年每日交易數據 | 🟢 綠色 = 平均正回報 | 🔴 紅色 = 平均負回報
| 📅 星期 | 🌊 波動率 | 📈 平均移動(%/$) | 📉 平均震幅(%/$) | 🏷️ 特徵 |
|:------:|:--------:|:------------------:|:------------------:|:------:|
[從 seasonality.day_of_week.stats 生成 5 行表格 — 根據 avg_move_pct 正負值加上 🟢 或 🔴,使用 character_zh]
> 💡 **週間日洞察:** [day_of_week.insight_zh]
>
> 📝 **特徵標籤說明:** 🏆 最佳 = 適合建立多頭部位 | 🟢 穩健 = 可持有現有部位 | 中性 = 無明顯方向偏好 | ⚠️ 偏弱 = 避免追高,適合期權賣方 | 🔴 迴避 = 不建議短線進場 | 🌊 高波動 = 震幅最大日,適合期權賣方收取權利金
### ⏰ 日內時段 × 週間日分析
> ⚠️ 基於最近 7 個交易日 1 分鐘數據(Yahoo 1m 限制),每週日樣本僅 1-2 筆,僅供觀察參考
| ⏰ 時段 | 📅 週一 | 📅 週二 | 📅 週三 | 📅 週四 | 📅 週五 | 🌊 波動率 | 🏷️ |
|:------:|:-----:|:-----:|:-----:|:-----:|:-----:|:-------:|:---:|
[從 seasonality.intraday_hourly.buckets 生成 7 行表格 — 正回報以 🟢 顯示,負回報以 🔴 顯示,使用 character_zh]
> 💡 **時段洞察:** [intraday_hourly.insight_zh] [intraday_hourly.data_quality_warning_zh]
---
## 📋 季節性交易策略
> 📊 基於過去 5 年歷史數據,透過滑動窗口分析找出各時間框架內最佳進出場時機
### ⚡ 0DTE(同日到期)⚠️ 僅基於 7 日數據
- 🟢 **樂觀:** [seasonality_strategy.0dte.up.condition_zh]\
📥 進場:[seasonality_strategy.0dte.up.entry_zh]\
📤 出場:[seasonality_strategy.0dte.up.exit_zh]
- 🔴 **悲觀:** [seasonality_strategy.0dte.down.condition_zh]\
📥 進場:[seasonality_strategy.0dte.down.entry_zh]\
📤 出場:[seasonality_strategy.0dte.down.exit_zh]
- ⚪ **中立:** [seasonality_strategy.0dte.range.condition_zh]\
📥 進場:[seasonality_strategy.0dte.range.entry_zh]\
📤 出場:[seasonality_strategy.0dte.range.exit_zh]
### 📅 短線(14 DTE)
- 🟢 **樂觀:** [seasonality_strategy.14dte.up.condition_zh]\
📥 進場:[seasonality_strategy.14dte.up.entry_zh]\
📤 出場:[seasonality_strategy.14dte.up.exit_zh]
- 🔴 **悲觀:** [seasonality_strategy.14dte.down.condition_zh]\
📥 進場:[seasonality_strategy.14dte.down.entry_zh]\
📤 出場:[seasonality_strategy.14dte.down.exit_zh]
- ⚪ **中立:** [seasonality_strategy.14dte.range.condition_zh]\
📥 進場:[seasonality_strategy.14dte.range.entry_zh]\
📤 出場:[seasonality_strategy.14dte.range.exit_zh]
### 📆 中線(14-45 天)
- 🟢 **樂觀:** [seasonality_strategy.longer_term_14_45d.up.condition_zh]\
📥 進場:[seasonality_strategy.longer_term_14_45d.up.entry_zh]\
📤 出場:[seasonality_strategy.longer_term_14_45d.up.exit_zh]
- 🔴 **悲觀:** [seasonality_strategy.longer_term_14_45d.down.condition_zh]\
📥 進場:[seasonality_strategy.longer_term_14_45d.down.entry_zh]\
📤 出場:[seasonality_strategy.longer_term_14_45d.down.exit_zh]
- ⚪ **中立:** [seasonality_strategy.longer_term_14_45d.range.condition_zh]\
📥 進場:[seasonality_strategy.longer_term_14_45d.range.entry_zh]\
📤 出場:[seasonality_strategy.longer_term_14_45d.range.exit_zh]
### 📆 月度(按月規劃)
- 🟢 **樂觀月份(適合建立多頭):**\
[以 seasonality_strategy.monthly.bullish 生成,使用 month_zh]
- 🔴 **悲觀月份(適合避險或做空):**\
[以 seasonality_strategy.monthly.bearish 生成]
- ⚪ **中立月份(適合持有或賣方策略):**\
[以 seasonality_strategy.monthly.neutral 生成]
> ⚠️ 過往表現不代表未來結果。本策略基於歷史統計規律,非預測工具。
---
## 📊 財報前後價格行為分析
> 📊 基於過去 5 年共 [earnings_seasonality.num_quarters_analyzed] 季數據 | ⏱️ 短線交易者參考(持有 2 週)
### 📈 總體統計
| 📌 期間 | 📊 平均回報 | 📐 中位數 | 🏆 上漲機率 | 📋 波動率特徵 |
|-----------|:-----------:|:---------:|:-----------:|:-------------:|
[從 earnings_seasonality.overall 填入實際數據]
| 📅 財報前 2 週 | [pre_avg] | [pre_med] | [pre_win] | 年化波動率 N/A |
| 📅 財報後 2 週 | [post_avg] | [post_med] | [post_win] | 年化波動率 N/A |
| 🚪 財報日 Gap | [gap_avg] | [gap_med] | [gap_win] | 當日範圍 [avg_intraday_range_pct]% |
| 🔄 Gap 後趨勢延續率 | — | — | [gap_follow] | 反轉率 [gap_reverse] |
*🔄 Gap 後趨勢延續率 = 財報後 2 週走勢與 Gap 方向相同的比例*
### 📋 各季度明細
| 📅 季度 | 📍 財報月份 | 📊 樣本 | 🕐 財報前 2 週 | 🕑 財報後 2 週 | 🚪 Gap | 🔄 延續率 |
|:-------:|:-----------:|:------:|:--------------:|:--------------:|:-----:|:---------:|
[以 earnings_seasonality.by_quarter 生成 4 行表格,每行開頭加上 🌸☀️🍂❄️ 季度 emoji]
### 📈 近期趨勢(近 [recent_N] 季)
- 📈 近 [recent_N] 季財報前 2 週平均:[recent_pre_avg]
- 📊 近 [recent_N] 季財報後 2 週平均:[recent_post_avg]
- 🔥 連續 [consecutive_gap] 季財報日 Gap 為正值 ✅
### 🎯 目前季度展望
**從 earnings_seasonality.current_outlook 填入以下所有佔位符號:**
**📅 [current_quarter] 財報(預估 [next_ed])— [proximity_zh]**
📈 [historical_pre_pattern_zh]
📊 [historical_post_pattern_zh]
**💡 建議:** [suggestion_zh]
---
## ⚔️ 多空對比
| 🐂 看漲理由 | 🐻 看跌理由 |
|:-----------:|:-----------:|
[從 thesis.bull_case / bear_case 陣列生成 5 行,每項前加 ✅ / ⚠️]
| **🎯 看好目標價:<thesis.bull_target>** 🚀 | **📉 看壞目標價:<thesis.bear_target>** ⚠️ |
---
## 📅 催化劑日曆
| 📆 日期 | 🚀 事件 | 🎯 預期影響 |
|:-------:|---------|:-----------:|
[從 thesis.catalysts 陣列生成,日期前加 📆,影響用 🟢🔴⚪]
---
> ⚠️ **免責聲明:** 本分析由 AI 系統生成,僅供教育與研究用途。非財務建議。不構成買入、賣出或持有任何證券的推薦。過往表現不代表未來結果。在做出投資決策前,務必自行進行盡職調查,並諮詢持牌財務顧問。AI 生成的分析可能存在錯誤或過時資訊。請獨立驗證所有數據。
MDEOF
步驟 C:驗證 .md 檔案
ls -la "$REPORT_DIR/<TICKER>-TRADE-ANALYSIS-zhTW-<DATETIME>.md"
階段五:從 JSON 生成繁體中文 PDF 報告
Canonical JSON 已包含所有分析數據。此階段使用 build_trade_report_json.py 注入 seasonality 快取、挑選繁體中文欄位,然後透過 generate_trade_pdf.py 生成 PDF。
注意:
seasonality區段由build_trade_report_json.py自動從快取載入。你只需要寫入分析數據(不含 seasonality),腳本會負責組裝完整 JSON。
5a:從 Canonical JSON 匯出簡化版
從 Canonical JSON ($CACHE_DIR/trade_json/<TICKER>.json) 複製到 /tmp/trade_report_data_simple_$$.json。移除 datetime、grade、signal、price、sub_scores、agent_raw、risk_raw 和 seasonality 鍵值(這些是 Canonical JSON 特有的,PDF 腳本不需要或會自動產生)。
python3 -c "
import json, sys
with open('${CACHE_DIR}/trade_json/<TICKER>.json') as f:
data = json.load(f)
# Remove canonical-only keys (not expected by build_trade_report_json.py / generate_trade_pdf.py)
for k in ['datetime', 'grade', 'signal', 'price', 'sub_scores', 'agent_raw', 'risk_raw', 'seasonality']:
data.pop(k, None)
with open('/tmp/trade_report_data_simple_$$.json', 'w') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
"
5b:組裝完整 JSON(注入 seasonality 快取數據)
python3 .claude/scripts/build_trade_report_json.py <TICKER> zhTW \
/tmp/trade_report_data_simple_$$.json \
/tmp/trade_report_data_$$.json
5c:執行 PDF 生成器
傳入輸出檔名(無路徑),Python 腳本會自動輸出到 REPORT_DIR (.reports_generated/):
python3 .claude/scripts/generate_trade_pdf.py /tmp/trade_report_data_$$.json <TICKER>-TRADE-REPORT-zhTW-<DATETIME>.pdf
如果 Python 腳本不在 .claude/scripts/generate_trade_pdf.py,檢查專案目錄中的 scripts/generate_trade_pdf.py。
如果未安裝 reportlab:
pip3 install reportlab 2>/dev/null || pip install reportlab 2>/dev/null
5d:清理暫存檔
rm -f /tmp/trade_report_data_simple_$$.json /tmp/trade_report_data_$$.json
繁體中文 PDF 已輸出至
$REPORT_DIR/<TICKER>-TRADE-REPORT-zhTW-<DATETIME>.pdf。
階段六:生成英文 PDF 報告
繁體中文 PDF 生成後,從 Canonical JSON 建立英文版數據並生成英文 PDF。
6a:建立英文版 JSON
⚠️ 這是防止中文滲入英文 PDF 的關鍵步驟。必須仔細檢查每個欄位。
步驟 6a-1:讀取英文公司概況快取
python3 .claude/scripts/cache_company_profile.py read <TICKER>
記錄輸出中的 business_summary、major_products_revenue、partners、competitors — 這些是英文值,稍後填入 JSON。
步驟 6a-2:從 Canonical JSON 匯出簡化版
python3 -c "
import json, sys
with open('${CACHE_DIR}/trade_json/<TICKER>.json') as f:
data = json.load(f)
for k in ['datetime', 'grade', 'signal', 'price', 'sub_scores', 'agent_raw', 'risk_raw', 'seasonality']:
data.pop(k, None)
with open('/tmp/trade_report_data_simple_enUS_$$.json', 'w') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
"
步驟 6a-3:將所有繁體中文值翻譯為英文
讀取 /tmp/trade_report_data_simple_enUS_$$.json,逐一翻譯以下欄位。不可跳過任何一項:
| # | JSON 路徑 | 繁體中文範例 | 英文翻譯目標 |
|---|---|---|---|
| 1 | company_name |
"微軟公司" | "Microsoft Corporation" |
| 2 | tldr |
"A 級買進..." | "Grade A BUY..." |
| 3 | company_profile.business_summary |
從步驟 6a-1 快取 | 直接使用快取的英文值 |
| 4 | company_profile.major_products_revenue[].product |
中文產品名 | English product names |
| 5 | company_profile.major_products_revenue[].description |
中文描述 | English description |
| 6 | company_profile.partners[] |
中文合作描述 | English (keep "Name — desc" format) |
| 7 | company_profile.competitors[] |
中文競爭描述 | English (keep "Name — desc" format) |
| 8 | technical.key_levels[].level |
"阻力 2"、"支撐 1" | "Resistance 2", "Support 1" |
| 9 | technical.key_levels[].notes |
中文備註 | English notes |
| 10 | technical.indicators[].indicator |
"趨勢方向"、"形態" | "Trend Direction", "Pattern" |
| 11 | technical.indicators[].value |
"上漲趨勢"、"黃金交叉" | "Uptrend", "Golden Cross" |
| 12 | technical.indicators[].interpretation |
中文解讀 | English interpretation |
| 13 | technical.outlook_zh |
中文技術展望 | English technical outlook |
| 14 | fundamental.metrics[].metric |
"本益比"、"股價營收比" | "P/E Ratio", "P/S Ratio" |
| 15 | fundamental.metrics[].assessment |
中文評估 | English assessment |
| 16 | fundamental.valuation_assessment |
中文估值摘要 | English valuation summary |
| 17 | fundamental.moat.rating |
"寬廣"、"中等" | "Wide", "Moderate" |
| 18 | fundamental.moat.sources[] |
中文護城河描述 | English moat sources |
| 19 | fundamental.outlook_zh |
中文基本面結論 | English fundamental conclusion |
| 20 | sentiment.news_sentiment_zh |
中文新聞情緒 | English news sentiment |
| 21 | sentiment.social_buzz_zh |
中文社群熱度 | English social buzz |
| 22 | sentiment.analyst_consensus_zh |
中文分析師共識 | English analyst consensus |
| 23 | sentiment.institutional_activity_zh |
中文法人活動 | English institutional activity |
| 24 | sentiment.insider_short_zh |
中文內部人/放空 | English insider/short |
| 25 | sentiment.outlook_zh |
中文情緒結論 | English sentiment conclusion |
| 26 | risk.risk_level_zh |
"低/中等/高/極高" | "Low/Moderate/High/Very High" |
| 27 | risk.max_drawdown_scenario |
中文描述 | English description |
| 28 | risk.volatility |
中文描述 | English description |
| 29 | risk.correlation |
中文描述 | English description |
| 30 | risk.sizing_methodology |
中文方法論 | English methodology |
| 31 | risk.scenarios[].scenario |
"樂觀/中立/悲觀" | "Bull Case/Neutral Case/Bear Case" |
| 32 | risk.scenarios[].trigger |
中文觸發條件 | English trigger |
| 33 | risk.key_risks_zh[] |
中文風險列表 | English risk list |
| 34 | risk.outlook_zh |
中文風險結論 | English risk conclusion |
| 35 | thesis.core_thesis_zh |
中文核心論點 | English core thesis |
| 36 | thesis.bull_case[] |
中文看漲理由 | English bull case (full sentences) |
| 37 | thesis.bear_case[] |
中文看跌理由 | English bear case (full sentences) |
| 38 | thesis.catalysts[].event |
中文事件名稱 | English event name |
| 39 | thesis.catalysts[].impact |
中文影響描述 | English impact description |
| 40 | thesis.entry_exit.entry_reason_zh |
中文進場理由 | English entry reason |
| 41 | thesis.outlook_zh |
中文論點結論 | English thesis conclusion |
| 42 | categories["Risk Profile"].score |
(數值,無需翻譯) | Keep numeric |
⚠️ trend_analysis 雙語欄位:
multi_timeframe[].timeframe(需timeframe_en)、direction、strength、moving_toward、historical_reference.observation、current_position.phase、current_position.assessment— 確保_en後綴值已填入。不可遺漏timeframe_en。build_trade_report_json.py的_promote_trend_fields會自動選取_en版本。若_en值缺失,腳本會 fallback 到_zh(中文),導致英文 PDF 出現中文。
步驟 6a-4:寫入翻譯後的英文 JSON
完成所有翻譯後,將結果寫入 /tmp/trade_report_data_simple_enUS_$$.json。
步驟 6a-5:驗證無殘留中文
強制驗證步驟 — 不可跳過:
echo "=== 檢查英文 JSON 中是否殘留中文字元 ==="
python3 -c "
import json, re, sys
with open('/tmp/trade_report_data_simple_enUS_$$.json') as f:
data = json.load(f)
text = json.dumps(data, ensure_ascii=False)
matches = [(m.start(), m.group()) for m in re.finditer(r'[\u4e00-\u9fff]', text)]
if matches:
print(f'❌ 發現 {len(matches)} 個中文字元!必須修正後再繼續。')
# Show first 20 with context
for i, (pos, ch) in enumerate(matches[:20]):
start = max(0, pos - 15)
end = min(len(text), pos + 15)
print(f' #{i+1}: ...{text[start:end]}...')
sys.exit(1)
else:
print('✅ 英文 JSON 無殘留中文字元,可繼續。')
"
若驗證失敗(exit code ≠ 0):回到步驟 6a-3,重新檢查並翻譯殘留的中文字元。不可忽略此驗證。
⚠️ 格式要求與階段三相同:partners/competitors 必須「公司名稱 — 描述」格式,moat.sources 完整句子,thesis 理由完整句子(>25 字元)。
JSON 頂層鍵值保持英文以相容 PDF 生成腳本。不要包含 seasonality 鍵值,該鍵值由後續腳本自動注入並挑選英文欄位。
6b:組裝完整 JSON(注入英文 seasonality)
python3 .claude/scripts/build_trade_report_json.py <TICKER> enUS \
/tmp/trade_report_data_simple_enUS_$$.json \
/tmp/trade_report_data_enUS_$$.json
6c:執行 PDF 生成器(英文版)
python3 .claude/scripts/generate_trade_pdf.py /tmp/trade_report_data_enUS_$$.json <TICKER>-TRADE-REPORT-enUS-<DATETIME>.pdf
注意:英文 PDF 檔名使用 -enUS- 後綴(例如 TSLA-TRADE-REPORT-enUS-2026-05-28-1700.pdf),以明確區分語言版本。
6d:清理
rm -f /tmp/trade_report_data_simple_enUS_$$.json /tmp/trade_report_data_enUS_$$.json
英文 PDF 已輸出至
$REPORT_DIR/<TICKER>-TRADE-REPORT-enUS-<DATETIME>.pdf。
階段七:驗證與回報
全部四個產出物寫入後:
7a:驗證檔案
ls -la "$REPORT_DIR/<TICKER>-TRADE-ANALYSIS-zhTW-<DATETIME>.md" \
"$REPORT_DIR/<TICKER>-TRADE-REPORT-zhTW-<DATETIME>.pdf" \
"$REPORT_DIR/<TICKER>-TRADE-REPORT-enUS-<DATETIME>.pdf"
7b:驗證 JSON 快取
ls -la "$CACHE_DIR/trade_json/<TICKER>.json"
7c:終端摘要
顯示:
- 交易評分、等級、信號
- Canonical JSON 快取路徑:
$CACHE_DIR/trade_json/<TICKER>.json - .md 報告路徑(繁體中文):
$REPORT_DIR/<TICKER>-TRADE-ANALYSIS-zhTW-<DATETIME>.md - 繁體中文 .pdf 報告路徑:
$REPORT_DIR/<TICKER>-TRADE-REPORT-zhTW-<DATETIME>.pdf - 英文 .pdf 報告路徑:
$REPORT_DIR/<TICKER>-TRADE-REPORT-enUS-<DATETIME>.pdf - 檔案大小
- 提醒:僅供教育用途
可用以下指令查看 REPORT_DIR 中的所有報告:
ls -lh "$REPORT_DIR/"
錯誤處理
- 如果 WebSearch 失敗,以修改後的查詢重試。如果再次失敗,記錄數據缺口並繼續。
- 如果任何子代理人未能回傳,記錄該代理人並使用可用數據繼續。按比例調整權重。
- 如果 PDF 生成腳本不存在,通知使用者並僅提供 .md 檔案 + JSON 快取。
- 若繁體中文 PDF 生成成功但英文 PDF 生成失敗,仍交付 .md + 繁體中文 .pdf + JSON 快取並回報英文 PDF 問題。
- 如果缺少 reportlab,自動安裝。
- 如果 JSON 格式錯誤,驗證並重試。
- 如果 Canonical JSON 快取寫入失敗,仍繼續後續 .md / .pdf 生成(使用記憶體中的 JSON)。
規則
- 始終平行執行全部 5 個子代理人 — 永不依序執行
- 始終使用檔案系統安全的日期時間格式作為檔名(例如
2026-05-28-1430) - 所有三個檔案一律輸出到 REPORT_DIR (
$REPORT_DIR/) 繁體中文檔案必須包含-zhTW後綴,英文 PDF 必須使用-enUS-後綴:$REPORT_DIR/<TICKER>-TRADE-ANALYSIS-zhTW-<DATETIME>.md$REPORT_DIR/<TICKER>-TRADE-REPORT-zhTW-<DATETIME>.pdf$REPORT_DIR/<TICKER>-TRADE-REPORT-enUS-<DATETIME>.pdf
- 所有代理人分析和 .md 報告內容必須使用繁體中文
- JSON 頂層鍵值保持英文(相容 PDF 生成腳本),值使用繁體中文;trend_analysis 文字欄位使用
_zh/_en雙語後綴 - 始終在 .md 和 .pdf 輸出中包含繁體中文教育用途免責聲明
- 始終在回報完成前驗證四個產出物(Canonical JSON + .md + zhTW .pdf + enUS .pdf)。不可偷懶只生成部分就結束。
- PDF 生成後始終清理 /tmp 暫存檔(
trade_report_data_simple_$$.json、trade_report_data_$$.json等) - 絕不跳過任何 PDF 生成步驟 — 產生雙語 PDF(繁體中文 + 英文)是此技能的定義特徵。繁體中文 PDF 使用
-zhTW-後綴,英文 PDF 使用-enUS-後綴。兩者都必須生成。 - 如果使用者已提供股票代號,直接開始階段一,無需確認
- 🎨 Emoji 強化規則: 所有 .md 報告中必須大量、策略性地使用表情符號。具體要求:
- 📊 評分儀表板:各維度前加上 🔵🟢🟡🔴🟣 等彩色圓點
- 📈 技術面:上漲趨勢使用 📈,下跌使用 📉,警示使用 ⚠️🚨
- 🐂🐻 多空對比:看漲理由前加 ✅ 或 🐂,看跌理由前加 ⚠️ 或 🐻
- 📅 催化劑:每行前加 📆,重要性用 🚀🎯⏰ 區分
- 💼 進出策略:參數欄位前加 📥🛑🎯🚀⚖️📦⏰ 等對應 emoji
- 📋 表格:每個表格的欄位標題前加上相關 emoji
- 🏆 季節性:最佳/最差月份使用 🏆⚠️,月份前加 ☀️🌧️❄️🌸 等天氣 emoji
- 💡 結論:每段重點結論開頭使用 🎯💡🔑💪 引導
- 目標:讓讀者一眼就能透過 emoji 判斷好壞、方向、風險程度
- 📝 資料完整性規則(不可截斷): Canonical JSON 中的文字欄位必須為完整描述。
build_trade_report_json.py與generate_trade_pdf.py都會自動檢查並在發現截斷時發出警告。company_profile.business_summary:>100 字元partners/competitors:每項含—分隔的公司名稱與描述moat.sources:每項 >30 字元完整句子thesis.bull_case/bear_case:每項 >25 字元完整句子thesis.catalysts[].impact:>15 字元描述technical.indicators[].interpretation:>30 字元完整解讀句fundamental.metrics[].assessment:>20 字元評估結論
- JSON-First 規則: Canonical JSON 是所有輸出的唯一數據來源。.md 和 .pdf 都從同一個 JSON 渲染,不得各自從原始代理人回傳內容重新提取數據。
- 🇬🇧 英文 PDF 無中文規則: 英文 PDF(
-enUS-)絕對不能包含任何中文字元。階段六必須:- 步驟 6a-3 逐一翻譯 42+ 個欄位(見翻譯對照表),含
trend_analysis.multi_timeframe[].timeframe→timeframe_en、duration_range(使用days)、estimated_remaining_days(使用days) - 步驟 6a-5 強制執行中文殘留檢查(exit code ≠ 0 時必須修正)
trend_analysis的_en後綴欄位(含timeframe_en、direction_en、strength_en、moving_toward_en、observation_en、phase_en、assessment_en)必須確保已填入英文值,不可留空(否則 fallback 到_zh中文)company_profile必須使用公司概況快取的英文值(不應出現任何中文)
- 步驟 6a-3 逐一翻譯 42+ 個欄位(見翻譯對照表),含
免責聲明:僅供教育/研究用途。非財務建議。