MENU

Python × Googleスプレッドシートで配当金管理を自動化!初心者向けステップガイド

目次

はじめに:この仕組みでできること

株の配当金について、手動で追うのは大変ですよね。アプリだと最近の銘柄が追加されていなかったり、スクロールが大変だったりするため、なるべく自動で更新してくれて、見やすいような仕組みを作成していこうと思います。

ここでは Python と Googleスプレッドシートを使って、最新の配当金や株価を自動で取得し、更新できるようにします。

参考として、実際に私が利用しているスプレッドシートのテンプレートを共有しておきます。

今回自動で取得する範囲は以下となります。ティッカーを入力してPythonスクリプトを実行することで、以下の情報をスプレッドシートに自動で入力してくれるようにします。

手順の概要

今回配当金の情報取得を自動化するために実施する手順の概要は、以下となります。

STEP
Google CloudでAPIを有効化し、認証情報を取得
  • Google Cloud Console にログイン
  • プロジェクトを作成
  • Google Sheets API と Google Drive API を有効化
  • サービスアカウントを作成
  • 「認証情報」として JSON形式の credentials.jsonをダウンロード
STEP
Googleスプレッドシートを作成、サービスアカウントを共有
  • Googleスプレッドシートを新規作成(名前は例:配当金シート)
  • A1列にヘッダー(ティッカー)を入力
  • Google Cloud の認証ファイルにあるメールアドレスをこのシートに「編集者」として共有
STEP
Python環境を準備し、必要ライブラリをインストール
STEP
Pythonスクリプトを設定
  • Finance.py としてPythonファイルを作成
  • 上記ライブラリを使って,yfinanceで配当金,gspreadでGoogle Sheets連携
  • A列に入力されたティッカーをもとに,最新の配当金,株価,配当月,利回りを算出
STEP
スプレッドシートにティッカーを入力し、実行
  • A2以降に例:AAPL, MSFT, KOなどを入力
  • スクリプトを実行すると,対応するB列以降に配当情報が自動表示

Step 1:Google Cloudで認証情報を取得

① Google Cloud Console にアクセス

Google Cloud Console にアクセスし、Googleアカウントでログインします。

② プロジェクトを作成

  1. 左上の「≡ メニュー」から「IAMと管理」→「プロジェクトを作成」を選択
  2. 任意のプロジェクト名(例:配当金管理)を入力して作成

左上のメニューを選択

プロジェクト名に任意の名前を入力して、作成をクリック

③ API を有効化

  1. 「APIとサービス」→「ライブラリ」を開く
  2. 「Google Sheets API」と「Google Drive API」を検索して有効化します

左上のメニューを選択

「APIとサービス」⇒「ライブラリ」の順番でクリックします。

「Google Sheets API」と「Google Drive API」をそれぞれ検索して、有効化していきます。

④ サービスアカウントを作成

  1. 「IAMと管理」→「サービスアカウント」から「サービスアカウントを作成」をクリック
  2. 名前(例:spreadsheet-access)を入力し、「作成して続行」
  3. 権限はそのままスキップして完了

「IAMと管理」⇒「サービスアカウント」の順番でクリックします。

「+サービスアカウントを作成」をクリックします。

サービスアカウント名を入力して、作成して続行をクリックします。

(サービスアカウントIDは、アカウント名を入力すると自動で入力されます。)

権限については、今回は設定不要のためスキップして、そのまま完了をクリックします。

作成したアカウントが表示されていることを確認します。

⑤ JSON形式の認証ファイルをダウンロード

  1. 作成されたサービスアカウントの詳細画面を開く
  2. 「鍵」タブ → 「鍵を追加」 → 「新しい鍵を作成」 → JSON を選択してダウンロード
    credentials.json という名前で保存します

🔒 ダウンロードされたJSONファイルは絶対に他人に共有しないよう注意してください!

作成したアカウントをクリックします。

上のタブで、「鍵」をクリックします。

次に表示された「キーを追加」⇒「新しい鍵を作成」の順番でクリックします。

キーのタイプはJSONを選択して、作成をクリックします。

秘密鍵が作成され、ダウンロードフォルダにファイルが格納されます。

ダウンロードされた鍵情報が記載されたファイルは、後ほどcredentials.json としてPythonスクリプトと同じフォルダに保存して利用します。

Step 2:Googleスプレッドシートを作成、共有

  • Googleスプレッドシート にアクセスして、新しいスプレッドシートを作成します。
  • スプレッドシートの名前を「配当金管理」に設定します。
  • A1 セルに「ティッカー」、B1 に「最新配当金」など、必要なヘッダーを入力しておきます。
  • Step 1で作成したサービスアカウントのメールアドレス(xxx@project-id.iam.gserviceaccount.com 形式)を、スプレッドシートの「共有」から「編集者」として追加します。
  • これにより、Pythonスクリプトがスプレッドシートを読み書きできるようになります。

Step 3:Python環境を準備し、ライブラリをインストール

Python がインストールされていない場合は、公式サイト からインストールしてください。インストール後、以下のコマンドを実行します:

上記のコマンドで以下のライブラリがインストールされます:

  • yfinance: 株価や配当金データを取得するため
  • gspread: Googleスプレッドシートを操作するため
  • oauth2client: Google認証用ライブラリ

インストールが完了したら、次のステップでスクリプトを作成していきます。

Step 4:Pythonスクリプトの設定

Finance.py としてPythonファイルを作成

以下のコードをコピーして、Finance.pyという名前で保存します。

