株式投資に必要なデータ分析力
株式投資で成功するには、感覚ではなくデータに基づいた判断が重要です。
しかし、こんな悩みがありませんか?
- 高額な株価分析ツールは手が出ない
- 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で、気になる銘柄のデータを取得してみませんか?
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。





