
Excelで株価のシミュレーションっていうとちょっと構えちゃうけど、実際に動かしてみると案外、簡単で楽しいよ。気負わず、ゆるっとやってみよう!
Excel VBAで手軽に株価シミュレーションを体験!Excel VBAを活用して実装した株価シミュレーションプログラムを紹介します。
幾何ブラウン運動(GBMモデル)をベースにしたロジックで、日々のリターンをランダムに生成しながら、実際のマーケットに近い値動きを再現しています。さらに、レバレッジの設定も可能なので、リスクとリターンの違いを視覚的に比較することができます。シンプルな構造ながら、金融の仕組みを体感できるのが魅力です。
興味がある方は、ぜひコードを参考にしたり、ちょっとアレンジして遊んでみてください。「へー、Excelってこんなことできるんだ」って思ってもらえたら嬉しいです!
まずはご確認ください:内容に関するご注意
- このシミュレーションを作った本人は、金融の専門家ではありません。 難しい数式や理論も詳しくは理解していません。
- 思いつきと、ネットや生成AIから得た情報をもとに組み立てたコードなので、専門的な視点で見ると「ん?」と思う部分があるかもしれません。
- それでも、「なんとなく株価っぽい動き」を体感してもらえる内容にはなっていると思います。
ちなみに、幾何ブラウン運動(GBMモデル)についても、ちゃんと説明できるほど詳しくありません(…なのに作ってしまいました)。 細かいところは、どうかやさしい目で見ていただけると嬉しいです。
- 本記事で使用しているデータ、ソースコードは、あくまでExcelの機能を紹介するためのものであり、内容の正確性や整合性を確認したものではありません。
- データ、ソースコードはサンプルとして取り扱っており、実際の株価や市場データとは異なります。
- 本記事の内容をもとに、株式売買などの投資判断を行うことは推奨しておりません。
- 株式取引はリスクを伴う行為であり、最終的な判断はすべてご自身の責任でお願いいたします。
- データ、ソースコードの活用については、目的に応じて適切な確認・加工を行った上で使用してください。
このシミュレーションでできること
- 初期設定として、株価・利回り・リスクなどを定数で指定できます
- 祝日などは考慮せず、営業日ベースで指定期間の日次株価を算出します
- 幾何ブラウン運動(GBMモデル)のロジックを使って、株価をランダムに生成します
- レバレッジ(倍率)をかけた2種類の株価も算出可能です(理論的GBM型、単純な日次変動率型)
- 結果はExcelシートに出力されるので、グラフ化もラクラク!
利回りやリスクを指定して、株価の動きをざっくりと体感するためのツールです。 特定の銘柄の価格を予測するような、高度で精密な分析はできませんので、その点はご了承ください。
サンプルコード
Option Explicit
Sub GenerateStockSimulation()
' パラメータ
Const initialStockPrice As Double = 10000 ' 初期株価
Const annualReturn As Double = 0.07 ' 年間利回り(μ)
Const volatility As Double = 0.25 ' リスク(標準偏差:σ)
Const daysInYear As Long = 260 ' 年間日数(営業日ベース)
Const leverage As Double = 3 ' レバレッジ倍率
Dim ws As Worksheet ' 出力先シート名
Dim currentDate As Date ' 期間のはじめ
Dim endDate As Date ' 期間の終わり
Dim stkPrice As Double ' 通常株価(GBMモデル)
Dim levStkPrice As Double ' GBMモデルのレバレッジ株価
Dim levSimpleStkPrice As Double ' 単純倍率のレバレッジ株価
Dim drift As Double, shock As Double
Dim levDrift As Double, levShock As Double
Dim prevStkPrice As Double ' 通常株価の前日価格(日次騰落率計算用)
Dim logDailyReturn As Double ' 対数日次リターン
Dim simpleDailyReturn As Double ' 通常株価の日次リターン
Dim normInvValue As Double ' 標準正規分布に従う乱数
Dim rowIndex As Long
' 出力先シートセット
On Error Resume Next
Set ws = Worksheets("Sheet1")
If ws Is Nothing Then
MsgBox "出力先シートが存在しません", vbCritical
Exit Sub
End If
On Error GoTo 0
' 画面更新をOFF、計算モードを手動
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' 期間設定
currentDate = DateSerial(2015, 1, 1)
endDate = DateSerial(2024, 12, 31)
' 初期価格設定
stkPrice = initialStockPrice
levStkPrice = initialStockPrice
levSimpleStkPrice = initialStockPrice
rowIndex = 3
' シート初期化(旧データ削除)
ws.Cells.ClearContents
' 乱数の初期化(再現性が必要ならRandomize の引数を入れる)
Randomize
' タイトル行・初期株価出力
With ws
.Cells(1, 1).Value = "日付"
.Cells(1, 2).Value = "株価(r" & annualReturn & ",v" & volatility & ")"
.Cells(1, 3).Value = "株価(レバGBM" & leverage & ")"
.Cells(1, 4).Value = "株価(レバ単純" & leverage & ")"
.Cells(2, 1).Value = currentDate
.Cells(2, 2).Value = stkPrice
.Cells(2, 3).Value = levStkPrice
.Cells(2, 4).Value = levSimpleStkPrice
End With
currentDate = currentDate + 1
' 株価シミュレーション(祝日など考慮せず、平日のみ)
Do While currentDate <= endDate
' 平日のみ(Mon=1~Fri=5)
If Weekday(currentDate, vbMonday) <= 5 Then
' 通常株価の前日価格を保持 (リターン計算用)
prevStkPrice = stkPrice
' 標準正規乱数取得
normInvValue = WorksheetFunction.Norm_S_Inv(Rnd)
' 1. GBMモデルの対数日次リターン計算
drift = (annualReturn - 0.5 * volatility ^ 2) / daysInYear
shock = volatility * Sqr(1 / daysInYear) * normInvValue
logDailyReturn = drift + shock
' 通常株価更新
stkPrice = stkPrice * Exp(logDailyReturn)
' 2. レバレッジGBM理論式
levDrift = (leverage * annualReturn - 0.5 * leverage ^ 2 * volatility ^ 2) / daysInYear
levShock = leverage * volatility * Sqr(1 / daysInYear) * normInvValue
' GBMレバレッジ株価更新
levStkPrice = levStkPrice * Exp(levDrift + levShock)
' 3. 単純日次リターン方式(通常株価変動率 × レバレッジ)
simpleDailyReturn = (stkPrice - prevStkPrice) / prevStkPrice
levSimpleStkPrice = levSimpleStkPrice * (1 + leverage * simpleDailyReturn)
' 出力
ws.Cells(rowIndex, 1).Value = currentDate
ws.Cells(rowIndex, 2).Value = Round(stkPrice, 2)
ws.Cells(rowIndex, 3).Value = Round(levStkPrice, 2)
ws.Cells(rowIndex, 4).Value = Round(levSimpleStkPrice, 2)
rowIndex = rowIndex + 1
End If
currentDate = currentDate + 1
Loop
' 画面更新、計算モードを戻す
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox "株価シミュレーション完了しました!"
End Sub
ソースコードの解説
1.定数と変数の設定
Const initialStockPrice As Double = 10000 ' 初期株価
Const annualReturn As Double = 0.07 ' 年間利回り(μ)
Const volatility As Double = 0.25 ' リスク(標準偏差:σ)
Const daysInYear As Long = 260 ' 年間日数(営業日ベース)
Const leverage As Double = 3 ' レバレッジ倍率
- シミュレーションに必要なパラメータ(初期株価、利回り、リスク、年間日数、レバレッジ倍率)を定数として宣言
- 数字を変えるだけで、さまざまなパターンのシミュレーションが簡単に試せます
パラメータは以下のとおりです。
パラメータ名 | 内容 | 例(設定値) |
---|---|---|
initialStockPrice | 初期株価 | 10,000円 |
annualReturn | 年間利回り(μ) | 0.07 → 7% |
volatility | リスク(標準偏差:σ) | 0.25 → 25% |
daysInYear | 年間日数(営業日ベース) | 260日(週末除く) |
leverage | レバレッジ倍率 | 3倍(値動きが大きく) |
たとえば、利回りやリスクの数値を変えるだけで、リスクの高い銘柄風や安定志向の動きなど、いろんなシナリオを再現できます。 レバレッジをかけると値動きが激しくなるので、リスクとリターンの関係も見えてきますよ。
2.出力先シートの取得とエラーチェック
On Error Resume Next
Set ws = Worksheets("Sheet1")
If ws Is Nothing Then
MsgBox "出力先シートが存在しません", vbCritical
Exit Sub
End If
On Error GoTo 0
- 出力先として
"Sheet1"
を指定 - シートが存在しない場合は、メッセージを表示して処理を中断
- エラー処理でExcelが止まらないようにしています
3.Excelの描画更新・計算モードの一時停止
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
- 画面のちらつきを防ぐため、描画更新をOFF
- 計算モードを手動にして、処理速度をアップ!
4.シミュレーション期間と初期値設定
currentDate = DateSerial(2015, 1, 1)
endDate = DateSerial(2024, 12, 31)
stkPrice = initialStockPrice
levStkPrice = initialStockPrice
levSimpleStkPrice = initialStockPrice
rowIndex = 3
- シミュレーションの開始日と終了日を設定
- 通常株価・レバレッジ株価の初期値をセット
- Excelでの書き込み開始行(3行目)を指定
5.ワークシートの初期化と乱数の準備
ws.Cells.ClearContents
Randomize
- 前回のデータをすべてクリアして、クリーンな状態に
Randomize
で乱数の初期化(毎回違う結果になります)
6.ヘッダー行の作成と初期値の出力
With ws
.Cells(1, 1).Value = "日付"
.Cells(1, 2).Value = "株価(r" & annualReturn & ",v" & volatility & ")"
.Cells(1, 3).Value = "株価(レバGBM" & leverage & ")"
.Cells(1, 4).Value = "株価(レバ単純" & leverage & ")"
.Cells(2, 1).Value = currentDate
.Cells(2, 2).Value = stkPrice
.Cells(2, 3).Value = levStkPrice
.Cells(2, 4).Value = levSimpleStkPrice
End With
currentDate = currentDate + 1
- 1行目に列タイトルを設定
- 何度も実行すると、設定値がわからなくなるので、タイトル部分に設定値も表示して分かりやすく
- 2行目に初期株価を出力
- 日付を1日進めて、シミュレーションの準備完了!
7.毎営業日の株価を計算(メイン処理)
Do While currentDate <= endDate
If Weekday(currentDate, vbMonday) <= 5 Then ' 平日のみ実行(月~金)
' --- 以下、1日の処理 ---
...
End If
currentDate = currentDate + 1
Loop
- 指定期間を1日ずつループ
Weekday
関数で平日(月〜金)のみ処理- 土日はスキップ(祝日は考慮していません)
8.標準正規乱数の取得
normInvValue = WorksheetFunction.Norm_S_Inv(Rnd)
Rnd
で0〜1の乱数を生成Norm_S_Inv
で標準正規分布に変換- 株価の「揺らぎ(ショック)」の元になります
9.GBMモデル風ロジックで日次リターン計算
drift = (annualReturn - 0.5 * volatility ^ 2) / daysInYear
shock = volatility * Sqr(1 / daysInYear) * normInvValue
logDailyReturn = drift + shock
- ドリフト:平均的な成長分
- ショック:ランダムな揺れ
- この2つを足して、日次のリターンを計算
- 幾何ブラウン運動(GBMモデル)っぽい動きを再現しています!
ここが、このプログラムの肝です。いわゆる幾何ブラウン運動(GBMモデル)っぽい計算方法で、リターンに揺らぎを与えています。「毎日どれくらい変動するか」を、この数式で疑似的に作ってるイメージです。
10.通常株価の更新(GBMモデル)
stkPrice = stkPrice * Exp(logDailyReturn)
- 対数リターンを使って、株価を複利で更新
11.レバレッジGBMの計算と更新
levDrift = (leverage * annualReturn - 0.5 * leverage ^ 2 * volatility ^ 2) / daysInYear
levShock = leverage * volatility * Sqr(1 / daysInYear) * normInvValue
levStkPrice = levStkPrice * Exp(levDrift + levShock)
- レバレッジをかけたドリフトとショックを計算
- レバレッジGBMの株価を更新
12.単純レバレッジ株価の更新
simpleDailyReturn = (stkPrice - prevStkPrice) / prevStkPrice
levSimpleStkPrice = levSimpleStkPrice * (1 + leverage * simpleDailyReturn)
- レバレッジ無しの株価変動率にレバレッジ倍率をかけて株価を更新
13.結果のExcel書き込み
ws.Cells(rowIndex, 1).Value = currentDate
ws.Cells(rowIndex, 2).Value = Round(stkPrice, 2)
ws.Cells(rowIndex, 3).Value = Round(levStkPrice, 2)
ws.Cells(rowIndex, 4).Value = Round(levSimpleStkPrice, 2)
rowIndex = rowIndex + 1
- 各日の株価をExcelに書き込み
Round
で小数第2位までに調整して見やすく
14.後処理と完了メッセージ
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox "株価シミュレーション完了しました!"
- 最初にOFFにした画面更新・計算モードを元に戻す
- メッセージボックスで完了を通知(不要なら削除してOK)
計算結果とグラフ
今回のシミュレーションでは、年間利回り7%・リスク25%・レバレッジ3倍という、すこし攻めた設定で試してみました。

