Python×株式投資：月利3〜5%を狙う自動スクリーニング戦略

# 相場の状況に応じて、銘柄選抜条件を使い分ける投資戦略

### 本記事の概要図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/57d30255-3556-47d5-b5fa-1cda15d2923d.png)

選抜条件を複数試し、安定して平均リターンが高い条件を見つけたい。

## はじめに
株式投資で安定した収益を目指すうえで、銘柄スクリーニングの自動化は効率的な手段のひとつです。 

前回は、証券アプリで1銘柄ずつテクニカル指標を確認する煩雑さを解消するため、Pythonによる自動スクリーニング処理のコードを紹介しました。

本記事はその続編として、  
「どのようなスクリーニング条件を使えば、安定して利益が出せるのか？」  
という問いの答えを、複数条件のバックテストを実施した結果をもとに考察します。

---
筆者自身、博士課程への進学資金（学費・生活費）を自力で確保する必要があり、株式投資の安定収益化をその手段のひとつと位置付けています。  
現時点の運用資金は100万円。ここから毎月3〜5万円（=月利3〜5%*）を副収入として積み上げていくことを目標にしています。

同じように、資産形成やお小遣いアップを目指している方にとって、  
実現可能なアプローチの例として参考になれば幸いです。

※「いやいや、それ詐欺でしょ」と思われるのも無理はありません。
それでも、実際にモデル構築 → 検証 →実運用 →改善 というサイクルを回してみると、さらなる工夫と根気は必要ですが、到達できそうな手応えはあります。


## 過去記事のまとめ（第0回〜第2.5回）

これまでの記事では、段階的な株式スクリーニングをPythonにより自動化し、安定した投資判断を実現するための仕組みを構築する様子を紹介してきました。

### 現在構築中の銘柄選抜モデルの全体像
![Screenshot 2025-05-16 at 12.53.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/f23c64b1-e8c4-4ad3-8008-b3d0fcc945da.png)

---
### 第0回  
**株価予測を始めた理由：D進に向けた資金づくり**

会社の研究だけじゃ物足りない。もっと研究したい。博士に進学したいが資金が足りない──そんな問題意識を背景に、株式投資を「収益化できる研究対象」として捉え直し、Pythonによる株価予測を始めた経緯を紹介した導入記事です。

