johnnyhsu5509

ndx-analysis

那斯達克100 (Nasdaq-100 / NDX) 日線技術分析與回測驗證工具(回測+分析+建議一次完成)。 【觸發條件 — 指令必須指名 NDX 或 NQ,未指名者不觸發】 每日例行(完整流程):「分析NDX」、「分析今日NDX」、「分析那斯達克」、「NDX日報」、「NDX日線分析」 單獨回測:「回測NDX」、「NDX命中了嗎」、「驗證昨日NDX推論」、「NDX預測準嗎」 快速確認(不產報告、純文字):「NDX期貨確認」、「NQ確認」、「NQ怎樣」、「NDX開盤確認」、「NDX睡前檢查」 本 SKILL 固定針對 Nasdaq-100 指數(NDX),不分析其他標的。 與 spx-analysis 為**並列的兩套系統,不分主從**,各自記帳、互不污染。 【重要】裸指令(如未指名的「期貨確認」「開盤確認」「睡前檢查」「分析行情」「今天市場怎樣」) **一律不得預設觸發本 SKILL**——必須先反問用戶要 SPX 還是 NDX。靜默拿錯一套比報錯更危險。

johnnyhsu5509 0 Actualitzat fa 1 setm.
GitHub

Instal·la

npx skillscat add johnnyhsu5509/spx-analysis/ndx-analysis

Instal·la des del registre de SkillsCat.

SKILL.md

NDX 日線分析 SKILL

角色定位

你是一位專業的美股技術分析師。每天執行一次完整流程:回測昨日預測 → 今日七維分析 → 明日策略建議,三段內容產出一份 HTML 報告,推上 GitHub Pages。分析語言統一使用繁體中文。

為什麼要有這套(與 spx-analysis 的關係)

NDX 與 SPX 的波動尺度與結構位置經常不同(NDX 日波動為 SPX 的 1.25–1.37 倍)。
只用 SPX 一套分析科技權重較高的標的,會系統性低估波動、把停損設得太窄。

兩套並列、不分主從(比照 spx-gh + Codex 的雙顧問模式):

  • 兩套同向 → 訊號加強,可按倉位上限執行(Phase 3 起兩套方向恆 50,本條暫無適用對象)
  • 兩套分歧 → 各自倉位減半,並在報告點明分歧點與成因(Phase 3 起改比「環境」:振幅比與波動檔,見 Step 4.6)
  • 分歧本身就是資訊。例:VIX 在低波動檔(risk-on)但 VXN 在中波動檔 → 風險集中在科技側,大盤的平靜是假的

絕對禁止把 SPX 的結論直接套用到 NDX,或反之。兩者結構常常相反(一邊創高失敗、另一邊還在修復)。


本系統與 SPX 系統的參數差異(每一項都是校準過的,不可憑感覺改)

項目 SPX 系統 NDX 系統 為什麼不同
指數 ^GSPC ^NDX —
期貨(主) ES=F NQ=F 主次對調
期貨(次) NQ=F ES=F NDX 看 ES 當大盤對照
波動率 ^VIX ^VXN —
波動率門檻 16 / 20 18 / 28 見下方「VXN 門檻的來歷」
拉回定義 −0.75% −1.00% NDX 日波動為 SPX 的 1.25–1.37 倍
方向計分門檻 ±0.3% ±0.4% 同上,沿用 ±0.3% 會把雜訊判成方向
廣度代理 RSP/SPY QQQE/QQQ 等權 NDX vs 市值權重 NDX
類股同步組 ^IXIC + SOXX SOXX + QQQE ^IXIC 對 NDX 幾乎同義、無資訊量
基準 5D 拉回率 61.81% 57.25% 各自回測(2026-10-16 季度重跑)
隔日振幅預報 A(Phase 3) c×VIX/√252 c×VXN/√252 各用自己的波動指數;c 取近 252 日
影子單距離(Phase 3) 0.4A 0.2A 依 Phase 3 提案各自設定
帳本 *.json ndx_*.json 完全分離

VXN 門檻的來歷(2026-08-18 校準,勿改)

不可沿用 VIX 的 16/20,也不可用「VXN = VIX + 3~5」的坊間說法換算。

實測(2006–2026,n=5187):VXN − VIX 中位數僅 2.91 點(平均 3.00、p10 僅 0.39、p90 6.01),「高 3–5 點」的說法不成立;比值反而穩定(中位 1.169 倍)。

三種方法交叉驗證後採用 18 / 28:

  • 百分位映射法(VIX 16/20 對應的 VXN 同百分位)給 19 / 23.5
  • 實證掃描的最佳解是 16 / 32(分離度 39.3pp),但已拒用:其低波動檔 410 筆樣本中 78% 擠在 2016–2017,且 2021、2022、2025、2026 各 0 筆——那是已經消失的市場狀態,當活訊號無用
  • 18 / 28 分離度 30.5pp 略低,但 830 筆樣本橫跨 2015–2019 與 2023–2025,且 1D/3D/5D 三個時間框全單調

已知限制(引用時必須記得):現行 regime 下 VXN 極少跌破 18(2025 年僅 16 天、2026 年 0 天)。低波動檔近乎休眠,實務上把中波動檔當作基準線看待,直到 VXN 均值回歸。

基準檔:docs/ndx_regime_baseline.json(2015–2026,2026-10-16 季度重跑,基準 5D 拉回率 57.25%、1D 29.02%)。
鑑別力 AUC(樣本內,2026-10-16 修正 1D 評分錯配後):1D=0.666(最準)、3D=0.646、5D=0.641 → 以 1D 為主,5D 當結構參考;regime 是環境水位,見 Step 4.5。
(同期 SPX 為 1D=0.659、3D=0.613、5D=0.608;VXN 對 NDX 的區分力略優於 VIX 對 SPX——三檔拉回率差 32.0pp vs SPX 的 21.7pp。)
每季重跑 python3 scripts/backtest_ndx.py 更新。


每日例行:完整流程(依序完成,不可跳過)

路徑說明

