目的
Pythonを用いて、データフレームやグラフ作成のやり方を学ぶことができます。
また、保有している株価をリアルタイムの価格を取得しグラフ化することで、自身の資産の把握や見直しにつなげることを目的としています。今回は現状の資産を円グラフにより可視化を行いました。
![](https://tip-memo.com/wp-content/uploads/2022/01/0810b2eab713ad9fe5ab42615407cc06.png)
ソースコードまとめ
下記のソースコードをコピー&ペーストすれば、簡単にグラフを作成することができます。
それぞれのコードの詳細については、本記事の下部に記載してあります。
環境構築
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://tip-memo.com/wp-content/uploads/2022/01/e9ddd080e525659296c4cc0c40069378-1.png)
円グラフの詳細について、もう少し詳しく知りたい方は下記の記事を参考にしてみてください。
円グラフその2 「株」「コモディティ」「国債」「現金」の資産割合
「株」「コモディティ」「国債」「現金」の比率を表した円グラフを作成します。
まず分類の項目に対して、合計値を算出します。
df_ASSETS_class = df_ASSETS.groupby(['分類']).sum()
![](https://tip-memo.com/wp-content/uploads/2022/01/3d5fa8a5e3124a1dd501ac5bd22d26f0.png)
前回と同様に円グラフを作成します。
#グラフサイズ
fig = plt.figure(figsize=(8,8))
#グラフ要素設定
x = df_ASSETS_class['資産']
#ラベルの作成
labels = df_ASSETS_class.index
#構成割合をパーセンテージで表示
plt.pie(x,labels = labels,autopct='%1.1f%%')
![](https://tip-memo.com/wp-content/uploads/2022/01/cf6a50654b30aae896953ca878740553.png)