株価予測pythonプログラム(LEVEL:003)

プログラム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はやや低速。

結論

  • 003はモデル精度が最も高く、全体的なパフォーマンスが向上している。
  • 翌日の予測確率に関しては、003で確率の偏りが大きい(0.01/0.99)ため、さらなる調整が可能。
  • 今後、確率分布のバランスや新しいモデル(例: LSTMなど)での進化を検討することで、さらに高性能なモデルが期待できる。

【完全版プログラムコード】
– 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)

経済指標データの取得

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)

金利データを追加

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週間後に変更

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’]

データ分割

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()

データ保存

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

コメント

タイトルとURLをコピーしました