見出し画像

投資信託の価格を取得・分析

サブテーマ:eMAXIS Slim S&P500、オルカン、8資産均等を分析する


1 初めに

 今回は、これまでの分析はETFの価格で過去の実績を比較してきましたが、実際に新NISAで購入するときは投資信託を買われる方が多いと思います(実際に私がそうです)。
そこで、ETFでなくて投資信託の実際の値動きで評価したいという方向けに、投資信託の価格を取得して比較してみます。
自分が欲しい投資信託を評価してみたいと思われた方にぜひ読んでみてもらいたいです。

今回の結論:
・投資信託のデータの取得
 投信信託協会の投信総合検査ライブラリーがおすすめ
・お試し比較
 eMaxis Slim のSP500、オルカン、8資産均等を比較
 過去の実績はSP500 100%がベストポートフォリオ


知人よりプログラム部分が難しくてよくわからないとご指摘をいただきました。そのためこのチャンネルでは、PYTHONを使った米国株投資に関わるさまざまな調査の結果OUTPUTにこだわった記事にします。投資に関わる身近な疑問にも答えていきますので、投資リテラシー向上にお役立ちを目指します!!
 なお、全ての解析データは引き続き、PYTHONを活用してコード全文も掲載します。Googleコラボならまずは”コピペ”でチャレンジできます。これから勉強始めたい方にも、プログラミングで何ができるのかを知る良いチャンスとなればと思っていますので応援お願いします!!


2 豆知識

1)投資信託協会から価格、配当金額のCSVデータの取得方法

投資信託の価格は証券会社のページから過去の価格および配当の実績は取得できますが、PYTHON等で加工しようとするとテーブルデータで取得したいものです。この投資信託協会には証券会社によらず日本で販売されている投資信託がすべて検索できるようになっており、またCSVデータの取得が可能です。

トップページからファンド検索へ

Top画面から投信総合検索ライブラリーへ
キーワードもしくはNISA対象商品から

CSVファイルのダウンロードページ

取得したい投資信託ページ →右下のデータダウンロードのボタンをクリック

2)eMaxisSlimシリーズについて

私が紹介するまでもないのですが、三菱UFJアセットマネジメント社が販売する投資信託で、その中でもSlimシリーズは”業界最低水準の運用コストを将来にわたってめざし続けます”と宣言済の安心して購入をお勧めできるシリーズです。

3 実践

1)調査内容

 今回は、積み立てNISA対象の中から3種選択し、比較してみます。
 eMAXIS Slim米国株式(S&P500)
 eMAXIS Slim全世界株式(オール・カントリー)
 eMAXIS Slimバランス(8資産均等型)
今回最適ポートフォリオを計算してみる上で参考になりそうな8資産均等型も比較しています。あらかじめダウンロードしておいた投資信託のCSVデータを1つのcsvファイルにまとめておき、そのCSVをPYTHONで解析させました。これらは2017~2018年にかけて発売されていますが、比較のため、一番発売が遅いオルカン(2018.10.31~)に合わせて、データを整理しました。
その後、年間リターン、リスク、シャープレシオ、最大ドローダウンを計算し、シャープレシオが最大となる最適なポートフォリオを計算させています。

2)調査結果

今回のPYTHONコード自体はこれまでと同じです。グラフの可視化、対数グラフの表示でトレンドグラフを確認し、その次に、最適化ポートフォリオ分析する一連のコードとなっています。興味がありましたらGoogleColabでトライしてみてください。

pip install japanize-matplotlib
!pip install PyPortfolioOpt

from google.colab import drive
drive.mount('/content/drive')

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import japanize_matplotlib
from pypfopt import expected_returns, risk_models, EfficientFrontier, plotting

file_path = '/content/drive/MyDrive/emax.csv' # ここにGoogle Drive内のファイルパスを記入
# エンコーディングを指定してCSVファイルを読み込む
data = pd.read_csv(file_path, encoding='Shift_JIS')

# 「年月日」列を日付形式に変換
data['年月日'] = pd.to_datetime(data['年月日'], format='%Y年%m月%d日')

# 「年月日」列をインデックスに設定
data.set_index('年月日', inplace=True)

