PR

Pythonで株価予測を始めよう:ランダムフォレストでシンプルに分析

python-stock-prediction-basics 株価予測プログラム


【株価予測ツール001の概要と目的】

このコードは、株価データと経済指標(失業率)を用いて、翌日の株価が上昇するか下落するかを予測するシンプルなツールです。以下のような目的で作成されています:

  1. 株価予測の学習: 機械学習(ランダムフォレスト)を利用して株価の動きを予測する仕組みを体験。
  2. 経済データとの連携: 株価データに加え、失業率などの経済指標がどのように影響を与えるかを分析。
  3. 投資初心者向け: 株価予測の基礎を学びたい方やPythonに興味がある方が簡単に試せる内容。

このコードを使えば、Python初心者でも株価予測の基本的な流れを理解でき、さらに投資判断に役立つヒントを得ることができます。必要なPythonライブラリをインストールして実行するだけで、簡単に予測結果やグラフを表示できるようになっています。

実行するために必要な環境

このプログラムを動作させるには、以下が必要です:

  • Python 3.x の環境
  • 必要なライブラリのインストール(yfinance, pandas, pandas-datareader, scikit-learn, matplotlib

ライブラリのインストールは、以下のコマンドを実行してください:

pip install yfinance pandas pandas-datareader scikit-learn matplotlib

それでは、以下のコードをコピーして実際に試してみてください!

【pythonプログラムコード #001#】
import yfinance as yf
import pandas_datareader as pdr
import pandas as pd
from datetime import datetime
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt

日本語フォント設定(必要に応じて変更)

日本語表示をサポートするために、フォントを「Meiryo」に変更します。

plt.rcParams[‘font.family’] = ‘Meiryo’

現在の日付を取得

この日付を使って株価データの取得期間を指定します。

today = datetime.today().strftime(‘%Y-%m-%d’)

株価データの取得

ユーザーに調べたい銘柄コード(ティッカーシンボル)を入力してもらいます。

ticker = input(“銘柄コード(ティッカーシンボル)を入力してください: “)
print(f”\n=== {ticker}の株価データを取得中 ===”)
stock_data = yf.download(ticker, start=”2022-01-01″, end=today)

データが空の場合、プログラムを終了します。

if stock_data.empty:
print(“データが見つかりませんでした。終了します。”)
exit()

マルチインデックスを解除

データフレームの列名が階層化されている場合を解除します。

stock_data.columns = stock_data.columns.get_level_values(0)

経済指標データの取得

失業率データ(Unemployment Rate)を取得します。これは株価予測に役立つ可能性があります。

print(“\n=== 経済指標データを取得中 ===”)
economic_data = pdr.get_data_fred(“UNRATE”, start=”2022-01-01″, end=today)
economic_data.rename(columns={“UNRATE”: “UnemploymentRate”}, inplace=True)

経済データの補間

経済データの日付を株価データに合わせるため、欠損値を埋めます。

economic_data.index.name = “Date” # 統一のためインデックス名を「Date」に変更
economic_data = economic_data.reindex(stock_data.index, method=”ffill”)

データ統合

株価データと経済指標データを1つのデータセットに結合します。

print(“\n=== データを統合中 ===”)
merged_data = pd.concat([stock_data, economic_data], axis=1)

移動平均線の計算

短期(5日)と長期(20日)の移動平均線を計算します。

merged_data[‘SMA_5’] = merged_data[‘Close’].rolling(window=5).mean()
merged_data[‘SMA_20’] = merged_data[‘Close’].rolling(window=20).mean()

翌日の株価が上昇するか下落するかのターゲット変数を作成

merged_data[‘Target’] = (merged_data[‘Close’].shift(-1) > merged_data[‘Close’]).astype(int)

欠損値を含む行を削除します。

merged_data.dropna(inplace=True)

特徴量とターゲット変数を分割

特徴量:株価や失業率、移動平均線など

ターゲット:株価が翌日に上昇するか下落するか(1または0)

features = merged_data[[‘Close’, ‘High’, ‘Low’, ‘Open’, ‘UnemploymentRate’, ‘SMA_5’, ‘SMA_20’]]
target = merged_data[‘Target’]

データ分割

データを訓練用(80%)とテスト用(20%)に分割します。

X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.2, random_state=42)

モデル構築

ランダムフォレストモデルを使用して学習を行います。

print(“\n=== モデルを構築中 ===”)
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)

予測と精度の計算

テストデータで予測を行い、モデルの精度を評価します。

predictions = model.predict(X_test)
accuracy = accuracy_score(y_test, predictions)
print(f”\n=== 予測結果 ===\nモデルの精度: {accuracy:.2f}”)

翌日の株価予測

最新のデータを使って翌日の株価が上昇するか下落するかを予測します。

latest_features = features.iloc[[-1]] # 最終行の特徴量を取得
prediction = model.predict(latest_features)
prediction_proba = model.predict_proba(latest_features)
print(f”翌日の株価予測: {‘上昇’ if prediction[0] == 1 else ‘下落’} (確率: {prediction_proba[0][1]:.2f})”)

株価推移と予測結果のグラフ表示

plt.figure(figsize=(10, 6))
plt.plot(merged_data.index, merged_data[‘Close’], label=”終値”, color=”blue”)
plt.title(f”{ticker} 株価推移と予測結果”)
plt.xlabel(“日付”)
plt.ylabel(“株価”)
plt.legend()
plt.grid()
plt.show()

データ保存

統合データをCSV形式で保存します。

merged_data.to_csv(f”{ticker}_merged_data.csv”, encoding=”utf-8-sig”)
print(f”\n統合データを {ticker}_merged_data.csv に保存しました。”)

【実行結果】

C:\Users\user\Desktop\python>4.py
銘柄コード(ティッカーシンボル)を入力してください: tsla

=== tslaの株価データを取得中 ===
[100%**] 1 of 1 completed

=== 経済指標データを取得中 ===

=== データを統合中 ===

=== モデルを構築中 ===

=== 予測結果 ===
モデルの精度: 0.48
翌日の株価予測: 下落 (確率: 0.02)

統合データを tsla_merged_data.csv に保存しました。

【結果グラフ】

コメント