「自分で決めたルールを守る」ためにできること ― バックテストでルールを理解する

Jul 31, 2025

投資では「自分で決めたルールを守ることが大切だ」と言われます。当たり前のようですが、このように当たり前のことがよく言われるのは、それが難しいからです。

以前、なぜ「自分で決めたルールを守ること」が難しいのかについて考えました。

その中で、ルールについて理解することが大切と述べましたが、ではどうすればルールをよく理解できるのでしょうか?この記事では、その答えとして「バックテストをする」という方法を紹介します。ルールが実際にどう機能したかを自分の手で検証しておくことで、ルールに対する納得度合いを高め、「自分で決めたルールを守る」ことの助けになると考えています。

Table of Contents

ルールを「本当に理解する」とはどういうことか?

なぜ投資で「自分で決めたルールを守ること」が難しいのか でも、定期的に定額購入する、いわゆる「積立投資」を例に、ルールを理解することについて説明しました。

Aさんはこう言いました。


「なんかドルコスト平均法っていうのがいいらしいから、とりあえず始めてみようと思って。」


一方のBさんは、こう話しました。


「ドルコスト平均法は、価格が上下する資産を長期で積み立てるときに有効なんだ。
価格が下がれば多く買えて、上がれば少なく買う。結果的に取得単価が平均化される。
ドルコスト平均法は高値掴みもするし、デメリットもあるけど、自分は相場を読むのが得意じゃないから、時間分散によってリスクを抑えつつ、長期で市場平均に乗るためにこれをやるんだ。」

AさんよりBさんの方が「定期的に定額購入する」というルールについて理解していますね。

では、「本当に理解している」と言えるのは、Bさんまででしょうか?

ここで登場するのがCさんです。

Cさんは、Bさんと同じようにドルコスト平均法の理屈を説明できます。ですが、それに加えて過去のデータを使って、自分の手でルールを検証してみた経験を持っています。

具体的には、過去データを使って、「実際にS&P 500 を毎月100ドル購入していたら、資産評価額はどのように変化していたか?」をシミュレーションしてみたのです。

これによってCさんは、こう言えるようになります。

「たとえば2008年のリーマンショックのような暴落局面では、評価額が投資元本を一時的に大きく下回る。でも、その後も積み立てを継続していたら、2012年以降の回復でぐっと持ち直す場面があった。つまり、短期的には含み損に耐える必要があるけど、時間をかければリスクは吸収されていく可能性が高いという実感を持てた。」

この「実感」は、ただの知識ではありません。ルールの構造を、過去の現実を通して自分の中に落とし込んだ結果です。

つまり、
Bさんは「理屈として知っている」
Cさんは「データを通して経験的に理解している」

ルールの内容を知っているだけでは、相場が崩れたときに「このまま続けて大丈夫なんだっけ?」と不安になるかもしれません。
でも、自分の手で検証をして、「この程度の含み損は想定内だ」と確認していれば、不安に耐える力が備わります。

ルールを本当に理解するとは、単に知識として理解することではなく、その意味と振る舞いを自分の目と手で確認し、納得すること。

そして、バックテストは、ルールを本当に理解することの手助けになります。

バックテストというアプローチ

バックテストとは、過去のデータを使って、自分の投資ルールをシミュレーションしてみることです。
「もしこのルールを〇年前から続けていたら、どんな資産推移になっていたか?」をデータで確認するアプローチです。

たとえば、今回紹介する積立投資の例では、以下のようなことを確認できます:

  • 毎月100ドルを10年間積み立てると、評価額はどう変化していたか?(簡単のため円ではなくドルで積み立てることとします)

  • 一時的に元本割れする時期はどのくらいあったのか?

  • 最終的なリターンは、どの程度だったのか?

こうした情報は、ネットや書籍の「積立投資は長期で有利」といった一般論よりも、ずっと説得力があります。
なぜなら、抽象的な理屈ではなく、自分の目で確認したことだからです。

また、バックテストをすることで、ルールの限界やリスクの「具体的な姿」が見えてきます。
「思ったより含み損が長く続く時期もあるな」といった気づきは、実際の運用を継続するうえで貴重な心構えになります。

もちろん、バックテストには限界もあります。未来の相場は過去と同じようには動きませんし、過去にうまくいった手法が今後も有効とは限りません。

