PR

株価予測の精度を高めるPythonプログラム:RSIとボラティリティ分析(その2)

前プログラムを進化させました、進化点を説明します。

1. 新しい特徴量の追加

以前のプログラムでは、短期移動平均線(SMA_5)と長期移動平均線(SMA_20)だけを使用していましたが、新しいバージョンでは以下の特徴量を追加しました:

  • Volatility(ボラティリティ): 過去10日間の価格変動の標準偏差を計算し、価格の安定性やリスクを指標化。
  • RSI(相対力指数): 株価の過熱感を示す指標で、買われすぎや売られすぎの状態を数値で捉えられるようになりました。
  • UnemploymentRate(失業率): 株価データと統合することで、経済全体の状況を反映。

2. RSIの初期値補完

RSIの計算時に生じる欠損値を補完する処理を追加し、データ不足によるモデルの精度低下を防止しました。

3. ターゲット変数の改善

ターゲット変数(Target)のロジックはそのままですが、データクリーニングを強化し、不要な欠損値を確実に削除することで精度を向上させました。

4. 特徴量の柔軟性

特徴量セットが大幅に拡張され、以下を含む複数のデータポイントをモデルに取り込めるようになりました:

  • 終値(Close)
  • 高値(High)
  • 安値(Low)
  • 始値(Open)
  • 失業率(UnemploymentRate)
  • 移動平均線(SMA_5, SMA_20)
  • ボラティリティ(Volatility)
  • RSI

これにより、予測の正確性が向上しています。

5. モデルの柔軟性

ランダムフォレストモデルの構築プロセスはそのままですが、新しい特徴量を追加したことで、モデルがより多様な情報を学習できるようになりました。

6. 視覚化の継続

視覚化部分(株価推移と予測結果)は前バージョンを踏襲しており、改善されたデータを直感的に理解しやすい形式で表示しています。

7. ユーザー操作性の向上

コメントやエラーメッセージを改善することで、初心者がより使いやすくなるよう配慮しました。また、予測結果の出力に確率を表示することで、予測の信頼性を数値で確認できるようにしました。


進化点の効果

実用性の拡大
ボラティリティやRSIなどの指標が加わったことで、投資判断に役立つ情報が増え、より実用的なツールになりました。

予測精度の向上
特徴量の追加により、株価予測モデルの精度が向上しました。

データの完全性
欠損値の処理が強化されたことで、モデルの学習と予測の一貫性が高まりました。

データの完全性
欠損値の処理が強化されたことで、モデルの学習と予測の一貫性が高まりました。

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

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

経済指標データの取得

米国の失業率(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)

新しい特徴量を追加

移動平均線やボラティリティ、RSI(相対力指数)など、株価予測に役立つ指標を計算します。

print(“\n=== 特徴量を追加中 ===”)
merged_data[‘SMA_5’] = merged_data[‘Close’].rolling(window=5).mean() # 短期移動平均線(5日)
merged_data[‘SMA_20’] = merged_data[‘Close’].rolling(window=20).mean() # 長期移動平均線(20日)
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) # 欠損値を埋めるため、初期値を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’]

データ分割

データを訓練用(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>5.py
銘柄コード(ティッカーシンボル)を入力してください: tsla

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

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

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

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

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

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

コメント