AIとファイナンス

AIとファイナンスの架け橋、それがこのブログの目指すところです。兼業投資家向けに、Pythonを駆使して株やFXの分析を「自分で」行えるようになるための情報を提供します。ニューラルネットワークを活用した市場予測から、実証済みの金融理論まで、全てのコードを公開し、誰もが活用できるように!是非色々なコードで遊んでみてください!

【Python】積立投資の最適日はいつ?全世界株式(オルカン)とS&P500で検証する資産形成の秘訣【積立NISA】

こんにちは、みなさん!今日は、投資の世界でよく議論されるテーマの一つ、「毎月何日に積み立てるのが最も良いのか」という質問に焦点を当てたいと思います。私たちの日常生活において、定期的な積立投資は賢明な財産形成戦略として広く認識されています。しかし、具体的にどのタイミングで市場に参入するべきかは、なかなか難しい問題です。

このブログでは、Pythonとyfinanceライブラリを使って、実際にデータを分析し、この疑問に答えてみたいと思います。分析の対象とするのは、「S&P500」と「全世界株式(オルカン)」です。S&P500とオルカンのどっちが投資として優れているか過去の記事で分析してみましたが、特定の日付で積み立てた場合、どちらかの優位性が逆転したりするのでしょうか?過去10年分の日足データを用いて、毎月特定の日に$1000分の購入を行った場合のポートフォリオの最終的な価値を比較します。

さらに、この分析を通じて、積立日の選択が投資成績にどの程度影響を与えるのかを明らかにします。投資は未来を予測するものではありませんが、過去のデータから学び、より良い決定を下すための洞察を得ることができます。それでは、早速Pythonコードを見てみましょう!いつも通り最下部にコードへのリンクを貼っています!

Pythonコードとその解説

まずは、必要なライブラリをインストールし、インポートするところから始めます。

# ライブラリのインポート
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

このコードブロックでは、データ分析と視覚化に必要なyfinancepandasmatplotlibライブラリをインポートしています。

次に、S&P500(記号:SPY)と全世界株式(オルカン、記号を仮にACWIとします)の過去20年分の日足データをダウンロードします。

# S&P500と全世界株式(オルカン)のデータをダウンロード
sp500 = yf.download('SPY', start='2014-01-01', end='2024-01-01')
world_stocks = yf.download('ACWI', start='2014-01-01', end='2024-01-01')

私たちの分析を深めるために、今回は毎月の積立日を1日から31日まで変えながら、それぞれの最終ポートフォリオ価値を計算してみました。ここで重要なのは、特定の日が存在しない場合(例えば、2月29日以降や、30日、31日)、その月の最終営業日に積立を行うようにプログラムを調整した点です。

def simulate_investment_improved(data, start_year=2014, end_year=2024):

    results = {}
    for day in range(1, 32):
        investment = 1000  # 毎月の投資額
        shares_owned = 0  # 所有株数

        for year in range(start_year, end_year):
            for month in range(1, 13):
                # 月の開始日を設定
                start_date = pd.Timestamp(year=year, month=month, day=1)
                # 月の終了日を設定
                end_date = start_date + pd.offsets.MonthEnd(1)

                # 指定日を生成
                try:
                    if day > start_date.days_in_month:
                        target_date = end_date  # 月の最終日
                    else:
                        target_date = pd.Timestamp(year=year, month=month, day=day)
                except ValueError:
                    # 存在しない日(例:2月30日)の場合、月の最終日を使用
                    target_date = end_date

                # 価格データを取得し、株を購入
                try:
                    price_on_day = data.at[target_date.strftime('%Y-%m-%d'), 'Open']
                    shares_bought = investment / price_on_day
                    shares_owned += shares_bought
                except KeyError:
                    # 指定日が休市の場合はスキップするか、次の営業日にシフトするロジックを追加(省略)
                    continue

        final_value = shares_owned * data.iloc[-1]['Open']
        results[day] = final_value
   
    return results
# S&P500と全世界株式(オルカン)に対する改良版シミュレーションの実行
results_sp500_improved = simulate_investment_improved(sp500)
results_world_stocks_improved = simulate_investment_improved(world_stocks)


# 結果の視覚化
plt.figure(figsize=(15, 7))
plt.plot(list(results_sp500_improved.keys()), list(results_sp500_improved.values()), label='S&P500')
plt.plot(list(results_world_stocks_improved.keys()), list(results_world_stocks_improved.values()), label='All Country')
plt.title('Final Value of Portfolio')
plt.xlabel('Date')
plt.ylabel('Portfolio Value ($)')
plt.legend()
plt.grid(True)
plt.xticks(range(1, 32))
plt.show()

結果

この分析から得られる洞察として、直近10年で見れば25日積み立てた場合極端に、それこそ15%も最終的な利益に開きがあるのが見て取れます。逆に毎月6日から15日に積み立てるのが最も効率がいいということがわかりますね!

これは例えば日本では25日に給料日が集中し、みんなの積立日として集中しているからなんでしょうか。アメリカの場合1日と15日の月2回給料がある会社も多いらしく、やはり給料をもらって即積立、というのは得策ではなさそうです。

投資戦略を考える上で、このような分析は非常に価値があります。毎月の積立日を決める際に、ただ盲目的に日を選ぶのではなく、データに基づいた意思決定を行うことが、長期的な財産形成において重要な鍵となるわけですね!

 

colab.research.google.com