それでも、ルールの「意図」や「性質」を把握するうえでは、バックテストは非常に有効なツールです。少なくとも「よく分からないけど何となく始めた」状態はもちろん、「理屈では理解している」状態よりも一段も二段も深い理解に到達できます。

次のセクションでは、実際にバックテストをしてみたシンプルなコードをご紹介します。

バックテストしてみる

ではここから、実際にバックテストをしてみましょう。

検証対象のルール

「毎月末に SPY (SPDR S&P 500 ETF) (S&P 500 に連動することを目指す ETF の一つ)を $100 購入する。投資期間中は売ることはない。」

注:

  • 今回はバックテストの都合上、古くから存在し過去データが豊富な SPY を S&P 500 連動 ETF として選びました。
  • 単純化のため、円ではなく米ドルを基準に定額積み立てをすることとしています。

使用する技術

  • Python
  • yfinance: Yahoo Finance(Yahoo Inc. が提供するもので、日本の Yahoo! ファイナンスとは別物)の価格データを取得する
  • pandas: 表形式のデータ処理
  • matplotlib: グラフ処理

yfinance については、以下の記事でまとめています。yfinance 以外の技術に関して詳しく知りたい場合でも、以下の内容はきっと役に立つと思います。

また、Python を使わず表計算で同じシミュレーションをする手順については、以下で解説しています。

それでは、次は実際の Python のコードを見ていきましょう。

コード

まずは準備。バックテストに使うツールを読み込んでいます。

import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

Yahoo Financeから、SPYの月次終値データを取得しています。 startendを変更することでテストする期間を変更できます。

# ① SPY(SPY)の月次データを取得
start='2015-01-01'
end='2025-01-01'

data = yf.download('SPY', start=start, end=end, interval='1mo')

データの形式がやや複雑なので、必要な「終値(Close)」だけを取り出せるように整形しています。\

# ② 取得したデータのカラム名を整える(yfinanceの仕様に対応)
data.columns = ['_'.join(filter(None, col)).strip() if isinstance(col, tuple) else col for col in data.columns]

# 欠損行を除去
data = data.dropna()

adj_close_col = 'Close_SPY' if 'Close_SPY' in data.columns else 'Close'

「毎月100ドルで何株買えるか?」を計算し、それを累積して、
最終的にどれだけの資産になっているか(= ポートフォリオの価値)を出します。\

# ③ 積立シミュレーションの計算部分
monthly_invest = 100
data['shares'] = monthly_invest / data[adj_close_col]
data['cumulative_shares'] = data['shares'].cumsum()
data['cumulative_investment'] = monthly_invest * np.arange(1, len(data) + 1)
data['portfolio_value'] = data['cumulative_shares'] * data[adj_close_col]

最終月時点の累積投資額と評価額を出力しています。

# ④ 結果の表示(最終時点の比較)
print(data.tail(1)[['cumulative_investment', 'portfolio_value']])

最後に、投資の推移をグラフで可視化します。破線が「これまで投資した元本」、実線が「今の評価額」です。\

# ⑤ グラフの描画
plt.figure(figsize=(12, 6))
plt.plot(data.index, data['cumulative_investment'], label='累積投資額 (ドル)', linestyle='--')
plt.plot(data.index, data['portfolio_value'], label='資産評価額 (ドル)', linewidth=2)
plt.title('SPY 月100ドル積立のシミュレーション')
plt.xlabel('年月')
plt.ylabel('金額(ドル)')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

最後にここまでを一つにまとめたコードを掲載します。

import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# ① SPY(SPY)の月次データを取得
start='2015-01-01'
end='2025-01-01'

data = yf.download('SPY', start=start, end=end, interval='1mo')

# ② 取得したデータのカラム名を整える(yfinanceの仕様に対応)
data.columns = ['_'.join(filter(None, col)).strip() if isinstance(col, tuple) else col for col in data.columns]

# 欠損行を除去
data = data.dropna()

adj_close_col = 'Close_SPY' if 'Close_SPY' in data.columns else 'Close'

# ③ 積立シミュレーションの計算部分
monthly_invest = 100
data['shares'] = monthly_invest / data[adj_close_col]
data['cumulative_shares'] = data['shares'].cumsum()
data['cumulative_investment'] = monthly_invest * np.arange(1, len(data) + 1)
data['portfolio_value'] = data['cumulative_shares'] * data[adj_close_col]

