株価予測pythonプログラム(LEVEL:001)は、指定した株式のティッカーシンボルを基に株価データを取得し、翌日の株価が「上昇」または「下落」するかを予測するシンプルなPGでしたが、さらに精度を上げていきます。
選択肢を4つ考えました。
1.外部データの活用(経済指標、ニュース分析)
2.データ処理の改善(特徴量追加、クラスバランス調整)
3.モデルのチューニング(ハイパーパラメータ最適化)
4.モデルの選択または統合(XGBoostやLightGBMの導入)
まずは「2.データ処理の改善(特徴量追加、クラスバランス調整)」を実施
特徴量エンジニアリングが最も重要な理由
・モデルの性能はデータの質に依存
機械学習モデルはデータからパターンを学びます。適切な特徴量がなければ、どんなに高度なモデルでも正確な予測は難しいです。
より多くの有用な情報をモデルに提供することで、予測精度が大きく向上します。
・ゴミデータからは良い結果を得られない
よく言われる「Garbage in, Garbage out(ゴミを入力すれば、ゴミが出力される)」の原則です。どれだけモデルをチューニングしても、データが不十分であれば限界があります。
・単純なモデルでも高い性能を引き出せる
ランダムフォレストやXGBoostのようなモデルは、良い特徴量があるだけで大きな改善が見込めます。逆に不十分な特徴量のままでは、高度なモデルでも十分な性能を発揮できません。
(1) 有用な特徴量の例
- 移動平均(短期・中期・長期)
- ボラティリティ(価格変動幅)
- RSIやMACDなどのテクニカル指標
- 外部データ(例:金利、経済指標、ニュース感情分析)
(2) 特徴量エンジニアリングが精度に与える影響
- 新しい特徴量を追加することで、モデルが学習できる情報が増加。
- データのパターンを捉えやすくなり、予測精度が向上。
(3) 特徴量の削減も重要
不要な特徴量を削減することで、ノイズを減らし、モデルの学習が効率化。
改善点の概要
- 新しい特徴量の追加
- 短期・長期移動平均線(SMA_5, SMA_20)。
- ボラティリティ(価格変動幅)。
- RSI(相対力指数)。
- 欠損値の処理
- RSIの初期値補完を追加。
- 可読性向上
- 特徴量の名前と処理内容を明確に記述。
この改良により、モデルがより多くの情報を学習し、予測精度が向上する可能性があります。さらに改善が必要な場合や具体的な部分について質問があればお知らせください!
【完全コード】
–– coding: utf-8 ––
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
日本語フォント設定(必要に応じて変更)
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[‘Target’] = (merged_data[‘Close’].shift(-1) > merged_data[‘Close’]).astype(int)
merged_data.dropna(inplace=True)
特徴量とターゲット変数
features = merged_data[[‘Close’, ‘High’, ‘Low’, ‘Open’, ‘UnemploymentRate’, ‘SMA_5’, ‘SMA_20’, ‘Volatility’, ‘RSI’]]
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=== モデルを構築中 ===”)
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()
データ保存
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>5.py
銘柄コード(ティッカーシンボル)を入力してください: tsla
=== tslaの株価データを取得中 ===
[100%**] 1 of 1 completed
=== 経済指標データを取得中 ===
=== データを統合中 ===
=== 特徴量を追加中 ===
=== モデルを構築中 ===
=== 予測結果 ===
モデルの精度: 0.54
翌日の株価予測: 下落 (確率: 0.29)
【001と002の比較】
項目 | 改善前 | 改善後 | 増減 |
---|---|---|---|
モデル精度 | 0.48 | 0.54 | +0.06 |
翌日の予測確率 | 0.02 | 0.29 | +0.27 |
観察点
- 精度の向上:
- 精度が0.48から0.54に改善(+6%)。特徴量エンジニアリングによって予測性能が向上しました。
- 特に短期・長期移動平均線、ボラティリティ、RSIが有効だった可能性があります。
- 翌日予測の確信度が向上:
- 改善後、翌日の下落予測の確率が0.02から0.29に増加。モデルがより明確な予測を行えるようになったことを示します。
精度向上の要因
- 特徴量の追加:
- 短期移動平均(SMA_5)と長期移動平均(SMA_20)により、価格のトレンドが捉えやすくなった。
- ボラティリティが価格変動の激しさを反映し、重要な情報を提供。
- RSIが売られ過ぎ・買われ過ぎを捉え、価格反転の兆候を補足。
- データの統合と補間:
- 経済指標(失業率)のデータ補完により、欠損によるデータ品質低下を防止。
課題と改善案
1. モデル精度のさらなる向上
- 精度0.54は予測モデルとしてはまだ低いため、以下を検討:
- モデルのチューニング(選択肢3):
- ハイパーパラメータ(
n_estimators
,max_depth
,min_samples_split
など)の最適化。 - グリッドサーチやランダムサーチで探索。
- ハイパーパラメータ(
- モデル変更(選択肢4):
- XGBoostやLightGBMなど、性能が高いアルゴリズムに切り替え。
- モデルのチューニング(選択肢3):
2. 外部データの活用
- 経済指標以外の外部データを追加:
- 金利、インフレ率、為替レートなどのマクロ経済指標。
- ニュースやSNSデータの感情分析による市場心理の反映。
3. 特徴量の選択と追加
- 特徴量の重要度確認:
feature_importances_
で特徴量の寄与度を確認し、効果の薄い特徴量を削除。
- 新しい特徴量の追加:
- MACD(移動平均収束拡散法)。
- 株価の出来高変化率。
結論と次のステップ
改善後の精度向上(+6%)は、有用な特徴量の追加による成果です。しかし、0.54という精度は実用的には不十分です。以下の次の改善ステップを推奨します:
特徴量の追加や重要度確認で、さらなる改善を図る。
モデルのチューニングや変更(選択肢3, 4)を実施。
外部データの統合(選択肢1)による情報の強化。
C:\Users\user\Desktop\python>5.py
銘柄コード(ティッカーシンボル)を入力してください: AAPL
=== AAPLの株価データを取得中 ===
[100%**] 1 of 1 completed
=== 経済指標データを取得中 ===
=== データを統合中 ===
=== 特徴量を追加中 ===
=== モデルを構築中 ===
=== 予測結果 ===
モデルの精度: 0.55
翌日の株価予測: 下落 (確率: 0.19)
コメント