見出し画像

「手書き・Excel管理はもう不要!」Google Colabで実現する究極の配当金自動管理ダッシュボード【Python】 #14

1. はじめに

株式投資の魅力のひとつが「配当金」。
でも――「自分で買った株の配当、ちゃんと記録・管理してますか?」

  • Excelで手入力?

  • 証券会社の画面で一つずつ確認?

それ、めちゃくちゃ面倒じゃないですか?

しかも現状のままだと、「買付時点の配当利回り」すら分からないことも多い。
「今の利回り」は見られても、買ったときの利回りって“どこにも記録されてない”んですよね。


【この記事の立ち位置】

  • 投資歴:数年

  • プログラミング:趣味レベル(プロじゃない)

  • 対象読者:Excelよりちょっと便利に、自分仕様で管理したい人


2. 全体の流れ

2-1. なぜGoogle Colab?なぜPython?

Google Colabのメリット

  • 無料で使える(GoogleアカウントがあればOK)

  • ブラウザだけでPythonが動く(PCへの環境構築不要)

  • Googleスプレッドシートと自動連携が可能

Pythonの強み

  • yfinanceなどのAPIで配当金や株価の取得が簡単

  • データの整理やグラフ化が自動化できる

  • 自分仕様にカスタマイズしやすい

※エビデンス
・Google ColabはGoogle公式の無料環境
・yfinanceはYahoo Finance APIをPythonで扱えるライブラリ
→  yfinance


2-2. このツールでできること

  • 🧮 配当利回りの自動計算(購入時利回り)

  • 📊 銘柄ごとの配当合計・口座別のまとめ管理

  • 📅 年間配当の推移やランキングの可視化

  • 🔄 データ取得を自動化して、更新もラクに


3. 実装内容(Colabで何をしているか)

作成したやつ

GoogleColabのアウトライン

STEP 0:前準備(スプレッドシート準備とColabの認証)

🔧 まずやること:

この配当管理ツールを動かすためには、次の2つを準備します


1. スプレッドシートの準備

Googleスプレッドシート上に以下のような「保有株リスト」シートを作成します。
(シート名例:保有株_データ)

保有株データのカラム例

※「コード」には日本株の証券コードを4桁で記載(例:1545, 1615)
※このあと .T をつけて 1545.T として扱います。
💡後で自動で追加されるカラム(銘柄名、配当金、評価額など)は、最初は不要です。

2. ColabとGoogleスプレッドシートの連携

Colabで以下のコードを実行して、スプレッドシートと連携します。

# 🔐 Googleアカウント認証
from google.colab import auth
auth.authenticate_user()

# 🔑 Google API認証
import gspread
from google.auth import default
creds, _ = default()
gc = gspread.authorize(creds)

# 📂 スプレッドシートのURLを指定(あなたのファイルに置き換えてください)
SPREADSHEET_URL = "https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxx"
spreadsheet = gc.open_by_url(SPREADSHEET_URL)

# 📄 保有株データの読み込み
sheet_ticker_list = spreadsheet.worksheet("保有株_データ")
ticker_data = sheet_ticker_list.get_all_values()
import pandas as pd
df_ticker_list = pd.DataFrame(ticker_data[1:], columns=ticker_data[0])  # ヘッダーありで読み込み

# 📌 データ確認
from IPython.display import display
display(df_ticker_list.head())

🔍 Google認証の手順(credentialsの取得など)は、Google Colabで「gspread 認証 方法」などで検索してください。
認証がうまくいかない場合、「Google Sheets API 有効化」や「サービスアカウント設定」が必要なことがあります。

3.ここまででやったことまとめ

  • 保有株データをGoogleスプレッドシートに準備

  • Colabからそのデータを読み込めるように認証・接続

次の【STEP 1】では、読み込んだコードに .T をつけてティッカー形式に整え、銘柄名の自動取得を行います。

【STEP 1】銘柄情報とティッカーの整備


