- なぜ日本株スクリーニングを自動化する価値があるのか
- まず決めるべきは「何を探すのか」
- ChatGPTに任せる部分と任せてはいけない部分
- 必要なデータ項目を設計する
- スクリーニング条件の基本形
- PythonでCSVを読み込む基本コード
- 初心者がつまずくデータ整形のポイント
- スコアリングで銘柄を順位付けする
- 独自性を出すなら「変化率」に注目する
- 具体例:候補リストを30銘柄に絞る流れ
- ChatGPTで分析メモを自動生成する
- スクリーニング結果を毎週更新する仕組み
- 監視リストに入れる前のチェック項目
- 失敗しやすいスクリーニングの罠
- 自分だけの優位性を作る方法
- 実運用フローの完成形
- まとめ:AIとPythonで投資の作業量を減らし、判断の質を上げる
なぜ日本株スクリーニングを自動化する価値があるのか
日本株には上場企業が数千社あります。すべての決算短信、チャート、ニュース、適時開示を人力で追い続けるのは現実的ではありません。多くの個人投資家が陥る失敗は、話題になった銘柄だけを後追いし、すでに株価が大きく上がった後で「まだ上がるかもしれない」と飛びつくことです。これは投資というより、情報の最後尾に並ぶ行為に近いです。
そこで有効なのが、ChatGPTとPythonを組み合わせたスクリーニングの自動化です。Pythonは大量のデータを機械的に処理するのが得意です。一方、ChatGPTは条件の設計、コードのたたき台作成、指標の意味整理、結果の読み解き補助に向いています。両者を使えば、「銘柄を探す作業」を感覚ではなく、再現性のある業務フローに変えられます。
重要なのは、自動化の目的を「当たり銘柄を一発で見つけること」と考えないことです。そんな魔法の仕組みはありません。実務的な目的は、膨大な銘柄群から明らかに条件に合わない企業を除外し、調査対象を数十社まで絞ることです。最後の判断は人間が行います。自動化は投資判断の代替ではなく、調査効率を上げるための前処理です。
まず決めるべきは「何を探すのか」
スクリーニングで最初にやるべきことは、ツールを選ぶことではありません。探したい銘柄像を明確にすることです。たとえば「割安株を探す」のか、「成長株を探す」のか、「需給が改善している銘柄を探す」のかで、見るべき指標はまったく違います。目的が曖昧なままPythonを書いても、ただ数字を並べるだけの表ができるだけです。
この記事では、実践的な例として「業績が伸びており、財務に大きな不安がなく、株価も市場に評価され始めている日本株」を探すスクリーニングを想定します。つまり、ファンダメンタルと株価モメンタムを組み合わせた候補抽出です。単なる低PER銘柄ではなく、利益成長と市場評価の両方を確認します。
具体的には、次のような条件を使います。売上高成長率がプラス、営業利益成長率がプラス、自己資本比率が一定以上、営業利益率が一定以上、直近株価が200日移動平均線を上回っている、出来高が極端に少なくない。このような条件を組み合わせると、業績だけは良いが流動性が低すぎる銘柄や、割安に見えるが株価が下落トレンドの銘柄をある程度除外できます。
ChatGPTに任せる部分と任せてはいけない部分
ChatGPTは便利ですが、投資スクリーニングにおいて万能ではありません。特に、最新の株価、決算数値、時価総額、信用残などのデータそのものをChatGPTの記憶に頼るのは危険です。市場データは常に変化します。したがって、数値データは必ず証券会社、取引所、企業開示、金融情報サービス、CSVで取得したデータなど、外部の明確なデータソースから取得する必要があります。
一方で、ChatGPTが強いのは設計と翻訳です。たとえば「売上成長率、営業利益率、自己資本比率、株価の移動平均乖離率を使って銘柄をスコアリングしたい」と伝えれば、指標の整理、Pythonコードの雛形、注意点、異常値処理の考え方を出せます。Excelで手作業していた投資家にとって、これはかなり大きな時短になります。
実務では、ChatGPTを「投資助言者」としてではなく、「投資リサーチ業務のアシスタント」として使うのが正解です。銘柄の買い推奨を求めるのではなく、「このCSVを読み込んで条件に合う銘柄を抽出するコードを書いて」「欠損値がある場合の処理を追加して」「スコア順にランキング化して」といった使い方をします。この距離感を間違えないことが、AI活用の実用性を大きく左右します。
必要なデータ項目を設計する
最初から完璧なデータベースを作る必要はありません。個人投資家が始めるなら、まずはCSVファイル1つで十分です。最低限ほしい項目は、証券コード、銘柄名、業種、時価総額、売上高、営業利益、純利益、自己資本比率、PER、PBR、配当利回り、終値、出来高、25日移動平均、75日移動平均、200日移動平均あたりです。
さらに一歩進めるなら、前期売上高、前期営業利益、会社予想営業利益、直近四半期売上高、直近四半期営業利益も加えると、成長率や上方修正の兆候を見やすくなります。これらを手入力する必要はありません。利用している情報サービスからCSVを出力できるなら、それをPythonで読み込みます。CSV出力ができない場合でも、最初は数十銘柄の手動リストから始めれば十分です。
大切なのは、データ項目を増やしすぎないことです。項目が多いほど精密に見えますが、初心者ほど管理できなくなります。まずは「業績」「財務安全性」「株価トレンド」「流動性」の4分類に絞るべきです。この4つが揃っていれば、少なくとも候補銘柄の一次選別としては機能します。
スクリーニング条件の基本形
ここでは実用的な条件例を示します。まず、売上高成長率が5%以上。営業利益成長率が10%以上。営業利益率が5%以上。自己資本比率が30%以上。終値が200日移動平均線を上回っている。平均出来高が一定以上。時価総額が小さすぎない。これらを満たす銘柄を抽出するだけでも、かなり候補は絞られます。
ただし、条件を厳しくしすぎると候補がほとんど出ません。たとえば営業利益成長率30%以上、営業利益率15%以上、自己資本比率60%以上、PER15倍以下、200日線上、出来高急増という条件を同時に満たす銘柄は少なくなります。良い銘柄を探すつもりが、単に過剰フィルターで市場を見なくなる可能性があります。
実務では、最初にゆるい条件で100〜300銘柄程度に絞り、その後スコアリングで順位付けする方が使いやすいです。フィルターは「足切り」、スコアリングは「優先順位付け」と考えると整理しやすくなります。足切りで候補を消しすぎると、意外な成長株を見逃します。
PythonでCSVを読み込む基本コード
Pythonでは、pandasというライブラリを使うとCSVを簡単に扱えます。たとえば、stock_data.csvというファイルに銘柄データが入っている場合、読み込み、成長率を計算し、条件に合う銘柄を抽出する流れは比較的シンプルです。
import pandas as pd
df = pd.read_csv("stock_data.csv")
df["sales_growth"] = (df["sales"] - df["sales_prev"]) / df["sales_prev"] * 100
df["op_growth"] = (df["operating_profit"] - df["operating_profit_prev"]) / df["operating_profit_prev"] * 100
df["price_above_200ma"] = df["close"] > df["ma200"]
screened = df[
(df["sales_growth"] >= 5) &
(df["op_growth"] >= 10) &
(df["operating_margin"] >= 5) &
(df["equity_ratio"] >= 30) &
(df["price_above_200ma"]) &
(df["volume"] >= 50000)
]
screened.to_csv("screened_stocks.csv", index=False, encoding="utf-8-sig")
このコードはあくまで基本形です。実際には列名が日本語だったり、カンマ区切りの数値が文字列として読み込まれたり、欠損値が混じったりします。そのため、実運用ではデータクリーニングが必要になります。ここを軽視すると、ランキング結果が簡単に歪みます。
初心者がつまずくデータ整形のポイント
日本株データを扱うときに多い問題は、数値が文字列として読み込まれることです。たとえば「1,250」「12.5%」「-」のような表記が混ざると、そのままでは計算できません。Pythonで処理する前に、カンマを削除し、%を削除し、欠損値をNaNとして扱う必要があります。
def clean_number(x):
if pd.isna(x):
return None
x = str(x).replace(",", "").replace("%", "").replace("-", "")
if x.strip() == "":
return None
return float(x)
for col in ["sales", "sales_prev", "operating_profit", "operating_profit_prev", "equity_ratio", "operating_margin"]:
df[col] = df[col].apply(clean_number)
このような地味な処理こそ、自動化の成否を分けます。きれいなデータだけを前提にしたスクリーニングは、実戦ではすぐに壊れます。銘柄データには赤字企業、前期営業損失、上場直後で前期データがない企業、決算期変更企業などが混ざります。これらをどう扱うかをあらかじめ決めておく必要があります。
たとえば前期営業利益がマイナスで今期黒字化した企業は、営業利益成長率の計算が難しくなります。単純な増減率では異常値になります。この場合は「黒字転換フラグ」を別に作り、通常の成長率ランキングとは分けて見る方が実務的です。数字を自動計算するだけでなく、例外処理の設計が重要です。
スコアリングで銘柄を順位付けする
単純な条件抽出だけでは、候補が横並びになります。そこでスコアリングを使います。たとえば、売上成長率、営業利益成長率、営業利益率、自己資本比率、200日移動平均線からの乖離率、出来高増加率をそれぞれ点数化し、合計点でランキングします。
ただし、単純に数値を足してはいけません。売上成長率50%と自己資本比率50%は同じ「50」ですが、意味が違います。そこで順位に変換してスコア化する方法が使いやすいです。各指標で順位をつけ、上位ほど高得点にします。これなら単位の違いをある程度吸収できます。
metrics = ["sales_growth", "op_growth", "operating_margin", "equity_ratio", "volume_growth"]
for m in metrics:
df[m + "_rank"] = df[m].rank(ascending=False, pct=True)
df["trend_score"] = (df["close"] / df["ma200"] - 1) * 100
df["trend_rank"] = df["trend_score"].rank(ascending=False, pct=True)
df["total_score"] = (
df["sales_growth_rank"] * 0.20 +
df["op_growth_rank"] * 0.25 +
df["operating_margin_rank"] * 0.15 +
df["equity_ratio_rank"] * 0.15 +
df["volume_growth_rank"] * 0.10 +
df["trend_rank"] * 0.15
)
ranking = df.sort_values("total_score", ascending=False)
この例では営業利益成長率をやや重視しています。理由は、売上だけ伸びても利益が伸びない企業は、コスト増や競争激化に弱い可能性があるからです。一方で、財務安全性や株価トレンドも無視しません。成長性だけに偏ると、資金繰りに不安がある企業や下落トレンド中の企業を拾いやすくなります。
独自性を出すなら「変化率」に注目する
多くの投資家はPER、PBR、配当利回りといった静的な指標を見ます。もちろん重要ですが、それだけでは市場の先回りは難しいです。独自性を出すなら、現時点の水準だけでなく「変化率」を重視するべきです。
たとえば営業利益率が3%から6%に改善した企業と、もともと15%で横ばいの企業では、株価の反応が違う場合があります。前者は市場がまだ変化に気づいていない可能性があります。絶対水準では見劣りしても、改善速度が速い企業は再評価の初動になりやすいです。
スクリーニングでは、営業利益率そのものに加えて、営業利益率の前年差を入れると面白くなります。たとえば「営業利益率が2ポイント以上改善」「売上総利益率が改善」「販管費率が低下」といった条件です。これは単なる成長株探しではなく、企業体質の変化を探すアプローチです。
df["margin_improvement"] = df["operating_margin"] - df["operating_margin_prev"]
df["change_score"] = (
df["margin_improvement"].rank(ascending=False, pct=True) * 0.5 +
df["op_growth"].rank(ascending=False, pct=True) * 0.5
)
このように、既存の有名指標をそのまま使うだけでなく、自分なりの仮説に合わせて加工指標を作ることが重要です。Pythonの価値は、まさにここにあります。証券会社の標準スクリーナーでは作れない条件を、自分の投資仮説に合わせて組めます。
具体例:候補リストを30銘柄に絞る流れ
実際の運用では、まず全銘柄データを取得し、流動性の低すぎる銘柄を除外します。たとえば平均出来高が1万株未満の銘柄は、売買しにくく、スプレッドも広がりやすいため、最初は除外してよいでしょう。次に、売上または営業利益が伸びている銘柄を残します。さらに、自己資本比率や営業キャッシュフローを確認し、財務面の危険度を下げます。
その後、スコアリングで上位50銘柄程度を抽出します。ここで終わりではありません。上位銘柄の決算短信、月次資料、中期経営計画、セグメント情報、株主構成を確認します。Pythonでできるのは候補の抽出までです。なぜ数字が良くなっているのか、成長が一過性なのか継続的なのかは、人間が読む必要があります。
たとえば営業利益が急増していても、理由が一時的な補助金、為替差益、不採算事業の売却益であれば、継続性は弱いです。一方で、主力事業の価格改定、稼働率改善、サブスク比率上昇、海外売上拡大による利益率改善であれば、再評価余地が出る可能性があります。この差を見極めるために、候補リストを30銘柄程度まで絞るのが現実的です。
ChatGPTで分析メモを自動生成する
候補銘柄が出たら、次は分析メモを作ります。ここでもChatGPTが役立ちます。Pythonで抽出したCSVから、銘柄ごとの指標をテキスト化し、「この銘柄の強み、弱み、確認すべきポイントを整理して」と依頼します。ただし、入力する数値は自分で取得したデータを使います。
たとえば、次のようなプロンプトが実用的です。
以下の銘柄データをもとに、投資候補として確認すべきポイントを整理してください。
買い推奨ではなく、調査メモとして作成してください。
重視する観点は、売上成長、営業利益率改善、財務安全性、株価トレンド、注意点です。
証券コード: 0000
銘柄名: サンプル株式会社
売上成長率: 12.4%
営業利益成長率: 28.1%
営業利益率: 8.6%
営業利益率前年差: +2.1pt
自己資本比率: 54.0%
終値/200日移動平均: +18.5%
出来高増加率: 1.7倍
この使い方なら、ChatGPTは数値から構造化されたメモを作る補助役になります。ポイントは、結論を丸投げしないことです。「買うべきか」ではなく、「何を確認すべきか」を出させる方が有用です。投資家としての判断軸を保ちながら、作業時間を短縮できます。
スクリーニング結果を毎週更新する仕組み
一度コードを作ったら、毎週同じ手順で更新します。金曜引け後または週末にデータを取得し、Pythonを実行し、ランキングCSVを出力します。前週順位と今週順位を比較すれば、新しく浮上した銘柄がわかります。この「順位変化」は非常に重要です。
多くの投資家は上位銘柄だけを見ます。しかし、実際に面白いのは、前週圏外から急に上位へ入ってきた銘柄です。これは決算、出来高、株価トレンド、利益率改善など、何らかの変化が起きた可能性があります。つまり、スクリーニングの目的は「良い銘柄一覧」を作ることではなく、「変化が起きた銘柄を検知すること」です。
current = pd.read_csv("ranking_this_week.csv")
previous = pd.read_csv("ranking_last_week.csv")
merged = current.merge(
previous[["code", "rank"]],
on="code",
how="left",
suffixes=("_current", "_previous")
)
merged["rank_change"] = merged["rank_previous"] - merged["rank_current"]
watch = merged.sort_values("rank_change", ascending=False)
このように前週比較を入れると、投資アイデアの鮮度が上がります。固定的なランキングよりも、変化を検知するランキングの方が実戦向きです。株価は将来の変化を織り込みにいくため、静止画ではなく動画で見る感覚が必要です。
監視リストに入れる前のチェック項目
スクリーニングで上位に出たからといって、すぐに売買する必要はありません。まず確認すべきは、業績の中身です。売上成長が値上げによるものか、販売数量増によるものか、新規事業によるものかで評価は変わります。営業利益率改善も、原価低下なのか、広告費削減なのか、不採算事業撤退なのかを見ます。
次に、株価位置を確認します。すでに短期間で大きく上昇している場合、好材料をかなり織り込んでいる可能性があります。逆に、業績は良いのに株価がほとんど反応していない場合は、流動性不足、知名度不足、次回決算への不信感などの理由があるかもしれません。この理由を探す作業が投資家の仕事です。
さらに、時価総額と出来高を確認します。時価総額が小さい銘柄は上昇余地が大きい一方で、値動きが荒くなります。出来高が薄い銘柄は、買うときよりも売るときに困ることがあります。スクリーニングでは見栄えが良くても、自分の資金量に対して流動性が足りない銘柄は避けた方が無難です。
失敗しやすいスクリーニングの罠
第一の罠は、過去データに合わせすぎることです。条件を細かく調整して過去の大化け株が抽出されるようにしても、将来も同じ条件が機能するとは限りません。これはバックテストの過剰最適化です。個人投資家の場合、精密すぎるモデルより、多少粗くても継続的に使えるルールの方が強いです。
第二の罠は、指標の重複です。売上成長率、営業利益成長率、EPS成長率、ROE改善をすべて入れると、一見多面的に見えますが、実際には似た情報を何度も評価している場合があります。成長性、収益性、安全性、需給、トレンドというように、役割の違う指標を組み合わせる方がバランスは良くなります。
第三の罠は、スクリーニング結果を過信することです。Pythonで出したランキングは、あくまで入力データと条件の結果です。データが古い、列がズレている、特殊要因を除外していない、決算期変更を考慮していない場合、結果は簡単に歪みます。自動化するほど、最終確認の重要性は上がります。
自分だけの優位性を作る方法
多くの投資家が同じ情報を見ている以上、単純なPERやPBRのスクリーニングだけで優位性を作るのは難しくなっています。そこで重要になるのが、標準データに自分独自の加工を加えることです。たとえば、営業利益率改善幅、出来高変化率、上方修正回数、月次売上の加速度、採用人数の増加、店舗数の増減などです。
特に個人投資家に向いているのは、ニッチな中小型株の変化を拾うことです。大型株は機関投資家やアナリストが常に見ています。一方で、時価総額が小さく、出来高もほどほどの企業は、変化が起きても市場に浸透するまで時間がかかることがあります。ここに個人投資家の余地があります。
たとえば、営業利益率が3期連続で改善し、会社予想が保守的で、出来高がじわじわ増え、株価が200日線を上回り始めた企業があったとします。このような銘柄は、派手なテーマ株ではなくても、再評価の初動にある可能性があります。Pythonでこのパターンを定期検知できれば、ニュースを追いかけるだけの投資から一歩抜け出せます。
実運用フローの完成形
最終的な運用フローはシンプルです。まず週末に最新データをCSVで取得します。次にPythonでデータを整形し、成長性、安全性、収益性、流動性、トレンドを計算します。その後、足切り条件で対象を絞り、スコアリングでランキングを作ります。上位銘柄と順位急上昇銘柄を抽出し、ChatGPTで分析メモの下書きを作ります。最後に、人間が決算資料とチャートを確認して監視リストに入れるか判断します。
この流れを一度作れば、毎週の作業は大幅に短縮されます。重要なのは、スクリーニング条件を頻繁に変えすぎないことです。毎週条件を変えると、結果の変化が市場によるものなのか、自分の設定変更によるものなのかわからなくなります。最初は3か月ほど同じ条件で運用し、どのような銘柄が上がってくるかを観察するべきです。
また、ランキング上位に出た銘柄のその後を記録することも重要です。1か月後、3か月後、6か月後に株価がどう動いたかを確認すれば、自分のスクリーニング条件の癖が見えてきます。たとえば上昇初動は拾えるが天井圏も拾いやすい、好業績銘柄は拾えるが割高すぎる、低流動性銘柄に偏るなどの問題が見つかります。
まとめ:AIとPythonで投資の作業量を減らし、判断の質を上げる
ChatGPTとPythonを使った日本株スクリーニングは、個人投資家にとって非常に実用的な武器になります。ただし、それは「自動で儲かる仕組み」ではありません。価値があるのは、銘柄探しの手間を減らし、変化が起きた企業を早く見つけ、調査すべき対象を明確にする点です。
最初は難しく考える必要はありません。CSVを読み込む、成長率を計算する、条件で絞る、ランキングする。この4ステップだけでも十分に効果があります。慣れてきたら、営業利益率改善、出来高変化、前週順位との差、月次データなどを加えれば、より自分らしいスクリーニングに進化します。
投資で重要なのは、情報量そのものではなく、情報を処理する仕組みです。毎日ニュースに振り回されるより、毎週同じルールで市場全体を点検する方が、はるかに冷静な判断につながります。ChatGPTは考え方を整理する相棒、Pythonは作業を正確に繰り返すエンジンです。この2つを組み合わせれば、個人投資家でもプロのリサーチ業務に近い仕組みを低コストで構築できます。
まずは完璧なモデルを目指さず、10項目程度のCSVから始めてください。候補を抽出し、なぜその銘柄が上位に来たのかを確認し、結果を記録する。この地味な反復こそが、投資判断の精度を上げます。自動化の本質は、楽をして考えなくなることではありません。考えるべき銘柄に集中するために、考えなくてよい作業を機械に任せることです。

コメント