PR

最新の株価予測法:Pythonとヒストグラディエントブースティングで精度を最適化(その3)

株価予測プログラム、3本目です。
結果のコードの前に、1本目・2本目との比較を掲載します。
プログラムの進化比較表

世代特徴使用例・性能利点欠点
第1世代– 単純なモデル(例: 線形回帰、ロジスティック回帰)基本的な分類や回帰– シンプルで計算が軽量– 複雑なパターンを捉えにくい
– 手動で特徴量を設計データ前処理に重点– 実装が容易– 高精度を求めると限界がある
– ランダムフォレストやSVM(簡易的なアルゴリズム)精度は低め– 初期学習向け– 実世界の複雑な問題では不十分
第2世代– 高度なアルゴリズム(例: XGBoost、LightGBM)高精度な分類、回帰タスク– 高速で精度が高い– ハイパーパラメータ調整が必要
– 特徴量エンジニアリングの一部自動化株価予測、マーケティング分析– 欠損値処理のサポート– 複雑で理解が難しい場合がある
– バギング、ブースティングを活用モデルの安定性向上– パラメータ探索に時間がかかる
第3世代(現在)– 自動学習(AutoML、グリッドサーチの高度化)本スクリプト: グリッドサーチでパラメータ調整– パフォーマンスを最適化– 計算資源を多く消費する
– 高度なモデル(HistGradientBoosting)時系列予測、株価予測– モデルの解釈性が高まった– モデル設計に専門知識が必要
– モデルの拡張(例: 経済指標データ統合)データ統合で精度向上– 精度向上に特化– 分析には時間とリソースが必要

現在のプログラム(第3世代)の特徴

モデルの予測を確率で示し、解釈性を高める。

特徴量エンジニアリングの自動化

短期移動平均(SMA)、ボラティリティ、RSIなどを計算。

モデルの最適化

グリッドサーチを使用して、最適なハイパーパラメータを探索。

高精度なアルゴリズム

HistGradientBoostingClassifier を使用してパフォーマンスを向上。

データ統合

株価データと経済指標(失業率、金利)を組み合わせ、精度を向上。

確率出力

プログラムの比較表

項目改善前(001)改善後(002)現在(003)増減(001→003)
モデル精度0.480.540.66+0.18
翌日の予測確率(上昇)0.020.290.01-0.01
翌日の予測確率(下落)0.980.710.99+0.01
使用モデルランダムフォレストXGBoostHistGradientBoosting
ハイパーパラメータ調整無し簡易的な調整グリッドサーチ
特徴量の数基本的な値のみ移動平均線追加経済指標追加増加
計算速度高速中程度やや低速低下

ポイント

  1. モデル精度の向上
    • 003では精度が66%に向上し、001から**+18%**の改善。
    • ハイパーパラメータの最適化や特徴量の追加が主な要因。
  2. 翌日の予測確率
    • 002で上昇確率が29%まで向上しましたが、003では1%に戻りました。
    • 003では精度向上を優先し、確率のバランスが変化しています。
  3. 使用モデル
    • 001: シンプルなランダムフォレスト。
    • 002: XGBoostでブースティングを活用。
    • 003: HistGradientBoostingClassifierで効率性と性能を両立。
  4. 特徴量の進化
    • 001: 株価データの基本項目のみ。
    • 002: 移動平均線(SMA)やボラティリティを追加。
    • 003: 経済指標(失業率、金利)を統合し、さらに高精度化。
  5. 計算速度
    • モデルが高度になるにつれて計算時間が増加。
    • グリッドサーチの導入により003はやや低速。

結論

今後、確率分布のバランスや新しいモデル(例: LSTMなど)での進化を検討することで、さらに高性能なモデルが期待できる。

003はモデル精度が最も高く、全体的なパフォーマンスが向上している。

翌日の予測確率に関しては、003で確率の偏りが大きい(0.01/0.99)ため、さらなる調整が可能。



【pythonプログラムコード #003#】

– coding: utf-8 –

import yfinance as yf
import pandas_datareader as pdr
import pandas as pd
from datetime import datetime
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt

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

グラフの日本語が文字化けしないよう、フォントを指定します。

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)

経済指標データの取得

米国の失業率データ(UNRATE)を取得します。

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”
economic_data = economic_data.reindex(stock_data.index, method=”ffill”)

