AIとファイナンス

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

【米国ETF】2024/3/27 保有残高【NISA】

今週の運用状況も公開していこうと思います。現在Side Fireを目指して活動中です。


週間サマリー: 今週の大きな動きとして約$3000分米国ETFを買い増しています。買い増しに際しては自家製のリバランスプログラムを使いました。もちろん無料でコードを公開していますので皆さんも使ってくださいね!また毎月の最適な積立日があるのってご存知でした?ぜひこちらの記事もご覧ください。今回は1100万円を超えることができました!とは言え為替の影響も大きいのでそろそろ一部利確して円転も視野にいた方がいいのかもしれませんね、、、

取引履歴: 今週の取引は以下の通りです。

 米国ETF

AGG 1株
GLD 1株
IYR 2株
VEA 21株
VOO 1株
VTI 2株
VWO 12株
合計$3,002.16

2024/3/27 取引残高

米国ETF $,163.52 (¥9,026,250 @151.72)

投資信託 ¥2,175,066

現金 ¥0

2024/3/27 米国ETF

2024/3/27 投資信託

2024/3/27 資産推移

 

 

 

【米国ETF】2024/3/20 保有残高【NISA】

今週の運用状況も公開していこうと思います。現在Side Fireを目指して活動中です。


週間サマリー: 今週の大きな動きとして約$2150分米国ETFを買い増しています。買い増しに際しては自家製のリバランスプログラムを使いました。もちろん無料でコードを公開していますので皆さんも使ってくださいね!また毎月の最適な積立日があるのってご存知でした?ぜひこちらの記事もご覧ください。今回コンスタントに1000万円は超えてきて、次は1100万円が目標になります!引き続き応援いただけますと幸いです。

取引履歴: 今週の取引は以下の通りです。

 米国ETF

AGG 3株
IYR 2株
VEA 14株
VOO 1株
VTI 1株
VWO 6株
合計$2,158.89

2024/3/20 取引残高

米国ETF $56,163.52 (¥8,505,684 @151.45)

投資信託 ¥2,146,516

現金 ¥0

2024/3/20 米国ETF

2024/3/20 投資信託

2024/3/20 資産推移

【分析】日米の実質金利差とドル円相場の関係【Python】

こんにちは!今日は、「日米の実質金利差とドル円相場」の関係についてみていきましょう!前回の記事では名目金利差で比較をしましたが実質金利することでどう変わるのでしょうか?

特にゼロ金利政策が解除となった今、投資家の皆さんにとっては非常に気になる内容ですよね!早速コードを見てみましょう。

また最下部にもコードへのリンクを貼っていますのでご自由にお使いください。

ライブラリのインポート

まずはデータを手に入れることから始めます。今回は過去20年間の日本とアメリカの金利データ、そしてドル円相場のデータが必要になります。これらのデータを入手するために、yfinanceというおなじみのライブラリを使用します。また今回は回帰直線を引くためにsklearn.linear_modelから最小二乗法とリッジ回帰、ラッソ回帰をインポートしました。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.dates as mdates
from sklearn.linear_model import LinearRegression, Ridge, Lasso

データの前処理

次のコードブロックでは、yfinanceを使って、日本とアメリカの金利データ、そしてドル円の為替レートデータをダウンロードしています。そして、これらのデータを一つのDataFrameに結合し、日米の実質金利差も計算しています。DataFrameには、日付、日本の金利アメリカの金利金利差、ドル円為替レートが含まれています。

# アメリカの金利データのシンボル
interest_rate_us = "^TNX" # 米国10年債金利

# ドル円為替レートのシンボル
usdjpy = "JPY=X"

# 過去20年分のデータを取得
data_us = yf.download(interest_rate_us, start="2004-03-01", end="2024-03-01")
data_jp = pd.read_csv('/content/10yr bond yield_jp.csv')
usdjpy_data = yf.download(usdjpy, start="2004-03-01", end="2024-03-01")

# 'Date'列の日付形式を変更してDateTimeオブジェクトに変換
data_jp['Date'] = pd.to_datetime(data_jp['Date'], format='%m/%d/%y')

