累積購入口数と保有口数を比較してみた~積立NISAの投資結果をPythonで可視化~

投資

楽天証券で投資信託の積立をしているけど、
実際にどれだけ買って、どれくらい持ってるのか」ってちゃんと把握していますか?

今回は、楽天証券からダウンロードできるCSVファイルを使って、
各ファンドごとの累積購入口数と現在の保有口数を比較するグラフをPythonで作ってみました。

見える化すると、意外な気づきもありました。

この記事でできること

  • 楽天証券から取引履歴と保有データを取得
  • Pythonを使ってデータを加工・集計
  • ファンドごとに「累積購入口数」と「保有口数」を棒グラフで可視化
  • 再投資の影響を確認する
なぜ口数を可視化したの?

私は購入した投資信託で「再投資型」で設定し積み立て購入しています。ですので「分配金を再投資しているなら、保有口数が増えてるのでは?」と思いました。そこで、実際口数がどれくらい変化しているのか確かめたかったことが、本記事を書いたきっかけです。

必要なCSVファイルの準備とダウンロード方法

取引履歴CSV(投資信託)

マイメニュー→取引履歴の「投資信託」を選択

表示期間を「すべて」、ファンド種別を「すべて」を選択し、表示するをクリック

ダウンロードできるファイル名の例は以下です。

tradehistory(INVST)_20250425.csv

保有銘柄情報CSV(資産残高)

マイメニュー→取引履歴の「投資信託」を選択

「CSVで保存」をクリックしてダウンロード

ダウンロードできるファイル名の例は以下です。

assetbalance(INVST)_20250425_184748.csv

Pythonサンプルコード:累積購入口数と保有口数の可視化

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams

# 日本語フォントの設定
rcParams['font.family'] = 'MS Gothic'  # Windowsの場合
# rcParams['font.family'] = 'IPAexGothic'  # Macの場合や、IPAフォントを使いたい場合

# 取引履歴のCSV読み込み
df_trade = pd.read_csv('C:/Users/asusf/Desktop/ブログ/投資結果/tradehistory(INVST)_20250425.csv', encoding='shift_jis')

# 保有状況のCSV読み込み
df_hold = pd.read_csv('C:/Users/asusf/Desktop/ブログ/投資結果/assetbalance(INVST)_20250425_184748.csv', encoding='shift_jis')

# --- 前処理:金額を数値化 ---
# '受渡金額/(ポイント利用)[円]' カラムを float に変換(ポイント利用分を除去)
df_trade['受渡金額/(ポイント利用)[円]'] = (
    df_trade['受渡金額/(ポイント利用)[円]']
    .replace('[円,]', '', regex=True)
    .str.replace(r'\(.*\)', '', regex=True)
    .astype(float)
)

# カンマ削除してからfloat変換
df_trade['数量[口]'] = df_trade['数量[口]'].replace(',', '', regex=True).astype(float)

# 日付列を datetime 型に変換し、年月(2024-04 など)も抽出
df_trade['約定日'] = pd.to_datetime(df_trade['約定日'])
df_trade['年月'] = df_trade['約定日'].dt.to_period('M')

# --- グラフ描画用のデータ準備 ---
fund_names = []
accumulated_units = []
actual_units = []

# --- ファンドごとに処理 ---
for fund_name, group in df_trade.groupby('ファンド名'):
    # 買付だけ抽出(必要に応じて他の取引は除外)
    group_buy = group[group['取引'].str.contains('買')]

    # 月ごとの累積口数
    monthly = group_buy.groupby('年月').agg({'数量[口]': 'sum'}).sort_index().cumsum()

    # 評価情報からそのファンドのデータを取得
    hold_info = df_hold[df_hold['ファンド'].str.contains(fund_name)]

    # 保有データが存在すれば評価情報を取得
    if not hold_info.empty:
        actual_units_value = float(hold_info['保有数量[口]'].str.replace(',', '').values[0])
    else:
        actual_units_value = 0

    # ファンド名、累積口数、保有口数をリストに追加
    fund_names.append(fund_name)
    accumulated_units.append(monthly['数量[口]'].iloc[-1] if not monthly.empty else 0)
    actual_units.append(actual_units_value)

# --- 棒グラフの描画 ---
x = range(len(fund_names))

fig, ax = plt.subplots(figsize=(10, 6))

# 累積口数と保有口数を並べて表示
bar_width = 0.35
ax.bar(x, accumulated_units, width=bar_width, label="累積購入口数", color='tab:blue')
ax.bar([i + bar_width for i in x], actual_units, width=bar_width, label="保有口数", color='tab:red')

# ラベル、タイトル、凡例
ax.set_xlabel('ファンド名')
ax.set_ylabel('口数')
ax.set_title('ファンド別累積購入口数と保有口数')
ax.set_xticks([i + bar_width / 2 for i in x])
ax.set_xticklabels(fund_names, rotation=45, ha='right')
ax.legend()

plt.grid(True)
plt.tight_layout()
plt.show()

可視化結果と気づき

グラフを見てみると…

  • ほとんどのファンドで「累積購入口数 ≒ 保有口数」
  • 保有口数が若干ずれているファンドもあるが、大きな差はない

「分配金を再投資しているなら、保有口数はもっと増えてるのでは?」と思いましたが、
各ファンドの運用報告書を確認したところ、ほぼすべてのファンドで分配金は0円でした。

さらに調査したところ、多くのファンドは内部で再投資(無分配型)をしているため、
再投資による口数増加は発生していない、という結果になりました。

調査結果と考察

  • 無分配型ファンドでは、再投資は内部で完了しており、口数は増えない
  • 再投資分は基準価額の上昇として反映される
  • 将来的に分配金が発生するファンドでは、ここに差が出てくるかも?

まとめ

投資信託の積立結果をこうして自分で可視化すると、
「本当に自分のお金がどうなっているか」がよくわかります。

毎月集計していけば、さらに資産の推移が見えてきそうですね!

参考


SUZUME

20代機械メーカ所属の制御エンジニア。
読書を中心とした学習のインプットと、
仕事とブログ執筆でのアウトプットのサイクルを軸に活動。
「賢く楽しく」をもっとうに、
エンジニアライフを満喫することが目標です。

SUZUMEをフォローする

社内外で評価されるエンジニアになる、ひいてはエンジニア人生を楽しくするためには、
日常のインプットとアウトプットの重要性が日に日に増していることを実感しています。

そのなかで、私は「書籍による学習」と「ブログによるアウトプット」を強くおすすめしております。

その重要性や効果の実感をブログに書いてみましたので、参考にしていただければ幸いです。

タイトルとURLをコピーしました