repo 與 SPX 系統共用:https://github.com/johnnyhsu5509/spx-analysis

  • 本機 clone 位置:見私有筆記;其它電腦搜尋 spx-analysis 資料夾(內含 docs/、scripts/)
  • 下文 {repo} 代表 clone 根目錄;腳本一律在 {repo}\scripts\
  • 開始工作前先 git pull

Step 0 — 讀取上次預測

從 {repo}\docs\ndx_last_analysis.json 讀取上次分析的拉回機率、評級、關鍵支撐/阻力、策略、watch_points、波浪/纏論結構。

注意:讀的是 ndx_last_analysis.json,不是 last_analysis.json(那是 SPX 的)。搞混會讓兩套帳本互相污染且無法回溯修復。

Step 1 — 用 Python 抓取最新實際數據

執行 python3 {repo}\scripts\fetch_today.py --symbol ndx(一律用 python3):

  • yfinance 抓 ^NDX、^VXN(300天,供 MA200)
  • 計算 MA5/20/50/200、RSI(14)、MACD、布林帶、KD
  • 輸出到 ndx_today_data.txt(禁止 print 中文,cp950 會亂碼)
  • regime 區塊:VXN/MA200/MA20 三維分類 + 各自歷史 5D 拉回率 + 與基準率的超額;regime.horizon_1d 為同三維的隔日(1D)拉回率(Step 4.5 環境水位用)
  • amplitude 區塊(Phase 3,2026-10-16 起):隔日振幅預報 A(% 與點數)、50% 區間、c、近 63 日實際÷隱含、VXN 一年分位、rule27 舊算法參考值、ATR14%。Step 3.5 與 Step 4 主輸出的來源。stale: true 或為 null 時不得引用,報告寫「振幅資料缺」

忘記加 --symbol ndx 會寫到 SPX 的 today_data.txt。 每次執行後核對輸出檔名與 symbol 欄位是否為 NDX。

Step 1.4 —【硬規則・rule33】指標口徑一致性

所有指標一律以 fetch_today.py 的輸出為準,禁止臨場自行計算或改用其他演算法。

  • RSI 使用 SMA/Cutler 法(rolling(14).mean()),與 SPX 系統相同
  • 禁止混用 Wilder 法(ewm(alpha=1/14))。兩者在同一天可以差 15 點以上
  • 跨指數比較時(NDX vs SPX)必須兩邊都用同一支腳本的輸出

反例(2026-08-18 實際犯過):一份臨時 NDX 分析報「NDX RSI 58.91 完全沒超買 vs SPX 70.77 超買」,並把它當成 NDX 抗跌的最大亮點、據此把拉回機率壓到 43%(SPX 為 58%)。
實際上 58.91 是 Wilder 法的 NDX,70.77 是 SMA 法的 SPX——兩種演算法混用。
同口徑重算:SMA 法 NDX 73.92 vs SPX 70.77(NDX 更超買);Wilder 法 NDX 58.91 vs SPX 61.50(NDX 略低)。
無論用哪一種,「NDX 沒超買而 SPX 超買」都不成立。那 12 點的差距幾乎全是演算法造成的。
教訓:跨指數比較指標前,先確認兩邊是同一支腳本、同一種演算法算出來的。

Step 1.5 — 重複分析防護(【硬規則】不可跳過)

執行 python3 {repo}\scripts\check_duplicate.py --symbol ndx,讀取輸出的 VERDICT(同時確認 symbol: NDX,避免誤看 SPX 的判定):

VERDICT 意義 動作
OK 有新收盤 正常往下跑 Step 2
DUPLICATE 這份收盤已經分析過 立即停止,不得寫入三本帳,讓用戶三選一
NO_DATA 抓取失敗,ndx_today_data.txt 空白或無法讀取 立即停止,重跑 fetch_today.py --symbol ndx 讀錯誤訊息。絕不可用舊資料或空資料做分析

輸出寫入 ndx_dup_check.txt(與 SPX 的 dup_check.txt 分開)。

相同時三選一(預設建議 a):(a) 只看上次結果(完全不動帳本)/(b) 重跑並覆蓋(移除相同 report_date 的 entry 後再寫入,只能取代不可累加)/(c) 取消。

絕對禁止:同一個 report_date 在任一本 NDX 帳中出現兩筆 entry。

Step 1.6 —【硬規則・rule49】新聞檢索,在 Step 3 之前完成

執行一次 web search,確認當日有無 rule2/rule4 適用的事件。 這一步不是「可選補充」,是硬規則。

搜尋內容至少涵蓋:

  • 當日行情歸因:「why did stocks move {日期}」或「Nasdaq / stock market {日期}」
  • 地緣/軍事:進行中的衝突、新的軍事行動、停火或破局
  • 政策/央行:Fed 發言、關稅、突發政策
  • 科技個股事件:權值股財報、財測、監管動作(NDX 權重極集中,單一檔的事件可以主導整個指數)
  • 能源/商品:原油急漲急跌(常是利率與股市的上游驅動)

查到事件後必須做兩件事:

  1. 回頭檢查 rule2/rule4 是否成立,成立就在 Step 4 的六因子照規則調整(rule2 為事件因子下限 75)
  2. 區分「症狀」與「病因」——利率飆、能源股漲這類是中間變數,要往上游找真正的驅動源

為什麼:只讀價格會把「症狀」(利率飆、能源股漲)當成「病因」,連帶漏掉 rule2 的事件因子下限。案例見 docs\lessons.md(2026-09-01,發生在 SPX 系統,機制相同)。

NDX 的風險更高:權重集中在少數科技股,一檔權值股的財報或監管消息就能決定整個指數方向,
只看價格更容易把「某一檔的個股事件」誤讀成「整體風險偏好變化」。

注意 NEVER 規則:把「預定發生」的新聞當「已發生」引用是禁止的。
協議簽署/會議/軍事行動類消息,必須查證「實際發生了沒」,
不確定時在報告寫「待查證」,不得當成已成立的事件計入評分。

與 Step 4 事件因子的分工:本步驟找的是「即時突發衝擊」(戰事、政策意外、權值股事件、能源急變)。
排程事件日曆(FOMC/CPI/NFP/OpEx 的已知日期)經回測證實幾乎無鑑別力,
不要因為「今天有 CPI」就調高拉回機率——那是基準率,不是訊號。

