海外株の円換算が約定直後にマイナスに見える理由をウォーターフォール図で整理し、ポートフォリオ記録と株価通知も追随させた

開発personal

買ったばかりの株が、円に直すとマイナスに見えた

初めて扱う市場の株を証券会社で買った。約定したあとにポートフォリオ画面を見ると、円換算の数字がマイナスになっている。買ったばかりなのに、なぜ円で見ると損をしているように見えるのか。

同じ朝、ポートフォリオをスプレッドシートへ日次で反映している処理のほうも、今回の売買に追いついていなかった。先に一部を売却した銘柄があり、シートの数字はずれているはずだった。

注文の前に、手数料と分割買い、アプリの対応を確かめた

以前作った非公開の購入メモを開いたまま、証券会社の注文画面のスクリーンショットをAIに見せて、手数料が想定どおりかを聞いた。

手数料率そのものは想定どおりだった。ただし画面に出ている円の金額は、為替に安全マージンを上乗せした「わざと高め」の概算で、実際に確定する金額はそれより下がる見込みだという。

次に考えたのは、分割して買うか一括で買うかだ。手数料は料率で決まるのだから、分けても総額は変わらないはずだと思った。そう確かめると、今回の銘柄と金額なら分割しても手数料の合計は変わらない、という答えが返ってきた。

証券会社のスマホアプリで確認できるかも聞いた。最初は「外国株」と言いかけて、その市場の株に言い直している。公式FAQによると、ネイティブアプリはその市場の株には対応していなかった。

約定の画面に違和感はないか

約定したあと、その画面も見せて違和感がないかを聞いた。返ってきた評価は次の3点だ。

  • 数字はすべて内部で整合している
  • 指値より良い価格で約定している
  • 円貨の金額はまだ確定していない

売却の履歴を探して、ポートフォリオの入れ替えを頼んだ

続けて、スプレッドシートの件に移った。一部を売却した銘柄の記録を入れたいのに、その売却がどこに出ているのかが分からない。証券会社の画面は見づらく、「注文履歴かな」と行き来して、ようやく該当の売却を見つけた。

スプレッドシートのURLと、注文履歴とポートフォリオ画面のスクリーンショットをまとめて渡し、ポートフォリオを入れ替えてほしいと頼んだ。今回買った株は、証券会社のポートフォリオ画面にもう載っていた。

AIがまず並行して調べ始めたのは、次の3つだ。

  • シートを更新している処理が、リポジトリのどこにあるか
  • シートの現状
  • 売却の正確な内訳

先に返ってきたのは、ポートフォリオ画面の検算だった。

円換算がマイナスに見える理由

AIが画面の数字を分解すると、円換算のマイナスは、注文前に聞いた「わざと高め」の概算レートから来ていた。注文時に上乗せしたレートが、購入後も取得原価の円換算にそのまま残っていたのだ。実際の損失ではない、というのがAIの結論で、この説明は購入メモにも文章で追記された。

ウォーターフォール図を購入メモに入れてもらった

説明を読んでも、なぜ円換算だとマイナスになるのかがまったく分からなかった。そこで「ウォーターフォールチャートで教えてくれませんか」と頼み、その図を購入メモの中に入れてもらうことにした。証券会社で買うときに一瞬びっくりするけれど、それにはこういう理由がある、と後から読める形にしたかった。

作図は svg-diagram スキルに沿って進めさせた。図の生成スクリプトには、行ラベルや値、脚注の幅を測り、はみ出しそうなら警告を出す確認を足させている。既存の図1の生成スクリプトにも同じ手当てを入れさせ、古い重複ファイルを片付けたうえで、2枚とも正しい置き場所へ生成し直してもらった。

仕上げに、dev サーバーで記事ページを開き、Chrome DevTools で2枚とも描画を確認させた。ウォーターフォールチャートは崩れずに表示されていた。

株価通知にも、比重の大きい銘柄として加える