ファイルを格納するフォルダは任意のフォルダをで問題ありません。

import gspread
from oauth2client.service_account import ServiceAccountCredentials
import yfinance as yf
import pandas as pd
from datetime import datetime, timezone, timedelta
import re

# Google Sheets 認証
scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
creds = ServiceAccountCredentials.from_json_keyfile_name("credentials.json", scope)
client = gspread.authorize(creds)

# スプレッドシートを開く
spreadsheet = client.open("配当金管理")  # スプレッドシート名
worksheet = spreadsheet.sheet1

# ティッカー取得(1行目除外)
tickers = worksheet.col_values(1)[1:]

# ヘッダー更新
headers = [["企業名", "最新配当金", "年間配当", "配当月", "株価", "利回り"]]
worksheet.update(values=headers, range_name="B1:G1")

def validate_ticker(ticker):
    """ティッカーシンボルの検証
    Returns:
        tuple: (valid_ticker, is_japanese)
        - valid_ticker: 検証済みのティッカーシンボル
        - is_japanese: 日本株の場合はTrue
    """
    # 空白を除去して大文字に変換
    ticker = ticker.strip().upper()
    
    # 日本株のパターン(4桁の数字、.Tの有無は問わない)
    if re.match(r'^\d{4}(\.T)?$', ticker):
        # .Tが付いていない場合は追加
        if not ticker.endswith('.T'):
            ticker = f"{ticker}.T"
        return ticker, True
    
    # 米国株のパターン(大文字アルファベットのみ)
    if re.match(r'^[A-Z]+$', ticker):
        return ticker, False
    
    return None, None

def get_exchange_rate():
    """USD/JPYの為替レートを取得"""
    try:
        usdjpy = yf.Ticker("JPY=X")
        rate = usdjpy.info.get("regularMarketPrice", 0)
        return rate
    except Exception as e:
        print(f"為替レートの取得に失敗: {str(e)}")
        return 0

# 為替レートを取得
exchange_rate = get_exchange_rate()
print(f"現在の為替レート: 1USD = {exchange_rate}JPY")

data = []

for idx, ticker in enumerate(tickers, start=2):
    try:
        # ティッカーシンボルの正規化と検証
        valid_ticker, is_japanese = validate_ticker(ticker)
        
        if not valid_ticker:
            print(f"無効なティッカーシンボル: {ticker} (日本株: 4桁の数字、米国株: 大文字アルファベット)")
            data.append(["無効なティッカー", "", "", "", "", ""])
            continue
        
        print(f"Processing {valid_ticker} ({'日本株' if is_japanese else '米国株'})...")
        
        stock = yf.Ticker(valid_ticker)
        info = stock.info
        
        # 企業名の取得(日本語名を優先)
        name = info.get("longName", info.get("shortName", "不明"))
        
        # 株価の取得
        price = info.get("currentPrice", 0)
        
        # 配当金の取得
        dividends = stock.dividends
        if not dividends.empty:
            # 最新の配当金(ilocを使用)
            latest_div = dividends.iloc[-1]
            
            # 過去1年間の配当金合計
            one_year_ago = datetime.now(timezone.utc) - timedelta(days=365)
            annual_div = dividends[dividends.index >= one_year_ago].sum()
            
            # 配当月(重複除去)
            months = ",".join(str(m) for m in sorted(set([i.month for i in dividends.index])))
        else:
            latest_div = 0
            annual_div = 0
            months = "-"
        
        # 日本株の場合、配当金をドルに変換
        if is_japanese and exchange_rate > 0:
            latest_div = latest_div / exchange_rate
            annual_div = annual_div / exchange_rate
        
        # 利回り計算
        yield_ratio = f"{round((annual_div / price) * 100, 2)}%" if price else "-"
        
        # データを追加
        data.append([
            name,
            round(latest_div, 2),
            round(annual_div, 2),
            months,
            round(price, 2),
            yield_ratio
        ])
        
    except Exception as e:
        print(f"Error processing {ticker}: {str(e)}")
        data.append(["取得失敗", "", "", "", "", ""])

# スプレッドシートに出力(新しい構文を使用)
if data:
    worksheet.update(values=data, range_name="B2")

Finance.py と同じフォルダに、Step1⑤でダウンロードしたファイルをcredentials.jsonとして保存

Finance.pyを保存出来たら、Step1⑤でダウンロードした鍵情報が保存されたファイルを「credentials.json」という名前で同じフォルダに保存します。

Step 5:スプレッドシートにティッカーを入力,実行

  • A2以降に例:AAPL, MSFT, KOなどを入力
  • 以下のコマンドで、スクリプトを実行すると,対応するB列以降に配当情報が自動表示

Pythonスクリプトを実行することで、作成したスプレッドシートに以下の情報が自動で入力されるはずです。

スクリプトを実行すると以下のように、APIで情報を取得しているログが表示されます。
D:\02_PG_Project\02_Tool\11_配当金>python Finance.py
D:\02_PG_Project\02_Tool\11_配当金\Finance.py:14: DeprecationWarning: The order of arguments in worksheet.update() has changed. Please pass values first and range_name secondor used named arguments (range_name=, values=)
worksheet.update(“B1”, [[“企業名”]])

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

・属性
アラサーの社会人
・職業
ネットワーク屋さん
・好きなもの
おはぎ/投資/猫
ずっと猫を撫でてもお金に困らないくらい配当金が欲しい。

コメント

コメントする

目次