PR
AIで記事作成を効率化したいなら → 高品質SEO記事生成AIツール【Value AI Writer byGMO】
※本記事は、Pythonによるデータ分析の学習を目的としたものです。特定の銘柄の売買を推奨するものではなく、投資判断の助言でもありません。
「Pythonで株価分析をしてみたいけど、何から始めればいいのか分からない」。そういう方向けに、データ取得 → 指標の計算 → グラフ化 → 観察メモという一連の流れを、実際に動くコード付きでまとめました。移動平均線・RSI・MACDという3つの定番指標を、順番に自分の手で計算していきます。
この記事のゴール
- 日本株の株価データを、Pythonで自動的に取得できる
- 移動平均線・RSI・MACDを、ライブラリ任せにせず計算の中身を理解する
- チャートを描いて、数値が何を意味しているかを目で確認する
- 「ゴールデンクロス接近」のような条件を、機械的に抽出する
指標の意味を丸暗記するより、一度自分で計算してグラフに出すほうが理解が早いです。所要時間は30分ほどです。
準備:環境とライブラリ
環境はGoogle Colabでも、手元のMacでも構いません。Colabなら環境構築が不要なので、はじめての方はこちらが楽です。使うライブラリは次の3つです。
- yfinance:株価データの取得
- pandas:データの加工(移動平均などはこれで計算します)
- matplotlib:グラフの描画
!pip install yfinance
Colab以外(手元の環境)で使う場合は、先頭の「!」を外してターミナルから実行してください。
ステップ1:株価データを取得する
日本株の場合、証券コードの後ろに「.T」を付けます(東証)。たとえばトヨタ自動車なら「7203.T」です。ここで「.T」を忘れると、データが取得できずに空のまま進んでしまうので注意してください。
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
ticker = "7203.T" # トヨタ自動車(東証は「証券コード + .T」)
df = yf.download(ticker, start="2025-01-01", auto_adjust=False, progress=False)
# バージョンによっては列がMultiIndexで返ってくるので、平坦化しておく
if isinstance(df.columns, pd.MultiIndex):
df.columns = df.columns.get_level_values(0)
df = df.dropna()
print(df.tail())
取得できる主な列は、始値(Open)・高値(High)・安値(Low)・終値(Close)・出来高(Volume)です。以降は終値(Close)だけを使います。
注意点として、上場直後や取引が少ない銘柄では欠損値(NaN)が混ざることがあります。dropna() で落としておくと、後の計算でエラーになりにくくなります。
ステップ2:移動平均線を計算してグラフ化する
移動平均線は、直近N日分の終値の平均をつないだ線です。pandasの rolling(日数).mean() で一行で書けます。日本では5日・25日・75日の組み合わせがよく使われます。
df["MA5"] = df["Close"].rolling(5).mean()
df["MA25"] = df["Close"].rolling(25).mean()
df["MA75"] = df["Close"].rolling(75).mean()
plt.figure(figsize=(12, 5))
plt.plot(df.index, df["Close"], label="Close", linewidth=1)
plt.plot(df.index, df["MA5"], label="MA5")
plt.plot(df.index, df["MA25"], label="MA25")
plt.plot(df.index, df["MA75"], label="MA75")
plt.legend()
plt.title(ticker + " / moving averages")
plt.show()
グラフを見るポイントは、短期線と長期線の位置関係です。短期線が長期線を下から上に抜けると「ゴールデンクロス」、上から下に抜けると「デッドクロス」と呼ばれます。ただし、これは過去の値動きの結果であって、将来を保証する信号ではありません。そこは勘違いしないようにしてください。
ステップ3:RSIを計算する
RSIは、値上がり幅と値下がり幅のバランスから「買われすぎ・売られすぎ」を見る指標です。一般に70以上で買われすぎ、30以下で売られすぎと言われます。計算の中身は、値上がり分と値下がり分をそれぞれ平均して比を取る、というシンプルなものです。
delta = df["Close"].diff()
gain = delta.clip(lower=0) # 値上がり分(下がった日は0)
loss = -delta.clip(upper=0) # 値下がり分(上がった日は0、符号を反転)
avg_gain = gain.rolling(14).mean()
avg_loss = loss.rolling(14).mean()
rs = avg_gain / avg_loss
df["RSI"] = 100 - (100 / (1 + rs))
実行すると、RSIが50付近をうろうろしながら、時々70や30に振れるのが見えます。14日というのは標準的な期間で、短くすると反応が早く、長くすると滑らかになります。
ひとつ注意点があります。値下がりが1日もなかった場合、avg_loss が0になって割り算でエラー(または無限大)になります。実データではめったに起きませんが、起きたときは「RSIは100とする」のように例外処理を入れておくと安全です。
ステップ4:MACDを計算する
MACDは、期間の違う2本の指数移動平均(EMA)の差です。「トレンドの勢いが変わりつつあるか」を見るのに使います。12日と26日のEMAの差を「MACD線」、その9日平均を「シグナル線」と呼びます。
ema12 = df["Close"].ewm(span=12, adjust=False).mean()
ema26 = df["Close"].ewm(span=26, adjust=False).mean()
df["MACD"] = ema12 - ema26
df["Signal"] = df["MACD"].ewm(span=9, adjust=False).mean()
df["Hist"] = df["MACD"] - df["Signal"]
Hist(ヒストグラム)はMACD線とシグナル線の差です。プラスならMACD線が上、マイナスなら下を意味し、プラスからマイナスに転じたあたりを変化の目安として観察します。
ステップ5:条件を指定して機械的に絞り込む
ここが手計算では難しいところです。「短期線が長期線のすぐ下にいて、差が1%以内」という条件を数値で書けば、「ゴールデンクロスに近い状態」を機械的に一覧にできます。主観を挟まずに候補を絞れるのが、Pythonを使う最大の利点です。
# 短期線と長期線の乖離率(%)
df["GapRatio"] = (df["MA5"] - df["MA25"]) / df["MA25"] * 100
# 短期線が長期線より下で、差が1%以内 = 「接近中」
near = df[(df["GapRatio"] > -1) & (df["GapRatio"] < 0)]
print(near[["Close", "MA5", "MA25", "GapRatio", "RSI", "MACD"]].tail(10))
「そもそもクロスした瞬間」を抽出したい場合は、前日と今日を比較すれば書けます。
df["GC"] = (df["MA5"] > df["MA25"]) & (df["MA5"].shift(1) <= df["MA25"].shift(1))
crossed_days = df[df["GC"]]
print(crossed_days[["Close", "MA5", "MA25"]])
3つの指標の使い分け
| 指標 | 何を見るか | よく使う設定 | 注意点 |
|---|---|---|---|
| 移動平均線 | トレンドの方向と勢い | 5日 / 25日 / 75日 | 相場が横ばいだと信号がダマになりやすい |
| RSI | 買われすぎ・売られすぎ | 14日 | 強いトレンド中は70以上に張り付いたままになる |
| MACD | トレンド転換の兆し | 12 / 26 / 9 | 反応が遅れる(遅行性がある) |
どれか1つで判断を決めるものではありません。3つが同じ方向を指しているかを見る、くらいの気持ちで使うのが現実的です。
実際にやってみて詰まったところ
- データが取れない:証券コードに「.T」を付け忘れているケースがほとんどでした。
- 指標の先頭がNaNだらけになる:移動平均は過去のデータを必要とするので、最初の数十行は計算できません。これは正常です。
- グラフの日本語が文字化けする:Colabやmatplotlibの既定フォントでは日本語が豆腐(□□□)になります。グラフのラベルは英語にするか、日本語フォントを指定してください。
- 指標によって数値が違う:証券サイトのRSIと自分の計算値が少しずれることがあります。期間の取り方や、値上がり・値下がりの平均の出し方(単純平均か平滑化か)の違いによるものです。どちらが正しいという話ではありません。
読むときの注意点
テクニカル指標は、過去の値動きを計算したものです。将来の株価を予測するものではありません。この記事のコードでできるのは「条件に合う銘柄を機械的に絞る」ところまでで、そこから先の判断は、最新の情報・自分のリスク許容度・資金管理を含めて自分で行う必要があります。
学習用としては、指標を自分で計算してグラフに出すという作業そのものが、データ分析の練習になります(欠損値の扱い、時系列データのずらし、条件抽出など)。投資のためというより、pandasの練習題材としてもおすすめです。