今日は「ポートフォリオのリバランス計算を自動で行う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("}")
for ticker, quantity in current_holdings.items():
value = quantity * prices[ticker]
print(f"{ticker}の金額: ${value}")
以上でした!我が家ではこのプログラムのおかげでだいぶ家計のメンテナンスに使う時間が減りました!皆様も是非お使いください。
是非押してください、ご協力お願いします!