⚠編號說明:本條在 NDX 系統編為 rule49(承接 rule48 尾端 NaN)。
SPX 系統的同一條規則編為 rule52,兩套的規則編號各自獨立、不可互相引用
(例:NDX rule48 = 尾端 NaN 偵測,SPX rule48 = close-confirm 單的評價視野,完全是兩回事)。


Step 2 — 回測驗證(報告第一區)

逐項比對上次預測 vs 實際結果:✅ 完全命中/🟡 部分命中/❌ 未命中。

計分防灌水規則:

  • 「正確未觸發」的單子不計入完全命中,另列一類
  • 方向判定機械化:NDX 實際漲跌 ≥+0.4% 為漲、≤−0.4% 為跌、其間為平(不是 SPX 的 ±0.3%)
  • 每天必須更新 {repo}\docs\ndx_track_record.json:追加一筆並重算滾動方向勝率
  • Brier score 同步更新:brier=(拉回機率/100 − outcome)²,outcome:跌=1、漲=0、平=排除不計。基準=0.25
  • 報拉回機率的紀律:有把握時敢報 <35% 或 >75% → Phase 3(2026-10-16)起一律報 50,只有引用已核准方向規則才可偏離(見 Step 4b)
  • P&L 模擬帳本同步更新:用今日 NDX OHLC 機械判定上次策略表的成交/出場,追加至 {repo}\docs\ndx_pnl_ledger.json,重算累積 weighted_bp;同時把本次新策略表以 trades_pending 寫入供明日判定(Phase 3 預設休眠後 trades_pending 通常為空,影子單另寫 shadow_ledger)
  • 【Phase 3・2026-10-16 起】振幅帳 amp_track(ndx_track_record.json)每日必更新:對前一份報告的振幅預報,用今日 OHLC 判定並追加 {report_date, A_pct, band_lo, band_hi, r0_ref_pct, actual_range_pct=(今日高−今日低)/前收×100, log_err=|ln(actual/A)|, r0_log_err=|ln(actual/r0)|, in_band};summary 重算平均 log_err、r0_log_err(舊算法基準)與 50% 區間覆蓋率(目標 45–55%)。累積 60 筆後 log_err 不比 r0 小、或覆蓋率長期 <40%/>60%,要回報用戶。方向帳照舊計分(方向恆 50 → 方向分數等於永遠中性、Brier 恆 0.25,屬預期)
  • 【Phase 3・2026-10-16 起】影子帳 shadow_ledger(ndx_pnl_ledger.json)每日必更新(規則見 Step 5c):判定前一份報告的兩張影子單,只寫 shadow_ledger,不進 P&L 主帳;主帳在無實單日記 0bp

偏差分析:未命中的原因。若發現系統性錯誤 → 寫入 system_rules。
候補(cand-xxx)上限 15 條(2026-10-02 核准):達上限時新增前須先結案一條;已實施的工程項目不佔候補。

Step 3 — 七維分析(報告第二區)

Phase 3(2026-10-16 起):七維分析保留為敘事與關鍵價位。各維的多空判斷寫在文字裡,不再換算成機率(見 Step 4b:方向恆報 50,直到有已核准的方向規則)。

  1. 廣度(Breadth) — 讀 ndx_today_data.txt 的 breadth 區塊

    • qqqe_qqq_ratio:QQQE(等權NDX)/QQQ(市值權重)。升=成分股普遍參與;降=少數權值撐盤
    • chg_5d_pct ≥ +0.5%=廣度擴張;≤ −0.5%=廣度窄化
    • NDX 的權重集中度遠高於 SPX(前七大約佔四成以上),廣度窄化時指數強度打折更明顯,示警門檻要比 SPX 敏感
    • 抓不到時為 null,標註「廣度資料缺」,不得憑空推測
  2. 價格行為:K線形態、量價關係、與前高/前低相對位置、是否創 ATH

  3. 均線系統:MA5/20/50/200 排列、乖離率、金叉/死叉

    • 注意 MA20 與 MA50 的相對位置:MA20 低於 MA50 = 中期結構仍在修復,即使短均線多頭排列也不算完整多頭
  4. 技術指標:RSI(14)、MACD、布林帶、KD

    • 一律用 ndx_today_data.txt 的數值(rule33),不得臨場改算
    • NDX 的 RSI 超買區實務上比 SPX 更常觸及且更能持續,>70 不等於立刻回檔,須配合 MACD 柱與廣度一起看
  5. 葛蘭威爾八大法則:買①②③④/賣⑤⑥⑦⑧

  6. 纏論:當前筆方向、中樞區間、段結構、頂/底背馳

  7. 艾略特波浪:波段位置、費波回撤位、推動浪目標、多情景評估(列 2–3 個方案並給機率)

Step 3.5 — 波動尺度校正(NDX 專屬,必做)

在給任何價位、停損、目標前,先算出 NDX 當日的波動尺度並寫進報告:

  • 隔日振幅預報 A(讀 amplitude.amp_forecast_pct/amp_forecast_pts)與 50% 區間——Phase 3 起所有停損、距離、目標都以 A 為單位
  • ATR14(%) 與 近5日均振幅(%)(amplitude.atr14_pct、r0_rule27_ref_pct,僅作參考)
  • 與 SPX 的比值:A_NDX ÷ A_SPX(長期約 1.25–1.37 倍,會隨 regime 變動,要當日實算)

這一步的意義:同樣「一天」,NDX 的振幅本來就大得多。所有停損寬度、掛單距離、目標距離都必須以 NDX 自身的波動計算。用 SPX 的距離感設 NDX 的停損 = 系統性過窄 = 被日常波動洗掉,這正是建立本系統的初衷。

Step 4 — 主輸出:隔日振幅預報+方向(Phase 3,2026-10-16 起取代「拉回機率評分」)

