AIとファイナンス

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

【分析】日米の実質金利差とドル円相場の関係【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投資信託を皆様もお持ちだったり、検討されたことがあるのではないでしょうか。ここでもPythonと現代ポートフォリオ理論の力を借りてデータを分析してみました!コードへのリンクは最下部にあるので皆さまも是非試してください。また現代ポートフォリオ理論については詳しくこちらのエントリーで説明しています。

MSCI ACWI 組み入れ比率
MSCI ACWI 組み入れ比率

データの準備と分析

早速yfinanceライブラリを使い、VTI(米国株式)、VEA(先進国株式除く米国)、VWO(新興国株式)の3つのETFから成るポートフォリオの過去10年間のデータを分析しました。

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]

 

ポートフォリオとACWIの比較

やはり米国株が強く、安定しているため米国株にかなり偏ったポートフォリオを最適な配分として出してきますね。ではこのポートフォリオオルカンの対象指数として採用されることも多い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

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

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


週間サマリー: 今週は買い増し等の大きな動きはありませんでした。円安のおかげもあり1000万円という節目を超えれていたのでここ数日のドル円の影響をどう受けているか気になります。ちなみに買い増しやポートフォリオの自動管理方法はこのブログ内で自家製のリバランスプログラムを紹介しているのでみなさん是非ご覧くださいね!さらに追加の資金投入は先日な買付日/積み立て日についてシミュレーションをした結果もご紹介していますのでご参考にしてください。

昨日の米国市場では、ダウ・ジョーンズ工業平均はわずかに上昇して0.10%プラスの39,043.32ポイントで終了しました。一方で、S&P 500は0.19%マイナスの5,165.31ポイント、ナスダック総合指数は0.54%下落して16,177.77ポイントで取引を終えています​​​​。

特にナスダックの下落が目立っています。この下落には、大手テクノロジー企業の株価が影響していると考えられます。具体的には、NvidiaやTeslaなどの株価が下落し、テクノロジー株全体を引き下げる形となりました​​。

また、原油価格は2.63%上昇し、79.60ドルで取引を終了しました。金価格も上昇し、0.61%プラスの2,179.40ドルで取引が行われました​​。一般的に原油価格の上昇は、エネルギーコストの上昇を意味し、これは物価水準の上昇につながります。金価格の上昇も同様に、物価上昇への懸念から安全資産への投資として見られることが多いです。この間のCPIの発表でもインフレはまだまだ収まっていなさそうな雰囲気でしたよね。当面の間は物価の上昇はおさまらない、という見通しで間違いはなさそうですね。

2024/3/13 取引残高

米国ETF $54,616.40 (¥8,061,380 @147.60)

投資信託 ¥2,110,876

現金 ¥0

2024/3/13 米国ETF

2024/3/13 投資信託

2024/3/13 資産推移

ぜひクリックお願いします!

参考サイト

U.S. Stock Market Headlines | Breaking Stock Market News | Reuters

Latest Stock Market News (yahoo.com)

 

 

【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