📌 このSTEPでやること

  1. 「1545」などの証券コードを .T をつけて日本株のティッカー形式に変換

  2. yfinance を使って、銘柄名(shortName / longName)を自動取得

  3. 後続の集計・可視化のために、更新日を記録

🔁 コード:ティッカー生成と銘柄名の取得

import pytz
from datetime import datetime
import yfinance as yf

# --- 証券コード → ティッカー変換 ---
df_ticker_list["コード"] = df_ticker_list["コード"].astype(str).str.strip()
df_ticker_list["ティッカー"] = df_ticker_list["コード"] + ".T"

# --- 日付(更新日)の取得 ---
today_str = datetime.now(pytz.timezone("Asia/Tokyo")).strftime("%Y-%m-%d")

# --- 銘柄名の取得 ---
new_names = []
failed_tickers = []

for ticker in df_ticker_list["ティッカー"]:
    try:
        info = yf.Ticker(ticker).info
        name = info.get("shortName") or info.get("longName") or "取得失敗"
        if name == "取得失敗":
            raise ValueError("No valid name returned")
        print(f"✅ {ticker} → {name}")
    except Exception as e:
        print(f"⚠️ {ticker} → 取得失敗: {e}")
        name = "取得失敗"
        failed_tickers.append(ticker)
    new_names.append(name)

df_ticker_list["銘柄名"] = new_names
df_ticker_list["更新日"] = today_str

✅ 結果(表示)

from IPython.display import display
display(df_ticker_list.head())
表示例

💡補足

  • shortName が取得できないときは longName を代わりに使用します。

  • 銘柄名がうまく取れない場合(ETFなど)は 取得失敗 と表示され、後から手動で確認も可能です。

  • 更新日はあとで他の情報と同期させるためにも入れておくと便利です。

【STEP 2】配当・株価・利回りの取得と整形

📌 このSTEPでやること

  1. 保有数 × 平均購入価格 → 購入金額を再計算

  2. ティッカーごとにまとめてグループ化

  3. yfinanceから配当金(dividendRate)を取得

  4. 最新株価を取得し、評価額や利回りを計算

  5. 実質配当利回り・現状配当利回りを表示用に整形

🔣 コード:データ整形と数値化

def clean_numeric(series):
    return pd.to_numeric(
        series.astype(str).str.replace(",", "").str.replace(" ", "").str.strip(),
        errors="coerce"
    )

# 数値変換と購入金額の再計算
df_ticker_list["保有数"] = clean_numeric(df_ticker_list["保有数"])
df_ticker_list["平均購入価格"] = clean_numeric(df_ticker_list["平均購入価格"])
df_ticker_list["購入金額"] = df_ticker_list["保有数"] * df_ticker_list["平均購入価格"]

🧮 グループ化(ティッカー単位)

df = df_ticker_list

df_grouped = df.groupby("ティッカー").agg({
    "銘柄名": "first",
    "保有数": "sum",
    "購入金額": "sum"
}).reset_index()

df_grouped["平均購入価格(再計算)"] = df_grouped["購入金額"] / df_grouped["保有数"]

💰 配当金(予想)の取得

dividends = []
for ticker in df_grouped["ティッカー"]:
    try:
        info = yf.Ticker(ticker).info
        dividend = info.get("dividendRate", None)
        if dividend is None:
            raise ValueError("No dividend info")
        print(f"💰 {ticker}: {dividend}")
    except Exception as e:
        print(f"⚠️ {ticker} 配当取得失敗: {e}")
        dividend = 0
    dividends.append(dividend)

df_grouped["配当金(予想)"] = dividends

📈 最新株価の取得

latest_prices = []
for ticker in df_grouped["ティッカー"]:
    try:
        info = yf.Ticker(ticker).info
        price = info.get("regularMarketPrice") or info.get("currentPrice") or None
        if price is None:
            raise ValueError("No price found")
        print(f"💹 {ticker} → 株価: {price}")
    except Exception as e:
        print(f"⚠️ {ticker} 株価取得失敗: {e}")
        price = None
    latest_prices.append(price)

df_grouped["最新株価"] = latest_prices

