Tasuke HubLearn · Solve · Grow
#Python

Pythonで株式投資分析!yfinance × pandas × pandas-taで実践するテクニカル分析入門

無料でYahoo Financeから株価データを取得し、移動平均・RSI・MACDを計算。PythonとJupyter Notebookで始める、実践的な株式投資分析の完全ガイドです。

時計のアイコン27 November, 2025
TH

Tasuke Hub管理人

東証プライム市場上場企業エンジニア

情報系修士卒業後、大手IT企業にてフルスタックエンジニアとして活躍。 Webアプリケーション開発からクラウドインフラ構築まで幅広い技術に精通し、 複数のプロジェクトでリードエンジニアを担当。 技術ブログやオープンソースへの貢献を通じて、日本のIT技術コミュニティに積極的に関わっている。

🎓情報系修士🏢東証プライム上場企業💻フルスタックエンジニア📝技術ブログ執筆者

株式投資に必要なデータ分析力

株式投資で成功するには、感覚ではなくデータに基づいた判断が重要です。

しかし、こんな悩みがありませんか?

  • 高額な株価分析ツールは手が出ない
  • Excelでの手作業分析は時間がかかる
  • テクニカル指標の計算方法がわからない

Pythonなら、全て無料で解決できます。

ベストマッチ

最短で課題解決する一冊

この記事の内容と高い親和性が確認できたベストマッチです。早めにチェックしておきましょう。

必要なライブラリ

今回使用するPythonライブラリは以下の3つです:

1. yfinance - 株価データ取得

Yahoo Financeから無料で株価データを取得できます。

2. pandas - データ操作

時系列データの操作と計算に最適化されています。

3. pandas-ta - テクニカル指標

130種類以上のテクニカル指標を簡単に計算できます。

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

セットアップ

# ライブラリのインストール
pip install yfinance pandas pandas-ta matplotlib

# Jupyter Notebookの起動(推奨)
jupyter notebook

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

実践1: 株価データの取得

Yahoo Financeから日本株を取得

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

# トヨタ自動車(7203.T)のデータ取得
ticker = "7203.T"  # .T は東京証券取引所を示す
data = yf.download(ticker, start="2024-01-01", end="2025-01-01")

# データの確認
print(data.head())

"""
出力例:
                  Open        High         Low       Close   Adj Close    Volume
Date                                                                              
2024-01-04  2842.0  2876.5  2828.0  2860.5    2860.5  17234500
2024-01-05  2870.0  2890.0  2855.0  2875.0    2875.0  15432100
"""

米国株の取得

# Apple(AAPL)のデータ取得
aapl = yf.download("AAPL", start="2024-01-01", end="2025-01-01")

# 複数銘柄を一度に取得
tickers = ["AAPL", "MSFT", "GOOGL", "AMZN"]
data = yf.download(tickers, start="2024-01-01", end="2025-01-01")

分足データの取得

# 1分足データ(直近7日間のみ)
intraday = yf.download("7203.T", period="7d", interval="1m")

# 1時間足データ(直近60日間)
hourly = yf.download("7203.T", period="60d", interval="1h")

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

実践2: 移動平均の計算と可視化

SMA(単純移動平均)の計算

import pandas_ta as ta

# データ取得
ticker = "7203.T"
df = yf.download(ticker, start="2023-01-01", end="2025-01-01")

# 5日・25日・75日移動平均
df['SMA_5'] = ta.sma(df['Close'], length=5)
df['SMA_25'] = ta.sma(df['Close'], length=25)
df['SMA_75'] = ta.sma(df['Close'], length=75)

# グラフ化
plt.figure(figsize=(14, 7))
plt.plot(df.index, df['Close'], label='終値', color='black', linewidth=1)
plt.plot(df.index, df['SMA_5'], label='5日移動平均', color='blue')
plt.plot(df.index, df['SMA_25'], label='25日移動平均', color='red')
plt.plot(df.index, df['SMA_75'], label='75日移動平均', color='green')
plt.title(f'{ticker} 株価と移動平均')
plt.xlabel('日付')
plt.ylabel('株価(円)')
plt.legend()
plt.grid(True)
plt.show()

ゴールデンクロス・デッドクロスの検出