# 変換した'Date'列をDataFrameのインデックスに設定
data_jp.set_index('Date', inplace=True)

# 終値を取得
data_us = data_us["Close"].rename("Rate US")
data_jp = data_jp[" Close"].rename("Rate JP")

# USD/JPYの終値を取得
usdjpy_data = usdjpy_data["Close"].rename("USD/JPY")

# DataFrameの作成
df = pd.concat([data_jp, data_us, usdjpy_data], axis=1)
df["Rate Difference"] = df["Rate US"] - df["Rate JP"]

# NaNを含む行を削除
df = df.dropna()

散布図と近似直線の視覚化

このコードブロックでは、Rate DifferenceUSD/JPYの関係を散布図で表示し、最小二乗法、Ridge、およびLassoを使用してデータに近似直線をフィットさせています。各近似直線の方程式もプロットに表示されます。

これらのステップによって、実質金利差とUSD/JPYの相関関係を視覚化し、さらに統計的手法を用いてその関係を数値化することができます。

X = df['Rate Difference'].values.reshape(-1, 1)
y = df['USD/JPY'].values

models = {
    'Linear Regression': LinearRegression(),
    'Ridge': Ridge(alpha=1.0),
    'Lasso': Lasso(alpha=0.1)
}

plt.figure(figsize=(14, 7))
for name, model in models.items():
    model.fit(X, y)
    y_pred = model.predict(X)
    plt.plot(X, y_pred, label=f'{name}: y={model.coef_[0]:.4f}x + {model.intercept_:.4f}')
   
plt.scatter(X, y, color='lightgray', label='Actual Data')
plt.xlabel('Rate Difference')
plt.ylabel('USD/JPY')
plt.title('Last 20 years: Rate Difference vs. USD/JPY with Approximation Lines')
plt.legend()
plt.show()

いかにそれぞれ5年、10年、20年の過去データを使って描画したものを並べました。

結果 過去5年

結果 過去10年

結果 過去20年

こうしてみると最近5年のものがかなりわかりやすいですよね。大体金利差が1%縮まると14円円高方向に振れて金利差がゼロのときは約90円が適正価格、ということですね。

もちろん為替相場金利差がすべてではありませんが、間違いなくみんなが気にしている部分であることは間違いないのでこのような情報を使ってしっかり予測していきたいですね。

注:今回も日本の10年債の金利はyfinanceの対象になかったのWall Street Journalより自前でダウンロードしております。

colab.research.google.com

参考サイト

TMBMKJP-10Y | Japan 10 Year Government Bond Historical Prices - WSJ

【分析】日米の名目金利差とドル円相場の関係【Python】

こんにちは!今日は、「日米の名目金利差とドル円相場」の関係についてみていきましょう!

金利差とドル円相場の関係って?
まず、名目金利差とは何か、そしてそれがドル円相場にどう関わってくるのかを簡単に説明しましょう。名目金利差とは、文字通り、異なる国の名目金利の差のことを指します。この金利差が外国為替レート、特にここではドル円相場にどのように影響を与えるのかを探るのが今回のテーマです。

理論的には、金利が高い国の通貨は、金利が低い国の通貨に対して高く評価される傾向があります。これは「キャリートレード」という投資戦略にも利用されています。しかし、実際のところ、これが常に当てはまるわけではなく、多くの要因が相場に影響を与えます。そこで、過去20年のデータを使って、この関係を実際に確認してみましょう。

いつも通りコードへのリンクは下段にありますのでそちらからご覧ください。

データのダウンロード
まずはデータの取得から。日本とアメリカの金利データおよびドル円相場のデータを20年分集める必要があります。ここでは、yfinanceライブラリを使ってドル円のデータをダウンロードし、金利データについては公的なデータソースから取得します。

try:
    # カンマを区切り文字として指定
    df_jp = pd.read_csv('/content/Data_jp.csv', encoding='cp932', sep=',')
except UnicodeDecodeError:
    df_jp = pd.read_csv('/content/Data_jp.csv', encoding='shift_jis', sep=',')

