未分類

Pythonによるリアルタイムな資産状況のグラフ化

目的

Pythonを用いて、データフレームやグラフ作成のやり方を学ぶことができます。
また、保有している株価をリアルタイムの価格を取得しグラフ化することで、自身の資産の把握や見直しにつなげることを目的としています。今回は現状の資産を円グラフにより可視化を行いました。

円グラフ_各ETFが占める資産の割合

ソースコードまとめ

下記のソースコードをコピー&ペーストすれば、簡単にグラフを作成することができます。
それぞれのコードの詳細については、本記事の下部に記載してあります。

環境構築

Jupyterlabインストール

グラフ表示に必要な環境構築の手順を記載しています。
記載してあるものは、Macベースですが、Windowsでも大きくは変わらないので、
+αで他の記事を参考すれば、簡単にできると思います。

ライブラリインストール

ターミナルやコマンドプロンプトで下記のライブラリをインストールします。

pip install pandas
pip install pandas_datareader
pip install matplotlib

ソースコード作成

ライブラリインポート

JupyterLabへ記載するソースコードになります。

#データ構造を作成するライブラリ
import pandas as pd
#日付を指定するライブラリ
import datetime as dt
#経済データや金融商品の価格データを取得できるライブラリ
import pandas_datareader.data as web
#グラフを作成するライブラリ
import matplotlib.pyplot as plt

株価および為替取得設定

まず、取得する期間設定についてです。
終了日については、プログラムを実行した現在の日付が自動的に反映されるようにしています。
開始日については、終了日の30日前に設定しています。

広めの設定期間を設けることで、データが取得できないことが無いようにしています。

今回、取得するデータはETF(S&P500、金、国債など)ドル→円の為替レートになります。
取得には、DataReaderというライブラリを使用します。
『stooq』は主に株やETF『fred』は為替を取得するものになります。

取得データ
SPY(SPDR S&P 500 ETF):アメリアの代表的な株価指数であるS&Pに値動きが連動するETF
VWO(バンガード FTSE エマージング・マーケッツETF):途上国株式の米ドル建てのETF
TLT(iシェアーズ米国国債20年超 ETF):期間20年以上の米国債券
HYG(iシェアーズiBoxx ハイイールド社債ETF):米ドル建てハイイールド社債に連動するETF
GLD( SPDR ゴールド・シェア):金に投資するETF
SLV( iシェアーズ・シルバー・トラスト):銀に投資するETF

#期間設定
#終了日に現在の日付を反映
end = dt.date.today()
#開始日に30日前の日付を反映
start = end - dt.timedelta(days=30)

#リスト作成
#ETFリスト
ETF_LIST = ['SPY','GLD','TLT','VWO','SLV','HYG']
#為替リスト
FX_LIST = ['DEXJPUS']

#データ取得
#ETF取得
ETF = web.DataReader(ETF_LIST,'stooq',start,end)
#為替取得
FX = web.DataReader(FX_LIST,'fred',start,end)

データフレーム作成

ETFと為替について、それぞれの終値を取得し、データフレームを作成します。

#dfデータフレームに格納。
#closeをindex昇降順にソートする。
#copy()により値渡しに変更。stocksに影響を与えない。
df_ETF = ETF.Close.sort_index(ascending=True).copy()
df_FX = FX.sort_index(ascending=True).copy()

最新データの取得

それぞれのデータフレームにおける最新データのみを取得します。

#最新株価を取得する
#最後尾のデータを取得する
df_ETF_LATEST = df_ETF.tail(1)
#行列を入れ替える
df_ETF_LATEST = df_ETF_LATEST.T
#列に名前をつける
df_ETF_LATEST.columns=['価格_ドル']

#最新為替を取得する
df_FX_LATEST = df_FX.tail(1)
df_FX_LATEST = df_FX_LATEST.T

ETFを日本円換算します。

#上記の米ドル→日本円の数値を取得する
US_JPN = df_FX_LATEST.iloc[0,0]
#それぞれのETFを日本円に換算する
df_ETF_LATEST['価格_円'] = df_ETF_LATEST*US_JPN

ラベルによる分類

それぞれのETFに対して、「株」「コモディティ」「国債」のラベルを付けることで分類を行います。

#辞書型のリストを作成する
ClASS_DICT = {'SPY':'株','GLD':'コモディティ','TLT':'国債','VWO':'株','SLV':'コモディティ','HYG':'株'}
#作成したSeriesの名前を「分類」にする
ClASS = pd.Series(ClASS_DICT,name = '分類')
#データフレームに結合する
df_ASSETS= pd.concat([df_ETF_LATEST,ClASS],axis = 1)