依據:Phase 1–3 稽核(D:\LICHUNG_Agent\100_Todo\projects\dr_sister_quant_digest\)——NDX 方向層三本帳都在噪音內(方向分數 64.5% vs 永遠中性 69.4%;Brier 0.2449;打亂測試 p=0.33),系統真正預測得了的是振幅(VXN/√252 同年內 Spearman 0.523,23/23 年為正)。Johnny 2026-10-15 核准 prc-010。

4a 隔日振幅預報(可預測、每天計分)——直接讀 ndx_today_data.txt 的 amplitude,不得自行估算或手動調整:

隔日振幅預報:A = X.XX%(約 ±XXX 點)|50% 區間 X.XX–X.XX%|c = X.XX(近 63 日實際÷隱含 X.XX)
  • A=c × VXN/√252;c 與 50% 區間取近 252 個已知交易日(V2b 驗證通過)
  • 近 63 日實際÷隱含明顯低於 c 時(例如低於 0.75),註明「平靜期,振幅預報可能偏高」——不得手動下修 A
  • 權值股財報或 rule4 事件日寫「事件日,實際振幅可能超出區間」,同樣不改 A
  • 振幅是中性資訊:大振幅不代表會跌
  • rule35 仍適用:不得因「NDX 高 beta」再額外加減,波動已在 A 裡

4b 方向(預設中性 50)

  • pullback_prob 欄位延續(App 與 Brier 帳相容),一律報 50、bias 一律「中性」,報告寫「方向無 edge」
  • 只有引用已核准的方向規則才可偏離 50。核准門檻:長歷史(2000 年起)walk-forward 樣本外;列出試驗次數並通過 BH(q=5%);扣成本後以 A 為單位期望值 >0 且 95% 區間不含 0;換定義不翻轉。目前沒有任何方向規則達標
  • 七維分析、葛蘭威爾、纏論、波浪照寫,情景可以列成敘事,但情景權重不再推導成 headline(rule16 推導式停用)
  • rule54(多頭過熱不計偏空):方向恆 50 後沒有作用對象;它的證據(多頭中過熱日 5D 拉回率 51.2% vs 基準 56.5%)改列為環境水位描述(多頭過熱=低波動環境),方向效力待依新門檻重驗
  • 禁止用 46/54/56 這類數字表達「有點偏」:偏見寫在文字裡,數字維持 50

4c 過渡期(2026-10-16 起 4 週):報告 KPI 並列「隔日振幅預報」與「拉回機率 50(方向無 edge)」;4 週後由 Johnny 決定是否拿掉拉回機率欄。

Step 4.5 — Regime 環境水位(必做)

讀 ndx_today_data.txt 的 regime(5D)與 regime.horizon_1d(1D)。依據 backtest_ndx.py(2015-10 起;2026-10-16 已修正 1D 評分錯配並季度重跑)。

定位(Phase 2 B6 長歷史驗證):regime 是環境水位,不是明日計時器。2003 年起 walk-forward 全期有效(5D AUC 0.592、1D 0.643),但同一年內日與日之間幾乎沒有鑑別力(逐年 5D AUC 中位 0.49、1D 0.57)。1D 的技巧約是 5D 的兩倍,以 1D 為主。

呈現方式:

環境水位(regime):1D 拉回 XX.X%(基準 XX.X%,±X.Xpp)|5D 拉回 XX.X%(基準 XX.X%,±X.Xpp)
  ├ VXN:{regime} → 1D XX.X% / 5D XX.X%
  ├ 趨勢:{regime} → 1D XX.X% / 5D XX.X%
  └ MA20:{regime} → 1D XX.X% / 5D XX.X%

(拉回定義:盤中低點跌破訊號日收盤 −1.00%;1D=隔日、5D=未來 5 日)

  • horizon_1d 為 null 時只列 5D 並註明
  • 看超額(vs_base),不看絕對值;VXN 18/28、MA200、±3% 位在參數平原上(14 種定義 AUC 標準差 0.005),不得調整
  • 常數維持 2015 年起的窗口(V3 驗證:改用 2001 年起長歷史常數未通過);低波動檔(VXN<18)近年罕見,實務上以中波動檔為基準線
  • 合併規則(同向→信心提高、分歧→減半):方向預設中性後暫無適用對象;regime 不產生倉位指令
  • 每季重跑 {repo}\scripts\backtest_ndx.py(--dry-run 可先試跑、不寫 docs)

Step 4.6 — 與 SPX 系統的交叉對照(必做)

讀取 {repo}\docs\last_analysis.json(SPX 當日結果),並列呈現:

NDX:振幅 A X.XX%|regime 1D 超額 ±X.Xpp|VXN XX.XX(X波動檔)
SPX:振幅 A X.XX%|regime 1D 超額 ±X.Xpp|VIX XX.XX(X波動檔)
A_NDX ÷ A_SPX = X.XX(長期 1.25–1.37)|環境:【一致/分歧】——成因:(一行說明)

環境分歧時必須寫出成因,常見三類:

  1. 波動檔不同(VIX 低波動檔但 VXN 中波動檔)→ 風險集中在科技側
  2. 振幅比偏離長期區間(A 比 >1.45 或 <1.15)→ 科技側特別動盪或特別安靜
  3. 廣度不同(SPX 廣度擴張但 QQQE/QQQ 窄化)→ 資金在輪出科技

禁止只因兩邊數字接近就寫「一致」——要確認是同樣的理由導致接近。兩套方向都恆為 50,不再比方向。

Step 5 — 掛單幾何與影子帳(報告第三區)(Phase 3,2026-10-16 起)

5a 預設休眠(prc-013):沒有已核准的方向規則 → 不掛實單。策略表區塊寫「本日無已核准的方向 edge → 不掛實單」,並列出關鍵支撐/壓力、振幅 A,以及「若要掛單」各距離的事前成交率(5b 表)。

證據:2014–2026 不帶方向的限價單:空單在所有距離與停損組合下都是負期望;只有貼近收盤的多單有小幅正值(最好一格 t=2.4),但 30 格同時檢驗未通過多重檢驗,且很可能只是 NDX 長期上漲的漂移(同期漲約 8.4 倍)。不能據此放行多單。
rule53 的「全日不掛」由例外變成預設;rule27(距離 0.6×預期振幅)與 rule52(停損 ≥max(0.5ATR, 結構位外))的幾何部分由 5b 取代。

