プログラム3本目です。
結果のコードの前に、1本目・2本目との比較を掲載します。
プログラムの進化比較表
世代 | 特徴 | 使用例・性能 | 利点 | 欠点 |
---|---|---|---|---|
第1世代 | – 単純なモデル(例: 線形回帰、ロジスティック回帰) | 基本的な分類や回帰 | – シンプルで計算が軽量 | – 複雑なパターンを捉えにくい |
– 手動で特徴量を設計 | データ前処理に重点 | – 実装が容易 | – 高精度を求めると限界がある | |
– ランダムフォレストやSVM(簡易的なアルゴリズム) | 精度は低め | – 初期学習向け | – 実世界の複雑な問題では不十分 | |
第2世代 | – 高度なアルゴリズム(例: XGBoost、LightGBM) | 高精度な分類、回帰タスク | – 高速で精度が高い | – ハイパーパラメータ調整が必要 |
– 特徴量エンジニアリングの一部自動化 | 株価予測、マーケティング分析 | – 欠損値処理のサポート | – 複雑で理解が難しい場合がある | |
– バギング、ブースティングを活用 | モデルの安定性向上 | – パラメータ探索に時間がかかる | ||
第3世代(現在) | – 自動学習(AutoML、グリッドサーチの高度化) | 本スクリプト: グリッドサーチでパラメータ調整 | – パフォーマンスを最適化 | – 計算資源を多く消費する |
– 高度なモデル(HistGradientBoosting) | 時系列予測、株価予測 | – モデルの解釈性が高まった | – モデル設計に専門知識が必要 | |
– モデルの拡張(例: 経済指標データ統合) | データ統合で精度向上 | – 精度向上に特化 | – 分析には時間とリソースが必要 |
現在のプログラム(第3世代)の特徴
モデルの予測を確率で示し、解釈性を高める。
特徴量エンジニアリングの自動化
短期移動平均(SMA)、ボラティリティ、RSIなどを計算。
モデルの最適化
グリッドサーチを使用して、最適なハイパーパラメータを探索。
高精度なアルゴリズム
HistGradientBoostingClassifier
を使用してパフォーマンスを向上。
データ統合
株価データと経済指標(失業率、金利)を組み合わせ、精度を向上。
確率出力
プログラムの比較表
項目 | 改善前(001) | 改善後(002) | 現在(003) | 増減(001→003) |
---|---|---|---|---|
モデル精度 | 0.48 | 0.54 | 0.66 | +0.18 |
翌日の予測確率(上昇) | 0.02 | 0.29 | 0.01 | -0.01 |
翌日の予測確率(下落) | 0.98 | 0.71 | 0.99 | +0.01 |
使用モデル | ランダムフォレスト | XGBoost | HistGradientBoosting | – |
ハイパーパラメータ調整 | 無し | 簡易的な調整 | グリッドサーチ | – |
特徴量の数 | 基本的な値のみ | 移動平均線追加 | 経済指標追加 | 増加 |
計算速度 | 高速 | 中程度 | やや低速 | 低下 |
ポイント
- モデル精度の向上
- 003では精度が66%に向上し、001から**+18%**の改善。
- ハイパーパラメータの最適化や特徴量の追加が主な要因。
- 翌日の予測確率
- 002で上昇確率が29%まで向上しましたが、003では1%に戻りました。
- 003では精度向上を優先し、確率のバランスが変化しています。
- 使用モデル
- 001: シンプルなランダムフォレスト。
- 002: XGBoostでブースティングを活用。
- 003:
HistGradientBoostingClassifier
で効率性と性能を両立。
- 特徴量の進化
- 001: 株価データの基本項目のみ。
- 002: 移動平均線(SMA)やボラティリティを追加。
- 003: 経済指標(失業率、金利)を統合し、さらに高精度化。
- 計算速度
- モデルが高度になるにつれて計算時間が増加。
- グリッドサーチの導入により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
コメント