# Excelファイルを読み込む
df_us = pd.read_excel('/content/Data_us.xlsx')
try:
    # カンマを区切り文字として指定
    df_jp = pd.read_csv('/content/Data_jp.csv', encoding='cp932', sep=',')
except UnicodeDecodeError:
    df_jp = pd.read_csv('/content/Data_jp.csv', encoding='shift_jis', sep=',')

# Excelファイルを読み込む
df_us = pd.read_excel('/content/Data_us.xlsx')
# 日付の形式を統一する(format指定を省略)
df_jp['Date'] = pd.to_datetime(df_jp['Date'])
df_us['Effective Date'] = pd.to_datetime(df_us['Effective Date'])

# データフレームの統合
df_merged = pd.merge(df_jp, df_us, left_on="Date", right_on="Effective Date", how="outer")
# 「Effective Rate」と「Rate (%)」の列だけを保持し、NaNが含まれる行を削除
df_filtered = df_merged[['Date', 'Effective Rate', 'Rate (%)']].copy()
df_filtered.dropna(inplace=True)

# 金利差の計算
df_filtered['Rate Difference'] = df_filtered['Effective Rate'] - df_filtered['Rate (%)']
# ドル円為替レートデータのダウンロード
usdjpy = yf.download("JPY=X", start="2004-03-01", end="2024-03-01")

# 終値のみ表示
usdjpy_close = usdjpy['Close']

# マージ(統合)する
# 既存のdf_mergedデータフレームとdf_usdjpyデータフレームをDate列でマージ
df_final = pd.merge(df_filtered, usdjpy_close, on='Date', how='left')
df_final.dropna(inplace=True)
df_final = df_final.rename(columns={
    'Effective Rate': 'Rate JP',
    'Rate (%)': 'Rate US'
})

今回はここまででかなり長いコードになってしまっています。これは今回yfinaceだけでなく、そのほかの公的機関からデータを取得し、形が全く違うからなんですね。実はデータ分析の世界ではこのクリーニング作業に一番時間がかかったりします。

データの視覚化

データを手に入れたら、次はそれを視覚化することによって、より深く理解を深めます。まずはドル円終値と日米の金利をそれぞれ時間の経過と共にプロットし、変化を観察します。

# データフレームの準備
df_final['Date'] = pd.to_datetime(df_final['Date'])

fig, ax1 = plt.subplots(figsize=(14, 7))

# Rate JP, Rate US, Rate Differenceを左の縦軸にプロット
ax1.plot(df_final['Date'], df_final['Rate JP'], label='Rate JP', color='blue')
ax1.plot(df_final['Date'], df_final['Rate US'], label='Rate US', color='red')
ax1.plot(df_final['Date'], df_final['Rate Difference'], label='Rate Difference', color='orange')

# Rate Differenceがゼロのラインを緑の濃い線で強調
ax1.axhline(0, color='darkgreen', linewidth=2)

# 右の縦軸を設定してCloseをプロット
ax2 = ax1.twinx()
ax2.plot(df_final['Date'], df_final['Close'], label='Close', color='purple')

# レジェンドとラベル
ax1.legend(loc='upper left')
ax2.legend(loc='upper right')
ax1.set_xlabel('Date')
ax1.set_ylabel('Rate')
ax2.set_ylabel('Close')

# 日付フォーマット
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))

plt.show()

結果

こうしてみると日銀とFRB金利差がゼロに近かった2009年ごろから2016年ごろまで、ドル円相場は70円台から130円手前までかなりダイナミックに動いたことがわかりますね!

金利差とドル円相場の関係

次に、金利差とドル円相場の終値との関係を散布図で見てみましょう。この散布図から、金利差がドル円相場に与える影響の傾向を探ります。さらに、この関係を数学的に理解するために、リッジ回帰を使ってみます。リッジ回帰は、回帰分析の一種であり、過学習を防ぐために正則化項を導入したものです。

結果

リッジ回帰の結果の式で行くと名目金利差がゼロのときはx=0となるので切片の99.43円がドル円の正規レートということになります。ちなみに過去10年でやると、108.77円に値が変わってきます。

