LoginSignup
2
4

More than 1 year has passed since last update.

米国株のポートフォリオをMatplotlibで視覚化

Last updated at Posted at 2021-10-27

結論

入力

辞書型
portfolio = {"TSLA":[300],"AAPL":[903],"GOOG":[255],"MSFT":[999],"AMZN":[200]}

出力

円グラフと最新価格のデータ、そして現在の合計資産
円グラフの%は保有金額ベース
Figure_1.jpeg
Variable check okay.
TSLA's current price : 1018.43
AAPL's current price : 149.32
GOOG's current price : 2793.44
MSFT's current price : 310.11
AMZN's current price : 3376.07
Your current total asset : 2137706 US Dollars.

ポートフォリオ情報の渡し方

Portfolio_to_pie_chart.py
portfolio = {"TSLA":[300],"AAPL":[903],"GOOG":[255],"MSFT":[999],"AMZN":[200]} #任意に書き換える

下から3行目を書き換える
株のシンボルをkey, 持ってる数をvalueとして辞書型で渡す。valueの方はあとで最新価格の情報を追加したいのでリストにしておく。
portfolio = {"株のシンボル_1 ex)AAPL":[持ってる株の数_1(int)],"株のシンボル_2":[持ってる株の数_2(int)],..."株のシンボル_n":[持ってる株の数_n(int)]}

※日本株非対応 日経平均 "^N225" は行けます。

Portfolio_to_pie_chart.py
import numpy as np
import pandas_datareader as dt
import datetime
from matplotlib import pyplot as plt

def get_Yesterday_Today(): 
    date_today=datetime.date.today() 
    duration_oneday=datetime.timedelta(days=1) 
    date_yesterday=date_today-duration_oneday  
    return date_today, date_yesterday

def stock_search_to_prices(stock_symbol,start_date, end_date):
    df = dt.DataReader(stock_symbol,"yahoo", start_date, end_date)
    prices = df["Close"]
    return np.array(prices)

def add_price_info_to_portfolio(portfolio):
    date_today, date_yesterday = get_Yesterday_Today()
    for stock_symbol in portfolio:
        price_latest = stock_search_to_prices(stock_symbol,date_yesterday,date_today)[-1]
        if type(portfolio[stock_symbol][-1]) == int:
            portfolio[stock_symbol].append(price_latest)
        else:
            portfolio[stock_symbol][-1] = price_latest
    return portfolio

def process_data(up_to_date_portfolio):
    """
    It needs to be revised in the light of efficiency and readability.
    """
    labels = []
    sizes = []
    raw_amounts = []
    num_to_get_amount = 0
    num_to_get_price = 1
    total = 0
    for stock_symbol in up_to_date_portfolio:
        labels.append(stock_symbol)
        current_info = up_to_date_portfolio[stock_symbol]
        local_sum = current_info[num_to_get_amount] * current_info[num_to_get_price]
        raw_amounts.append(local_sum)
        total += local_sum
    if total == np.sum(raw_amounts): #This might be redundant but checking is important init.
        print("Variable check okay.")
    else:
        print(total,"vs",np.sum(raw_amounts))
        print("Something is wrong.")
    for amount in raw_amounts:
        sizes.append(amount/total)

    #Pie chart generation process.
    fig1, ax1 = plt.subplots()
    ax1.pie(sizes, labels=labels, autopct='%1.1f%%',
            shadow=True, startangle=90)
    ax1.axis('equal') 
    plt.show()
    return total

def portfolio_to_piechart(portfolio):
    up_to_date_portfolio = add_price_info_to_portfolio(portfolio)
    total = process_data(up_to_date_portfolio)
    return up_to_date_portfolio, total

def process_info_to_show(info_,total):
    for name in info_:
        print("{}'s current price : {}".format(name,round(info_[name][1],2)))
    print("Your current total asset : {} US Dollars.".format(int(total))) 


if __name__ == "__main__":
    portfolio = {"TSLA":[300],"AAPL":[903],"GOOG":[255],"MSFT":[999],"AMZN":[200]} #任意に書き換える
    info_, total= portfolio_to_piechart(portfolio)
    process_info_to_show(info_,total)

終わりに

最近読みやすいコードを意識しすぎてか変数が長くなってしまっている。意図とは裏腹に読みにくかったらご指摘ください。
また関数のstock_search_to_prices()も非常に便利ですのでご活用ください。

2
4
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
2
4