グラフにしてみると、株価の動きが一目瞭然! Excelって、こういうとき本当に便利ですよね。数字だけだとピンとこない変化も、グラフにすると「おぉ…」ってなります。
- 青線:通常の株価(レバレッジなし)
- オレンジ線:GBMモデルでレバレッジ3倍をかけた株価

オレンジのライン、めちゃくちゃ動いてます。まさにジェットコースター。 うまく上昇タイミングで売り抜けられれば大きな利益になりますが…現実はそんなに甘くないのが相場の世界です。
さらに、GBMレバレッジ型と単純レバレッジ型を比較してみると、意外にもほぼ同じ動き。
- オレンジ線:GBMレバレッジ
- 緑線:単純レバレッジ
ほとんど重なってしまって、オレンジが緑に隠れて見えなくなるくらいです。仲良しか!

でも、同じ利回り7%・リスク25%でも、ちょっとした乱数の違いで結果は大きく変わります。 下のグラフでは、レバレッジありの株価が地面を這うような動きに…。

とにかく、レバレッジをかけると価格の変動幅がとんでもなく大きくなるということがよくわかります。 怖いけど、面白い。そんな世界をExcelでちょっとだけ体験してみました。
まとめ
ExcelとVBAで株価シミュレーション、やってみたら意外とそれっぽい!
今回の株価シミュレーションは、「とりあえずやってみよう!」精神で組んでみたVBAコードを使って、Excelだけで10年分の株価の動きをそれっぽく再現してみる――そんな試みでした。
- 難しい金融理論なしで、それっぽい株価データが作れた!
- レバレッジをかけることで、リスクとリターンの違いが体感できた!
- ExcelとVBAだけで、データの面白さにちょっと触れられた!
…と、金融の専門知識がなくても「おっ、なんかそれっぽい!」という感覚を味わえる内容になったんじゃないかと思います。
もちろん、数式の精度やモデルの厳密さについては、ツッコミどころもあるかもしれません。 でもこのブログの目的は、「数字とちょっと仲良くなるきっかけ」を作ること。 完璧じゃなくても、まずは触れてみることが大事だと思っています。
実際に動かしてみると、グラフの変化やレバレッジの暴れっぷりがなかなか面白いので、興味が湧いた方はぜひ試してみてください。 Excelのセルが、ちょっとだけ投資の世界に見えてくるかもしれませんよ。
最後まで読んでいただき、ありがとうございました!

まだまだ勉強中だけど、こうやって数字やExcelに触れてみると、世界がちょっと広がった気がします。難しく考えずに“ちょっと試してみる”って、案外面白い発見があるんですね!