Skip to content

fix(engine): last_px 覆蓋全部持倉標的,不只 round-trip (closes #79)#83

Merged
atomchung merged 1 commit into
mainfrom
claude/busy-pare-c09d49
Jul 4, 2026
Merged

fix(engine): last_px 覆蓋全部持倉標的,不只 round-trip (closes #79)#83
atomchung merged 1 commit into
mainfrom
claude/busy-pare-c09d49

Conversation

@atomchung

Copy link
Copy Markdown
Owner

問題(#79)

fwd_from_pxfor r in rtslast_px持有中、從未平倉的標的拿不到現價,無論 yfinance 成功與否。sample_value.csv 的 5 檔持倉只有 F 曾部分平倉,佔 cost basis 43% 的 INTC 完全不在 last_px:

下游 修前 修後(連網實測)
overview.unrealized $204(只反映 F) $46,406(與 issue 手動重算一致)
ticker_diagnosis 只有曾平倉標的 全部 6 檔,INTC 排第一
what_if 「汽車板塊 $2k」誤導情境 「半導體板塊 $54k」

修法

  • 拆出 last_prices(data):對價格框全部欄位填最新價。抓價清單本來就是 rts ∪ held ∪ benchmark(main:1325 + fetch_prices),之前只是把抓到的價白白丟掉。fwd_from_px 簽名/回傳不變,呼叫端零改動。
  • benchmark 欄多出的 key 無害:已逐一確認全部消費者(dim_size/dim_diversify/dim_avgdown/overview_stats/what_if/ticker_diagnosis/build_state)都以 held/rts 為主 key 查表。
  • staleness gate(codex 二方 review 抓的):最後有效價距價格框末日 >10 日曆日 → 不當現價,下游降級成本基礎。held-only 標的恰好最容易有下市/停牌殭屍持倉,殘價餵進未實現損益比「判不出」更糟。10 天罩得住連假,擋得住下市數月。

測試

#64 的邊界

#64 是 yfinance 失敗時 fallback 導致同輪混用成本/市值基礎;本修是設計上只掃 rts 的結構性排除,連網成功也重現。本 PR 不動 #64 的 fallback 語意。

🤖 Generated with Claude Code

…closes #79)

last_px 原本只在 fwd_from_px 的 round-trip 迴圈裡填——持有中、從未平倉的
標的(往往是最大倉位)被結構性排除:未實現損益/套牢診斷/what-if 全部靜默漏算。
sample_value.csv 實測:unrealized $204 → $46,406(修前漏掉的 INTC 一檔就 +$41,697),
what_if 從誤導的「汽車板塊 $2k」變成正確的「半導體板塊 $54k」。

- 拆出 last_prices(data):對價格框全部欄位(rts ∪ held ∪ benchmark)填最新價;
  fwd 計算保持只掃 rts,簽名/回傳不變,呼叫端零改動
- staleness gate(codex review 抓的):最後有效價距框末日 >10 日曆日不當現價,
  下市/停牌殭屍持倉降級成本基礎——殘價餵進未實現損益比「判不出」更糟
- 新增離線回歸測試(合成 DataFrame,不碰 yfinance):held-only 標的的 last_px/
  unrealized/what_if/ticker_diagnosis + 殭屍殘價 gate;突變驗證非假綠燈

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant