新NISA何を買う?グラフ&集計してみよう!
1 はじめに
今回は、”新NISA何を買う?”ということで、長期投資に焦点を当てて購入したい銘柄をPYTHON を使って比較してみます。今巷で大人気なのはオルカン(全世界株式)です。オルカンをはじめ代表的な銘柄の実力の比較と一括購入したらどのぐらい儲かりそうかを統計的に分析できる技術を、わかりやすくお伝えできればと思います。
今回やること:①長期トレンドで比較してみよう!
②一括投資ではいくら儲かるか調べよう!!
対象:S &P500、NASDAQ100、全世界株(オルカン)、金(GOLD)
アウトプット:価格推移のチャート(ゴール1)
5年間保有した後の価格の分布(ゴール2)
ぜひお付き合い下さい。
今回のゴール1:長期トレンドでの比較
今回のゴール2:5年後のリータン(箱ヒゲ図)
参考)株価の予測については下記のような記事も書いてます。短期取引に興味があれば是非みてみて下さい。
おさらいその2)株価取得の方法について
2 豆知識
1)正規化とは
正規化は、異なるスケールや単位を持つデータを共通の基準に変換するデータ処理技術です。特に、株価の比較において、各株式が異なる価格帯で取引されることが一般的です。このため、直接比較することは公平ではありません。正規化を行うことで、株価のパフォーマンスを公平に比較することが可能になります。例えば、株価をその期間の最初の価格で割り、百分率の変化で表現することが一般的な方法です。これにより、株価がその期間にどの程度上昇または下落したかを、絶対値ではなく、相対的なパフォーマンスとして評価できます。正規化は、投資家が複数の株式や異なる市場のパフォーマンスを直接比較し、より情報に基づいた投資決定を下すのに役立つ重要な手法です。このプロセスを通じて、データの解釈が容易になり、より深い分析へと進むことができます。
2)箱ヒゲ図とは
箱ひげ図は、データの分布を視覚的に表現するためのシンプルで強力なツールです。このグラフは、最小値、最大値、中央値、第一四分位数(Q1)、第三四分位数(Q3)を一目で示し、データセットの範囲と中心傾向を把握するのに役立ちます。特に、金融データ分析において、箱ひげ図は株価の変動幅やリターンの分布を理解するのに非常に有効です。例えば、複数の株式のパフォーマンスを比較する際、それぞれの株式のリターン分布を箱ひげ図で描画することで、リスクとリターンの傾向が直感的にわかります。また、外れ値の検出にも有用で、通常の範囲から大きく外れたデータポイントを特定できます。これにより、異常な市場動向や特定の期間の異常値を発見しやすくなります。
3 実施内容
1)銘柄選別
今回、新NISAで非常に人気のある通称オルカン(全世界株式)と比較するのは、オルカンに次いで人気のS&P500(全米500社株式)です。次に、ハイテク株の代表であるNASDAQ100、安全資産の代表格:金(GOLD)です。オルカンは投資信託ですが、それぞれ同じ指数に連動するETFの値動きで比較します。それぞれ相当するETFのティッカーは下記です。
オルカン(全世界株式)・・・ACWI
S &P500(全米500社)・・・SPY
NASDAQ100(ハイテク)・・・QQQ
金(GOLD) ・・・GLD
2)長期トレンドで比較してみよう
まずはそれぞれの価格を取得して、4つとも並べた時系列グラフにしてみます。データの取得は前回と同じくYahoo Financeから、過去10年間の価格を取得します。
また投資信託は配当再投資されていることがNISAに相性が良い所以ですが、ETFの価格でも’Adj Close’が配当を考慮した価格のため、投資信託で投資した場合の値動きにあたります。
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 対象のティッカーシンボル
tickers = ['SPY', 'QQQ', 'ACWI', 'GLD']
# データの取得
data = yf.download(tickers, start="2014-01-01", end=pd.Timestamp.now().strftime('%Y-%m-%d'))
# 必要な列のみ抽出
data = data[['Close', 'Adj Close']]
# 月別にリサンプリングして、月の初めのデータを取得
monthly_data = data.resample('MS').first()
monthly_data
実際に取得したデータを確認すると2014年1月からのデータがそれぞれ取得できていることがわかります。
いよいよグラフにしますが、まずは加工せずグラフを書いてみます。
# グラフのサイズを設定
plt.figure(figsize=(14, 7))
# 各ティッカーのClose価格をプロット
for ticker in tickers:
plt.plot(data['Adj Close'][ticker], label=ticker)
# グラフのタイトルと軸ラベルを設定
plt.title('Close Prices of SPY QQQ, ACWI, GLD Over Time')
plt.xlabel('Date')
plt.ylabel('Close Price (USD)')
# 凡例を表示
plt.legend()
# グラフを表示
plt.show()
実際に出力後の画像が下のグラフです。出力されたグラフはスタートもバラバラでオルカン(AWCI)が金より全然儲からないグラフに見えてしまいます。
この不具合を解消するため、スタート(ここでは2014年1月)を100としてその後の価格推移を比較できるようにします。そのため、正規化(2014年1月のデータで全てのデータを割る)した値をグラフにすることで4種の価格推移を比較できるようになります。実際のコードは下記です。
# グラフのサイズを設定
plt.figure(figsize=(14, 7))
# 各ティッカーのClose価格を正規化してプロット
for ticker in tickers:
normalized_prices = data['Adj Close'][ticker] / data['Adj Close'][ticker].iloc[0] * 100
plt.plot(normalized_prices.index, normalized_prices, label=ticker)
# グラフのタイトルと軸ラベルを設定
plt.title('Normalized Close Prices of SPY, QQQ, ACWI, GLD Over Time')
plt.xlabel('Date')
plt.ylabel('Normalized Price (Base=100)')
# y軸を対数スケールに設定
#plt.yscale('log')
# 凡例を表示
plt.legend()
# グラフを表示
plt.show()
実際の価格がスタートが100でそれが何倍になったかどうか、それぞれの比較がし易くなっていると思います。
いかがでしょうか?コードさえ写してしまえば簡単に比較できるグラフが描けていると思って頂けるのではないでしょうか?
なお、今巷で大人気のオルカンですが、確実に右肩上がりで10年で2倍になっていますがは、S &P500は3倍やハイテクに特化したNASDAQ100には5倍になっていて、リータンとしては劣っていることがわかります。
3)一括投資ではいくら儲かるか調べよう!!
先ほどのチャートで2014年1月に買って放置しておけば、かなりの額が儲かったことはわかったと思います。しかしながら実際その間には、上がったり下がったりしています。結局どれぐらいのリターンが得られるかどうかは運次第と思うのではないでしょうか?
そこで、実際に1000ドル(約15万円分)買って5年後の価値を計算してみます。その時、買った時期を1ヶ月づつずらしていけば、5年後の価格の平均値やばらつきが統計的にわかるようになります。言葉ではよくわからないと思いますので、とりあえずやってみます。
まずは投資期間を5年✖️12ヶ月で60月数を設定します。また各ティッカーに対し、スタート月に購入した口数を5年後の価格で掛け算してあげることで、5年後の価値を計算します。それを1月づつずらしてやります。
# 投資期間を月で指定
investment_period_months = 60
# 投資開始日を計算
start_dates = monthly_data.index[:-investment_period_months]
# 投資結果を格納するためのDataFrameを初期化
results = pd.DataFrame(index=start_dates, columns=tickers)
# 各ティッカーに対して計算
for ticker in tickers:
for start_date in start_dates:
end_date = start_date + pd.DateOffset(months=investment_period_months)
initial_price = monthly_data['Adj Close'][ticker][start_date]
final_price = monthly_data['Adj Close'][ticker][end_date]
# 1000ドル投資時の株数
shares_bought = 1000 / initial_price
# 5年後の価値
value_after_5_years = shares_bought * final_price
results.loc[start_date, ticker] = value_after_5_years
# 結果を数値型に変換
results = results.astype(float)
results
実行すると2014年1月から2019年3月までの63列のデータが出力されました。これは2014年1月に1000ドル購入したものがどれぐらいの価値になったのかを示してます。ちなみに2019年3月が最後なのは執筆時点2024年3月のため、5年後の価格がないためわかる範囲の最後の月ということです。
これを先ほどのように線グラフにしても良いのですが、今回は箱ひげ図を書いてみます。箱ひげ図もmatplotlibで下記のようなコードで簡単にグラフが描けます。
# ボックスプロットのサイズを設定
plt.figure(figsize=(12, 8))
# ボックスプロットを描画
plt.boxplot([results[ticker].dropna() for ticker in tickers], labels=tickers)
# 購入時の価値(1000ドル)に対応する水平線を描画
plt.axhline(y=1000, color='r', linestyle='--', label='Initial Investment Value')
# グラフのタイトル、軸ラベル、凡例を設定
plt.title('5-Year Investment Outcomes for SPY, QQQ, ACWI, GLD')
plt.ylabel('Value after 5 Years')
plt.legend()
# グラフを表示
plt.show()
箱ひげ図だと5年間のリターンが視覚的に表せてます。まず四角い箱の中のオレンジの線が中央値です。これが大きいほど儲かったことを示してます。次に箱の中に入る確率は50%で、まあ半分ぐらいはこれぐら増えることを示していて、箱の外の十字との間に入る確率は、99.3%と言われてますので、過去の実績ではこれぐらいを可視化できていることになります。
注目するには、大人気のオルカンは金よりは儲かりますが、S&P500やNASDAQ100に比べてリータンとしては劣ります。ただし、ばらつき具合は、S &P500やNASDAQ100に比べて狭い(=リスクが小さい)ことがわかります。ちなみに安全資産の金は5年後に元本割れの1000ドルを下回ることもあって、巷のイメージとは異なり安全とはいえないこともわかると思います。
以上のように5年後の一括投資の結果を箱ひげ図でグラフで見てみると思った以上にわかることが多いのではないでしょうか?自分の興味のある株などの投資先が過去どのぐらいのリターンを示しているかもすぐわかりますので、皆さんもぜひやってみてください。
4 最後に
如何だったでしょうか?簡単に比較するグラフと統計的にまとめた箱ひげ図が描けたと思っていただけたのではないでしょうか?
このように実際の投資に参考になる情報を自分の手で整理してみることは、PYTHONプログラミング技術の向上だけでなく、金融リテラシー向上につながるのではと思います。
次回は、今回得られた統計的に得られたリスクとリターンのデータを使って未来を予測するシミュレーションをやってみます。
次回もお楽しみに!!
*今回のコードもGoogle Colabを使ってます。過去の記事は下記
この記事が気に入ったらサポートをしてみませんか?