LoginSignup
1
5

More than 1 year has passed since last update.

任意の米国株ポートフォリオの過去の成績をグラフで確認する

Last updated at Posted at 2021-11-10

概要

指定したポートフォリオの約30日前(任意に変更可)から現在までの推定資産総額を時系列でグラフ表示させます。

結果

1Tclub.png

ソースコード

今回はポートフォリオが記述された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()

一言

日付毎、銘柄名毎に該当日の資産価格とドル円レートを元にポートフォリオの資産総額を日本円で算出し、最後にグラフ化した。
一見簡単そうな処理だったが、とりかかってみると複雑で困った。

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5