▶ [D進したいが金がない。そうだ株価を予測しよう。](https://qiita.com/rS_alonewolf/items/679845e56bfa73d5dba9)

---
### 第1回  
**財務指標による1次スクリーニング**

東証プライム市場の約2000銘柄を対象に、財務的に優れた約200銘柄を選抜する方法を紹介しました：
▶ [財務指標による1次スクリーニング](https://qiita.com/rS_alonewolf/items/ba9dbbf7d6163f4435a5)

---

### 第2回  
**テクニカル指標による２次スクリーニングの自動化 ＋ 地合いスコア導入の検討**

1次スクリーニングを通過した銘柄に対して、

- RSI（相対力指数）
- 移動平均線の傾き・乖離

これらのテクニカル指標に基づき、  
複数の条件で選抜を行い、どの条件が安定した収益に繋がるのかをテストするコードを紹介しました。

また、適した選抜条件が、市場の相場（地合い）によって変わるのかどうかを調べるために、地合いを数値化（-3〜+3）した指標を、タグ付けしました。

実行時の挙動
![https---qiita-image-store.s3.ap-northeast-1.amazonaws.com-0-4066570-b398072f-40f0-43ee-914d-3008c0e4b288.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/c606109c-cbfe-477c-a3ea-2cc1a5cc77af.gif)

▶ [テクニカル分析による2次スクリーニングの自動化検討](https://qiita.com/rS_alonewolf/items/b53d2c61e81f263135da)

---

### 第2.5回  
**相場の“地合い”をスコア化する方法の詳細解説**

株価の動きは個別銘柄だけでなく、市場全体の相場に影響されると思います。そこで、TOPIX連動ETF（1306.T）をベースに毎日の地合いを-3〜+3の整数スコアに変換する方法を紹介しました。値が大きいほど、相場の上昇トレンドが維持されていることを意味します。

株価暴落時の地合いスコアの挙動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/37d3d55b-c47b-401e-b565-dc7c64ac437d.png)

▶ [今は買いか？それとも売りか？相場を数値化する地合いスコアの導入](https://qiita.com/rS_alonewolf/items/e0af595f634735a2b668)

---
### 第3回
**テクニカル選抜の有効性をバックテストで検証（本記事）**

- そもそも、今回作ったテクニカル選抜モデルでリターンは得られるのか？
- 実際に有効だったスクリーニング条件はどれか？
- 地合い（相場状況）によって、適した条件は変わるのか？

複数条件を過去のデータを用いて、バックテストで比較し、**安定したリターンにつながるパターンを探ります**。

※複数条件によるテクニカル選抜のコードは、第2回の記事に掲載済みです。今回は検証結果と考察を中心に紹介します。作図用のコードはご相談いただければ開示します。

---
## 使用データと検証設計

それでは、テクニカルスクリーニング条件の有効性を比較するために用いたデータと、バックテストの設計について説明します。

### 対象銘柄

検証対象としたのは、東証プライム市場に上場する約2000銘柄のうち、一定の財務基準を満たすものです（参考：第1回「財務スクリーニング」）。  
各スクリーニング日において、財務スクリーニングを通過した約200銘柄を対象にしています。

なお、前回記事では `yfinance` を用いた一義的な選抜条件を紹介しましたが、本記事のバックテストは、検証用にコードと取得元*を調整しています（詳細はご要望があれば開示可能です）。一定の基準を満たす銘柄をプライム全数の1/10ほどに選抜する仕様は変わりありません。

*2025年5月25日追記
yfinanceだけでは、過去の財務データは取得できません。
### 評価期間とスクリーニング日

検証に使用したスクリーニング実施日は、**2022年1月〜2024年9月**の範囲から、**各 地合いスコア（-3〜+3）ごとに5日ずつランダムに選出**しました。

例：

- スコア-3: `['2022-03-11', '2022-10-12', '2023-07-11', '2024-08-06', '2024-08-08']`  
- スコア-2: `['2022-03-01', '2022-04-25', '2022-06-14', '2022-10-03', '2023-07-13']`  
- スコア-1: `['2022-01-17', '2022-02-07', '2022-04-20', '2023-07-18', '2023-12-19']`  
- スコア  0: `['2022-08-10', '2023-08-08', '2023-09-25', '2024-04-11', '2024-07-23']`  
- スコア+1: `['2022-02-09', '2022-06-28', '2022-10-26', '2023-06-27', '2023-11-13']`  
- スコア+2: `['2022-07-29', '2023-06-12', '2023-06-29', '2023-07-04', '2024-06-06']`  
- スコア+3: `['2022-07-13', '2022-08-19', '2023-01-18', '2023-04-19', '2024-02-16']`  

各日付において、第2回記事で紹介したテクニカル選抜コードを使用し、複数のスクリーニング条件を適用して銘柄を選抜。選抜された各銘柄について、**スクリーニング日から30日、60日、90日後のリターン（終値の変化率％）**を算出しました。  
これらの値を比較することで、有望なスクリーニングパターンを検証しました。
本記事では、30日のデータのみに抜粋して紹介します。

### スクリーニングパターン
以下の16通りのスクリーニング条件を設定し、それぞれのパフォーマンスを比較しました。

株価が上昇傾向にあり、ゴールデンクロスに近づいているが、まだ買われすぎではない── そうした「伸びしろのある」タイミングを捉えるための条件を、RSIと移動平均線の位置関係を使ってパターン化したものです。

各パターンは主に以下の4つの指標の組み合わせによって構成されています。

#### 使用指標の説明*

- **RSI範囲（rsi_range）**  
  相対力指数（Relative Strength Index）の範囲です。RSIは買われすぎ・売られすぎを示す指標で、一般に30以下で割安、70以上で割高とされます。ここでは、指定したRSI範囲に株価がある銘柄を選定対象としています。
　
- **MA収束判定幅（ma_eps）**
3本の移動平均線（MA5・MA25・MA75）がどれだけ近づいているかを評価するための閾値です。たとえば「±2%」であれば、3本のMAが互いに±2%以内に収束しているものを抽出します。**これは、トレンド転換の兆候である「MAの収束＋短期線の上抜け（初動）」を捉えることを目的としています。**上昇トレンドが始まる直前には、MA同士が一時的に接近することが多いため、その構造に着目しています。
　
- **傾き評価期間（slope_period）**
最も敏感な短期移動平均線（MA5）の傾きを、何日間の変化で評価するかを示します。本検証では、5営業日で統一しており、直近5日間でMA5がどれだけ上昇しているかを見ています。
　
- **傾き下限（slope_thresh）**
上記の評価期間内でのMA5の傾き（＝上昇トレンドの強さ）を評価し、傾きが一定以上（たとえば+4%以上）ある場合に抽出対象とします。これにより、単なる収束ではなく「収束時に短期線（MA5）が上方向へ明確に動き出した」局面を抽出できます。

#### 今回の選抜で狙っている兆候の概要
RSIが高すぎない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/1bf7b600-f375-4d95-8d2b-44f28c76c179.png)


MAがゴールデンクロスしそう*
![株式投資　Python 移動平均　テクニカル分析　自動化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/7be34130-48a4-4da9-89b9-0e83fd316df7.png)

短期・中期・長期の3本の移動平均線（MA5・MA25・MA75）が収束し、最も反応の早いMA5が中長期の線を上抜けるタイミングは、上昇トレンドの始まりを示す重要なサインとされます。

*2025/05/17 MAに関して修正を加えました。

#### 検証したスクリーニングパターン
| パターン | RSI範囲  | MA乖離上限（ma_eps）| 傾き評価期間（slope_period）| 傾き下限（slope_thresh） |
|----------|---------------------------|------------------------|-------------------------------|---------------------------|
| 1     | 25〜50        | ±2%                   | 5日間                         | 4%                        |
| 2     | 25〜50        | ±4%                   | 5日間                         | 4%                        |
| 3     | 25〜50        | ±6%                   | 5日間                         | 4%                        |
| 4     | 25〜50        | ±8%                   | 5日間                         | 4%                        |
| 5     | 30〜60        | ±2%                   | 5日間                         | 4%                        |
| 6     | 30〜60        | ±4%                   | 5日間                         | 4%                        |
| 7     | 30〜60        | ±6%                   | 5日間                         | 4%                        |
| 8     | 30〜60        | ±8%                   | 5日間                         | 4%                        |
| 9     | 35〜70        | ±2%                   | 5日間                         | 4%                        |
| 10    | 35〜70        | ±4%                   | 5日間                         | 4%                        |
| 11    | 35〜70        | ±6%                   | 5日間                         | 4%                        |
| 12    | 35〜70        | ±8%                   | 5日間                         | 4%                        |
| 13    | 40〜75        | ±2%                   | 5日間                         | 4%                        |
| 14    | 40〜75        | ±4%                   | 5日間                         | 4%                        |
| 15    | 40〜75        | ±6%                   | 5日間                         | 4%                        |
| 16    | 40〜75        | ±8%                   | 5日間                         | 4%   

たくさんありますが、パターン4つごとに、RSIの範囲が変わっているだけです。MA乖離上限は4つごとに同じことを繰り返しています。

**各スクリーニング日には地合いスコア（-3〜+3）をタグ付け**しており、  
**これにより相場の状況によってどのパターンが機能しやすいのか**も、あわせて検証できます。

---
## テクニカル選抜の有効性について（バックテストの結果）
## 概要

1ヶ月後にプラスの平均リターン（3〜7%）を期待できるパターンが存在し、**有効性のあるテクニカル選抜条件が含まれている**と考えられました。  
また、**最適な選抜条件は地合いスコアによって異なる**ことが示唆されました。以下では、スコアごとに結果を整理します。

---

### ＜地合いスコア -3〜0＞

- 相場が最も悪い「スコア -3」のときは、**RSIが低め（25〜50）かつMA乖離上限（ma_eps）が4〜8%**のパターンで、  
  **シャープレシオが0.8以上、かつ銘柄数が20未満**のものが見られ、**実践向きの条件**として注目されました。これらの平均リターンは3%程度でした。
　
- スコア -2〜0 では、**RSIに関わらずMA乖離上限が±2%のパターン**が安定して高シャープレシオを示す傾向があり、厳しいスクリーニング条件が有効だったと推測されます。平均リターンは、3~7%でした。
　
- シャープレシオが高くないものも含みますが、全体的には、RSIが低めの時に平均リターンが高い傾向がありました。

### ＜地合いスコア 1〜3＞

- スコア0と2では、-3〜0と似た傾向がありました（平均リターン3~4%）が、**スコア1と3**のときには、**十分なシャープレシオ（≥0.8）を示す条件は見当たらず**、相場が過熱気味のときには、選抜が効きにくい可能性が示唆されました。

---

### 平均リターン
![Python　株　リターン　銘柄スクリーニング　自動化avg_return_highlighted.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/429d944e-b538-498e-afc6-63875736de19.png)

- 各スコアごとに5つのスクリーニング日を設定し、その**平均リターンをヒートマップで可視化**しています。
　  
- **★マーク**は、「シャープレシオが0.8以上かつ銘柄数が20未満」の条件に付与しており、  
  **リスクが低く、実際の投資や機械学習に用いる候補として有望なもの**です。

---

### 平均銘柄数
![Python 株価予測　銘柄選抜　投資　自動化　avg_stock_count_heatmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/a3a1d364-589b-483d-826d-805b2e728031.png)
- 1日あたりに選抜された銘柄の平均数を表示しています。
　  
  色が濃いほど多くの銘柄が通過しており、色が薄いほど**スクリーニング条件が厳しいことを示唆**します。
　
- **MA乖離が小さいパターンほど選抜銘柄数が少なくなりやすい**傾向があり、実務的にも有望だと思われました（例：50銘柄も一度に発注できないし、機械学習に50銘柄をかけると計算コストがかかり過ぎる）。

---

### シャープレシオ

![Python 銘柄選抜　自動化　シャープレシオsharpe_ratio_heatmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/8144d282-9d03-4037-82cc-82d7baa520c3.png)

- 各スコアごとに、パターン別の平均リターンを標準偏差で割った**シャープレシオを可視化**しました。
　
- この値が大きいほど、高リターンを安定して出せるため、リスクが低いと言えます。プロの投資家は1以上を安定して出せるらしいです。
　
- 月利3〜5%、シャープレシオ0.8の戦略を毎月繰り返すと（複利前提）、年利はおよそ+60%に達します(まじか)。月によっては、負けることもありますが、回数を重ねることでリターンは平均に近づきます。年単位での損失確率は、正規分布を仮定すれば0.03%未満。月利が高ければ複利の力で圧倒的な結果になります。実際には、諸々の急落等で年利20 - 30％くらいになるとは思います。
　

- 特に、**MA乖離が±2%のパターンに沿って比較的高いシャープレシオが帯状に分布**しており、安定性が高い条件として注目されました。

---

### 考察とまとめ

- 今回のスクリーニング条件の中には、**相場が弱いとき（スコアがマイナス）の時に、安定して収益が出せそう**なパターンが複数ありました。
　
- 地合いスコア-3の時はRSIが低めで、MA乖離が比較的大きい方ときに、成績が優れていました。一方で、スコア-2~0の時は、MA乖離が小さい方が、優れたリターンを示す傾向がありました。

    →相場が大きく崩れているときは、大半の銘柄がゴールデンクロスには早すぎるため、MA乖離が広いものを選んだ方が先回りになり、リターンが生じたと考えられます。

    →相場が回復傾向の時は、ゴールデンクロス直前の銘柄が上記よりも増えるため、MA乖離が小さい銘柄の選抜がリターンに直結しやすくなり、このような結果になったと考えられます。
　
- 一方で、**相場が過熱しているとき（スコア+3など）には有効な条件が少なかったです**。

    →このような局面では**反転・下落が近づいているため、リターンを発生するのが難しい**のではないかと推測されます。
　
- 以上から、**テクニカル分析に基づく選抜は、相場の地合いを考慮して使い分ける必要がある**ことが示されました。一律の条件でスクリーニングを行うのではなく、**地合いに応じて最適な条件を柔軟に選択する戦略が不可欠**だと考えられます。


## 実運用に向けて：このモデルの活用と限界

今回検証したモデルは、**地合いスコアごとに適したテクニカル選抜パターンを見つけ出す**ことで、短期〜中期（１ヶ月程度）において安定したリターンを狙う戦略の構築を目指したものです。

特に、**地合いが悪い局面において有効なパターン**は、一定の再現性をもって確認されました。 

ただし、これらは、あくまで過去のデータであり、今後どの程度有効なのかは明らかではありません。その点に関しては、筆者が実際にこのモデルを使って投資を行い検証していきます。

また、今後はこの知見を活かしつつ、**スコアが高い局面（+2〜+3）での有効な立ち回り方**についても検討していく予定です。

---

### 免責と注意点

> 本記事で紹介した結果は、参考情報であり、売買判断を保証するものではありません。投資判断は自己責任でお願いいたします。  
> 検証には**マシンの制約上、各スコアに対して5日のみを使用**しており、さらなる統計的な裏付けが必要です。  
> 同様の分析を**100日以上のスクリーニング日で実施した場合、結果や解釈が変わる可能性があります。**

実際の運用にあたっては、地合い・セクター・ファンダメンタルズなど、複数の要因を組み合わせた判断が不可欠です。

---

今後はこのモデルを基盤として、**強気相場における選抜戦略の構築**や、  
**機械学習による選抜モデルとの連携**なども視野に入れて検討を進めていきます。

ああ早く機械学習　着手したい　んぅ。

---

＜参考＞
地合いスコア-3 バイオリンプロット
![violin_scatter_score-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/501f6b4e-50f7-4e92-9cab-d739c07c1be5.png)

地合いスコア-2 バイオリンプロット
![violin_scatter_score-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/d1ae8023-a79d-4afa-a1c7-62f184804970.png)

地合いスコア-1 バイオリンプロット
![violin_scatter_score-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/eacc822f-2dc7-4c4d-9aed-396473a7a26b.png)

地合いスコア0 バイオリンプロット
![violin_scatter_score0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/e9883e08-01c8-4194-b622-6984457d5c75.png)

地合いスコア1 バイオリンプロット
![violin_scatter_score1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/16062b9a-6059-4d70-bde5-84c21cbb533c.png)

地合いスコア2 バイオリンプロット
![violin_scatter_score2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/b349a5d6-1853-4574-876b-04db27a4cfeb.png)

地合いスコア3 バイオリンプロット
![violin_scatter_score3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/451e34ed-2a54-4e6f-ba8c-d54594afa84b.png)


## 続編
このスクリーニングの方法に穴があることに気づいたそこのあなた。
世の中そんなに単純じゃねえよと思ったそこのあなた。
さすがです。
はてなブログに書き込む前に、
ぜひ一読ください。


https://qiita.com/rS_alonewolf/items/6dbb932d5deef9429a4d

https://qiita.com/rS_alonewolf/items/4e02442524a666703660