SBI証券の損益管理を自動化してみる日記【その12】
前回は特定口座とNISA口座のデータをマージしました。今回は、データを集計してグラフ作成をやっていきたいと思います。作りたいデータとグラフは以下の通りです。
年ごとの損益集計を集計してグラフにする。口座全体、特定口座、NISA口座ごとにそれぞれ作成する。
年、月ごとの損益を集計してピボットテーブルにする。
年月ごとの損益を棒グラフにして、累積損益を折れ線グラフにする。
では以前作った関数draw_profit_graph()を修正していきます。集計用に年、月、年月のカラムを追加していきます。
def draw_profit_graph():
data_dir = '/content/drive/My Drive/資産管理/sbisec/ProfitData/'
df_master = pd.read_csv(data_dir + "MasterProfitData.csv", parse_dates=['受渡日'])
df_master['年'] = df_master['受渡日'].dt.year
df_master['月'] = df_master['受渡日'].dt.month
df_master['年月'] = df_master['受渡日'].dt.strftime('%Y-%m')
display(df_master)
# print(df_master.dtypes)
年ごとのデータを口座別に集計してグラフを描いていきます。Excelのピボットテーブルのように口座でフィルターをかけてデータを作成しようと思いましたがPandasのPivotTableではフィルターを設定する方法がわかりませんでした。
ということで、口座ごとのDataFrameをリストに入れて、for文で口座ごとにに集計してグラフを書くことにします。
# 年ごとのデータ集計とグラフ描画
df_list = [df_master] #全口座、特定口座、NISA口座のDataFrameを入れるリスト
accounts = df_master['口座'].unique()
print(accounts)
for account in accounts:
df_list.append(df_master[df_master['口座'] == account])
# print(df_list)
for df in df_list:
df_yearly = pd.pivot_table(df, index='年', columns='取引', values='損益金額', aggfunc='sum', fill_value=0, margins=True)
display(df_yearly)
# グラフのデータを設定する
## 評価額の折れ線グラフを設定
data =[go.Scatter(x=df_yearly.index, y=df_yearly['All'], name='合計')]
trades = df['取引'].unique()
# print(trades)
## 取引ごとに棒グラフを設定
for trade in trades:
data.append(go.Bar(x=df_yearly.index, y=df_yearly[trade], name=trade))
# print(data)
# グラフのレイアウトを設定する
layout = go.Layout(
width=600
)
fig = go.Figure(data=data, layout=layout) #データとレイアウトをグラフオブジェクトに渡す
fig.update_layout(barmode='relative') #棒グラフを積み上げにする
fig.show() #グラフを描画する
実行してみます。
口座全体の結果。
特定口座の結果。過去2年分のデータのみです。
NISA口座の結果。
うまくいきました。Y軸がやけに大きいですがなぜでしょうか・・・。
次に年、月で集計していきます。
# 年、月ごとの損益データ集計
df_monthly = pd.pivot_table(df_master, index='年', columns='月', values='損益金額', aggfunc='sum', fill_value=0, margins=True)
display(df_monthly)
実行してみます。
ちゃんと集計できている様です。
年月の損益と累積折れ線グラフを表示してみます。
# 年月ごとの損益データ集計とグラフ描画
df_monthly = pd.pivot_table(df_master, index='年月', values='損益金額', aggfunc='sum', fill_value=0)
df_monthly['累積損益'] = df_monthly['損益金額'].cumsum()
# display(df_monthly)
data = [
go.Bar(x=df_monthly.index, y=df_monthly['損益金額'], name='損益金額'),
go.Scatter(x=df_monthly.index, y=df_monthly['累積損益'], name='累積損益')
]
layout = go.Layout(
width=1000
)
fig = go.Figure(data=data, layout=layout)
fig.show()
実行してみます。
うまくグラフが表示できました。
さて、ではこの辺で「SBI証券の損益管理を自動化してみる日記」は終わりにしたいと思います。
損益が発生したら手動でGoogleColabのランタイムを実行しなければならないので完全自動でデータ取得できていませんが、とりあえず損益データは2年間残っているのでまぁよしとしましょう。
この記事が気に入ったらサポートをしてみませんか?