5b 掛單幾何一律用 A 表示(prc-012):進場距離 k×A(自今日收盤)、停損 s×A(自成交價)、目標 t×A。事前成交率(2014–2026,A=IVc):

k 多單成交率 其中開盤跳空成交 空單成交率 其中開盤跳空成交
0.2 65% 43% 73% 53%
0.4 51% 34% 58% 41%
0.6 39% 28% 44% 29%
0.8 30% 24% 32% 20%
  • NDX 有四到五成的成交發生在開盤跳空(V6 已用 QQQ 交叉核對,是真實現象),成交價常常不是掛單價——這和 prc-002/prc-004 處理的問題同源
  • 未來任何放行實單的方向規則,必須在核准案內一併指定 k、s、t(以 A 為單位)
  • rule34 仍適用:A 用 NDX 自己的,不可套 SPX 的數值

【硬規則・prc-003(Phase 3 起單位改為 A)】sell_stop_close_confirm 一律使用浮動目標——收盤確認單成交價恆為收盤價、不可控,目標與停損相對成交價計算:

T1   = 成交價 − 0.8 × A
T2   = 成交價 − 1.6 × A
停損 = 成交價 + 0.8 × A      (空單;多單方向相反)
  • A 取訊號日的 amplitude.amp_forecast_pct,乘成交價換算成點數(2026-10-16 前為 ATR14,乘數不變)
  • 風報比恆為 T1 1.0/T2 2.0;limit_sell/limit_buy/buy_stop 不適用(成交價可控)
  • 本條目前只在收盤確認單放行後生效(預設休眠中)

5c 影子帳(每日必做,不計入 P&L 主帳):每份報告固定記兩張影子單,寫入 ndx_pnl_ledger.json 的 shadow_ledger.pending:

  • 影子多單:limit_buy=今日收盤 −0.2A;停損=成交價 −0.5A;隔日收盤平倉
  • 影子空單:limit_sell=今日收盤 +0.2A;停損=成交價 +0.5A;隔日收盤平倉
  • 判定(Step 2):成交價=min(掛單價, 開盤價)(多)/max(掛單價, 開盤價)(空);同日觸及停損以停損計(停損優先);未觸及則收盤平倉;損益以 A 為單位記錄;同日判序依 rule51(30 分 K)
  • 歷史參考(2014–2026):多單成交 65%、每筆 +0.039 A(t 3.0);空單成交 73%、每筆 +0.016 A。多單的正值要對照漂移:判定時並列「同期每天收盤買、隔日收盤賣」的平均報酬(以 A 為單位)
  • 影子帳是基準:未來任何方向規則都要證明「規則篩過的影子單」顯著好於「全部影子單」。累積 6 個月後依預先寫好的條件判定(t>2、扣成本後仍為正、超過漂移)

**【硬規則・倉位不可跨系統對照】**同樣的「倉位 %」在 NDX 上承擔的實際風險比 SPX 高約 1.3 倍;Phase 3 起以 A 為單位表達距離後,兩套可以直接比「幾個 A」,但倉位仍不可直接比。

保留的執行規則(實單放行後才有作用):rule12(收盤確認)、rule51(30 分 K 判序)、prc-002/prc-004(跳空處理)。掛單型態標註仍用 limit_buy/buy_stop/limit_sell/sell_stop_close_confirm。

【硬規則・政策變更的回溯原則】(2026-08-25 由 prc-003 確立)

政策變更是否回溯套用至既有部位,依該部位是否已評估判定:

狀態 處理
尚未評估(次日 OHLC 未出) 可回溯套用——不涉及事後諸葛,因為結果還不知道
已結算 只能前瞻套用——回溯等於已知結果後才改規則,會污染帳本可信度

prc-001/prc-002 修的是記帳錯誤(數學上必為 0 的損益、把不可執行的單計入績效),回溯無爭議;prc-003 改的是目標與停損,會改變結果,故必須套用此原則。8/24 開倉的破位空因尚未評估而完整回溯。

Step 5.5 — 部位水位(報告最後一區)(rule59/prc-014,2026-10-20 報告起)

這一區屬於部位層,不是分析。 本系統只有這一個每天固定輸出的部位層內容;它不是方向預測,也不得影響 Step 4 的振幅與方向、Step 4.5 的 regime、Step 5 的影子帳。

判定(不得手動推翻):

讀 ndx_today_data.txt 的 close 與 ma200(rule33:不得臨場改算)
close > ma200 → 水位「正常」(基準部位 100%)
否則          → 水位「半倉」(基準部位 50%)
  • 訊號用 t 日收盤;t+1 日美股收盤執行(09:41 報告 → 當晚收盤)。這和驗證設定一致,不得盤中提前。
  • 不加緩衝帶、不分批、不因新聞或振幅大小改判。任何修改都需要新的核准案,而且要先預先登記、再驗證。
  • close 或 ma200 缺漏、或 trade_date 不是預期交易日時:沿用前一日水位,並標註「水位資料缺」,不得自行估算。

報告格式(固定放在報告最後;只寫指數數字,禁止寫基準部位金額、持股、槓桿、融資或帳戶規模):

## 部位水位(部位層,不是分析)
- 訊號:NDX 收盤 {close} vs MA200 {ma200}({(close/ma200−1)×100:+.1f}%)→ 在 MA200 之上/之下
- 水位:**正常**(基準部位 100%)|**半倉**(基準部位 50%)
- 狀態:自 {since} 起維持;今日未切換|⚠️ 今日切換:正常 → 半倉(今晚美股收盤執行)
- 距切換線:收盤需再跌 X.X% 才轉為半倉|收盤需漲 X.X% 站回 MA200 才恢復正常
- 依據:prc-014(預先登記、樣本外 4/4 通過)。本段不改變上方的振幅與方向輸出。

「距切換線」以今日的 ma200 計算:正常時為 1 − ma200/close,半倉時為 ma200/close − 1(MA200 隔日會移動,只是近似值)。

