「老後資金のために、毎年5%の利回りで30年運用すれば5,000万円貯まるはず」
ネット上の資産運用シミュレーターを使うと、このような綺麗な右肩上がりのグラフが表示されます。しかし、実際の投資で毎年きっかり同じ利回りが出ることはまずありません。
現実の相場は、プラス30%の年もあればマイナス20%の年もあるなど、激しく変動します。この記事では、そんな不確実な未来を「モンテカルロ法」という手法を使って予測する方法を解説します。Pythonを使って数万通りの未来をシミュレーションし、自分の資産がどう動くのか、本当のリスクを視覚化してみましょう。
モンテカルロ法で投資のリスクを可視化する
投資の世界では、たった一つの「平均値」だけを見て計画を立てるのは非常に危険です。なぜなら、運用の途中で大きな暴落に見舞われると、その後の資産の伸びが全く変わってしまうからです。
この章では、なぜ従来の計算方法では不十分なのか、そしてモンテカルロ法を使うことでどのような「不都合な真実」が見えてくるのかを説明します。まずはシミュレーションの考え方の違いから整理していきましょう。
期待リターン通りの運用は現実には起こらない
一般的な資産運用シミュレーターは、複利計算の数式に基づいて「1.05の30乗」といった計算をしています。しかし、この計算には「リターンの順序」という視点が抜けています。
例えば、運用を開始した直後にリーマンショックのような大暴落が来た場合、元本が大きく削られてしまいます。その後にどれだけ高い利回りが出たとしても、減ってしまった元本を取り戻すのは容易ではありません。逆に、最初に大きな利益が出れば、その後の運用は非常に楽になります。
このように、現実の投資は「どのタイミングで、どの程度の変動が起きるか」に左右されます。平均値だけを信じていると、想定外の事態に対応できなくなってしまうのです。
乱数を使って数万通りの「未来」を計算する
モンテカルロ法とは、コンピュータにサイコロを振らせるように、「乱数」を使って何度もシミュレーションを繰り返す手法です。1年ごとの利回りを、過去の統計データに基づいた範囲内でランダムに決定します。
この計算を1万回、あるいは10万回と繰り返すと、資産が爆発的に増える未来もあれば、半分以下に減ってしまう未来も現れます。これらをすべてグラフに重ねて描くことで、資産がどのあたりの範囲に収まりやすいのかを「確率」として捉えられるようになります。
例えば、以下の表のように従来のシミュレーションと比較すると、その違いがはっきり分かります。
投資シミュレーションの比較
| 項目 | 従来の複利計算 | モンテカルロ法 |
| 計算の仕組み | 毎年一定の利率で増える | 毎年ランダムに利率が変わる |
| 得られる結果 | たった1つの「理想的な未来」 | 数万通りの「あり得る未来」 |
| リスクの把握 | 把握できない(無視される) | 資産が減る確率まで計算できる |
| 活用シーン | おおまかな目標設定 | 現実的なリスク管理 |
資産が底をつく確率を数値で把握できる
モンテカルロ法を導入する最大のメリットは、最悪のケースを具体的にイメージできる点にあります。投資信託の目論見書などに書かれている「標準偏差」という数値を使うことで、どれくらいの下振れが起こりうるかを計算に組み込めます。
例えば、「30年後に資産が元本を割り込んでいる確率は3%」といった具体的な数字が出せます。これが分かれば、今の投資額を増やすべきか、あるいはリスクを取りすぎているから債券を増やすべきかといった、一歩踏み込んだ判断が可能になります。
単なる精神論ではなく、統計的な裏付けを持って自分のポートフォリオと向き合えるようになる。これこそが、モンテカルロ法がプロの投資の世界でも愛用されている理由です。
Pythonでシミュレーションを行うメリット
自分でシミュレーションを組むなら、Pythonというプログラミング言語が最適です。Excelでも計算は可能ですが、1万回以上の試行をグラフ化したり、条件を細かく変えたりするのはPythonの方が圧倒的に得意だからです。
この章では、Pythonを使うことで具体的に何ができるようになるのか、その利便性と拡張性について見ていきます。プログラミングと聞くと難しく感じるかもしれませんが、投資分析においてこれほど強力な武器はありません。
無料のライブラリで高度な計算を完結できる
Pythonには、数値計算やグラフ作成をサポートする強力な「ライブラリ」が無料で提供されています。世界中のデータサイエンティストが使っているツールを、自分の資産運用のためにそのまま活用できるのです。
難しい数学の知識がなくても、ライブラリの機能を呼び出すだけで複雑な統計計算が行えます。例えば、後ほど紹介する「NumPy」というライブラリを使えば、大量のリターン予測を一瞬で生成できます。
自分でゼロから数式を組み立てる必要はなく、既存の便利な道具を組み合わせていくだけで、プロ級の分析環境が整います。
条件を自由に変更して何度でも試行できる
既存のウェブサイトにあるシミュレーターは、入力できる項目が限られていることがほとんどです。しかし、自分でPythonコードを書けば、どんな複雑な条件も設定できます。
例えば、以下のようなケースをシミュレーションに追加したくなったとします。
カスタマイズできる条件の例
- 5年おきに積立額を5万円ずつ増やしていく
- 10年目に子供の学費として300万円を取り崩す
- 暴落が起きた翌年だけ投資額を2倍にする
これらの条件をコードに一行加えるだけで、その影響を即座に計算し直せます。自分のライフプランに完全に合わせた、世界に一つだけのシミュレーターを作れるのがPythonの強みです。
グラフとして出力して直感的に理解できる
数字の羅列だけを見ていても、リスクの実態はなかなか掴めません。Pythonなら、数万本もの資産曲線を一枚のグラフに美しく描き出すことができます。
グラフを見ることで、「大半のラインはこの範囲に集まっているけれど、一部の運が悪いケースではここまで下がるのか」ということが一目で分かります。この視覚的なインパクトは、投資を続ける上での強い納得感に繋がります。
データに基づいた冷静な判断をするためには、視覚化というステップが欠かせません。文字や数字だけの情報よりも、はるかに多くの気づきを与えてくれるはずです。
開発環境の構築とライブラリの準備
それでは、実際にPythonを動かす準備を始めましょう。高度なシミュレーションといっても、必要になるツールはたったの2つだけです。
ここでは、計算を担当する「NumPy(ナンパイ)」と、グラフ描画を担当する「Matplotlib(マットプロットリブ)」の導入方法を解説します。これらを準備するだけで、あなたのPCは強力な投資分析マシンへと変わります。
NumPyとMatplotlibをインストールする
まずは、Pythonがインストールされている環境(Google ColabやJupyter Notebookなど)で、以下のコマンドを実行してください。
pip install numpy matplotlib
NumPyは大量の数値を高速に処理するためのライブラリで、これがないとモンテカルロ法のような膨大な計算は困難です。Matplotlibはグラフを作るための標準的なツールで、多くの投資家や研究者に使われています。
この2つをインストールするだけで、準備の8割は完了したと言っても過言ではありません。
必要なモジュールをインポートする
インストールが終わったら、プログラムの中でこれらのツールを使えるように呼び出します。
import numpy as np
import matplotlib.pyplot as plt
「as np」や「as plt」と書くのは、後でコードを書くときに入力しやすくするための慣習です。これで、npと打つだけでNumPyの強力な機能にアクセスできるようになります。
コードの冒頭でこれらを宣言しておくことで、プログラム全体で一貫した計算と描画が行えるようになります。
シミュレーションに必要な数値を定義する
次に、シミュレーションの前提となる数字を決めます。今回は、全世界株式(オール・カントリー)のような指数をイメージした数値を設定してみましょう。
initial_asset = 1000000 # 初期資産 100万円
annual_return = 0.05 # 年利 5%
annual_volatility = 0.20 # 標準偏差 20%
years = 30 # 運用期間 30年
simulations = 10000 # 試行回数 1万回
ここで最も重要なのは「annual_volatility(標準偏差)」です。これは価格がどれくらい上下に振れるかを示す指標です。この数値が大きいほど、将来の資産の幅が広がり、リスクが高いことを意味します。
まずはこれらの基本設定を使って、どのような未来が描かれるかを確認していきましょう。
資産曲線の核となる計算ロジック
環境が整ったところで、モンテカルロ法の心臓部にあたる計算の仕組みを解説します。ここでは「幾何ブラウン運動」という、金融実務でよく使われる株価変動のモデルを簡略化して使います。
難しく感じるかもしれませんが、基本は「昨日の価格に、ランダムに決まった今日の変動率を掛ける」という作業の繰り返しです。このセクションで計算の流れを掴んでおきましょう。
期待リターンと標準偏差から乱数を生成する
まず、1年ごとの利回りをランダムに作ります。投資の利回りは「正規分布(ベルカーブ)」に従うと仮定するのが一般的です。
# 平均 return、標準偏差 volatility の正規分布から乱数を作る
returns = np.random.normal(annual_return, annual_volatility, years)
このコードを実行すると、例えば「1年目は+15%」「2年目は-10%」といった具合に、指定した平均と振れ幅に基づいた利回りのリストが出来上がります。これが1回分の「あり得たかもしれない未来の履歴」になります。
幾何ブラウン運動の考え方を数式に落とし込む
資産価格の変動をシミュレーションする場合、単にリターンを足し合わせるのではなく、掛け合わせていく必要があります。また、厳密にはボラティリティの影響で資産の期待値が少し押し下げられる「ドラッグ(抵抗)」が発生します。
そのため、1年後の資産を求める際は、以下のような計算式をベースにします。
1年後の資産 = 現在の資産 * exp((期待リターン – ボラティリティの2乗 / 2) + ボラティリティ * 乱数)
この式を使うことで、価格がマイナスにならない(0円以下にならない)という株価の性質を保ちつつ、より正確なシミュレーションが可能になります。
1年ごとの推移を累積して資産額を算出する
生成した毎年の利回りを、初期資産に順番に掛けていきます。
例えば、1年目の利回りが5%なら「1.05」を掛け、2年目が-3%ならその結果に「0.97」を掛けます。これを設定した運用期間分(今回は30年分)繰り返すことで、一本の資産曲線が完成します。
PythonのNumPyには「累積積(cumprod)」という便利な機能があり、これを使えば数行で全ての年の資産残高を計算できます。
実際に動くPythonコードを実装する
概念が理解できたら、いよいよコード全体を組み立てていきましょう。ここでは、先ほど決めた設定を使って、1万通りの資産推移を一気に計算するプログラムを書きます。
このコードをコピーして実行するだけで、誰でもモンテカルロ・シミュレーションが体験できます。各パーツの役割を解説しながら進めていきます。
1回分の資産推移を計算する関数を作る
まずは、シミュレーションの最小単位となる部分を定義します。
def generate_asset_path(initial_asset, annual_return, annual_volatility, years):
# 毎年の変動(対数リターン)を計算
daily_returns = np.random.normal(
annual_return - 0.5 * annual_volatility**2,
annual_volatility,
years
)
# 指数関数で価格推移に変換し、初期資産を掛ける
asset_path = initial_asset * np.cumprod(np.exp(daily_returns))
# 開始時の資産(100万円)を配列の先頭に追加
return np.insert(asset_path, 0, initial_asset)
この関数を呼び出すたびに、ランダムな未来が一つ生成されます。少し複雑に見える「np.exp」や「np.cumprod」は、複利計算を数学的に正しく、かつ高速に行うための呪文だと思ってください。
for文を使って1万回の試行を繰り返す
次に、この関数を1万回実行して、全てのデータを集めます。
all_paths = []
for _ in range(simulations):
path = generate_asset_path(initial_asset, annual_return, annual_volatility, years)
all_paths.append(path)
# 扱いやすいように行列形式に変換
all_paths = np.array(all_paths)
この「all_paths」という変数の中には、1万人分の、それぞれ異なる30年間の運用履歴が詰まっています。現代のPCなら、この程度の計算は1秒もかからずに終わります。
結果を多次元配列に格納する
計算結果は「10000行 × 31列」の巨大な表のような形式で保持されます。
縦方向(行)が試行回数、横方向(列)が経過年数です。この構造にしておくことで、「30年後の資産額だけを取り出す」といった操作や、「各年の平均値を計算する」といった分析が非常にスムーズになります。
データが整理された状態で手元にあれば、あとはそれを可視化するだけです。
算出した資産曲線をグラフで表示する
いよいよクライマックスです。計算した1万通りの未来をグラフに描き出しましょう。
1万本もの線を引くとグラフが真っ黒になってしまいそうですが、色の濃さを調整することで、データの「密度」を見ることができるようになります。
Matplotlibで1万本の線をプロットする
以下のコードでグラフを描画します。
plt.figure(figsize=(10, 6))
plt.plot(all_paths.T, color='blue', alpha=0.01) # alphaで透明度を極限まで下げる
plt.title('Monte Carlo Simulation of Asset Growth')
plt.xlabel('Years')
plt.ylabel('Asset Value (Yen)')
plt.grid(True)
plt.show()
ここで重要なのが「alpha=0.01」という設定です。一本一本の線を透かして描くことで、線が重なっている部分(=確率が高い未来)が濃く表示されます。逆に、線が薄い部分は「めったに起きないレアケース」であることがわかります。
グラフの見栄えを整えて視認性を高める
より専門的なグラフにするために、いくつかの代表的なラインを追加してみましょう。
例えば、1万通りのうちちょうど真ん中の成績だった「中央値」のラインを赤色で、上位5%と下位5%のラインを点線で書き加えます。こうすることで、自分の資産がどの程度の範囲を動き回るのかが一目瞭然になります。
「だいたいこの赤い線のあたりに進む可能性が高いけれど、最悪はこの点線まで落ちる覚悟が必要だな」という客観的な視点が持てるようになります。
重なり具合から「起こりやすい未来」を判断する
出力されたグラフをじっくり観察してみてください。開始直後は一本の細い束ですが、時間が経つにつれてラッパのように大きく広がっていくはずです。
この広がりの正体こそが「不確実性(リスク)」です。運用期間が長くなるほど、複利の力で資産が増える可能性も高まりますが、同時に「最高の結果」と「最悪の結果」の差も開いていきます。
「平均的に増えること」よりも「この広がりの中に自分の許容範囲が収まっているか」を確認することこそ、モンテカルロ法の真の目的です。
シミュレーション結果を正しく分析する
グラフを眺めるだけでも楽しいものですが、より具体的な投資判断に繋げるためには「数字」で結果を評価する必要があります。
1万通りのデータから、どのような指標に注目すべきかを整理しました。特に、多くの人が陥りがちな「平均値の罠」には注意が必要です。
平均値ではなく中央値(50%ライン)を見る
投資のリターンをシミュレーションすると、一部の「爆発的に増えたケース」が平均値を大きく引き上げてしまいます。そのため、平均値は「実際よりも調子が良い数字」になりがちです。
より現実的な予測として活用すべきなのは、1万通りを並べた時にちょうど真ん中に位置する「中央値」です。
平均値と中央値のイメージ
- 平均値:一部の成功者が数値を底上げした「理想に近い数字」
- 中央値:100人中50番目の人が手にする「最もありふれた数字」
シミュレーションの結果、平均値と中央値に大きな差がある場合は、中央値をベースに計画を立てる方が無難です。
下位5%の「最悪のシナリオ」を許容できるか
次に注目すべきは、成績が悪かった下位5%(ワースト500通り)のラインです。
もし、30年運用した結果の下位5%が「元本を大きく割り込み、生活が破綻するレベル」だった場合、その投資計画はリスクを取りすぎている可能性があります。どれだけ平均的なリターンが高くても、このワーストケースを引き当ててしまった時に耐えられないのであれば、資産配分を見直すべきです。
「この最悪のシナリオが起きても、自分は投資を続けられるか?」と自問自答してみてください。
目標金額に到達する確率を計算する
Pythonを使えば、「30年後に5,000万円を超えている確率」も簡単に算出できます。
final_assets = all_paths[:, -1] # 30年後の最終資産をすべて取り出す
success_count = np.sum(final_assets >= 50000000)
success_rate = (success_count / simulations) * 100
print(f"目標達成確率: {success_rate}%")
このように確率で把握することで、「もっと節約して入金力を上げるべきか」「少しリスクの高い商品に切り替えるか」といったアクションプランが明確になります。
より現実的なシミュレーションに近づける
ここまでの基本モデルでも十分強力ですが、実際の投資ではさらに「コスト」や「インフレ」といった要素が牙を剥きます。
これらを考慮しないシミュレーションは、いわば「空気抵抗のない世界での計算」のようなものです。より実戦的なシミュレーターにするためのカスタマイズ項目を紹介します。
毎月の積立額と運用コストを差し引く
多くの人は一括投資だけでなく、毎月の積み立ても行っているはずです。また、投資信託を保有していれば「信託報酬」というコストが毎日引かれます。
これらを計算式に組み込むことで、現実に即した資産推移になります。
monthly_deposit = 50000 # 毎月5万円積み立て
expense_ratio = 0.001 # 信託報酬 年0.1%
たった0.1%のコストでも、30年という長期間では数百万円単位の差になって現れます。コストの恐ろしさを視覚化できるのも、自作シミュレーターの醍醐味です。
インフレ率を考慮して実質的な価値を出す
「30年後に1億円持っている」としても、物価が2倍になっていれば、その1億円の価値は今の5,000万円分しかありません。これを考慮するために「インフレ率」を引いた「実質利回り」で計算するのが定石です。
名目上の数字に惑わされず、将来の購買力を正確に見極めることができます。
リバランスの有無で結果がどう変わるか
複数の資産(例えば株と債券)を組み合わせている場合、崩れた比率を元に戻す「リバランス」の効果も検証できます。
リバランスを行うと、リスクを抑えつつリターンが安定する傾向にあります。これをPython上で再現し、「何もしない場合」と「毎年リバランスする場合」で資産曲線の広がりがどう変わるかを比較してみるのも面白いでしょう。
より現実的な条件を加えた、シミュレーションの比較表を以下にまとめました。
条件によるシミュレーションの精度
| 項目 | 簡易シミュレーション | 実践シミュレーション |
| 入金方法 | 初期の一括投資のみ | 毎月の積立・増額も考慮 |
| コスト | 0円(無視) | 信託報酬・税金を差し引き |
| 通貨価値 | 現在の価値で固定 | インフレ率による減価を考慮 |
| 精度 | おおまかな目安 | そのまま家計簿に使えるレベル |
モンテカルロ法を用いる際の注意点
モンテカルロ法は万能な予知能力ではありません。あくまで「入力されたデータに基づいた統計的な予測」に過ぎないことを忘れてはいけません。
最後に、この手法を過信しないための注意点をいくつかお伝えします。ツールを使いこなすには、その限界を知っておくことも重要です。
入力するパラメータ次第で結果は大きく変わる
モンテカルロ法の結果は、最初に設定した「期待リターン」と「標準偏差」に完全に依存します。
例えば、期待リターンを1%高く見積もるだけで、30年後の結果は数千万円単位で変わってしまいます。この入力値自体が間違っていれば、どれだけ10万回のシミュレーションを繰り返しても、出てくる答えは「ゴミ」になってしまいます。
過去の平均データを使うのか、それとも保守的に低めの数値を使うのか。入力値を決めるプロセスにこそ、最も時間をかけるべきです。
過去のデータが将来を保証するわけではない
シミュレーションで使う統計量は、通常「過去30年」などの歴史的なデータから引用します。しかし、過去に起きたことが未来も繰り返される保証はありません。
低成長時代に突入したり、全く新しい金融危機が起きたりすれば、過去の統計に基づいたシミュレーションは役に立たなくなります。「歴史は繰り返さないが、韻を踏む」という言葉がある通り、あくまで一つの参考資料として捉えるのが健全な態度です。
異常事態(テールリスク)は考慮されにくい
モンテカルロ法(特に正規分布を用いるもの)は、数百年の一度の暴落といった「テールリスク」を過小評価する傾向があります。
現実の市場では、統計学的に「あり得ない」とされるレベルの変動が、予想以上の頻度で起こります(これをブラックスワンと呼びます)。シミュレーションで「下位5%でも大丈夫」という結果が出たとしても、それ以上の壊滅的な事態が起きる可能性は常にゼロではない、という意識を持っておきましょう。
まとめ:データに基づいた冷静な資産運用を
この記事では、Pythonを使ってモンテカルロ・シミュレーションを行い、資産のリスクを視覚化する方法を解説しました。平均的な利回りだけを見る複利計算とは異なり、数万通りの未来を描き出すことで、自分にとっての「最悪のシナリオ」や「現実的な目標達成率」を浮き彫りにできたはずです。
投資は、不確実な未来に自分のお金を投じる行為です。だからこそ、なんとなくの期待感で動くのではなく、今回紹介したような手法でリスクを数値化し、納得感のある計画を立てることが大切です。
ぜひ、今回紹介したコードをご自身の環境で動かしてみてください。積立額を変えたり、暴落の条件を加えたりして試行錯誤するうちに、あなたの投資に対する解像度は飛躍的に高まるはずです。