# ゴールデンクロス:短期MAが長期MAを上抜き(買いシグナル)
# デッドクロス:短期MAが長期MAを下抜き(売りシグナル)

df['Signal'] = 0
df.loc[df['SMA_5'] > df['SMA_25'], 'Signal'] = 1  # 買い
df.loc[df['SMA_5'] < df['SMA_25'], 'Signal'] = -1  # 売り

# クロス発生日を検出
df['Cross'] = df['Signal'].diff()

# ゴールデンクロス(-1 → 1 なのでdiff=2)
golden_cross = df[df['Cross'] == 2]
print("ゴールデンクロス発生日:")
print(golden_cross[['Close', 'SMA_5', 'SMA_25']].head())

# デッドクロス(1 → -1 なのでdiff=-2)
dead_cross = df[df['Cross'] == -2]
print("\nデッドクロス発生日:")
print(dead_cross[['Close', 'SMA_5', 'SMA_25']].head())

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

実践3: RSI(相対力指数)

RSIの計算と可視化

# RSIの計算(14日期間)
df['RSI'] = ta.rsi(df['Close'], length=14)

# 2枚のグラフ(株価とRSI)
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 10), sharex=True)

# 株価グラフ
ax1.plot(df.index, df['Close'], label='終値', color='black')
ax1.set_title(f'{ticker} 株価')
ax1.set_ylabel('株価(円)')
ax1.legend()
ax1.grid(True)

# RSIグラフ
ax2.plot(df.index, df['RSI'], label='RSI(14)', color='purple')
ax2.axhline(y=70, color='red', linestyle='--', label='買われすぎ')
ax2.axhline(y=30, color='green', linestyle='--', label='売られすぎ')
ax2.fill_between(df.index, 30, 70, alpha=0.1, color='gray')
ax2.set_title('RSI (Relative Strength Index)')
ax2.set_ylabel('RSI')
ax2.set_xlabel('日付')
ax2.legend()
ax2.grid(True)

plt.tight_layout()
plt.show()

RSIを使った売買シグナル

# RSI < 30: 売られすぎ(買いシグナル)
# RSI > 70: 買われすぎ(売りシグナル)

df['RSI_Signal'] = 0
df.loc[df['RSI'] < 30, 'RSI_Signal'] = 1   # 買い
df.loc[df['RSI'] > 70, 'RSI_Signal'] = -1  # 売り

# シグナル発生日
buy_signals = df[df['RSI_Signal'] == 1]
sell_signals = df[df['RSI_Signal'] == -1]

print(f"買いシグナル: {len(buy_signals)}回")
print(f"売りシグナル: {len(sell_signals)}回")

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

実践4: MACD(移動平均収束拡散法)

MACDの計算

# MACDの計算
macd = ta.macd(df['Close'])
df = pd.concat([df, macd], axis=1)

# カラム名の確認
# MACD_12_26_9: MACDライン
# MACDs_12_26_9: シグナルライン
# MACDh_12_26_9: ヒストグラム

# グラフ化
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 10), sharex=True)

# 株価グラフ
ax1.plot(df.index, df['Close'], label='終値', color='black')
ax1.set_title(f'{ticker} 株価')
ax1.set_ylabel('株価(円)')
ax1.legend()
ax1.grid(True)

# MACDグラフ
ax2.plot(df.index, df['MACD_12_26_9'], label='MACDライン', color='blue')
ax2.plot(df.index, df['MACDs_12_26_9'], label='シグナルライン', color='red')
ax2.bar(df.index, df['MACDh_12_26_9'], label='ヒストグラム', color='gray', alpha=0.3)
ax2.axhline(y=0, color='black', linestyle='-', linewidth=0.5)
ax2.set_title('MACD')
ax2.set_ylabel('MACD値')
ax2.set_xlabel('日付')
ax2.legend()
ax2.grid(True)

plt.tight_layout()
plt.show()

MACDのクロス検出

# MACDラインがシグナルラインを上抜き(買い)
df['MACD_Signal'] = 0
df.loc[df['MACD_12_26_9'] > df['MACDs_12_26_9'], 'MACD_Signal'] = 1   # 買い
df.loc[df['MACD_12_26_9'] < df['MACDs_12_26_9'], 'MACD_Signal'] = -1  # 売り

