投資信託

投資信託で効率的フロンティアを計算してみる

データの読み込み

WEALTH ADVISERから手動で取得した週次のcsvデータを使用して、効率的フロンティアを計算してみます。

import os

import pandas as pd

データ保存先ディレクトリ = "C://Users//nanja-win-ms//Dropbox//PC//Downloads//"
投資信託一覧 = {
    "2018103105": "eMAXIS Slim全世界株式(オール・カントリー)",
    "2015042708": "ニッセイ TOPIXインデックスファンド",
    "2019092601": "SBI・V・S&P500インデックス・ファンド",
    "2018070301": "eMAXIS Slim米国株式(S&P500)",
    "2011020701": "三菱UFJ 純金ファンド",
}

投資信託リターン = {}

for 投資信託ID, 投資信託名 in 投資信託一覧.items():
    月次リターンファイル名 = [
        c
        for c in os.listdir(os.path.join(データ保存先ディレクトリ, 投資信託ID))
        if c.startswith("基準価額")
    ][0]
    投資信託リターン[投資信託ID] = pd.read_csv(
        os.path.join(データ保存先ディレクトリ, 投資信託ID, 月次リターンファイル名), encoding="cp932"
    )
    投資信託リターン[投資信託ID].columns = ["日付", 投資信託名]

データの整形

x=日付、y=銘柄名のデータを作成します。投資信託でなく株式でも可能です。

ポートフォリオ = None

for 投資信託ID in 投資信託一覧.keys():
    if ポートフォリオ is None:
        ポートフォリオ = 投資信託リターン[投資信託ID]
    else:
        ポートフォリオ = pd.merge(ポートフォリオ, 投資信託リターン[投資信託ID], on="日付")


ポートフォリオ.index = pd.to_datetime(ポートフォリオ["日付"], format="%Y%m%d")
ポートフォリオ.drop("日付", axis=1, inplace=True)

ポートフォリオ

eMAXIS Slim全世界株式(オール・カントリー)ニッセイ TOPIXインデックスファンドSBI・V・S&P500インデックス・ファンドeMAXIS Slim米国株式(S&P500)三菱UFJ 純金ファンド
日付
2020-01-101182811720112031218513827
2020-01-171203611723114291242814063
2020-01-241193211689113811237814008
2020-01-311166711379111891216814085
2020-02-071198711703114901249614242
..................
2023-12-292089917484222292428123054
2024-01-052097217684222852434223270
2024-01-122128318428227632487123226
2024-01-192153618543232192536923562
2024-01-262191618450236992588823437

212 rows × 5 columns

可視化

import japanize_matplotlib
import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(12, 6))
sns.lineplot(data=ポートフォリオ)
<Axes: xlabel='日付'>

png

from pypfopt import expected_returns, risk_models
from pypfopt.efficient_frontier import EfficientFrontier

mu = expected_returns.mean_historical_return(ポートフォリオ)
S = risk_models.sample_cov(ポートフォリオ)
ef = EfficientFrontier(mu, S)
weights = ef.max_sharpe()
ef.portfolio_performance(verbose=True)
Expected annual return: 115.5%
Annual volatility: 34.2%
Sharpe Ratio: 3.32





(1.1546507705298557, 0.34188826020611157, 3.318776637272708)
from pypfopt import CLA, plotting

cla = CLA(mu, S)
cla.max_sharpe()
cla.portfolio_performance(verbose=True)

plt.figure(figsize=(10, 5))
plotting.plot_efficient_frontier(cla, show_assets=True, points=50, show_tickers=True)
Expected annual return: 115.1%
Annual volatility: 34.1%
Sharpe Ratio: 3.32





<Axes: xlabel='Volatility', ylabel='Return'>

png

値動きの相関

値動きの変化で相関を計算してみます。

sns.heatmap(ポートフォリオ.diff().dropna().corr(), annot=True, fmt="1.4f")
<Axes: >

png

コメント欄

※コメントは承認後に表示されます。個人情報は入力しないようにお願いします。