「株価のチェックだけで一日が終わってしまう」「効率的に有望銘柄を見つけたい」
そんな悩みを効率的に解決するために、まずは銘柄情報をPythonで自動取得します。
本記事では、JPX(日本取引所グループ)の全銘柄データを取得し、RSIなどの指標を自動計算してスプレッドシートへ集約する、実践的なコードと構築手順を公開します。
※免責事項: 本記事は技術解説を目的としています。投資にはリスクが伴います。最終的な投資判断は必ずご自身で行ってください。
結論:効率化の鍵は「自動化」と「データの分離」
全銘柄を毎日フルスキャンすると、処理時間が膨大になりAPI制限にもかかります。
- 週次: 全銘柄リストの更新(基本情報の整理)
- 日次: フィルタリングした銘柄のテクニカル計算この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環境があればどちらでも動作します。
まとめ
- 環境整備: PythonとGoogle APIの設定を済ませる。
- 自動収集: 銘柄リストと株価をスクリプトで一括取得。
- 指標計算: RSIなどで機械的に銘柄をフィルタリング。


コメント