📊 利回り計算と整形

# 実質利回り(購入価格ベース)
df_grouped["実質配当利回り_raw"] = df_grouped["配当金(予想)"] / df_grouped["平均購入価格(再計算)"]
df_grouped["実質配当利回り"] = (df_grouped["実質配当利回り_raw"] * 100).round(2).astype(str) + "%"

# 現状利回り(最新株価ベース)
df_grouped["現状配当利回り_raw"] = (df_grouped["配当金(予想)"] / df_grouped["最新株価"]).fillna(0)
df_grouped["現状配当利回り"] = (df_grouped["現状配当利回り_raw"] * 100).round(2).astype(str) + "%"

📆 更新日と評価額・損益の追加

df_grouped["更新日"] = datetime.today().strftime("%Y-%m-%d")

df_grouped["評価額"] = df_grouped["最新株価"] * df_grouped["保有数"]
df_grouped["含み損益"] = df_grouped["評価額"] - df_grouped["購入金額"]

✅ 最終表示カラムの並び

df_grouped = df_grouped[
    [
        "ティッカー", "銘柄名", "保有数", "平均購入価格(再計算)", "購入金額",
        "最新株価", "評価額", "含み損益",
        "配当金(予想)", "実質配当利回り", "現状配当利回り",
        "実質配当利回り_raw", "現状配当利回り_raw", "更新日"
    ]
].sort_values("ティッカー").reset_index(drop=True)

display(df_grouped)

✅ ここまででできること

  • ティッカー単位にまとめて「評価額」「利回り」まで一括取得

  • yfinanceから配当金や株価を自動取得

  • 実質 vs 現状の配当利回りを可視化の準備まで整備

【STEP 3】スプレッドシートへの書き出し

📌 このSTEPでやること

  • df_grouped(配当・利回り・評価額などを含む表)を
    指定したスプレッドシートの別シート(例:保有株_サマリー)に上書き出力する

🗂 スプレッドシートの構成(想定)

┌──────────────┐
│ 保有株_データ     │ ← 入力用:ユーザーが手入力
│ 保有株_サマリー   │ ← 出力用:Colabで自動上書き
└──────────────┘

💾 コード:スプレッドシートへの書き出し

# 📤 書き出し先シート(例:保有株_サマリー)を取得
sheet_out = spreadsheet.worksheet("保有株_サマリー")

# ✅ ヘッダー行を含めて上書き出力
sheet_out.update([df_grouped.columns.tolist()] + df_grouped.values.tolist())

print("\n✅ スプレッドシート '保有株_サマリー' に出力が完了しました。")

✅ 書き出し完了後のイメージ

以下のような表が、スプレッドシートに自動生成されます:

💡ポイント

  • 手元で更新不要! 何度実行しても、スプレッドシートに自動上書きされる

  • 複数の口座や銘柄が増えても自動で集計される

  • 手動での「Excelコピー」や「電卓計算」は、ここで完全卒業!

【STEP 4】サマリーデータの読み込みと表示

📌 このSTEPでやること

  1. スプレッドシートの 保有株_サマリー シートを再び読み込み

  2. DataFrame として整形し、可視化や加工処理に備える

📤 書き出したシートを再取得

# 📥 スプレッドシート '保有株_サマリー' の読み込み
sheet_ticker_summry = spreadsheet.worksheet("保有株_サマリー")
ticker_data_summry = sheet_ticker_summry.get_all_values()

# 📄 データフレーム化(1行目をヘッダーとして)
df_ticker_summry = pd.DataFrame(ticker_data_summry[1:], columns=ticker_data_summry[0])

# ✅ 表示確認
from IPython.display import display
display(df_ticker_summry.head())

📌 表の一部(表示例)

💡補足:なぜ再読み込み?

  • 処理の分離のため:集計→出力→分析・可視化 をステップごとに分けて管理しやすく

  • セクター分類・グラフ化・業種別の処理を行う際に、「加工済みの最新版を再利用」する方が安全