tickers = ['8', 'sp500', 'AllC']

# 1. Time series line graph
plt.figure(figsize=(12, 5))
for ticker in monthly_data.columns:
    plt.plot(monthly_data[ticker], label=ticker)
plt.title('月次調整後終値の時間推移')
plt.xlabel('日付')
plt.ylabel('調整後終値')
plt.legend()

# Normalize data
normalized_data = monthly_data.apply(lambda x: x / x.iloc[0] * 100)

# 2. Time series graph of normalized data
plt.figure(figsize=(12, 5))
for ticker in normalized_data.columns:
    plt.plot(normalized_data[ticker], label=ticker)
plt.axhline(y=100, color='red', linestyle='--', linewidth=1)
plt.title('正規化された月次調整後終値の時間推移')
plt.xlabel('日付')
plt.ylabel('正規化価格 (基準=100)')
plt.legend()

# 3. Log-scale graph of normalized data
plt.figure(figsize=(12, 5))
for ticker in normalized_data.columns:
    plt.plot(normalized_data[ticker], label=ticker)
plt.axhline(y=100, color='red', linestyle='--', linewidth=1)
plt.title('対数スケールにおける正規化された月次調整後終値の時間推移')
plt.xlabel('日付')
plt.ylabel('対数正規化価格 (基準=100)')
plt.legend()
plt.yscale('log')

plt.show()

# 日次リターンの計算
daily_returns = data.pct_change()

# SPYに対する相関係数を計算
correlations = daily_returns.corr().loc['sp500']

# 月次リターンの計算
monthly_data = data.resample('M').last()
monthly_returns = monthly_data.pct_change().dropna()

# 年化された期待リターンとリスク(共分散行列)の計算
mean_returns = expected_returns.mean_historical_return(monthly_data, frequency=12)
cov_matrix = risk_models.sample_cov(monthly_data, frequency=12)

# 各ティッカーのリスク(標準偏差)とリターンの計算
individual_risks = np.sqrt(np.diag(cov_matrix))
individual_returns = mean_returns.values

# 最適化:シャープレシオを最大化
ef = EfficientFrontier(mean_returns, cov_matrix)
weights = ef.max_sharpe()
cleaned_weights = ef.clean_weights()

# 最適化されたポートフォリオのパフォーマンス計算
expected_return, volatility, sharpe_ratio = ef.portfolio_performance(verbose=True)

# 効率的フロンティアの点を生成
ef_new = EfficientFrontier(mean_returns, cov_matrix)
fig, ax = plt.subplots(1, 3, figsize=(18, 6))

# 散布図と効率的フロンティア
ax[0].scatter(volatility, expected_return, color='red', s=100, label='最適化されたポートフォリオ')
ax[0].scatter(individual_risks, individual_returns, color='blue', s=50)  # 各ティッカー
for i, txt in enumerate(mean_returns.index):
    ax[0].annotate(txt, (individual_risks[i], individual_returns[i]))
plotting.plot_efficient_frontier(ef_new, ax=ax[0], show_assets=True)

ax[0].set_title('ポートフォリオおよび各ティッカーのリスクとリターン')
ax[0].set_xlabel('標準偏差(リスク)')
ax[0].set_ylabel('期待リターン')
ax[0].grid(True)
ax[0].legend()

# ウェイトの棒グラフ
ax[1].bar(cleaned_weights.keys(), cleaned_weights.values(), color='green')
ax[1].set_title('ポートフォリオの最適化されたウェイト')
ax[1].set_xlabel('資産')
ax[1].set_ylabel('ウェイト')
ax[1].grid(True)

# SPYとの相関係数の棒グラフ
correlation_values = correlations.drop('sp500')
ax[2].bar(correlation_values.index, correlation_values.values, color='purple')
ax[2].set_title('S&P500との相関係数')
ax[2].set_xlabel('資産')
ax[2].set_ylabel('相関係数')
ax[2].grid(True)

plt.tight_layout()
plt.show()

# 最大ドローダウンの計算
def calculate_max_drawdown(returns):
    cumulative = (1 + returns).cumprod()
    drawdown = (cumulative / cumulative.cummax()) - 1
    return drawdown.min()