結果(過去検証期間10年)

過去五年でやると概ね同じような値で、名目金利差がゼロであれば$1=108.97円という結果になりました。なので過去のデータだけで行けば、マイナス金利が解除され、FRBが遅かれ早かれ利下げに動く場合108円方向に向かいそう、ということは言えそうですよね。さて、今回は名目金利差でやってみたので次回は10年債の利回りでやってみようかなと思います。

 

 

今回のコードは以下からアクセスしてください。

また今回は各中央銀行からのデータのダウンロードが必要となるのでご注意ください。

colab.research.google.com

 

 

参考サイト

無担保コールレート(オーバーナイト物)とは何ですか? 資金過不足とは何ですか? : 日本銀行 Bank of Japan (boj.or.jp)

日本銀行時系列統計データ検索サイト (boj.or.jp)

Federal Reserve Board - Home

【分析】米国の各セクターの相関関係【米国株】

こんにちは!前回の記事では米国で上場している会社のセクターには11種類あってそれぞれ対応するETFが2社ある、というお話をしました!今回はPythonを使ってセクターそれぞれの相関関係を調べてみましょう。相関関係を追うと例えばあるセクターの平均株価が下がったときに別のセクターが上がったりすることがあるのか?など市場の理解を深める手助けになります。早速コードを見ていきますがいつも通り最下部にコードへのリンクを貼っていますので皆さま是非試してください。

yfinanceを使ってセクターごとのデータをダウンロード

では、Pythonyfinanceライブラリを使用して、セクターごとの過去5年間のデータをダウンロードする方法について説明します。yfinanceは、Yahoo Financeから金融データを簡単に取得できる非常に便利なツールです。

import yfinance as yf
import pandas as pd

etfs = {
    "Information Technology": "XLK",
    "Financials": "XLF",
    "Communication Services": "XLC",
    "Health Care": "XLV",
    "Consumer Discretionary": "XLY",
    "Consumer Staples": "XLP",
    "Industrial": "XLI",  
    "Real Estate": "XLRE",  
    "Energy": "XLE",
    "Utilities": "XLU",
    "Materials": "XLB"
}

# 各ETFの過去5年間のデータをダウンロードして辞書に格納
data = {}
for name, symbol in etfs.items():
    data[name] = yf.download(symbol, start="2014-01-01", end="2024-01-01")

ボラティリティの計算と視覚化
ボラティリティを計算するために、各セクターの日次リターンの標準偏差を求め、年率換算します(株式市場が年間約252日営業していると仮定)。

import numpy as np
import matplotlib.pyplot as plt

# 各セクターのボラティリティを計算
volatility = {name: np.log(df['Close'] / df['Close'].shift(1)).std() * np.sqrt(252) for name, df in data.items()}

# ボラティリティのバープロット
plt.figure(figsize=(10, 6))
plt.bar(volatility.keys(), volatility.values())
plt.ylabel('Volatility')
plt.title('Volatility of the sectors')
plt.xticks(rotation=45)
plt.show()

各セクターボラティリティ

このようにみるとエネルギーセクターはアップダウンが激しく、逆に一番安定しているのは一般消費財セクターということがわかります。エネルギーセクターは原油などの原材料の価格変動リスクにもろにさらされることもあって値動きが激しいのでしょうか?

取引量の視覚化
また今回は取引量の可視化も以下のコードを使って行いました。

# 各セクターの取引量の平均を計算
volume_avg = {name: df['Volume'].mean() for name, df in data.items()}

# 取引量の平均のバープロット
plt.figure(figsize=(10, 6))
plt.bar(volume_avg.keys(), volume_avg.values(), color='orange')
plt.ylabel('Average volume of Trades')
plt.title('Trading volume of the sectors')
plt.xticks(rotation=45)
plt.show()

各セクターの取引量

相関関係の計算

相関関係のヒートマップを作成するためには、まず各セクターの日次リターンを計算し、それらの間の相関係数を計算します。そして、seabornライブラリを使用して、相関係数のヒートマップを描画します。相関係数は-1から1までの値を取り、1は完全な正の相関、-1は完全な負の相関を意味します。

