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()  #グラフを描画する

実行してみます。

口座全体の結果。

スクリーンショット 2020-11-10 20.48.11

特定口座の結果。過去2年分のデータのみです。

スクリーンショット 2020-11-10 20.49.08

NISA口座の結果。

スクリーンショット 2020-11-10 20.50.26

うまくいきました。Y軸がやけに大きいですがなぜでしょうか・・・。

次に年、月で集計していきます。

   # 年、月ごとの損益データ集計
   df_monthly = pd.pivot_table(df_master, index='年', columns='月', values='損益金額', aggfunc='sum', fill_value=0, margins=True)
   display(df_monthly)

実行してみます。

スクリーンショット 2020-11-10 20.53.14

ちゃんと集計できている様です。

年月の損益と累積折れ線グラフを表示してみます。

   # 年月ごとの損益データ集計とグラフ描画
   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()

実行してみます。

スクリーンショット 2020-11-10 20.57.50

うまくグラフが表示できました。

さて、ではこの辺で「SBI証券の損益管理を自動化してみる日記」は終わりにしたいと思います。

損益が発生したら手動でGoogleColabのランタイムを実行しなければならないので完全自動でデータ取得できていませんが、とりあえず損益データは2年間残っているのでまぁよしとしましょう。


この記事が気に入ったらサポートをしてみませんか?