AIとファイナンス

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

【NISA】自動でポートフォリオのリバランス計算を行うPythonプログラムの作成方法とは?【米国ETF】

今日は「ポートフォリオのリバランス計算を自動で行うPythonプログラム」を作ってみます。投資家として、市場の波に乗るためには、時にはポートフォリオの調整が必要ですよね。では、これをもっと簡単に、そして効率的に行う方法はないでしょうか?

まず、このプログラムはPythonを使っており、Yfinanceライブラリを使用して株式市場のデータを取得します。現在私たちが購入している「VTI, VEA, VWO, VOO, GLD, AGG, IYR」の現在の価格を取得し、事前に設定した配分比率と追加投資額を考慮に入れて、どの銘柄をどれだけ買うべきかを計算します。

頻繁な売り買いは手数料的にも損になるので、プログラムは基本的にノンセールリバランスを行うように書いています。

1.ライブラリのインポートと価格の取得

まずはおなじみのYfinanceでデータを取得します。

import yfinance as yf
tickers = ["VTI", "VEA", "VWO", "VOO", "GLD", "AGG", "IYR"]
data = yf.download(tickers, period="1d")
 
# 'Close'価格のみを取得
if 'Adj Close' in data.columns.levels[0]:
    prices = data['Adj Close']
else:
    prices = data['Close']

 

2.配分比率、現在の所有数の入力

ここであらかじめ決めたポートフォリオの配分比率を入力しています。ちなみに最適ポートフォリオの組み方についてはこちらの記事をご覧ください。

# 入力: 各銘柄の配分比率と追加投資額
allocations = {"VTI": 0.1685, "VEA": 0.338, "VWO": 0.145, "VOO": 0.1685, "GLD": 0.08, "AGG": 0.05, "IYR": 0.05}
total_investment = 10000  # 追加投資額

# 入力: 現在の保有株数
current_holdings = {"VTI": 34, "VEA": 343, "VWO": 170, "VOO": 18, "GLD": 20, "AGG": 24, "IYR": 26}

# 配分比率の合計が100%(1.0)になっているかどうかを確認
total_allocation = sum(allocations.values())
if not 0.999 < total_allocation < 1.001:  # 小さな誤差を許容
    raise ValueError("配分比率の合計が100%になっていません。")
 

今回はここで配分比率が合計100%になっているかの確認もしています。

3.購入数の決定

このブロックでは現在のポートフォリオの価値を計算して、理想的なポートフォリオとの差を取ることにより必要とされる商品の購入数を指示しています。

# 現在のポートフォリオの総価値を計算
current_value = sum(prices[ticker] * current_holdings[ticker] for ticker in tickers)

# 理想的なポートフォリオ配分の総価値を計算
ideal_allocation_value = {ticker: (current_value + total_investment) * allocation for ticker, allocation in allocations.items()}
new_purchases = {}

for ticker in tickers:
    # 株価を取得(単一の値として)
    price = prices[ticker].iloc[-1] if ticker in prices.columns else 0

    # 理想の株数と現在の株数を計算
    ideal_shares = ideal_allocation_value[ticker] / price
    current_shares = current_holdings[ticker]

    # 新たに購入すべき株数を計算
    new_purchases[ticker] = math.floor(max(0, ideal_shares.item() - current_shares))

# 新たに購入すべき株数の出力
print("New purchases:")
for ticker, quantity in new_purchases.items():
    print(f"{ticker}: {quantity} shares")

4.購入後のポートフォリオの総価値と枚数の表示

次回のリバランスのために購入後の各数量を表示しするようにしてます。この数字をコピーしておき、次回リバランス時に「# 入力: 現在の保有株数」にそのまま入力してコードを走らせれば毎回の証券会社のHPから書き写す必要が無くなりますね。

# 新たに購入した株数を現在の保有株数に加算
for ticker, quantity in new_purchases.items():
    current_holdings[ticker] += quantity

# 出力: 購入後の全株数
print("current_holdings = {")
for ticker, quantity in current_holdings.items():
    print(f'    "{ticker}": {quantity},')
print("}")

# 各銘柄の金額およびポートフォリオ全体の金額を計算
total_value = 0
for ticker, quantity in current_holdings.items():
    value = quantity * prices[ticker]
    total_value += value
    print(f"{ticker}の金額: ${value}")

# ポートフォリオ全体の金額を出力
print(f"ポートフォリオ全体の金額: ${total_value}")

 

以上でした!我が家ではこのプログラムのおかげでだいぶ家計のメンテナンスに使う時間が減りました!皆様も是非お使いください。

 

是非押してください、ご協力お願いします!