import seaborn as sns

# 各セクターの日次リターンを計算
returns = pd.DataFrame()
for name, df in data.items():
    returns[name] = df['Close'].pct_change()

# 日次リターンの相関係数を計算
corr = returns.corr()

# 相関係数のヒートマップを描画
plt.figure(figsize=(10, 8))
sns.heatmap(corr, annot=True, cmap='coolwarm', center=0)
plt.title('Sector Correlation Heatmap')
plt.show()

各セクターの日次リターンの相関関係

基本的には全て株式、同じ資産クラスなので上がるときは一緒、落ちる時も一緒ということがなんとなく見えてきます。引き続き価格の相関関係を出すコードを見てましょう。

# 各セクターの終値を格納するDataFrameを初期化
prices = pd.DataFrame()

# 各セクターETF終値データをDataFrameに追加
for name, df in data.items():
    prices[name] = df['Close']

# 終値相関係数を計算
price_corr = prices.corr()

# 相関係数のヒートマップを描画
plt.figure(figsize=(10, 8))
sns.heatmap(price_corr, annot=True, cmap='coolwarm', center=0)
plt.title('Price Correlation Heatmap')
plt.show()

各セクターのETF価格の相関関係

これは面白いことにエネルギーセクターがそのほかのものと比べて負の相関があることがわかります。先ほどの一般消費財と一番負の大きな相関を見せていますね。そのままの意味で行くとエネルギーセクターのETF価格が落ちる時は一般消費財の価格が上がり、その逆もまた然り、ということですね。(今回は配当金をリターンに入れれていないのでそこまで含めるとまた結果は変動するものと思われます。)

いずれにせよ、価格の相関関係を分析することにより、特定のセクターが市場の他の部分とどのように相互作用しているかを把握することができました。。高い相関関係が見られるセクターは、市場の特定のトレンドやイベントに対して類似した反応を示す可能性があることがわかりますね。このような分析は、ポートフォリオの多様化戦略を考える上で非常に重要であり、市場の様々な変動に対するリスクを管理するのに役立ちます。

今回もここまで読んでいただきありがとうございました。

colab.research.google.com

 

 

 

【分析】米国で上場している会社のセクターと対応するETF【米国株】

こんにちは!今日は、なぜセクター(業界)ごとの分析が投資の世界において非常に重要なのかについて話したいと思います。セクターごとに分析することで、市場の異なる部分がどのように動いているか、また、特定の経済状況やニュースがセクターにどのように影響を与えるかを理解できます。これにより、リスクを分散し、投資戦略をより緻密に練ることが可能になります。さらに、セクターのパフォーマンスを追跡することで、市場全体の健全性と成長の見通しを把握することができます。

米国株に上場している会社の主なセクターと対応するETF

さて、実際に米国株に上場している会社のセクターについてみてみましょう!米国の株式市場は、世界最大の市場の一つであり、その多様性は投資家にとって非常に魅力的です。またそれぞれのセクターに対応するETFがあるところも魅力ですよね!

テクノロジー

このセクターは、ソフトウェア、ハードウェア、情報技術サービスなどを提供する企業が含まれます。
対応するETF: テクノロジーセレクトセクターSPDRファンド(XLK)

 


ヘルスケア

ヘルスケアセクターには、医薬品、バイオテクノロジー、医療器具の製造企業や、医療サービス提供者が含まれます。
対応するETF: ヘルスケアセレクトセクターSPDRファンド(XLV)

 


金融

銀行、保険会社、不動産企業、投資信託がこのセクターに分類されます。
対応するETF: 金融セレクトセクターSPDRファンド(XLF)

 


エネルギー

石油・ガスの探査・生産会社、エネルギー関連サービス会社が含まれます。
対応するETF: エネルギーセレクトセクターSPDRファンド(XLE)

 