記帳:

  • ndx_last_analysis.json 的 position_level:{state: "正常"|"半倉", close, ma200, pct, since, switched_today: bool, data_missing: bool}
  • 切換日(switched_today 為 true)才在 ndx_track_record.json 的 position_gate.events 加一筆 {date, from, to, close, ma200};date 為訊號日(t)

檢查:

  • 每月用收盤價重算一次切換日,與 position_gate.events 比對,不一致必須回報 Johnny。
  • 任意 12 個月內切換超過 19 次(歷史最大值),或連續 3 個交易日「水位資料缺」,都要回報。
  • 不做短期績效判定(平均每年約 3 個來回,幾個月的資料無法判斷好壞)。

證據:NDX 2001–2026:持有 MDD −70.5% → 減半倉 −46.7%,ΔCAGR +0.3pp。預先登記的樣本外驗證(SPX 1928–89、台股、日經、DAX)4/4 通過,BH 全過,19 個年代中 18 個回撤變淺。代價:平均每年切換 6.7 次,六成的狀態只維持 5 天以內;短急殺(例如 2024-07)不會觸發。
「基準部位」是什麼、水位套用到哪些實際部位,只由使用者自己決定,不寫入 repo。

Step 6 — 產出 HTML 報告 + 推 GitHub

產出:{repo}\docs\ndx-analysis-YYYYMMDD.html
同時覆蓋:{repo}\docs\ndx\index.html   ← NDX 固定入口(書籤用)
更新:{repo}\docs\ndx_last_analysis.json(含本次全部預測,供明天回測)
git add + commit + push(PowerShell 用分號串接,不能用 &&)

【硬規則・首頁分家】禁止覆蓋 docs\index.html
docs\index.html 是靜態導覽頁(連向 spx/ 與 ndx/ 兩個入口),2026-08-18 起不再由任一套系統每日覆蓋。
NDX 只寫 docs\ndx\index.html,SPX 只寫 docs\spx\index.html。
覆蓋根目錄的 index.html 會把另一套的入口一起弄丟,且用戶書籤會指向錯誤的指數。

三個網址:

  • 導覽頁 https://johnnyhsu5509.github.io/spx-analysis/
  • SPX https://johnnyhsu5509.github.io/spx-analysis/spx/
  • NDX https://johnnyhsu5509.github.io/spx-analysis/ndx/

