見出し画像

【クロードコード】プログラミング未学習者がコインパーキング経営シミュレーター作ってみた話

まず最初に作ったアプリ
相続があるのでコインパーキングにでもしようかなと思ったのがきっかけ。

こんにちは。今回は、土地活用(コインパーキング経営)の投資判断を劇的に高度化するため、金融工学(幾何ブラウン運動・ポアソン分布)日本の相続税制(小規模宅地等の特例)を融合させた、フルスタックの確率試算シミュレータを構築したプロセスを共有します。

「Jupyter Notebookのスクリプトで満足せず、クライアントに刺さる『動くプロトタイプ』を爆速で実装する」をテーマに、バックエンドからフロントエンドまで並行して一気に組み上げました。

geminiにクロードコードの案を聞いたみた。


FastAPI + NumPyで1万回のモンテカルロ法を爆速化し、React/Rechartsで相続税ペナルティまで可視化するコインパーキング経営シミュレータがあもしろそうだったので、そのままクロードコードに丸投げ。




なんかできったぽい




やってみたけど、うまくいかないので、再度クロードコードに聞く。




直してくれた!

そして無事に起動!
すごい





1. 開発したシステムの全体アーキテクチャ

プロジェクト構成は以下の通り、FastAPIによる高速計算APIと、Vite + Reactによるモダンなダッシュボードの2層構造です。

Plaintext

road simu/
├── backend/
│   ├── requirements.txt          (FastAPI, NumPy, uvicorn)
│   ├── simulation.py             ← モンテカルロエンジン(NumPyベクトル化)
│   ├── tax_rules.py              ← 相続税・ペナルティ判定 Boolean クラス
│   └── main.py                   ← FastAPI エンドポイント
└── frontend/
    ├── package.json / vite.config.js (Proxy設定含む)
    └── src/
        ├── main.jsx / index.css
        └── Dashboard.jsx         ← Recharts 4タブ構成ダッシュボード

2. コア設計と試行錯誤の記録

① simulation.py — NumPyによる徹底的な「forループ排除」

幾何ブラウン運動(GBM)による地価変動と、ポアソン分布による競合参入リスクを考慮し、30年×1万回のシナリオ(計30万データポイント)をシミュレーションします。

ここで「forループは厳禁」という制約を課しました。数千回〜数万回のループをPythonのプレーンなループで回すと、APIのレスポンスとして実用を耐えない速度になるからです。

  • 地価のGBMパス: np.cumsum(log_increments, axis=1) で1万行×30列の行列を一撃で生成。

  • 競合参入: rng.poisson(λ, (N, T)) で各年次の参入数をマトリクス化し、累積。

  • 累積ショート確率(破産確率): np.maximum.accumulate(cum_cf < 0, axis=1).mean(axis=0)。一度でもキャッシュフローがマイナスに沈んだ経路を、ブロードキャスト演算で高速にトラッキングしています。

試算結果の気付き: 初回実行時、期待値(5,547万円)が中央値(4,471万円)を大きく上回る「右に歪んだ分布」が綺麗に現れました。これは地価変動に適用した幾何ブラウン運動の対数正規分布特性が、正しくNumPy上で表現できている証拠です。

② tax_rules.py — 攻めの税務Boolean判定クラス

単に不動産評価額を下げるだけでなく、「小規模宅地等の特例(貸付事業用:50%減額、200㎡上限)」の要件を厳密に判定するロジックをクラス化しました。

Python

exemption = SmallScaleLandExemption(estate)
# メイン判定(Boolean)
exemption.is_eligible(parcel, heir)  # -> True / False

この設計のポイントは、カプセル化されたメソッド群にあります。

  • check_eligibility() で要件ごとの充足状況をブレイクダウン。

  • calculate_inheritance_tax_comparison() で特例適用前後の相続税額をリアルタイム比較。

  • さらに、「3年縛り違反」「継続利用要件の逸脱」「7年以内の生前贈与」が発生した際の税務ペナルティ(暦年課税 vs 相続時精算課税の差分など)のシナリオ分析まで内包させました。

③ Dashboard.jsx — Rechartsによる「4タブ構成」視覚化

APIから返ってくるリッチな統計データを、クライアントが直感的に理解できるようReact + Tailwind CSSでダッシュボード化しました。

  1. NPV分布タブ: BarChart でヒストグラムを表示。損失域(赤)、利益域(青)、期待値超え(紫)にカラーリングし、投資リスクを一目で把握。

  2. CF予測タブ: ComposedChart を使い、90%信頼区間と50%信頼区間をネストしたスタックエリアで表現。

  3. ショートリスクタブ: 累積ショート確率曲線を AreaChart でプロット。

  4. 地価予測タブ: 30年後の地価がどうバラつくかをバンド形式で表示。

3. ターミナルでの格闘と、サーバー起動の瞬間

バックエンド(Uvicorn)とフロントエンド(Vite)をローカル環境で立ち上げる際、Python 3.14環境へのライブラリ導入や環境変数(PATH)の警告を泥臭くクリアしていきました。

Bash

# バックエンド起動
cd backend
pip install -r requirements.txt
uvicorn main:app --reload --port 8000

Uvicornが立ち上がり、"GET / HTTP/1.1" 200 OK のログが流れた瞬間の全ロジックが繋がった感覚は、何度味わっても最高です。Vite側で vite.config.js にプロキシを噛ませているため、フロントエンド(5173番ポート)のUIから「▶ シミュレーション実行」を押すだけで、8000番ポートのFastAPIへリクエストがシームレスに吸い込まれていきます。

4. このプロジェクトから得られた知見

  1. 実務で使えるAI調教の重要性: 単純なモデルの精度比較はAutoML等に任せればいい時代です。エンジニアが価値を発揮すべきは、今回のように「物理的・制度的制約(税法や数理モデル)」をコードにどう落とし込み、SHAP等を用いて予測根拠を言語化・可視化するかという領域だと確信しました。

  2. フルスタック開発力の破壊力: Jupyter上のスクリプト(.ipynb)で満足せず、FastAPIで軽量・高速なWeb APIを自作し、動的なグラフ描画までを1人で完結させる。これにより、クライアントへの提案スピードと説得力は桁違いに跳ね上がります。

今回のコードをベースに、さらに「建物の減価償却費のデッドクロス判定」や「レバレッジ(融資割合)の最適化アルゴリズム」などを組み込んでいく予定です。

金融工学 × 不動産税務のシミュレーション領域に興味がある方の参考になれば幸いです!

インサイトが面白いと思ったら、ぜひスキ・フォローをお願いします!

いいなと思ったら応援しよう!