消費財(生活必需品と一般消費財

このセクターは、耐久消費財非耐久消費財を扱う企業が含まれ、日用品から高級品まで様々です。
対応するETF: 消費者必需品SPDRファンド(XLP)と一般消費財セクターSPDRファンド(XLY)

 

 

 

通信サービス

通信サービスセクターには、電話会社やインターネットサービス提供者が含まれます。
対応するETF: 通信サービスセレクトセクターSPDRファンド(XLC)

 

このほかにも資本財不動産公益事業素材の計11セクターがあります。

この11セクターには対応する代表的なセクターETF(上場投信)が2つあります。

ティッカーがXで始まるETFStatestreet社のSPDRシリーズ、Vで始まるものはがVanguard社のもので以下にまとめてみました。

情報技術 Information Technology XLK VGT
金融 Financials XLF VFH
通信サービス Communication Services XLC VOX
ヘルスケア Health Care XLV VHT
一般消費財 Consumer Discretionary XLY VCR
生活必需品 Consumer Staples XLP VDC
資本財 Industrials XLI VIS
不動産 Real Estate XLRE VNQ
エネルギー Energy XLE VDE
公益事業 Utilities XLU VPU
素材 Materials XLB VAW

これらのセクターは、経済の異なる側面を代表しており、投資家が多様なポートフォリオを構築する際の基盤となります。セクター別にETFを利用することで、投資家は特定の産業に簡単に投資することができ、市場の変動に対する自分のリスクを調整することが可能になります。各セクターのパフォーマンスは、経済のサイクルや政策、技術の革新など、様々な要因によって異なります。そのため、セクター分析は、投資戦略を考える上で非常に重要な要素となります。

このようにセクターごとに分けて考えることで、市場の動きをより深く理解し、投資の機会を見極めることができます。次回はこれらの情報を元に、各セクターのボラティリティと資金の流出入について調べる方法を実際にコードを書きながら見ていきましょう。

参考サイト

SPDR Exchange Traded Funds (ETFs) | SSGA

Vanguard: Helping you reach your investing goals | Vanguard

 

 

 

【現代ポートフォリオ理論】全世界株式(オルカン)の資産配分は正しいのか?「最適ポートフォリオ」のパフォーマンス分析【Python】

皆さん、こんにちは!今回は、私たちの最適ポートフォリオを探す旅をさらに進め、全世界株式(俗に言うオルカン)が果たして最適な資産配分をしているのかを見てみましょう。MSCIのAll Country World Index(ACWI)など全世界の株式の指数に連動するETF投資信託を皆様もお持ちだったり、検討されたことがあるのではないでしょうか。

ACWIの場合は以下のように米国株式64%、日本株式5.6%にヨーロッパ各国、新興国の株が続きます。

MSCI ACWI 組み入れ比率

そこでみなさんも気になるのが「果たしてこの比率は本当に最適な配分なのでしょうか」?ということですよね!ここでもPythonと現代ポートフォリオ理論の力を借りてデータを分析してみました!コードへのリンクは最下部にあるので皆さまも是非試してください。また現代ポートフォリオ理論については詳しくこちらのエントリーで説明しています。

 

データの準備と分析
早速yfinanceライブラリを使い、VTI(米国株式)、VEA(先進国株式除く米国)、VWO(新興国株式)の3つのETFから成るポートフォリオの過去10年間のデータを分析しました。まずは、これらのETFの日次調整終値をダウンロードし、日次リターンを計算します。

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

# 対象ETFのシンボルリスト
symbols = ['VTI', 'VEA', 'VWO']  # ここに好きな銘柄を足してみてくださいね!

# 過去10年分の日足データをダウンロード
data = {symbol: yf.download(symbol, period='10y', interval='1d')['Adj Close'] for symbol in symbols}

# 各ETF終値データをDataFrameに結合
close_prices = pd.DataFrame(data)

# 日次リターンを計算
daily_returns = close_prices.pct_change().dropna()

効率的フロンティアの視覚化
効率的フロンティアは、与えられたリスクレベルで最大のリターンを得られるポートフォリオの組み合わせを示します。この概念を視覚化するために、ランダムに生成した10,000のポートフォリオを分析し、それぞれのリターン、ボラティリティ、そしてシャープ比率を計算しました。

num_assets = len(symbols)
num_portfolios = 10000
all_weights = np.zeros*1
return_arr = np.zeros(num_portfolios)
volatility_arr = np.zeros(num_portfolios)
sharpe_arr = np.zeros(num_portfolios)

# 年間リスクフリーレートを仮定(例:2%)
risk_free_rate = 0.02
np.random.seed(100)

for i in range(num_portfolios):
    # ランダムな重みを生成
    weights = np.random.random(num_assets)
    weights /= np.sum(weights)
    all_weights[i, :] = weights
   
    # 期待リターン
    return_arr[i] = np.dot(weights, daily_returns.mean()) * 252
   
    volatility_arr[i] = np.sqrt(np.dot(weights.T, np.dot(daily_returns.cov() * 252, weights)))
   
    # シャープ比率
    sharpe_arr[i] = (return_arr[i] - risk_free_rate) / volatility_arr[i]

# 最大シャープ比率のポートフォリオを探す
max_sharpe_idx = sharpe_arr.argmax()
max_sharpe_return = return_arr[max_sharpe_idx]
max_sharpe_volatility = volatility_arr[max_sharpe_idx]

# 効率的フロンティアのプロット
plt.scatter(volatility_arr, return_arr, c=sharpe_arr, cmap='viridis')
plt.colorbar(label='Sharpe Ratio')
plt.xlabel('Volatility(Risk)')
plt.ylabel('Expected Return')

# 最大シャープ比率のポートフォリオをマーキング
plt.scatter(max_sharpe_volatility, max_sharpe_return, color='red', s=50, edgecolors='black')

plt.title('Efficient Frontier')
plt.show()

# 最適ポートフォリオの重み
print("最適ポートフォリオの重み:", all_weights[max_sharpe_idx, :])

3銘柄の効率的フロンティア

最適な配分[VTI, VEA, VWO]

やはり米国株が強く、安定しているため米国株にかなり偏ったポートフォリオを最適な配分として出してきますね。ではこのポートフォリオオルカンの対象指数として採用されることも多いMSCI ACWIのリターンを比べたらどうなるのでしょうか?

# ACWIのデータをダウンロード
acwi_data = yf.download('ACWI', period='10y', interval='1d')
acwi_close = acwi_data['Adj Close']

# ACWIのトータルリターンを計算
acwi_total_return = (acwi_close.iloc[-1] / acwi_close.iloc[0]) - 1
# 最適ポートフォリオの重み(先ほどの結果を使用)
optimal_weights = all_weights[max_sharpe_idx, :]

# 最適ポートフォリオのトータルリターン計算
optimal_portfolio_return = (daily_returns * optimal_weights).sum(axis=1) + 1
optimal_portfolio_total_return = optimal_portfolio_return.cumprod().iloc[-1] - 1

print(f"ACWIのトータルリターン: {acwi_total_return:.2%}")
print(f"最適ポートフォリオのトータルリターン: {optimal_portfolio_total_return:.2%}")

結果

過去いろいろな記事でオルカンとその他の比較を行ってきましたがまたもやオルカン以外に軍配が上がってしまいました。これは米国株に偏重したポートフォリオ配分になっているため当たり前ですよね。

ただ気をつけないければならないのは今回国は違えど同じ資産クラス(株式)でポートフォリオを組んでいますね?ということは相関係数もかなり1に近い(暴落するときは株式全部暴落する)ので本当の意味での分散投資にはなっていないんです。例えば逆相関になることが多いといわれる債権関係や不動産なども混ぜることで一つの資産クラスが暴落しても耐えることできる盤石な「最適ポートフォリオ」が完成します。

 

以下のリンクからもコードにアクセスできます。銘柄の追加もできるので皆様も是非遊んでみてくださいね!みんなも大好きな’SOXL’を追加してみると。。。

colab.research.google.com

 

過去の現代ポートフォリオ理論に関するエントリー

ai-and-finance.net

ai-and-finance.net

クリックお願いします!

参考サイト

https://www.msci.com/documents/10199/8d97d244-4685-4200-a24c-3e2942e3adeb

*1:num_portfolios, num_assets