設計風格:深色金融終端(黑底 #0a0a0a、青/綠/紅霓虹),與 SPX 報告一致但標題明確標示 NDX,避免兩份報告混淆。

【硬規則・分支】三本帳一律推 main,禁止留在 claude/ 分支
ndx_last_analysis.json/ndx_track_record.json/ndx_pnl_ledger.json 是逐日累加的狀態。

git add docs/ && git commit -m "ndx: ..." && git pull --rebase origin main && git push origin HEAD:main

若推送被拒,必須回報用戶並停止。

【硬規則・隱私】公開 repo 不得寫入個人部位資訊
spx-analysis 是 PUBLIC repo。HTML 報告與所有 ndx_*.json 一律只寫指數層級的分析與價位。
禁止寫入:持股名稱、槓桿倍數、帳戶金額、加減碼張數、融資狀態、「核心倉」等個人部位描述。
個人化部位建議只在對話中輸出,不落檔。

【硬規則・分析潔淨】rule32:個人財務狀況不得進入分析層
禁止把用戶的現金流、月缺口、貸款、帳戶規模、容錯能力、心理承受度,當成拉回機率、情景權重、七維分析任何一維、關鍵價位、策略進出場價、停損、目標、或「風報比好不好」的理由。

正確做法:

  1. 分析層:只用價格、量、指標、廣度、類股、宏觀、regime 統計
  2. 部位層:用戶主動問「我該怎麼做」才另開一段、明確標註「這段是部位建議,不是分析」。唯一例外是 Step 5.5 的「部位水位」(rule59):每天固定輸出,但只含指數訊號,不含任何個人財務資訊

兩層若指向相反方向,照實並列呈現,不得為了一致而修改分析層。

注意:本系統存在的理由本身就是「用戶部位貼近 NDX」,但這只影響選哪個指數分析,不影響分析怎麼做。

ndx_last_analysis.json 必含欄位:trade_date / close / change_pct / vxn / pullback_prob(Phase 3 起恆為 50)/ rating / amplitude(Phase 3:A_pct、band_lo、band_hi、r0_ref_pct、c、vol_pct_1y,供振幅帳判定)/ direction({prob: 50, bias: "中性", rule: null})/ predictions(short_bias、key_resistance、key_support、fib_targets、zhongshu、elliott、strategies、watch_points)/ catalysts / system_rules / backtest_prev / spx_cross_check / dashboard_url / position_level(rule59:state、close、ma200、pct、since、switched_today、data_missing)


三層決策矩陣(Phase 3,2026-10-16 起改為「振幅檢查」;兩個確認模式回覆時套用)

核心原則:本系統目前不產生方向部位指令(Step 5.5 的部位水位是長期趨勢下的部位規模,不是方向預測;確認模式不得因盤中波動改判水位)。確認模式只回答「今晚波動會不會比預報大」,供用戶管理既有部位的風險;任何留倉/減碼建議屬部位層,依 rule32 另段標示「這段是部位建議,不是分析」。

第一層:白天報告 → 今晚的波動環境

amplitude.vol_pct_1y 環境 提示
<33% 平靜 振幅預報可能偏高
33–67% 一般 —
>67% 波動偏高 跳空與盤中掃停損機率上升;NDX 跳空幅度大於 SPX

(VXN 一年分位只作描述:V1 驗證未通過,不得當成 regime 維度或倉位依據)

第二層:期貨確認 → 開盤會偏離多少

跑 check_es.py --symbol ndx:

  • 換算 NQ 隱含開盤距前收 ÷ A(例如 −1.1%/A 1.21% = −0.9A)
  • |距離| ≥ 1.0A →「開盤已用掉一整天的預期振幅,今晚波動偏大」
  • 10Y(NDX 對利率較敏感)、DXY、macro_backdrop、ES、SOXX、NQ 與 ES 背離照舊列出(描述性,不產生方向指令)

第三層:開盤確認 → 首 30 分鐘用掉多少振幅

  • 首 30 分 K 振幅 ÷ A:≥0.7 → 當日振幅很可能超過預報區間上緣
  • first_30m_vol_ratio、QQQE/SOXX 同步照舊列出

確認模式的回覆一律以這句結尾:
「→ 本系統無方向部位指令|今晚預估振幅 X.XX%(約 ±XXX 點),目前已用掉 X.X A」


system_rules:系統規則

權威來源={repo}\docs\ndx_last_analysis.json 的 system_rules 欄位,本節只列核心硬規則摘要,不一致時以 JSON 為準。

核心硬規則:

  1. rule33【硬・NDX 首要】指標口徑一致性——所有指標以 fetch_today.py --symbol ndx 輸出為準;RSI 用 SMA/Cutler 法;跨指數比較必須兩邊同一支腳本。詳見 Step 1.4 的反例
  2. rule34【硬・NDX】波動尺度不可跨系統挪用——停損寬度、掛單距離、目標距離一律用 NDX 自身 ATR/振幅計算
  3. rule35【硬・NDX】波動大不可重複計價——不得因「NDX 高 beta」而額外上下調拉回機率,波動已反映在拉回定義與基準率中
  4. rule37【硬・兩套共用】未結算列與 NaN 必擋——Yahoo 常在最新一列給「未結算」資料:先是只有 Volume 而量能殘缺,接著連 OHLC 都變 NaN。fetch_today.py 已加兩道防線(dropna + 寫檔前 NaN 檢查),但判讀時仍須核對 trade_date 是否為預期交易日——若腳本回報的日期比預期早一天,代表最新一列被丟棄,不是資料正常。復原來源為 data/ 的 Actions 快照(2026-08-18 實際發生:8/17 列被 Yahoo 撤回,快照仍保有完整 OHLC)
  5. rule38【硬・兩套共用】跨系統污染守衛——guard.py 在寫檔時蓋 symbol、讀檔時比對,不符即 exit 3 中止;並交叉檢查兩套資料檔不得有相同收盤。禁止繞過或以 | tail 呼叫腳本(管線會吃掉 exit code,守衛等於失效)
  6. rule39【硬・prc-003】收盤確認單一律浮動目標——sell_stop_close_confirm 的 T1/T2/停損以成交價 ∓0.8/1.6/+0.8 ATR 計算,風報比恆為 1.0/2.0。固定價位僅供參考。詳見 Step 5。
  7. rule40【硬】政策變更的回溯原則——尚未評估的部位可回溯套用;已結算的只能前瞻套用。判準是「改規則時知不知道結果」,不是「規則好不好」。
  8. rule36【硬・NDX】指數成交量可信度必查——最新交易日的 ^NDX/^GSPC 成交量常是未結算殘值。判定量能前必先與 20 日均量比對:低於 30% 即視為資料失真,改用 QQQ/SPY 代理,並把量能因子降級為中性。禁止把資料缺陷讀成崩量訊號,也不得以此滿足「突破需帶量」的必要條件(2026-08-18 實例:^NDX 報 11.5 億=20 日均量的 13.6%,^GSPC 48.6%,但 QQQ 為 66.5%=偏輕而非崩量)
  9. rule16【硬】禁止折中——Phase 3 起推導式停用,headline 恆 50(見 Step 4b)
  10. rule27【硬】進場距離超過預期振幅×0.6 一律不掛——Phase 3 起幾何由 Step 5b(以 A 為單位)取代
  11. rule12 破底空必須「收盤確認」,不看盤中插針
  12. rule15 類股與指數嚴重背離時,以類股訊號(SOXX)為準——對 NDX 權重更高,半導體是 NDX 的引擎
  13. rule32【硬】個人財務狀況不得進入分析層
  14. rule8【硬】回踩做多錨定支撐位本身、站穩即進、禁掛深;不掛限價單在支撐等接
  15. 突破做多必要條件(缺一不可):突破均線 + 帶量(rule43:QQQ 相對量 ≥ 75 百分位門檻,數值以 JSON 為準)+ MACD柱收窄
  16. rule51【硬・prc-006,2026-09-23 核准】限價單同日成交+觸價以 30 分 K 判序——limit_buy/limit_sell/buy_stop 成交當日,若目標或停損亦在日線範圍內,只計成交那根 K 棒之後的價格行為;同根無法判序時保守視為未觸及目標。30 分 K 取不到時退回日線並標註。8/28、9/18 已結算不重判(rule40)
  17. rule59【硬・部位層・prc-014,2026-10-19 核准】部位水位——報告最後固定加一段「部位水位(部位層,不是分析)」:NDX 收盤 > MA200 時為「正常」,否則為「半倉」;t+1 收盤執行;不加緩衝、不得推翻;不影響分析層;公開 repo 不寫個人部位。詳見 Step 5.5

Phase 3 規則狀態(2026-10-16 起;ndx_last_analysis.json 的 system_rules 已同步,核准案見 ndx_pnl_ledger.json 的 prc-010~013):
rule16 推導式停用(headline 恆 50)|rule27、rule52 的幾何部分由 Step 5b 取代|rule53 反轉為「符合已核准方向規則才掛」|rule54 證據移到環境水位、方向效力待重驗|rule39/prc-003 浮動目標單位改為 A|rule12、rule51 保留(實單放行後生效)

每次回測若發現新的系統性錯誤 → 新增規則寫入 ndx_last_analysis.json 的 system_rules,並同步更新本節。被證偽的規則標記 RETIRED 歸檔。


快速確認模式(不產 HTML、不推 GitHub、純文字回覆)

模式一:NQ 期貨確認(觸發詞:「NDX期貨確認」「NQ確認」「NQ怎樣」)

  1. 執行 python3 {repo}\scripts\check_es.py --symbol ndx → Read ndx_es_check.txt
  2. 判斷標準:
    • NQ ≥ +0.3% → 偏多開盤;≤ −0.3% → 偏空;之間 → 中性
    • 同時看 10Y(±5bps)、DXY、ES 強弱(大盤對照)、SOXX、macro_backdrop
    • 先看 session 時段標示:ASIA_THIN=亞洲薄盤,反轉率高、不可據此執行,21:00 後必須複查
    • SOXX 半導體(rule15):對 NDX 是引擎指標;美盤時段看 semi_vs_ndx 背離值,≤−1.0pp=輪動殺半導體警報
    • implied_ndx_open 為隱含現貨開盤近似值,直接對照關鍵價位表
  3. 輸出手機一眼看完的短結論,格式照下例:
    NQ期貨:-1.10%(偏空)|ES:-0.81%(大盤同步偏空)
    10Y:4.51%(+5.8bps 壓股)|DXY:持平|VXN:21.51(中波動檔)
    盤前合成:RISK_OFF 偏空(-2)
    隱含NDX開盤:29,829(距前收 -1.1%=-0.9A;跌破MA5 29,879)
    → 本系統無方向部位指令|今晚預估振幅 1.21%(約 ±362 點),目前已用掉 0.9A
  4. 用戶問「要不要調整部位」時,依 rule32 另段標示「這段是部位建議,不是分析」再回答

模式二:開盤確認(觸發詞:「NDX開盤確認」「NDX開盤怎樣」)

⚠️ 需在台灣時間 22:00 後執行。

  1. 執行 python3 {repo}\scripts\check_open30.py --symbol ndx → Read ndx_open30_check.txt
  2. 判斷第一根 30分K:方向、first_30m_vol_ratio、類股同步(看 sector_sync 的 SOXX + QQQE 與 sync_read)
    • QQQE 背離(NDX 漲但等權跌)= 只有少數權值撐盤,對重倉單一科技股者是無效綠燈
  3. 輸出短結論:首 30 分 K 區間(% 與幾個 A)、量能一行、類股同步一行,以三層決策矩陣的固定句結尾
  4. Phase 3 起不再有「按策略進場」的五條紅線(本系統預設不掛實單);用戶有既有部位要決定時,依 rule32 另段寫部位建議

模式三:睡前檢查(觸發詞:「NDX睡前檢查」「NDX睡前確認」)

⚠️ 台灣時間 22:30–23:00 執行,是最終過夜閘門。

  1. 執行 check_open30.py --symbol ndx 與 check_es.py --symbol ndx
  2. 對照 ndx_last_analysis.json 的關鍵位,輸出過夜決策(關鍵位守破、類股同步、明確指令收尾)——這是部位建議(rule32 另段標示);停損距離建議以 A 表示,並說明今晚已用掉多少 A
  3. 原則:跳空風險靠部位大小控管而非停損價。NDX 跳空幅度大於 SPX,過夜部位要更保守

輸出規範

  • 語言:繁體中文
  • 精度:價格四捨五入至整數,百分比保留一位小數
  • 免責聲明:每次輸出末尾附「本分析僅供學習參考,不構成投資建議」
  • 連貫性:每次完成後 ndx_last_analysis.json 必須完整更新

技術注意事項

  • 每個腳本都必須加 --symbol ndx——漏掉會寫到 SPX 的檔案並污染 SPX 帳本。執行後核對輸出檔名與 symbol 欄位
  • 一天只能一邊跑(本機 or 雲端),且開始前必先 git pull
  • 一律用 python3,禁止用 python(本機 python 指向無 yfinance 的 venv)
  • 禁止把腳本呼叫接 | tail / | head——管線會吃掉非零 exit code,抓取失敗時會誤讀舊 txt。改用 python3 x.py; echo "exit=$?",並每次核對 trade_date
  • 禁止 print 中文到 subprocess stdout(Windows cp950 亂碼)→ 寫 .txt 後用 Read 讀
  • 終端出現亂碼 ≠ 資料損毀——cp950 只影響 stdout 顯示,JSON 檔本身是 UTF-8 正確的。判定資料有問題前,先用 Read 工具直接讀檔確認
  • check_es.py / check_open30.py 必須看 data_status:OK可信/PARTIAL合成分不可信須標註/ALL_FAILED禁止把「缺資料」讀成「市場中性」
  • 已知限制:check_open30.py 的量能抓指數成交量,yfinance 偶爾不準或為 0 → 開盤確認以方向+關鍵位為主,量能當參考
  • yfinance 回傳 DataFrame 可能是 MultiIndex columns → 需 squeeze() 或攤平
  • PowerShell 不支援 && → 用分號 ;

市場筆記標準輸出格式

📋 NDX 市場筆記速記

日期:YYYY-MM-DD
收盤:XX,XXX(+X.XX%)
VXN:XX.XX
拉回機率:50%(方向無 edge)
隔日振幅:X.XX%(50% 區間 X.XX–X.XX%)

纏論中樞:XX,XXX – XX,XXX
關鍵支撐:XX,XXX / XX,XXX / XX,XXX
關鍵阻力:XX,XXX / XX,XXX / XX,XXX

SPX 對照:振幅 A X.XX%|A 比 X.XX|環境【一致/分歧】
今日催化劑:(一行簡述)
明日觀察:(一行簡述)

策略摘要:
實單:不掛(本日無已核准的方向 edge)
影子單:多 XX,XXX(停損 XX,XXX)|空 XX,XXX(停損 XX,XXX)

📌 回測參照(下次勿刪):
拉回機率 XX%|支撐 XX,XXX / XX,XXX|阻力 XX,XXX / XX,XXX|纏論上沿 XX,XXX

快速 Prompt 模板

每日例行:

分析今日NDX

兩套一起看:

分析今日SPX 和 NDX


注意事項

  1. 美股休市 → 說明休市並以最近交易日分析
  2. 圖表顏色編碼:多頭=綠色,空頭=紅色,中性=黃色/金色
  3. 每次分析最後列出「明日需觀察的關鍵點」(寫入 watch_points)
  4. NDX 與 SPX 的報告、帳本、檔名一律分開,任何時候都要能一眼看出這份是哪一套