Python×スプレッドシートで株の企業分析を自動化!効率的な構築術

「株価のチェックだけで一日が終わってしまう」「効率的に有望銘柄を見つけたい」

そんな悩みを効率的に解決するために、まずは銘柄情報をPythonで自動取得します。

本記事では、JPX(日本取引所グループ)の全銘柄データを取得し、RSIなどの指標を自動計算してスプレッドシートへ集約する、実践的なコードと構築手順を公開します。

※免責事項: 本記事は技術解説を目的としています。投資にはリスクが伴います。最終的な投資判断は必ずご自身で行ってください。

結論:効率化の鍵は「自動化」と「データの分離」

全銘柄を毎日フルスキャンすると、処理時間が膨大になりAPI制限にもかかります。

  1. 週次: 全銘柄リストの更新(基本情報の整理)
  2. 日次: フィルタリングした銘柄のテクニカル計算この2段階に分けることで、高速かつ正確な分析基盤が完成します。

環境構築とライブラリの準備

PythonでExcel操作やGoogle API連携を行うため、まずは以下のコマンドで必要なライブラリを揃えましょう。

Bash

pip install pandas xlrd openpyxl gspread oauth2client yfinance

特に xlrd は、JPXの公式サイトから銘柄リスト(xls形式)を読み込む際に必須となります。


【実践】株分析自動化のPythonコード

以下のコードは、データの取得・計算・スプレッドシート出力を一貫して行います。NaN(非数値)エラー対策も盛り込んだ実戦用です。

import pandas as pd
import yfinance as yf
import gspread
from google.oauth2.service_account import Credentials
import time

# --- 基本設定 ---
JSON_FILE = 'service_account.json'  # API認証キー
SHEET_NAME = 'Stock_Analysis_Master'
SCOPES = ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive']

def get_gspread_client():
    creds = Credentials.from_service_account_file(JSON_FILE, scopes=SCOPES)
    return gspread.authorize(creds)

def get_jpx_master():
    """全銘柄リストを取得(週次更新を想定)"""
    url = "JPXのエクセルリンク"
    df = pd.read_excel(url)
    return df[['コード', '銘柄名', '市場・商品区分', '33業種区分']]

def calculate_rsi(series, period=14):
    """RSI(相対力指数)の計算"""
    delta = series.diff()
    gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()
    loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean()
    rs = gain / loss
    return 100 - (100 / (1 + rs))

def main():
    client = get_gspread_client()
    print("データ取得開始...")
    
    # 銘柄リスト取得(テスト用に上位50件)
    master_df = get_jpx_master().head(50) 
    analysis_results = []
    
    for _, row in master_df.iterrows():
        ticker = f"{row['コード']}.T"
        try:
            stock = yf.Ticker(ticker)
            hist = stock.history(period="1mo")
            if len(hist) < 15: continue

            # 指標計算
            rsi = calculate_rsi(hist['Close']).iloc[-1]
            current_price = hist['Close'].iloc[-1]
            
            # エラー対策:NaNを0に置換
            rsi = 0 if pd.isna(rsi) else rsi
            
            # 簡易判定(押し目買いフィルタ)
            status = "注目" if rsi <= 35 else "通常"
            
            analysis_results.append([row['コード'], row['銘柄名'], row['市場・商品区分'], current_price, rsi, status])
            time.sleep(1) # 負荷軽減
        except Exception as e:
            print(f"Error {ticker}: {e}")

    # スプレッドシート出力
    output_df = pd.DataFrame(analysis_results, columns=['コード', '名称', '市場', '価格', 'RSI', '判定'])
    try:
        sh = client.open(SHEET_NAME)
    except gspread.SpreadsheetNotFound:
        sh = client.create(SHEET_NAME)

    worksheet = sh.get_worksheet(0)
    worksheet.clear()
    worksheet.update([output_df.columns.values.tolist()] + output_df.values.tolist())
    print("更新完了!")

if __name__ == "__main__":
    main()

よくある失敗と対策

構築中に遭遇しやすいエラーの解決策をまとめました。

  • APIError [403]: Drive API has not been used…Google Cloud Consoleで「Google Drive API」と「Google Sheets API」の両方を有効化してください。
  • ImportError: Missing optional dependency ‘xlrd’JPXのリスト読み込みに必要です。pip install xlrd を実行しましょう。
  • Out of range float values (NaN)計算に必要なデータが足りない場合に発生します。コード内の pd.isna() チェックで回避可能です。

市場区分と規模の基礎知識

分析対象を絞るために、日本の市場区分を理解しておきましょう。

市場区分特徴狙い目
プライム大企業中心・高流動性安定配当、大型株
スタンダード中堅企業・一定の流動性割安成長株
グロース高い成長意欲・高リスクテンバガー候補

よくある質問(FAQ)

Q1:service_account.json はどこに置く?

A1:Pythonスクリプトと同じフォルダに保存してください。

Q2:スプレッドシートが自分のドライブに見当たりません。

A2:サービスアカウントが作成したシートはデフォルトでは非表示です。スクリプト内で sh.share('自分のメール', perm_type='user', role='writer') を追加するか、手動で共有設定を行ってください。

Q3:全銘柄を一度に取得しても大丈夫?

A3:約4,000社を一度に回すと数時間かかり、途中でエラーになる可能性が高いです。市場ごとに分割して実行することをおすすめします。

Q4:Geminiとの連携はどうする?

A4:スプレッドシートに書き出した「判定:注目」の銘柄コードをGeminiに渡し、「この企業の最新の決算短信を分析して」と依頼するフローが効率的です。

Q5:Mac/Windowsどちらでも動く?

A5:はい、Python環境があればどちらでも動作します。


まとめ

  1. 環境整備: PythonとGoogle APIの設定を済ませる。
  2. 自動収集: 銘柄リストと株価をスクリプトで一括取得。
  3. 指標計算: RSIなどで機械的に銘柄をフィルタリング。

コメント

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