An open API service indexing awesome lists of open source software.

https://github.com/moriyama-eng/fire-simulator

リスク資産と現金バッファを用いたモンテカルロ・シミュレーションで、FIRE後の資産枯渇確率を検証するツールです。
https://github.com/moriyama-eng/fire-simulator

fire javascript monte-carlo personal-finance simulation

Last synced: 2 months ago
JSON representation

リスク資産と現金バッファを用いたモンテカルロ・シミュレーションで、FIRE後の資産枯渇確率を検証するツールです。

Awesome Lists containing this project

README

          

# FIRE モンテカルロ・シミュレータ (v1.8.3)

本ツールは、ブラウザ単体で手軽に実行できる個人の資産形成・取崩しシミュレータです。
確率論的なアプローチ(モンテカルロ・シミュレーション)を用いて、運用資産の枯渇リスクや長期的な資産推移を可視化することを目的に制作しました。

## 特徴

- **ファットテールリスクを考慮した変動モデル(対数t分布)**
従来の正規分布では過小評価されがちな「リーマンショック級の暴落」など、現実の金融市場で発生しうる「ファットテールリスク」を考慮した対数t分布モデルを選択可能です。
- **統計的な価格変動モデルに基づくリスクシミュレーション**
価格変動モデルとして対数正規分布モデル/対数t分布モデルを採用し、設定した期待リターンとボラティリティに基づく市場価格の推移をシミュレーションします。
- **現金バッファ機能の導入**
総資産が過去最高値から一定割合下落した際、自動的に現金バッファから取り崩す「現金バッファ戦略」をシミュレーション可能です。暴落耐性を高める具体的な運用指針の検証に役立ちます。
- **暴落時の支出抑制(支出ガードレール機能)の導入**
総資産が過去最高値から一定割合下落した際、自動的に翌月からの支出を削減する「支出ガードレール戦略」をシミュレーション可能です。暴落耐性を高める具体的な運用指針の検証に役立ちます。
- **伊藤の補題(Ito Calculus)に基づく厳密なドリフト調整**
入力パラメータ「期待リターン」を算術平均として再定義。ボラティリティに基づき幾何平均リターンが低下する現象(ボラティリティ・ドラッグ)を、数学的に正しくシミュレーション内部で処理するように改善しました。
- **テールリスク(最大下落・停滞期間)の可視化**
単なる資産推移だけでなく、最悪ケースのドローダウンや回復までの期間を、累積確率分布グラフ(CDF/CCDF)で直感的に把握可能です。
- **インフレ変動モデル (AR-1モデル) の搭載**
単なる定率インフレだけでなく、統計データ(米国CPIなど)の特性を参考にしたAR-1(自己回帰)モデルを選択できます。

## 主な更新履歴

### 更新内容 (v1.8.3)

- **内部計算単位の変更(万円 → 円)**
すべての内部金額計算を「万円」から「円」に統一しました。UI上の表示単位(億円・万円)に変更はありません。
- **破綻判定の精度維持**
単位変更に伴い破綻判定の閾値(EPSILON)を 1 円に調整しました。シミュレーション結果の挙動は従来と変わりません。
- **表示制御トグル操作時の挙動改善**
「総資産推移」および「現金バッファ推移」グラフ上の「50%以下のみ表示」トグルを操作した際に、シミュレーション条件の変更警告(⚠️ 条件変更あり)が誤って表示される不具合を修正しました。

### 更新内容 (v1.8.2)

- **初期リスク資産のデフォルト値修正**
デフォルト値をUI表示単位(万円)と統一し、フォールバック時の異常値発生を防止しました。
- **入力変更後の結果共有禁止(stale状態管理)**
シミュレーション実行後に入力値を変更すると、共有・保存・比較ボタンが無効化され、サマリーカードに警告が表示されます。再実行することで再有効化されます。これにより、現在の入力と異なる結果を誤って共有することを防ぎます。
- **月次処理順序の完全統一(全判定を支出後基準に統一)**
ガードレール発動/解除判定、現金バッファ使用判定、最高値更新、補充モード開始/終了、最大ドローダウン記録をすべて「支出後総資産(月末資産)」基準に統一しました。判定結果はすべて翌月の行動(支出額・支出元)に反映されます。
- **Worker エラー時の全停止対応**
並列計算中にいずれかのWorkerでエラーが発生した場合、すべてのWorkerを安全に停止し、UIを正常に復帰させるように改善しました。
- **シミュレーション回数上限の統一**
UIと内部ロジックの上限値を 50,000回 に統一しました。
- **ステッパーボタンの操作性改善**
クリックによる単発増減に対応し、キーボード操作時のアクセシビリティを向上させました(長押し連続増減は維持)。

