ポートフォリオ自動集計と証券会社の円換算額が合わない理由をウォン円レートから検算した

開発personal

ポートフォリオ自動集計と証券会社の円換算額が合わない理由をウォン円レートから検算した

毎朝、家族のポートフォリオを自動で集計し、評価額をスプレッドシートと LINE に流している。 2026-09-23 の朝、その数字を証券会社Aの画面の円換算額と見比べたら、合わなかった。

値動きの細かい銘柄なら多少はずれるだろう、とは思っていた。 それにしては差が大きすぎて、何が違うのか見当がつかなかった。

そこで、証券会社Aの銘柄一覧と円換算評価のスクリーンショットを Claude Code に渡した。 朝のコマンドがどの為替レートで計算したのかを確かめつつ、検算してほしいと頼んだ。

朝の数字はどこから来たのか

評価額を出した箇所は、すぐには見つからなかった。 今朝のセッションログを直接検索してもらい、ポートフォリオ集計スクリプトにたどり着いた。

朝の評価額は、スプレッドシートの10行の合計だった。 検算してもらうと、1円まで一致した。 集計の計算そのものは合っている。

ずれていたのは入力のほうだった。 証券会社Aの画面と突き合わせると、保有数量が2か所違っていた。 ある銘柄の株数がずれ、別の1銘柄の行がシートに無かった。

ただ、この2つを直しても、縮む差は一部にとどまる。 残りの大部分は為替レートの違いだろう、というのが Claude Code の見立てだった。

証券会社Aの参考レートとの比較

見立てを確かめるため、証券会社Aの参考レートを貼り付けた。

通貨証券会社Aの参考レート今朝の集計
ウォン(100ウォンあたり)11.15円11.60円
米ドル157.32円157.347円

ドル円はほぼ同じだった。 ウォンだけが 0.45円離れていた。 計算し直してもらうと、差はほぼ全部ウォンのレートから来ていた。

細かい銘柄のずれを疑っていたのに、差を生んでいたのは通貨1つの換算レートだった。

シートの数量と取得単価の修正

レートとは別に、数量のずれは直す必要がある。 株数のずれを直し、抜けていた銘柄の行を12行目に足してもらった。 足した銘柄の株価は金融データサービスBから取れ、証券会社Aの画面の値と一致した。

書き込んだあとは、シートを読み直してもらった。 試し実行(dry-run)でも、足した銘柄が銘柄として読み込まれることを確認できた。 この dry-run は、シートにも LINE にも書き込まない作りになっている。

続けて y と返し、もう1銘柄の平均取得価格も直してもらった(数字の先頭の1文字が違っていた)。 これで、シート上の米国株の株数と取得単価は、今朝のスクリーンショットとすべて一致した。 韓国株は、前回の突き合わせで一致を確かめてあった。

修正版を流す前の価格日付

明日の朝の実行で反映されるかもしれない。 それでも、いったん修正版として今日分をテストで回し、LINE に流してほしいと頼んだ。

流す前に、Claude Code から2つの指摘があった。 本番の実行は LINE に送るだけでなく、履歴シートと Turso にも書き込む。 しかも dry-run の出力では、米国株の価格日付が 9/21 に戻っていた。 このまま流せば、古い株価で修正版を送ることになる。

原因を確かめたうえで、解析関数を直してもらった。 直す前には、失敗するテストを先に足してもらった。 テストが落ちたところでエラーの全文を見てもらい、あわせて、テストに入れた 9/21 の時刻のずれも直してもらった。

テストに入れた 2026-09-21 の時刻
誤: 17:30 UTC
正: 13:30 UTC(1789997400)

最終的に、全68件のテストが通った(新しく足した2件を含む)。 dry-run で価格日付と評価額を確かめてから、修正版を LINE に流してもらった。

テスト実行の評価額は、今朝の数字より上がっていた。 Claude Code の説明では、数量の修正を含む3つの要因が重なった結果だという。 数量の修正そのものは、評価額を下げる向きに効いていた。

テスト実行後に残った差額

LINE に流れた数字を、証券会社Aの画面の円換算額と見比べた。 まだ差があった。 この差額はどう説明できるのかを聞いた。

シートに書き込まれた銘柄ごとの値から、差を分解してもらった。 ウォンの換算レートの違いだけで、差額を少し上回る分が説明できた。 逆向きの小さな残りは、証券会社Aのほうがドル円を高く使っていると考えると合う、という結果だった。

朝と同じく、効いていたのはウォンのレートだった。

11.676円はどこから来たのか

分解の途中で出てきたウォンのレート(100ウォンあたり 11.676円)の根拠が気になり、聞き返した。

答えは、金融データサービスBの KRWJPY=X(ウォン円の為替レート)を、スクリプトを実行した瞬間に取った値だった。 証券会社が決めたレートではなく、市場で取引されている仲値に近いレートで、手数料(スプレッド)も入っていない。

自動集計と証券会社Aの画面は、そもそも別の物差しで円に直していたことになる。 実行した瞬間の値を取る以上、朝の 11.60円とテスト実行時の 11.676円が違うのもうなずける。

学び

  • 自動集計と証券会社の円換算額がずれたら、計算、入力の数量、換算レートの順に切り分ける。今回は計算が1円まで合い、数量のずれは差の一部で、残りの大半はウォンのレートだった
  • 集計側のウォン円は、スプレッドを含まない市場のレートを実行の瞬間に取っている。証券会社Aの参考レートとは一致しない前提で差を読む
  • 本番実行の前に dry-run で価格日付を見たおかげで、古い株価のまま修正版を LINE に流さずに済んだ
#ポートフォリオ管理#為替#検算#ウォン円#LINE通知#テスト#Claude Code#開発日記