株(ETF)の保有数

株(ETF)の保有数を記載します。

#辞書型のリストを作成する
ASSETS_NUM_DICT= {'SPY':100,'GLD':200,'TLT':300,'VWO':400,'SLV':500,'HYG':600}
#作成したSeriesの名前を「保有数」にする
ASSETS_NUM = pd.Series(ASSETS_NUM_DICT,name = '保有数')
#データフレームに結合する
df_ASSETS= pd.concat([df_ASSETS,ASSETS_NUM],axis=1)

為替の整理と現金の保有数

為替のデータの整理と現金の保有数を記載します。

#円→ドル変換_辞書型のリストを作成する
MONEY_YEN_VALUE_DICT = {'円':1,'ドル':US_JPN}
#作成したSeriesの名前を「価格_円」にする
MONEY_YEN_VALUE = pd.Series(MONEY_YEN_VALUE_DICT,name = '価格_円')

#ドル→円変換_辞書型のリストを作成する
MONEY_DOLLAR_VALUE_DICT = {'円':1/US_JPN,'ドル':1}
#作成したSeriesの名前を「価格_ドル」にする
MONEY_DOLLAR_VALUE = pd.Series(MONEY_DOLLAR_VALUE_DICT,name = '価格_ドル')

#辞書型のリストを作成する
MONEY_CLASS_DICT = {'円':'現金','ドル':'現金'}
#作成したSeriesの名前を「分類」にする
MONEY_CLASS = pd.Series(MONEY_CLASS_DICT,name = '分類')

#現金の保有数のリストを作成する
MONEY_NUM_DICT = {'円':2000000,'ドル':40000}
#作成したSeriesの名前を「保有数」にする
MONEY_NUM = pd.Series(MONEY_NUM_DICT,name = '保有数')

#上記のSeriesを結合し、データフレームを作成する
df_MONEY = pd.concat([MONEY_DOLLAR_VALUE,MONEY_YEN_VALUE,MONEY_CLASS,MONEY_NUM],axis = 1)

#データフレームに結合する
df_ASSETS = pd.concat([df_ASSETS,df_MONEY],axis = 0)

資産項目の作成

価格と保有数から現在保有している資産を作成します。

#データフレーム作成_資産
df_ASSETS['資産'] = df_ASSETS['価格_円']*df_ASSETS['保有数']

グラフの作成

円グラフその1 株(ETF)の資産割合

それぞれのETFが資産に占める割合を表す円グラフを作成します。

#グラフサイズ
fig  = plt.figure(figsize=(8,8))
#グラフ要素設定
x = df_ASSETS['資産']
#ラベルの作成
labels = df_ASSETS.index
#構成割合をパーセンテージで表示
plt.pie(x,labels = labels,autopct='%1.1f%%')

円グラフの詳細について、もう少し詳しく知りたい方は下記の記事を参考にしてみてください。

https://pythondatascience.plavox.info/matplotlib/%E5%86%86%E3%82%B0%E3%83%A9%E3%83%95

円グラフその2 「株」「コモディティ」「国債」「現金」の資産割合

「株」「コモディティ」「国債」「現金」の比率を表した円グラフを作成します。

まず分類の項目に対して、合計値を算出します。

df_ASSETS_class = df_ASSETS.groupby(['分類']).sum()

前回と同様に円グラフを作成します。

#グラフサイズ
fig  = plt.figure(figsize=(8,8))
#グラフ要素設定
x = df_ASSETS_class['資産']
#ラベルの作成
labels = df_ASSETS_class.index
#構成割合をパーセンテージで表示
plt.pie(x,labels = labels,autopct='%1.1f%%')

おすすめのPython学習方法

ABOUT ME
チェルシー
【プロフィール】  年齢:30代前半  性別:オス 【主な職歴】  メーカー勤務  製品設計開発_メカ設計:7年  開発業務自動化:1年半 元々、メカ設計エンジニアとして、製品設計開発に携わっていました。新しいスキルを身につけたいと独学でPythonを勉強し始め、現在、本業でソフトエンジニアとして働いています。具体的には、Pythonを使った製品評価業務の自動化を推進しています。 また、製品市場データ分析業務など可視化なども実施しています。 【2023年度目標】 1. 副業収入:月5,000円 2. 塩漬けにしていたブログをChatGPTなどを活用して執筆の効率化し、1年半前に開設した本サイトを改善する 3. 定期的に株式投資おすすめ成長株の紹介記事を投稿 4. 自作中の米国成長株の分析ツールのコーディング紹介 5. 株式投資の本で学んだ情報をアウトプットする