# ④ 結果の表示(最終時点の比較)
print(data.tail(1)[['cumulative_investment', 'portfolio_value']])

# ⑤ グラフの描画
plt.figure(figsize=(12, 6))
plt.plot(data.index, data['cumulative_investment'], label='累積投資額 (ドル)', linestyle='--')
plt.plot(data.index, data['portfolio_value'], label='資産評価額 (ドル)', linewidth=2)
plt.title('SPY 月100ドル積立のシミュレーション')
plt.xlabel('年月')
plt.ylabel('金額(ドル)')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

Jupyter Notebook はこちらをご覧ください。

バックテストの結果

実際に、複数の期間でバックテストを行ってみます。

1995年~2004年

  • start: 1995-01-01
  • end: 2005-01-01
  • 累積投資額:$12,000.00
  • 最終評価額:$16,754.55
1995年~2004年の SPY 積み立て結果


2002年あたりで一度元本割れを起こしますが、最終的には持ち直しています。

2000年~2009年

  • start: 2000-01-01
  • end: 2010-01-01
  • 累積投資額:$12,000.00
  • 最終評価額:$12,753.01
2000年~2009年の SPY 積み立て結果


2001年から2003年の間元本割れしています。また、2008年のリーマンショックの影響で2009年に元本を大きく下回る時期があります。最終的にはリターンはプラスになっていますが、わざわざリスクをとったわりにはリターンが小さい印象です。

2005年~2014年

  • start: 2005-01-01
  • end: 2015-01-01
  • 累積投資額:$12,000.00
  • 最終評価額:$21,114.70
2005年~2014年の SPY 積み立て結果


リーマンショックの影響でやはり2008年から2009年にかけて元本割れをしているものの、累積投資額の75%ほどの利益が出ています。

2010年~2019年

  • start: 2010-01-01
  • end: 2020-01-01
  • 累積投資額:$12,000.00
  • 最終評価額:$24,252.38
2010年~2019年の SPY 積み立て結果


累積投資額の2倍ほどの評価額になっています。

2015年~2024年

  • start: 2015-01-01
  • end: 2025-01-01
  • 累積投資額:$12,000.00
  • 最終評価額:$25,480.98
2015年~2024年の SPY 積み立て結果


こちらも累積投資額の2倍以上の評価額になっています。特に、新型コロナウイルスの影響で株価が急落した2020年3月の付近でも、評価額が減っているものの元本割れはしていないことがわかります。

バックテストでわかること

実際にバックテストをしてみて、どうでしょうか?長期的には定額積み立ては S&P 500 連動に関しては伸びている、始めるタイミング、終わるタイミングによっては損している、など、いろいろなことがわかります。

もしくは「まだこれだけではよくわからない」と感じるかもしれません。それでも大丈夫です。よくわかるまで期間を変えてテストすればいいのです。いろいろな期間で試すことで、「確率的にはこうなりそうだ」ということがわかるようになります。

こうしたテストを通じて、「ルールが過去にどのように機能したのか」を自分の手で確認しておくことは、のちのちメンタルを守る武器になります。

  • 損しているときに「これでいいのか」と思っても、
    →「過去にもこういう時期はあった。むしろ安く買えている」と冷静になれる。

  • ルールを守れずに売りたくなっても、
    →「守り続けた人のリターンを見たからこそ、もう少し続けてみよう」と思える。

これこそが、バックテストによるルールへの納得感です。知識として理解するだけではなく、実感として信じられる。それが「自分で決めたルールを守る」うえで、最も大切な土台になるのです

まとめ

投資において「自分で決めたルールを守ること」は、成功するための極めて重要な要素です。そしてそのためには「自分で決めたルールを理解すること」が大切でした。

ただし──
理解したつもりでも、実際にルールを守ることは想像以上に難しい。

それは、知識として理解しているだけでは、実際にそれを実践することは難しいからです。

では、どうすればよいのか?この記事ではバックテストを通じて、「自分のルール」が過去にどれくらい通用したのかを自分の目で確認するという方法を提案しました。この記事が、みなさんが投資において「自分のルールを守ること」に役立てば幸いです。

なお、今回はバックテストに関する基本的な部分に関して書きましたが、今後、バックテストに関する応用に関しても紹介していく予定です。

Share this post


Related Posts

Hiro Watt

Hiro Watt

IT Engineer/Individual Investor/Knowledge Sharer