### 月次処理順序(v1.8.2以降)

本シミュレータでは、各月の処理を以下の順序で実行します:
1. 市場リターン適用
2. インフレ率更新
3. **支出(取崩し)実行**(前月までの判定結果に基づき、支出元と支出額を決定)
4. 支出後総資産(月末資産)を確定
5. **支出後総資産を基準に、ガードレール発動/解除・現金バッファ使用有無・高値更新・補充モード・最大DDなどの全判定を実施**(結果は翌月の行動に反映)

### 更新内容 (v1.8.1)

- **UI フィードバックの改善**
「画像を保存」機能実行後、ボタンに成功した旨が一時的に表示されるようになり操作感を向上しました。また、スマートフォンなどの狭い画面において、設定項目のツールチップが画面外にはみ出して見切れないようにレイアウトを修正しました。
- **安定性の向上**
シミュレーション実行中に稀にエラーが発生した場合に、処理が止まったままにならず即座にアラート通知されるようにフォールバック処理を強化しました。
- **コード品質の向上**
シミュレーションの内部計算で使用される数値の微小閾値(マジックナンバー)を定数化定義し、メンテナンス性を高めました。

### 更新内容 (v1.8.0)

- **パーセンタイル入力の自動整形**
シミュレーション実行時に、パーセンタイル入力欄の内容を自動的に整形します。数字以外の文字・範囲外の値(0や100など)は除去され、重複削除・昇順ソートが適用されます。設定できるのは最大5本で、6件目以降は自動的に削除されます。

- **パーセンタイル線の色グラデーション刷新**
パーセンタイル線の色を、描画本数と順位に基づいて動的に決定する方式に変更しました。最小パーセンタイルが赤、最大パーセンタイルが緑となる 赤→橙→黄→黄緑→緑 のグラデーションが、1〜5本の描画本数に応じて自動的に最適化されます。

- **ダウンサイドフォーカス機能**
「総資産推移」、「現金バッファ推移」の各グラフ右上に「50%以下のみ表示」トグルを追加しました。ONにすると50パーセンタイル以下の悲観〜中央値シナリオのみを表示し、下振れリスクに絞った分析が容易になります。グラフの再計算なしで即座に切り替えられます。デフォルトはOFF(全表示)です。

- **URLクエリパラメータ対応**
URLにクエリパラメータを付与することで、入力値を自動設定してページを開けるようになりました。`auto=1` パラメータを付与するとページ読み込み直後に自動実行されます。

- **「同条件の別タブを開く」ボタン追加**
シミュレーション実行後に表示されるボタンです。現在の入力条件と実行時の乱数シード値を固定したURLを別タブで開きます。別タブ側で条件の一部を変更して再実行することで、同じ乱数シーケンスによる厳密な比較シミュレーションが可能です。

- **「解析結果のURLリンクをコピー」ボタン追加**
シミュレーション実行後に表示されるボタンです。入力条件・シード値・自動実行フラグ(auto=1)を含むURLをクリップボードにコピーします。コピーしたURLをブラウザで開くと同じ条件でシミュレーションが自動実行されます。「Xにポスト」で共有されるURLと同一のリンクです。チャットやメモへの貼り付けで条件を共有するのに便利です。

- **Xポスト URL のクエリパラメータ化**
「Xにポスト」ボタンで共有するURLに、すべての入力条件・シード値・`auto=1` フラグを含めるようにしました。Xのポストを見た方が同じURLを開くと、投稿者と同一の条件でシミュレーションが自動実行されます。

### 更新内容 (v1.7.0)

- **集計フェーズの単一パス・マルチセレクトアルゴリズムへの置換**
シミュレーション結果の集計フェーズにおいて、従来の O(N log N) 全件ソートを廃止し、O(N) の「単一パス・マルチセレクト」(スタックベース非再帰実装)アルゴリズムへ移行しました。平均約2倍のグラフ描画高速化を実現したほか、大規模シミュレーション時の UI フリーズ(集計中の応答低下)を大幅に改善しました。
- **データ構造の転置による CPU キャッシュ局所性の最大化**
シミュレーションデータのアクセスパターンを [パス][時間] から [時間][パス] へ転置する `transposeFlat` 関数を導入し、集計時のメモリアクセスの局所性を向上させました。
- **GC(ガベージコレクション)スパイクの抑制**
改訂前は、集計ループ内で繰り返しバッファを確保し GC スパイクの原因となっていましたが、ワークバッファをループ外で1度だけ確保し、`.set()` による再利用方式に切り替えました。