図のあと、今回の株の扱いを詰めた。初めて取得した市場の株なので、別途対応が要るだろうと考えた。LINE通知は別にしてよい、とも答えている。

もう1つ頼んだのが、個別通知への追加だ。今回買った株は、ポートフォリオの中で比重が大きい。すでに個別に通知している銘柄がいくつかあるので、そこへ並べてほしかった。

調査と実装は、AIが別セッションに委譲してバックグラウンドで走らせた。しばらくして進捗を聞くと、開始から17分たってもまだ完了していなかった。1804行ある初見のスクリプトを読み込んで、通貨まわりのロジックを追わせているという。そのうえで株価の取得元との連携を実装し、--dry-run で検証するところまでやらせていた。

実装と検証が終わると、判断を3点求められた。3点とも推奨どおりに承認し、同じエージェントに作業を再開させた。その1点目は、一部売却した銘柄の株数を、渡した注文履歴を根拠に直すものだった。

「ブラウザで直接直すのが一番早い」に、できるはずだと返した

ところが、株数の書き換えが権限の仕組みに2回ブロックされた。エージェントは本番実行も自分で止めていた。古い株数のまま回すと、誤ったLINE通知が取り消せない形で飛んでしまうからだ。残りは1ステップだけ、という報告だった。

続いて貼ったのは、スプレッドシートを操作するコマンドのエラー出力だ。AIの見立てでは、コマンドに渡したJSONがPowerShellの引用符のエスケープで崩れていた。一番早いのは、開いたままのスプレッドシートのタブで直接直すことだと勧められた。

説明がよく分からなかったうえに、そもそもスプレッドシートはAIの側から更新できるはずだと思った。そう聞き返すと、AIは現在の値を確認してから株数を書き換えた。今度は止まらずに通った。

AIの推測では、先ほどのブロックはバックグラウンドのサブエージェントに特有の制限だったらしい。AIは書き換えを確かめ、そのまま本番実行まで進めた。評価額はサブエージェントの事前予測とほぼ一致し、LINE通知も1件送られた。手元にも通知は届いていた。

1日のずれは許容して、コミットへ

報告にあった点については、翌日の実行で書き換われば済むので、1日くらいのずれは許容すると答えた。原因の話も、どちらでもいいとそこで切り上げている。

ついでに、円建てのポートフォリオの見え方も聞いた。マイナスは証券会社の上乗せ分から来ているイメージで合っているのか、それとも正しい円の概算なのか。AIの返事は、2つの別々の数字を分けて考える必要がある、というところから始まった。

コミットは、通知用の別リポジトリで行わせた。テスト55件がすべて通ったのを確かめてから進ませると、コミット時の Codex レビューが high 判定を2件出して止めた。

中身を見たAIの判定は、どちらも実在するバグだが、今日のデータでは発火しないか、実害が限られる経路だというものだった。1件目は、新しく足した取得元だけから保有銘柄の株価を取っている人がいると、履歴の価格日付が空になり、古いデータとしてスキップされるという指摘だ。直し方が単純なので、これは修正させた。そのうえで再コミットし、今回の株の件はそこで閉じた。

振り返り

  • 注文画面で「わざと高め」と説明された概算レートは、約定したあとも取得原価の円換算に残り、ポートフォリオ画面でマイナスとして顔を出した。
  • 文章の検算は、読んでも頭に入らなかった。ウォーターフォールチャートを頼んで購入メモに入れてもらったので、次に同じ表示を見たときに開く場所は決まっている。
  • 「ブラウザで直接直すのが一番早い」と勧められても、AIの側で更新できるはずだと押し返すと、書き換えはそのまま通った。止まっていたのは、サブエージェントの経路だけだった可能性がある。
  • 1日くらいのずれは翌日の実行に任せ、原因の詮索もやめた。そのうえで通知用リポジトリのコミットを、Codex レビューの指摘を直して通すところまで進めてもらった。
#海外株#為替#ウォーターフォールチャート#SVG図解#ポートフォリオ管理#LINE通知#Claude Code#開発日記