🛠 次のSTEPに備えてやること(必要に応じて)

# 数値型に変換(グラフ用に必要)
df_ticker_summry["実質配当利回り_raw"] = pd.to_numeric(df_ticker_summry["実質配当利回り_raw"], errors="coerce")
df_ticker_summry["現状配当利回り_raw"] = pd.to_numeric(df_ticker_summry["現状配当利回り_raw"], errors="coerce")

✅ このSTEPでの成果

  • スプレッドシートとColabの双方向同期が完成!

  • ここから先、グラフ化/業種別の分析などが可能になる準備が整いました。

【STEP 5】配当利回りの可視化

📌 このSTEPでやること

  • ティッカーごとに「実質配当利回り」と「現状配当利回り」を並べて表示

  • Plotlyでインタラクティブな棒グラフを作成

  • 後半ではセクター分類ごとの平均配当利回りもグラフ化(業種別ダッシュボード)


5-1. ティッカー別:実質 vs 現状の配当利回り

🔁 データ前処理(可視化用)

df_plot = df_ticker_summry.copy()

# 数値化(エラー時は NaN に)
df_plot["実質配当利回り_raw"] = pd.to_numeric(df_plot["実質配当利回り_raw"], errors="coerce")
df_plot["現状配当利回り_raw"] = pd.to_numeric(df_plot["現状配当利回り_raw"], errors="coerce")

# 表示用ラベル列(%)
df_plot["実質配当利回り(数値)"] = (df_plot["実質配当利回り_raw"] * 100).round(2)
df_plot["現状配当利回り(数値)"] = (df_plot["現状配当利回り_raw"] * 100).round(2)

# 並べ替え(高利回り順)
df_plot_sorted = df_plot.sort_values("実質配当利回り_raw", ascending=False)

📊 Plotlyで棒グラフ表示

import plotly.graph_objects as go

fig = go.Figure()

# 実質配当利回り
fig.add_trace(go.Bar(
    x=df_plot_sorted["ティッカー"],
    y=df_plot_sorted["実質配当利回り_raw"],
    name="実質配当利回り",
    text=df_plot_sorted["実質配当利回り(数値)"],
    textposition="auto",
    marker_color="cornflowerblue"
))

# 現状配当利回り
fig.add_trace(go.Bar(
    x=df_plot_sorted["ティッカー"],
    y=df_plot_sorted["現状配当利回り_raw"],
    name="現状配当利回り",
    text=df_plot_sorted["現状配当利回り(数値)"],
    textposition="auto",
    marker_color="orange"
))

# レイアウト調整
fig.update_layout(
    title="ティッカー別 配当利回り(実質 vs 現状)",
    xaxis_title="ティッカー",
    yaxis_title="配当利回り(%)",
    yaxis_tickformat=".1%",
    barmode="group",
    bargap=0.2,
    xaxis_tickangle=-45,
    legend=dict(x=0.01, y=1.1, orientation="h")
)

fig.show()

🔍 補足Tips

  • 実質」は購入価格ベースの利回り(買ったときの判断指標)

  • 現状」は現在価格ベース(いま買ったらどうか)

5-2. セクター別(業種分類)の可視化


🧠 この先では、各銘柄に業種ラベルを付け、業種ごとに配当利回りの傾向を分析していきます。
→ この業種ラベルや可視化テンプレートは、有料Note部分で詳しく解説します。

✅ 次のSTEPでの成果

  • ティッカーごとの「実質 vs 現状」利回りが一目でわかるグラフに!

この記事が「役立った!」「面白かった!」という方、
ぜひ有料パート(100円〜)でのご支援・再利用テンプレのご購入をお願いします 🙏

👉【有料パートはこちら】ダッシュボードテンプレ&業種辞書つき🔓

【STEP 6】業種ラベルの付与とグループ分析

6-1. セクター辞書の用意
以下のような辞書を sector_dict として定義します(例):

ここから先は

4,640字 / 1画像

¥ 300

Amazon Payで支払うと最大2%還元のチャンス! 9/30まで

よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!