ダッシュボードに銘柄名を添える――元データを変えない表示改善
Hermes Agentから定期実行する評価・シミュレーションの結果も、人が確認しにくければ運用で使いづらくなります。今回はペーパートレード画面の「コードを見て、別の表で名前を調べる」手間を減らしました。保有ポジション、執行待ち注文、取引履歴に銘柄名を添える、表示専用の機能です。
売買ロジックや評価点は変更しません。本記事はソフトウェアの実装記録であり、投資推奨ではありません。表示内容と実際の投資判断は、人による確認が必要です。
実際に行ったことと結果
8月29日の記録と実装履歴で、3つの表へ銘柄名列を追加したことを確認しました。翌日以降の記録には画面の起動・表示確認も残っています。ダッシュボードのデータ層へ名前辞書を取得する `security_names()` と、表示用のコピーを作る `with_security_name()` を追加し、同じ処理を3か所から呼びます。
当日の記録には全79件のテスト通過とあります。記事作成日には対象の `tests/unit/test_dashboard_stats.py` を再実行し、7件が通過しました。そのうち名前表示の2件は、列位置、未知コードの欠損、入力が変わらないこと、空表を確認しています。今回、全体テストやブラウザ表示を再検証したという意味ではありません。
仕組み:名前は表示の直前に付ける
流れは次のとおりです。
1. 読み取り専用でシミュレーションの表を取得する。
2. 資産履歴の最終日を画面の基準日にする。
3. 基準日以前で最新の定量データのParquetから、コードと名前だけを読む。
4. コードを文字列にそろえた辞書で名前を引く。
5. 表のコピーへ、コードの直後に名前列を挿入する。
名前の取得処理は、既存レポートで使っていた関数を再利用しました。対象ファイルがない場合や読み取りに失敗した場合は空辞書となり、未知のコードは `None` になります。LLMに名前を推測させず、名前がなくてもコードで確認を続ける設計です。
基準日は画面全体で共通です。取引履歴の各取引日における社名を復元する機能ではありません。過去の名称まで厳密に表示したい場合は、別途、有効期間付きの名称マスターが必要です。
小さなデータで再現する
既存プロジェクトを持たない読者も、まず表示変換だけを切り出して確認できます。次を `name_view.py` として、検証用フォルダに保存します。コードと名前は架空です。
“`python
import pandas as pd
def with_security_name(df, names):
out = df.copy()
if out.empty or "code" not in out.columns:
return out
values = [names.get(str(c)) for c in out["code"]]
out.insert(out.columns.get_loc("code") + 1, "name", values)
return out
def test_name_view():
source = pd.DataFrame({"code": ["DEMO-A", "DEMO-B"]})
view = with_security_name(source, {"DEMO-A": "サンプル銘柄A"})
assert list(view.columns) == ["code", "name"]
assert view.iloc[0]["name"] == "サンプル銘柄A"
assert pd.isna(view.iloc[1]["name"])
assert "name" not in source.columns
assert with_security_name(pd.DataFrame(), {}).empty
“`
“`bash
uv run –with pandas –with pytest python -m pytest name_view.py -q
“`
これは手元の処理を一般化した最小例です。実装へ組み込む際は名前辞書の取得を分離し、各表に同じ変換を適用してから `st.dataframe` へ渡します。表示ラベルだけを「銘柄名」に変えれば、内部の列名は共通に保てます。画面の確認は、本番ジョブを回さず検証用DBで行ってください。
失敗しやすい点と残る課題
名前列がすでにある表へ二重に適用すると、`DataFrame.insert` は通常エラーになります。変換を一度だけ行う境界を決めます。また、数値化で先頭のゼロを失ったコードは、後から文字列に戻しても復元できません。取込時からコードの形式をそろえることが重要です。
既存画面には `use_container_width` の非推奨警告が残っています。確認日現在のStreamlit公式資料では、表の幅指定に `width="stretch"` が案内されています。ただし今回は警告解消まで実装したとは扱いません。
DBやParquetの実データ、画面のスクリーンショットは公開しません。表示列の追加はデータの匿名化ではなく、むしろ名称を見せる変更だからです。
再現チェックリスト
- [ ] 名前がコードの直後に表示される
- [ ] 未知コードは推測せず欠損になる
- [ ] 空表を渡しても止まらない
- [ ] 変換前の表に名前列が増えない
- [ ] 保有・注文・履歴で同じ変換を使う
- [ ] 名称データの基準日と実装の限界を説明できる
- [ ] 実データを外へ出さず、人が表示を確認する
公式一次情報
以下は2026年9月6日に確認しました。
- [pandas:DataFrame.insert](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.insert.html)
- [Streamlit:st.dataframe](https://docs.streamlit.io/develop/api-reference/data/st.dataframe)
- [uv:依存関係を追加したコマンド実行](https://docs.astral.sh/uv/guides/scripts/)