### 更新内容 (v1.6.0)

- **Web Workers によるシミュレーションエンジンの並列化**
シミュレーションコアの計算ロジックをメインスレッドから Web Worker に分離し、`navigator.hardwareConcurrency` のコア数(最大8)に応じたマルチワーカー並列計算を実現しました。大規模シミュレーション(5万パス等)が大幅に高速化されました。
- **Transferable Objects (ゼロコピー転送) の導入**
各ワーカーからメインスレッドへの結果輸送に `ArrayBuffer` のゼロコピー転送(Transferable Objects)を活用し、データコピーのオーバーヘッドを排除しました。
- **Box-Muller 法のキャッシュ最適化**
正規乱数生成の Box-Muller 変換をステートフルに改修し、計算結果をキャッシュすることで実質的に計算回数を半分に削減しました。

### 更新内容 (v1.5.0)

- **マーケット変動モデル(t分布)の新規実装**
より現実の金融市場に近いリスクを評価するため、リターンを記述する「マーケット変動モデル」として、従来の「正規分布」に加え、ファットテールリスク(極端な暴落・急騰)を再現可能な「t分布」を選択可能にしました。
- **ボラティリティに対する自由度(df)自動計算の導入**
「ボラティリティが高いほどファットテール化する」という仮定に基づき、t分布のパラメータである自由度を自動的に算出するヘルパー関数を実装し、初心者でも直感的に設定が可能です。上級者向けの手動入力モードも備えています。
- **乱数シードの固定機能**
「シード値を手動で固定」する機能を追加しました。複数のパターン(例えばガードレールのON/OFF)を比較する際に、全く同じ乱数(暴落のタイミング等)を用いて厳密なA/Bテストを行えるようになりました。

### 更新内容 (v1.4.0)

- **「支出ガードレール機能」の新規実装**
暴落時(ドローダウン発生時)に生活費を自動的に削減し、資産枯渇リスクを抑制する防衛的戦略を設定可能にしました。発動条件(ドローダウン閾値)や削減率を自由に調整できます。
- **「現金バッファ戦略」の切り替え機能追加**
現金バッファ機能の有効/無効をワンタッチで切り替えられるトグルスイッチを導入。「バッファを持たない場合」との比較シミュレーションが容易になりました。
- **期待リターンの数学的定義の厳密化(ドリフト調整)**
期待リターンの入力を「算術平均」として扱い、シミュレーション内部でボラティリティに応じた「ドリフト調整」を適用。これにより、学術的に正確な幾何ブラウン運動モデルへと進化しました。
- **UI/UXの洗練と用語の統一**
「補充終了:ドローダウン -5%以下に悪化」など、シミュレーション上の判定条件をより直感的な日本語表現に修正。ツールチップ解説も大幅に拡充しました。
- **画像保存レイアウトの最適化**
保存画像に表示される設定項目を整理し、ガードレール設定などの新項目を追加しつつ、4行x2列の整然としたレイアウトに刷新しました。

## 開発の背景

私自身は機械設計を本業としており金融の専門家ではありませんが、自身の資産形成におけるリスクをより現実的に評価するために、複雑な計算をブラウザで直感的に行えるツールが必要と考え、本シミュレータを開発しました。
同じようにFIREを目指す方々の参考になれば幸いです。

## 使い方

> [!TIP]
> **[シミュレーターを今すぐ実行する (GitHub Pages)](https://moriyama-eng.github.io/fire-simulator/)**
> インストール不要・環境構築不要でそのまま使用できます。

ローカル環境でリポジトリをクローンして実行する場合、Web Worker を使用しているため `index.html` をブラウザで直接開いても動作しない可能性が高いです(セキュリティ制限による)。VS Code を利用している場合は [**Live Server 拡張機能**] をインストールし、`index.html` を右クリック、「Open with Live Server」を選択して立ち上がったブラウザで動作確認をしてください。

## 免責事項

本ツールは個人の学習・検証目的で作成されたものであり、将来の運用成果を保証するものではありません。
シミュレーション結果に基づく投資判断や資産運用によって生じた、いかなる損害についても作者は責任を負いかねます。最終的な投資判断はご自身の責任で行ってください。運用資産の種類や期間、個々の財務状況に応じた最適な戦略を保証するものではありません。

## ライセンス

This project is licensed under the MIT License - see the LICENSE file for details.