前回の記事「Pythonでデータ自動収集&グラフ化を学ぶ」では、Pythonを使ってWeb上からデータを集め、それを綺麗なグラフにして視覚化する基礎を学びました。
今回はそのステップアップとして、「集めたデータにAI(機械学習)を適用して、未来の予測や要因分析を行う方法」を学びます。
テーマはずばり「株価の分析」です! 日本を代表する企業「ソニーグループ」の株価を例に、一体どんな外部要因(日経平均?為替?アメリカの金利?)がソニーの株価を上下させているのかを、AIの力を使って暴いていきます。
初心者の方にも分かりやすいように、専門用語にはしっかり解説を入れて進めていきます。ぜひ一緒に、データサイエンティストの第一歩を踏み出しましょう!
※本記事で作成したコードは、すぐに動かせる状態でGoogle Colaboratoryに公開しています。手っ取り早く動かしてみたい方はこちらからどうぞ! > 今回のGoogle Colab 実行用ノートブックはこちら
1. 今回の記事でできること(完成イメージ)
今回のプログラムを実行すると、以下のような分析が全自動でできるようになります。
- データの自動収集: ソニーの過去5年分の株価と、同じ期間の「日経平均株価」「ドル円(為替)」「米国10年債利回り(金利)」のデータを一気に取得します。
- AIによる学習: 上記のデータを機械学習モデル(LightGBM)に読み込ませ、「昨日の外部データが、今日のソニー株にどう影響したか」のパターンを学習させます。
- 重要度のグラフ化: 最終的に「ソニーの株価を予測する上で、一番影響力(重要度)が大きかったのはどのデータか?」を分かりやすい横棒グラフで出力します。
「何となく為替の影響が大きそう」といった人間の勘ではなく、データに基づいた客観的な事実(エビデンス)を導き出せるのが最大の魅力です。
2. 本日のアジェンダ
本記事は以下の流れで進めていきます。
- STEP1: 知っておきたい基礎用語(LightGBMとは?)
- STEP2: コピペで動く!Python実装コード
- STEP3: コードの裏側(AIに未来を予測させるための「時間のズラし方」)
- STEP4: ソニー株の分析結果を読み解く
- STEP5: この技術の無限の可能性(活用アイデア集)
3. 知っておきたい基礎用語(初心者向け解説)
コードを見る前に、今回登場する強力な武器について少しだけ予習しておきましょう。
① 目的変数と説明変数
データ分析の基本となる言葉です。
- 目的変数(予測したいもの): 今回で言えば「明日のソニーの株価(上がるか下がるか)」。
- 説明変数(予測の手がかり): 今回で言えば「昨日の為替」や「昨日の日経平均」など。
② LightGBM(ライト・ジービーエム)
今回使用する機械学習のアルゴリズム(計算方法)の名前です。Microsoftが開発しました。
- 例えるなら: 「たくさんの専門家(決定木と呼ばれる小さなAI)が集まって、多数決で予測を決める会議」のようなものです。非常に計算が速く、少ないデータでも高い精度が出やすいため、世界中のデータサイエンティストの大会(Kaggleなど)で最もよく使われる大人気のAIモデルです。
③ 特徴量重要度(Feature Importance)
LightGBMが予測を終えた後に教えてくれる「MVPランキング」のことです。
- 例えるなら: AIに「予測する時、どのデータが一番役に立った?」とインタビューした結果です。「為替が一番役に立ったよ!」と言われれば、その企業の株価は為替の影響を強く受けていることが科学的に証明されたことになります。
4. コピペで動く!Python実装コード
それでは、さっそく実装してみましょう。以下のコードをGoogle Colabのセルに貼り付けて実行するだけで、すべてが全自動で進みます。
Python
# 1. 必要なライブラリのインストールとインポート
!pip install -q yfinance lightgbm matplotlib pandas scikit-learn
import datetime
import lightgbm as lgb
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
import yfinance as yf
# グラフの日本語崩れを防ぐ設定(Colab標準フォントを使用)
plt.rcParams["font.family"] = "sans-serif"
plt.style.use("ggplot")
# 2. 設定(銘柄コードと期間の指定)
TICKER_CODE = "6758" # ソニーグループ
END_DATE = datetime.date.today().strftime("%Y-%m-%d")
START_DATE = (datetime.date.today() - datetime.timedelta(days=5 * 365)).strftime("%Y-%m-%d")
# 3. データの取得 (株価 & 時系列オープンデータ)
target_df = yf.download(f"{TICKER_CODE}.T", start=START_DATE, end=END_DATE, progress=False)
usdjpy_df = yf.download("JPY=X", start=START_DATE, end=END_DATE, progress=False)
tnx_df = yf.download("^TNX", start=START_DATE, end=END_DATE, progress=False)
n225_df = yf.download("^N225", start=START_DATE, end=END_DATE, progress=False)
# MultiIndex対策(yfinanceの仕様変更対応)
for d in [target_df, usdjpy_df, tnx_df, n225_df]:
if isinstance(d.columns, pd.MultiIndex):
d.columns = d.columns.get_level_values(0)
# 4. データの突合(マージ)と前処理
df = pd.DataFrame(index=target_df.index)
df["Target_Close"] = target_df["Close"]
df["USD_JPY"] = usdjpy_df["Close"]
df["US_10Y_Yield"] = tnx_df["Close"]
df["Nikkei225"] = n225_df["Close"]
# 欠損値(データがない日)を前日の値で埋める
df = df.ffill().bfill()
# ★超重要ポイント:データを1日ズラす(過去のデータにする)
features = ["USD_JPY", "US_10Y_Yield", "Nikkei225"]
for col in features:
df[f"{col}_prev1d"] = df[col].shift(1)
# 目的変数:翌日の株価が「上がる(1)」か「下がる(0)」かを計算
df["Target_Return"] = df["Target_Close"].pct_change()
df["Label"] = np.where(df["Target_Return"].shift(-1) > 0, 1, 0)
# 不要な行を削除してデータを分割
df_model = df.dropna()
feature_cols = [f"{col}_prev1d" for col in features]
X = df_model[feature_cols]
y = df_model["Label"]
# 過去8割のデータで学習し、直近2割のデータでテストする
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
# 5. LightGBMによる分析と特徴量重要度の可視化
train_data = lgb.Dataset(X_train, label=y_train)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)
params = {
"objective": "binary",
"metric": "binary_logloss",
"boosting_type": "gbdt",
"learning_rate": 0.05,
"verbose": -1,
}
model = lgb.train(
params, train_data, valid_sets=[train_data, test_data],
num_boost_round=100,
callbacks=[lgb.early_stopping(stopping_rounds=10, verbose=False)],
)
# 特徴量重要度を取り出してグラフ化
importance = model.feature_importance(importance_type="gain")
importance_df = pd.DataFrame({"Feature": feature_cols, "Importance": importance})
importance_df = importance_df.sort_values(by="Importance", ascending=True)
plt.figure(figsize=(10, 5))
plt.barh(importance_df["Feature"], importance_df["Importance"], color="teal")
plt.title(f"Feature Importance for Ticker: {TICKER_CODE} (LightGBM)", fontsize=14)
plt.xlabel("Importance (Gain)", fontsize=12)
plt.ylabel("Features (1 day ago)", fontsize=12)
plt.tight_layout()
plt.show()
5. ここがミソ!コードの重要ポイント解説
このプログラムの中で、データ分析における「絶対に知っておくべき魔法のテクニック」が2つ使われています。
① shift(1):カンニング防止のタイムマシン
コード内に df[col].shift(1) という記述があります。これは「データを1行(1日)下にズラす」という命令です。 もしこれをやらずに「今日の株価」と「今日の為替」をそのままAIに学習させるとどうなるでしょうか?現実世界では「今日」が終わらないと「今日の為替」は分かりません。これでは未来のデータをカンニングして予測する役立たずなAIになってしまいます。 shift(1) を使うことで、「昨日の為替を見て、今日の株価を予測する」という現実と同じ条件を作り出しています。
② pct_change():価格ではなく「変化」を見る
株価そのものの金額(3,000円、10,000円など)ではなく、「前日から何%上がったか?」を計算する関数です。株の世界では、価格そのものよりも「変化率(リターン)」を見ることが統計学的に非常に重要とされています。
6. ソニー株の分析結果を読み解く!
上記のコードを実行して出力されるグラフ(特徴量重要度)を見ると、驚くべき事実が分かります。
ソニー(6758)の場合、翌日の株価に最も強い影響を与えていたのは「前日の日経平均(Nikkei225)」と「前日の米国10年債利回り(US_10Y_Yield)」であり、意外にも「為替(USD_JPY)」の影響度は一番低かったのです。
- プロの視点: ソニーは輸出企業ですが、すでに海外生産やデジタル配信(ゲーム・音楽)が主軸の「グローバル・テクノロジー企業」です。そのため、単純な円安メリットよりも、「日本市場全体の空気(日経平均)」や、世界中のハイテク株に影響を与える「アメリカの金利動向」の波をモロに受けるビジネス構造になっていることが、このAI分析から科学的に証明されたと言えます。
7. この技術の重要性と活用アイデア
「過去の株価データだけで絶対儲かるシステムを作る」というのは現実的には不可能です。しかし、今回のように「外部データ(オープンデータ)を掛け合わせてAIに要因をあぶり出させる技術」は、ビジネスの現場で凄まじい価値を持ちます。
活用アイデア(例)
- 飲食チェーン店の売上予測: 「自社の売上データ」を目的変数にし、「毎日の気温」「降水量」「周辺のイベント情報」を説明変数にしてLightGBMにかければ、「明日は猛暑だから客足が落ちる。仕入れを減らそう」といったデータドリブンな意思決定(食品ロス削減)が可能になります。
- 広告費の最適化: 「ECサイトのアクセス数」を目的変数にし、「テレビCMの回数」「SNSの投稿数」「曜日」などを掛け合わせれば、何が一番集客に効いているのか(=広告費をどこにかけるべきか)が数字で明確になります。
- 仮想通貨(暗号資産)の分析: ビットコインの価格と、アメリカのハイテク株指数(NASDAQ)などを掛け合わせて、連動性をチェックすることも簡単にできます。
まとめ
今回はPythonを使った機械学習(LightGBM)の実装を通じて、データ同士の「関係性」を見つけ出す方法を学びました。 コード内の TICKER_CODE = "6758" の数字を、トヨタ(7203)や任天堂(7974)などに書き換えて実行するだけで、企業ごとの全く違う顔(影響を受ける要因の違い)が見えてきます。ぜひ、あなたのお気に入りの銘柄で遊んでみてください!


コメント