データ統合

株価データと失業率データを結合します。

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

特徴量を追加

株価予測に使える新しい指標を計算します。

print(“\n=== 特徴量を追加中 ===”)
merged_data[‘SMA_5’] = merged_data[‘Close’].rolling(window=5).mean() # 短期移動平均線
merged_data[‘SMA_20’] = merged_data[‘Close’].rolling(window=20).mean() # 長期移動平均線
merged_data[‘Volatility’] = merged_data[‘Close’].rolling(window=10).std() # ボラティリティ
merged_data[‘RSI’] = 100 – (100 / (1 + (merged_data[‘Close’].diff().clip(lower=0).rolling(window=14).mean() /
merged_data[‘Close’].diff().clip(upper=0).abs().rolling(window=14).mean())))
merged_data[‘RSI’] = merged_data[‘RSI’].fillna(50) # 初期値を補完
merged_data[‘Volume_Change’] = merged_data[‘Volume’].pct_change().fillna(0) # 出来高の変化率を計算

金利データの追加

米国の政策金利(DFF)を特徴量に加えます。

print(“\n=== 金利データを追加中 ===”)
interest_rate = pdr.get_data_fred(“DFF”, start=”2022-01-01″, end=today)
interest_rate.rename(columns={“DFF”: “InterestRate”}, inplace=True)
merged_data = pd.concat([merged_data, interest_rate.reindex(merged_data.index, method=”ffill”)], axis=1)
merged_data[‘InterestRate’] = merged_data[‘InterestRate’].ffill() # 欠損値を埋める

ターゲット変数を1週間後に設定

株価が1週間後に上昇しているかどうかをターゲットとして定義します。

merged_data[‘Target’] = (merged_data[‘Close’].shift(-5) > merged_data[‘Close’]).astype(int)
merged_data.dropna(inplace=True) # 欠損値を削除

特徴量とターゲット変数

モデルに入力するデータ(特徴量)と予測するデータ(ターゲット)を分けます。

features = merged_data[[‘Close’, ‘High’, ‘Low’, ‘Open’, ‘UnemploymentRate’, ‘SMA_5’, ‘SMA_20’, ‘Volatility’, ‘RSI’, ‘Volume_Change’, ‘InterestRate’]]
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=== ハイパーパラメータの最適化中 ===”)
param_grid = {
‘max_iter’: [100, 200, 300], # 繰り返し回数
‘max_depth’: [5, 10, None], # 決定木の最大深さ
‘learning_rate’: [0.01, 0.1, 0.2] # 学習率
}

grid_search = GridSearchCV(
HistGradientBoostingClassifier(random_state=42),
param_grid,
scoring=’accuracy’, # 精度を評価基準とする
cv=5 # クロスバリデーションで分割
)
grid_search.fit(X_train, y_train)

最適なモデルを取得

グリッドサーチで得られた最適なパラメータを用いたモデルを選択します。

best_model = grid_search.best_estimator_
print(f”最適なパラメータ: {grid_search.best_params_}”)

テストデータで評価

テストデータを使って最適化後のモデルの精度を確認します。

best_predictions = best_model.predict(X_test)
best_accuracy = accuracy_score(y_test, best_predictions)
print(f”最適化後の精度: {best_accuracy:.2f}”)

翌週の予測

最新のデータを使って翌週の株価を予測します。

latest_features = features.iloc[[-1]] # 最新の特徴量を取得
best_prediction = best_model.predict(latest_features) # 予測実行
best_prediction_proba = best_model.predict_proba(latest_features) # 確率を計算

print(f”翌週の株価予測: {‘上昇’ if best_prediction[0] == 1 else ‘下落’}”)
print(f”確率: 上昇 {best_prediction_proba[0][1]:.2f}, 下落 {best_prediction_proba[0][0]:.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>yosoku003.py
銘柄コード(ティッカーシンボル)を入力してください: tsla

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

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

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

=== 特徴量を追加中 ===

=== 金利データを追加中 ===

=== ハイパーパラメータの最適化中 ===
最適なパラメータ: {‘learning_rate’: 0.2, ‘max_depth’: 5, ‘max_iter’: 300}
最適化後の精度: 0.66
翌週の株価予測: 下落
確率: 上昇 0.01, 下落 0.99

コメント