[{"data":1,"prerenderedAt":237},["ShallowReactive",2],{"content-/portfolio-krwjpy-rate-gap-check":3,"all-pages-for-dir":215,"related-/portfolio-krwjpy-rate-gap-check":216,"og-image-/portfolio-krwjpy-rate-gap-check":236},{"id":4,"title":5,"body":6,"category":192,"concepts":193,"description":194,"extension":195,"meta":196,"navigation":197,"ogImage":193,"path":198,"project_name":199,"published":200,"publishedAt":201,"seo":202,"source":203,"stem":204,"tags":205,"todo":193,"unpublished":200,"updatedAt":193,"__hash__":214},"pages/2026-09/2026-09-23/portfolio-krwjpy-rate-gap-check.md","ポートフォリオ自動集計と証券会社の円換算額が合わない理由をウォン円レートから検算した",{"type":7,"value":8,"toc":182},"minimark",[9,12,16,19,22,26,29,32,35,38,42,45,90,93,96,99,102,105,108,111,114,117,120,131,134,137,140,143,146,149,153,156,163,166,169],[10,11,5],"h1",{"id":5},[13,14,15],"p",{},"毎朝、家族のポートフォリオを自動で集計し、評価額をスプレッドシートと LINE に流している。\n2026-09-23 の朝、その数字を証券会社Aの画面の円換算額と見比べたら、合わなかった。",[13,17,18],{},"値動きの細かい銘柄なら多少はずれるだろう、とは思っていた。\nそれにしては差が大きすぎて、何が違うのか見当がつかなかった。",[13,20,21],{},"そこで、証券会社Aの銘柄一覧と円換算評価のスクリーンショットを Claude Code に渡した。\n朝のコマンドがどの為替レートで計算したのかを確かめつつ、検算してほしいと頼んだ。",[23,24,25],"h2",{"id":25},"朝の数字はどこから来たのか",[13,27,28],{},"評価額を出した箇所は、すぐには見つからなかった。\n今朝のセッションログを直接検索してもらい、ポートフォリオ集計スクリプトにたどり着いた。",[13,30,31],{},"朝の評価額は、スプレッドシートの10行の合計だった。\n検算してもらうと、1円まで一致した。\n集計の計算そのものは合っている。",[13,33,34],{},"ずれていたのは入力のほうだった。\n証券会社Aの画面と突き合わせると、保有数量が2か所違っていた。\nある銘柄の株数がずれ、別の1銘柄の行がシートに無かった。",[13,36,37],{},"ただ、この2つを直しても、縮む差は一部にとどまる。\n残りの大部分は為替レートの違いだろう、というのが Claude Code の見立てだった。",[23,39,41],{"id":40},"証券会社aの参考レートとの比較","証券会社Aの参考レートとの比較",[13,43,44],{},"見立てを確かめるため、証券会社Aの参考レートを貼り付けた。",[46,47,48,64],"table",{},[49,50,51],"thead",{},[52,53,54,58,61],"tr",{},[55,56,57],"th",{},"通貨",[55,59,60],{},"証券会社Aの参考レート",[55,62,63],{},"今朝の集計",[65,66,67,79],"tbody",{},[52,68,69,73,76],{},[70,71,72],"td",{},"ウォン（100ウォンあたり）",[70,74,75],{},"11.15円",[70,77,78],{},"11.60円",[52,80,81,84,87],{},[70,82,83],{},"米ドル",[70,85,86],{},"157.32円",[70,88,89],{},"157.347円",[13,91,92],{},"ドル円はほぼ同じだった。\nウォンだけが 0.45円離れていた。\n計算し直してもらうと、差はほぼ全部ウォンのレートから来ていた。",[13,94,95],{},"細かい銘柄のずれを疑っていたのに、差を生んでいたのは通貨1つの換算レートだった。",[23,97,98],{"id":98},"シートの数量と取得単価の修正",[13,100,101],{},"レートとは別に、数量のずれは直す必要がある。\n株数のずれを直し、抜けていた銘柄の行を12行目に足してもらった。\n足した銘柄の株価は金融データサービスBから取れ、証券会社Aの画面の値と一致した。",[13,103,104],{},"書き込んだあとは、シートを読み直してもらった。\n試し実行（dry-run）でも、足した銘柄が銘柄として読み込まれることを確認できた。\nこの dry-run は、シートにも LINE にも書き込まない作りになっている。",[13,106,107],{},"続けて y と返し、もう1銘柄の平均取得価格も直してもらった（数字の先頭の1文字が違っていた）。\nこれで、シート上の米国株の株数と取得単価は、今朝のスクリーンショットとすべて一致した。\n韓国株は、前回の突き合わせで一致を確かめてあった。",[23,109,110],{"id":110},"修正版を流す前の価格日付",[13,112,113],{},"明日の朝の実行で反映されるかもしれない。\nそれでも、いったん修正版として今日分をテストで回し、LINE に流してほしいと頼んだ。",[13,115,116],{},"流す前に、Claude Code から2つの指摘があった。\n本番の実行は LINE に送るだけでなく、履歴シートと Turso にも書き込む。\nしかも dry-run の出力では、米国株の価格日付が 9/21 に戻っていた。\nこのまま流せば、古い株価で修正版を送ることになる。",[13,118,119],{},"原因を確かめたうえで、解析関数を直してもらった。\n直す前には、失敗するテストを先に足してもらった。\nテストが落ちたところでエラーの全文を見てもらい、あわせて、テストに入れた 9/21 の時刻のずれも直してもらった。",[121,122,128],"pre",{"className":123,"code":125,"language":126,"meta":127},[124],"language-text","テストに入れた 2026-09-21 の時刻\n誤: 17:30 UTC\n正: 13:30 UTC（1789997400）\n","text","",[129,130,125],"code",{"__ignoreMap":127},[13,132,133],{},"最終的に、全68件のテストが通った（新しく足した2件を含む）。\ndry-run で価格日付と評価額を確かめてから、修正版を LINE に流してもらった。",[13,135,136],{},"テスト実行の評価額は、今朝の数字より上がっていた。\nClaude Code の説明では、数量の修正を含む3つの要因が重なった結果だという。\n数量の修正そのものは、評価額を下げる向きに効いていた。",[23,138,139],{"id":139},"テスト実行後に残った差額",[13,141,142],{},"LINE に流れた数字を、証券会社Aの画面の円換算額と見比べた。\nまだ差があった。\nこの差額はどう説明できるのかを聞いた。",[13,144,145],{},"シートに書き込まれた銘柄ごとの値から、差を分解してもらった。\nウォンの換算レートの違いだけで、差額を少し上回る分が説明できた。\n逆向きの小さな残りは、証券会社Aのほうがドル円を高く使っていると考えると合う、という結果だった。",[13,147,148],{},"朝と同じく、効いていたのはウォンのレートだった。",[23,150,152],{"id":151},"_11676円はどこから来たのか","11.676円はどこから来たのか",[13,154,155],{},"分解の途中で出てきたウォンのレート（100ウォンあたり 11.676円）の根拠が気になり、聞き返した。",[13,157,158,159,162],{},"答えは、金融データサービスBの ",[129,160,161],{},"KRWJPY=X","（ウォン円の為替レート）を、スクリプトを実行した瞬間に取った値だった。\n証券会社が決めたレートではなく、市場で取引されている仲値に近いレートで、手数料（スプレッド）も入っていない。",[13,164,165],{},"自動集計と証券会社Aの画面は、そもそも別の物差しで円に直していたことになる。\n実行した瞬間の値を取る以上、朝の 11.60円とテスト実行時の 11.676円が違うのもうなずける。",[23,167,168],{"id":168},"学び",[170,171,172,176,179],"ul",{},[173,174,175],"li",{},"自動集計と証券会社の円換算額がずれたら、計算、入力の数量、換算レートの順に切り分ける。今回は計算が1円まで合い、数量のずれは差の一部で、残りの大半はウォンのレートだった",[173,177,178],{},"集計側のウォン円は、スプレッドを含まない市場のレートを実行の瞬間に取っている。証券会社Aの参考レートとは一致しない前提で差を読む",[173,180,181],{},"本番実行の前に dry-run で価格日付を見たおかげで、古い株価のまま修正版を LINE に流さずに済んだ",{"title":127,"searchDepth":183,"depth":183,"links":184},2,[185,186,187,188,189,190,191],{"id":25,"depth":183,"text":25},{"id":40,"depth":183,"text":41},{"id":98,"depth":183,"text":98},{"id":110,"depth":183,"text":110},{"id":139,"depth":183,"text":139},{"id":151,"depth":183,"text":152},{"id":168,"depth":183,"text":168},"dev",null,"毎朝のポートフォリオ自動集計の評価額が、証券会社の画面の円換算額とずれていた。検算すると計算は1円まで合い、数量の登録漏れは差の一部にとどまり、残りの大半はウォン円の換算レートの違いだった。シートを直し、株価日付の不具合をテストで潰してから、修正版を LINE に流した。","md",{},true,"/portfolio-krwjpy-rate-gap-check","personal",false,"2026-09-23T00:00:00.000Z",{"title":5,"description":194},"make-diary","2026-09/2026-09-23/portfolio-krwjpy-rate-gap-check",[206,207,208,209,210,211,212,213],"ポートフォリオ管理","為替","検算","ウォン円","LINE通知","テスト","Claude Code","開発日記","anZRK3cyGLFd9P0eG2-NjSNes_zdeZ-wLxbzRwU-apE",[],[217,221,225,229,233],{"title":218,"path":219,"publishedAt":220},"海外株の円換算が約定直後にマイナスに見える理由をウォーターフォール図で整理し、ポートフォリオ記録と株価通知も追随させた","/foreign-stock-fx-waterfall-and-portfolio-sync","2026-09-15T00:00:00.000Z",{"title":222,"path":223,"publishedAt":224},"LINE通知の銘柄カードに「最高値比」を足し、リポジトリのコミットを整理した","/daily-chain-notification-card-and-repo-tidying","2026-09-04T00:00:00.000Z",{"title":226,"path":227,"publishedAt":228},"コミット前の2つのゲートに止められた：Markdownの太字崩れと計画書の締め忘れ","/commit-gates-md-lint-and-carryover","2026-09-19T00:00:00.000Z",{"title":230,"path":231,"publishedAt":232},"計画書を書かせ、別モデルでレビューし、3択フォームで決裁するまで","/plan-review-decision-form-loop","2026-09-16T00:00:00.000Z",{"title":234,"path":235,"publishedAt":220},"Claude Code の make-diary を朝の実行ログで振り返り、同期の完了待ちと実行モデルを手順書に固定した","/make-diary-retro-fixes-and-statusline","https://log.eurekapu.com/og/blog/portfolio-krwjpy-rate-gap-check.png?v=2026-09-23T00%3A00%3A00.000Z&title=%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AA%E3%82%AA%E8%87%AA%E5%8B%95%E9%9B%86%E8%A8%88%E3%81%A8%E8%A8%BC%E5%88%B8%E4%BC%9A%E7%A4%BE%E3%81%AE%E5%86%86%E6%8F%9B%E7%AE%97%E9%A1%8D%E3%81%8C%E5%90%88%E3%82%8F%E3%81%AA%E3%81%84%E7%90%86%E7%94%B1%E3%82%92%E3%82%A6%E3%82%A9%E3%83%B3%E5%86%86%E3%83%AC%E3%83%BC%E3%83%88%E3%81%8B%E3%82%89%E6%A4%9C%E7%AE%97%E3%81%97%E3%81%9F&author=Kei%20Komatsu&sig=ca58f10d233457f2",1790216068911]