自社株買いの波に乗れ。信越化学と連動する銘柄を Pythonで探してみた。

# 自社株買いをした信越化学と連動する銘柄を Mutual Information で探してみた。

# 5000億円の自社株買いが着火点

2025年4月25日、信越化学工業（4063.T）は  
**発行済み株式の10.2％・最大5000億円** に及ぶ自己株取得枠を決議しました【ロイター】。  
取得期間は *2025-05-21 ～ 2026-04-24* と異例の長期・大規模。  
発表直後から株価は4日続伸し、同社をベンチマークにした  
**「巻き戻し買い／連想買い」** が市場で急増しています。
[引用1](https://jp.reuters.com/economy/industry/VNHRC7HQINPEXCHR4OW3NMN3TM-2025-04-25/?utm_source=chatgpt.com) [引用２](https://jp.reuters.com/markets/japan/funds/QFADEYT4CZPI5K6JNOSCFO2CRY-2025-04-28/?utm_source=chatgpt.com)

### では *連動しやすい銘柄* を先に把握しておけばどうなるか？
| # | どう役立つ？ |
|---|--------------|
| **1. リスクを小さくできる** | **信越化学を買い**、動きが似ている銘柄を**同時に売る**（両建て）と、<br>市場全体が上がっても下がっても影響が打ち消し合い、<br>**信越化学だけの値動き**を狙いやすくなります。 |
| **2. “つられて動く株” を先回り** | 5000 億円の自社株買いは、同じ半導体・素材セクターに<br>**連想買い**が広がりやすい。<br>動きが似る銘柄を知っておけば、<br>資金が流れそうな株を**先に仕込む／利確する**チャンスが増えます。 |
| **3. 指数売買の巻き添えを回避** | 信越化学は TOPIX の**ウェート 1 ％超**。<br>株価が急騰・急落すると、指数に連動するファンドが自動で売買し、<br>似た動きをする銘柄にも注文が入ります。<br>あらかじめ把握しておけば、**思わぬ巻き添え**に備えられます。 |

  > 大規模な自社株買いが出たとき、  
> - **ヘッジ**（リスクを抑える）  
> - **連想買い／売りの先回り**  
> - **指数の自動売買対策**  
> といった場面で、連動銘柄リストは “早見表” として役立ちます。

そこで今回は **非線形の関係を測れる *Mutual Information* (MI)** を使い、  
過去2年のリターンから **「信越化学と連動した値動きを示す上位30銘柄」** を抽出し、  
ヒートマップで可視化しました。
## なぜ Mutual Information なのか？

- 株価同士の **線形相関** だけでは「似てる動き」が取りきれない  
- **Mutual Information (MI)** は *非線形* な依存も捕捉できる  
- `sklearn.feature_selection.mutual_info_regression` が使えるので実装ラク

---

## 環境

| item | version |
|------|---------|
| Google Colab | (Python 3.11 ) |
| pandas | 最新|
| matplotlib | 最新|
| seaborn | 最新|
| scikit-learn | 最新|
| yfinance | 最新|

---

# ①信越化学の値動きと関係がありそうな銘柄の選抜
財務データを元にした1次スクリーニングを通過した銘柄(約200、4月上旬実施)の過去2年間の、1日毎のリターンを計算。信越のリターンデータをX、200銘柄のリターンデータをyとして定義。mutual_info_regression(X, y, random_state=0)を使って、Mutual Informationを計算しました。

```python
# 必要ライブラリ
!pip install yfinance scikit-learn

import yfinance as yf
import pandas as pd
from sklearn.feature_selection import mutual_info_regression
import numpy as np
import os

# --- Google Driveをマウント ---
from google.colab import drive
drive.mount('/content/drive')

# --- パス設定（自分の環境に合わせて！） ---
input_path = "/content/drive/MyDrive/stock_prediction/ver.1/results/1st/stock_filtered_Prime.csv"   # 入力ファイルパス
output_path = "/content/drive/MyDrive/stock_prediction/ver.1/Shin_Etsu_theme/mutual_information_ranking.csv"   # 出力ファイルパス

# --- パラメータ設定 ---
target_ticker = "4063.T"  # 信越化学
period_years = 2  # データ取得年数
interval = "1d"   # 1日ごとのデータ

# --- 銘柄リスト読込 ---
tickers_df = pd.read_csv(input_path)
tickers = tickers_df["Ticker"].tolist()
tickers.append(target_ticker)  # 信越化学も追加

# --- 株価データ取得 ---
data = yf.download(tickers, period=f"{period_years}y", interval=interval)["Close"]

# --- リターン計算 ---
returns = data.pct_change().dropna()

# --- 信越化学のリターンと、その他銘柄のリターンに分離 ---
y = returns[target_ticker]
X = returns.drop(columns=[target_ticker])

# --- 欠損除去（ある銘柄は除外）---
X = X.dropna(axis=1)
common_columns = X.columns
y = y[X.index]  # インデックスを揃える

# --- Mutual Information計算 ---
mi_scores = mutual_info_regression(X, y, random_state=0)

# --- 結果まとめ ---
result_df = pd.DataFrame({
    "Ticker": common_columns,
    "Mutual_Information": mi_scores
}).sort_values(by="Mutual_Information", ascending=False).reset_index(drop=True)

# --- 出力 ---
print(result_df)

# 保存
os.makedirs(os.path.dirname(output_path), exist_ok=True)
result_df.to_csv(output_path, index=False)
```


# ②会社名の添付
読み込んだ1次スクリーニングのリストに銘柄名がなかったので、この段階では会社名が参照できないです。継ぎはぎで格好悪いですが、後から会社名をyfinanceから取ってきて、csvにappendしました。

```python
import yfinance as yf
import pandas as pd

# Tickerリストを読み込む
tickers_df = pd.read_csv("/content/drive/MyDrive/stock_prediction/ver.1/Shin_Etsu_theme/mutual_information_ranking.csv")
tickers = tickers_df["Ticker"].tolist()

# 会社名を取得
company_names = []
for ticker in tickers:
    try:
        info = yf.Ticker(ticker).info
        name = info.get('longName', None)
    except:
        name = None
    company_names.append(name)

# 会社名をDataFrameに追加
tickers_df["Company_Name"] = company_names

# 保存
tickers_df.to_csv("/content/drive/MyDrive/stock_prediction/ver.1/Shin_Etsu_theme/mutual_information_ranking_with_Name.csv", index=False)

print(tickers_df.head())
```

# 結果
このコードはデータをcsvに出力するのですが、ChatGPTにヒートマップに変換してもらいました。上位5社は次の通りです。いずれも信越との関連が強いと考えられ（例：信越がJEOLのNMRを使って研究→両者とも業績上がる）、今回のデータにも妥当性がありそうです。

たまたま右肩下りの銘柄が選ばれた可能性は否定できないですが、今月末にグビっと上がっているとことをみると連動していると考えて良いと思います。

- アルバック:ディスプレイ・エネルギー関連製造装置 · 半導体製造装置 · 電子部品製造装置

- HORIBA:科学計測機器、医用計測機器、半導体用計測機器の製造販売

- JEOL:NMRなど化学分析機器で有名

- 旭有機材:塩ビバルブ・樹脂コンパウンド

- デクセリアルズ:電子部品、接合材料、光学材料などの製造・販売


---
- MIが高い上位30銘柄
![Top 30 Mutual Information – Heatmap (with Company Names).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/8a94d30f-c6f4-4482-b357-91378a99d1f7.png)

-上位5社の値動き（信越も含む）
計算は2年のデータを使ってますが、グラフは１年分の表記です。
![4063.T_Shin-Etsu Chemical_price.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/2aeb014b-51db-42a3-b18b-2de15263ad43.png)

![6728.T_ULVAC, Inc._price.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/beae1829-5e31-40d0-b9f7-c85dfb5b35b4.png)

![6856.T_HORIBA, Ltd._price.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/10b5917b-d568-4cb6-9da6-f4e032978c7e.png)

![6951.T_JEOL Ltd._price.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/c621fd15-90c4-4068-aafe-28effbe8de7a.png)

![4216.T_Asahi Yukizai Corporation_price.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/b8be44dc-13f1-40fb-8412-5d94646454d6.png)

![4980.T_Dexerials Corporation_price.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/55f46cc9-4c1f-4380-ae41-5003834f3448.png)


# 今後の予定
連動銘柄の値動きが気になるので、自分でもいくらか投資を行います。
信用取引で空売りをするのは、初心者には難しいので、現在ヘッジをするのは難しいですが、将来、また大きな会社が自社株買いを発表したら、今回のような解析をして、すぐさま対処できるようにしたいと思います。