概要
指定したポートフォリオの約30日前(任意に変更可)から現在までの推定資産総額を時系列でグラフ表示させます。
結果
ソースコード
今回はポートフォリオが記述されたportfolio_define.pyと処理が記述されたAssessment.pyを使用します。
portfolio_define.py
portfolio = {"AAPL":[1],"GOOG":[1],"TSLA":[1],"MSFT":[1],"AMZN":[1]}
この辞書型をフォーマットを真似ながら任意のものに変更してください。KeyとValueの数に制限はありませんが、多すぎるとある程度処理に時間がかかると思います。
例として過去30営業日?の1兆ドルクラブポートフォリオの実績を見てみます。
initの中のパラメータは任意に変更してください。
self.duration = 遡る営業日数 約一か月ちょっと... 30
約1年... 300? 等
self.start = データ取得開始日:基本変更なしで良いと思いますが、1000営業日分とか取りたい場合はもっと前に設定する。
Assessment.py
import datetime
import portfolio_define
import numpy as np
from matplotlib import pyplot as plt
import pandas_datareader as dt
class Portfolio_Assessment():
def __init__(self):
self.portfolio = portfolio_define.portfolio
self.duration = 30
self.start = "2019-01-01"
self.end = datetime.date.today()
#Utils
def JPY_X_rate_N_date(self,start_date, end_date):
FX_info = {}
JPYX_Rate = dt.DataReader("JPY=X","yahoo", start_date, end_date)
for i in range(len(JPYX_Rate)):
FX_info["{}".format(JPYX_Rate.index[i])] = JPYX_Rate["Close"][i]
return FX_info
def stock_search_to_Date_Prices(self,stock_symbol,start_date, end_date):
df = dt.DataReader(stock_symbol,"yahoo", start_date, end_date)
return df.index,np.array(df["Close"])
def main(self):
#date USD JPY rate
FX_info = self.JPY_X_rate_N_date(self.start, self.end)
data = {}
for i, name in enumerate(self.portfolio):
data[name] = [self.stock_search_to_Date_Prices(name,self.start,self.end)]
X = []
Y = []
for i in range(self.duration):
USD_total = 0
for name in self.portfolio:
if i== 0:
date = data[name][0][0][-(i+1):]
price = data[name][0][1][-(i+1):]
else:
date = data[name][0][0][-(i+1):-(i)]
price = data[name][0][1][-(i+1):-(i)]
USD_total += price*self.portfolio[name][0]
try:
temp = round(FX_info[str(date[0])],2)
JPY = USD_total * round(FX_info[str(date[0])],2)
except:
JPY = USD_total * temp
X.append(date[0])
Y.append(JPY)
plt.plot(X,Y)
plt.tight_layout()
plt.xlabel("Date")
plt.ylabel("JPY")
plt.title("Your Portfolio Performance")
plt.show()
if __name__ == "__main__":
PA = Portfolio_Assessment()
PA.main()
一言
日付毎、銘柄名毎に該当日の資産価格とドル円レートを元にポートフォリオの資産総額を日本円で算出し、最後にグラフ化した。
一見簡単そうな処理だったが、とりかかってみると複雑で困った。