# クロス検出
df['MACD_Cross'] = df['MACD_Signal'].diff()

macd_buy = df[df['MACD_Cross'] == 2]
macd_sell = df[df['MACD_Cross'] == -2]

print(f"MACD買いシグナル: {len(macd_buy)}回")
print(f"MACD売りシグナル: {len(macd_sell)}回")

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

実践5: 複合シグナルによる売買戦略

複数指標の組み合わせ

def generate_signal(row):
    """
    複合シグナル生成
    - SMA: 5日 > 25日
    - RSI: 30 < RSI < 70
    - MACD: MACDライン > シグナルライン
    """
    score = 0
    
    # SMAシグナル
    if row['SMA_5'] > row['SMA_25']:
        score += 1
    elif row['SMA_5'] < row['SMA_25']:
        score -= 1
    
    # RSIシグナル
    if row['RSI'] < 30:
        score += 1
    elif row['RSI'] > 70:
        score -= 1
    
    # MACDシグナル
    if row['MACD_12_26_9'] > row['MACDs_12_26_9']:
        score += 1
    elif row['MACD_12_26_9'] < row['MACDs_12_26_9']:
        score -= 1
    
    # 強い買いシグナル(3つ全て一致)
    if score >= 3:
        return 'STRONG_BUY'
    elif score >= 2:
        return 'BUY'
    elif score <= -3:
        return 'STRONG_SELL'
    elif score <= -2:
        return 'SELL'
    else:
        return 'HOLD'

df['Combined_Signal'] = df.apply(generate_signal, axis=1)

# シグナルの集計
print(df['Combined_Signal'].value_counts())

バックテスト(簡易版)

# 初期資金
initial_capital = 1000000  # 100万円
shares = 0
cash = initial_capital
portfolio_value = []

for index, row in df.iterrows():
    signal = row['Combined_Signal']
    price = row['Close']
    
    # 買いシグナル(現金がある場合)
    if signal == 'STRONG_BUY' and cash > price * 100:
        shares_to_buy = int(cash / price / 100) * 100  # 100株単位
        shares += shares_to_buy
        cash -= shares_to_buy * price
        print(f"{index.date()}: {shares_to_buy}株購入 @{price}円")
    
    # 売りシグナル(株を保有している場合)
    elif signal == 'STRONG_SELL' and shares > 0:
        cash += shares * price
        print(f"{index.date()}: {shares}株売却 @{price}円")
        shares = 0
    
    # 資産総額
    total = cash + shares * price
    portfolio_value.append(total)

# 最終資産
final_value = portfolio_value[-1]
profit = final_value - initial_capital
profit_rate = (profit / initial_capital) * 100

print(f"\n初期資金: {initial_capital:,}円")
print(f"最終資産: {final_value:,.0f}円")
print(f"利益: {profit:,.0f}円 ({profit_rate:.2f}%)")

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

まとめ

Pythonを使えば、高額ツール不要で本格的な株式投資分析が可能です。

  • yfinance: 無料で株価データ取得
  • pandas: データ操作と計算
  • pandas-ta: 130種類以上のテクニカル指標

今回紹介した手法は基礎ですが、これをベースに:

  • 機械学習による株価予測
  • ポートフォリオ最適化
  • リスク管理

など、より高度な分析に発展させることができます。

まずはJupyter Notebookで、気になる銘柄のデータを取得してみませんか?

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

この記事をシェア

続けて読みたい記事

編集部がピックアップした関連記事で学びを広げましょう。

#Python

Pythonデータ分析完全実践ガイド|pandas・NumPy・Matplotlib実装からPolars最適化・統計分析まで、実務レベル技術を徹底解説【2025年最新】

2025/8/9
#Python

【2025年完全版】Python asyncioエラー完全解決ガイド:15のエラーパターンと実践的解決策

2025/11/28
#Python

型安全PythonでAIコードベースを堅牢化する実装ガイド

2025/11/23
#Python

Astral製uvとtyでPythonワークフローを再設計する

2025/11/23
#Python

型駆動でAIパイプラインを組むためのPython高度テクニック

2025/11/23
#Python

RyeユーザーはuvへGO!Astral公式が推奨する次世代Pythonワークフロー移行術

2025/11/26