# ポートフォリオのパフォーマンス指標の表示
portfolio_performance = pd.DataFrame({
    'ティッカー': tickers,
    '年率リターン': [mean_returns.loc[ticker] for ticker in tickers],
    '年率リスク': [cov_matrix.loc[ticker, ticker] ** 0.5 for ticker in tickers],
    'シャープレシオ': [mean_returns.loc[ticker] / (cov_matrix.loc[ticker, ticker] ** 0.5) for ticker in tickers],
    '最大ドローダウン': [calculate_max_drawdown(daily_returns[ticker]) for ticker in tickers]
})

# ポートフォリオの累積リターンを計算
portfolio_cumulative_return = (1 + daily_returns.dot(pd.Series(cleaned_weights))).cumprod()
portfolio_drawdown = (portfolio_cumulative_return / portfolio_cumulative_return.cummax()) - 1
max_drawdown = portfolio_drawdown.min()

# 最適化されたポートフォリオのパフォーマンス指標の追加
optimized_performance = pd.DataFrame({
    'ティッカー': ['最適化されたポートフォリオ'],
    '年率リターン': [expected_return],
    '年率リスク': [volatility],
    'シャープレシオ': [sharpe_ratio],
    '最大ドローダウン': [max_drawdown]
})

# 結果を結合
portfolio_performance = pd.concat([portfolio_performance, optimized_performance], ignore_index=True)
portfolio_performance.set_index('ティッカー', inplace=True)

# 小数点以下3桁に丸める
portfolio_performance = portfolio_performance.round(3)

print(portfolio_performance)

実行結果は下記の通りです。
S&P500が2018年10月10000円だった基準価格は直近30000円と3倍になっており、以下オルカン、8資産均等型と続きます。

投資信託3つの基準価格推移

続けて、リターン、リスクから効率化フロンティア曲線をひくと、SP500と8資産均等は同じ効率化フロンティア曲線上にあり、リスク許容度によりどちらかもしくはその配分を選択するのが良いとあらわされています。
ただし、シャープレシオ上最大となるのはSP500となり、SP500のみ100%保有することが最も効率的であると示されています。一番人気のオルカンはSP500,8資産均等に比べてやや効率が劣る結果です。
 その右のグラフはSP500との相関を示していますが、オルカンはSP500とほぼ同じ相関にたいし、8資産均等型は0.8程度であり、やや相関が低くなっていることがわかります。(ただし、債券のみ、金のみに比べればかなり相関が高いです。)

最適化ポートフォリオ計算コード実行結果

3)まとめ

今回の結論:
・投資信託のデータの取得
 投信信託協会の投信総合検査ライブラリーがおすすめ
・お試し比較
 eMaxis Slim のSP500、オルカン、8資産均等を比較
 過去の実績はSP500 100%がベストポートフォリオ

4 最後に

 今回は投資信託の実際の価格を取得する方法から、大人気のオルカンVS SP500の論争に過去実績からの比較を実施してみました。このサイトからは配当実績もダウンロードすることができ、興味のある投信があればぜひ自分なりのデータ解析に挑戦してみてください。
今後も投資リテラシー向上兼プログラム活用に役立つ情報を発信していきますので応援のほどよろしくお願いします!

*今回の結果は過去の結果を解析したものであり、今後の将来を保証するものではありません。実際の投資にあたってはご自身の判断でお願いいたします。

記事の感想、要望があれば下記X(旧Twitterまで)
*今後の記事に活用させていただきます!!



以下、過去記事、AI時系列予測等のご紹介
他サイトですがココならで、A I(LSTM)を使った株価予測の販売もやってます。こちらではFREDから、失業率や2年10年金利、銅価格等結果も取得しLSTMモデルで予測するコードとなってますので興味があれば見てみてください。またその他2件も米国株投資とは直接関係はありませんがプログラム入門におすすめですのでみてみてください。



チャンネル紹介:Kota@Python&米国株投資チャンネル

過去の掲載記事:興味があればぜひ読んでください。
グラフ化集計の基礎:S &P500と金や米国債を比較してます。

移動平均を使った時系列予測




この記事が気に入ったらサポートをしてみませんか?