半導体関連株をPythonで一括監視するコード

Python実装・コード

半導体セクターはNVIDIA・TSMC・SMCIなど注目銘柄が多く、AIブームとともに急騰する銘柄が続出しています。この記事では半導体関連株を一括で監視・分析するPythonコードを紹介します。

監視対象の半導体銘柄リスト

import yfinance as yf
import pandas as pd
import numpy as np
from datetime import datetime

# 半導体関連銘柄リスト
SEMICONDUCTOR_STOCKS = {
    # 米国
    "NVDA": "NVIDIA(GPU/AI)",
    "AMD": "AMD(CPU/GPU)",
    "INTC": "Intel(CPU)",
    "QCOM": "Qualcomm(モバイル)",
    "AVGO": "Broadcom(通信チップ)",
    "MU": "Micron(メモリ)",
    "AMAT": "Applied Materials(製造装置)",
    "LRCX": "Lam Research(製造装置)",
    "KLAC": "KLA(検査装置)",
    "SMCI": "SuperMicro(AIサーバー)",
    # 日本
    "6857.T": "アドバンテスト(テスター)",
    "8035.T": "東京エレクトロン(製造装置)",
    "6723.T": "ルネサスエレクトロニクス",
    "6502.T": "東芝(半導体メモリ)",
}

print(f"監視銘柄数: {len(SEMICONDUCTOR_STOCKS)}")

一括データ取得と基本分析

def get_semiconductor_overview(tickers_dict, period="1mo"):
    """半導体株の一覧表を生成"""
    tickers = list(tickers_dict.keys())
    data = yf.download(tickers, period=period, progress=False)["Close"]
    
    results = []
    for ticker, name in tickers_dict.items():
        if ticker not in data.columns:
            continue
        prices = data[ticker].dropna()
        if len(prices) < 2:
            continue
        
        current = prices.iloc[-1]
        prev = prices.iloc[-2]
        change_1d = (current / prev - 1) * 100
        change_period = (current / prices.iloc[0] - 1) * 100
        vol = prices.pct_change().std() * np.sqrt(252) * 100
        
        results.append({
            "Ticker": ticker,
            "銘柄名": name,
            "現在値": round(current, 2),
            "前日比(%)": round(change_1d, 2),
            f"期間騰落率(%)": round(change_period, 2),
            "年率ボラ(%)": round(vol, 1),
        })
    
    df = pd.DataFrame(results).set_index("Ticker")
    df = df.sort_values("期間騰落率(%)", ascending=False)
    return df

overview = get_semiconductor_overview(SEMICONDUCTOR_STOCKS)
print(overview.to_string())

SMH(半導体ETF)との相関分析

def analyze_vs_etf(tickers, etf="SMH", period="1y"):
    """半導体ETFとの相関を分析"""
    all_tickers = list(tickers) + [etf]
    data = yf.download(all_tickers, period=period, progress=False)["Close"]
    returns = data.pct_change().dropna()
    
    correlations = returns.corr()[etf].drop(etf).sort_values(ascending=False)
    print(f"SMH(半導体ETF)との相関係数:")
    print(correlations.round(3))
    return correlations

us_tickers = [t for t in SEMICONDUCTOR_STOCKS if ".T" not in t]
analyze_vs_etf(us_tickers)

モメンタムスクリーニング

def momentum_screener(tickers_dict):
    """モメンタムが強い銘柄をスクリーニング"""
    results = []
    for ticker, name in tickers_dict.items():
        df = yf.download(ticker, period="6mo", progress=False, auto_adjust=True)
        if len(df) < 20:
            continue
        prices = df["Close"]
        
        r_1m = (prices.iloc[-1] / prices.iloc[-22] - 1) * 100
        r_3m = (prices.iloc[-1] / prices.iloc[-66] - 1) * 100
        r_6m = (prices.iloc[-1] / prices.iloc[0] - 1) * 100
        
        ma20 = prices.rolling(20).mean().iloc[-1]
        ma50 = prices.rolling(50).mean().iloc[-1] if len(prices) >= 50 else None
        above_ma20 = prices.iloc[-1] > ma20
        
        results.append({
            "Ticker": ticker, "銘柄名": name,
            "1M騰落(%)": round(r_1m, 1),
            "3M騰落(%)": round(r_3m, 1),
            "6M騰落(%)": round(r_6m, 1),
            "MA20上": above_ma20,
        })
    
    df = pd.DataFrame(results).set_index("Ticker")
    buy_signals = df[(df["1M騰落(%)"] > 5) & (df["MA20上"] == True)]
    print("買いシグナル銘柄:")
    print(buy_signals.sort_values("1M騰落(%)", ascending=False))
    return df

momentum_screener(SEMICONDUCTOR_STOCKS)

リアルタイム監視ループ

import time
from datetime import datetime

def realtime_monitor(tickers_dict, interval=60, alert_threshold=3.0):
    """
    指定間隔で株価を監視し、急変時にアラートを表示
    alert_threshold: アラートを出す前日比の閾値(%)
    """
    tickers = list(tickers_dict.keys())
    
    print("半導体株監視開始(Ctrl+Cで停止)")
    print(f"監視銘柄: {len(tickers)}銘柄, 更新間隔: {interval}秒")
    
    try:
        while True:
            now = datetime.now().strftime("%H:%M:%S")
            data = yf.download(tickers, period="2d", progress=False)["Close"]
            
            alerts = []
            for ticker in tickers:
                if ticker not in data.columns:
                    continue
                prices = data[ticker].dropna()
                if len(prices) < 2:
                    continue
                change = (prices.iloc[-1] / prices.iloc[-2] - 1) * 100
                if abs(change) >= alert_threshold:
                    alerts.append(f"  [{ticker}] {change:+.1f}% {tickers_dict[ticker]}")
            
            if alerts:
                print(f"\n[{now}] アラート発生!")
                for a in alerts:
                    print(a)
            else:
                print(f"[{now}] 監視中... 異常なし")
            
            time.sleep(interval)
    except KeyboardInterrupt:
        print("監視を終了しました")

# 実行(実際に使う場合)
# realtime_monitor(SEMICONDUCTOR_STOCKS, interval=60, alert_threshold=3.0)

まとめ

Pythonで半導体関連株を一括監視することで、急騰・急落の早期発見やモメンタム分析が自動化できます。SMHなどのETFと組み合わせてセクター全体の動向も把握しましょう。

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